使用tidymodels、recipe与bayesian时step_dummy()处理分类变量报错
解决bayesian模型拟合时的"Species找不到"错误
错误原因
你的问题出在工作流(workflow)的公式与预处理流程(recipe)冲突:
- 在
rec_obj中,你通过step_dummy(Species)把分类变量Species转换成了哑变量(比如生成Species_setosa、Species_versicolor这类新列),预处理后的数据集里已经没有原始的Species变量。 - 但你在
add_model中又指定了公式Sepal.Length ~ Species,模型拟合时会去预处理后的数据集查找Species,自然会触发"找不到变量"的错误。
解决方案(推荐方案)
让workflow自动使用recipe中定义的变量关系,无需手动指定模型公式,这样能避免变量名不匹配的问题:
# 加载依赖包 library(tidyverse) library(ggplot2) library(recipes) library(bayesian) library(workflows) # 创建预处理流程 rec_obj <- recipe(Sepal.Length ~ ., data = iris %>% select(-Sepal.Width, -Petal.Length, -Petal.Width)) %>% step_dummy(Species) %>% # 将分类变量转为哑变量 step_log(Sepal.Length, base = 10) # 对因变量做对数转换 # 创建贝叶斯模型对象 model_obj <- bayesian( family = gaussian(), ) |> set_engine("brms") |> set_mode("regression") # 创建工作流 - 移除add_model中的formula参数 workflow_obj <- workflow() %>% add_recipe(rec_obj) %>% add_model(spec = model_obj) # 拟合模型 model_fit <- workflow_obj %>% fit(data = iris)
备选方案(不推荐)
如果你一定要手动指定公式,需要匹配预处理后的哑变量名称(灵活性差,仅作参考):
# 修改add_model中的公式为哑变量形式 workflow_obj <- workflow() %>% add_recipe(rec_obj) %>% add_model( spec = model_obj, formula = Sepal.Length ~ Species_versicolor + Species_virginica # step_dummy默认将第一个类别(setosa)作为基准,仅需传入另外两个哑变量 )
内容的提问来源于stack exchange,提问作者leorar
相关产品推荐
相关产品推荐

