如何解决分层 cox 模型的生存
我有一个分层的 cox 模型,并且想要基于该模型预测某些配置文件的生存曲线。
现在,因为我正在处理一个包含大量地层的大型数据集,我只想对非常特定的地层进行预测,以节省时间和内存。
survfit.coxph
的帮助页面指出: ... 如果新数据确实包含层变量,则结果将基于原始模型的指示层,每行新数据包含一条曲线。
当我运行下面的代码时,其中 newdata 确实包含层变量,我仍然得到两个层的预测,这与帮助页面相矛盾
df <- data.frame(X1 = runif(200),X2 = sample(c("A","B"),200,replace = TRUE),Ev = sample(c(0,1),Time = rexp(200))
testfit <- coxph( Surv(Time,Ev) ~ X1 + strata(X2),df)
out <- survfit(testfit,newdata = data.frame(X1 = 0.6,X2 = "A"))
这里有什么我看不到或不明白的地方吗?
解决方法
我不确定这是 survival:::survfit.coxph
中的错误还是功能。看起来代码中的预期行为是只返回请求的层。在函数中:
-
strata(X2)
在包含newdata
的环境中进行评估,并返回结果A
。 - 然后创建完整曲线。
- 然后有一些逻辑可以将曲线
split
转化为层,但前提是result$surv
是矩阵。
在您的示例中,它不是矩阵。如果它不是错误,我找不到任何关于它的预期用途的文档。也许值得给作者/维护者留个便条。
maintainer("survival")
# [1] "Terry M Therneau <xxxxxxxx.xxxxx@xxxx.xxx>"
,
一些可能有用的评论:
-
我的例子不够大(我似乎没有很好地阅读 related github post,但那是在我在这里发布我的问题之后):如果
newdata
至少有两个线(当然还有层变量),只返回所请求层的预测 -
survfit.coxph
内部存在低效率,其中基线风险是针对原始数据集中的每个层计算的,而不仅仅是针对请求的层(参见 my contribution to the same github post)。但是,这似乎不是什么大问题(对大约有 50 万个观测值、50% 的事件和 1000 个层的数据集进行测试),只需不到一分钟 问题是在计算过程中某处的内存分配(在上面的例子中,一旦我想要对 100 个观测值进行预测——每个 1 个层——而 80 个预测的最终输出只有几 MB,事情就会崩溃)>
-
我的解决方法:
- 选择您想要预测的所有观察
- 使用
lp <- predict(...,type='lp')
获得所有这些观测值的线性预测值 - 仅在第一次观察时使用 survfit:
survfit(fit,newdata = expand_grid(newdf,strat = strata_list))
- 将生成的生存估计值存储在 data.frame 中(或不存储,这取决于您)
- 要计算其他观察的预测存活率,请使用 PH 假设(请参见下面的公式)。这只会调用一次
survfit.coxph
的开销,如果您只关注几次生存(例如 5 年和 10 年生存),则可以进一步减少计算机时间
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。