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

如何将prop.trend.test的p值添加至gtsummary表格

问题描述

我想要展示不同组随时间变化的病例数及其趋势,因此创建了gtsummary表格并执行了prop.trend.test趋势卡方检验。但遇到以下问题:

  • 用mutate()创建分组、生成按年分组的病例数表格后,gtsummary不支持直接调用prop.trend.test,add_p()返回的p值不正确
  • 尝试过自定义函数,但不知道如何转换该测试逻辑
  • 尝试手动添加p值列,但使用modify_table_body时因tibble与表格尺寸不匹配失败

附完整代码:

生成随机数据集

# 生成随机数据集
dataset <- data.frame(
  case_year = rep(1950:1959, each = 300/10),  # 年份覆盖1950-1959,每年30个样本
  numbers = sample(1:300, 300, replace = TRUE)  # 生成1-300的随机数值
)

为趋势卡方检验创建分组

# 按数值范围拆分数据集
numbers_0_100 <- subset(dataset, numbers <= 100)          # 数值0-100组
numbers_101_200 <- subset(dataset, numbers >= 101 & numbers <= 200)  # 数值101-200组
numbers_201_300 <- subset(dataset, numbers >= 201)       # 数值201-300组

执行趋势卡方检验

# 对每个组分别执行prop.trend.test
prop.trend.test(x = table(numbers_0_100$case_year), n = table(dataset$case_year))
prop.trend.test(x = table(numbers_101_200$case_year), n = table(dataset$case_year))
prop.trend.test(x = table(numbers_201_300$case_year), n = table(dataset$case_year))

处理数据用于gtsummary表格

# 生成分组标记列(逻辑类型)
dataset2 <- dataset %>%
  mutate(numbers_0_100 = numbers <= 100,
         numbers_101_200 = numbers >= 101 & numbers <= 200,
         numbers_201_300 = numbers >= 201)

创建gtsummary表格

# 按年份分组展示各分组的病例情况
dataset2 %>% 
  select(case_year, numbers_0_100, numbers_101_200, numbers_201_300) %>%
  gtsummary::tbl_summary(by = case_year)
解决方案

通过自定义适配gtsummary的检验函数,可直接将prop.trend.test的结果整合到表格中,步骤如下:

  1. 自定义趋势卡方检验函数
    编写符合gtsummary输入输出要求的函数,处理分组数据并返回检验结果:
# 自定义适配gtsummary的prop.trend.test函数
prop_trend_test <- function(data, variable, by, ...) {
  # 提取分组变量的所有年份水平
  by_levels <- unique(data[[by]])
  # 统计每年目标组的病例数(x)和总病例数(n)
  x <- table(data[[by]][data[[variable]]])[by_levels]
  x[is.na(x)] <- 0  # 处理部分年份无目标组病例的情况
  n <- table(data[[by]])[by_levels]
  # 执行趋势卡方检验
  test_result <- prop.trend.test(x = x, n = n)
  # 返回gtsummary要求的格式(包含p值和检验方法)
  tibble::tibble(
    p.value = test_result$p.value,
    method = "趋势卡方检验(prop.trend.test)"
  )
}
  1. 在gtsummary表格中应用自定义函数
    使用add_p()为每个分组变量绑定自定义检验函数,同时将逻辑类型列指定为分类变量:
# 创建表格并添加趋势检验p值
dataset2 %>% 
  select(case_year, numbers_0_100, numbers_101_200, numbers_201_300) %>%
  gtsummary::tbl_summary(
    by = case_year, 
    type = all_logical() ~ "categorical"  # 将逻辑列识别为分类变量
  ) %>%
  gtsummary::add_p(
    test = list(
      numbers_0_100 ~ prop_trend_test,
      numbers_101_200 ~ prop_trend_test,
      numbers_201_300 ~ prop_trend_test
    )
  ) %>%
  gtsummary::modify_header(p.value ~ "*趋势检验p值*")  # 调整表头样式
  1. 关键说明
  • 自定义函数中处理了NA值,避免因部分年份无目标组病例导致检验报错
  • 需将逻辑类型的分组列指定为categorical,确保gtsummary正确解析变量类型
  • 通过add_p()绑定自定义函数后,表格将自动添加对应组的趋势卡方检验p值

内容的提问来源于stack exchange,提问作者Nicolaj Just

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.01 07:07:52