我有一些类似于以下内容的数据:
数据:
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 = .)
)
)
)
如果您知道一种更清洁的方法,也请告诉我您的想法,因为我会有很多回归。
答案 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)))
这将创建一个带有Class
,rank
列和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))))
}
)