我一直在try 使用一些tidyModels工具进行10倍交叉验证, 虽然一切看起来都很正常,但我在使用增强功能扩展模型时遇到了麻烦.该错误似乎与按rSample::analysis()拆分数据集有关,并且该扩展不适用于类:Function的对象.

我可以看到预测是存在的,例如,cv_Models[[3]][[1]]$fit,并且折叠也存在,例如,Split_Folds$Splits[[1]]%>%analysis(), 但增强失败了.

如有任何线索,我们将不胜感激!

library(tidymodels); library(nlme); library(broom.mixed)
#> Warning: package 'scales' was built under R version 4.3.1
#> Warning: package 'dplyr' was built under R version 4.3.1
#> Warning: package 'ggplot2' was built under R version 4.3.1
#> Warning: package 'modeldata' was built under R version 4.3.1
#> Warning: package 'recipes' was built under R version 4.3.1
#> Warning: package 'yardstick' was built under R version 4.3.1
#> 
#> Attaching package: 'nlme'
#> The following object is masked from 'package:dplyr':
#> 
#>     collapse

data <-  
  tibble(
    co2_mean_tot = rlnorm(n = 100, meanlog = 0, sdlog = 1),
    WALA = rlnorm(n = 100, meanlog = 0, sdlog = 1),
         precip_av = rnorm(n = 100, mean = 400, sd = co2_mean_tot),
         soil_c_kgC = rnorm(n = 100, mean = 40, sd = 5),
         area = rlnorm(n = 100, meanlog = 0, sdlog = 1),
         long = seq(100,180, length.out = 100))


split_folds <- vfold_cv(data, strata = long, v = 10)

fit_gls_cv <- 
  function(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 = rsample::analysis(split), method = "REML")
  }

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))
#> Error in `mutate()`:
#> ℹ In argument: `aug = map(model, augment)`.
#> Caused by error in `map()`:
#> ℹ In index: 1.
#> Caused by error in `rsample::analysis()`:
#> ! No method for objects of class: function
#> Backtrace:
#>      ▆
#>   1. ├─cv_models %>% mutate(aug = map(model, augment))
#>   2. ├─dplyr::mutate(., aug = map(model, augment))
#>   3. ├─dplyr:::mutate.data.frame(., aug = map(model, augment))
#>   4. │ └─dplyr:::mutate_cols(.data, dplyr_quosures(...), by)
#>   5. │   ├─base::withCallingHandlers(...)
#>   6. │   └─dplyr:::mutate_col(dots[[i]], data, mask, new_columns)
#>   7. │     └─mask$eval_all_mutate(quo)
#>   8. │       └─dplyr (local) eval()
#>   9. └─purrr::map(model, augment)
#>  10.   └─purrr:::map_("list", .x, .f, ..., .progress = .progress)
#>  11.     ├─purrr:::with_indexed_errors(...)
#>  12.     │ └─base::withCallingHandlers(...)
#>  13.     ├─purrr:::call_with_cleanup(...)
#>  14.     ├─generics (local) .f(.x[[i]], ...)
#>  15.     └─broom.mixed:::augment.gls(.x[[i]], ...)
#>  16.       ├─broom::augment_columns(x, data, newdata, se.fit = NULL)
#>  17.       ├─nlme::getData(x)
#>  18.       └─nlme:::getData.gls(x)
#>  19.         ├─base::eval(if ("data" %in% names(object)) object$data else mCall$data)
#>  20.         │ └─base::eval(if ("data" %in% names(object)) object$data else mCall$data)
#>  21.         ├─rsample::analysis(split)
#>  22.         └─rsample:::analysis.default(split)
#>  23.           └─cli::cli_abort("No method for objects of class{?es}: {cls}")
#>  24.             └─rlang::abort(...)
Created on 2024-01-28 with reprex v2.0.2

推荐答案

这里是broom.mixed:::augment.gls:

function (x, data = nlme::getData(x), newdata, ...)  {
    if (missing(newdata)) {
        newdata <- NULL
    }
    ret <- augment_columns(x, data, newdata, se.fit = NULL)
    ret
}

nlme::getData()try 获取数据时就会出现问题,它试图通过判断模型的$call个组件中的$data个组件(即rsample::analysis(split))来完成此操作.

这似乎是有效的,虽然我没有仔细判断:

cv_models %>% 
   mutate(aug = map2(model, splits, ~augment(.x, newdata = .y$data)))

R相关问答推荐

以R表示的gglikert地块调整总数

如果行和列名以相同的开头,将矩阵值设置为0

过滤矩阵以获得R中的唯一组合

具有多个依赖变量/LHS的逻辑模型

根据列表中项目的名称多次合并数据框和列表

如何利用模型函数在格图中添加双曲/指数曲线

使用Facet_WRAP时更改框图中线的 colored颜色

通过在colname中查找其相应值来创建列

使用R中的正则表达式将一列分割为多列

从服务器在Shiny中一起渲染图标和文本

TreeNode打印 twig 并为其上色

为什么在BASE R中绘制线条时会看到线上的点?

按组计算列中1出现的间隔年数

在gggraph中显示来自不同数据帧的单个值

观察器中的inaliateLater的位置

通过初始的shiny 应用更新部署的shiny 应用的数据和参数,其中部署的应用程序显示为URL

在使用SliderInput In Shiny(R)设置输入数据的子集时,保留一些情节痕迹

如何更改包中函数中的参数?

条形图中的条形图没有try 赋予它们的 colored颜色

分隔日期格式为2020年7月1日