使用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列生成失败。
修正方案
- 指定二项分布族:在
additive()中明确设置family = binomial(),让模型正确识别分类任务的分布类型,自动处理因子型响应变量。 - 修正数据生成逻辑:生成匹配长度的AADT数据,避免语法错误。
- 简化配方定义:直接在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
相关产品推荐
相关产品推荐

