如何使用 R 中 Cox 比例风险模型的输出(具有时间分量协变量)进行用户级预测?

How do I use the outputs from a Cox Proportional Hazard model in R (with time-depedent covariates) to make user-level forecasts?

提问人:George 提问时间:11/12/2023 最后编辑:IRTFMGeorge 更新时间:11/20/2023 访问量:32

问:

我有一个非常标准的生存分析设置,具有右删失功能,并以从相对 t=0 时间测量的固定时间间隔跟踪用户。

我有两个静态协变量 X1 和 X2,但在每个间隔测量一个瞬态协变量 X3,又名间隔删失数据。

以下是 6 个人的一些长格式虚拟数据,其中 X3 特征被分成多列,每个周期一列。

library(survival)
library(MASS)
library(data.table)

dt.wide <-
  data.table("id" = c(1, 2, 3, 4, 5, 6),
             "time" = c(5, 4, 3, 9, 1, 8),
             "status" = c(1, 1, 1, 0, 0, 1),
             "X1" = c(52, 59, 54, 60, 39, 26),
             "X2" = c(1, 1, 1, 0, 0, 1),
             "X3.1" = c(21, 17, 17, 23, 26, 19),
             "X3.2" = c(18, 13, 15, 19, NA, 14),
             "X3.3" = c(16, 22, 17, 17, NA, 20),
             "X3.4" = c(19, 13, NA, 20, NA, 15),
             "X3.5" = c(25, NA, NA, 19, NA, 20),
             "X3.6" = c(NA, NA, NA, 19, NA, 20),
             "X3.7" = c(NA, NA, NA, 16, NA, 22),
             "X3.8" = c(NA, NA, NA, 13, NA, 20),
             "X3.9" = c(NA, NA, NA, 23, NA, NA))

基于本文,第 4 节详细介绍了如何处理此类数据并纳入时间依赖性,实质上将其从每个用户一行的右删失更改为每个用户多行和间隔删失。

现在,长格式的新数据是:

dt.long <-
  data.table("id"    = c(1, 1, 1, 1, 1, 2, 2, 2, 2, 3, 3, 3, 4, 4, 4, 4, 4, 4,
                         4, 4, 4, 5, 6, 6, 6, 6, 6, 6, 6, 6),
             "start" = c(0, 1, 2, 3, 4, 0, 1, 2, 3, 0, 1, 2, 0, 1, 2, 3, 4, 5,
                         6, 7, 8, 0, 0, 1, 2, 3, 4, 5, 6, 7),
             "stop"  = c(1, 2, 3, 4, 5, 1, 2, 3, 4, 1, 2, 3, 1, 2, 3, 4, 5, 6,
                         7, 8, 9, 1, 1, 2, 3, 4, 5, 6, 7, 8),
             "event" = c(0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0,
                         0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1),
             "X1"    = c(52, 52, 52, 52, 52, 59, 59, 59, 59, 54, 54, 54, 60,
                         60, 60, 60, 60, 60, 60, 60, 60, 39, 26, 26, 26, 26,
                         26, 26, 26, 26),
             "X2"    = c(1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0,
                         0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1),
             "X3"    = c(21, 18, 16, 19, 25, 17, 13, 22, 13, 17, 15, 17, 23,
                         19, 17, 20, 19, 19, 16, 13, 23, 26, 19, 14, 20, 15,
                         20, 20, 22, 20))

现在运行 Cox 比例风险模型:

cph.model <- coxph(Surv(start, stop, event) ~ X1 + X2 + X3, data = dt.long)

我现在的问题是如何获得新用户的预测。 例如,假设新数据适用于当前处于区间 6-7 的以下用户:

nd <- data.table("id"    = 7,
                 "start" = 6,
                 "stop"  = 7,
                 "X1"    = 30,
                 "X2"    = 1,
                 "X3"    = 20)

我想知道他们在接下来的时期中幸存下来的概率,并最终计算出他们未来死亡/事件发生之前的预期时期数(预期寿命是从那时起生存曲线的 AOC)。

可以通过以下方式获得预测:

sf <- survfit(cph.model, newdata = nd)
times <- sf[["time"]]
prob.mat <- t(sf[["surv"]])

这个新用户的 prob.mat 输出为:

    [,1] [,2]    [,3]    [,4]    [,5]    [,6]    [,7]    [,8]    [,9]
[1,]   1    1 0.84815 0.69705 0.53001 0.53001 0.53001 0.27879 0.27879

当我修改 中的 和 值时,这些值不会改变,使我相信模型忽略了我知道该用户一直到第 6-7 期的事实。我可以通过对 prob.mat 中的绝对生存曲线进行归一化来归一化相对值:"start""stop"nd

S(存活 7-8 | 存活 6-7) = S(存活 7-8) / S(存活 6-7)

但更大的问题是,该模型忽略了一个事实,即 X3 值 20 是周期 6-7,而不是 X1 或 X2 等静态值。

换言之,输入以下数据:

nd <- data.table("id"    = 7,
                 "start" = 3,
                 "stop"  = 4,
                 "X1"    = 30,
                 "X2"    = 1,
                 "X3"    = 20)

应该产生不同的 prob.mat,因为 X3=20 的值现在适用于 3-4 周期,但返回相同的 prob.mat。

回到最初的问题:根据 1dt.wide1 或 1dt.long1 中的可用数据,我怎样才能让处于旅程中途的新用户获得死亡/事件前剩余时间的预期?

R 区间 生存分析 Cox-回归

评论

0赞 IRTFM 11/20/2023
生存包之所以不会为你提供一种新的间隔审查数据实例的方法,是因为生存包的作者,可以说是此类问题的世界领先权威,认为不应该这样做。我所读到的关于他的推理的总结:如果协变量的历史很重要,那么估计将只适用于具有相同历史的人。(我认为这可能是一个重复的问题。predict
0赞 IRTFM 11/20/2023
我寻找副本的努力失败了。也许我在想 R-help 邮件列表中的线程,或者这可能是我评论过的东西,而 SO 的搜索功能没有查看评论?我确实找到了自己的答案,回答了一个关于在右翼审查情况下的预测的问题,引用的论文似乎没有涵盖这个问题。
0赞 IRTFM 11/20/2023
更进一步的想法。您能否通过采用预测变量协变量值并将其乘以它对每个人起作用的时间单位数来计算总暴露量,然后使用它而不是瞬态模型?这似乎与长期暴露于环境因素的建模方式一致。例如,吸烟被建模为包年。如果存在某种阈值效应,您可能会在短时间内丢失有关高剂量率的信息。

答: 暂无答案