【问题标题】:Running Many Simple LM Regressions efficently高效运行许多简单的 LM 回归
【发布时间】:2018-08-14 11:11:45
【问题描述】:

好的,所以我有一个看起来有点像这样的数据框 d

A B C D E F G F H

0 1 1 1 1 1 0 1 3

1 0 1 0 1 0 1 2 2

A 是我的响应变量。现在我可以像这样运行一堆 Lm 回归。

lm.b

总结(lm.b)

confint(lm.b)

并对所有协变量重复。我想找到一些更有效的东西,让我可以用几条干净的线条来完成所有这些工作。有谁知道可以做到这一点的包?

【问题讨论】:

    标签: r dplyr regression


    【解决方案1】:

    为了补充 jayelm 的答案,您可以使用出色的 broom 包来进一步处理生成的数据集。

    library(broom)
    

    您可以查看所有单独的回归:

    tidy(lms, lm)
    # A tibble: 14 x 6
    # Groups:   Variable [8]
       Variable term                       estimate std.error             statistic p.value
       <chr>    <chr>                         <dbl>     <dbl>                 <dbl>   <dbl>
     1 B        (Intercept)   23.6                   79462     0.000297               1.000
     2 B        Value       - 47.1                  112376    -0.000419               1.000
     3 C        (Intercept)    0.000000000000000471      1.41  0.000000000000000333   1.000
     4 D        (Intercept)   23.6                   79462     0.000297               1.000
     5 D        Value       - 47.1                  112376    -0.000419               1.000
     6 E        (Intercept)    0.000000000000000471      1.41  0.000000000000000333   1.000
     7 F        (Intercept)   23.6                   79462     0.000297               1.000
     8 F        Value       - 47.1                  112376    -0.000419               1.000
     9 F2       (Intercept) - 70.7                  177682    -0.000398               1.000
    10 F2       Value         47.1                  112376     0.000419               1.000
    11 G        (Intercept) - 23.6                   79462    -0.000297               1.000
    12 G        Value         47.1                  112376     0.000419               1.000
    13 H        (Intercept)  118                    286504     0.000411               1.000
    14 H        Value       - 47.1                  112376    -0.000419               1.000
    

    获取每个模型的摘要:

    glance(lms, lm)
    
    # A tibble: 8 x 8
    # Groups:   Variable [8]
      Variable null.deviance df.null          logLik   AIC   BIC       deviance df.residual
      <chr>            <dbl>   <int>           <dbl> <dbl> <dbl>          <dbl>       <int>
    1 B                 2.77       1 -0.000000000117  4.00  1.39 0.000000000233           0
    2 C                 2.77       1 -1.39            4.77  3.47 2.77                     1
    3 D                 2.77       1 -0.000000000117  4.00  1.39 0.000000000233           0
    4 E                 2.77       1 -1.39            4.77  3.47 2.77                     1
    5 F                 2.77       1 -0.000000000117  4.00  1.39 0.000000000233           0
    6 F2                2.77       1 -0.000000000117  4.00  1.39 0.000000000233           0
    7 G                 2.77       1 -0.000000000117  4.00  1.39 0.000000000233           0
    8 H                 2.77       1 -0.000000000117  4.00  1.39 0.000000000233           0
    

    并获得预测、残差等:

    head(augment(lms, lm))
    
    # A tibble: 6 x 10
    # Groups:   Variable [3]
      Variable     A Value                .fitted  .se.fit .resid  .hat .sigma .cooksd .std.resid
      <chr>    <dbl> <dbl>                  <dbl>    <dbl>  <dbl> <dbl>  <dbl>   <dbl>      <dbl>
    1 B         0     1.00 -23.6                  79462      0    1.00       0   NA         NA   
    2 B         1.00  0     23.6                  79462      0    1.00       0   NA         NA   
    3 C         0     1.00   0.000000000000000471     1.41  -1.18 0.500    NaN    2.00     - 1.67
    4 C         1.00  1.00   0.000000000000000471     1.41   1.18 0.500    Inf    2.00       1.67
    5 D         0     1.00 -23.6                  79462      0    1.00       0   NA         NA   
    6 D         1.00  0     23.6                  79462      0    1.00       0   NA         NA  
    

    请注意,lms 是使用 do() 语法创建的小标题的名称,lm 是实际保存模型结果的变量的名称。

    【讨论】:

      【解决方案2】:

      (我假设您重复的 F 行在这里是一个单独的变量)

      library(tidyr)
      library(dplyr)
      df <- data.frame(A = c(0, 1), B = c(1, 0), C = c(1, 1), D = c(1, 0), E = c(1, 1), F = c(1, 0), G = c(0, 1), F2 = c(1, 2), H = c(3, 2))
      

      使用tidyrdplyr,先将数据reshape为长格式

      df_long <- df %>%
        gather(Variable, Value, B:H) %>%
        group_by(Variable)
      
      # A tibble: 16 x 3
      # Groups:   Variable [8]
             A Variable Value
         <dbl> <chr>    <dbl>
       1  0    B         1.00
       2  1.00 B         0
       3  0    C         1.00
       4  1.00 C         1.00
       5  0    D         1.00
       6  1.00 D         0
       7  0    E         1.00
       8  1.00 E         1.00
       9  0    F         1.00
      10  1.00 F         0
      11  0    G         0
      12  1.00 G         1.00
      13  0    F2        1.00
      14  1.00 F2        2.00
      15  0    H         3.00
      16  1.00 H         2.00
      

      然后使用dplyr::do 将您的glm 应用于按变量分组的每组值和响应 (A) (B:H)

      lms <- df_long %>% do(lm = glm(A ~ Value, data = ., family = binomial(link = 'logit')))
      
      Source: local data frame [8 x 2]
      Groups: <by row>
      # A tibble: 8 x 2
        Variable lm
      * <chr>    <list>
      1 B        <S3: glm>
      2 C        <S3: glm>
      3 D        <S3: glm>
      4 E        <S3: glm>
      5 F        <S3: glm>
      6 F2       <S3: glm>
      7 G        <S3: glm>
      8 H        <S3: glm>
      

      如果您希望在每个lm 都可以通过变量名访问的列表中,请尝试

      lms_list <- setNames(lms$lm, lms$Variable)
      # Now use `lms_list$B`, etc
      

      【讨论】:

      • 啊,我真的很喜欢 dplyr 这样做的方式!感谢您抽出宝贵时间!
      猜你喜欢
      • 1970-01-01
      • 2018-10-03
      • 1970-01-01
      • 2018-07-15
      • 2018-09-30
      • 2017-07-16
      • 2013-05-01
      • 2019-09-08
      • 1970-01-01
      相关资源
      最近更新 更多