我的数据结构如下:
test <- data.frame(
id= rep(1:3, each=20),
count = rnorm(60, mean=5, sd=1),
covar1 = rnorm(60, mean=10, sd=3),
covar2 = rnorm(60, mean=95, sd=5),
covar3 = rnorm(60, mean=30, sd=5)
)
然后我将其嵌套在id
上:
test <- test %>% nest(-id)
我想将模型应用于给定ID的每个数据covar
列。然后,我想将结果存储在单独的列中。我可以这样做,如下:
test <- test %>% mutate(covar1_lm = map(data, ~lm(count ~ covar1, data=.x)),
covar2_lm = map(data, ~lm(count ~ covar2, data=.x)),
covar3_lm = map(data, ~lm(count ~ covar3, data=.x)))
哪个给出我想要的输出:
> test
# A tibble: 3 x 5
id data covar1_lm covar2_lm covar3_lm
<int> <list> <list> <list> <list>
1 1 <tibble [20 × 4]> <lm> <lm> <lm>
2 2 <tibble [20 × 4]> <lm> <lm> <lm>
3 3 <tibble [20 × 4]> <lm> <lm> <lm>
问题是我的真实数据有大量covar
列,因此我想减少样板代码。所以我想我需要一些动态变量名的概念,但是我无法弄清楚如何映射一组动态的列名?
答案 0 :(得分:2)
您可以首先pivot_longer()
数据集,以便每个数据集的每个协变量都有一个观测值(行)。然后在每个协变量中执行模型。
test %>%
pivot_longer(starts_with("covar"),
names_to = "covariate") %>%
group_by(id, covariate) %>%
summarize(model = list(lm(count ~ value)))
您现在对ID和协变量的每种组合都有一个观察结果。
# A tibble: 9 x 3
# Groups: id [3]
id covariate model
<int> <chr> <list>
1 1 covar1 <lm>
2 1 covar2 <lm>
3 1 covar3 <lm>
4 2 covar1 <lm>
5 2 covar2 <lm>
6 2 covar3 <lm>
7 3 covar1 <lm>
8 3 covar2 <lm>
9 3 covar3 <lm>
如果要将其转换为相同类型的结果,可以将其通过管道传输到pivot_wider(names_from = covariate, values_from = model)
。 (但是请注意,每个模型只有一行,这样可以更轻松地浏览和可视化模型,特别是如果您使用broom::tidy()
整理每个模型并取消嵌套)。
上面group_by()/summarize()
的替代方法是将它们嵌套:
test %>%
pivot_longer(starts_with("covar"),
names_to = "covariate") %>%
group_by(id, covariate) %>%
nest() %>%
mutate(model = map(data, ~ lm(count ~ value, data = .x)))