如何将长度不同的lm对象列表组合成数据框?

4
我希望您能够将每个lm对象的系数和标准误差提取出来,并将它们组合成一个数据框,缺失的预测变量用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)
    }

任何建议将不胜感激!
2个回答

9
这应该能解决问题:
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

谢谢Josh。标准误差和列x2到x10的名称丢失了。 - Tony
@Tony -- 不客气。我刚刚编辑了答案,展示了如何添加列名,并且同样在一个数据框中收集标准误差。 - Josh O'Brien
太好了!代码在提取系数方面运行良好,但提取标准误差时不太对。在seList之后,我收到了以下消息:“Error in object$coefficients : $ operator is invalid for atomic vectors”。 - Tony
@Tony -- 问题是由于你分配到 m1 的方式引起的。(你第一个模型拟合的结果被放入了 m1[2],导致 m1[1] 的值为 NULL。)我修改了你的问题以纠正这个问题(通过在倒数第二行中分配到 m1[i-1]),现在我的所有代码都应该可以正常工作了。 - Josh O'Brien
非常感谢。您刚刚重新索引了m1的1到10,而不是2到11。现在它可以正常工作了。 - Tony

1
这里有一种使用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的使用,但将来会尝试使用它-谢谢 - Tony

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接