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.
G. J. Hyndman and G. Athanasopoulos, Forecasting: Principles and Practice,3rd edition, Chapters 2 and 3, 2021, OTexts: Melbourne, Australia. Disponible a otexts.com/.
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.
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)
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.
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.).
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.
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.
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.
Existeix una tendència quan hi ha un augment o una disminució a llarg termini de les dades. No ha de ser lineal.
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.
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.
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
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.
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
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.
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.
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
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.
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.
En aquest gràfic:
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")
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ó.
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.
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.
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.
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.
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
É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.
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\).
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.
A la gràfica de sota es pot apreciar la variabilitat menuys acusada que genera la transformació Box-Cox.
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\).
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
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.
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.
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
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.
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 = "")
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
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.
É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.
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.
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.
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.
É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”.
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\).
Calculeu la sèrie sense tendència: \(y_t−\hat T_t\).
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\).
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
Una descomposició multiplicativa clàssica és similar, excepte que les restes es substitueixen per divisions.
El mateix.
Calculeu la sèrie sense tendència: \(y_t/\hat T\).
El mateix.
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ó.
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.
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.
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.
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.↩︎
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} \]↩︎