在生存分析或随访性研究中,“中位随访时间(median follow-up time)” 和 “中位生存时间(median survival time)” 是两个容易混淆但含义和计算方法截然不同的指标。
反向KM是将原本的“删失”(如尚未发生死亡、或失访、或到研究截止时仍存活的个体)视为“事件”,从而在 KM曲线上表示“达到随访终点”的累积比例。常规的KM分析是以“感兴趣的事件(如死亡)”为终点,如果终点未发生则记为“删失(censoring)”;而当我们想求“中位随访时间”时,正好需要把“是否继续存活/随访到研究结束的人”当做“事件”,这样才能得到观测随访时长的分布中位数。
因此,所谓的 “反转事件定义(Reverse KM 或 Reverse censoring)” 就是将原本在常规生存分析里作为删失(alive, lost to follow-up)的个体反转成“事件”,从而让 KM 法去估计“随访时长”的分布,从而提取出中位随访时间。
示例数据可以从百度云盘下载:TCGA_HNSC_practice.Rdata 链接: https://pan.baidu.com/s/1ICh4i9dyjtB3SuBefRxYRg 提取码: iitg
rm(list = ls())
library(stringr)
library(survival)
library(survminer)
proj <- "TCGA-HNSC"
load('TCGA_HNSC_practice.Rdata') # TCGA-HNSC数据
老演员了,其实在这里不需要进行预处理,这里的预处理跟后面的所有的分析都无关哈。
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
## 不分组
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
## 不分组
# 计算中位随访时间—使用反生存分析法
# 反转事件定义(删失变为事件)
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
注:若对内容有疑惑或者有发现明确错误的朋友,请联系后台(欢迎交流)。更多内容可关注公众号:生信方舟
- END -
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。