Začneme s inštaláciou knižníc potrebných na toto cvičenie. Spustením nasledovného príkazu sa nainštalujú tie z knižníc, ktoré nainštalované nie sú, a zároveň sa aj načítajú.
# názvy balíkov, ktoré budú potrebné pre cvičenie 5
packages <- c("astsa", "urca", "datasets", "ggplot2", "seasonal","fpp3")
# inštalácia balíkov, ak nie sú nainštalované
installed_packages <- packages %in% rownames(installed.packages())
if (any(installed_packages == FALSE)) {
install.packages(packages[!installed_packages],dependencies=TRUE)
}
# načítanie balíkov
invisible(lapply(packages, library, character.only = TRUE))
Uvažujme najprv klasický ARMA(1,1) proces, napríklad \((1 - 0.7 L)x_t = (1 + 0.8 L)u_t\), ktorý možno prepísať na \(x_t = 0.7 x_{t-1} + u_t + 0.8 u_{t-1}\).
V R-ku vieme takýto proces simulovať pomocou funkcie
arima.sim
ako
set.seed(123)
x <- arima.sim(model = list(ar = 0.7, ma = 0.8), n = 1000)
Pre simulovaný proces x
vieme potom spätne odhadnúť ARMA
koeficienty.
m <- sarima(x, 1, 0, 1, details = FALSE)
m$fit$coef
## ar1 ma1 xmean
## 0.67321585 0.79735653 0.09837353
Zopakujte uvedený postup pre sezónne procesy.
Cvičenie 1: Sezónny AR proces \((1 - 0.8 L)(1 + 0.9 L^4) x_t = u_t\).
x <- arima.sim(...)
m <- sarima(...)
m$fit$coef
Cvičenie 2: Sezónny MA proces \(x_t = (1 - 0.8 L)(1 + 0.9 L^4) u_t\)
x <- arima.sim(...)
m <- sarima(...)
m$fit$coef
Hlavnou náplňou tohto cvičenia je modelovanie sezónnych časových radov. Na začiatok si zopakujeme postup z prednášky na dátach AirPassengers a dokončime hľadanie SARIMA modelu pre druhé dáta z prednášky, dáta chicken. Následne budeme hľadať SARIMA model pre rôzne reálne dáta.
Zopakujeme postup hľadania SARIMA modelu pre dáta AirPassengers o počtoch cestujúcich aerolínkami.
plot(AirPassengers)
Z prednášky vieme, že treba pracovať s logaritmami dát, ktoré treba
diferencovať dvakrát - raz sezónne a raz normálne. Po prvom sezónnom
diferencovaní sa ďalej pozeráme na medziročné zmeny. Dvakrát
diferencované logaritmy následne uložme do premennej y
a
vykreslíme.
x <- log(AirPassengers)
y <- diff(diff(x, lag = 12))
plot(y)
abline(h=0, col="red")
abline(h=mean(y), col="blue")
Overíme, že v dátach y
už nie je jednotkový koreň a
preto dáta ďalej diferencovať netreba.
summary(ur.df(y, type="none", lags = 12, selectlags = "BIC" ))
##
## ###############################################
## # Augmented Dickey-Fuller Test Unit Root Test #
## ###############################################
##
## Test regression none
##
##
## Call:
## lm(formula = z.diff ~ z.lag.1 - 1 + z.diff.lag)
##
## Residuals:
## Min 1Q Median 3Q Max
## -0.130088 -0.026418 -0.000534 0.022915 0.124528
##
## Coefficients:
## Estimate Std. Error t value Pr(>|t|)
## z.lag.1 -1.36043 0.15459 -8.800 1.52e-14 ***
## z.diff.lag -0.01173 0.09256 -0.127 0.899
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## Residual standard error: 0.04295 on 116 degrees of freedom
## Multiple R-squared: 0.6916, Adjusted R-squared: 0.6863
## F-statistic: 130.1 on 2 and 116 DF, p-value: < 2.2e-16
##
##
## Value of test-statistic is: -8.8001
##
## Critical values for test statistics:
## 1pct 5pct 10pct
## tau1 -2.58 -1.95 -1.62
Hodnota testovej štatistiky je výrazne menšia ako kritická hodnota testu. Dáta nemajú jednotkový koreň a preto ich ďalej nediferencujeme.
Zobrazme ACF a PACF.
acf2(y)
Pozrime sa najprv na hodnoty ACF a PACF pre celé roky. Z ACF vidíme výrazne nenulovú hodnotu pre lag 12. Pre lagy 24, 36, 48, sú autokorelácie takmer nulové. PACF je rovnako výrazne nenulová pre lag 12. Pre nasledujúce lagy síce sú hodnoty PACF vnútri intervalu spoľahlivosti, ale klesajú pomalšie ako pri ACF. To nás motivuje skúsiť pri modelovaní použiť jeden sezónny MA člen.
Aby sme zachytili autokorelácie a parciálne autokorelácie na
začiatku, musíme do modelu pridať klasické členy. Priebeh však nie je
jednoznačný - zdá sa, že ani ACF ani PACF sa po niektorom lagu
nevynuluje. Obe majú naviac výrazne nenulové prvé hodnoty. Skúsme preto
použiť zmiešaný ARMA(1,1) model. Teda spolu so sezónnym MA členom,
uvažujme model sarima(x, 1, 1, 1, 0, 1, 1, 12)
.
Dostávame
sarima(x, 1, 1, 1, 0, 1, 1, 12)
## initial value -3.085211
## iter 2 value -3.225399
## iter 3 value -3.276697
## iter 4 value -3.276902
## iter 5 value -3.282134
## iter 6 value -3.282524
## iter 7 value -3.282990
## iter 8 value -3.286319
## iter 9 value -3.286413
## iter 10 value -3.288141
## iter 11 value -3.288262
## iter 12 value -3.288394
## iter 13 value -3.288768
## iter 14 value -3.288969
## iter 15 value -3.289089
## iter 16 value -3.289094
## iter 17 value -3.289100
## iter 17 value -3.289100
## iter 17 value -3.289100
## final value -3.289100
## converged
## initial value -3.288388
## iter 2 value -3.288459
## iter 3 value -3.288530
## iter 4 value -3.288649
## iter 5 value -3.288753
## iter 6 value -3.288781
## iter 7 value -3.288784
## iter 7 value -3.288784
## iter 7 value -3.288784
## final value -3.288784
## converged
## <><><><><><><><><><><><><><>
##
## Coefficients:
## Estimate SE t.value p.value
## ar1 0.1960 0.2475 0.7921 0.4298
## ma1 -0.5784 0.2132 -2.7127 0.0076
## sma1 -0.5643 0.0747 -7.5544 0.0000
##
## sigma^2 estimated as 0.001341097 on 128 degrees of freedom
##
## AIC = -3.678622 AICc = -3.677179 BIC = -3.59083
##
Všetky p-hodnoty Ljung-Boxovho testu sú väčšie ako 5%. Model vyzerá dobre. Z tabuľky koeficientov však vidíme, že koeficient ar1 nie je signifikantný (p.value = 0.4298), preto ho môžeme skúsiť vynechať.
sarima(x, 0, 1, 1, 0, 1, 1, 12)
## initial value -3.086228
## iter 2 value -3.267980
## iter 3 value -3.279950
## iter 4 value -3.285996
## iter 5 value -3.289332
## iter 6 value -3.289665
## iter 7 value -3.289672
## iter 8 value -3.289676
## iter 8 value -3.289676
## iter 8 value -3.289676
## final value -3.289676
## converged
## initial value -3.286464
## iter 2 value -3.286855
## iter 3 value -3.286872
## iter 4 value -3.286874
## iter 4 value -3.286874
## iter 4 value -3.286874
## final value -3.286874
## converged
## <><><><><><><><><><><><><><>
##
## Coefficients:
## Estimate SE t.value p.value
## ma1 -0.4018 0.0896 -4.4825 0
## sma1 -0.5569 0.0731 -7.6190 0
##
## sigma^2 estimated as 0.001348035 on 129 degrees of freedom
##
## AIC = -3.690069 AICc = -3.689354 BIC = -3.624225
##
P-hodnoty sa vylepšili, hodnota BIC klesla, oba koeficienty tohto modelu sú signifikantné. Dostali sme teda lepší model pre naše dáta. Uvedený model sa nazýva aj airline model.
Spravme predikcie na nasledujúce 2 roky.
sarima.for(x, 24, 0, 1, 1, 0, 1, 1, 12)
Vidíme, že sa zachováva rast aj pravidelná sezónnosť.
chicken
Nájdeme SARIMA model pre dáta chicken z prednášky.
data("chicken")
plot(chicken)
V dátach pozorujeme rastúci trend, preto dáta diferencujeme.
plot(diff(chicken))
abline(h=0, col="red")
abline(h=mean(diff(chicken)), col="blue")
Zobrazme autokorelačnú funkciu pre diferencie.
acf1(diff(chicken))
Z ACF nie je zrejmé, či dáta majú jednotkový koreň. Otestujte ho.
summary(ur.df(..., lag = ..., type = ..., selectlags = ...))
##
## ###############################################
## # Augmented Dickey-Fuller Test Unit Root Test #
## ###############################################
##
## Test regression drift
##
##
## Call:
## lm(formula = z.diff ~ z.lag.1 + 1 + z.diff.lag)
##
## Residuals:
## Min 1Q Median 3Q Max
## -2.14194 -0.41020 0.03508 0.42470 1.68715
##
## Coefficients:
## Estimate Std. Error t value Pr(>|t|)
## (Intercept) 0.10610 0.05407 1.962 0.0515 .
## z.lag.1 -0.35199 0.05458 -6.448 1.24e-09 ***
## z.diff.lag 0.30224 0.07438 4.063 7.52e-05 ***
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## Residual standard error: 0.6642 on 162 degrees of freedom
## Multiple R-squared: 0.217, Adjusted R-squared: 0.2074
## F-statistic: 22.45 on 2 and 162 DF, p-value: 2.472e-09
##
##
## Value of test-statistic is: -6.4484 20.7942
##
## Critical values for test statistics:
## 1pct 5pct 10pct
## tau2 -3.46 -2.88 -2.57
## phi1 6.52 4.63 3.81
Mali by ste dostať, že v dátach skutočne nie je jednotkový koreň. Preto dáta ďalej nie je potrebné diferencovať.
Zobrazte ACF a PACF pre diferencie.
acf2(diff(chicken))
ACF sa nevynuluje, má sínusový charakter. PACF má prvé dve hodnoty výrazne nenulové, tretia hodnota je na hranici. To je typické pre autoregresný proces. Očakávame preto buď AR(2) alebo AR(3).
PACF nemá výrazné hodnoty pri celých rokoch. Všimnime si však, že pravideľnosť priebehu ACF evidentne súvisí s celými rokmi. Preto očakávame prítomnosť sezónneho členu. Skúsme sezónny AR(1).
Otestujme ako prvý model
sarima(chicken, 3, 1, 0, 1, 0, 0, 12)
.
sarima(chicken, 3, 1, 0, 1, 0, 0, 12)
## initial value 0.012640
## iter 2 value -0.162710
## iter 3 value -0.432041
## iter 4 value -0.463369
## iter 5 value -0.471514
## iter 6 value -0.474594
## iter 7 value -0.474874
## iter 8 value -0.474878
## iter 9 value -0.474885
## iter 10 value -0.474885
## iter 11 value -0.474887
## iter 12 value -0.474887
## iter 12 value -0.474887
## final value -0.474887
## converged
## initial value -0.480069
## iter 2 value -0.480175
## iter 3 value -0.480258
## iter 4 value -0.480392
## iter 5 value -0.480422
## iter 6 value -0.480426
## iter 7 value -0.480426
## iter 7 value -0.480426
## iter 7 value -0.480426
## final value -0.480426
## converged
## <><><><><><><><><><><><><><>
##
## Coefficients:
## Estimate SE t.value p.value
## ar1 0.8885 0.0746 11.9031 0.0000
## ar2 -0.1459 0.0996 -1.4647 0.1448
## ar3 -0.1151 0.0750 -1.5352 0.1265
## sar1 0.3113 0.0724 4.2976 0.0000
## constant 0.2387 0.1735 1.3760 0.1706
##
## sigma^2 estimated as 0.3779479 on 174 degrees of freedom
##
## AIC = 1.944065 AICc = 1.946002 BIC = 2.050905
##
Model vyzerá dobre, ale v tabuľke koeficientov si môžeme všimnúť, že koeficient ar3 nie je signifikantný. Znížme preto počet klasických AR členov na 2.
sarima(chicken, 2, 1, 0, 1, 0, 0, 12)
## initial value 0.015039
## iter 2 value -0.226398
## iter 3 value -0.412955
## iter 4 value -0.460882
## iter 5 value -0.470787
## iter 6 value -0.471082
## iter 7 value -0.471088
## iter 8 value -0.471090
## iter 9 value -0.471092
## iter 10 value -0.471095
## iter 11 value -0.471095
## iter 12 value -0.471096
## iter 13 value -0.471096
## iter 14 value -0.471096
## iter 15 value -0.471097
## iter 16 value -0.471097
## iter 16 value -0.471097
## iter 16 value -0.471097
## final value -0.471097
## converged
## initial value -0.473585
## iter 2 value -0.473664
## iter 3 value -0.473721
## iter 4 value -0.473823
## iter 5 value -0.473871
## iter 6 value -0.473885
## iter 7 value -0.473886
## iter 8 value -0.473886
## iter 8 value -0.473886
## iter 8 value -0.473886
## final value -0.473886
## converged
## <><><><><><><><><><><><><><>
##
## Coefficients:
## Estimate SE t.value p.value
## ar1 0.9154 0.0733 12.4955 0.0000
## ar2 -0.2494 0.0739 -3.3728 0.0009
## sar1 0.3237 0.0715 4.5238 0.0000
## constant 0.2353 0.1973 1.1923 0.2347
##
## sigma^2 estimated as 0.3828137 on 175 degrees of freedom
##
## AIC = 1.945971 AICc = 1.947256 BIC = 2.035005
##
Všetky p-hodnoty sú stále nad 5%. Model je vyhovujúci.
Uvedené modely môžeme porovnať aj na základe BIC, pričom volíme model
s nižším BIC. V našom prípade je to model
sarima(chicken, 2, 1, 0, 1, 0, 0, 12)
. Pre tento model
urobme predikcie na nasledujúci rok.
sarima.for(chicken, 12, 2, 1, 0, 1, 0, 0, 12)
Pozrime sa ďalej na dáta exp o čínskom exporte z knižnice
seasonal
.
plot(exp)
Aby sme odstránili rastúcosť disperzie, budeme pracovať s logaritmami
dát. Na modelovanie použijeme dáta x
z rokov 2000 - 2012,
teda bez posledného roku. Dáta za posledný rok uložíme do premennej
x.pred
a použijeme ich na zhodnotenie kvality
predikcií.
x <- window(..., start= ... , end = ... )
x.pred <- window(..., start=...)
plot(x)
Zodpovedajte otázky:
Pre stacionárne dáta, ktoré ďalej netreba diferencovať, by ste mali dostať nasledovnú ACF a PACF.
acf2(x.d12.d1)
Aké tipy na sarima modely máte na základe ACF a PACF?
Určte najlepší z vyhovujúcich modelov na základe BIC.
Pre najlepší z modelov spravte predikcie na jeden rok. Porovnajte
s reálnymi dátami odloženými v premennej x.pred
.
Výsledok pre porovnanie:
Analyzujme harmonizovaný index spotrebiteľských cien (HICP) na Slovensku. HICP je štatistický ukazovateľ používaný na meranie inflácie, resp. zmien v cenovej hladine spotrebiteľských tovarov a služieb. Tento index je štandardizovaný pre krajiny Európskej únie a ďalšie štáty, aby umožnil porovnanie medzi krajinami.
Zdroj dát: https://fred.stlouisfed.org/series/CP0000SKM086NEST
Dáta môžete do R-ka jednoducho načítať príkazom
HICP.SK <- read.table("https://anna-hlubinova.github.io/HICP_Slovakia.txt", header = TRUE)
head(HICP.SK)
## DATE Value
## 1 1.1.1996 43.01
## 2 1.2.1996 43.12
## 3 1.3.1996 43.22
## 4 1.4.1996 43.35
## 5 1.5.1996 43.56
## 6 1.6.1996 43.63
Vytvorte z dát časový rad. Dáta za rok 2024 odložte do premennej
hicp.pred
. Pomocou týchto dát zhodnotíme predikcie. Pri
modelovaní budeme pracovať so skráteným časovým radom do konca roka
2023.
hicp.ts <- ts(... , frequency = ..., start = ...)
hicp <- window(hicp.ts, end = ...)
hicp.pred <- window(hicp.ts , start = ...)
Priebeh časového radu:
plot(hicp, type = "l")
Zodpovedajte otázky:
Pre stacionárne dáta, ktoré ďalej netreba diferencovať, by ste mali dostať nasledovnú ACF a PACF.
acf2(hicp.d1.d12)
Aké tipy na sarima model máte na základe ACF a PACF?
Určte najlepší z vyhovujúcich modelov na základe BIC.
Pre najlepší z modelov spravte predikcie na jeden rok. Porovnajte
s reálnymi dátami odloženými v premennej
hicp.pred
.
Výsledok pre porovnanie:
Modelujme dáta o nezamestanosti v USA dostupné v balíku
fpp3
pod názvom us_employment. Informácie o dátach
nájdete v helpe pomocou ?us_employment
.
Konkrétne budeme modelovať dáta v sektore Leisure and Hospitality (rekreácia a pohostinstvo) od januára 2001 do septembra 2019. Z dát vytvoríme časový rad.
leisure <- us_employment %>%
filter(Title == "Leisure and Hospitality",
year(Month) > 2000) %>%
mutate(Employed = Employed/1000) %>%
select(Month, Employed)
leisure <- ts(leisure$Employed, start = c(2001,1), end = c(2019,9),
frequency = 12)
Do premennej leisure.pred
si odložíme posledný rok dát
na zhodnotenie predikcií. Pri modelovaní budeme preto pracovať s časovým
radom skráteným o tento jeden rok.
leisure.pred <- window(leisure, start = ... )
leisure <- window(leisure, end = ... )
Priebeh časového radu:
Zodpovedajte otázky:
Pre stacionárne dáta, ktoré už netreba diferencovať, by ste mali dostať nasledovnú ACF a PACF.
acf2(leisure.d12.d1)
Aké tipy na sarima modely máte na základe ACF a PACF?
Určte najlepší z vyhovujúcich modelov na základe BIC.
Pre najlepší z modelov spravte predikcie na jeden rok. Porovnajte
s reálnymi dátami odloženými v premennej
leisure.pred
.
Výsledok pre porovnanie:
Postup aplikujeme na dáta o prietokoch Nílu z Cvičenia 2.
Pozn: Dáta neobsahujú sezónnosť, pretože ide o ročné údaje.
x <- Nile
plot(x)
V R-ku použijeme všeobecnejšiu funkciu HoltWinters
,
pričom zadáme parametre beta=FALSE, gamma=FALSE
, čo
zodpovedá práve exponenciálnemu zhladzovaniu.
model <- HoltWinters(x, beta=FALSE, gamma=FALSE)
model
## Holt-Winters exponential smoothing without trend and without seasonal component.
##
## Call:
## HoltWinters(x = x, beta = FALSE, gamma = FALSE)
##
## Smoothing parameters:
## alpha: 0.2465579
## beta : FALSE
## gamma: FALSE
##
## Coefficients:
## [,1]
## a 805.0389
Vykreslenie:
plot(model)
Hodnotu sum of squared errors, podľa ktorej sa vybrala optimálna \(\alpha\) vieme vypísať pomocou príkazu:
model$SSE
## [1] 2038872
Otázka: Viete nájsť fixné \(\alpha\) také, že dostanete menšiu hodnotu SSE?
Cvičenie: Vykreslite závislosť SSE od parametra \(\alpha\) pre tieto dáta. Výpočet má potvrdiť optimálnu hodnotu, ktorú našlo R-ko.
Výtup na porovnanie:
Detail:
Charakteristiky časového radu:
\(a_t\) = level, sezónne očistená stredná hodnota
\(b_t\) = slope, zmena hodnoty level z jednej periódy na druhú (zachytáva rôzne, aj krátkodobé trendy)
\(s_t\) = seasonal component, sezónna zložka (závisí napr. od mesiaca)
Typ sezónnosti:
Vráťme sa k dátam exp o čínskom exporte z knižnice
seasonal
. Na modelovanie opäť použijeme dáta z rokov
2000-2012, teda vynecháme posledný rok. Ten použijeme na zhodnotenie
kvality predikcií.
x <- window(log(exp), start=c(2000,1), end = c(2012,12))
x.pred <- window(log(exp), start=c(2013,1))
plot(x)
Cvičenie 1: Odhadnite optimálne parametre Holt-Wintersovej metódy (s aditívnou sezónnosťou, keďže sme logaritmovaním dosiahli stabilizovanie disperzie) a spravte predikcie na rok 2013.
Na nájdenie predikcií použite funkciu predict
. Predikcie
spolu s reálnymi dátami môžete vykresliť napríklad pomocou funkcie
ts.plot
.
Predikcie:
Cvičenie 2: Spravte predikcie z Holt-Wintersovej metódy s aditívnou sezónnosťou a pevne zvolenými parametrami \(\alpha=\beta=\gamma=\frac{1}{2}\) (teda každý člen sa berie s rovnakou váhou).
Predikcie:
Vykreslite do jedného obrázka dáta, predikcie nájdené pomocou SARIMA modelu a obe predikcie nájdené pomocou Holt-Wintersovej metódy.
Vráťme sa k dátam AirPassengers o počtoch cestujúcich aerolínkami.
plot(AirPassengers)
Vynechajte posledné dva roky, odhadnite Holt-Wintersov model a spravte predikcie. Porovnajte ich so skutočnými hodnotami.
Výstup pre kontrolu: