如何用R的cmprsk包为两个事件生成独立的竞争风险CIF图?
解决竞争风险分析中生成独立事件图的问题
有两种方法可以实现为两个事件生成独立图的需求,具体如下:
方法1:利用ggcompetingrisks内置分面板功能
直接将multiple_panels参数设为TRUE,函数会自动按事件拆分出独立面板,同时你可以保留原有的标度和标签设置(注意要移除冲突的scale_color_discrete,避免覆盖手动颜色设置):
library(cmprsk) library(ggplot2) # 拟合竞争风险模型 fit <- cuminc(leuk$censor_time, leuk$competing_risk, group = leuk$group) # 生成分面板的独立事件图 p <- ggcompetingrisks(fit, multiple_panels = TRUE, title = "Competing Risks Analysis") + # 设置事件线型 scale_linetype_manual(name = "Competing Events", values = c(1, 2), labels = c("TRM", "Relapse")) + # 设置分组颜色与标签 scale_color_manual(name = "my group", values = c("black", "orange", "blue"), labels = c(A = "low", B = "med", C = "high")) + labs(x = "Time", y = "Cumulative Incidence") print(p)
方法2:手动提取数据生成独立绘图对象
如果需要完全独立的两张图(可单独保存或调整),可以从拟合结果中提取数据框,按事件筛选后分别绘图:
# 提取拟合结果的底层数据 cr_data <- fit$data # 针对TRM事件(假设对应event=1)绘图 p_trm <- ggplot(cr_data[cr_data$event == 1, ], aes(x = time, y = est, colour = group)) + geom_step() + labs(title = "Cumulative Incidence: TRM", x = "Time", y = "Cumulative Incidence", colour = "my group") + scale_color_manual(values = c("black", "orange", "blue"), labels = c(A = "low", B = "med", C = "high")) + theme_bw() # 针对Relapse事件(假设对应event=2)绘图 p_relapse <- ggplot(cr_data[cr_data$event == 2, ], aes(x = time, y = est, colour = group)) + geom_step() + labs(title = "Cumulative Incidence: Relapse", x = "Time", y = "Cumulative Incidence", colour = "my group") + scale_color_manual(values = c("black", "orange", "blue"), labels = c(A = "low", B = "med", C = "high")) + theme_bw() # 分别查看两张图 print(p_trm) print(p_relapse) # 若需并排展示,可使用gridExtra包 # library(gridExtra) # grid.arrange(p_trm, p_relapse, ncol = 2)
注意事项
- 原代码中同时使用
scale_color_discrete和scale_color_manual会导致冲突,后者会覆盖前者,因此只需保留scale_color_manual并在其中统一设置标签和颜色。 - 确认
event列的取值对应正确的事件(比如1对应TRM,2对应Relapse),可通过unique(cr_data$event)查看具体取值。
内容的提问来源于stack exchange,提问作者Donniq
相关产品推荐
相关产品推荐

