mlr3: получение ответа (прогнозируемое время выживания) от Surv.gbm

Surv.gbm в структуре mlr3 выводит линейные предикторы, однако меня действительно интересует прогнозируемое время выживания на случай, которое я хочу сравнить с фактическим временем выживания. Есть ли способ узнать фактическое время выживания?

В книге mlr3 есть пример преобразования между линейными предикторами и распределением.

pod = po("distrcompose", param_vals = list(form = "ph", overwrite = FALSE))
prediction = pod$predict(list(base = prediction_distr, pred = prediction_lp))$output

Есть ли способ изменить этот конвейер так, чтобы он преобразовывал lp в ответ?

Любая помощь будет принята.


person pmakai    schedule 01.10.2020    source источник


Ответы (1)


Да, это определенно возможно, просто требуется еще одна трансформация. Правильный первый шаг - составить распределение на основе линейного предиктора; поскольку вы используете surv.gbm, в качестве базовой модели возможен только Cox PH, поэтому для этого работает distrcompose по умолчанию.

Теперь вам нужно использовать crankcompose, чтобы создать прогноз времени выживания из распределения, вы можете использовать среднее значение, медианное значение или режим распределения, люди обычно выбирают среднее значение или медианное значение, но это ваш выбор! Только не забудьте включить response = TRUE, overwrite = FALSE. Пример кода ниже включает создание прогнозов и оценку с помощью RMSE (на удивление неплохо!). Думаю, книгу нужно обновить ...

Спасибо, Рафаэль

library(mlr3extralearners)
library(mlr3proba)
library(mlr3pipelines)
library(mlr3)

learn =  ppl("crankcompositor", ppl("distrcompositor", lrn("surv.gbm")),
             response = TRUE, overwrite = FALSE, method = "mean",
             graph_learner = TRUE)
set.seed(1)
task = tgen("simsurv")$generate(50)
learn$train(task)
p = learn$predict(task)
p$score(msr("surv.rmse"))
person RaphaelS    schedule 01.10.2020
comment
Спасибо за ответ, работает! Если вы планируете обновить книгу, я думаю, что наиболее полезным подходом для новичков к этой структуре было бы включение примера полного рабочего процесса, от задачи до визуализации и прогнозирования нового набора данных. - person pmakai; 01.10.2020
comment
Спасибо за ответ! Я думаю, что глава о выживании предполагает, что люди прочитают хотя бы вступительную главу. Также есть примеры от задачи до прогнозирования / визуализации. Я рад добавить подробности там, где это необходимо, но не уверен, какие части, по вашему мнению, нуждаются в дополнительных примерах? - person RaphaelS; 02.10.2020
comment
Большая часть того, что я предлагаю, уже рассмотрена в этой главе, это примерно 70% всего рабочего процесса. Завершить его можно было бы каким-то способом сделать графики, подобные самому последнему сюжету в этом блоге: rviews.rstudio.com/2017/09/25/survival-analysis-with-r. На данный момент автоплот, похоже, не работает с прогнозами выживания, и вы в любом случае ожидаете чего-то немного другого, чем общий результат. Я нахожу результаты убедительными только тогда, когда моя прогнозируемая кривая выживаемости близка к фактическим данным (кривая КМ). Но это превращается в запрос функции. :-) - person pmakai; 04.10.2020
comment
Ах, отличный момент, у нас есть функции построения графиков как кривых ошибок прогнозирования, так и смоделированных прогнозов, я также хочу добавить графики калибровки. Не стесняйтесь голосовать за эти проблемы, чтобы я не забыл о них: github.com / mlr-org / mlr3proba / issues / 155 github.com/mlr- org / mlr3proba / issues / 156 - person RaphaelS; 04.10.2020
comment
Последний вопрос: есть ли внутренний метод для получения прогнозируемого состояния события (ИСТИНА / ЛОЖЬ)? Если я правильно понимаю, вам понадобится значение отсечки для кривошипа. Я могу сгенерировать отсечение вручную, но оно должно соответствовать ci. Так что, если это уже реализовано, было бы здорово. - person pmakai; 05.10.2020
comment
Нет, это будет сокращение до двоичной классификации, которая в настоящее время не реализована, но она также находится в списке, способ, которым это будет работать, будет заключаться в добавлении другого конвейера с заданным порогом, который преобразует 'response' или 'distr' в двоичный прогнозы на все времена или пороговое значение «кривошипа». Но я бы был осторожен с ручкой порога, поскольку это по своей сути бессмысленная величина ... Поскольку вы уже сгенерировали время событий, имеет больше смысла просто делать это по всем временным точкам - person RaphaelS; 06.10.2020