前往小程序,Get更优阅读体验!
立即前往
发布
社区首页 >专栏 >临床预测模型-中位随访和生存时间区别及R语言计算

临床预测模型-中位随访和生存时间区别及R语言计算

原创
作者头像
凑齐六个字吧
发布2025-01-19 23:36:52
发布2025-01-19 23:36:52
14500
代码可运行
举报
文章被收录于专栏:临床预测模型临床预测模型
运行总次数:0
代码可运行

在生存分析或随访性研究中,“中位随访时间(median follow-up time)” 和 “中位生存时间(median survival time)” 是两个容易混淆但含义和计算方法截然不同的指标。

一、中位随访时间
  1. 中位随访时间主要用来描述一项随访研究(如队列研究、临床试验)中,受试者整体被随访了多久。
  2. 在典型的纵向研究里,每个受试者都有一个“进入队列/试验”的起点,随后在某个时刻结束随访(可能是因为到达终点事件、主动退出、研究结束等)。
  3. “中位随访时间”就是将所有受试者的实际随访时长进行排序,取中间值(50%分位数)。
与生存分析的关系
  1. 随访时间不仅受研究设计和停止时间影响,还与受试者何时入组、是否发生终点等因素相关。
  2. 它可以粗略反映研究对于所有受试者“平均”或“中位”的观察时长,若中位随访时间不足,研究对长期结局的把握就较弱。
计算方法
  1. 直接取所有受试者的随访时长中位数,如果没有(或很少)右删失(即大多数人在研究结束前都能观察到“完整的随访时间”),可以直接把受试者的随访时长做一个排序,取中位即可。
  2. 有删失时的“反向 Kaplan-Meier(Reverse KM)” 方法(基本上都是用这个的),在临床研究中,部分受试者会在研究结束前失访或退出,导致右删失,这时单纯取中位值不够准确。可以用“反向 KM”的思路:把“失访/研究结束/死亡”这些时点当作“事件”,而“仍在随访”当作“删失”,对 “最后一次随访时间” 做 KM 分析后再找到中位数。
二、中位生存时间
  1. 中位生存时间是指从起始点(如确诊、入组、手术等)到某个终点事件(往往是死亡,但也可定义其他事件)发生所需的时间,当 50% 的受试者发生该事件时,对应的时间点即为“中位生存时间”。
  2. 在 Kaplan-Meier 生存曲线上,这通常是生存曲线下降到 50%(即生存率=0.5)时对应的时间。
与“随访时间”之区别
  1. 中位生存时间关心的是“多少时间后有一半的受试者发生了事件(如死亡)”。如果事件发生缓慢,有可能到研究结束都不到 50% 的人发生事件,那么就无法得到“中位生存时间”(曲线还没下降到 0.5)。
  2. 中位随访时间只是说“研究在时间轴上对大家观察了多久”,它并不一定跟 50% 发生事件相关;有时研究跟踪了很久,但受试者死亡率低,中位生存时间更长;也有可能研究持续时间较短,还没到达真正意义上的中位生存点。
计算方法
  1. 通常用 Kaplan-Meier 方法(KM 法)来进行生存分析,把所有受试者的生存时间(或无事件时间)作 KM 曲线,然后找出曲线下降至 0.5(50%)的时间点。
  2. 若曲线在研究结束时还没降到 0.5,则“中位生存时间”无法估计或称“尚未达到(not reached)”。
三、反向 Kaplan-Meier(Reverse KM)方法

反向KM是将原本的“删失”(如尚未发生死亡、或失访、或到研究截止时仍存活的个体)视为“事件”,从而在 KM曲线上表示“达到随访终点”的累积比例。常规的KM分析是以“感兴趣的事件(如死亡)”为终点,如果终点未发生则记为“删失(censoring)”;而当我们想求“中位随访时间”时,正好需要把“是否继续存活/随访到研究结束的人”当做“事件”,这样才能得到观测随访时长的分布中位数。

因此,所谓的 “反转事件定义(Reverse KM 或 Reverse censoring)” 就是将原本在常规生存分析里作为删失(alive, lost to follow-up)的个体反转成“事件”,从而让 KM 法去估计“随访时长”的分布,从而提取出中位随访时间。

分析步骤
1.导入

示例数据可以从百度云盘下载:TCGA_HNSC_practice.Rdata 链接: https://pan.baidu.com/s/1ICh4i9dyjtB3SuBefRxYRg 提取码: iitg

代码语言:javascript
代码运行次数:0
复制
rm(list = ls())
library(stringr)
library(survival)
library(survminer)

proj <- "TCGA-HNSC"
load('TCGA_HNSC_practice.Rdata') # TCGA-HNSC数据
2.数据预处理

老演员了,其实在这里不需要进行预处理,这里的预处理跟后面的所有的分析都无关哈。

代码语言:javascript
代码运行次数:0
复制
colnames(meta)
variables <- c("cluster", "gender", "neoadjuvant")
meta <- cbind(meta[,c(1:3)],
              meta[,c("cluster", "gender", "neoadjuvant")])

data <- meta
data <- na.omit(data)
dim(data)

# 如果是连续的代码,需要设置data
data$OS.time <- data$OS.time

# 对变量进行数值化(0,1)
data$cluster <- as.numeric(ifelse(data$cluster=="1","0","1"))
data$gender <- as.numeric(ifelse(data$gender=="FEMALE","0","1"))
data$neoadjuvant <- as.numeric(ifelse(data$neoadjuvant=="No","0","1"))

head(meta)
#                                ID OS  OS.time cluster gender neoadjuvant
# TCGA-CR-7374-01A TCGA-CR-7374-01A  0 1.000000       1 FEMALE          No
# TCGA-CV-A45V-01A TCGA-CV-A45V-01A  1 1.066667       1 FEMALE          No
# TCGA-CV-7102-01A TCGA-CV-7102-01A  1 1.866667       2 FEMALE          No
# TCGA-MT-A67D-01A TCGA-MT-A67D-01A  0 1.866667       1   MALE          No
# TCGA-P3-A6T4-01A TCGA-P3-A6T4-01A  1 2.066667       2   MALE          No
# TCGA-CV-7255-01A TCGA-CV-7255-01A  1 2.133333       2 FEMALE          No
3.中位生存时间
代码语言:javascript
代码运行次数:0
复制
## 不分组
fittotal <- survfit(Surv(OS.time, as.numeric(OS)) ~ 1, data= meta)
fittotal
# Call: survfit(formula = Surv(OS.time, as.numeric(OS)) ~ 1, data = meta)
# 
#        n events median 0.95LCL 0.95UCL
# [1,] 493    212   55.7    46.5    69.4
# 提取三年(36个月)的生存率
summary_fit <- summary(fittotal, times = 36)  # 提取 36 个月时的数据
three_year_survival <- data.frame(summary_fit$time, summary_fit$surv)
# 查看结果
print(three_year_survival)
#   summary_fit.time summary_fit.surv
# 1               36        0.5860846
print(1-three_year_survival) # 这个相减是为了计算风险累积分数
#   summary_fit.time summary_fit.surv
# 1              -35        0.4139154
4.中位随访时间
代码语言:javascript
代码运行次数:0
复制
## 不分组
# 计算中位随访时间—使用反生存分析法
# 反转事件定义(删失变为事件)
b <- meta
b$reverse_event <- 1 - as.numeric(b$OS)
# 构建反生存模型
rev_fit <- survfit(Surv(OS.time, b$reverse_event) ~ 1, data = b)
rev_fit
# Call: survfit(formula = Surv(OS.time, b$reverse_event) ~ 1, data = b)
# 
#        n events median 0.95LCL 0.95UCL
# [1,] 493    281   34.6    31.6    39.1

# 提取中位随访时间
median_follow_up <- summary(rev_fit)$table["median"]
print(median_follow_up)
# median 
#   34.6 
参考资料
  1. Survival Analysis Part I: Basic concepts and first analyses. Br J Cancer. 2003 Jul 21;89(2):232-8.
  2. 医学统计学, 孙振球。

:若对内容有疑惑或者有发现明确错误的朋友,请联系后台(欢迎交流)。更多内容可关注公众号:生信方舟

- END -

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 一、中位随访时间
    • 与生存分析的关系
    • 计算方法
  • 二、中位生存时间
    • 与“随访时间”之区别
    • 计算方法
  • 三、反向 Kaplan-Meier(Reverse KM)方法
  • 分析步骤
    • 1.导入
    • 2.数据预处理
    • 3.中位生存时间
    • 4.中位随访时间
  • 参考资料
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档