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

使用tidymodels交叉验证时broom.mixed::augment函数报错求助

解决tidymodels交叉验证中broom.mixed::augment调用报错问题

问题根源

报错的核心原因是:使用gls()拟合模型时,直接将rsample::analysis(split)传入data参数,模型会保存这个表达式而非实际的数据集。当后续调用augment()时,nlme::getData()会尝试重新解析该表达式,但此时split变量的上下文已丢失,导致rsample::analysis()无法识别对象类型,抛出No method for objects of class: function错误。

解决方案

方案一:拟合前提前提取分析数据集

修改拟合函数,先将rsample::analysis(split)的结果赋值给局部变量,再传入模型的data参数,让模型保存实际的数据框而非表达式:

fit_gls_cv <- 
  function(split) {
    # 提前提取分析数据集并赋值给局部变量
    analysis_data <- rsample::analysis(split)
    gls(log10(co2_mean_tot) ~  scale(log10(WALA))*scale(precip_av)*scale(soil_c_kgC) + scale(log10(area)),
        weights = varExp(form = ~ precip_av), 
        data = analysis_data, method = "REML")
  }

# 重新执行拟合与augment调用
cv_models <- 
  split_folds %>% 
  mutate(model = map(splits, fit_gls_cv),
         coef_info = map(model, tidy),
         gl_info = map(model, glance),
         pred = map(model, predict)) 

cv_models %>% 
  mutate(aug = map(model, augment))

方案二:调用augment时手动指定数据集

如果不想修改原有拟合逻辑,可在调用augment()时,手动传入对应折的分析数据集,通过map2()关联模型和对应的splits对象:

cv_models %>% 
  mutate(aug = map2(model, splits, function(mod, spl) {
    augment(mod, data = rsample::analysis(spl))
  }))

方案对比

  • 方案一从根源解决问题,模型自带数据集,后续调用augment()、residuals()等函数无需额外传参,但会增加模型对象的体积。
  • 方案二更灵活,适合保留原有拟合流程的场景,需要手动关联模型与对应数据集。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.01 07:08:10