为什么含两种删失事件数据的survfit生存曲线未从100%起始?
问题解析:含多状态删失的survfit曲线未在(0,1)起始
你遇到的这个情况其实是对多状态生存数据(竞争风险)的拟合逻辑理解偏差导致的,我来一步步拆解原因和解决办法:
为什么曲线会从第一个事件点跳至100%?
你的代码里把event设为了因子类型,这会让Surv(time, event)被R的survival包解析为多状态竞争风险数据,而非传统的单状态“事件/删失”数据:
- 默认情况下,
survfit会把每个因子水平都当作一个独立的事件类型,没有指定任何水平为“删失”——也就是说,所有观测都被判定为发生了某类事件。 - 你看到的
s0曲线其实是某个事件类别的累积发生率(CIF):在第一个该类事件发生前,累积发生率为0;当第一个该类事件出现时,如果刚好这个事件在小样本里占比100%(随机抽样容易出现),曲线就会直接跳至100%。
如何修正得到正常起始的生存曲线?
根据你的需求,分两种情况处理:
情况1:需要传统Kaplan-Meier生存曲线(未发生任何事件的概率)
如果你的目标是看“未发生任何指定事件”的生存概率,需要先重新编码event,明确区分删失和事件:
library(survival) library(ggfortify) library(tidyverse) set.seed(1337) # 重新编码:假设3是删失状态,1和2为事件 dummy_data = tibble(time = sample.int(100, 100, replace = TRUE), event = sample.int(3, 100, replace = TRUE)) %>% mutate( # 标记是否发生事件:删失=0,任意事件=1 is_event = ifelse(event == 3, 0, 1) ) # 拟合传统KM曲线 kaplanMeier <- survfit(Surv(time, is_event) ~ 1, data=dummy_data) autoplot(kaplanMeier)
这条曲线会从(时间=0, 生存概率=100%)开始,随着事件发生逐步下降。
情况2:需要分析竞争风险(不同事件的累积发生率)
如果确实要区分两种不同的事件类型,需要明确指定删失状态,然后拟合竞争风险模型:
library(survival) library(ggfortify) library(tidyverse) set.seed(1337) # 重新编码:3=删失,1和2=不同事件类型 dummy_data = tibble(time = sample.int(100, 100, replace = TRUE), event = sample.int(3, 100, replace = TRUE)) %>% mutate( event = case_when( event == 3 ~ 0, # 0代表删失 TRUE ~ event # 1和2代表两种事件 ) ) # 拟合竞争风险模型,指定type="fh2"处理多状态 cr_model <- survfit(Surv(time, event) ~ 1, data=dummy_data, type = "fh2") autoplot(cr_model, facets = TRUE)
这里的每条曲线代表对应事件的累积发生率,起始于(0,0),随着时间推移逐步上升,这是竞争风险分析的标准展示方式。
内容的提问来源于stack exchange,提问作者LittleLynx
相关产品推荐
相关产品推荐

