我创建了一个函数,它将Cox回归模型应用于测试数据,根据协变量创建生存函数,然后根据每个测试观察的当前时间预测30天的生存概率。
以下示例使用肺部数据集并且效果很好。但是,应用于我自己的数据处理时间很繁琐。对于n = 60000,我只是在一小时后停止它,因为它不适合我打算使用该程序。
查看代码结构,有一种明显的方法可以加快速度吗?
require(dplyr, survival, pec)
cox_model <- coxph(Surv(time, status) ~ sex, data = lung)
surv_preds <- function(model, query) {
prediction <- vector(mode = "numeric", length = nrow(query))
time <- 30
for(i in 1:nrow(query)) {
prediction[i] <- predictSurvProb(model, newdata = query[i, ], times = query[i, "time"] + time)
}
prediction
}
surv_preds(cox_model, lung)
答案 0 :(得分:1)
除了问题中的包之外,另一条路线是来自by_row
的{{1}}功能。
purrrlyr
在产生相同结果时更加整洁,但是library(purrrlyr)
prediction <- lung %>%
mutate(time = time + 30) %>%
by_row(~predictSurvProb(cox_model, newdata = ., times = .$time)) %>%
.$.out %>%
unlist
的早期运行并未显示处理时间的改善。
microbenchmark
这将使我在使用的硬件上运行超过24小时的两种解决方案。 鉴于此答案似乎不再能解决您的问题,而且我不熟悉并行处理选项,我很乐意将其删除,除非有人认为这样做有价值。
答案 1 :(得分:0)
解决了!!如果有兴趣,我想发布我使用的解决方案。我设法完全消除了for循环的需要。
predictSurvProb(cox_model,
newdata = lung,
times = lung[ , "time"] + 30)[1, ]
这给了我所需的输出。关键是我从结果矩阵中索引第一行及其所有列。该代码为每个观察值使用唯一的生存函数估计值,以预测从观察值在曲线上的当前位置起30天的生存概率。
@thc给出的答案实际上最终指向正确的方向。
答案 2 :(得分:-1)
您不需要一次预测一行。你可以一次完成所有工作。 E.g:
cox_model <- coxph(Surv(time, status) ~ sex, data = lung)
surv_preds <- function(model, query) {
prediction <- vector(mode = "numeric", length = nrow(query))
time <- 30
for(i in 1:nrow(query)) {
prediction[i] <- predictSurvProb(model, newdata = query[i, ], times = query[i, "time"] + time)
}
prediction
}
surv_preds2 <- function(model, query) {
time <- 30
prediction <- predictSurvProb(model, newdata = query, times = query[, "time"] + time)
prediction
}
microbenchmark(surv_preds(cox_model, lung), surv_preds2(cox_model, lung), times=5)
结果:
Unit: milliseconds
expr min lq mean median uq max neval cld
surv_preds(cox_model, lung) 1017.5587 1031.58422 1056.7026 1062.30476 1072.33865 1099.72672 5 b
surv_preds2(cox_model, lung) 30.3567 30.78582 35.7851 31.81206 33.00534 52.96559 5 a