整洁的回归模型方法,最好使用dplyr实现

3

阅读dplyr中do()的文档,我对于创建数据组的回归模型的能力印象深刻,并且想知道是否可以使用不同的自变量而非数据组来复制它。

到目前为止,我尝试过:

require(dplyr)
data(mtcars)

models <- data.frame(var = c("cyl", "hp", "wt"))

models <- models %>% do(mod = lm(mpg ~ as.name(var), data = mtcars))
Error in as.vector(x, "symbol") : 
  cannot coerce type 'closure' to vector of type 'symbol'

models <- models %>% do(mod = lm(substitute(mpg ~ i, as.name(.$var)), data = mtcars))
Error in substitute(mpg ~ i, as.name(.$var)) : 
  invalid environment specified

希望最终输出的结果像这样:
  var slope standard_error_slope
1 cyl -2.87                 0.32
2  hp -0.07                 0.01
3  wt -5.34                 0.56

我知道使用lapply方法可以实现类似的功能,但我觉得apply系列函数很难理解。是否有dplyr的解决方案?

2个回答

7

这个链接页面中的方法并不特别复杂。使用substituteas.name可能有点神秘,但这很容易解决。

varlist <- names(mtcars)[-1]
models <- lapply(varlist, function(x) {
    form <- formula(paste("mpg ~", x))
    lm(form, data=mtcars)
})

dplyr不是R编程的万能解决方案。建议熟悉*apply函数,因为在许多dplyr无法解决的情况下,它们会有用。


dplyr 参考方面非常准确。 - David Arenburg

4

这并不是纯粹的 "dplyr",而是 "dplyr" + "tidyr" + "data.table"。但我认为这应该很容易阅读。

library(data.table)
library(dplyr)
library(tidyr)

mtcars %>%
  gather(var, val, cyl:carb) %>%
  as.data.table %>%
  .[, as.list(summary(lm(mpg ~ val))$coefficients[2, 1:2]), by = var]
#      var    Estimate  Std. Error
#  1:  cyl -2.87579014 0.322408883
#  2: disp -0.04121512 0.004711833
#  3:   hp -0.06822828 0.010119304
#  4: drat  7.67823260 1.506705108
#  5:   wt -5.34447157 0.559101045
#  6: qsec  1.41212484 0.559210130
#  7:   vs  7.94047619 1.632370025
#  8:   am  7.24493927 1.764421632
#  9: gear  3.92333333 1.308130699
# 10: carb -2.05571870 0.568545640

如果你只需要一些变量,那么应该从向量开始,而不是使用data.frame

models <- c("cyl", "hp", "wt")

mtcars %>%
  select_(.dots = c("mpg", models)) %>%
  gather(var, val, -mpg) %>%
  as.data.table %>%
  .[, as.list(summary(lm(mpg ~ val))$coefficients[2, 1:2]), by = var]
#    var    Estimate Std. Error
# 1: cyl -2.87579014  0.3224089
# 2:  hp -0.06822828  0.0101193
# 3:  wt -5.34447157  0.5591010

还要看一下broom包,其中有一个很好的小引导http://cran.r-project.org/web/packages/broom/vignettes/broom_and_dplyr.html。 - infominer

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接