You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在tbl_summary中添加行比较p值(单样本比例检验带连续性修正)

解决方案:针对分类变量行水平的单样本比例检验(带连续性修正)

核心实现思路

原代码通过tbl_summary(by = sex)实现了按性别列分组的变量差异比较,现在要针对每个二分类变量的自身水平(比如Food Control Category的Normal/High)执行带连续性修正的单样本比例检验,核心步骤为:

  1. 自定义适配gtsummary的检验函数,对二分类变量执行带连续性修正的二项检验
  2. 将该函数绑定到目标变量,替换默认的组间比较逻辑
  3. 保留原表格的统计量展示,同时添加行水平的检验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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.06 20:37:21