映射嵌套的 tibbles 并运行回归



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

数据:

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。 这里的AB只是两类。我想在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编写一段新代码。我有许多不同的回归(我将给每个Y_AY_B不同的X变量(。我想过做下面这样的事情(这不起作用(。

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

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

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

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

这将创建一个包含列Classrank列和lm模型的列表输出Reg,用于每个组合的Y~X。 然后,您可以map它以提取摘要、系数或其他内容。

我们可以对相应的 'group_by' 和依赖列使用map2来做到这一点

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))))
}
)

最新更新