【问题标题】:Tidy approach to regression models, ideally with dplyr回归模型的整洁方法,最好使用 dplyr
【发布时间】:2015-07-10 08:45:21
【问题描述】:

阅读 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 解决方案吗?

【问题讨论】:

    标签: r regression dplyr lm


    【解决方案1】:

    这不是纯粹的“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
    

    【讨论】:

    【解决方案2】:

    链接页面中的方法没有什么特别复杂的。 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 参考。
    猜你喜欢
    • 2017-01-24
    • 2014-05-07
    • 2021-03-26
    • 1970-01-01
    • 2021-11-26
    • 2017-12-23
    • 2018-10-29
    • 2019-12-26
    • 2010-10-05
    相关资源
    最近更新 更多