## 8.3 Models with seasonality

Holt (1957) and Winters (1960) extended Holt’s method to capture seasonality. The Holt-Winters seasonal method comprises the forecast equation and three smoothing equations — one for the level \(\ell_t\), one for the trend \(b_t\), and one for the seasonal component \(s_t\), with corresponding smoothing parameters \(\alpha\), \(\beta^*\) and \(\gamma\). We use \(m\) to denote the frequency of the seasonality, i.e., the number of seasons in a year. For example, for quarterly data \(m=4\), and for monthly data \(m=12\).

There are two variations to this method that differ in the nature of the seasonal component. The additive method is preferred when the seasonal variations are roughly constant through the series, while the multiplicative method is preferred when the seasonal variations are changing proportional to the level of the series. With the additive method, the seasonal component is expressed in absolute terms in the scale of the observed series, and in the level equation the series is seasonally adjusted by subtracting the seasonal component. Within each year, the seasonal component will add up to approximately zero. With the multiplicative method, the seasonal component is expressed in relative terms (percentages), and the series is seasonally adjusted by dividing through by the seasonal component. Within each year, the seasonal component will sum up to approximately \(m\).

### Holt-Winters’ additive method

The component form for the additive method is: \[\begin{align*} \hat{y}_{t+h|t} &= \ell_{t} + hb_{t} + s_{t+h-m(k+1)} \\ \ell_{t} &= \alpha(y_{t} - s_{t-m}) + (1 - \alpha)(\ell_{t-1} + b_{t-1})\\ b_{t} &= \beta^*(\ell_{t} - \ell_{t-1}) + (1 - \beta^*)b_{t-1}\\ s_{t} &= \gamma (y_{t}-\ell_{t-1}-b_{t-1}) + (1-\gamma)s_{t-m}, \end{align*}\] where \(k\) is the integer part of \((h-1)/m\), which ensures that the estimates of the seasonal indices used for forecasting come from the final year of the sample. The level equation shows a weighted average between the seasonally adjusted observation \((y_{t} - s_{t-m})\) and the non-seasonal forecast \((\ell_{t-1}+b_{t-1})\) for time \(t\). The trend equation is identical to Holt’s linear method. The seasonal equation shows a weighted average between the current seasonal index, \((y_{t}-\ell_{t-1}-b_{t-1})\), and the seasonal index of the same season last year (i.e., \(m\) time periods ago).

The equation for the seasonal component is often expressed as \[ s_{t} = \gamma^* (y_{t}-\ell_{t})+ (1-\gamma^*)s_{t-m}. \] If we substitute \(\ell_t\) from the smoothing equation for the level of the component form above, we get \[ s_{t} = \gamma^*(1-\alpha) (y_{t}-\ell_{t-1}-b_{t-1})+ [1-\gamma^*(1-\alpha)]s_{t-m}, \] which is identical to the smoothing equation for the seasonal component we specify here, with \(\gamma=\gamma^*(1-\alpha)\). The usual parameter restriction is \(0\le\gamma^*\le1\), which translates to \(0\le\gamma\le 1-\alpha\).

### Holt-Winters’ multiplicative method

The component form for the multiplicative method is: \[\begin{align*} \hat{y}_{t+h|t} &= (\ell_{t} + hb_{t})s_{t+h-m(k+1)} \\ \ell_{t} &= \alpha \frac{y_{t}}{s_{t-m}} + (1 - \alpha)(\ell_{t-1} + b_{t-1})\\ b_{t} &= \beta^*(\ell_{t}-\ell_{t-1}) + (1 - \beta^*)b_{t-1} \\ s_{t} &= \gamma \frac{y_{t}}{(\ell_{t-1} + b_{t-1})} + (1 - \gamma)s_{t-m} \end{align*}\]

### Example: Domestic overnight trips in Australia

We apply Holt-Winters’ method with both additive and multiplicative seasonality to forecast quarterly visitor nights in Australia spent by domestic tourists. Figure 8.6 shows the data from 1998–2017, and the forecasts for 2018–2020. The data show an obvious seasonal pattern, with peaks observed in the March quarter of each year, corresponding to the Australian summer.

```
aus_holidays <- tourism %>%
filter(Purpose == "Holiday") %>%
summarise(Trips = sum(Trips))
fit <- aus_holidays %>%
model(
additive = ETS(Trips ~ error("A") + trend("A") + season("A")),
multiplicative = ETS(Trips ~ error("M") + trend("A") + season("M"))
)
fc <- fit %>% forecast(h = "3 years")
fc %>%
autoplot(aus_holidays, level = NULL) + xlab("Year") +
ylab("Overnight trips (millions)") +
scale_color_brewer(type = "qual", palette = "Dark2")
```

Quarter | Time | Observation | Level | Forecast |
---|---|---|---|---|

\(t\) | \(y_t\) | \(\ell_t\) | \(\hat{y}_{t+1|t}\) | |

1997-01-01 | 0 | |||

1997-04-01 | 1 | |||

1997-07-01 | 2 | |||

1997-10-01 | 3 | 9898.70 | ||

1998-01-01 | 4 | 11806.04 | 9963.62 | 11373.24 |

1998-04-01 | 5 | 9275.66 | 9850.76 | 9649.37 |

1998-07-01 | 6 | 8642.49 | 9699.60 | 9131.13 |

1998-10-01 | 7 | 9299.52 | 9693.93 | 9111.21 |

⋮ | ⋮ | ⋮ | ⋮ | |

2017-01-01 | 80 | 12406.42 | 10837.17 | 12331.59 |

2017-04-01 | 81 | 10471.20 | 10890.72 | 10641.29 |

2017-07-01 | 82 | 10499.17 | 11027.56 | 10295.51 |

2017-10-01 | 83 | 11210.82 | 11270.47 | 10584.20 |

\(h\) | \(\hat{y}_{T+h|T}\) | |||

2018-01-01 | 1 | 12896.01 | ||

2018-04-01 | 2 | 11207.66 | ||

2018-07-01 | 3 | 10926.87 | ||

2018-10-01 | 4 | 11186.11 | ||

2019-01-01 | 5 | 13349.71 | ||

2019-04-01 | 6 | 11661.36 | ||

2019-07-01 | 7 | 11380.57 | ||

2019-10-01 | 8 | 11639.82 | ||

2020-01-01 | 9 | 13803.41 | ||

2020-04-01 | 10 | 12115.07 | ||

2020-07-01 | 11 | 11834.27 | ||

2020-10-01 | 12 | 12093.52 |

Quarter | Time | Observation | Level | Forecast |
---|---|---|---|---|

\(t\) | \(y_t\) | \(\ell_t\) | \(\hat{y}_{t+1|t}\) | |

1997-01-01 | 0 | |||

1997-04-01 | 1 | |||

1997-07-01 | 2 | |||

1997-10-01 | 3 | 9852.79 | ||

1998-01-01 | 4 | 11806.04 | 9883.09 | 11409.04 |

1998-04-01 | 5 | 9275.66 | 9803.10 | 9562.00 |

1998-07-01 | 6 | 8642.49 | 9689.99 | 9043.79 |

1998-10-01 | 7 | 9299.52 | 9687.87 | 9092.87 |

⋮ | ⋮ | ⋮ | ⋮ | |

2017-01-01 | 80 | 12406.42 | 10802.83 | 12585.26 |

2017-04-01 | 81 | 10471.20 | 10879.58 | 10571.62 |

2017-07-01 | 82 | 10499.17 | 11042.06 | 10156.74 |

2017-10-01 | 83 | 11210.82 | 11284.41 | 10504.68 |

\(h\) | \(\hat{y}_{T+h|T}\) | |||

2018-01-01 | 1 | 13252.27 | ||

2018-04-01 | 2 | 11180.69 | ||

2018-07-01 | 3 | 10781.52 | ||

2018-10-01 | 4 | 11093.41 | ||

2019-01-01 | 5 | 13815.59 | ||

2019-04-01 | 6 | 11650.96 | ||

2019-07-01 | 7 | 11230.28 | ||

2019-10-01 | 8 | 11550.40 | ||

2020-01-01 | 9 | 14378.92 | ||

2020-04-01 | 10 | 12121.23 | ||

2020-07-01 | 11 | 11679.04 | ||

2020-10-01 | 12 | 12007.39 |

The applications of both methods (with additive and multiplicative seasonality) are presented in Tables 8.3 and 8.4 respectively. Because both methods have exactly the same number of parameters to estimate, we can compare the training RMSE from both models. In this case, the method with multiplicative seasonality fits the data best. This was to be expected, as the time plot shows that the seasonal variation in the data increases as the level of the series increases. This is also reflected in the two sets of forecasts; the forecasts generated by the method with the multiplicative seasonality display larger and increasing seasonal variation as the level of the forecasts increases compared to the forecasts generated by the method with additive seasonality.

The estimated states for both models are plotted in Figure 8.7. The small value of \(\gamma\) for the multiplicative model means that the seasonal component hardly changes over time. The small value of \(\beta^{*}\) for the additive model means the slope component hardly changes over time (check the vertical scale).

### Holt-Winters’ damped method

Damping is possible with both additive and multiplicative Holt-Winters’ methods. A method that often provides accurate and robust forecasts for seasonal data is the Holt-Winters method with a damped trend and multiplicative seasonality: \[\begin{align*} \hat{y}_{t+h|t} &= \left[\ell_{t} + (\phi+\phi^2 + \dots + \phi^{h})b_{t}\right]s_{t+h-m(k+1)}. \\ \ell_{t} &= \alpha(y_{t} / s_{t-m}) + (1 - \alpha)(\ell_{t-1} + \phi b_{t-1})\\ b_{t} &= \beta^*(\ell_{t} - \ell_{t-1}) + (1 - \beta^*)\phi b_{t-1} \\ s_{t} &= \gamma \frac{y_{t}}{(\ell_{t-1} + \phi b_{t-1})} + (1 - \gamma)s_{t-m}. \end{align*}\]

### Example: Holt-Winters method with daily data

The Holt-Winters method can also be used for daily type of data, where the seasonal period is \(m=7\), and the appropriate unit of time for \(h\) is in days. Here we forecast pedestrian traffic at a busy Melbourne train station in July 2016.

```
sth_cross_ped <- pedestrian %>%
filter(Sensor == "Southern Cross Station", yearmonth(Date) == yearmonth("2016 July")) %>%
index_by(Date) %>%
summarise(Count = sum(Count))
sth_cross_ped %>%
model(hw = ETS(Count ~ error("M") + trend("Ad") + season("M"))) %>%
forecast(h = "2 weeks") %>%
autoplot(sth_cross_ped)
```

Clearly the model has identified the weekly seasonal pattern and the increasing trend at the end of the data, and the forecasts are a close match to the test data.

### Bibliography

Holt, C. E. (1957). *Forecasting seasonals and trends by exponentially weighted averages* (O.N.R. Memorandum No. 52). Carnegie Institute of Technology, Pittsburgh USA. https://doi.org/10.1016/j.ijforecast.2003.09.015

Winters, P. R. (1960). Forecasting sales by exponentially weighted moving averages. *Management Science*, *6*, 324–342. https://doi.org/10.1287/mnsc.6.3.324