如何用cmprsk提取多协变量单因素竞争风险分析的HR、95%CI及P值
解决cmprsk单因素竞争风险分析结果提取与表格生成问题
问题原因
tbl_regression()目前不直接支持cmprsk包的crr()模型输出,无法直接调用生成标准化表格,需要手动提取模型结果并整理格式。
修正代码与结果提取步骤
1. 修正数据预处理与模型构建
注意crr()要求status为数值型(0=删失,1/2=竞争事件),无需转换为因子:
library(MASS) library(cmprsk) library(dplyr) library(purrr) data(Melanoma) Melanoma <- Melanoma %>% mutate( status = recode(status, `2` = 0, `1` = 1, `3` = 2) # 0=存活,1=黑色素瘤死亡,2=其他原因死亡 ) covariates <- c("sex", "age", "ulcer","thickness") # 构建单因素分析公式 univ_formulas <- sapply(covariates, function(x) { as.formula(paste('Surv(time, status) ~', x)) }) # 循环拟合竞争风险模型 univ_models <- lapply(univ_formulas, function(x){ crr(formula = x, data = Melanoma) })
2. 编写结果提取函数
创建函数从单个crr模型中提取HR、95%CI和P值:
extract_crr_results <- function(model, cov_name) { # 提取系数与标准误 coefs <- model$coef se <- model$se # 计算HR(指数化系数)及95%置信区间 hr <- exp(coefs) ci_low <- exp(coefs - 1.96 * se) ci_high <- exp(coefs + 1.96 * se) # Wald检验计算P值 z_score <- coefs / se p_val <- 2 * pnorm(abs(z_score), lower.tail = FALSE) # 整理为数据框 tibble( 协变量 = cov_name, HR = round(hr, 3), `95%CI` = paste0(round(ci_low, 3), " - ", round(ci_high, 3)), P值 = round(p_val, 3) ) }
3. 批量提取所有模型结果
# 遍历所有模型,合并结果 all_results <- map2_df(univ_models, covariates, extract_crr_results) # 查看整理后的结果 print(all_results)
4. 生成可导出的标准化表格
使用gt包生成美观表格,并支持导出至Excel/Word:
library(gt) # 构建表格 result_table <- all_results %>% gt() %>% tab_header(title = "单因素竞争风险分析结果") %>% fmt_number(columns = c(HR, P值), decimals = 3) %>% cols_label( 协变量 = "协变量", HR = "风险比(HR)", `95%CI` = "95%置信区间", P值 = "P值" ) # 导出为Excel文件 gtsave(result_table, "crr_univ_results.xlsx") # 导出为Word文件 gtsave(result_table, "crr_univ_results.docx")
补充说明
- 如果需要区分不同竞争事件的结果(比如黑色素瘤死亡/其他原因死亡的单独HR),可修改提取函数,循环提取
crr模型中对应每个事件的系数结果。 - 若偏好
gtsummary风格输出,也可使用tbl_custom()函数自定义映射规则,但手动提取结果的灵活性更高。
内容的提问来源于stack exchange,提问作者Claudio Bravo
相关产品推荐
相关产品推荐

