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

如何将5个survfit()图按时间段拼接为里程碑分析样式图

实现里程碑式生存曲线拼接的方法

1. 提取各survfit对象的核心数据

每个survfit()生成的对象包含时间(time)和生存概率(surv),先把这些数据提取为数据框,方便后续处理:

library(survival)

# 自定义函数提取survfit数据
get_surv_data <- function(sf_obj) {
  data.frame(time = sf_obj$time, surv = sf_obj$surv)
}

# 假设你的5个survfit对象为sf1到sf5,依次提取数据
df1 <- get_surv_data(sf1)
df2 <- get_surv_data(sf2)
df3 <- get_surv_data(sf3)
df4 <- get_surv_data(sf4)
df5 <- get_surv_data(sf5)

2. 截取并衔接各时间段的曲线片段

按照0-100、100-200、200-300、300-400、400+的区间截取数据,同时手动衔接相邻片段的端点,避免曲线断裂:

# 处理sf1:0-100天
df1_segment <- subset(df1, time <= 100)
last_sf1 <- tail(df1_segment, 1)

# 处理sf2:100-200天
df2_segment <- subset(df2, time >= 100 & time <= 200)
# 若sf2起始时间大于100,添加sf1的最后一个点作为衔接
if (nrow(df2_segment) > 0 && df2_segment$time[1] > 100) {
  df2_segment <- rbind(last_sf1, df2_segment)
}
last_sf2 <- tail(df2_segment, 1)

# 处理sf3:200-300天
df3_segment <- subset(df3, time >= 200 & time <= 300)
if (nrow(df3_segment) > 0 && df3_segment$time[1] > 200) {
  df3_segment <- rbind(last_sf2, df3_segment)
}
last_sf3 <- tail(df3_segment, 1)

# 处理sf4:300-400天
df4_segment <- subset(df4, time >= 300 & time <= 400)
if (nrow(df4_segment) > 0 && df4_segment$time[1] > 300) {
  df4_segment <- rbind(last_sf3, df4_segment)
}
last_sf4 <- tail(df4_segment, 1)

# 处理sf5:400天以上
df5_segment <- subset(df5, time >= 400)
if (nrow(df5_segment) > 0 && df5_segment$time[1] > 400) {
  df5_segment <- rbind(last_sf4, df5_segment)
}

3. 合并分段数据并去重

把所有处理好的片段合并为一个完整数据集,去除重复的时间点:

combined_df <- rbind(df1_segment, df2_segment, df3_segment, df4_segment, df5_segment)
combined_df <- combined_df[!duplicated(combined_df$time), ]

4. 绘制拼接后的生存曲线

可以选择基础绘图或ggplot2实现,以下是两种方式:

基础绘图

plot(combined_df$time, combined_df$surv, type = "s", 
     xlab = "时间(天)", ylab = "生存概率",
     main = "里程碑式生存分析曲线")
# 添加里程碑分界虚线
abline(v = c(100,200,300,400), lty = 2, col = "gray")

ggplot2绘图(更美观)

library(ggplot2)

ggplot(combined_df, aes(x = time, y = surv)) +
  geom_step(linewidth = 1) +
  geom_vline(xintercept = c(100,200,300,400), linetype = "dashed", color = "gray50") +
  labs(x = "时间(天)", y = "生存概率", title = "里程碑式生存分析曲线") +
  theme_bw()

关键注意事项

  • 确保所有survfit模型的newdata参数设置一致,保证生存概率的可比性
  • 若某段survfit数据未覆盖区间端点,必须手动添加衔接点,否则曲线会出现断裂
  • 可根据需求调整曲线颜色、样式,或添加图例标注各分段对应的模型

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.20 09:36:23