如何使用 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)
如何修改 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)