使用purrr与tidymodels拟合多个生存模型遇问题求助
在低版本R/tidymodels环境下使用workflow+purrr拟合多个生存模型的解决方案
问题说明
使用tidymodels、workflow和purrr批量拟合生存模型时,线性回归任务可正常执行,但Cox比例风险模型(proportional_hazards())报出以下错误:
Error in `fit_xy()':
!Models for censored regression must use the formula interface.
经排查,问题与R及相关包版本强相关:
- 报错环境:R 4.1.2、survival 3.4-0、parsnip 1.0.1
- 可正常运行环境:R 4.2.2、parsnip 1.0.3、survival 3.3-1
因无法自行更新环境,以下提供针对低版本的替代解决方案。
复现代码
library(tidyverse) library(tidymodels) library(survival) library(censored) set.seed(1973) df <- tibble(id = seq(1:1000)) df <- df %>% mutate( survtime = floor(100*rgamma(n=1000, shape =1 , rate=1)) , fail = runif(n=1000) >0.33 , a1 = runif(n=1000) >0.1, a2 = runif(n=1000) >0.5) head(df) cox1 <- coxph(data = df, Surv(survtime, event=fail) ~a1) summary(cox1) cox2 <- coxph(data = df, Surv(survtime, event=fail) ~a2) summary(cox2) A <- c("a1", "a2") models1 <- map(A, ~workflow() %>% add_model(linear_reg()) %>% add_formula(reformulate(.x, response = 'survtime')) %>% fit(df) ) models1 # 报错代码 models2 <- map(A, ~workflow() %>% add_model(proportional_hazards()) %>% add_formula(reformulate(.x, response = 'Surv(survtime, event=fail)')) %>% fit(df) ) models3 <- map(A, ~workflow() %>% add_model(proportional_hazards()) %>% add_formula(as.formula(paste0('Surv(survtime, event=fail) ~ ', .x))) %>% fit(df) ) models3
低版本环境解决方案
低版本tidymodels在处理公式中嵌套的Surv()调用时,会误触发生存模型不支持的fit_xy()接口。解决思路是提前在数据框中生成Surv对象列,再将该列作为响应变量构建公式:
步骤1:预先生成Surv响应列
在数据框中添加包含生存信息的列:
df <- df %>% mutate(surv_response = Surv(survtime, fail))
步骤2:基于预生成列构建模型
修改批量拟合代码,用预生成的surv_response作为响应变量:
models_fixed <- map(A, ~workflow() %>% add_model(proportional_hazards()) %>% add_formula(reformulate(.x, response = "surv_response")) %>% fit(df) ) # 查看拟合结果 models_fixed
该方法绕过了低版本中公式嵌套Surv()的识别问题,确保workflow使用公式接口拟合生存模型。
内容的提问来源于stack exchange,提问作者user83008
相关产品推荐
相关产品推荐

