如何在不同时间区间计算生存分析中的HR(比例风险比)
分段Cox回归计算不同时间区间的HR值
问题背景
已通过survfit和ggsurvplot完成生存分析,但比例风险假设不成立,需要计算0-3年(1095.75天)和3年至研究结束两个时间区间内,依从组与不依从组的风险比(HR)。现有变量包括idnumber、SerialTime(随访天数)、type(分组:依从/不依从)、event1(结局:1=事件发生,0=截尾),整体分析得到的HR为0.53(95% CI:0.31-0.88),计划用survsplit函数实现分段分析但不清楚具体操作。
现有代码
# KM生存曲线拟合 KMcurve <- survfit(Surv(SerialTime, event1)~type, data = KM) # 绘制生存曲线 ggsurvplot(KMcurve, xlim=c(0, 2191.5), break.x.by = 365.25, ylab="", xlab="Days", pval= TRUE, risk.table = "nrisk_cumevents", risk.table.title="", legend.labs=c("Non-compliant", "Compliant"), legend.title="", surv.scale = "percent", palette="nejm", title="Disease Free Survival", risk.table.height=.25, censor = TRUE, conf.int = TRUE, axes.offset = TRUE) # 整体Cox回归 coxph(Surv(SerialTime, event1)~type, data = KM) %>% tbl_regression(exp = TRUE)
示例数据集
dat <- data.frame( id = 1:100, SerialTime = as.numeric(sample(95:2900, 100, replace = TRUE)), type = as.numeric(rep(1:2)), event1 = as.numeric(rep(0:1))) dput(dat)
分段Cox回归实现步骤
1. 加载必要包
确保survival和gtsummary包已安装并加载:
library(survival) library(gtsummary)
2. 拆分随访时间区间
以3年(1095.75天)为分界点,用survsplit拆分数据集:
# 定义分界点:3年=365.25*3=1095.75天 split_dat <- survsplit(Surv(SerialTime, event1) ~ ., data = KM, cut = 1095.75, episode = "time_period")
cut参数指定时间分界点(单位需与SerialTime一致,此处为天)episode参数生成新变量time_period,标记观测所属时间区间:1代表0-3年,2代表3年以后
3. 拟合分段Cox模型
通过分层交互项直接输出两个区间的HR值:
# 带分层交互项的分段Cox模型 split_cox <- coxph(Surv(tstart, tstop, event) ~ type * strata(time_period), data = split_dat) # 指数化输出HR及95%置信区间 split_cox %>% tbl_regression(exp = TRUE)
survsplit自动生成tstart(区间起始时间)、tstop(区间结束时间)、event(区间内事件发生状态)三个变量,用于构建时依Cox模型strata(time_period)按时间区间分层,交互项形式会直接输出每个区间内type对应的HR
4. 验证数据拆分结果
可查看拆分后的数据结构,确认时间区间划分正确:
# 查看前5行拆分后的数据 head(split_dat) # 统计各时间区间的样本量 table(split_dat$time_period)
注意事项
- 分界点单位必须与
SerialTime完全匹配,如需多区间划分,可在cut中添加多个值,如cut = c(1095.75, 2191.5)对应0-3年、3-6年、6年以后三个区间 - 拟合模型后,建议单独验证每个时间区间内的比例风险假设是否成立
内容的提问来源于stack exchange,提问作者EmmaM
相关产品推荐
相关产品推荐

