映射嵌套的小对象并运行回归

时间:2019-10-07 17:08:10

标签: r

我有一些类似于以下内容的数据:

数据:

rank_A <- sample(x = 1:5, size  = 100, replace = TRUE)
rank_B <- sample(x = 1:5, size = 100, replace = TRUE)

Y_A <- rnorm(n = 100)
Y_B <- rnorm(n = 100)

X <- rnorm(n = 100)

df <- data.frame(rank_A, rank_B, Y_A, Y_B, X)

外观如下:

> tibble(df)
# A tibble: 100 x 1
   df$rank_A $rank_B   $Y_A   $Y_B      $X
       <int>   <int>  <dbl>  <dbl>   <dbl>
 1         5       1  0.128 -0.833  1.15  
 2         2       1  0.165  0.325  0.225 
 3         1       3  0.525 -0.632  0.390 
 4         5       3 -1.32   0.718 -0.377 
 5         4       2 -0.900 -0.364 -0.259 
 6         5       3 -1.17   0.556 -0.0702
 7         4       1 -0.560 -1.66  -1.64  
 8         5       1 -2.01  -0.898  0.306 
 9         1       1 -2.56   0.693  1.34  
10         4       2  0.338 -0.733 -0.481 
# ... with 90 more rows

因此,我有两个等级列,每个等级对应一个YAB只是两类。我想在Y_AY_B上都运行两个回归,都在X上回归。我有以下适用于rank_A的代码。

df_regs <- df %>%
  group_by(rank_A) %>%
  nest() %>%
  mutate(
    Reg_A = map(data,
                ~lm(Y_A ~ X,
                    data = .)
                ),
    Reg_A_summary = map(Reg_A,
                        ~summary(.)
                        )
    )


df_regs$Reg_A_summary  

我希望构造它,而不必为rank_B编写新的代码。我有许多不同的回归(我将给每个XY_A的不同Y_B变量)。我考虑过要进行以下操作(无效)。

df %>%
  mutate(Class_A = group_by(rank_A) %>%
           nest() %>%
           mutate(
             Reg_A = map(data,
                         ~lm(Y_a ~ X,
                             data = .)
                         )
             ),
         Class_B = group_by(rank_B) %>%
           nest() %>%
           mutate(
             Reg_B = map(data,
                         ~lm(Y_b ~ X,
                             data = .)
                         )
             )
         )

如果您知道一种更清洁的方法,也请告诉我您的想法,因为我会有很多回归。

2 个答案:

答案 0 :(得分:3)

这是一种方法,它使用pivot最新版本中的新tidyr函数...

df2 <- df %>% pivot_longer(cols=-X, 
                           names_to = c(".value", "Class"), 
                           names_sep = "_") %>% 
  group_by(Class, rank) %>% 
  summarise(Reg = list(lm(Y ~ X)))

这将创建一个带有Classrank列和Reg模型的lm的列表输出Y~X的小标题,用于每个组合。然后,您可以通过它map来提取摘要,系数或其他任何内容。

答案 1 :(得分:2)

我们可以使用map2来对相应的“ group_by”和相关列进行

library(dplyr)
library(purrr)
library(stringr)
library(broom)
map2(c('rank_A', 'rank_B'), c("Y_A", "Y_B"), ~ {
           grp <- .x
           predCol <- .y     
           newCol <- str_replace(predCol, "Y", "Reg") 
          df %>%
                group_by_at(grp) %>% 
                nest %>%
                 mutate(!! newCol:= map(data,
                     ~lm(reformulate('X', response = predCol))))
    }
   )