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

如何将SurvSplit拆分后的生存数据重组为单一生存曲线并预测

解决SurvSplit拆分后Cox模型的单一生存曲线绘制问题

核心问题根源

SurvSplit将每个个体拆分为多个时间区间的记录,直接调用survfit()会生成每个区间的分段曲线,而非完整的单一生存曲线。要得到可解释的组间对比曲线,需要将各区间的条件生存概率累乘,得到从基线开始的边际生存概率。

具体解决方案步骤

1. 拟合拆分后的Cox模型

基于SurvSplit处理后的数据集拟合满足比例风险假设的Cox模型:

library(survival)

# 模拟示例原数据
set.seed(123)
n <- 200
dat <- data.frame(
  time = rexp(n, 0.1),
  event = rbinom(n, 1, 0.7),
  trt = rbinom(n, 1, 0.5),
  age = rnorm(n, 60, 10)
)

# 按事件时间的三分位数拆分时间为3段
split_times <- quantile(dat$time[dat$event == 1], c(1/3, 2/3))
dat_split <- survSplit(Surv(time, event) ~ trt + age, data = dat, 
                       cut = split_times, start = "start", end = "stop")

# 拟合Cox模型
cox_mod <- coxph(Surv(start, stop, event) ~ trt + age, data = dat_split)

2. 创建标准化预测数据集

生成仅分组变量不同、其他协变量取典型值(如均值)的对比数据集:

# 对照组(trt=0)和治疗组(trt=1),age取原数据均值
new_dat <- data.frame(
  trt = c(0, 1),
  age = rep(mean(dat$age), 2)
)

3. 对新数据执行一致的时间拆分

必须使用和原数据完全相同的分割点拆分新数据,确保模型能匹配对应时间区间的风险函数:

# 拆分新数据,无结局事件故event设为0
new_dat_split <- survSplit(Surv(time, event) ~ trt + age, data = new_dat, 
                           cut = split_times, start = "start", end = "stop",
                           event = rep(0, nrow(new_dat)))

4. 计算分段生存概率并拼接完整曲线

提取各区间的条件生存概率,累乘得到从基线开始的完整生存曲线:

# 基于模型和拆分后的新数据计算生存概率
sf <- survfit(cox_mod, newdata = new_dat_split)

# 整理生存概率、时间点和分组信息
sf_df <- data.frame(
  time = sf$time,
  surv = sf$surv,
  trt = rep(c(0,1), each = length(split_times)+1)
)

# 对每个组累乘生存概率,得到完整曲线
library(dplyr)
full_surv <- sf_df %>%
  group_by(trt) %>%
  mutate(full_surv = cumprod(surv)) %>%
  ungroup()

# 添加起始点(time=0时生存概率为1)
start_points <- data.frame(time = 0, surv = 1, trt = c(0,1), full_surv = 1)
full_surv <- bind_rows(start_points, full_surv)

5. 绘制组间对比的单一生存曲线

现在可以绘制每个组的完整生存曲线,实现清晰的组间对比:

library(ggplot2)
ggplot(full_surv, aes(x = time, y = full_surv, color = factor(trt))) +
  geom_line(linewidth = 1) +
  labs(x = "时间", y = "生存概率", color = "分组") +
  scale_color_manual(labels = c("对照组", "治疗组"), values = c("blue", "red")) +
  theme_bw()

关键说明

  • 时间拆分一致性:新数据必须与原数据使用相同的分割点,否则模型无法正确匹配各时间段的风险参数。
  • 生存概率累乘:SurvSplit后的Cox模型输出的是区间内的条件生存概率,累乘后才能得到从基线开始的边际生存概率,也就是我们需要的单一生存曲线。
  • 新数据事件设置:新数据无结局事件,设置event=0不影响预测,模型仅关注协变量对风险的影响。

内容的提问来源于stack exchange,提问作者TheCodeNovice

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.14 14:28:27