如何将竞争风险图按结局而非组别分面板展示?
实现按结局分面板的竞争风险图
要实现按结局拆分面板、每个面板展示所有组别累积发生率的需求,ggcompetingrisks 没有直接对应的参数,我们可以手动提取 cuminc 的拟合结果,用 ggplot2 自定义绘图来实现。
步骤1:数据准备与拟合
先运行原代码生成数据并拟合累积发生率模型:
set.seed(2) failure_time <- rexp(100) status <- factor(sample(0:2, 100, replace=TRUE), 0:2, c('no event', 'death', 'progression')) disease <- factor(sample(1:3, 100,replace=TRUE), 1:3, c('BRCA','LUNG','OV')) library(cmprsk) fit3 <- cuminc(ftime = failure_time, fstatus = status, group = disease)
步骤2:提取并整理拟合数据
手动从 cuminc 对象中提取时间点、累积发生率估计值、组别和结局信息,整理成适合 ggplot 的长格式:
# 定义函数提取cuminc结果 extract_cuminc_data <- function(fit) { # 获取所有分组-结局组合 strata_names <- names(fit$est) # 逐个提取数据 result_list <- lapply(strata_names, function(str) { # 拆分组别和结局 group_event <- strsplit(str, " ")[[1]] group <- group_event[1] event <- group_event[2] data.frame( time = fit$time[[str]], cum_incidence = fit$est[[str]], lower_ci = fit$lower[[str]], upper_ci = fit$upper[[str]], group = group, event = event ) }) # 合并为数据框 do.call(rbind, result_list) } # 提取数据 tidy_data <- extract_cuminc_data(fit3)
步骤3:用ggplot绘制分面板图
按结局分面,每个面板内用不同颜色展示各组的累积发生率曲线,可选添加置信区间:
library(ggplot2) ggplot(tidy_data, aes(x = time, y = cum_incidence, color = group)) + # 绘制累积发生率阶梯线 geom_step(linewidth = 1) + # 绘制置信区间(可选) geom_ribbon(aes(ymin = lower_ci, ymax = upper_ci, fill = group), alpha = 0.2, color = NA) + # 按结局分面板 facet_wrap(~event, scales = "free_y") + # 自定义标签与主题 labs(x = "时间", y = "累积发生率", color = "疾病分组", fill = "疾病分组") + theme_bw() + theme(legend.position = "top")
补充说明
- 上述代码会生成3个面板(对应
death、progression、no event),每个面板内展示BRCA、LUNG、OV三组的累积发生率曲线。 - 如果不需要
no event结局,可以在提取数据后加一行tidy_data <- subset(tidy_data, event != "no event")过滤掉该组数据。 - 通过
scales = "free_y"可以让每个面板的y轴自适应范围,避免不同结局发生率差异大导致的可视化失真。
内容的提问来源于stack exchange,提问作者Timmo83
相关产品推荐
相关产品推荐

