如何在tbl_summary中添加行比较p值(单样本比例检验带连续性修正)
解决方案:针对分类变量行水平的单样本比例检验(带连续性修正)
核心实现思路
原代码通过tbl_summary(by = sex)实现了按性别列分组的变量差异比较,现在要针对每个二分类变量的自身水平(比如Food Control Category的Normal/High)执行带连续性修正的单样本比例检验,核心步骤为:
- 自定义适配
gtsummary的检验函数,对二分类变量执行带连续性修正的二项检验 - 将该函数绑定到目标变量,替换默认的组间比较逻辑
- 保留原表格的统计量展示,同时添加行水平的检验p值
可推广的代码实现
首先定义带连续性修正的单样本比例检验函数(默认检验某一水平的比例是否为0.5,可按需调整期望比例):
# 自定义带连续性修正的单样本比例检验函数 binom_test_cont_corr <- function(data, variable, by = NULL) { # 提取变量的二分类水平 var_levels <- levels(factor(data[[variable]])) # 统计目标水平的样本量与总有效样本量 target_count <- sum(data[[variable]] == var_levels[2], na.rm = TRUE) total_n <- sum(!is.na(data[[variable]])) # 执行带连续性修正的二项检验,p参数可改为需要的期望比例 test_result <- binom.test(x = target_count, n = total_n, p = 0.5, correct = TRUE) # 返回符合gtsummary要求的结果格式 list(p.value = test_result$p.value) }
修改原表格代码,应用自定义检验函数:
library(gtsummary) library(dplyr) library(flextable) con_tab <- ADE.Joined_tab %>% dplyr::select(sex, `ADE Category`, `Food Control Category`, `Bingeing Category`, `Body Control Category`, `Body Discontent Category`) %>% tbl_summary( by = sex, # 保留按性别列展示统计量的逻辑 statistic = list(all_categorical() ~ "{n} ({p}%)"), digits = list(all_categorical() ~ 1) ) %>% add_overall(last = TRUE) %>% # 对所有分类变量应用自定义检验,替换默认组间比较 add_p( test = list(all_categorical() ~ binom_test_cont_corr), label = "单样本比例检验p值(带连续性修正)" ) %>% bold_labels() # 查看生成的表格 con_tab # 转为flextable格式展示 con_tab$table_body %>% flextable()
灵活调整说明
- 若需检验的期望比例不是0.5,直接修改
binom_test_cont_corr函数中的p参数即可(比如改为总体已知比例) - 针对多分类变量,可先将其拆分为多个二分类变量,再复用该检验逻辑
- 若需按性别分组分别执行行水平检验,可在自定义函数中加入
by参数判断,按分组执行检验后返回对应p值
内容的提问来源于stack exchange,提问作者Colin Doherty
相关产品推荐
相关产品推荐

