Мне интересно, как я могу сделать эту "аккуратную модель" кода "чище".
Обычно я подбираю модель и делаю прогнозы в одной функции-оболочке, но иногда я хочу передать обратно другие части данных из подгонки или прогнозирования (сама модель, метаданные или подогнанные значения и т. Д.). Это список, который возвращается. Какой самый удобный способ передать этот результат обратно в виде дополнительных столбцов, по одному на элемент в списке (здесь это yhat_fit
и yhat
), с помощью конвейера
library(tidymodels)
y_s <- vfold_cv(mtcars, 5)
fit_model <- function(x) {
model <- lm(mpg ~ hp, data = analysis(x))
yhat <- predict(model, assessment(x))
list(yhat_fit = model$fitted.values, yhat = yhat)
}
# this is a problem:
out <- y_s %>% mutate(model = map(y_s$splits, fit_model))
# # A tibble: 5 x 3
# splits id model
# * <list> <chr> <list>
# 1 <split [25/7]> Fold1 <list [2]>
# 2 <split [25/7]> Fold2 <list [2]>
# 3 <split [26/6]> Fold3 <list [2]>
# 4 <split [26/6]> Fold4 <list [2]>
# 5 <split [26/6]> Fold5 <list [2]>
Это решение, но я не уверен, есть ли уже существующая функция, которая уже делает это более чистым способом?
y_s2 <- bind_cols(y_s, as_tibble(transpose(out$model)))
# A tibble: 5 x 4
# splits id yhat_fit yhat
# <list> <chr> <list> <list>
# 1 <split [25/7]> Fold1 <dbl [25]> <dbl [7]>
# 2 <split [25/7]> Fold2 <dbl [25]> <dbl [7]>
# 3 <split [26/6]> Fold3 <dbl [26]> <dbl [6]>
# 4 <split [26/6]> Fold4 <dbl [26]> <dbl [6]>
# 5 <split [26/6]> Fold5 <dbl [26]> <dbl [6]>