2012-04-18 50 views
3

我喜欢提取每个lm对象的系数和标准错误,并将它们组合成一个data.frame,并填入NA以填充缺失的预测变量。如何将一个不相等的lm对象长度列表组合到一个数据框中?

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) 
    } 

任何建议将不胜感激!

回答

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 
+0

谢谢乔希。标准错误和列x2到x10的名称缺失。 – Tony 2012-04-18 15:52:01

+0

@Tony - 不客气。我刚刚编辑了答案,以显示如何添加列名称,并在类似的data.frame中收集标准错误。 – 2012-04-18 16:07:54

+0

太棒了!该代码适用于提取系数,但对于提取标准错误不太正确。在seList“对象$系数中的错误:$运算符对原子向量无效”之后,我收到以下消息: – Tony 2012-04-18 16:14:45

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为单位的列,或转置结果。

+0

这是相当紧凑的。我还没有碰到Reduce的使用,但将来会尝试使用它 - 谢谢 – Tony 2012-04-18 16:37:21

相关问题