【问题标题】:How to run many regressions across rows and columns with vectorization如何使用矢量化跨行和列运行许多回归
【发布时间】:2020-08-18 08:55:19
【问题描述】:

我想为跨列的多个组运行一系列线性回归。对于跨行的组分层,我可以使用这里建议的想法 (Fitting several regression models with dplyr)。除此之外,我还需要在不同的列中对它们进行回归。请看下面我用 loop 实现的代码。我想知道我是否可以使用 purrr 包中的map 函数和 dplyr 包中的group_by 函数以矢量化方式同时执行这两种操作,并导出估计的 beta系数和 p 值。

library(dplyr)
library(broom)
head(mtcars)

vec<-names(mtcars)[3:9]

data=NULL

for (i in 1:length(vec)){ 
df<-mtcars%>% 
    group_by(cyl)%>%
  do(  fit = lm( paste('mpg ~disp+',vec[i]), data = .)) 
  dfCoef = tidy(df, fit)
  res<-dfCoef %>% 
    filter(term=='disp')
  res$con=vec[i]
  data=bind_rows(data,res)
  }
data

【问题讨论】:

    标签: r dictionary dplyr purrr


    【解决方案1】:

    使用tidyr::(un)nest 按组执行回归和辅助函数,可以这样实现:

    library(dplyr)
    library(broom)
    library(tidyr)
    library(purrr)
    
    vec <- names(mtcars)[3:9]
    
    lm_help <- function(vec) {
      mtcars %>% 
        tidyr::nest(data = -cyl) %>% 
        mutate(con = vec,
               fit = purrr::map(data, lm, formula = as.formula(paste0("mpg ~ disp + ", vec))),
               tidy = purrr::map(fit, tidy)) %>% 
        select(cyl, con, tidy) %>% 
        tidyr::unnest(tidy) %>% 
        filter(term == "disp")
    }
    
    purrr::map(vec, lm_help) %>% 
      bind_rows()
    #> # A tibble: 21 x 7
    #>      cyl con   term  estimate std.error statistic p.value
    #>    <dbl> <chr> <chr>    <dbl>     <dbl>     <dbl>   <dbl>
    #>  1     6 disp  disp   0.00361   0.0156     0.232  0.826  
    #>  2     4 disp  disp  -0.135     0.0332    -4.07   0.00278
    #>  3     8 disp  disp  -0.0196    0.00932   -2.11   0.0568 
    #>  4     6 hp    disp   0.00180   0.0202     0.0890 0.933  
    #>  5     4 hp    disp  -0.120     0.0369    -3.24   0.0120 
    #>  6     8 hp    disp  -0.0186    0.00946   -1.97   0.0746 
    #>  7     6 drat  disp   0.0224    0.0292     0.770  0.484  
    #>  8     4 drat  disp  -0.133     0.0406    -3.27   0.0114 
    #>  9     8 drat  disp  -0.0196    0.00977   -2.01   0.0697 
    #> 10     6 wt    disp   0.0191    0.0109     1.75   0.154  
    #> # ... with 11 more rows
    

    【讨论】:

      猜你喜欢
      • 2017-05-29
      • 1970-01-01
      • 1970-01-01
      • 2010-09-29
      • 2022-01-16
      • 2021-12-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多