時間依存共変量は、共変量が変化した時点で観察を打ち切り、時間 0 または検閲時にコホートに再入力することによって、Cox モデルに入力されます。したがって、共変量行列は間隔で生成され、イベント観測の前/後期間に基づいて、イベント以外の場合は多対 1 でマージされ、イベントの場合は多対 2 でマージされます。イベント後に共変量の変更を削除できます。共変量値と失敗の同時変化は Cox モデルでは処理されないため、この可能性を排除する必要があります。
生存結果をシミュレートするために、共変量値とスイッチ ポイントを生成します。次に、ベースラインの共変量値に従って生存結果をシミュレートします。最初の共変量変化時間が失敗時間を超える場合は、失敗時間を維持し、その参加者には共変量の変化がありません。それ以外の場合は、その失敗時に観察を検閲し、打ち切り時に新しい共変量値でそれらをコホートに再入力します。2 番目の共変量値の変化 (存在する場合) と 2 番目の可能性のある失敗時間をシミュレートし、それらを繰り返し評価し、失敗時間が共変量の変化値に先行する場合にのみ終了します。
これをレイアウトすると、誰かが私よりも効率的なコードを提供するかもしれませんが、それを行う簡単な方法は再帰を使用することです。当分の間、一定のベースライン ハザード関数 (指数生存) があると仮定しますが、任意のベースライン ハザード関数に従って生存結果をシミュレートする原理は、他の場所で説明されているので、あなたに任せます。また、簡単にするために、m は 2 進数であると仮定します。繰り返しますが、これはあなたがまとめるための基礎です。
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 の対数生存結果の対数ハザード比と比較します。