使用tmerge()+coxph()时两种时间表达方式为何结果不一致?
问题:tmerge处理不同时间格式后Cox回归结果不一致
在R语言中使用tmerge()构建时变协变量的Cox回归数据集时,理论上两种时间表达方法应得到相同回归结果,但实际却不一致:
- 方法一:直接使用事件/截尾的数值天数(个体内相对时间)
- 方法二:使用日期类型的起止时间,在
Surv()中转为数值(全局绝对时间)
验证过程
数据生成
生成包含ID、结局death、起止日期(Date类型)的数据集:
n <- 1000 set.seed(0) dd <- data.frame(id=1:n, death=sample(x=c(FALSE, TRUE), prob=c(8, 1), size=n, replace=TRUE), startDate=as.Date(runif(min=as.numeric(as.Date("2000-01-01")), max=as.numeric(as.Date("2019-12-31")), n=n), origin="1970-01-01")) dd$endDate <- as.Date(as.numeric(dd$startDate) + rnorm(mean=3650, sd=500, n=n), origin="1970-01-01") # (可验证endDate始终晚于startDate)
转换为数值天数格式(个体内相对时间):
dd$startDay <- 0 dd$endDay <- as.numeric(dd$endDate - dd$startDate)
两种tmerge()处理
基于数值天数(相对时间)
ddTv <- tmerge(data1=dd, data2=dd, id=id, tstart=startDay, tstop=endDay, event=event(endDay, death)) ddTv[1:6, ]
基于日期类型(绝对时间)
ddTvDate <- tmerge(data1=dd, data2=dd, id=id, tstart=startDate, tstop=endDate, event=event(endDate, death)) ddTvDate[1:6, ]
Cox回归拟合结果
基于数值天数的空模型
ddMod <- coxph(formula= Surv(time=tstart, time2=tstop, event=death) ~ 1, data=ddTv) ddMod
输出对数似然值为-702.08
基于日期类型的空模型
ddModDate <- coxph(formula= Surv(time=as.numeric(tstart), time2=as.numeric(tstop), event=death) ~ 1, data=ddTvDate) ddModDate
输出对数似然值为-681.85
两种方式结果存在差异,添加协变量后系数与p值也不一致。但不使用tmerge()直接拟合时,两种时间表达方法结果一致。
原因分析
核心差异在于时间尺度的定义不同,而tmerge()的处理逻辑放大了这种差异:
- 方法一的时间尺度:
startDay=0是每个个体的相对随访起始点,endDay是个体的随访时长,tmerge()生成的是每个个体从0到自身随访时长的区间。此时Cox模型的风险集基于个体内的相对时间轴,所有个体的时间起点统一为0,仅考虑随访时长的差异。 - 方法二的时间尺度:
startDate和endDate是全局绝对日期,tmerge()生成的是每个个体在绝对时间轴上的区间。当你在Surv()中转为数值时,得到的是从1970-01-01开始的天数,此时Cox模型的风险集基于全局绝对时间轴,个体之间的进入时间差异被保留,早进入研究的个体的风险集构成和晚进入的完全不同,最终导致回归结果不同。
而不使用tmerge()直接拟合时,你实际上是将日期转换为个体内的相对时间(如as.numeric(endDate - startDate)),和方法一的时间尺度一致,因此结果相同。
修正方法
若要使用日期类型数据通过tmerge()生成一致结果,需先将日期转换为个体内相对时间再传入tmerge(),示例代码:
ddTvDateCorrected <- tmerge(data1=dd, data2=dd, id=id, tstart=0, tstop=as.numeric(endDate - startDate), event=event(as.numeric(endDate - startDate), death)) # 拟合修正后的模型 ddModDateCorrected <- coxph(formula= Surv(time=tstart, time2=tstop, event=death) ~ 1, data=ddTvDateCorrected) ddModDateCorrected
此时拟合结果将与方法一完全一致。
内容的提问来源于stack exchange,提问作者eac2222
相关产品推荐
相关产品推荐

