使用dplyr和rstatix筛选多组内可执行t检验的有效分组方法
解决方法
你需要在执行t检验前,先在group_1、group_2、variable的组合层级下过滤符合独立样本t检验要求的分组,满足两个条件:
- 分组内同时存在男女两个性别类别
- 每个性别的样本量均达到你设定的阈值(示例中为5)
核心过滤代码
# 按t检验的分组维度聚合,过滤符合条件的分组 g_long_filtered <- g_long %>% group_by(group_1, group_2, variable) %>% # 两个判断条件:性别有2个水平,且每个水平样本量≥5 filter(n_distinct(gender) == 2, all(table(gender) >=5)) %>% ungroup()
完整可运行代码
#加载包 library(dplyr) library(reshape2) library(rstatix) #构造数据集 group_1 <-c(rep("Group X", 40), rep("Group Y", 40), rep("Group Z", 60), rep("Group Y", 20), rep("Group Z", 50), rep("Group Y", 10)) group_2 <- c(rep("A", 100), rep("B", 20), rep("C", 50), rep("A", 20), rep("B", 30)) var1 <- rnorm(n=220, mean=0, sd=1) var2 <- rnorm(n = 220, mean = 1, sd=1.3) gender <- c(rep("M", 30), rep("F", 30), rep("M", 40) , rep("F", 50), rep("M", 20), rep("F", 20), rep("M", 30)) data <- as.data.frame(cbind(group_1, group_2, var1, var2, gender)) #转换长格式 g_long <- gather(data, variable, value, var1:var2) g_long$value <- as.numeric(g_long$value) #过滤符合t检验要求的分组 g_long_filtered <- g_long %>% group_by(group_1, group_2, variable) %>% filter(n_distinct(gender) == 2, all(table(gender) >=5)) %>% ungroup() #执行t检验 g_test <- g_long_filtered %>% group_by(variable, group_1, group_2) %>% t_test(value ~ gender, p.adjust.method = "holm", paired=FALSE)
代码逻辑说明
- 先以
t_test的分组维度group_1、group_2、variable为聚合单位,而非额外加入gender分层 n_distinct(gender) == 2保证当前分组内同时存在男女两个类别,避免单性别分组all(table(gender) >=5)保证每个性别的样本量都达到预设阈值,避免样本量不足的情况- 过滤后的数据集再执行t检验就会自动跳过不符合要求的分组,不会抛出报错
内容的提问来源于stack exchange,提问作者Armags
相关产品推荐
相关产品推荐

