分层 Cox 模型的生存分析 over survfit.

3

我有一个分层Cox模型,并希望基于该模型预测特定配置文件的生存曲线。

现在,由于我正在使用大型数据集和许多层,我只想为非常特定的层进行预测,以节省时间和内存。

survfit.coxph 的帮助页面指出:... 如果newdata包含分层变量,则结果将根据原始模型的指定分层包含newdata的每一行的一个曲线。

当我运行下面的代码时,其中newdata确实包含分层变量,我仍然会得到两个层的预测,这与帮助页面相矛盾。

df <- data.frame(X1 = runif(200),
             X2 = sample(c("A", "B"), 200, replace = TRUE),
             Ev = sample(c(0,1), 200, replace = TRUE),
             Time = rexp(200))

testfit <- coxph( Surv(Time, Ev) ~ X1 + strata(X2), df)

out <- survfit(testfit, newdata = data.frame(X1 = 0.6, X2 = "A"))

我是否在这里看漏或理解有误?

2个回答

1
一些可能有帮助的评论:

  • 我的示例不够大(而且我似乎没有很好地阅读相关的github帖子,但那是在我发布问题后),如果newdata至少有两行(当然还有分层变量),则仅为所请求的分层返回预测

  • survfit.coxph内部存在一种低效率,在原始数据集中为每个层计算基线风险,而不仅仅是为所请求的层计算(请参见我对同一GitHub帖子的贡献)。但是,这似乎不是一个大问题(在约五十万观察值,50%事件和1000层的数据集上进行测试,只需要不到一分钟)

  • 问题出现在计算过程中的某个内存分配位置(在上面的示例中,一旦我想要针对100个观察值进行预测 - 每个观察值都是1层 - 事情就会崩溃,而80个预测结果的最终输出仅为几MB)

  • 我的解决方法:

    • 选择您想要进行预测的所有观察值
    • 使用lp <- predict(..., type='lp')获取所有这些观察值的线性预测器
    • 仅对第一个观察进行survfit:survfit(fit, newdata = expand_grid(newdf, strat = strata_list))
    • 将结果存储在数据框中(或不存储,取决于您)
    • 要计算其他观察结果的预测生存率,请使用PH假设(请参见下面的公式)。这只会调用一次survfit.coxph的开销,并且如果您专注于仅几个时间点上的生存率(例如5年和10年),则可以进一步减少计算机时间。

enter image description here


1

我不确定这是survival:::survfit.coxph中的一个错误还是一个特性。看起来代码中预期的行为是只返回请求的分层。在该函数中:

  • strata(X2)在包含newdata和结果A的环境中进行评估并返回。
  • 然后创建完整曲线。
  • 然后有一些逻辑将曲线拆分成分层,但仅当result$surv是矩阵时才会这样做。

在您的示例中,它不是矩阵。如果这不是错误,则找不到任何关于预期使用的文档。也许值得给作者/维护者留言。

maintainer("survival")
# [1] "Terry M Therneau <xxxxxxxx.xxxxx@xxxx.xxx>"

1
同时,我在survival的github上找到了一个类似的问题,证实这是一个bug。 - Dries
感谢您在 GitHub 上的贡献! - Dries

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接