将 lm 应用于多个数据集

applying lm to multiple datasets

下面是 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.. 等等)。每个中的第一个 column/variable 将是响应,其余的将是自变量。

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

   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')
models <- lapply(dsets, 
             function(data){
               lm(reformulate(termlabels=".", response=names(data)[1]), data)
             })

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