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

时间:2015-02-24 12:18:28

标签: r plyr

如何从dlplyr的帮助页面修改以下代码,以连续拟合线性模型,不拦截数据框架中的多个预测变量。

#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,data =是myDF)。
我希望没有截距的线性模型基本上进行方差分析;这就是我通常这样做的方式。

2 个答案:

答案 0 :(得分:0)

以下是您想要的输出吗?

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 

答案 1 :(得分:0)

收集Xs然后将其作为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)