отображение на вложенные столбцы и запустить регрессии - PullRequest
0 голосов
/ 07 октября 2019

У меня есть некоторые данные, которые выглядят примерно так:

Данные:

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

Итак, у меня есть два столбца рангаи соответствующий Y для каждого ранга. A и B - это всего лишь две категории. Я хочу запустить две регрессии на Y_A и Y_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. У меня много разных регрессий (разные X переменные я дам каждому Y_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 ]

3 голосов
/ 07 октября 2019

Вот один из подходов, использующий новые функции 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)))

Это создает столбец со столбцами Class, rank ивывод списка Reg модели lm для Y~X для каждой комбинации. Затем вы можете через него map извлечь сводку, коэффициенты или что-то еще.

2 голосов
/ 07 октября 2019

Мы можем сделать это с 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))))
    }
   )
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...