如何将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的结果整合到表格中,步骤如下:
- 自定义趋势卡方检验函数
编写符合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)" ) }
- 在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值*") # 调整表头样式
- 关键说明
- 自定义函数中处理了
NA值,避免因部分年份无目标组病例导致检验报错 - 需将逻辑类型的分组列指定为
categorical,确保gtsummary正确解析变量类型 - 通过
add_p()绑定自定义函数后,表格将自动添加对应组的趋势卡方检验p值
内容的提问来源于stack exchange,提问作者Nicolaj Just
相关产品推荐
相关产品推荐

