#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. Пожалуйста, смотрите правку выше.