MLR: извлечение имен ковариат с ненулевыми коэффициентами в CoxBoost - PullRequest
0 голосов
/ 25 марта 2019

Я использую mlr для создания модели выживания с учеником cv.CoxBoost и 5-кратной перекрестной проверкой.(Да, я понимаю, что в cv.CoxBosst встроено резюме, но я добавляю еще один уровень, чтобы соответствовать другим учащимся, с которыми я сравниваю его).Мне нужно извлечь имена ковариат с ненулевыми коэффициентами из окончательной модели, как если бы вы использовали Лассо.Тем не менее, мне кажется, что я могу получить выходные данные только от отдельных прогонов 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 я понял, что неправильно понял его работу.Ответ Профессора Биндера был

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])
}
...