【问题标题】:Use broom and tidyverse to run regressions on different dependent variables使用 broom 和 tidyverse 对不同的因变量进行回归
【发布时间】:2019-01-09 13:09:12
【问题描述】:

我正在寻找可以解决这个难题的 Tidyverse / broom 解决方案:

假设我有不同的 DV 和一组特定 IVS,我想执行一个考虑每个 DV 和这组特定 IV 的回归。 我知道我可以使用 for i in 或 apply family 之类的东西,但我真的很想使用 tidyverse 来运行它。

以下代码作为示例工作

ds <- data.frame(income = rnorm(100, mean=1000,sd=200),
                 happiness = rnorm(100, mean = 6, sd=1),
                 health = rnorm(100, mean=20, sd = 3),
                 sex = c(0,1),
                 faculty = c(0,1,2,3))

mod1 <- lm(income ~ sex + faculty, ds)
mod2 <- lm(happiness ~ sex + faculty, ds)
mod3 <- lm(health ~ sex + faculty, ds)
summary(mod1)
summary(mod2)
summary(mod3)

收入、幸福和健康是 DV。 Sex 和 Faculty 是 IV,它们将用于所有回归。

That 是我找到的最接近的

如果我需要澄清我的问题,请告诉我。 谢谢。

【问题讨论】:

    标签: r loops regression tidyverse broom


    【解决方案1】:

    我们可以遍历作为因变量的列名,使用paste 创建formula 以传递给lm 并使用tidy 获取汇总统计信息(来自broom

    library(tidyverse)
    library(broom)
    map(names(ds)[1:3], ~ 
                lm(formula(paste0(.x, "~", 
                    paste(names(ds)[4:5], collapse=" + "))), data = ds) %>%
                   tidy)
    

    如果我们希望在单个 data.frame 中使用因变量的列标识符,

    map_df(set_names(names(ds)[1:3]), ~ 
          lm(formula(paste0(.x, "~", 
            paste(names(ds)[4:5], collapse=" + "))), data = ds) %>%
       tidy, .id = "Dep_Variable")
    

    【讨论】:

    • 非常感谢,@akrun。你总是回答我的问题。你介意我问你怎么知道这么多关于 tidyverse 和 R 的吗?你是数据科学家吗?你推荐什么书/材料? (如您所见,我总是通过反复试验来学习 =)))非常感谢!
    • @Luis 很高兴回答您的问题。我主要通过 SO 和 R 邮件列表学习/学习 R。你的学习方法很好,因为出错会让你思考原因,这比通过正确的方法给人留下更深刻的印象。网上有很多资源可以学习 R。可能你已经经历过这些links。此外,您可以查看 udemy、udacity、datacamp 等的课程。没有适合所有人的特定方法
    • 再次感谢@akrun,您的回复总是非常有用且内容丰富。最好的!
    【解决方案2】:

    另一种方法是gather 因变量并使用分组数据框来拟合具有do 的模型。这是 broom 和 dplyr 小插图中解释的方法。

    library(tidyverse)
    library(broom)
    ds <- data.frame(
      income = rnorm(100, mean = 1000, sd = 200),
      happiness = rnorm(100, mean = 6, sd = 1),
      health = rnorm(100, mean = 20, sd = 3),
      sex = c(0, 1),
      faculty = c(0, 1, 2, 3)
    )
    ds %>%
      gather(dv_name, dv_value, income:health) %>%
      group_by(dv_name) %>%
      do(tidy(lm(dv_value ~ sex + faculty, data = .)))
    #> # A tibble: 9 x 6
    #> # Groups:   dv_name [3]
    #>   dv_name   term         estimate std.error statistic  p.value
    #>   <chr>     <chr>           <dbl>     <dbl>     <dbl>    <dbl>
    #> 1 happiness (Intercept)     6.25      0.191    32.7   3.14e-54
    #> 2 happiness sex             0.163     0.246     0.663 5.09e- 1
    #> 3 happiness faculty        -0.172     0.110    -1.56  1.23e- 1
    #> 4 health    (Intercept)    20.1       0.524    38.4   1.95e-60
    #> 5 health    sex             0.616     0.677     0.909 3.65e- 1
    #> 6 health    faculty        -0.653     0.303    -2.16  3.36e- 2
    #> 7 income    (Intercept)  1085.       32.8      33.0   1.43e-54
    #> 8 income    sex           -12.9      42.4      -0.304 7.62e- 1
    #> 9 income    faculty       -25.1      19.0      -1.32  1.89e- 1
    

    reprex package (v0.2.0) 于 2018 年 8 月 1 日创建。

    【讨论】:

    • 太棒了!!非常感谢!
    【解决方案3】:

    由于您有不同的因变量但相同的独立变量,您可以将这些变量组成一个矩阵并传递给lm

    mod = lm(cbind(income, happiness, health) ~ sex + faculty, ds)
    

    我认为broom::tidy 有效

    library(broom)
    tidy(mod)
    
    #    response        term      estimate  std.error  statistic      p.value
    # 1    income (Intercept) 1019.35703873 31.0922529 32.7849205 2.779199e-54
    # 2    income         sex  -54.40337314 40.1399258 -1.3553431 1.784559e-01
    # 3    income     faculty   19.74808081 17.9511206  1.1001030 2.740100e-01
    # 4 happiness (Intercept)    5.97334562  0.1675340 35.6545278 1.505026e-57
    # 5 happiness         sex    0.05345555  0.2162855  0.2471528 8.053124e-01
    # 6 happiness     faculty   -0.02525431  0.0967258 -0.2610918 7.945753e-01
    # 7    health (Intercept)   19.76489553  0.5412676 36.5159396 1.741411e-58
    # 8    health         sex    0.32399380  0.6987735  0.4636607 6.439296e-01
    # 9    health     faculty    0.10808545  0.3125010  0.3458723 7.301877e-01
    

    【讨论】:

    • 不错的选择。我忘了这个
    • 感谢 Akrun ...这可能是我第一个 tidyverse 标记为 Q ;|
    • 你可以用tidyverse%&gt;% :=)
    • 哇,很棒的解决方案。 @user20650 我真正的难题有不同的变量名,我想知道这样的事情是否可行: j % select(income, happy, health) mod = lm(cbind(noquote(paste0(variable.names( j), collapse=","))) ~ 性别 + 教师, ds)
    • 路易斯;抱歉 - 你问错人了 ;)) 我不使用 tidyverse 语法,也许@akrun 可以建议。
    猜你喜欢
    • 2020-08-14
    • 1970-01-01
    • 2013-11-14
    • 1970-01-01
    • 2015-10-01
    • 2020-10-31
    • 2022-01-14
    • 1970-01-01
    • 2018-02-13
    相关资源
    最近更新 更多