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

如何提取survfit生存曲线所有转折点的坐标?

提取survfit生存曲线所有转折点坐标的快捷方法

好问题!其实你完全不用手动循环生成转折点——survfit对象本身就内置了所有你需要的信息,而且还有更省心的工具包可以直接整理成结构化数据。下面给你两种最实用的方法:

方法1:直接从survfit对象提取原生数据

survfit返回的对象里,$time就是所有生存曲线发生变化的时间点(也就是转折点的x轴坐标),对应的$surv就是每个时间点的生存率(y轴坐标),$n.event则是该时间点发生的事件数。如果是多分组的情况,你可以通过$strata来拆分每个分组的数据:

library(survival)
library(dplyr)
library(purrr)

# 你的示例数据
status <- c(1,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0,0,1,0,0,0,0,1,0,1,1,1,1,1,1,1,1,0,0,0,0,0,0,1,0,1,1,0,0,1,1,0,0,0,0)
classification <- c(1,1,1,2,2,2,2,2,2,2,3,3,3,3,4,4,4,4,4,4,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,6,6,6,6,6,7,7,7,7,7,8,8,8,8,8)
df <-data.frame( Sub = c(letters,LETTERS[1:24]), status= status, time= round(rnorm(50,300,100),0), class = classification )
fit <- survfit(Surv(time, status)~class, data= df)

# 拆分每个分组的转折点数据
group_names <- names(fit$strata)

turning_points <- map_dfr(group_names, function(g) {
  # 计算当前分组的索引区间
  stratum_size <- fit$strata[g]
  start_idx <- ifelse(g == group_names[1], 1, sum(fit$strata[1:(which(group_names==g)-1)]) + 1)
  end_idx <- start_idx + stratum_size - 1
  
  data.frame(
    group = g,
    time = fit$time[start_idx:end_idx],
    survival_prob = fit$surv[start_idx:end_idx],
    events_at_time = fit$n.event[start_idx:end_idx]
  )
})

# 查看结果
head(turning_points)

方法2:用broom包一键整理(最快捷)

如果你不想手动处理索引,broom包的tidy()函数可以直接把survfit对象转换成整洁的数据框,每一行就是一个转折点,包含所有关键信息:

library(broom)

# 一键生成转折点数据框
tidy_turning_points <- tidy(fit)

# 输出结果,包含time(x轴)、estimate(生存率y轴)、strata(分组)、n.event等列
print(tidy_turning_points)

这个方法不需要手动处理分组索引,tidy()会自动帮你拆分每个分组的转折点,直接就能得到可以用来绘图或分析的结构化数据,绝对是最省心的选择。

需要注意的是:fit$time里的每个时间点都是生存曲线发生变化的节点(也就是有事件发生或删失导致曲线转折的点),所以对应的fit$surv就是转折点的生存率,完全符合你需要的所有曲线变化点的坐标。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.29 08:48:45