我正在使用mlr创建带有学习者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
如何提取此信息?
编辑: 在联系Harald Binder教授并检查了cv.CoxBoost学习者的mlr代码后,我意识到我误解了它的操作。宾德教授的回应是
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])
}