Search code examples
rtime-seriesforecastinghierarchical

Passing different forecasting method to hierarchical time series forecast in R?


I have a hierarchical time series, the bottom level series of which all exhibit intermittent demand. It seems advantageous to use Hyndman's HTS package for optimal combination within the hierarchy. It also seems advantageous to use Kourentzes' MAPA package for multiple aggregation prediction of the intermittent demand. In essence, I want to do something like:

forecast(my_hts, method='comb', fmethod='MAPA')

However, it is unclear to me if / how I can combine the two, since forecast.gts() only accepts fmethod=c("ets", "arima", "rw").

Is there a clever way to pass different forecasting methods to forecast.gts() without having to tear up the code?

Example to clarify what I mean:

library(hts)
library(MAPA)
set.seed(1)

#note intermittent demand of bottom level time series
x <- ts(rpois(365, lambda=0.05), frequency=365, start=2014)
y <- ts(rpois(365, lambda=0.07), frequency=365, start=2014)

#it's easy to make a MAPA forecast for the top-level time series
#but this isn't an optimal hierarchical forecast
mapasimple(x+y)

#it's also easy to make this a HTS and make an optimal hierarchical forecast
#but now I cannot use MAPA
z <- hts(data.frame(x,y)))
z_arima <- forecast(z, fmethod="arima")
z_rw <- forecast(z, fmethod="rw")
z_ets <- forecast(z, fmethod="ets")

#z_MAPA <- ?

Solution

  • I'm posting because after a closer look at the hts documentation (insert well-deserved RTFM here), I think I found a work-around using the combinef() function from hts, which can be used to optimally combine forecasts outside of the forecast.gts() environment. I'll leave it up for a while before accepting as an answer so others can tell me if I'm wrong.

    fh <- 8
    
    library(hts)
    library(MAPA)
    set.seed(1)
    
    x <- ts(rpois(365, lambda=0.05), frequency=365, start=2014)
    y <- ts(rpois(365, lambda=0.07), frequency=365, start=2014)
    
    my_hts <- hts(data.frame(x,y))
    
    ally <- aggts(my_hts)
    
    allf <- matrix(NA, nrow = fh, ncol = ncol(ally))
    
    for(i in 1:ncol(ally)){
        allf[,i] <- mapafor(ally[,i], 
                            mapaest(ally[,i], outplot=0), 
                            fh = fh, 
                            outplot=0)$outfor
    }
    
    allf <- ts(allf)
    
    y.f <- combinef(allf, my_hts$nodes, weights=NULL, keep="bottom")
    
    #here's what the non-reconciled, bottom-level MAPA forecasts look like
    print(allf[1,1:2])
    
     Series 1   Series 2
    1 0.1343304 0.06032574
    
    #here's what the reconciled MAPA bottom-level forecasts look like
    #notice that they're different
    print(y.f[1,])
    
    [1] 0.06030926 0.07402938