使用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
相关产品推荐
相关产品推荐

