You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.02 12:05:45