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

为什么含两种删失事件数据的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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.28 16:54:06