【问题标题】:How do I fit several linear models with plyr如何用 plyr 拟合多个线性模型
【发布时间】:2015-02-24 21:14:57
【问题描述】:

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

【问题讨论】:

  • 抱歉线性模型应该是lm(X1 ~ 0+grouping), lm(X2~0+grouping), lm(X3~0+grouping)。

标签: r plyr


【解决方案1】:

以下是您想要的输出吗?

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 

【讨论】:

  • 感谢 RStudent。我自己应该想到的。
【解决方案2】:

收集 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)

【讨论】:

    猜你喜欢
    • 2017-01-08
    • 1970-01-01
    • 1970-01-01
    • 2017-10-23
    • 2017-07-08
    • 1970-01-01
    • 1970-01-01
    • 2021-03-15
    相关资源
    最近更新 更多