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

问题描述 投票:0回答:2

我有一些看起来与以下相似的数据:

数据:

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 = .)
                         )
             )
         )

如果您知道更干净的方法,也请告诉我您的想法,因为我将进行很多回归。

r
2个回答
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)))

这将创建带有列ClassrankReg模型的列表输出lm的[ti]的小标题,每个组合的Y~X。然后,您可以通过它map来提取摘要,系数或其他内容。


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))))
    }
   )
© www.soinside.com 2019 - 2024. All rights reserved.