R中使用tidymodels与workflows做生存分析时recipe报错及调参方案
生存分析tidymodels实现方案
报错修复
报错的核心原因是tidymodels的recipe不支持在公式内直接调用Surv()这类内联计算函数,所有参与建模的变量需要提前作为数据框列存在,或通过recipe步骤生成。
修复步骤如下:
- 提前加载依赖包,除tidymodels外需加载
survival、censored包,其中censored为tidymodels官方维护的生存分析扩展包,已支持常见生存模型的训练与调参。
library(tidymodels) library(survival) library(censored)
- 预先在训练数据中生成Surv类型的响应变量列:
set.seed(123) n <- 20 train_data <- data.frame(id=1:n, death_time = rnorm(n, mean = 5, sd = 3), death_event = sample(c(0,1), n, replace = TRUE), age = sample(18:30, n, replace=TRUE), gender = rep(LETTERS[1:2], n/2), drug = factor(sample(c("X", "Y"), n, replace = TRUE))) # 新增生存对象列 train_data$surv_obj <- Surv(time = train_data$death_time, event = train_data$death_event)
- 修正recipe定义,直接使用预先生成的生存对象作为响应变量,可按需添加预处理步骤:
data_recipe <- recipe(surv_obj ~ age + gender + drug, data = train_data) %>% # 示例预处理:将名义分类变量转为哑变量 step_dummy(all_nominal_predictors())
多模型适配与调参配置
需注意所有生存模型需指定mode为censored regression,各常见模型的配置方式如下:
决策树模型(修正后)
tree_spec <- decision_tree( cost_complexity = tune(), tree_depth = tune(), min_n = tune()) %>% set_engine("rpart") %>% # 核心:设置为生存回归模式 set_mode("censored regression") # 工作流配置与原有逻辑一致 tree_workflow <- workflow() %>% add_recipe(data_recipe) %>% add_model(tree_spec)
Cox回归模型
# 非正则化Cox回归 cox_spec <- cox_reg() %>% set_engine("survival") %>% set_mode("censored regression") # 可超参调优的正则化Cox回归 reg_cox_spec <- cox_reg( penalty = tune(), mixture = tune() ) %>% set_engine("glmnet") %>% set_mode("censored regression")
生存随机森林模型
rf_spec <- rand_forest( mtry = tune(), trees = tune(), min_n = tune() ) %>% set_engine("randomForestSRC") %>% set_mode("censored regression")
调参流程说明
调参逻辑与tidymodels通用流程完全一致:
- 构造重抽样集时可按事件变量分层,保证各折样本的事件分布一致
- 调参评估指标可使用
concordance_survival、brier_survival等生存分析专用指标 - 测试代码中n=20样本量过小,实际使用需提升样本量保证结果稳定性
内容的提问来源于stack exchange,提问作者RCchelsie
相关产品推荐
相关产品推荐

