Тидыр :: пересечение более 2-х параметров (..1, .. 2, .. 3) - PullRequest
0 голосов
/ 15 апреля 2020
library(dplyr)
library(fpp2) # for prison dataset
library(hts) # forecasting function

# prepare group time series
prison.gts <- gts(prison/1e3, characters = c(3,1,9),
                  gnames = c("State", "Gender", "Legal",
                             "State*Gender", "State*Legal",
                             "Gender*Legal"))


result_obj <- tidyr::crossing(methods = c('bu', 'comb'), 
                              fmethods = c('arima'),
                              algorithms = c("lu", "cg", "chol", "recursive", "slm")) %>%
  mutate(forecast_result = purrr::map2(methods, fmethods, algorithms,
                                              ~forecast.gts(prison.gts,
                                                            method = ..1, 
                                                            fmethod = ..2, 
                                                            algorithms = ..3)))

Я использую tidyr :: Cross для создания возможной комбинации параметров, которые затем станут входными данными дляcast.gts ().

Поскольку у меня более 2 параметров, параметры отображаются с использованием обозначения ..x, т.е. ..1, ..2, ..3 https://purrr.tidyverse.org/reference/map2.html

Однако, похоже, что для каждой комбинации результат равен NULL.

Если бы я вызывал функцию по отдельности, это дало бы мне результаты.

forecast.gts(prison.gts, method="bu", fmethod="arima", algorithms = 'lu')

1 Ответ

1 голос
/ 15 апреля 2020

map2 принимает только 2 параметра. Для более чем 2 параметров используйте pmap:

library(dplyr)
library(fpp2) 
library(hts)

result_obj <- tidyr::crossing(
                methods = c('bu', 'comb'), 
                fmethods = c('arima'),
                algorithms = c("lu", "cg", "chol", "recursive", "slm")) %>%
   mutate(forecast_result = purrr::pmap(list(methods, fmethods, algorithms),
                                   ~forecast.gts(prison.gts,
                                                 method = ..1, 
                                                 fmethod = ..2, 
                                                 algorithms = ..3)))

Однако возвращается сообщение об ошибке

Ошибка: рекурсивный алгоритм не поддерживает объект gts.

, поэтому вам может потребоваться удалить его из вектора algorithms, и после этого он будет работать нормально.

...