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

使用tidymodels censored功能构建多状态生存模型的id参数报错问题

解决多状态生存模型的id参数问题

问题原因

你遇到的错误是因为多状态Cox模型需要用id参数识别个体记录,底层coxph()强制要求该参数,但你当前的tidymodels代码没有把id传递给底层函数,且recipe里写的id=id是无效参数,起不到作用。

修正步骤

1. 确保数据保留id变量

你的mod_df代码里用了.keep="unused",其实已经保留了id列(duration和outcome被用来生成sale_surv会被移除,id和sex会保留),这部分无需修改。

2. 移除recipe里的无效参数

把错误的recipe写法:

mod_rec <- recipe(sale_surv ~ sex, data = mod_train, id = id)

改成:

mod_rec <- recipe(sale_surv ~ sex, data = mod_train)

recipe()函数没有id这个参数,之前的写法完全无效。

3. 在模型引擎中传递id参数

通过set_engine()的args参数,把id变量传递给底层的coxph():

mod_spec <- proportional_hazards() %>%
  set_mode("censored regression") %>%
  set_engine("survival", args = list(id = id))

完整修正代码

library(tidyverse)
library(tidymodels)
library(censored)

df <- tibble(
  id = seq(1:1000),
  sex = sample(c("Male","Female"), 1000, replace = T),
  duration = rnorm(1000, mean = 75, sd = 7),
  outcome = sample(c("censor","Lost","Won"), 1000, replace = T)
) %>%
  mutate(
    outcome = factor(outcome)
  )

mod_df <- df %>%
  mutate(
    sale_surv = Surv(duration, outcome),
    .keep = "unused"
  )

set.seed(1988)
mod_split <- initial_split(mod_df)
mod_train <- training(mod_split)
mod_test <- testing(mod_split)

# 修正:移除无效的id参数
mod_rec <- recipe(sale_surv ~ sex, data = mod_train) 

# 修正:通过args传递id给coxph
mod_spec <- proportional_hazards() %>%
  set_mode("censored regression") %>%
  set_engine("survival", args = list(id = id)) 

mod_wflow <- workflow() %>%
  add_recipe(mod_rec) %>%
  add_model(mod_spec)

mod_fit <- fit(mod_wflow, data = mod_train)

额外说明

如果你的数据里同一个id有多条转移记录(比如个体从某一状态转到另一状态的多条记录),这个方法同样适用,只要确保id列能正确识别同一个体即可。

内容的提问来源于stack exchange,提问作者Sobo

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.16 11:45:06