提问人:George 提问时间:11/12/2023 最后编辑:IRTFMGeorge 更新时间:11/20/2023 访问量:32
如何使用 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?
问:
我有一个非常标准的生存分析设置,具有右删失功能,并以从相对 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 中的可用数据,我怎样才能让处于旅程中途的新用户获得死亡/事件前剩余时间的预期?
答: 暂无答案
评论
predict