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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.28 05:34:58