Multisession (future) and fable

86 Views Asked by At

I'm trying to use the ARIMA function from the fable package. I'd like to test, using cross validation, every specification, given by the pdqPDQ data.frame rows, using a multisession plan from the future package. I will then make forecasts and later calculate accuracy measures.

ARIMA function cannot see the pdqPDQ object. I'm aware of the future missing globals issues, and maybe that's the case here (?).

Any ideas for how I could solve this?

library(GetBCBData)
library(lubridate)
library(tsibble)
library(fable)
library(tidyr)
library(future)
library(dplyr)

#============================================================#
#Data ----
#============================================================#

ipca <- gbcbd_get_series(c(433, 4449, 10844, 11428, 27863, 27864), first.date = "01/01/2004")

ipca <- 
  ipca %>%
  mutate(series.name = 
           case_when(id.num == 433 ~ "ipca",
                     id.num == 4449 ~ "administrados",
                     id.num == 10844 ~ "serviços",
                     id.num == 11428 ~ "livres",
                     id.num == 27863 ~ "industriais",
                     id.num == 27864 ~ "alimentos",
                     TRUE ~ series.name))
ipca <- 
  ipca %>%
  select(data = ref.date, valor = value, series.name) %>%
  pivot_wider(names_from = "series.name", values_from = "valor")


ipca_tsb <- 
  ipca %>%
  mutate(data = yearmonth(data)) %>%
  arrange(data) %>%
  as_tsibble()



#============================================================#
#fable and future: Time series cross validation forecast ----
#============================================================#
ipca_fable <-
  ipca_tsb %>%
  stretch_tsibble(.step = 1, .init = 144)

model_list <- list()


pdqPDQ <- expand.grid(p = 0:4, d = 0, q = 0:4, P = 0:2, D = 0:1, Q = 0:2)

plan(multisession)

for (i in 1:nrow(pdqPDQ)) {
  
  print(pdqPDQ[i,])
  
  #constante incluída
  model_list[[i]] <-
    ipca_fable %>%
      model(ARIMA(alimentos ~ 1 + pdq(pdqPDQ[i, 1], pdqPDQ[i, 2], pdqPDQ[i, 3]) + 
                    PDQ(pdqPDQ[i, 4], pdqPDQ[i, 5], pdqPDQ[i, 6]))) %>%
      forecast(h = 18) %>%
      group_by(.id) %>%
      mutate(h = row_number()) %>%
      ungroup() %>%
      #accuracy requer classe fable
      as_fable(response = "alimentos", distribution = alimentos)
}  
1

There are 1 best solutions below

1
On

I don't like answer my own question, but it which was too long for a comment. May not be the most elegant solution, but I could solve the error (Error: object 'pdqPDQ' not found) using the listenv package which allowed me supply the pdqPDQ object inside the brackets.

model_list <- listenv()

for (i in 1:nrow(pdqPDQ)) {
  
  #constante incluída
  model_list[[i]] %<-% {
    pdqPDQ;
    ipca_fable %>%
      model(ARIMA(alimentos ~ 1 + pdq(pdqPDQ[i, 1], pdqPDQ[i, 2], pdqPDQ[i, 3]) + 
                    PDQ(pdqPDQ[i, 4], pdqPDQ[i, 5], pdqPDQ[i, 6]), method = "ML")) %>%
      rename_with(~c(".id", paste0(pdqPDQ[i,], collapse = ", "))) %>%
      forecast(h = 18) %>%
      group_by(.id) %>%
      mutate(h = row_number()) %>%
      ungroup() %>%
      #aparentemente, estruturalmente não muda nada, mas accuracy requer classe fable
      as_fable(response = "alimentos", distribution = alimentos)
  }