使用扫帚和tidyverse对不同的因变量运行回归

Lui*_*uis 9 loops regression r broom tidyverse

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

假设我有不同的DV和一组特定的IVS,我想进行回归,考虑每个DV和这组特定的IV.我知道我可以使用像我这样的东西或应用家庭,但我真的想用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)
Run Code Online (Sandbox Code Playgroud)

收入,幸福和健康都是DV.性别和教师是IV,他们将用于所有回归.

是我发现的最接近的

让我知道如果我需要澄清我的问题.谢谢.

use*_*650 11

由于您有不同的因变量但相同的独立变量,您可以形成这些变量的矩阵并传递给它们lm.

mod = lm(cbind(income, happiness, health) ~ sex + faculty, ds)
Run Code Online (Sandbox Code Playgroud)

而且我觉得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
Run Code Online (Sandbox Code Playgroud)

  • 你可以使用'%>%`:=)使它'tidyverse` (3认同)

Cal*_*You 6

另一种方法是gather依赖变量,并使用分组数据框来拟合模型do.这是扫帚和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
Run Code Online (Sandbox Code Playgroud)

reprex包(v0.2.0)于2018-08-01创建.


akr*_*run 5

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

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

如果我们想要它与一个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")
Run Code Online (Sandbox Code Playgroud)