将lm应用于多个数据集

时间:2015-02-10 00:11:19

标签: r loops linear-regression lm

下面是4个数据集(我刚刚为了提供可重现的代码而随机创建它们)。我创建了这些列表,因此我可以立即将“lm”应用于这些多个数据集:

H<-data.frame(replicate(10,sample(0:20,10,rep=TRUE)))   
C<-data.frame(replicate(5,sample(0:100,10,rep=FALSE)))
R<-data.frame(replicate(7,sample(0:30,10,rep=TRUE)))
E<-data.frame(replicate(4,sample(0:40,10,rep=FALSE)))

dsets<-list(H,C,R,E)
models<-lapply(dsets,function(x)lm(X1~.,data=x))
lapply(models,summary)

每个数据集中的变量都不同(计数和名称。但是,如果运行代码,它们都将是x1,x2 ......等等)。每个中的第一列/变量将是响应,其余的将是自变量。

此代码有效,但不适用于我的实际数据集。由于我的数据集具有变量的实际名称,因此我使用变量的位置,如下所示:

   dsets<-list(H,C,R,E)
   models<lapply(dsets,function(x)lm(x[,1]~.,data=x))
   lapply(models,summary)

使用上述内容,结果搞砸了。它还包括响应变量作为自变量。

有人可以帮忙吗?

编辑:我意识到x [,1]正在调用整个列,而不是列名

   models<lapply(dsets,function(x)lm(colnames(x)[1]~.,data=x))
   lapply(models,summary)

但这也不起作用。我收到以下错误

Error in model.frame.default(formula = colnames(H[1]) ~ ., data = H, drop.unused.levels = TRUE) : 
  variable lengths differ (found for 'Var1')

1 个答案:

答案 0 :(得分:1)

models <- lapply(dsets, 
             function(data){
               lm(reformulate(termlabels=".", response=names(data)[1]), data)
             })

reformulate允许您从character字符串构建公式。