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

使用additive与tidymodels运行分类GAM模型时遇报错求助

解决additive+tidymodels二元分类GAM模型的报错问题

错误原因分析

你遇到的报错核心是因子型响应变量与底层mgcv函数的数值运算不兼容:

  • mgcv的gam.fit3函数在处理二项分类模型时,会对响应变量进行数值运算(如残差计算y - mu),但因子类型不支持这类操作,因此出现‘-’ not meaningful for factors的警告,最终触发NA/NaN/Inf的致命错误。
  • 同时原数据生成代码存在语法错误:ceiling(nrow(1000) / 2)中nrow()传入的是数值而非数据框,导致AADT列生成失败。

修正方案

  1. 指定二项分布族:在additive()中明确设置family = binomial(),让模型正确识别分类任务的分布类型,自动处理因子型响应变量。
  2. 修正数据生成逻辑:生成匹配长度的AADT数据,避免语法错误。
  3. 简化配方定义:直接在recipe中指定公式,减少冗余配置。

修正后的完整代码

library(additive)
library(tidymodels)

# 生成正确的训练数据
train_dat <- data.frame(
  collision = sample(rep(0:1, 100)), # 生成200个0/1二元样本
  AADT = sample(0:1000, size = 200, replace = TRUE)
) %>%
  mutate(collision = factor(collision, levels = c("0", "1"))) # 转为因子并指定水平

# 定义数据预处理配方
test_recipe <- train_dat |> 
  recipe(collision ~ AADT) |> 
  step_normalize(all_numeric_predictors())

# 定义分类GAM模型,指定二项分布族
test_model <- additive(
  method = "REML",
  family = binomial()
) |> 
  set_engine("mgcv") |> 
  set_mode("classification")

# 构建并拟合工作流
test_workflow <- workflow() |> 
  add_recipe(test_recipe) |> 
  add_model(test_model)

test_workflow_fit <- test_workflow |> 
  fit(data = train_dat)

# 查看拟合结果
test_workflow_fit

额外说明

  • 若不想将响应变量转为因子,也可以保持collision为数值型0/1,此时family = binomial()依然有效,模型会自动适配。
  • 确保additive和mgcv包版本兼容,当前使用的additive_1.0.1搭配mgcv的最新稳定版即可正常运行。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.14 09:27:02