【问题标题】:How to combine a list of unequal lm object length into a data frame?如何将不等 lm 对象长度的列表组合到数据框中?
【发布时间】:2012-04-18 15:31:17
【问题描述】:

我喜欢提取每个 lm 对象的系数和标准误差,并将它们组合成一个 data.frame 并用 NA 填充缺失的预测变量。

    set.seed(12345)
    x<-matrix(rnorm(1000),nrow=100,ncol=10)
    colnames(x)<-paste("x",1:10,sep="")
    df<-data.frame(y=rnorm(100),x)
    m1<-vector('list', 10)
    for ( i in 2:11){
    eqn <- as.formula(paste("y ~", paste(colnames(df)[2:i], collapse='+')))
    m1[[i-1]] <- lm(eqn, df)
    }

任何建议将不胜感激!

【问题讨论】:

    标签: r dataframe regression plyr linear-regression


    【解决方案1】:

    这应该可以解决问题:

    cList <- lapply(m1, coef)
    nms  <- names(cList[[11]])
    
    cMat <- do.call(rbind, lapply(cList, function(X) X[nms]))
    cDF  <- as.data.frame(cMat); names(cDF) <- nms   # Pretty up the results
    
    cDF[1:5, 1:6]
    #   (Intercept)        x1          x2         x3         x4       x5
    # 1  -0.2345084 0.2027485          NA         NA         NA       NA
    # 2  -0.2334043 0.2074812 -0.05006297         NA         NA       NA
    # 3  -0.2299977 0.2099620 -0.03892985 0.09777829         NA       NA
    # 4  -0.2095798 0.2221179 -0.02710201 0.06403695 -0.1184191       NA
    # 5  -0.2060406 0.2180674 -0.01062671 0.06632922 -0.1045128 0.130937
    

    编辑

    要将标准错误收集到类似的结构中,只需执行以下操作:

    seList <- lapply(m1, function(X)  coef(summary(X))[,2])
    seMat <- do.call(rbind, lapply(cList, function(X) X[nms]))
    seDF  <- as.data.frame(cMat); names(seDF) <- nms
    

    【讨论】:

    • 谢谢乔希。缺少标准错误和 x2 到 x10 列的名称。
    • @Tony -- 不客气。我刚刚编辑了答案,以展示如何添加列名并在类似的 data.frame 中收集标准错误。
    • 太棒了!这些代码在提取系数方面效果很好,但对于提取标准误差并不完全正确。在 seList “对象$ 系数错误:$ 运算符对原子向量无效”后我收到以下消息
    • @Tony -- 问题是由您分配给m1 的方式引起的。 (您的第一个模型拟合的结果被放入m1[2],将m1[1] 的值保留为NULL。)我冒昧地编辑了您的问题以更正该问题(通过在下一个分配给m1[i-1] - 到最后一行),我的所有代码现在都应该可以毫无怨言地工作了。
    • 非常感谢。您只是将 m1 重新索引为 1 到 10 而不是 2 到 11。它现在工作正常
    【解决方案2】:

    这是一种使用mergeReduce 的方法:

    m2 <- lapply(m1[-1], function(x) as.data.frame(coef(summary(x))) )
    
    tmpfun <- function(x,y) {
        n <- as.character(nrow(y)-1)
        xn <- if( 'Row.names' %in% colnames(x) ) 1 else 0
        merge(x,y,by.x=xn, by.y=0, suffixes=c('',n), all=TRUE)
    }
    
    out <- Reduce(tmpfun, m2)
    

    您可能想要重新排序列,或删除 m2 中的某些列,或转置结果。

    【讨论】:

    • 这是相当紧凑的。我还没有接触过Reduce的使用,但将来会尝试使用它-谢谢
    猜你喜欢
    • 2021-04-24
    • 2017-08-04
    • 1970-01-01
    • 2020-02-20
    • 2022-06-29
    • 1970-01-01
    • 2020-02-18
    • 2019-08-16
    • 2022-10-25
    相关资源
    最近更新 更多