为何生存曲线累计达100%(仅49.75%发生事件)?求正确绘图语法
问题解析与解决方案
你碰到的这个问题核心确实是fun = "event"的用法误区——这个参数会把所有删失的样本也当成“事件发生”来计算累积比例,所以哪怕实际只有49.75%的真事件,最后曲线也会爬到100%,因为它把没发生事件的删失个体也算进了“累积事件”的统计里。
为什么会出现这种情况?
survfit()输出的生存率surv,是基于当前仍在观察中的风险人群计算的剩余比例。当你用fun = "event"时,它计算的是1 - surv,这个值表示的是“到该时间点,风险人群中发生事件的比例”,而不是“总样本中发生事件的比例”。随着时间推移,删失个体不断退出风险人群,最后剩下的风险人群要么都发生了事件,要么都被删失,所以这个比例最终会趋近于100%,但这完全不是我们想要的累积发病率。
绘制累积发病率比例(Cumulative Incidence Proportion)的正确方法
累积发病率的定义是:到某个时间点为止,已经发生事件的个体数占总样本数的比例,我们可以通过以下几种方式实现:
- 方法1:基础绘图手动计算
直接从survfit对象中提取事件数,计算累计比例后绘图:
library(survival) set.seed(123) test <- data.frame(rnorm(10000)+5, sample(0:1, 10000, replace = TRUE)) colnames(test)<- c("time", "event") survfitted <- survfit(Surv(time = time, event = event) ~ 1, data = test) # 提取生存分析的汇总数据 surv_summary <- summary(survfitted) # 计算累积事件数/总样本数,得到累积发病率 cum_incidence <- cumsum(surv_summary$n.event) / nrow(test) # 绘制阶梯型曲线 plot(surv_summary$time, cum_incidence, type = "s", xlab = "Time", ylab = "Cumulative Incidence Proportion", main = "Cumulative Incidence of Event")
- 方法2:用survminer的ggsurvplot绘制
如果想要更美观的ggplot风格图,可以自定义fun参数来转换生存率:
library(survminer) ggsurvplot(survfitted, # 自定义转换函数:将基于风险人群的生存率转为基于总样本的累积发病率 fun = function(y) 1 - (y * survfitted$n.risk[1] / survfitted$n.risk), xlab = "Time", ylab = "Cumulative Incidence Proportion", title = "Cumulative Incidence of Event", ylim = c(0, 0.6)) # 可以设置y轴范围匹配实际事件比例
- 方法3:用ggplot2直接绘制
先将survfit对象转为数据框,再计算累积发病率:
library(ggplot2) # 将survfit结果转为数据框 surv_df <- fortify(survfitted) # 计算累积发病率 surv_df$cum_incidence <- cumsum(surv_df$n.event) / nrow(test) ggplot(surv_df, aes(x = time, y = cum_incidence)) + geom_step(color = "#2E9FDF", size = 1) + labs(x = "Time", y = "Cumulative Incidence Proportion", title = "Cumulative Incidence of Event") + theme_minimal()
关键总结
fun = "event"计算的是累积风险的近似值,基于剩余风险人群,不是总样本的累积发病率;- 真正的累积发病率必须用累计事件数 ÷ 总样本数计算,最终的最大值就是实际的事件发生率(这里就是~49.75%)。
内容的提问来源于stack exchange,提问作者Jakn09ab
相关产品推荐
相关产品推荐

