时间相关协变量通过在协变量变化时审查观察并在时间 0 或审查时将它们重新输入到队列中来输入 Cox 模型。因此,基于事件观察的前/后周期,生成具有间隔的协变量矩阵,并将非事件的多对一和事件的多对二合并。您可以在事件之后删除协变量修改。Cox 模型不处理协变量值和故障的并发变化,因此我们必须排除这种可能性。
为了模拟生存结果,您生成协变量值和切换点。然后根据基线协变量值模拟生存结果。如果第一个协变量变化时间超过失败时间,则保留失败时间并且该参与者没有协变量变化,否则审查该失败时间的观察结果,并在审查时间用新的协变量值将它们重新输入队列。模拟第二个协变量值变化(如果存在)和第二个可能的失效时间,迭代地评估它们并且仅在失效时间在协变量变化值之前结束。
说明这一点,有人可能会提供比我更有效的代码,但一种简单的方法是使用递归。我将暂时假设存在一个恒定的基线风险函数(指数生存),但根据任意基线风险函数模拟生存结果的原理已在其他地方进行了描述,我将其留给您。为简单起见,我还将假设 m 是二进制的。同样,这是你总结的基础。
sim <- function(id=1:100, t0= rep(0, 100), m0=rep(0, 100), bfail=c(0,0), rchange=1) {
tfail <- rexp(length(id), exp(bfail[1] + bfail[2]*m0))
tchange <- rexp(length(id), rchange)
tevent <- pmin(tfail, tchange)
fevent <- tfail == tevent
if (all(fevent))
return(list(cbind('start'=t0, 'stop'=t0+tevent, 'event'=fevent, 'id'=id, 'm'=m0)))
c(
list(cbind('start'=t0, 'stop'=t0+tevent, 'event'=fevent, 'id'=id, 'm'=m0)),
sim(id = id[!fevent], t0=(t0+tevent)[!fevent], m0=1-m0[!fevent], bfail, rchange)
)
}
可以运行一个示例:
set.seed(123)
times <- sim(id=1:1000, t0= rep(0, 1000), m0=rep(0, 1000), bfail=c(-1, -2), rchange=0.4)
times <- as.data.frame(do.call(rbind, times))
coxph(Surv(start, stop, event) ~ m, data=times)
给出以下输出:
> coxph(Surv(start, stop, event) ~ m, data=times)
Call:
coxph(formula = Surv(start, stop, event) ~ m, data = times)
coef exp(coef) se(coef) z p
m -1.917 0.147 0.100 -19.1 <2e-16
Likelihood ratio test=533 on 1 df, p=0
n= 2852, number of events= 1000
将 -1.917 系数与 -2 指数生存结果的对数风险比进行比较。