MLR: извлечение имен ковариат с ненулевыми коэффициентами в CoxBoost

#r #machine-learning #cox-regression #mlr

#r #машинное обучение #регрессия кокса #mlr

Вопрос:

Я использую mlr для создания модели выживания с помощью learner cv.CoxBoost и 5-кратной перекрестной проверки. (Да, я понимаю, что cv.CoxBosst имеет встроенное CV, но я добавляю еще один уровень, чтобы соответствовать другим учащимся, с которыми я его сравниваю). Мне нужно извлечь имена ковариат с ненулевыми коэффициентами из окончательной модели, как вы бы сделали, если бы использовали Lasso. Однако, похоже, я могу получать выходные данные только из отдельных запусков CoxBoost, а не из cv.CoxBoost.

Это то, что я пробовал:

 library(survival)
library(mlr)
set.seed(24601)
data(veteran)

task_id = "MAS_MEDEXAM"
surv.task <- makeSurvTask(id = task_id, data = veteran, target = c("time", "status"))

cindex.sd = setAggregation(cindex, test.sd)
surv.measures = list(cindex, cindex.sd)

cboostcv.lrn <- makeLearner(cl="surv.cv.CoxBoost", id = "CoxBoostCV", predict.type="response")

outer = makeResampleDesc("CV", iters=5, stratify=TRUE)
learners = list(cboostcv.lrn)
bmr = benchmark(learners, surv.task, outer, surv.measures, show.info = TRUE)

mods = getBMRModels(bmr, learner.ids = c('CoxBoostCV'))
mod = mods$MAS$CoxBoostCV[[1]]$learner.model
str(mod, max.level=1)
  

Что привело к следующему результату:

 List of 16
 $ time            : num [1:109] 87 123 182 97 83 100 103 164 30 10 ...
 $ status          : num [1:109] 0 0 0 0 0 0 0 1 1 1 ...
 $ stepno          : num 43
 $ penalty         : num [1:9] 918 918 918 918 918 918 918 918 918
 $ xnames          : chr [1:9] "trt" "karno" "diagtime" "age" ...
 $ n               : int 109
 $ p               : int 9
 $ event.times     : num [1:81] 1 2 3 4 7 8 10 11 12 13 ...
 $ coefficients    :Formal class 'dgCMatrix' [package "Matrix"] with 6 slots
 $ linear.predictor: num [1:44, 1:109] 0 -0.0607 -0.1171 -0.1695 -0.218 ...
 $ meanx           : num [1:9] 1.49 57.24 8.95 58.41 3.03 ...
 $ sdx             : num [1:9] 0.502 20.489 11.31 10.768 4.616 ...
 $ standardize     : logi TRUE
 $ Lambda          : num [1:44, 1:81] 0.0184 0.0184 0.0183 0.0182 0.0181 ...
 $ scoremat        : num [1:43, 1:9] 0.0404 0.0503 0.0604 0.0704 0.0802 ...
 $ logplik         : num -357
 - attr(*, "class")= chr "CoxBoost"
 - attr(*, "mlr.train.info")=List of 5
  ..- attr(*, "class")= chr "FixDataInfo"
  

Это согласуется с выводом из CoxBoost, но cv.CoxBoost должен возвращать следующее:

 mean.logplik
se.logplik
optimal.step
folds
  

Как мне извлечь эту информацию?

Редактировать:Связавшись с профессором Харальдом Биндером и изучив mlr-код для cv.CoxBoost learner, я понял, что неправильно понял его работу. Ответ профессора Биндера был

cv.CoxBoost only determines the number of boosting steps to be performed. You have to fit a model (using a CoxBoost call) afterwards, using that number of steps.

Обучающийся mlr cv.CoxBoost делает именно это — сначала вызывает cv.CoxBoost, чтобы найти оптимальное количество шагов, затем вызывает CoxBoost, используя это количество шагов.

Итак, теперь мой вопрос заключается в том, даст ли следующий код мне имена ковариат с ненулевыми коэффициентами в окончательной модели?

 mods = getBMRModels(bmr, learner.ids = c('CoxBoostCV'))
for (i in 1:5) {
    mod = mods[[task_id]]$CoxBoostCV[[i]]$learner.model
    print(mod$xnames[mod$coefficients[mod$stepno 1,] != 0])
}
  

Комментарии:

1. Почему предполагается, что он «возвращает следующее»? Вы можете увидеть стандартные настройки параметров в mlr здесь: github.com/mlr-org/mlr/blob/master/R /…

2. Спасибо @PhilippPro. Я неправильно понял работу cv.CoxBoost. Пожалуйста, смотрите правку выше.