如何在dplyr中为组间成对比较嵌套数据?
实现两组组合的嵌套建模
步骤1:生成所有不重复的两组组合
先从原数据中提取唯一分组,用combn生成所有2个组的不重复组合,转成tibble方便后续处理:
# 获取唯一分组 unique_groups <- unique(data$group) # 生成所有两组组合,转成tibble并添加组合标识 group_pairs <- combn(unique_groups, 2, simplify = FALSE) %>% map_dfr(~tibble(group1 = .x[1], group2 = .x[2])) %>% mutate(group_pair = str_c(group1, "-", group2))
步骤2:按组合筛选数据并嵌套
基于组合表,为每个组合筛选原数据中对应组的行,存储为列表列(效果和nest()一致):
nested_data <- group_pairs %>% mutate(data = map2(group1, group2, ~filter(data, group %in% c(.x, .y))))
步骤3:批量拟合模型
用map对每个嵌套的数据子集拟合指定的混合模型:
final_results <- nested_data %>% mutate(lmm = map(data, \(x) lmer(value ~ time * group + (1|ID), data = x)))
完整代码整合
把所有步骤整合后,直接运行即可得到每行对应一个两组组合的建模结果:
library(tidyverse) library(lme4) set.seed(123) # 生成示例数据 data <- tibble( ID = rep(1:50, each = 2), time = rep(c(0, 1), times = 50), group = rep(sample(c("A", "B", "C"), 50, replace = TRUE), each = 2), value = runif(100) ) # 生成两组组合并完成建模 final_results <- combn(unique(data$group), 2, simplify = FALSE) %>% map_dfr(~tibble(group1 = .x[1], group2 = .x[2], group_pair = str_c(.x, collapse = "-"))) %>% mutate( data = map2(group1, group2, ~filter(data, group %in% c(.x, .y))), lmm = map(data, \(x) lmer(value ~ time * group + (1|ID), data = x)) ) # 查看结果 final_results
关键说明
combn(..., simplify = FALSE)生成无序组合,避免A-B和B-A这类重复建模,节省计算资源map2用来同时传递两个分组参数,精准筛选对应的数据子集- 最终结果每行对应一组两组组合,包含组合标识、对应数据子集以及拟合好的模型
内容的提问来源于stack exchange,提问作者user23485480
相关产品推荐
相关产品推荐

