Introducció

El primer que cal fer en qualsevol tasca d’anàlisi de dades és representar-les gràficament. Els gràfics permeten visualitzar moltes característiques de les dades, com ara patrons, observacions inusuals, canvis al llarg del temps i relacions entre variables. Les característiques que es veuen als gràfics de les dades s’han d’incorporar, tant com sigui possible, als mètodes de previsió que s’utilitzaran. De la mateixa manera que el tipus de dades determina quin mètode de previsió utilitzar, també determina quins gràfics són adequats.

D’altra banda, les dades de sèries temporals poden presentar una varietat de patrons, i sovint és útil dividir una sèrie temporal en diversos components, cadascun dels quals representa una categoria de patrons subjacent.

Aquí presentem tres tipus de patrons de sèries temporals: tendència, estacionalitat i cicles. Quan descomposem una sèrie temporal en components, normalment combinem la tendència i el cicle en un únic component de tendència-cicle (sovint anomenat simplement tendència per simplicitat). Per tant, podem pensar en una sèrie temporal com si comprenés tres components: un component de tendència-cicle, un component estacional i un component de resta (que conté qualsevol altra cosa de la sèrie temporal). Considerarem els mètodes més comuns per extreure aquests components d’una sèrie temporal. Sovint això es fa per ajudar a millorar la comprensió de la sèrie temporal, però també es pot utilitzar per millorar la precisió de la previsió.

A l’hora de descompondre una sèrie temporal, de vegades és útil transformar o ajustar primer la sèrie per tal de fer que la descomposició (i l’anàlisi posterior) sigui el més senzilla possible. Per tant, començarem per parlar de les transformacions i els ajustaments.

Referències

G. J. Hyndman and G. Athanasopoulos, Forecasting: Principles and Practice,3rd edition, Chapters 2 and 3, 2021, OTexts: Melbourne, Australia. Disponible a otexts.com/.

Datasets

La llibreria fp3 conté tots els conjunts de dades necessaris per als exemples i exercicis del llibre “Forecasting: principles and practice, 3d ed.” de Rob J Hyndman i George Athanasopoulos. Per aixo s’utilitzarà principalment datasets d’aquest paquest.

La llibreria tsibbledata proporciona diversos conjunts de dades a l’estructura de dades “tsibble”. Aquests conjunts de dades són útils per aprendre i demostrar com es poden ordenar, visualitzar i preveure les dades temporals ordenades.

La lliberia fma conté tots els conjunts de dades de “Forecasting: methods and applications” de Makridakis, Wheelwright i Hyndman (Wiley, 3a ed., 1998).

library(fpp2)
library(fpp3)
library(tsibbledata)
library(fma)

Possiblement se n’utilitzaran d’altres, però aquestes seran la més usades.

Llibreries principals

Llibreries generals

A més de les llibreries base de R, atilitzarem algunes llibreria de l’entorn tidyverse::dplyr per a la manipulació de dades, ggplot2 per a gràfics i patchwork per a gràfics múltiples. Puntualment, n’hem utilitzat d’altres, que apareixeran indicades al codi.

library(ggplot2)
library(dplyr)
library(patchwork)

Lliberiries d’estadística

Pel que fa a les funcions estadístiques, a més de stats que ve per defecte amb R, farem servir en vàries ocasions forecast i astsa que són llibreries específiques per anàlisi de sèries temposrals. També es podran fer servir altres paquets quan no estigui disponible alguna funció o les disponibles no tinguin totes les característiques desitjades. En tot cas, en el codi sempre es trobarà indicada la llibreria que correspongui.

Advertència

Ateses le nombroses ambigüitats que sovint es poden generar, sovint les funcions i els datasets van acompanyats pel nom del paque d’origen (per exemple, ggplot2::autoplot(), stats::acf(), etc.).

Gràfics per a sèries temporals

Time plots

Per a les dades de sèries temporals, el gràfic obvi per començar és un diagrama de temps. És a dir, les observacions es representen en funció del temps d’observació, amb observacions consecutives unides per línies rectes.

melsyd_economy <- tsibbledata::ansett |>
  filter(Airports == "MEL-SYD", Class == "Economy") |>
  mutate(Passengers = Passengers/1000)
ggplot2::autoplot(melsyd_economy, Passengers) +
  labs(title = "Ansett airlines classe econòmica",
       subtitle = "Melbourne-Sydney",
       y = "Passatgers ('000)") +
  theme_bw()
Figura 1.1: Embarcament setmanal de passatgers de Ansett Airlines.

Figura 1.1: Embarcament setmanal de passatgers de Ansett Airlines.

Proporciona diversos conjunts de dades a l’estructura de dades “tsibble”. Aquests conjunts de dades són útils per aprendre i demostrar com es poden ordenar, visualitzar i preveure les dades temporals ordenades.

Utilitzarem l’ordre autoplot() de ggplot2 amb freqüència. Produeix automàticament una trama adequada de tot el que li passeu al primer argument. En aquest cas, reconeix melsyd_economy com una sèrie temporal i produeix una gràfica temporal.

autoplot(fpp2::a10) +
  labs(y = "$ (milions)",
       title = "Venda de medicaments a Austràlia") +
  theme_bw()
Figura 1.2: Vendes mensuals de fàrmacs antidiabètics a Austràlia.

Figura 1.2: Vendes mensuals de fàrmacs antidiabètics a Austràlia.

Aquí un gráfic amb una clara pauta estacional i una tendència que va canviant lentament.

Per descriure aquestes sèries temporals, hem utilitzat paraules com “tendència” i “estacional” que cal definir amb més cura.

Tendència

Existeix una tendència quan hi ha un augment o una disminució a llarg termini de les dades. No ha de ser lineal.

Estacional

Un patró estacional es produeix quan una sèrie temporal es veu afectada per factors estacionals com l’època de l’any o el dia de la setmana. L’estacionalitat és sempre d’un període fix i conegut.

Cíclic

Es produeix un cicle quan les dades presenten pujades i baixades que no tenen una freqüència fixa. Aquestes fluctuacions solen ser degudes a condicions econòmiques, i sovint estan relacionades amb el “cicle empresarial”. La durada d’aquestes fluctuacions sol ser d’almenys 2 anys.

Exemples

p3 <- autoplot(fpp2::qauselec)+
  labs(y = "Bilions de kWh",
       title = "Producció trimestral d'electricitat a Austràlia") +
  theme_bw()

p4 <- gafa_stock %>%
  mutate(changeP = Close - dplyr::lag(Close)) %>%
  filter(Symbol== "GOOG",
          Date > "2014-12-31" & Date < "2016-01-01") %>% 
  ggplot2::ggplot(aes(Date,changeP)) +
  ggtitle("Diferència diària del preu de l'acció: Google") +
  geom_line() +
  theme_bw()

p1 <- autoplot(fma::hsales2) +
  labs(y = "Cases (milions)",
       title = "Vendes de cases monofamiliars, USA") +
  theme_bw()


(p1+p4) / p3
Figura 1.3: Exemples de sèries amb pautes diferents

Figura 1.3: Exemples de sèries amb pautes diferents

Les vendes mensuals d’habitatge (a dalt a l’esquerra) mostren una forta estacionalitat cada any, així com un fort comportament cíclic amb un període d’entre 6 i 10 anys. No hi ha cap tendència aparent en les dades durant aquest període.

La producció trimestral d’electricitat australiana (a baix) mostra una forta tendència creixent, amb una forta estacionalitat.

El canvi diari del preu de tancament de les accions de Google no té cap tendència, estacionalitat o comportament cíclic. Hi ha fluctuacions aleatòries que no semblen ser molt previsibles.

Seasonal plot

Aquestes són les mateixes dades que es mostraven anteriorment, però ara les dades de cada any es superposen. Una gràfica estacional permet veure amb més claredat el patró estacional subjacent i és especialment útil per identificar els anys en què el patró canvia.

a10 %>% 
  ggseasonplot() +
  labs(y = "$ (millions)", title = "Season plot: venda de fármacos antidiabéticos")+
  #guides(color=guide_legend(title="", ncol = 6))+
  theme(legend.position = "bottom") +
  theme_bw(base_size = 12)
Figura 1.4

Figura 1.4

Matrius de diagrames de dispersió

Quan hi ha diverses variables predictores potencials, és útil representar gràficament cada variable amb una altra variable. Considereu vuit sèries temporals que es mostren a la figura 1.5, que mostren el nombre de visitants trimestrals als estats i territoris d’Austràlia

visitors <- tsibble::tourism %>% 
  group_by(State) %>% 
  summarise(Trips = sum(Trips))
visitors %>% 
  ggplot(aes(x = Quarter, y = Trips)) +
  geom_line() +
  facet_grid(vars(State), scales = "free_y") +
  labs(title = "Turisme domèstic, Australia",
       y= "Pernoctacions ('000)")
Figura 1.5: Pernoctacions estats i territoris d'Austràlia.

Figura 1.5: Pernoctacions estats i territoris d’Austràlia.

Per veure les relacions entre aquestes vuit sèries temporals, podem representar cada sèrie temporal contra les altres. Aquests diagrames es poden ordenar en una matriu de diagrames de dispersió, tal com es mostra a la figura 1.6. (Aquesta trama requereix que s’instal·li el paquet GGally.)

visitors |>
  pivot_wider(values_from=Trips, names_from=State) |>
  GGally::ggpairs(columns = 2:9)
Figura 1.6: Un matriu de diagrames de dispersió de les pernoctacions trimestrals de visitants als estats i territoris d'Austràlia.

Figura 1.6: Un matriu de diagrames de dispersió de les pernoctacions trimestrals de visitants als estats i territoris d’Austràlia.

Lagplots

La figura 1.7 mostra diagrames de dispersió de la producció trimestral de cervesa australiana, on l’eix horitzontal mostra els valors retardats de la sèrie temporal. Cada gràfic mostra \(y_t\) representat contra \(y_{t−k}\) per a diferents valors de \(k\).

recent_production <- tsibbledata::aus_production |>
  filter(year(Quarter) >= 2000) %>% as.ts()

forecast::gglagplot(recent_production[,1],do.lines = F) +
  geom_point(colour = "dodgerblue3") +
  theme_bw() +
  theme(legend.position = 'none') +
  #scale_colour_brewer(palette = "Set1")
  geom_smooth()
Figura 1.7: Diagrames retardats de dispersió sobre producció trimestral de cervesa

Figura 1.7: Diagrames retardats de dispersió sobre producció trimestral de cervesa

Observem que la relació és fortament positiva en els retards 4 i 8, cosa que reflecteix la forta estacionalitat de les dades. La relació negativa observada per als retards 2 i 6 es produeix perquè representen els contrapics anuals.

Cal destacar que hem fet servir la funció gglagplot() de forecast que vé molt útil per a aquest cas. També es podria fer servir gg_lag de feasts.

Autocorrelació i soroll blanc

De la mateixa manera que la correlació mesura l’abast d’una relació lineal entre dues variables, l’autocorrelació mesura la relació lineal entre valors retardats d’una sèrie temporal.

Hi ha diversos coeficients d’autocorrelació, corresponents a cada panell del gràfic de retard. Per exemple, r1 mesura la relació entre yt i yt−, r2 mesura la relació entre yt i yt−2, i així successivament. El valor d’rk es pot escriure com a1

\[ r_{k} = \frac{\sum\limits_{t=k+1}^T (y_{t}-\bar{y})(y_{t-k}-\bar{y})} {\sum\limits_{t=1}^T (y_{t}-\bar{y})^2} \]

on \(T\) és la longitud de la sèrie temporal. Els coeficients d’autocorrelació formen la funció d’autocorrelació o ACF.

Els coeficients d’autocorrelació per a les dades de producció de cervesa es poden calcular mitjançant la funció stats::acf() o feasts::ACF() (el paquete feasts és el de referència per al manual de Hyndman i Athanasopoulos), però nosaltres, com a criteri

stats::acf(recent_production[,1],plot = F)
## 
## Autocorrelations of series 'recent_production[, 1]', by lag
## 
##   0.00   0.25   0.50   0.75   1.00   1.25   1.50   1.75   2.00   2.25   2.50 
##  1.000 -0.053 -0.758 -0.026  0.802 -0.077 -0.657  0.001  0.707 -0.089 -0.588 
##   2.75   3.00   3.25   3.50   3.75   4.00 
##  0.024  0.632 -0.066 -0.505 -0.009  0.498

Els valors del vecto acf són \(r_1,…,r_9\), corresponents als nou diagrames de dispersió de la Figura 1.7. Normalment representem l’ACF per veure com canvien les correlacions amb el retard \(k\). El gràfic de vegades es coneix com a correlograma. Tenir en compte que en el mètode stats apareix \(r_0\), que sempre és \(r_0=1\) que no ho fa en altres funcions ACF d’altres llibreries.

stats::acf(recent_production[,1],plot = T, panel.first = grid(), main= "")
title(main = "Producció de cervesa a Austràlia")
Figura 1.8: Funció d'autocorrelació de la producció trimestral de cervesa.

Figura 1.8: Funció d’autocorrelació de la producció trimestral de cervesa.

En aquest gràfic:

  • \(r_4\) és més alt que per als altres retards. Això es deu al patró estacional de les dades: els pics tendeixen a estar separats per quatre trimestres i els mínims tendeixen a estar separats per quatre trimestres.
  • \(r_2\) és més negatiu que per als altres retards perquè els mínims tendeixen a estar dos trimestres per darrere dels pics.
  • Les línies blaves discontínues indiquen si les correlacions són significativament diferents de zero

Tendència i estacionalitat en els gràfics ACF

Quan les dades tenen una tendència, les autocorrelacions per a retards petits tendeixen a ser grans i positives perquè les observacions properes en el temps també són properes en valor. Per tant, l’ACF d’una sèrie temporal amb tendència tendeix a tenir valors positius que disminueixen lentament a mesura que augmenten els retards.

Quan les dades són estacionals, les autocorrelacions seran més grans per als retards estacionals (en múltiples del període estacional) que per a altres retards.

Quan les dades tenen tendència i són estacionals, es veu una combinació d’aquests efectes. Les dades a10 representades a la Figura 1.2 mostren tant la tendència com l’estacionalitat. El seu ACF es mostra a la Figura 1.9. La lenta disminució de l’ACF a mesura que augmenten els retards es deu a la tendència, mentre que la forma ondulada es deu a l’estacionalitat.

stats::acf(fpp2::a10, plot = T, panel.first = grid(), main= "")
title(main = "Vendes de fàrmacs antidiabètics a Australia")

Soroll blanc

Les sèries temporals que no mostren autocorrelació s’anomenen soroll blanc. La Figura 1.9 dóna un exemple d’una sèrie de soroll blanc.

set.seed(18061962)
y <- ts(rnorm(500), start = 1, end = 500)

sb1 <- ggplot2::autoplot(y) +
  labs(title = "Soroll blanc: Sèrie temporal") +
  theme_bw()

sb2 <- stats::acf(y, plot = F) %>% 
  ggplot2::autoplot() +
  labs(title = "Soroll blanc: Anàlisi de la funció d'autocorrelació") +
  theme_bw()


sb1 / sb2
Figura 1.9: Sèrie temporal fictícia de soll blanc i funció d'autocorrelació.

Figura 1.9: Sèrie temporal fictícia de soll blanc i funció d’autocorrelació.

Per a sèries de soroll blanc, esperem que cada autocorrelació sigui propera a zero. Per descomptat, no seran exactament iguals a zero, ja que hi ha alguna variació aleatòria. Per a una sèrie de soroll blanc, esperem que el 95% dels pics de l’ACF es trobin dins de \(±1,96/√T\), on \(T\) és la longitud de la sèrie temporal.

És habitual representar aquests límits en un gràfic de l’ACF (les línies blaves discontínues de dalt). Si un o més pics grans estan fora d’aquests límits, o si substancialment més del 5% dels pics estan fora d’aquests límits, aleshores la sèrie probablement no és soroll blanc. En aquest exemple, T = 50 i, per tant, els límits són de \(±1,96/√50 = ±0,28\). Tots els coeficients d’autocorrelació es troben dins d’aquests límits, cosa que confirma que les dades són soroll blanc.

Descomposició de sèries temporals

Les dades de sèries temporals poden presentar una varietat de patrons, i sovint és útil dividir una sèrie temporal en diversos components, cadascun dels quals representa una categoria de patrons subjacent. Sovint això es fa per ajudar a millorar la comprensió de la sèrie temporal, però també es pot utilitzar per millorar la precisió de la previsió.

A l’hora de descompondre una sèrie temporal, de vegades és útil primer transformar o ajustar la sèrie per tal de fer que la descomposició (i l’anàlisi posterior) sigui el més senzilla possible. Per tant, començarem per parlar de les transformacions i els ajustos.

Transformacions i ajustaments

L’ajustament de les dades històriques sovint pot conduir a una sèrie temporal més senzilla. Aquí tractem quatre tipus d’ajustos: ajustaments de calendari, ajustaments de població, ajustaments d’inflació i transformacions matemàtiques.

Ajustaments de calendari

Part de la variació que es veu a les dades estacionals pot ser deguda a simples efectes de calendari.

Per exemple, si esteu estudiant les vendes mensuals totals en una botiga minorista, hi haurà variació entre els mesos simplement a causa del nombre diferent de dies d’obertura de cada mes, a més de la variació estacional al llarg de l’any. És fàcil eliminar aquesta variació calculant les vendes mitjanes per dia de negociació de cada mes, en lloc de les vendes totals del mes. Aleshores, eliminem efectivament la variació del calendari.

Ajustaments de població

Qualsevol dada que es vegi afectada pels canvis de població es pot ajustar per obtenir dades per càpita.

Això es pot veure utilitzant dades de Catalunya.

PIB_ctalunya <- read.csv("datosr/PIB_catalunya.csv",
         header = T,
         sep = ",")

pib <- 
  PIB_ctalunya %>% 
  select(1,5,6) %>% 
  rename(Any=X,PIB=PIB.revisión.2024..millones.de.euros.,Pob.=Población..a.1.de.julio.) %>% 
  mutate(PIB= round(PIB*1000000),
         PIB_cap = round(PIB/Pob.),
         Any= as.integer(stringr::str_sub(Any,1,4))
         ) %>% 
  arrange(Any) %>% 
  tibble::column_to_rownames(var = "Any")

tsgdp <- stats::ts(pib, start = c(2000,1), frequency = 1)

gdp <- tsgdp[,1] %>% 
  ggplot2::autoplot() +
  scale_y_continuous(labels = function(y) y/1000000000)+
  labs(title = "PIB en milers en valors absoluta")+
  ylab("PIB en milers \nde milions de euros")+
  xlab("Temps (anys)") +
  theme_bw()

pob <- tsgdp[,2] %>% 
  ggplot2::autoplot() +
  ggtitle("Població de Catalunya") +
  ylab("Població en nombre d'habitants")+
  xlab("Temps (anys)") +
  theme_bw()

gdpc <- tsgdp[,3] %>% 
  ggplot2::autoplot() +
  ggtitle("PIB per càpita") +
  ylab("PIB per càpita en euros")+
  xlab("Temps (anys)") +
  theme_bw()


gdp /pob / gdpc +
  plot_annotation(title = 'PIB, Població i PIB per càpita a Catalunya, anys 2000 - 2024',
                    #subtitle = 'Subtitle',
                    caption = "Data from Institut d'Estadística de Catalunya - IDESCAT (https://www.idescat.cat/pub/?id=piba&n=10442&lang=es)",
                  theme = theme(plot.title = element_text(size = 15, hjust = 0.5)))
Figura 1.10: PIB per cápita a Catalunya

Figura 1.10: PIB per cápita a Catalunya

Ajustaments per inflació

És millor ajustar les dades que es veuen afectades pel valor dels diners abans de la modelització. Per exemple, el cost mitjà d’una casa nova haurà augmentat durant les últimes dècades a causa de la inflació. Per aquest motiu, les sèries temporals financeres solen ajustar-se de manera que tots els valors s’indiquin en dòlars d’un any concret. Per exemple, les dades del preu de l’habitatge es poden expressar en euros de l’any 2000.

Ajustaments matemàtics

Si les dades mostren una variació que augmenta o disminueix amb el nivell de sèrie, una transformació pot ser útil. Per exemple, una transformació logarítmica ho sol ser. Si denotem les observacions originals com a \(y₁,…,yᵀ\) i les transformades com a \(w₁,…,wᵀ\), llavors \(wᵀ = log(yᵀ)\). Els logaritmes són útils perquè són interpretables: els canvis en un valor logarítmic són canvis relatius (o percentuals) a l’escala original. Així, si s’utilitza el logaritme en base 10, un augment d’1 a l’escala logarítmica correspon a una multiplicació per 10 a l’escala original. Si algun valor de la sèrie original és zero o negatiu, no és possible aplicar-hi logaritmes.

De vegades també s’utilitzen altres transformacions (tot i que no són tan interpretables). Per exemple, es poden fer servir arrels quadrades i cúbiques. Aquestes es denominen transformacions de potència perquè es poden escriure com a \(wᵀ = yᵀp_t\).

Trasformacions de Box-Cox

Una família útil de transformacions, que inclou tant logaritmes com transformacions de potència, és la família de transformacions de Box-Cox (Box & Cox, 1964), que depenen del paràmetre λ i es defineixen de la manera següent:2

\[ \begin{equation} w_t = \begin{cases} \log(y_t) & \text{si }\lambda=0; \\ (\text{sign}(y_t)|y_t|^\lambda-1)/\lambda & \text{si } \lambda \neq 0. \end{cases} \end{equation}\tag{3.1} \]

En realitat, es tracta d’una transformació de Box-Cox modificada, analitzada a Bickel i Doksum (1981), que permet valors negatius de \(y_t\) sempre que λ>0.

El logaritme en una transformació de Box-Cox és sempre un logaritme natural (és a dir, en base \(e\)). Per tant, si \(λ=0\) s’utilitzen logaritmes naturals, però si \(λ≠0\) s’utilitza una transformació de potència, seguida d’un escalat simple.

Si \(λ=1\), aleshores \(w_t=i_{t−1}\), per la qual cosa les dades transformades es desplacen cap avall, però no hi ha canvis en la forma de la sèrie temporal. Per a tots els altres valors de λ, la sèrie temporal canviarà de manera.

Per trobar el \(\lambda\) òptim sembla que tenim 2 alternatives:

forecast::BoxCox.lambda()

tsausprod <- stats::ts(aus_production,start = c(1956,1), frequency = 4)
  
lambda<- forecast::BoxCox.lambda(tsausprod[,7], method = "guerrero")
lambda
## [1] 0.1095382

i fabletools::features()

lambda2 <- aus_production |>
  fabletools::features(Gas, features = guerrero) |>
  pull(lambda_guerrero)

lambda2
## [1] 0.1095171

En ambdós casos fem servir el mètode guerrero (Guerrero, V. M. (1993). Ara que tenim lambda podem aplicar la transformació:

library(patchwork)

gas1 <- tsausprod[,7] %>% 
  ggplot2::autoplot() +
  ggtitle("Serie original") +
  theme_bw()

gastransf <- forecast::BoxCox(tsausprod[,7],lambda = lambda) %>% 
  ggplot2::autoplot() +
  ggtitle("Serie transormada - Metode Box-Cox") +
  theme_bw()

gas1 / gastransf +
  plot_annotation(title = 'Producció de gas a Australia: Sèrie temporal original \ni sèrie amb tranformació, mètode Box-Cox',
                    #subtitle = 'Subtitle',
                    caption = "",
                  theme = theme(plot.title = element_text(size = 15, hjust = 0.5)))
Figua 1.11: Producció trimestral de gas australiana transformada amb el paràmetre λ seleccionat amb el mètode Guerrero.

Figua 1.11: Producció trimestral de gas australiana transformada amb el paràmetre λ seleccionat amb el mètode Guerrero.

A la gràfica de sota es pot apreciar la variabilitat menuys acusada que genera la transformació Box-Cox.

Components de les sèries temporals

Si assumim una descomposició additiva, podem escriure \[ y_t=S_t+T_t+R_t, \] on \(y_t\) són les dades, \(S_t\) és el component estacional, \(T_t\) és el component del cicle de tendència i \(R_t\) és el component restant, tots en el període \(t\). Alternativament, una descomposició multiplicativa s’escriuria com \[ y_t=S_t×T_t×R_t. \] La descomposició additiva és la més adequada si la magnitud de les fluctuacions estacionals, o la variació al voltant del cicle de tendència, no varia amb el nivell de la sèrie temporal. És a dir, la descomposició additiva funciona millor quan els pics i els mínims estacionals mantenen una amplitud constant (per exemple, més/menys 10 unitats), independentment de si la tendència és ascendent, descendent o plana.

Quan la variació en el patró estacional, o la variació al voltant del cicle de tendència, sembla ser proporcional al nivell de la sèrie temporal, aleshores una descomposició multiplicativa és més adequada. Les descomposicions multiplicatives són habituals amb les sèries temporals econòmiques.

Una alternativa a l’ús d’una descomposició multiplicativa és transformar primer les dades fins que la variació de la sèrie sembli estable al llarg del temps i després utilitzar una descomposició additiva. Quan s’ha utilitzat una transformació logarítmica, això és equivalent a utilitzar una descomposició multiplicativa sobre les dades originals perquè \(y_t=S_t×T_t×R_t\) és equivalent a \(\text{log }y_t=\text{log }S_t+\text{log }T_t+\text{log }R_t\).

Exemple: ocupació en el sector comerç als Estats Units

us_retail_employment <- us_employment |>
  filter(year(Month) >= 1990, Title == "Retail Trade") |>
  select(-Series_ID)
autoplot(us_retail_employment, Employed) +
  labs(y = "Persones (en milers)",
       title = "Ocupació total en el comerç als EEUU")+
  theme_bw()
Figura 1.12

Figura 1.12

En tot cas, tenim tres possible mètode que podem fe servir per fer la descomposició:

stats::stl()

# fixar-se en 'as.numeric...'
stats::stl(stats::ts(as.numeric(us_retail_employment$Employed), start = c(1990,1), 
          end = c(2019,9),frequency = 12), 
          s.window = 12)$time.series |>
  head()
##            seasonal    trend    remainder
## Jan 1990  -38.06049 13290.78   3.08253902
## Feb 1990 -261.00027 13271.52 -44.21909739
## Mar 1990 -291.10998 13252.26 -22.95079515
## Apr 1990 -220.79137 13233.00   0.08917965
## May 1990 -114.51926 13212.84   9.97524478
## Jun 1990  -25.60005 13192.69  15.71421123

forecast::mstl()

mstl_aus <- 
  forecast::mstl(stats::ts(us_retail_employment$Employed, start = c(1990,1), 
          end = c(2019,9), frequency = 12))

mstl_aus |> head()
##             Data    Trend Seasonal12   Remainder
## Jan 1990 13255.8 13288.01  -33.04706   0.8358973
## Feb 1990 12966.3 13269.10 -258.19042 -44.6052068
## Mar 1990 12938.2 13250.18 -289.87277 -22.1073302
## Apr 1990 13012.3 13231.26 -220.01752   1.0529563
## May 1990 13108.3 13211.41 -114.39559  11.2815978
## Jun 1990 13182.8 13191.56  -24.26610  15.5026778

feasts::model(stl = STL()

dcmp <- us_retail_employment |>
  model(stl = STL(Employed))
components(dcmp) %>% head()
## # A dable: 6 x 7 [1M]
## # Key:     .model [1]
## # :        Employed = trend + season_year + remainder
##   .model     Month Employed  trend season_year remainder season_adjust
##   <chr>      <mth>    <dbl>  <dbl>       <dbl>     <dbl>         <dbl>
## 1 stl    1990 ene.   13256. 13288.       -33.0     0.836        13289.
## 2 stl    1990 feb.   12966. 13269.      -258.    -44.6          13224.
## 3 stl    1990 mar.   12938. 13250.      -290.    -22.1          13228.
## 4 stl    1990 abr.   13012. 13231.      -220.      1.05         13232.
## 5 stl    1990 may.   13108. 13211.      -114.     11.3          13223.
## 6 stl    1990 jun.   13183. 13192.       -24.3    15.5          13207.

En tots 3 casos veiem que les descomposicions són additives: els components tendència, estacional i residu, sumats, donen el valor de la dada originària.

A nivell de visualització farem servir la descomposició de forecast: la columna de tendència (que conté el cicle de tendència \(T_t\)) segueix el moviment global de la sèrie, ignorant qualsevol estacionalitat i fluctuacions aleatòries, tal com es mostra a la figura 1.13.

mstl_aus[,1:2] %>% 
  autoplot() +
  theme_bw() +
  geom_line(linewidth = 1) +
  scale_color_manual(labels = c("Dades", "Tendència"), 
                     values = c("dodgerblue3", "darkred"))+
  labs(title = "Ocupació total al comerç minorista d'EEUU", x = "Temps",y = "Persones (milers)", color = "Sèries")
Figura 1.13: Nombre total de persones ocupades en el comerç minorista dels EUA: el component de tendència del cicle i les dades brutes.

Figura 1.13: Nombre total de persones ocupades en el comerç minorista dels EUA: el component de tendència del cicle i les dades brutes.

Els tres components es poden mostrar per separat al gràfic següent. Aquests components es poden afegir junts per reconstruir les dades que es mostren al panell superior. Fexeu-vos en l’escala diferent dels panells inferiors.

mstl_aus %>% 
  ggplot2::autoplot() +
  theme_bw() +
  geom_line(linewidth = 1) +
  labs(title = "Ocupació total al comerç minorista d'EEUU", x = "Temps", y = "Persones (milers)")
Figura 1.14: El nombre total de persones ocupades en el comerç minorista dels EUA (a dalt) i els seus tres components additius.

Figura 1.14: El nombre total de persones ocupades en el comerç minorista dels EUA (a dalt) i els seus tres components additius.

Dades ajustades estacionalment

Si el component estacional s’elimina de les dades originals, els valors resultants són les dades “ajustades estacionalment”. Per a una descomposició additiva, les dades ajustades estacionalment es donen mitjançant \(y_t−S_t\), i per a les dades multiplicatives, els valors ajustats estacionalment s’obtenen mitjançant \(y_t/S_t\).

La figura 1.5 mostra el nombre de persones ocupades ajustat estacionalment.

 cbind(mstl_aus[,1], (mstl_aus[,1]-mstl_aus[,3])) %>% # Notar la la resta
  ggplot2::autoplot() +
  geom_line(linewidth = 1)+
  scale_color_manual(labels = c("Dades", "Dades ajustades \nestacionalment"), 
                     values = c("dodgerblue3", "darkorange"))+
  labs(title = "Ocupació total al comerç minorista d'EEUU", x = "Temps",y = "Persones (milers)", color = "Sèries")+
  theme_bw()
Figura 1.15

Figura 1.15

Si la variació deguda a l’estacionalitat no és d’interès primari, la sèrie ajustada estacionalment pot ser útil. Per exemple, les dades mensuals d’atur solen ajustar-se estacionalment per tal de destacar la variació deguda a l’estat subjacent de l’economia en lloc de la variació estacional.

Les sèries ajustades estacionalment contenen el component “resta” (“remainder”), així com el component cicle-tendència. Per tant, no són “suaus”, i els “girs amunt” o avall poden ser enganyosos. Si l’objectiu és buscar punts d’inflexió en una sèrie i interpretar qualsevol canvi de direcció, és millor utilitzar el component de cicle-tendència en lloc de les dades ajustades estacionalment.

Mèdies mòbils

El primer pas en una descomposició clàssica és utilitzar un mètode de mitjana mòbil per estimar el cicle de tendència, per la qual cosa comencem parlant de les mitjanes mòbils.

Una mitjana mòbil d’ordre \(m\) es pot escriure com \[ \hat T_t=\frac1m∑_{j=−k}^k y_{t+j},\tag{3.2} \] on m=\(2k+1\). És a dir, l’estimació del cicle-tendència en el temps \(t\) s’obté fent la mitjana dels valors de la sèrie temporal dins de \(k\) períodes de \(t\). Les observacions que són properes en el temps també són probables que tinguin un valor proper. Per tant, la mitjana elimina part de l’aleatorietat de les dades, deixant un component de cicle-tendència suau. Anomenem això \(m\text{-}MA\), és a dir, una mitjana mòbil d’ordre \(m\).

Per exemple considerem la taula següent que mostra les exportacions de béns i serveis d’Espanya com a percentatge del PIB del 1960 al 2017:

ma1 <- global_economy[global_economy$Code=="ESP",c(3,8)] |>
  ts(start = c(1960,1), frequency =1) |>
  stats::filter(filter = rep(1/5,5),sides = 2) |>
  cbind(global_economy[global_economy$Code=="ESP", 8]) |> 
  as.data.frame() %>% select(1,3,2)


names(ma1) <- c("Any",  "Exports",  "`5-MA`")

rbind(head(ma1),tail(ma1)) |> 
  flextable::flextable() |>
  flextable::width(width = 1.5) |>
  flextable::set_caption("Exportacions espanyoles anuals de béns i serveis: 1960–2017", 
                       word_stylename= "Arial") |>
  flextable::colformat_num(j=1,big.mark = "")
Exportacions espanyoles anuals de béns i serveis: 1960–2017

Any

Exports

`5-MA`

8.366730

7.972356

1962

8.303654

8.233358

1963

7.712289

8.198643

1964

8.811759

8.382742

1965

8.193160

8.432235

2012

30.699980

30.013983

2013

32.217535

31.498136

2014

32.712995

32.303435

2015

32.940061

32.981999

32.946603

34.092804

A l’última columna d’aquesta taula, es mostra una mitjana mòbil d’ordre 5, que proporciona una estimació del cicle de tendència. El primer valor d’aquesta columna és la mitjana de les cinc primeres observacions, 1960–1964; el segon valor de la columna 5-MA és la mitjana dels valors de 1961–1965; i així successivament. Cada valor de la columna 5-MA és la mitjana de les observacions de la finestra de cinc anys centrada en l’any corresponent. En la notació de l’equació (3.2), la columna 5-MA conté els valors de \(\hat T_t\) amb \(k=2\) i \(m=2k+1=5\). No hi ha valors ni per als dos primers anys ni per als dos últims anys, perquè no tenim dues observacions a cap costat. Més endavant utilitzarem mètodes més sofisticats d’estimació de cicle de tendència que permeten estimacions prop dels punts finals. En el nostre cas hem utilitzat la funció filter de stats.

ts(ma1, start = c(1960,1), frequency = 1)[,2:3] %>% 
  ggplot2::autoplot() +
  geom_line(linewidth = 1) +
  labs(title = "Exportacions d'Espanya 1960-2017: dades brutes i mitjanes mòbils",
       x= "Anys", y= "Volum en % del PIB", color= "Sèries") +
  theme_bw()
Figura 1.16

Figura 1.16

Observeu que el cicle de tendència (en taronja) és més suau que les dades originals i captura el moviment principal de la sèrie temporal sense totes les fluctuacions menors. L’ordre de la mitjana mòbil determina la suavitat de l’estimació del cicle de tendència. En general, un ordre més gran significa una corba més suau.

Mitjanes mòbils de mitjanes mòbils

És possible aplicar una mitjana mòbil a una mitjana mòbil. Una raó per fer-ho és fer que una mitjana mòbil d’ordre parell sigui simètrica.

Per exemple, podríem prendre una mitjana mòbil d’ordre 4 i després aplicar una altra mitjana mòbil d’ordre 2 als resultats. A la taula següent, això s’ha fet durant els primers anys de les dades trimestrals de producció de cervesa australiana.

Dades de consum de cervesa a Austràlia: 1992–2010

Quarter

Beer

4-MA

2x4-MA

1992 Q1

443

1992 Q2

410

451.25

1992 Q3

420

448.75

450.000

1992 Q4

532

451.50

450.125

1993 Q1

433

449.00

450.250

1993 Q2

421

444.00

446.500

2009 Q1

415

430.00

428.875

2009 Q2

398

430.00

430.000

2009 Q3

419

429.75

429.875

2009 Q4

488

423.75

426.750

2010 Q1

414

2010 Q2

374

La notació “2×4 -MA” a l’última columna significa una 4-MA seguida d’una 2-MA. Els valors de l’última columna s’obtenen prenent una mitjana mòbil d’ordre 2 dels valors de la columna anterior.

Quan una 2-MA segueix una mitjana mòbil d’ordre parell (com ara 4), s’anomena “mitjana mòbil centrada d’ordre 4”. Això és degut a que els resultats ara són simètrics. Per veure que aquest és el cas, podem escriure la 2×4-MA de la següent manera:

\[ \begin{align*} \hat{T}_{t} &= \frac{1}{8}y_{t-2}+\frac14y_{t-1} + \frac14y_{t}+\frac14y_{t+1}+\frac18y_{t+2}. \end{align*} \] Ara és una mitjana ponderada d’observacions que és simètrica.

Estimació del cicle de tendència amb dades estacionals

L’ús més comú de les mitjanes mòbils centrades és per estimar el cicle de tendència a partir de dades estacionals. Considereu la mitjana mòbil 2×4: \[ \begin{align*} \hat{T}_{t} &= \frac{1}{8}y_{t-2}+\frac14y_{t-1} + \frac14y_{t}+\frac14y_{t+1}+\frac18y_{t+2}. \end{align*} \]

Quan s’aplica a dades trimestrals, a cada trimestre de l’any se li dóna el mateix pes, ja que el primer i l’últim terme s’apliquen al mateix trimestre en anys consecutius. En conseqüència, la variació estacional es calcularà la mitjana i els valors resultants de \(\hat T_t\) tindran poca o cap variació estacional restant. S’obtindria un efecte similar utilitzant una mitjana mòbil de 28 o una mitjana mòbil de 2×12 a dades trimestrals. En general, una mitjana mòbil de \(2×m\) és equivalent a una mitjana mòbil ponderada d’ordre \(m+1\) on totes les observacions prenen el pes \(1/m\), excepte el primer i l’últim terme que prenen pesos \(1/(2m)\). Per tant, si el període estacional és parell i d’ordre \(m\), utilitzem una mitjana mòbil de \(2×m\) per estimar el cicle de tendència. Si el període estacional és senar i d’ordre \(m\), utilitzem una mitjana mòbil de \(2×m\) per estimar el cicle de tendència. Per exemple, una MA de \(2×12\) es pot utilitzar per estimar el cicle de tendència de les dades mensuals amb estacionalitat anual i una MA de 7 es pot utilitzar per estimar el cicle de tendència de les dades diàries amb una estacionalitat setmanal.

Altres opcions per a l’ordre de la MA normalment faran que les estimacions del cicle de tendència estiguin contaminades per l’estacionalitat de les dades.

Mitjanes mòbils ponderades

Les combinacions de mitjanes mòbils donen lloc a mitjanes mòbils ponderades. Per exemple, la mitjana mòbil de 2×4 que s’ha comentat anteriorment és equivalent a una mitjana mòbil de 5 ponderada amb pesos donats per \(\left[\frac{1}{8},\frac{1}{4},\frac{1}{4},\frac{1}{4},\frac{1}{8}\right]\). En general, una mitjana mòbil m ponderada es pot escriure com \[ \hat{T}_t = \sum_{j=-k}^k a_j y_{t+j},\tag{3.3} \]

on \(k=(m−1)/2\), i els pesos es donen per \([a−k,…,ak]\). És important que tots els pesos sumin a un i que siguin simètrics de manera que \(a_j=a_{−j}\) . La mitjana mòbil \(m\) simple és un cas especial on tots els pesos són iguals a \(1/m\).

Un avantatge important de les mitjanes mòbils ponderades és que donen una estimació més suau del cicle de tendència. En lloc que les observacions entrin i surtin del càlcul amb el seu pes complet, els seus pesos augmenten lentament i després disminueixen lentament, donant lloc a una corba més suau.

Desomposició clàssica

És un procediment relativament senzill i constitueix el punt de partida per a la majoria dels altres mètodes de descomposició de sèries temporals. Hi ha dues formes de descomposició clàssica: una descomposició additiva i una descomposició multiplicativa. A continuació es descriuen per a una sèrie temporal amb un període estacional m (per exemple, m=4 per a dades trimestrals, m=12 per a dades mensuals, m=7 per a dades diàries amb un patró setmanal).

En la descomposició clàssica, assumim que el component estacional és constant d’un any a l’altre. Per a l’estacionalitat multiplicativa, els valors \(m\) que formen el component estacional de vegades s’anomenen “índexs estacionals”.

Descomposició additiva

Pas 1

Si \(m\) és un nombre parell, calculeu el component de cicle de tendència \(\hat T_t\) utilitzant una MA \(2×m\). Si \(m\) és un nombre senar, calculeu el component de cicle de tendència \(\hat T_t\) utilitzant una MA \(m\).

Pas 2

Calculeu la sèrie sense tendència: \(y_t−\hat T_t\).

Pas 3

Per estimar el component estacional per a cada temporada, simplement feu la mitjana dels valors sense tendència per a aquesta temporada. Per exemple, amb dades mensuals, el component estacional del març és la mitjana de tots els valors sense tendència del març de les dades. Aquests valors del component estacional s’ajusten per garantir que sumin zero. El component estacional s’obté encadenant aquests valors mensuals i després replicant la seqüència per a cada any de dades. Això dóna \(\hat S_t\).

Pas 4

El component restant es calcula restant els components estacionals i de cicle de tendència estimats: \(\hat R_t=y_t−\hat T_t−\hat S_t\).

Amb R això es pot executar mitjançant l’ordre decompose()

ts(us_retail_employment[,3], start = c(1990,1), end = 2019,9, frequency = 12) |>
  decompose(type = "additive") |>
  ggplot2::autoplot() +
  labs(title = "Ocupació al comenrç minorista USA: Descomposició clàssica additiva",
       x= "Temps", y= "Persones (milers)")+
  theme_bw()
Figura 1.17

Figura 1.17

Descomposició multiplicativa

Una descomposició multiplicativa clàssica és similar, excepte que les restes es substitueixen per divisions.

Pas 1

El mateix.

Pas 2

Calculeu la sèrie sense tendència: \(y_t/\hat T\).

Pas 3

El mateix.

Pas 4

El component restant es calcula dividint els components estacional i de cicle de tendència estimats: \(\hat R_t=y_t/(\hat T_t \hat S_t)\).

Tot i que la descomposició clàssica encara s’utilitza àmpliament, no es recomana, ja que ara hi ha diversos mètodes molt millors. Alguns dels problemes amb la descomposició clàssica es resumeixen a continuació.

  • L’estimació del cicle-tendència no està disponible per a les primeres i últimes observacions. -L’estimació del cicle-tendència tendeix a suavitzar en excés les pujades i baixades ràpides de les dades. -Els mètodes de descomposició clàssics assumeixen que el component estacional es repeteix any rere any. Per a moltes sèries, aquesta és una suposició raonable, però per a algunes sèries més llargues no ho és.
  • Ocasionalment, els valors de les sèries temporals en un nombre reduït de períodes poden ser particularment inusuals. Per exemple, el trànsit mensual de passatgers aeris pot veure’s afectat per un conflicte laboral, fent que el trànsit durant el conflicte sigui diferent de l’habitual. El mètode clàssic no és robust a aquest tipus de valors inusuals.

Desomposició STL

STL és un mètode versàtil i robust per descompondre sèries temporals. STL és un acrònim de “Descomposició estacional i de tendències utilitzant Loess”, sent loess un mètode per estimar relacions no lineals. El mètode STL va ser desenvolupat per R. B. Cleveland et al. (1990), i posteriorment ampliat per gestionar múltiples patrons estacionals per Bandara et al. (2025).

STL té diversos avantatges respecte a la descomposició clàssica i els mètodes SEATS i X-11:

A diferència de SEATS i X-11, STL gestionarà qualsevol tipus d’estacionalitat, no només dades mensuals i trimestrals.

  • El component estacional pot canviar amb el temps i l’usuari pot controlar la taxa de canvi.
  • La suavitat del cicle de tendència també pot ser controlada per l’usuari.
  • Pot ser robust als valors atípics (és a dir, l’usuari pot especificar una descomposició robusta), de manera que les observacions inusuals ocasionals no afectaran les estimacions dels components del cicle de tendència i estacionals. Tanmateix, afectaran el component restant.

D’altra banda, STL té alguns desavantatges. En particular, no gestiona automàticament la variació del dia de negoci o del calendari, i només proporciona funcions per a descomposicions additives**.

Es pot obtenir una descomposició multiplicativa prenent primer els logaritmes de les dades i després transformant els components a l’inrevés. Les descomposicions que es troben entre additives i multiplicatives es poden obtenir mitjançant una transformació de Box-Cox de les dades amb 0 < λ < 1 . Un valor de λ = 0 dóna una descomposició multiplicativa mentre que λ = 1 dóna una descomposició additiva.

ts(us_retail_employment[,3], start = c(1990,1), end = 2019,9, frequency = 12) |>
  stl(s.window = 'periodic', t.window = 7, robust = T) |>
  ggplot2::autoplot()+
  labs(title = "Ocupació al comenrç minorista USA: Descomposició per STL",
       x= "Temps", y= "Persones (milers)")+
  theme_bw()
Figura 1.18: Ocupació total al comerç minorista dels EUA (a dalt) i els seus tres components additius obtinguts a partir d'una descomposició STL robusta amb cicle de tendència flexible i estacionalitat fixa.

Figura 1.18: Ocupació total al comerç minorista dels EUA (a dalt) i els seus tres components additius obtinguts a partir d’una descomposició STL robusta amb cicle de tendència flexible i estacionalitat fixa.

Els dos paràmetres principals que s’han de triar quan s’utilitza STL són la finestra del cicle de tendència t.window = ? i la finestra estacional s.window = ?. Aquests controlen la rapidesa amb què poden canviar els components del cicle de tendència i estacionals. Valors més petits permeten canvis més ràpids. Tant les finestres de tendència com les estacionals han de ser nombres senars; la finestra de tendència és el nombre d’observacions consecutives que s’han d’utilitzar a l’hora d’estimar el cicle de tendència; la finestra de temporada és el nombre d’anys consecutius que s’han d’utilitzar per estimar cada valor del component estacional. Establir la finestra estacional com a infinita equival a forçar el component estacional a ser s.window='periodic' periòdic (és a dir, idèntic entre anys). Aquest és el cas de la Figura 1.18.


  1. En altres textos, ACF es representa com \[ \rho_k(s,t)=\frac{\gamma(s,t)}{\sqrt{\gamma(s)\gamma(t)}} \] entenent \(\gamma(s,t)\) com covariança entre el punt s i t i \(\gamma(s)\) i \(\gamma(t)\) com les variances en els punts s i t.↩︎

  2. La formulació alternativa és \[ y_t^{(\lambda)}=\Bigg\{ \begin{array}{ll} \text{log }y_t & \text{si } \lambda=0; \\ \frac{y_t^\lambda-1}{\lambda} & \text{si } \lambda \neq 0 \end{array} \]↩︎