This document demonstrates that brute force model comparison and automatic ETS selection yield identical results, providing confidence in both approaches for time series forecasting.
The 9 Core ETS Models
ETS (Error, Trend, Seasonal) models describe time series using combinations of:
Error type: Additive (A) or Multiplicative (M)
Trend: None (N), Additive (A), or Multiplicative (M)
Seasonality: None (N), Additive (A), or Multiplicative (M)
This yields 9 common ETS models that we can systematically compare:
Key Takeaways
Main Finding
Both brute force comparison (fitting all 9 models manually) and automatic selection converge on the same optimal model, validating the reliability of automated ETS selection algorithms.
Practical Implications
Automatic selection is computationally efficient while maintaining accuracy
Manual comparison provides transparency into the selection process
Both approaches use AICc for model comparison, ensuring consistent results :::{r nine-ets-models}
# Load required librarieslibrary(fpp3)# Demonstrate the 9 core ETS models using Australian retail dataaus_retail_total<-aus_retail|>summarise(Turnover =sum(Turnover, na.rm =TRUE))# Fit all 9 core ETS modelsnine_ets_models<-aus_retail_total|>model(# No trend, no seasonality ETS_ANN =ETS(Turnover~error("A")+trend("N")+season("N")), ETS_MNN =ETS(Turnover~error("M")+trend("N")+season("N")),# Additive trend, no seasonality ETS_AAN =ETS(Turnover~error("A")+trend("A")+season("N")), ETS_MAN =ETS(Turnover~error("M")+trend("A")+season("N")),# Multiplicative trend, no seasonality ETS_AMN =ETS(Turnover~error("A")+trend("M")+season("N")), ETS_MMN =ETS(Turnover~error("M")+trend("M")+season("N")),# Additive trend, additive seasonality ETS_AAA =ETS(Turnover~error("A")+trend("A")+season("A")), ETS_MAA =ETS(Turnover~error("M")+trend("A")+season("A")),# Additive trend, multiplicative seasonality ETS_AAM =ETS(Turnover~error("A")+trend("A")+season("M")), ETS_MAM =ETS(Turnover~error("M")+trend("A")+season("M")),# Automatic selection ETS_AUTO =ETS(Turnover))# Compare brute force vs automatic - show they give same resultsmodel_comparison<-nine_ets_models|>glance()|>arrange(AICc)|>select(.model, AICc, BIC, sigma2)|>mutate( Delta_AICc =AICc-min(AICc), Delta_AICc =round(Delta_AICc, 2))cat("Model Comparison (ranked by AICc):\n")