12.5 Bootstrap e bagging

Bootstrap di una serie storica

Nella sezione precedente, e nella sezione 5.5, abbiamo fatto il bootstrap dei residui di una serie temporale per simulare i valori futuri di una serie utilizzando un modello.

Più in generale, possiamo generare nuove serie temporali che sono simili alle nostre serie osservate, usando un altro tipo di bootstrap.

In primo luogo, la serie temporale viene trasformata, se necessario, e poi decomposta nelle componenti di trend, stagionalità e di residuo utilizzando STL. Poi otteniamo versioni rimescolate della componente residuale per ottenere serie di residuo bootstrap. Poiché nella serie dei residui STL può essere presente dell’autocorrelazione, non possiamo semplicemente usare la procedura di ridisegno descritta nella sezione 5.5. Usiamo invece un “bootstrap a blocchi”, dove sezioni contigue della serie temporale sono selezionate a caso e unite insieme. Queste serie residue bootstrap vengono aggiunte alle componenti di trend e stagionalità, e la trasformazione viene invertita per ottenere variazioni sulle serie temporali originali.

Consideriamo la produzione trimestrale di cemento in Australia dal 1988:Q1 al 2010:Q2. Per prima cosa controlliamo, vedi Figura 12.19, che la decomposizione abbia adeguatamente catturato il trend e la stagionalità, e che non ci sia del segnale nella serie dei residui.

cement <- aus_production %>%
  filter(year(Quarter) >= 1988) %>%
  select(Quarter, Cement)
cement_stl <- cement %>%
  model(stl = STL(Cement))
cement_stl %>%
  components() %>%
  autoplot()
Decomposizione STL della produzione trimestrale di cemento australiana.

Figura 12.19: Decomposizione STL della produzione trimestrale di cemento australiana.

Ora possiamo generare diverse versioni bootstrap dei dati. Di solito, generate() produce delle simulazioni del futuro da un modello. Ma qui vogliamo simulazioni per il periodo dei dati storici. Quindi usiamo l’argomento new_data per passare i dati originali in modo che gli stessi periodi di tempo siano usati per i dati simulati. Useremo un blocco di dimensione 8 per coprire due anni di dati.

cement_stl %>%
  generate(new_data = cement, times = 10,
           bootstrap_block_size = 8) %>%
  autoplot(.sim) +
  autolayer(cement, Cement) +
  guides(colour = "none") +
  labs(title = "Cement production: Bootstrapped series",
       y="Tonnes ('000)")
Dieci versioni bootstrappate della produzione trimestrale di cemento australiana (a colori), assieme ai dati originali (in nero).

Figura 12.20: Dieci versioni bootstrappate della produzione trimestrale di cemento australiana (a colori), assieme ai dati originali (in nero).

Previsioni bagged

Uno degli usi di queste serie temporali bootstrappate è quello di migliorare l’accuratezza delle previsioni. Se produciamo previsioni da ciascuna delle serie temporali aggiuntive e facciamo la media delle previsioni risultanti, otteniamo previsioni migliori che se prevedessimo direttamente le serie temporali originali. Questa tecnica viene detta “bagging” che sta per “bootstrap aggregating”.

Dimostriamo l’idea usando i dati del “cemento”. Per prima cosa, simuliamo molte serie temporali che sono simili ai dati originali, usando il block-bootstrap descritto sopra.

sim <- cement_stl %>%
  generate(new_data = cement, times = 100,
           bootstrap_block_size = 8) %>%
  select(-.model, -Cement)

Per ciascuna di queste serie, adattiamo un modello ETS. Un modello ETS diverso può essere selezionato in ogni caso, anche se molto probabilmente verrà selezionato lo stesso modello perché le serie sono simili. Tuttavia, i parametri stimati saranno diversi, quindi le previsioni saranno diverse anche se il modello selezionato è lo stesso. Questo è un processo che richiede molto tempo perché ci sono un gran numero di serie.

ets_forecasts <- sim %>%
  model(ets = ETS(.sim)) %>%
  forecast(h = 12)
ets_forecasts %>%
  update_tsibble(key = .rep) %>%
  autoplot(.mean) +
  autolayer(cement, Cement) +
  guides(colour = "none") +
  labs(title = "Produzione di cemento: previsioni bootstrappate",
       y="Tonnellate ('000)")
Previsioni di 100 serie bootstrappate ottenute usando modelli ETS.

Figura 12.21: Previsioni di 100 serie bootstrappate ottenute usando modelli ETS.

Infine, facciamo la media di queste previsioni per ogni periodo di tempo per ottenere le “previsioni bagged” per i dati originali.

bagged <- ets_forecasts %>%
  summarise(bagged_mean = mean(.mean))
cement %>%
  model(ets = ETS(Cement)) %>%
  forecast(h = 12) %>%
  autoplot(cement) +
  autolayer(bagged, bagged_mean, col = "#D55E00") +
  labs(title = "Produzione di cemento in Australia",
       y="Tonnellate ('000)")
Confronto tra le previsioni ETS bagged (la media delle 100 previsioni bootstrappate in arancione) e la previsione ETS applicata direttamente ai dati (in blu).

Figura 12.22: Confronto tra le previsioni ETS bagged (la media delle 100 previsioni bootstrappate in arancione) e la previsione ETS applicata direttamente ai dati (in blu).

Bergmeir et al. (2016) mostrano che, in media, la tecnica bagging dà previsioni migliori rispetto alla semplice applicazione diretta di ETS(). Naturalmente, è più lento perché sono necessari molti più calcoli.

Bibliografia

Bergmeir, C., Hyndman, R. J., & Benítez, J. M. (2016). Bagging exponential smoothing methods using STL decomposition and Box-Cox transformation. International Journal of Forecasting, 32(2), 303–312. [DOI]