12.4 Forecast combinations
An easy way to improve forecast accuracy is to use several different methods on the same time series, and to average the resulting forecasts. Nearly 50 years ago, John Bates and Clive Granger wrote a famous paper (Bates & Granger, 1969), showing that combining forecasts often leads to better forecast accuracy. Twenty years later, Clemen (1989) wrote
The results have been virtually unanimous: combining multiple forecasts leads to increased forecast accuracy. In many cases one can make dramatic performance improvements by simply averaging the forecasts.
While there has been considerable research on using weighted averages, or some other more complicated combination approach, using a simple average has proven hard to beat.
Here is an example using monthly expenditure on eating out in Australia, from April 1982 to September 2017. We use forecasts from the following models: ETS, ARIMA, STL-ETS, NNAR, and TBATS; and we compare the results using the last 5 years (60 months) of observations.
<- window(auscafe, end=c(2012,9)) train <- length(auscafe) - length(train) h <- forecast(ets(train), h=h) ETS <- forecast(auto.arima(train, lambda=0, biasadj=TRUE), ARIMA h=h) <- stlf(train, lambda=0, h=h, biasadj=TRUE) STL <- forecast(nnetar(train), h=h) NNAR <- forecast(tbats(train, biasadj=TRUE), h=h) TBATS <- (ETS[["mean"]] + ARIMA[["mean"]] + Combination "mean"]] + NNAR[["mean"]] + TBATS[["mean"]])/5 STL[[
autoplot(auscafe) + autolayer(ETS, series="ETS", PI=FALSE) + autolayer(ARIMA, series="ARIMA", PI=FALSE) + autolayer(STL, series="STL", PI=FALSE) + autolayer(NNAR, series="NNAR", PI=FALSE) + autolayer(TBATS, series="TBATS", PI=FALSE) + autolayer(Combination, series="Combination") + xlab("Year") + ylab("$ billion") + ggtitle("Australian monthly expenditure on eating out")
c(ETS = accuracy(ETS, auscafe)["Test set","RMSE"], ARIMA = accuracy(ARIMA, auscafe)["Test set","RMSE"], `STL-ETS` = accuracy(STL, auscafe)["Test set","RMSE"], NNAR = accuracy(NNAR, auscafe)["Test set","RMSE"], TBATS = accuracy(TBATS, auscafe)["Test set","RMSE"], Combination = accuracy(Combination, auscafe)["Test set","RMSE"]) #> ETS ARIMA STL-ETS NNAR #> 0.13700 0.15920 0.21446 0.31769 #> TBATS Combination #> 0.09406 0.07157
TBATS does particularly well with this series, but the combination approach is even better. For other data, TBATS may be quite poor, while the combination approach is almost always close to, or better than, the best component method.