\(\color{deepskyblue}{\text{Сезонски ARIMA модели}}\)

Често се на корелограму зависност од прошлости може видети на задршкама које су умношци сезонског периода. На пример, код месечних временских серија, значајне корелације на задршкама l=12,24,… упућују на постојање сезонске компоненте. Слично, код кварталних серија, на задршкама l=4,8,… На пример, месечна серија коју чине просечне температуре ће имати јаку позитивну корелациију са задршком 12. Ово није нови појам, и већ смо објаснили један метод уклањања сезонске компоненте - сезонског прилагодавања. Увешћемо још један метод. До сада смо се бавили ARIMA моделима којима се моделирају нестационарне серије без сезонске компоненте. Нестационарност потиче од тренда који се диференцирањем убија. Постојање сезонске компоненте такође чини серију нестационарном, пошто њена функција средње вредности није константна. ARIMA модели се могу генерализовати тако да се њима описује и сезонска компонента. Њихова ознака је \[ARIMA(p,d,q)(P,D,Q)_s.\] Kао и до сада, мала слова означавају редом, ред AR полинома, број (обичних) диференцирања до стационарности, и ред МА полинома. Великим словима означени су одговарајући сезонски параметри. У полиномијалном запису то је \[\Theta_P(B^s)\theta_p(B)(1-B^s)^Dx_t=c+\Phi_Q(B^s)\phi_q(B)w_t,\] где су \(\theta_p\) и \(\phi_q\) редом АR и МА полиноми које смо већ дефинисали, а \(\Theta_P\) и \(\Phi_Q\) су сезонски АR и сезонски МА полином, \(s\) је сезонски период. \[\Phi_P(B^s)=1-\Phi_1B^s-\Phi_2B^{2s}-...-\Phi_PB^{Ps}\] \[\Theta_Q(B^s)1+\Theta_1B^s+\Theta_2B^{2s}+...+\Theta_QB^{Qs}\] Уопште ови модели су нестационарни, осим када је \(d=D=0\) и корени полинома са леве стране једначине ARIMA модела су по апсолутној вредности већи од 1. Инвертибилост важи ако су корени полинома са десне стране по апсолутној вредности већи од 1. Навешћемо неке једноставне примере сезонских ARIMA модела

а) \(ARIMA(0,0,0)(1,0,0)_{12}\) \[x_t=\Phi x_{t-12} +w_t\] Овај модел је одговарајући за месечну временску серију код које само вредност у одговарајућем месецу прошле године утиче на садашњост. Овај модел је стациоаран ако је \(|\Phi^{-1/12}|>1\).

б) \(ARIMA(0,1,0)(1,0,0)_{12}\) \[x_t=x_{t-1}+\Phi x_{t-12}-\alpha x_{t-13}+w_t\] Ред модела идентификујемо записом преко полинома. \[(1-\Phi B^{12})(1-B)x_t=w-t \] Овај модел није стационаран јер постоји јединични корен.

в) \(ARIMA(0,0,0)(1,0,1)_{12}\) \[x_t=\Phi x_{13} +w_t+\theta w_{t-12}\] Ред модела идентификујемо записом преко полинома: \[(1-\Phi B^{12})x_t=(1+\Theta B^{12}) w_{t-12}. \] Овај модел је каузалан ако је \(|\Phi|<1\) и инвертибилан ако \(|\Theta|<1\). У случају када су модели чисто сезонски (p, d, q = 0) рачунање аутокорелационе функције (као и оцењивање параметара и предвидање о коме нисмо детаљно причали код ARIMA модела) је аналогно несезонском случају.

г) \(ARIMA(0, 1, 1)(0, 1, 1)_{12}\) \[x_t=x_{t-1}+x_{t-12}-x_{t-13}+w_t+\theta w_{t-1}+\Theta w_{t-12} +\Theta \theta w_{t-13}\] Због мултипликативне природе модела, коефицијент уз \(w_{t-13}\) није самосталан параметар већ је производ коефицијената уз \(w_{t-1}\) и \(w_{t-12}\).

Сезонски ARIMA модели су још комплекснији, питање је како уопште одредити ред модела. Неки једноставни сезонски ARIMA модели (са много нула) ипак имају карактеристичан облик ACF, PACF функција. На пример, за \(ARIMA(0, 0, 0)(0, 0, 1)_{12}\) важи

Слично, за \(ARIMA(0, 0, 0)(1, 0, 0)_{12}\) важи

Процес уклапања у модел је сличан као и код несезонских ARIMA модела. Прво је потребно одредити број потребних диференцирања, \(d\) - несезонских и \(D\) - сезонских.

У пракси \(d+D\) не би требало да буде веће од 2, а ако је \(d+D=2\) параметар \(c\) (intercept) не оцењујемо. Дакле, ако је \(d=0, D=1\), онда је серија \(x_t-x_{t-s}\) стационарна, а ако је \(d=1,D=1\), онда је серија \((x_t − x_{t-1})−(x_{t-s} − x_t − s − 1)\) стационарна. Значење сезонских редова је, ако је \(P=1\), онда се за предвидање у неком тренутку \(t\), \(x_t\), користи вредност \(x_t-s\), а ако је \(Q = 1\), онда се за предвидање \(x_t\) користи \(w_{t-s}\). Сада ћемо навести кораке у идентификацији сезонских модела.

Пример ACF и PACF функција неког сезонског ARIMA модела.

phi=c(rep(0,11),.8)
ACF=ARMAacf(ar=phi, ma=-0.5, 50)[-1]
PACF=ARMAacf(ar=phi, ma=-0.5, 50, pacf=TRUE)
plot(ACF, type="h")
abline(h=0)

plot(PACF, type="h")
abline(h=0)

\(\color{deepskyblue}{\text{Пример 1}}\)

library(fpp)
## Warning: package 'fpp' was built under R version 3.3.3
## Loading required package: forecast
## Warning: package 'forecast' was built under R version 3.3.3
## Loading required package: fma
## Warning: package 'fma' was built under R version 3.3.3
## Loading required package: expsmooth
## Warning: package 'expsmooth' was built under R version 3.3.3
## Loading required package: lmtest
## Warning: package 'lmtest' was built under R version 3.3.3
## Loading required package: zoo
## Warning: package 'zoo' was built under R version 3.3.2
## 
## Attaching package: 'zoo'
## The following objects are masked from 'package:base':
## 
##     as.Date, as.Date.numeric
## Loading required package: tseries
## Warning: package 'tseries' was built under R version 3.3.3
class(euretail)
## [1] "ts"
frequency(euretail)
## [1] 4
plot(euretail)
abline(v=1996:2011,lty="dotted") #Vidi se i sezonska komponenta

Диференцирање временске серије

nsdiffs(euretail) #prvo sezonski diferenciramo
## [1] 1
tsdisplay(diff(euretail,4))

ndiffs(diff(euretail,4)) # ni ovo ne izgleda stacionarno, pa cemo i obicno diferencirati
## [1] 1
tsdisplay(diff(diff(euretail,4))) #ovo izgleda malo stacionarnije, srednja vrednost prblizno nula

На ACF и PACF се види значајност на сезонским задршкама, што нам више одговара. Одабрали смо \(d=1,D=1\). Остаје да одаберемо и остале параметре модела.

Имамо негативну вредност ACF(4), али позитивну ACF(1). Покушаћемо са \(АRIMA(0,1,1)(0,1,1)_4\) моделом.

Функција Arima, слично као arima, има још неке могућности које нећемо користити.(arima је из stats пакета, а Arima из forecast).

fit <- Arima(euretail, order=c(0,1,1), seasonal=c(0,1,1)) #probati i 1,1,0 0,1,1
tsdisplay(residuals(fit))

По резидуалима видимо да смо одабраним SMA=1 решили параметре, али значајне корелације на мањим задршкама сугеришу да треба додати још неки несезонски параметар. Питање је који параметар додати. Код избора модела несезонских arima модела речено је да ако је негативни шиљак на ACF за мале lag, онда се додаје један MA параметар, а ако је позитивни шиљак на PACF за мале lag, онда се додаје један AR параметар. Према томе, овде бисмо могли да додамо и један AR несезонски или MA несезонски параметар. Овде нема јединственог правила. Ми ћемо додати MA параметар.

fit4 <- Arima(euretail, order=c(1,1,1), seasonal=c(0,1,1))
res <- residuals(fit4)
tsdisplay(res)

fit4$aic
## [1] 68.37079
fit2 <- Arima(euretail, order=c(0,1,2), seasonal=c(0,1,1))
res <- residuals(fit2)
tsdisplay(res)

fit2$aic
## [1] 73.61446
Box.test(res, lag=16, fitdf=3, type="Ljung") #lag=16, znaci posmatramo ukupno 16 autokor, #fitdf=3 jer smo ocenili 3 parmetara 2xAR, 1XSMA, #nulta hipoteza je da su autokorelacije 0
## 
##  Box-Ljung test
## 
## data:  res
## X-squared = 18.665, df = 13, p-value = 0.1339
qqnorm(res)

Гледајући p вредност Љунг-Бокс теста, рекли бисмо да је модел добар, али ипак видимо да су још значајне ACF 3 и PACF 3, па ћемо покушати додати још један МА параметар.

fit3 <- Arima(euretail, order=c(0,1,3), seasonal=c(0,1,1))
res <- residuals(fit3)
tsdisplay(res)

Box.test(res, lag=16, fitdf=4, type="Ljung")
## 
##  Box-Ljung test
## 
## data:  res
## X-squared = 7.0105, df = 12, p-value = 0.8569
fit3$aic #Sada i reziduali bolje izgledaju, i veca je p vrednost testa, a mozemo da uporedimo AIC vrednosti, ili AICc
## [1] 67.39644
fit2$aicc
## [1] 74.3552
fit3$aic #ovo je bolje jer je manje
## [1] 67.39644

Извршимо предвиђање на основу изабраног модела. Наставићемо да радимо са пакетом forecast, у ком се налази функција за предвиђање forecast. Иначе, постоји и функција predict за предвиђање.

plot(forecast(fit3,h=12)) #predvidjanje za naredne 3 godina

Предвиђање прате скорашњи опадајући тренд, али интервали поверења су велики и дозвољавају у неком тренутку да постане и растући.

Функција аутоматски одређује модел (може одредити и сезонске компоненте)

auto.arima(euretail)
## Series: euretail 
## ARIMA(1,1,2)(0,1,1)[4] 
## 
## Coefficients:
##          ar1      ma1     ma2     sma1
##       0.7345  -0.4655  0.2162  -0.8413
## s.e.  0.2239   0.1995  0.2096   0.1869
## 
## sigma^2 estimated as 0.1592:  log likelihood=-29.69
## AIC=69.37   AICc=70.51   BIC=79.76

Након мало чекања, добије се да је најбољи модел \(ARIMA(1,1,2)(0,1,1)\), а његова вредност \(AICc\) је чак већа од нашег одабраног модела. То се дешава јер ова функција не проверава баш све моделе, него прави неке пречице у налажењу модела, па некад и не да стварно најбољи модел. Те пречице се могу искључити, па следећим позивом добијамо најбољи модел који смо и сами идентификовали.

auto.arima(euretail,stepwise=FALSE, approximation=FALSE)
## Series: euretail 
## ARIMA(0,1,3)(0,1,1)[4] 
## 
## Coefficients:
##          ma1     ma2     ma3     sma1
##       0.2625  0.3697  0.4194  -0.6615
## s.e.  0.1239  0.1260  0.1296   0.1555
## 
## sigma^2 estimated as 0.1564:  log likelihood=-28.7
## AIC=67.4   AICc=68.53   BIC=77.78

\(\color{deepskyblue}{\text{Пример 2}}\)

plot(h02) #Mesecna serija, prodaja lekova sa kortikosteriodima u Australiji

Сезонска компонента је јасно уочљива и изгледа као да расте са порастом тренда. Серија је позитивна, па је можемо логаритмовати.

lh02 <- log(h02)
par(mfrow=c(2,1))
plot(h02, ylab="H02 sales (million scripts)", xlab="Year")
plot(lh02, ylab="Log H02 sales", xlab="Year")

Са графика се може видети како смо логаритамском трансформацијом мало смирили дисперзију, али идаље имамо благо растући тренд и очигледну сезонску компоненту.

Диференцирање временске серије

tsdisplay(diff(lh02,12), 
          main="Seasonally differenced H02 scripts", xlab="Year") #prvo sezonsko

nsdiffs(lh02) 
## [1] 1
#da li je potrebno i obicno diferencirati?
kpss.test(diff(lh02,12)) #kpss test kaze da, a kod adf je p vrednost 0.06
## Warning in kpss.test(diff(lh02, 12)): p-value smaller than printed p-value
## 
##  KPSS Test for Level Stationarity
## 
## data:  diff(lh02, 12)
## KPSS Level = 1.012, Truncation lag parameter = 3, p-value = 0.01
#to takodje kaze i funkcija ndiffs
ndiffs(diff(lh02,12)) 
## [1] 1

Погледајмо график ACF и PACF када и обично диференцирамо.

tsdisplay(diff(diff(lh02,12),1)) # ako su ACF vrednosti manje od -0.5 onda je previse puta diferencirano, ipak necemo jos jednom diferencirati

tsdisplay(diff(lh02,12)) 

Ово одговара другом описаном уобичајеном сезонском моделу ARIMA(p,0,0)(0,1,1)+c. Имамо доста позитивних аутокорелација које убијамо додавањем AR параметара.

fit1<-Arima(h02, order=c(1,0,0),seasonal=c(0,1,1),include.mean=TRUE,lambda=0)
res<-residuals(fit1)
tsdisplay(res) #od mnogo pozitivnih, dodavanjem AR parametara, dobili jako male ACF i PACF 1

Мораћемо да поправимо ову ситуацију, али не додавањем AR параметара, јер ћемо тако направити само још негативније ACF (покушајте). Дакле, одустајемо од уобичајеног модела.

Покушајмо додавањем MA несезонског параметра.

fit2<-Arima(h02, order=c(1,0,1),seasonal=c(0,1,1),lambda=0)
res<-residuals(fit2)
tsdisplay(res)

fit3<-Arima(h02, order=c(1,0,2),seasonal=c(0,1,1),lambda=0)
res<-residuals(fit3)
tsdisplay(res) 

Никако се не поправља ситуација, на великим lag значајне аутокорелације, па ћемо променити и сезонске компоненте. Крећемо испочетка. Пробаћемо са додавањем још једног SMA параметра. Ставићемо један AR параметар због позитивних аутокорелација на малим lag.

tsdisplay(diff(lh02,12))

fit4<-Arima(h02, order=c(1,0,0),seasonal=c(0,1,2),lambda=0)
res<-residuals(fit4)
tsdisplay(res)

fit4$aicc
## [1] -398.8206

Додајемо још један MA због негативних аутокорелација на малим lag.

fit5<-Arima(h02, order=c(1,0,1),seasonal=c(0,1,2),lambda=0)
res<-residuals(fit5)
tsdisplay(res)

fit5$aicc
## [1] -474.8237

Додајемо још два AR чиме се поправља ситуација на малим lag. Иако остају неке значајне ACF и PACF за велике lag, али то није на сезонским задршкама, па их игноришемо.

fit6<-Arima(h02, order=c(3,0,1),seasonal=c(0,1,2),lambda=0)
res<-residuals(fit6)
tsdisplay(res)

fit6$aicc
## [1] -485.4754
#uzimamo za lag (broj prvih autokorelacije koje se zajedno posmatraju) da je neki
#umnozak sezonskog perioda, fitdf je broj ocenjenih parametara, a to je 7 zbog mean
Box.test(res, lag=36, fitdf=7, type="Ljung")
## 
##  Box-Ljung test
## 
## data:  res
## X-squared = 50.712, df = 29, p-value = 0.007561

Резидуали нашег најбољег модела нису прошли тест. Некада није могуће наћи модел који ће проћи све тестове. Покушајмо са функцијом auto.arima.

#nametnucemo nase diferenciranje i transformaciju

# fit<-auto.arima(h02,lambda=0,d=0,D=1,max.order=9,stepwise=FALSE, approximation = FALSE) 

#max.order je najveca vrednost za p+q+P+Q

Добијамо да је најбољи ARIMA(4,0,3)(0,1,1) модел и он пролази Љунг-Боксов тест (проверити).

Одабрали смо ARIMA(3,0,1)(0,1,2) модел и предвиђамо вредности.

plot(forecast(fit6)) #po defaultu predvidjanje je 2*sezonski period, dakle 2 godine

\(\color{deepskyblue}{\text{Задатак }}\)

  • Уклопити временску серију cbe у одговарајући сезонски АRIMA модел.