9.10 ARIMA vs ETS

È un mito comunemente ritenuto che i modelli ARIMA siano più generali dei modelli di lisciamento esponenziale (ETS). In realtà, mentre i modelli lineari di lisciamento esponenziale sono tutti casi speciali di modelli ARIMA, i modelli non lineari di lisciamento esponenziale non hanno controparti ARIMA equivalenti. D’altra parte, ci sono anche molti modelli ARIMA per cui non esiste una controparte fra i modelli di lisciamento esponenziale. In particolare, tutti i modelli ETS sono non stazionari, mentre alcuni modelli ARIMA lo sono. La figura 9.27 mostra la sovrapposizione fra le due classi di modelli.

Le classi di modelli ETS e ARIMA si sovrappongono con i modelli ETS additivi che hanno forme ARIMA equivalenti.

Figura 9.27: Le classi di modelli ETS e ARIMA si sovrappongono con i modelli ETS additivi che hanno forme ARIMA equivalenti.

I modelli ETS con stagionalità o trend non smorzato o entrambi hanno due radici unitarie (cioè, sono necessarie due operazioni di differenziazione per renderli stazionari). Tutti gli altri modelli ETS hanno una radice unitaria (cioè, hanno bisogno di una differenziazione per essere stazionari).

La Tabella 9.4 riporta le relazioni di equivalenza per le due classi di modelli. Per i modelli stagionali, i parametri dei modelli ARIMA sono soggetti ad un grande numero di restrizioni.

Tabella 9.4: Relazioni di equivalenza fra modelli ETS e ARIMA.
ETS model ARIMA model Parameters
ETS(A,N,N) ARIMA(0,1,1) \(\theta_1=\alpha-1\)
ETS(A,A,N) ARIMA(0,2,2) \(\theta_1=\alpha+\beta-2\)
\(\theta_2=1-\alpha\)
ETS(A,A\(_d\),N) ARIMA(1,1,2) \(\phi_1=\phi\)
\(\theta_1=\alpha+\phi\beta-1-\phi\)
\(\theta_2=(1-\alpha)\phi\)
ETS(A,N,A) ARIMA(0,1,\(m\))(0,1,0)\(_m\)
ETS(A,A,A) ARIMA(0,1,\(m+1\))(0,1,0)\(_m\)
ETS(A,A\(_d\),A) ARIMA(1,0,\(m+1\))(0,1,0)\(_m\)

Il criterio AICc è utile per selezionare tra modelli della stessa classe. Per esempio, possiamo usarlo per selezionare un modello ARIMA tra diversi modelli ARIMA candidati17 o un modello ETS tra diversi modelli ETS candidati. Tuttavia, non può essere usato per confrontare modelli ETS e ARIMA, perché appartengono a classi di modelli diverse, e la verosimiglianza è calcolata in modi diversi. Gli esempi che seguono mostrano come selezionare tra queste classi di modelli.\index{ARIMA-ETS equivalenze|)

Confronto fra modelli ARIMA() e ETS() per dati non stagionali

Possiamo usare la tecnica della cross-validation per serie storiche, per confrontare modelli ARIMA e ETS. Consideriamo la serie relativa alla popolazione Australiana dal dataset global_economy, introdotto nella Sezione 8.2.

aus_economy <- global_economy %>%
  filter(Code == "AUS") %>%
  mutate(Population = Population/1e6)

aus_economy %>%
  slice(-n()) %>%
  stretch_tsibble(.init = 10) %>%
  model(
    ETS(Population),
    ARIMA(Population)
  ) %>%
  forecast(h = 1) %>%
  accuracy(aus_economy) %>%
  select(.model, RMSE:MAPE)
#> # A tibble: 2 × 5
#>   .model              RMSE    MAE   MPE  MAPE
#>   <chr>              <dbl>  <dbl> <dbl> <dbl>
#> 1 ARIMA(Population) 0.194  0.0789 0.277 0.509
#> 2 ETS(Population)   0.0774 0.0543 0.112 0.327

In questo caso il modello ETS ha una maggiore accuratezza se consideriamo le misure di performance della cross-validation. Di seguito calcoliamo e rappresentiamo graficamente le previsioni per i prossimi 5 anni usando un modello ETS.

aus_economy %>%
  model(ETS(Population)) %>%
  forecast(h = "5 years") %>%
  autoplot(aus_economy %>% filter(Year >= 2000)) +
  labs(title = "Popolazione australiana",
       y = "Persone (milioni)")
Previsioni per la serie della popolazione Australiana da un modello ETS.

Figura 9.28: Previsioni per la serie della popolazione Australiana da un modello ETS.

Confronto fra ARIMA() e ETS() per dati stagionali

In questo caso vogliamo confrontare i modelli ARIMA e ETS stagionali applicati ai dati trimestrali della produzione di cemento (da aus_production). Poiché la serie è relativamente lunga, possiamo permetterci di usare un training set e un test set piuttosto che la cross-validation per serie temporali. Il vantaggio è che questo metodo è molto più veloce. Creiamo un training set dall’inizio del 1988 alla fine del 2007 e selezioniamo un modello ARIMA e uno ETS usando le funzioni ARIMA() e ETS().

cement <- aus_production %>%
  select(Cement) %>%
  filter_index("1988 Q1" ~ .)
train <- cement %>% filter_index(. ~ "2007 Q4")

L’output sottostante mostra il modello selezionato e stimato da ARIMA(). Il modello ARIMA riesce a catturare bene tutte le dinamiche dei dati in quanto i residui sembrano essere white noise.

fit_arima <- train %>% model(ARIMA(Cement))
report(fit_arima)
#> Series: Cement 
#> Model: ARIMA(1,0,1)(2,1,1)[4] w/ drift 
#> 
#> Coefficients:
#>          ar1      ma1   sar1     sar2     sma1  constant
#>       0.8886  -0.2366  0.081  -0.2345  -0.8979     5.388
#> s.e.  0.0842   0.1334  0.157   0.1392   0.1780     1.484
#> 
#> sigma^2 estimated as 11456:  log likelihood=-463.5
#> AIC=941   AICc=942.7   BIC=957.4
fit_arima %>% gg_tsresiduals(lag_max = 16)
Grafici dei residui per il modello ARIMA stimato sul training set relativo alla serie trimestrale della produzione di cemento.

Figura 9.29: Grafici dei residui per il modello ARIMA stimato sul training set relativo alla serie trimestrale della produzione di cemento.

augment(fit_arima) %>%
  features(.innov, ljung_box, lag = 16, dof = 6)
#> # A tibble: 1 × 3
#>   .model        lb_stat lb_pvalue
#>   <chr>           <dbl>     <dbl>
#> 1 ARIMA(Cement)    6.37     0.783

L’output sottostante mostra il modello ETS selezionato e stimato da ETS(). Anche questo modello riesce a catturare bene tutte le dinamiche dei dati, dato che i residui appaiono essere, anche per questo modello, white noise.

fit_ets <- train %>% model(ETS(Cement))
report(fit_ets)
#> Series: Cement 
#> Model: ETS(M,N,M) 
#>   Smoothing parameters:
#>     alpha = 0.7534 
#>     gamma = 1e-04 
#> 
#>   Initial states:
#>  l[0]  s[0] s[-1] s[-2]  s[-3]
#>  1695 1.031 1.045 1.011 0.9122
#> 
#>   sigma^2:  0.0034
#> 
#>  AIC AICc  BIC 
#> 1104 1106 1121
fit_ets %>%
  gg_tsresiduals(lag_max = 16)
Grafici dei residui per il modello ETS stimato sul training set relativo alla serie trimestrale della produzione di cemento.

Figura 9.30: Grafici dei residui per il modello ETS stimato sul training set relativo alla serie trimestrale della produzione di cemento.

augment(fit_ets) %>%
  features(.innov, ljung_box, lag = 16, dof = 6)
#> # A tibble: 1 × 3
#>   .model      lb_stat lb_pvalue
#>   <chr>         <dbl>     <dbl>
#> 1 ETS(Cement)    10.0     0.438

L’output sottostante confronta le performance di previsione dei due modelli concorrenti sull’insieme di prova. In questo caso il modello ARIMA sembra essere il modello leggermente più accurato in base ai valori di RMSE, MAPE e MASE.

# Generate forecasts and compare accuracy over the test set
bind_rows(
    fit_arima %>% accuracy(),
    fit_ets %>% accuracy(),
    fit_arima %>% forecast(h = 10) %>% accuracy(cement),
    fit_ets %>% forecast(h = 10) %>% accuracy(cement)
  ) %>%
  select(-ME, -MPE, -ACF1)
#> # A tibble: 4 × 7
#>   .model        .type     RMSE   MAE  MAPE  MASE RMSSE
#>   <chr>         <chr>    <dbl> <dbl> <dbl> <dbl> <dbl>
#> 1 ARIMA(Cement) Training  100.  79.9  4.37 0.546 0.582
#> 2 ETS(Cement)   Training  103.  80.0  4.41 0.547 0.596
#> 3 ARIMA(Cement) Test      216. 186.   8.68 1.27  1.26 
#> 4 ETS(Cement)   Test      222. 191.   8.85 1.30  1.29

Di seguito calcoliamo e rappresentiamo graficamente le previsioni dal modello ARIMA per i prossimi 3 anni.

cement %>%
  model(ARIMA(Cement)) %>%
  forecast(h="3 years") %>%
  autoplot(cement) +
  labs(title = "Produzione di cemento in Australia",
       y = "Tonnellate ('000)")
Previsioni da un modello ARIMA adattato alla serie trimestrale della produzione di cemento, per tutto il periodo disponibile dal 1988).

Figura 9.31: Previsioni da un modello ARIMA adattato alla serie trimestrale della produzione di cemento, per tutto il periodo disponibile dal 1988).


  1. Come già notato, confrontare modelli diversi usando i criteri di informazione è valido solo per modelli ARIMA con gli stessi ordini di differenziazione↩︎