如何为tbl_summary()生成的表格添加TukeyHSD事后检验显著性上标
实现方法
完全可以在tbl_summary()生成的汇总表中添加Tukey HSD事后检验的显著性上标,不需要手动导出表格修改,以下是可直接复用的实现逻辑:
- 核心思路:先对所有需要比较的变量完成Tukey事后检验,生成组间显著性差异对应的字母分组标记,再把标记作为上标匹配到表格对应分组的统计量单元格即可。
- 可复现代码示例(基于R内置
mtcars数据集,以气缸数cyl为分组变量):
首先加载依赖包,写一个提取Tukey检验显著性字母的工具函数:
接着生成基础汇总表,把显著性标记匹配到对应单元格:library(gtsummary) library(dplyr) library(multcomp) # 提取指定变量、指定分组下Tukey HSD检验的显著性分组字母 get_tukey_marks <- function(data, target_var, group_col){ # 拟合ANOVA模型 aov_model <- aov(as.formula(paste(target_var, "~", group_col)), data = data) # 做Tukey两两比较 tuk_comp <- glht(aov_model, linfct = mcp(as.name(group_col) = "Tukey")) # 提取0.05显著性水平下的分组字母 sig_letters <- cld(tuk_comp, level = 0.05)$mcletters$Letters return(sig_letters) }# 选定需要做检验的连续变量 analyze_vars <- c("mpg", "disp", "hp", "drat") # 批量提取所有变量的显著性标记 all_sig_marks <- purrr::map(analyze_vars, ~get_tukey_marks(mtcars %>% mutate(cyl = factor(cyl)), .x, "cyl")) %>% set_names(analyze_vars) # 生成带显著性上标的汇总表 final_table <- mtcars %>% mutate(cyl = factor(cyl, levels = c(4,6,8))) %>% select(cyl, all_of(analyze_vars)) %>% tbl_summary( by = cyl, statistic = all_continuous() ~ "{mean} ± {sd}" ) %>% # 给每个分组单元格加上对应上标 modify_table_body( ~.x %>% mutate( stat_1 = ifelse(variable %in% analyze_vars, paste0(stat_1, "<sup>", all_sig_marks[[variable]]["4"], "</sup>"), stat_1), stat_2 = ifelse(variable %in% analyze_vars, paste0(stat_2, "<sup>", all_sig_marks[[variable]]["6"], "</sup>"), stat_2), stat_3 = ifelse(variable %in% analyze_vars, paste0(stat_3, "<sup>", all_sig_marks[[variable]]["8"], "</sup>"), stat_3) ) ) %>% # 添加上标含义说明 add_footnote( footnote = "标注不同上标字母的组间存在Tukey HSD事后检验P<0.05的统计学差异", locations = cells_body(columns = starts_with("stat_")) ) - 简便方案:如果安装gtsummary的开发版,可直接调用内置的
add_significance_letters()函数,只需要在add_p()中指定检验方法为Tukey HSD,函数会自动完成显著性标记的计算和上标添加,不需要手动写单元格匹配逻辑。
注意:如果需要对分类变量添加事后检验上标,只需要把工具函数里的ANOVA模型替换为分类变量两两比较的检验方法(比如Bonferroni校正的卡方检验/Fisher精确检验),后续表格拼接逻辑完全一致。
内容的提问来源于stack exchange,提问作者Khanh Nguyen
相关产品推荐
相关产品推荐

