如何在gtsummary的tbl_regression中添加死亡率(/1000人年)及95%CI?
验证基于Poisson方法计算死亡率及置信区间的正确性
核心逻辑合理性
用Poisson回归计算**死亡率(/1000人年)**及95%置信区间是完全合理的:
- 死亡率本质是事件数/总人时,属于率的范畴,当事件为稀有事件时,Poisson分布能很好拟合这类计数数据
- 直接通过Poisson模型拟合
n_event ~ offset(log(总随访时间/1000)),可直接得到以/1000人年为单位的率及其置信区间,无需额外转换
典型实现的正确性验证
假设你的代码结构如下(行业常规实现):
library(survival) library(gtsummary) library(dplyr) library(broom) # 1. 按分组统计事件数、总随访时间 surv_stats <- original_data %>% group_by(分组变量) %>% summarize( n_event = sum(status), # status为结局变量(1=发生事件,0=截尾) total_followup = sum(time), # time为随访时间(单位:年) .groups = "drop" ) # 2. Poisson回归计算死亡率及95%CI pois_model <- glm(n_event ~ offset(log(total_followup/1000)), data = surv_stats, family = poisson) # 3. 提取并整理结果 mortality_res <- tidy(pois_model, exponentiate = TRUE, conf.int = TRUE) %>% mutate( 死亡率 = round(estimate, 1), 95%CI = paste0(round(conf.low, 1), "–", round(conf.high, 1)), 事件数 = surv_stats$n_event, 总随访时间 = surv_stats$total_followup ) %>% select(事件数, 总随访时间, 死亡率, `95%CI`) # 4. 合并到Cox回归表格 cox_model <- coxph(Surv(time, status) ~ 分组变量, data = original_data) cox_table <- tbl_regression(cox_model, exponentiate = TRUE) %>% add_custom_table( mortality_res, include = c(死亡率, `95%CI`), label = list(死亡率 = "死亡率(/1000人年)", `95%CI` = "95%置信区间") )
针对上述代码的验证要点:
- 人时转换正确:
offset(log(total_followup/1000))确保模型输出的率直接对应每1000人年的事件数,完全匹配需求 - 模型参数正确:
family = poisson指定了合适的分布,exponentiate = TRUE将对数尺度结果转换为原始率,逻辑无误 - 置信区间计算规范:Poisson模型的置信区间基于对数尺度的正态近似,指数化后得到的是率的95%置信区间,符合统计标准
- 表格合并逻辑通顺:通过
add_custom_table将死亡率结果整合到Cox回归表格中,实现了需求的整合展示
额外注意事项
- 若数据存在过度离散(事件数方差远大于均值),建议改用
quasipoisson族模型,避免置信区间被过度压缩 - 确保
time变量单位为年,若为月/天需先转换(如time/365.25),否则死亡率单位会出错 - 分组变量的层级需与Cox回归中的分组完全匹配,避免合并表格时出现错位
内容的提问来源于stack exchange,提问作者B_slash_
相关产品推荐
相关产品推荐

