x <- window(Nile, start = 1905)
plot(x)
Uvažujme AR(2) model z predchádzajúceho príkladu. Zapíšeme rovnicu, ktorá je výsledkom jeho odhadovania, pričom konštantný člen vypočítame pomocou pristupovania k presným hodnotám parametrov (nie použitím zaokrúhlených hodnôt z výstupu).
Úloha typu "Nájdite dobrý model pre zadané dáta" je súčasťou kostry na skúške.
Uvažujme nasledovné dáta (Passenger Miles on Commercial US Airlines, 1937–1960), pričom kvôli rastúcej disperzii budeme modelovať a predikovať logaritmy:
par(mfrow = c(1, 2)) # kreslenie obrazkov: 1 riadok, 2 stlpce
plot(airmiles)
plot(log(airmiles))
par(mfrow = c(1, 1)) # vratime naspat
log(airmiles)
na štyri roky.Ukážka možného výstupu:
# POSTUP
model <- sarima(...) # odhadneme model
model$... # chceme pristupovat k reziduam
Box.test(..., fitdf = ) # Ljung-Boxov test pre rezidua
ARmodel <- function(data, p, lag.max = 20){ # nastavenie defaultnej hodnoty vstupneho parametra
# DOPLNTE
}
# testujeme prvych k autokorelacii (k<=15) rezidui z AR(5) modelu pre data x
ARmodel(data = x, p = 5, lag.max = 15)
ARmodel(x, 5, 15)
sapply
zistite, ktoré AR(p) modely s rádom nanajvýš 5 majú dobré rezíduá.ARmodel
tak, aby vrátila aj hodnotu Bayesovho informačného kritéria. Pomocou tejto funkcie potom spomedzi modelov s dobrými rezíduami vyberte ten, ktorý má najnižšiu hodnotu informačného kritéria.Overovanie stacionarity procesu je súčasťou kostry na skúške.
Výstup z funkcie polyroot
(komplexné čísla) sa dá priamo kresliť funkciou plot
. Na x-ovej osi bude reálna časť, na y-ovej osi bude imaginárna časť, tomuto budú zodpovedať aj popisy osí (tie sa dajú zmeniť štandardným spôsobom nastavením parametrov xlab
, ylab
). Keďže budeme kvôli stacionarite kresliť jednotkovú kružnicu, oplatí sa nastaviť pri kreslení koreňov parameter asp = 1
, aby potom jednotková kružnica vyzerala naozaj ako kružnica, nie ako elipsa.
z <- polyroot(c(1, 0.8, -0.4, 0.2)) # korene 1 + 0.8*x - 0.4*x^2 + 0.1*x^3 = 0
z
## [1] -0.8008768-0.000000i 1.4004384+2.069282i 1.4004384-2.069282i
plot(z, asp = 1)
Na kreslenie jednotkovej kružnice sa dá výhodne použiť funkcia curve
s parametrom add = TRUE
(pridá sa do predchádzajúceho grafu).
Ak riešime úlohy typu "pre aké hodnoty parametra je daný proces stacionárny" analyticky, je dobré mať numerickú kontrolu.
Príklad 1. Pre aké hodnoty parametra \(k\) je stacionárny proces \(x_t= x_{t−1} + k x_{t−2} + u_t\)?
Numerická simulácia. Vytvoríme vektor hodnôt kVektor
a pre každú jeho zložku zistíme, či je získaný proces stacionárny.
kVektor <- seq(from = -3, to = 3, by = 0.1)
stacionarita <- sapply(kVektor, function(k) .... )
Dopíšte funkciu, ktorá pre zadanú hodnotu k
vráti hodnotu TRUE
alebo FALSE
podľa toho, či je proces stacionárny. Tieto hodnoty sa potom dajú napríklad kresliť do grafu ako hodnoty 1 a 0:
plot(kVektor, stacionarita)
Alebo si vypíšeme:
kVektor[stacionarita] # znamena: kVektor[stacionarita == TRUE]
## [1] -0.9 -0.8 -0.7 -0.6 -0.5 -0.4 -0.3 -0.2 -0.1
kVektor[!stacionarita] # znamena: kVektor[stacionarita == FALSE]
## [1] -2.0 -1.9 -1.8 -1.7 -1.6 -1.5 -1.4 -1.3 -1.2 -1.1 -1.0 0.0 0.1 0.2 0.3
## [16] 0.4 0.5 0.6 0.7 0.8 0.9 1.0 1.1 1.2 1.3 1.4 1.5 1.6 1.7 1.8
## [31] 1.9 2.0
Príklad 2. Pre aké hodnoty parametra \(k\) je stacionárny proces \(x_t = x_{t−1} + k x_{t−2} − k x_{t−3} + u_t\)?
Spravte numerickú simuláciu pre tento príklad.
Vytvorte funkciu, ktorá pre zadaný vektor parametrov \((\alpha_1, \alpha_2)\) vráti TRUE
, resp. FALSE
podľa toho, či je AR(2) proces s týmito koeficientami stacionárny alebo nie.
stacAR2 <- function(alpha12) { # vstup: dvojzlozkovy vektor
....
}
Otestujte:
stacAR2(c(1.2, -0.5))
## [1] TRUE
stacAR2(c(1.2, 0.5))
## [1] FALSE
stacAR2(c(0.5, 0)) # ar(1), ale stacionarny
## [1] TRUE
stacAR2(c(0, 0)) # konstanta + biely sum -> stacionarny
## [1] TRUE
Spravíme sieť bodov \((\alpha_1, \alpha_2)\) a zakreslíme, ktoré sú stacionárne a ktoré nie sú. Na vytvorenie dvojíc bodov použijeme náhodne generované čísla z rovnomerného rozdelenia na štvorci \((-2,2)\times(-2,2)\).
set.seed(123)
alfa1 <- runif(1000, min = -2, max = 2)
alfa2 <- runif(1000, min = -2, max = 2)
df <- data.frame(alfa1, alfa2)
head(df)
## alfa1 alfa2
## 1 -0.8496899 -0.90550906
## 2 1.1532205 0.37546773
## 3 -0.3640923 -1.35926075
## 4 1.5320696 1.41372096
## 5 1.7618691 1.39095663
## 6 -1.8177740 -0.08845275
Teraz pridáme do data framu tretí stĺpec, v ktorom bude výsledok overovania stacionarity. Namiesto for
-cyklu použijeme funkciu apply
. Tá umožňuje aplikovať zadanú funkciu na riadky alebo stĺpce objektu (matica, data frame).
Ukážka použitia apply
set.seed(123)
dfUkazka <- data.frame(a = sample.int(5),
b = sample.int(5),
c = sample.int(5))
dfUkazka # nejake cisla
## a b c
## 1 3 3 2
## 2 2 1 3
## 3 5 2 1
## 4 4 5 4
## 5 1 4 5
f <- function(x) (x[1] + x[2]) * x[3] # nejaka funkcia
# POUZITIE APPLY
apply(dfUkazka, # vstupne data pre funkciu
MARGIN = 1, # po riadkoch
FUN = f) # pouzita funkcia
## [1] 12 9 7 36 25
# priradenie ako novy stlpec
dfUkazka$vysledok <- apply(dfUkazka, 1, f)
dfUkazka
## a b c vysledok
## 1 3 3 2 12
## 2 2 1 3 9
## 3 5 2 1 7
## 4 4 5 4 36
## 5 1 4 5 25
# DALSIE POUZITIE APPLY: teraz nie je vstupom cely riadok
g <- function(x) x[2]/x[1] + x[1] # zase nejaka funkcia
dfUkazka$vysledok2 <- apply(dfUkazka[ , 3:4], # vstupom do g bude 3. a 4. stlpec
1, g)
dfUkazka
## a b c vysledok vysledok2
## 1 3 3 2 12 8
## 2 2 1 3 9 6
## 3 5 2 1 7 8
## 4 4 5 4 36 13
## 5 1 4 5 25 10
Vrátime sa k overovaniu stacionarity: Pomocou apply
a vytvorenej funkcie stacAR2
pridajte do data framu df
stĺpec s informáciou o stacionarite procesu s danymi parametrami.
# na kontrolu
head(df)
## alfa1 alfa2 stacionarita
## 1 -0.8496899 -0.90550906 TRUE
## 2 1.1532205 0.37546773 FALSE
## 3 -0.3640923 -1.35926075 FALSE
## 4 1.5320696 1.41372096 FALSE
## 5 1.7618691 1.39095663 FALSE
## 6 -1.8177740 -0.08845275 FALSE
Vykreslite body farebne odlíšené podľa toho, či je proces stacionárny alebo nie.
Všetky nasledujúce zadania sú zo starých skúšok. Úlohou je
Na skúške je súčasťou kostry zistenie, či môžeme pracovať priamo so zadanými dátami alebo s diferenciami (trend nie je jediným dôvodom diferencovannia - budeme sa tomu venovať neskôr). V týchto zadaniach je povedané, s akými dátami máte pri hľadaní AR modelu pracovať. V prípade modelovania diferencií sa treba na základe prítomnosti, resp. neprítomnosti trendu treba rozhodnúť, či do modelu zahrnúť konštantu alebo nie.
Takisto je na skúške na výber širšia trieda modelov, ako sú AR modely. V niektorých prípadoch - vrátane týchto - však AR model stačí.
Dáta z knižnice astsa
, z popisu v helpe: New York Harbor conventional regular gasoline weekly spot price FOB (in cents per gallon) from 2000 to mid-2010. Zoberieme dáta od roku 2006.
library(astsa)
x <- window(gas, start = c(2006, 1))
plot(x)
Nájdite model pre premennú x tak, že budete jej diferencie modelovať AR procesom.
Dáta z knižnice astsa
, z popisu v helpe: Leading indicator, 150 months; taken from Box and Jenkins (1970).
library(astsa)
x <- lead
plot(x)
Nájdite model pre premennú x tak, že budete jej diferencie modelovať AR procesom.
Dáta z knižnice datasets
, z popisu v helpe: Annual measurements of the level, in feet, of Lake Huron 1875–1972. Použijeme dáta od roku 1900.
library(datasets)
x <- window(LakeHuron, start = 1900)
plot(x)
Odvoďte podmienku stacionarity AR(2) procesu v tvare lineárnych nerovníc pre autoregresné koeficienty a zakreslite do roviny (na jednotlivých osiach sú hodnoty autoregresných koeficientov) tie body, ktoré zodpovedajú stacionárnym procesom. Porovnajte so simuláciami, ktoré sa robili v cvičení 8.
Nech \(x_t\) je stacionárny proces. Odvoďte strednú hodnotu, disperziu a autokorelačnú funkciu procesu \(y_t = x_t - x_{t-1}\).
Pomocou balíka priceR
a funkcie retrieve_inflation_data
získame dáta o inflácii z World Bank API.
library(priceR) # ak treba, nainstalujte
data <- retrieve_inflation_data("US")
## Validating iso2Code for US
## Generating URL to request all 297 results
## Retrieving inflation data for US
## Generating URL to request all 63 results
str(data)
## 'data.frame': 63 obs. of 8 variables:
## $ indicator :'data.frame': 63 obs. of 2 variables:
## ..$ id : chr "FP.CPI.TOTL.ZG" "FP.CPI.TOTL.ZG" "FP.CPI.TOTL.ZG" "FP.CPI.TOTL.ZG" ...
## ..$ value: chr "Inflation, consumer prices (annual %)" "Inflation, consumer prices (annual %)" "Inflation, consumer prices (annual %)" "Inflation, consumer prices (annual %)" ...
## $ country :'data.frame': 63 obs. of 2 variables:
## ..$ id : chr "US" "US" "US" "US" ...
## ..$ value: chr "United States" "United States" "United States" "United States" ...
## $ countryiso3code: chr "USA" "USA" "USA" "USA" ...
## $ date : chr "2022" "2021" "2020" "2019" ...
## $ value : num 8 4.7 1.23 1.81 2.44 ...
## $ unit : chr "" "" "" "" ...
## $ obs_status : chr "" "" "" "" ...
## $ decimal : int 1 1 1 1 1 1 1 1 1 1 ...
Príprava dát: Vytvorte z týchto dát časový rad hodnôt inflácie.
Hľadanie modelu.
Ďalšie dáta. Zopakujte pre infláciu v štátoch (všade treba diferencovať):