You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.06 03:05:29