Dina
Dina

Reputation: 1

Rolling origin function ro() showing error for forecast object in R

I'm currently working on a time-series project to forecast a cumulative variable 6 steps ahead. In my model selection process I'm trying to perform a rolling origin accuracy analysis for forecasts of ARIMA, ets and other exponential smoothing models, using the ro() function.

I will use example time series data a10 for my example; Monthly anti-diabetic pharmaceutical sales in Australia from 1999 - 2008. To simplify things I shortened the time series to Jul-91 to Jun-95 (4 years worth of data).

This is the usage of the ro() function from RDocumentaton:

ro(data, h = 10, origins = 10, call, value = NULL, ci = FALSE, co = TRUE, silent = TRUE, parallel = FALSE, ...)

I want to perform a constant holdout rolling origin/cross-validation for 6 forecasts using 8 origins. When I define the "call" parameter as a forecast object for ets models I get the following error:

library("fpp")
library("forecast")
library(greybox)


a10                                          ## Australian anti-diabetic drug sales ts
a10_4yrs <- window(a10, end = c(1995,06))    ## shortening time series

OurCall <- "forecast(ets(a10_4yrs, model = 'AAA'), h = h, level = 85)"
OurValue <- c("mean", "lower", "upper")

## Constant holdout rolling origin using ets method
ReturnedValues <- ro(a10_4yrs, h = 6, origins = 8, call = OurCall, value = OurValue, ci = FALSE, co = TRUE)


## Error message I get when typing to run code
Error in UseMethod("forecast") : 
no applicable method for 'forecast' applied to an object of class "ets"
4. forecast(ets(a10_4yrs, model = "AAA"), h = h, level = 85) at <text>#1
3. eval(parse(text = call))
2. eval(parse(text = call))
1. ro(a10_4yrs, h = 6, origins = 8, call = OurCall, value = OurValue, ci = FALSE, co = TRUE)

Any ideas on why I am getting this error? ro() is supposed to be applicable for any forecasting function, many online textbooks and articles have demonstrated the use of ro() with a forecast object so it should work

I appreciate any advice anyone can lend

Thank you in advance :)

Upvotes: 0

Views: 257

Answers (1)

Mitchell O&#39;Hara-Wild
Mitchell O&#39;Hara-Wild

Reputation: 2459

The forecast() generic (and so the methods registered to them) used by the {forecast} and {greybox} packages are different.

This has been fixed in the latest CRAN versions of these packages, as they both now use the same generic function.

You can either update your packages, or be explicit about where the forecast() generic is obtained from by using forecast::forecast().

library("fpp")
#> Loading required package: forecast
#> Registered S3 method overwritten by 'quantmod':
#>   method            from
#>   as.zoo.data.frame zoo
#> Loading required package: fma
#> Loading required package: expsmooth
#> Loading required package: lmtest
#> Loading required package: zoo
#> 
#> Attaching package: 'zoo'
#> The following objects are masked from 'package:base':
#> 
#>     as.Date, as.Date.numeric
#> Loading required package: tseries
library("forecast")
library("greybox")
#> Package "greybox", v1.0.5 loaded.
#> 
#> Attaching package: 'greybox'
#> The following object is masked from 'package:forecast':
#> 
#>     forecast

a10                                          ## Australian anti-diabetic drug sales ts
#>            Jan       Feb       Mar       Apr       May       Jun       Jul
#> 1991                                                              3.526591
#> 1992  5.088335  2.814520  2.985811  3.204780  3.127578  3.270523  3.737851
#> 1993  6.192068  3.450857  3.772307  3.734303  3.905399  4.049687  4.315566
#> 1994  6.731473  3.841278  4.394076  4.075341  4.540645  4.645615  4.752607
#> 1995  6.749484  4.216067  4.949349  4.823045  5.194754  5.170787  5.256742
#> 1996  8.329452  5.069796  5.262557  5.597126  6.110296  5.689161  6.486849
#> 1997  8.524471  5.277918  5.714303  6.214529  6.411929  6.667716  7.050831
#> 1998  8.798513  5.918261  6.534493  6.675736  7.064201  7.383381  7.813496
#> 1999 10.391416  6.421535  8.062619  7.297739  7.936916  8.165323  8.717420
#> 2000 12.511462  7.457199  8.591191  8.474000  9.386803  9.560399 10.834295
#> 2001 14.497581  8.049275 10.312891  9.753358 10.850382  9.961719 11.443601
#> 2002 16.300269  9.053485 10.002449 10.788750 12.106705 10.954101 12.844566
#> 2003 16.828350  9.800215 10.816994 10.654223 12.512323 12.161210 12.998046
#> 2004 18.003768 11.938030 12.997900 12.882645 13.943447 13.989472 15.339097
#> 2005 20.778723 12.154552 13.402392 14.459239 14.795102 15.705248 15.829550
#> 2006 23.486694 12.536987 15.467018 14.233539 17.783058 16.291602 16.980282
#> 2007 28.038383 16.763869 19.792754 16.427305 21.000742 20.681002 21.834890
#> 2008 29.665356 21.654285 18.264945 23.107677 22.912510 19.431740          
#>            Aug       Sep       Oct       Nov       Dec
#> 1991  3.180891  3.252221  3.611003  3.565869  4.306371
#> 1992  3.558776  3.777202  3.924490  4.386531  5.810549
#> 1993  4.562185  4.608662  4.667851  5.093841  7.179962
#> 1994  5.350605  5.204455  5.301651  5.773742  6.204593
#> 1995  5.855277  5.490729  6.115293  6.088473  7.416598
#> 1996  6.300569  6.467476  6.828629  6.649078  8.606937
#> 1997  6.704919  7.250988  7.819733  7.398101 10.096233
#> 1998  7.431892  8.275117  8.260441  8.596156 10.558939
#> 1999  9.070964  9.177113  9.251887  9.933136 11.532974
#> 2000 10.643751  9.908162 11.710041 11.340151 12.079132
#> 2001 11.659239 10.647060 12.652134 13.674466 12.965735
#> 2002 12.196500 12.854748 13.542004 13.287640 15.134918
#> 2003 12.517276 13.268658 14.733622 13.669382 16.503966
#> 2004 15.370764 16.142005 16.685754 17.636728 18.869325
#> 2005 17.554701 18.100864 17.496668 19.347265 20.031291
#> 2006 18.612189 16.623343 21.430241 23.575517 23.334206
#> 2007 23.930204 22.930357 23.263340 25.250030 25.806090
#> 2008
a10_4yrs <- window(a10, end = c(1995,06))    ## shortening time series

OurCall <- "forecast::forecast(ets(a10_4yrs, model = 'AAA'), h = h, level = 85)"
OurValue <- c("mean", "lower", "upper")

## Constant holdout rolling origin using ets method
ReturnedValues <- ro(a10_4yrs, h = 6, origins = 8, call = OurCall, value = OurValue, ci = FALSE, co = TRUE)

Created on 2022-07-28 by the reprex package (v2.0.1)

Upvotes: 1

Related Questions