如何用R绘制多分类事件的生存曲线?现有代码仅生成单曲线
问题解答
一、同时展示两种不同事件的生存曲线是否合理?
这得看你的研究场景和目的:
- 如果两种事件是互斥的竞争风险事件(比如患者最终只会因A事件或B事件结局,不会同时遭遇两种事件),或者你想分别观察“未发生事件A的生存概率”“未发生事件B的生存概率”,这种展示完全合理——能直观对比不同事件的发生风险差异,只要在图里明确标注每种曲线对应的事件类型,避免读者误解就行。
- 但如果两种事件存在重叠(比如患者可能同时发生两种事件),直接展示两条传统生存曲线就容易误导,因为传统生存曲线假设“删失”不包含其他事件,这种情况更适合用多状态模型的可视化。
二、R语言实现方法(ggplot/ggsurvplot)
假设你的数据集mydata里,time是随访时间,status是结局变量(0=删失,1=事件1,2=事件2),分两种场景处理:
场景1:竞争风险下的累积发生率曲线(更严谨)
如果是竞争风险场景,推荐绘制累积发生率曲线(CIC),它会考虑其他事件的竞争风险,比传统生存曲线更准确:
# 加载必要包 library(survival) library(cmprsk) library(survminer) # 拟合竞争风险模型 cic_fit <- cuminc(ftime = mydata$time, fstatus = mydata$status) # 用ggsurvplot绘制 ggsurvplot(cic_fit, data = mydata, conf.int = TRUE, # 显示置信区间 legend.title = "事件类型", legend.labs = c("事件1", "事件2"), # 自定义图例标签 xlab = "随访时间", ylab = "累积发生率")
场景2:分别拟合两种事件的传统生存曲线
如果你想忽略竞争风险,单纯展示“未发生某事件”的生存概率,可以分别为每个事件重新定义结局变量,再拟合生存曲线后合并绘图:
library(survival) library(survminer) library(ggplot2) # 针对事件1重新定义status:1=发生事件1,0=未发生(包括删失和事件2) mydata$status1 <- ifelse(mydata$status == 1, 1, 0) # 针对事件2重新定义status:1=发生事件2,0=未发生(包括删失和事件1) mydata$status2 <- ifelse(mydata$status == 2, 1, 0) # 分别拟合生存曲线 fit1 <- survfit(Surv(time, status1) ~ 1, data = mydata) fit2 <- survfit(Surv(time, status2) ~ 1, data = mydata) # 用ggsurvplot合并绘图 ggsurvplot_list <- list(fit1, fit2) ggsurvplot_combine(ggsurvplot_list, data = mydata, legend.title = "事件类型", legend.labs = c("未发生事件1的生存概率", "未发生事件2的生存概率"), xlab = "随访时间", ylab = "生存概率", conf.int = TRUE)
也可以用纯ggplot手动绘制:
# 将生存曲线结果转为数据框 df1 <- fortify(fit1) df1$event <- "未发生事件1" df2 <- fortify(fit2) df2$event <- "未发生事件2" df_combined <- rbind(df1, df2) # ggplot绘图 ggplot(df_combined, aes(x = time, y = surv, color = event)) + geom_step() + geom_ribbon(aes(ymin = lower, ymax = upper, fill = event), alpha = 0.2, color = NA) + labs(x = "随访时间", y = "生存概率", color = "事件类型", fill = "事件类型") + theme_bw()
内容的提问来源于stack exchange,提问作者Seydou GORO
相关产品推荐
相关产品推荐

