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

使用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()的处理逻辑放大了这种差异:

  1. 方法一的时间尺度:startDay=0是每个个体的相对随访起始点,endDay是个体的随访时长,tmerge()生成的是每个个体从0到自身随访时长的区间。此时Cox模型的风险集基于个体内的相对时间轴,所有个体的时间起点统一为0,仅考虑随访时长的差异。
  2. 方法二的时间尺度: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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.18 18:24:53