使用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
相关产品推荐
相关产品推荐

