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

Tidy approach to regression models, ideally with dplyr

阅读 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

我知道类似的事情是可能的 using a lapply approach,但发现 apply 系列在很大程度上是难以理解的。有dplyr解决方案吗?

链接页面中的方法没有什么特别复杂的。 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",而是 "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