回归模型的整洁方法,理想情况下使用dplyr

时间:2015-04-30 15:05:35

标签: r regression dplyr lm

在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,但是发现申请家庭在很大程度上是不可理解的。有没有dplyr解决方案?

2 个答案:

答案 0 :(得分: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无法工作的许多情况下使用。

答案 1 :(得分: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