如何使用 plyr 拟合多个线性模型

How do I fit several linear models with plyr

如何修改 dlplyr 帮助页面中的以下代码,以连续拟合一个没有截距的线性模型到 data.frame 中的多个预测变量。

#From the dlplyr help page
linmod <- function(df) {
lm(rbi ~ year, data = mutate(df, year = year - min(year)))
}
models <- dlply(baseball, .(id), linmod)

我的数据集

library(plyr)
grouping<-factor(sample(c('A', 'B', 'C'), 10, replace=TRUE))
set.seed(10)
x1<-rnorm(10, 3, 1)
x2<-rnorm(10, 4, 1)
x3<-rnorm(10,5, 1)
x4<-rnorm(10,5,2)
mydf<-data.frame(grouping, x1, x2, x3, x4)
mydf

我想修改上面的函数linmod来生成lm(y1~0+X1, data=mydf), lm(y1~0+X2, data=mydf), lm(y1~0+X3,数据=mydf).
我希望没有截距的线性模型基本上可以进行方差分析;我通常就是这样做的。

以下是您想要的输出吗?

lapply(mydf[-1], function(x) lm(x ~ 0 + mydf[,1]))
$x1

Call:
lm(formula = x ~ 0 + mydf[, 1])

Coefficients:
mydf[, 1]A  mydf[, 1]B  mydf[, 1]C  
     2.511       2.608       2.405  


$x2

Call:
lm(formula = x ~ 0 + mydf[, 1])

Coefficients:
mydf[, 1]A  mydf[, 1]B  mydf[, 1]C  
     4.301       4.872       4.073  


$x3

Call:
lm(formula = x ~ 0 + mydf[, 1])

Coefficients:
mydf[, 1]A  mydf[, 1]B  mydf[, 1]C  
     4.410       2.848       4.358  


$x4

Call:
lm(formula = x ~ 0 + mydf[, 1])

Coefficients:
mydf[, 1]A  mydf[, 1]B  mydf[, 1]C  
     3.473       5.107       3.508 

收集 X 然后将其作为 plyr 在传递给 lm 之前拆分的变量可能是最简单的。 Tidyr 对此很有帮助。类似于:

library(plyr)
library(tidyr)
grouping<-factor(sample(c('A', 'B', 'C'), 10, replace=TRUE))
set.seed(10)
x1<-rnorm(10, 3, 1)
x2<-rnorm(10, 4, 1)
x3<-rnorm(10,5, 1)
x4<-rnorm(10,5,2)
mydf<-data.frame(grouping, x1, x2, x3, x4)
mydf_long <- gather(my_df, "x_var", "value", 2:5)
lm_fn <- function(x){
   out <- lm(value ~ grouping, data=x)
   return(out)
}
output <- dlply(bydf_long, .(x_var), lm_fn)