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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.22 22:32:13