如何用R设置ggsurvplot起始生存值<1并让生存表纳入未康复患者?
在R中绘制包含未接受康复人群的Kaplan-Meier曲线(基线起始于接受比例)
问题核心
你当前的代码把未接受康复的患者(time=0, status=1)错误识别为第0天发生事件,导致曲线从1骤降到0.7,但实际这些患者从未进入康复风险集,因此KM曲线应直接以接受康复人群占总人群的比例作为起始点。
解决方案步骤
1. 标记接受康复的人群
首先在数据中新增变量,明确区分是否接受康复:
library(survival) library(survminer) library(tidyverse) df = tibble( time = c(0, 0, 0, 40, 50, 60, 70, 100, 100, 100), status = c(1, 1, 1, 1, 1, 0, 0, 0, 0, 0), received_rehab = ifelse(time == 0, 0, 1) # 0=未接受康复,1=接受康复 )
2. 计算基线生存比例
接受康复人群占总人群的比例就是KM曲线的起始生存值:
prop_rehab <- mean(df$received_rehab) # 本例中为0.7
3. 拟合并调整KM模型
先对接受康复的人群拟合标准KM模型,再手动调整结果,将未接受康复人群纳入基线统计:
# 仅对接受康复的人群拟合KM fit_rehab <- survfit(Surv(time, status) ~ 1, data = df %>% filter(received_rehab == 1)) # 调整拟合结果,整合未接受康复人群的基线信息 fit_adj <- fit_rehab # 总人群生存概率 = 接受康复比例 × 接受康复人群的条件生存概率 fit_adj$surv <- c(prop_rehab, prop_rehab * fit_rehab$surv) # 添加基线时间点t=0 fit_adj$time <- c(0, fit_rehab$time) # 基线风险集为总人数,后续为接受康复的剩余人数 fit_adj$n.risk <- c(nrow(df), fit_rehab$n.risk) # 基线无事件发生(未接受康复不是事件) fit_adj$n.event <- c(0, fit_rehab$n.event) # 基线截尾数为未接受康复的人数 fit_adj$n.censor <- c(sum(df$received_rehab == 0), fit_rehab$n.censor)
4. 绘制调整后的KM曲线
用ggsurvplot绘制调整后的模型,曲线将直接从0.7开始:
ggsurvplot(fit_adj, data = df, ylab = "生存概率(含未接受康复人群)", xlab = "康复时间", legend = "none", ylim = c(0, 1)) # 可选:指定Y轴范围
5. 查看包含全人群的生存表
调整后的模型会将未接受康复人群纳入统计,用以下命令查看生存表:
summary(fit_adj)
关键说明
- 调整后的模型不再将未接受康复者视为“第0天发生事件”,而是将其作为基线时就未进入风险集的人群,更符合你的研究逻辑。
- 生存概率的计算逻辑:总人群中,只有接受康复的人才有机会经历康复结束事件,因此总生存概率是「接受康复的比例」乘以「接受康复人群的生存概率」。
内容的提问来源于stack exchange,提问作者st4co4
相关产品推荐
相关产品推荐

