【问题标题】:Running regressions and extract model estimates to a dataframe in R运行回归并将模型估计提取到 R 中的数据框
【发布时间】:2018-05-14 14:30:24
【问题描述】:

我有 3 个暴露变量 x1-x3、10 个结果变量 y1-y10 和 3 个协变量 cv1-cv3

我想对针对所有协变量调整的每次曝光的每个结果进行回归。然后我想要模型估计,即放在数据框中的 beta、SE、p 值。有没有办法在 R 中自动执行此操作。谢谢!

我要运行的模型如下所示:

y1 ~ x1+cv1+cv2+cv3 ... y10 ~ x1+cv1+cv2+cv3

y1 ~ x2+cv1+cv2+cv3 ... y10 ~ x2+cv1+cv2+cv3

y1 ~ x3+cv1+cv2+cv3 ... y10 ~ x3+cv1+cv2+cv3

【问题讨论】:

  • 是的,有办法,但你能提供一个reproducible example。你的数据是什么样的?目前的格式是什么?你能dput它的输出吗?

标签: r linear-regression


【解决方案1】:

没有数据和可重复的示例,很难为您提供帮助,但这里有一个带有模拟数据的示例。首先,创建一个假数据集,名为data

library(tidyverse)

make_df <- function(y_i) {
  data_frame(y_var = y_i, y_i = rnorm(100),
              x1 = rnorm(100),  x2 = rnorm(100),  x3 = rnorm(100),
             cv1 = runif(100), cv2 = runif(100), cv3 = runif(100))
}

ys <- paste0("Y_", sprintf("%02d", 1:10))
ys
#>  [1] "Y_01" "Y_02" "Y_03" "Y_04" "Y_05" "Y_06" "Y_07" "Y_08" "Y_09" "Y_10"

data <-
ys %>%
  map_dfr(make_df)

data
#> # A tibble: 1,000 x 8
#>    y_var    y_i      x1      x2      x3    cv1     cv2    cv3
#>    <chr>  <dbl>   <dbl>   <dbl>   <dbl>  <dbl>   <dbl>  <dbl>
#>  1 Y_01   0.504  0.892  -0.806  -1.56   0.145  0.436   0.701 
#>  2 Y_01   0.967  1.24   -1.19    0.920  0.866  0.00100 0.567 
#>  3 Y_01  -0.824 -0.729  -0.0855 -1.06   0.0665 0.780   0.471 
#>  4 Y_01   0.294  2.37   -0.514  -0.955  0.397  0.0462  0.209 
#>  5 Y_01  -0.893  0.0298  0.0369  0.0787 0.640  0.709   0.0485
#>  6 Y_01   0.670 -0.347   1.56    2.11   0.843  0.542   0.793 
#>  7 Y_01  -1.59   1.04    0.228   0.573  0.185  0.151   0.558 
#>  8 Y_01  -2.04   0.289  -0.435  -0.113  0.833  0.0898  0.653 
#>  9 Y_01  -0.637  0.818  -0.454   0.606  0.294  0.378   0.315 
#> 10 Y_01  -1.61  -0.628  -2.75    1.06   0.353  0.0863  0.332 
#> # ... with 990 more rows

此时,您可以选择。一种方法是使用group_by %>% do(tidy(*)) 配方:

data %>%
  gather(x_var, x_value, -c(y_var, y_i, cv1:cv3)) %>%
  group_by(y_var, x_var) %>%
  do(broom::tidy(lm(y_i ~ x_value + cv1 + cv2 + cv3, data = .)))
#> # A tibble: 150 x 7
#> # Groups:   y_var, x_var [30]
#>    y_var x_var term        estimate std.error statistic p.value
#>    <chr> <chr> <chr>          <dbl>     <dbl>     <dbl>   <dbl>
#>  1 Y_01  x1    (Intercept)  -0.111      0.344   -0.324    0.747
#>  2 Y_01  x1    x_value      -0.0440     0.111   -0.396    0.693
#>  3 Y_01  x1    cv1           0.286      0.372    0.769    0.444
#>  4 Y_01  x1    cv2           0.0605     0.379    0.160    0.873
#>  5 Y_01  x1    cv3          -0.0690     0.378   -0.182    0.856
#>  6 Y_01  x2    (Intercept)  -0.146      0.336   -0.434    0.665
#>  7 Y_01  x2    x_value       0.117      0.105    1.12     0.265
#>  8 Y_01  x2    cv1           0.287      0.362    0.793    0.430
#>  9 Y_01  x2    cv2           0.0564     0.376    0.150    0.881
#> 10 Y_01  x2    cv3           0.0125     0.379    0.0330   0.974
#> # ... with 140 more rows

另一种方法是使用split 变量,然后使用来自purrrmap 函数:

data %>%
  gather(x_var, x_value, -c(y_var, y_i, cv1:cv3)) %>%
  mutate(y_var_x_var = paste0(y_var, x_var)) %>%
  split(.$y_var_x_var) %>%
  map(~ lm(y_i ~ x_value + cv1 + cv2 + cv3, data = .))
#> $Y_01x1
#> 
#> Call:
#> lm(formula = y_i ~ x_value + cv1 + cv2 + cv3, data = .)
#> 
#> Coefficients:
#> (Intercept)      x_value          cv1          cv2          cv3  
#>    -0.11144     -0.04396      0.28585      0.06051     -0.06896  
#> 
#> 
#> $Y_01x2
#> 
#> Call:
#> lm(formula = y_i ~ x_value + cv1 + cv2 + cv3, data = .)
#> 
#> Coefficients:
#> (Intercept)      x_value          cv1          cv2          cv3  
#>    -0.14562      0.11732      0.28726      0.05642      0.01249  
#> 
#> 
# ...and so on...
#> 
#> 
#> $Y_10x2
#> 
#> Call:
#> lm(formula = y_i ~ x_value + cv1 + cv2 + cv3, data = .)
#> 
#> Coefficients:
#> (Intercept)      x_value          cv1          cv2          cv3  
#>    -0.45689     -0.02530      0.61375      0.34377     -0.02357  
#> 
#> 
#> $Y_10x3
#> 
#> Call:
#> lm(formula = y_i ~ x_value + cv1 + cv2 + cv3, data = .)
#> 
#> Coefficients:
#> (Intercept)      x_value          cv1          cv2          cv3  
#>    -0.44423     -0.18377      0.64739      0.27688     -0.02013

【讨论】:

  • 非常感谢您的帮助 JasonAizkalns。我喜欢 group_by %>% do(tidy(*)) 食谱。我有一个后续问题 - 你将如何扩展这种方法来处理不同的变量名。例如,假设您有 4 个 y 变量,称为“体重”“身高”“bmi”“脂肪量”……以及类似的不同名称的 x 变量和协变量。我猜你会在代码中包含某种循环?
  • @AhmedElhakeem 首先,我会使用“搜索” - 听起来像是一个非常标准的问题,所以可能已经有人回答了。然后,如果您仍然需要帮助,我会提出一个新问题,但请确保您的问题可重现(或制作一些虚假数据),以便其他人可以帮助您。请务必包含您已经尝试(编码)的内容以及您遇到困难的确切位置。
猜你喜欢
  • 2018-02-26
  • 1970-01-01
  • 2019-08-10
  • 2014-05-24
  • 1970-01-01
  • 2021-11-01
  • 1970-01-01
  • 2016-10-03
  • 1970-01-01
相关资源
最近更新 更多