MS-C2128 Ennustaminen ja aikasarja-analyysi 5. harjoitukset / Tehtävät Kotitehtävät: 2 Aihe: ARMA-mallit Viikon 5 harjoituksissa käytämme samoja aikasarjoja kuin viikolla 4. Tehtävä 5.1. Tarkastellaan seuraavia aikasarjoja Tiedosto Muuttuja Kuvaus Havaintoväli Aikasarjan pituus INTEL Intel_Close Intelin osakekurssi (Pörssi-) päivä n = 20 SUNSPOT Spots Auringonpilkkujen määrä 1 v n = 215 SALES Sales Erään tukkukaupan myynnin volyymi 1 kk n = 144 Yritä löytää jokaiselle aikasarjalle paras mahdollinen ARMA-perheeseen kuuluva malli. Käytä aikasarjan viimeistä viidesosaa mallin verifioimiseen. Tehtävä 5.1. Ratkaisu: Ladataan aluksi paketti forecast, jos sitä ei ole aiemmin asennettu, ja luetaan muuttujat työhakemistoon #install.packages( forecast ) library(forecast) INTEL <- read.table( INTEL.txt,header=T) SUNSPOT <- read.table( SUNSPOT.txt,header=T) SALES <- read.table( SALES.txt,header=T)
Intel_Close Ensin on syytä tarkastella kuvaajia varianssin ja trendin varalta, ja tarvittaessa tehdä muunnoksia. Näitä on piirretty tehtävässä 4.1. Lasketaan autokorrelaatiot ja osittaisautokorrelaatiot. Intel_Close <- ts(intel$intel_close) Acf(Intel_Close) Pacf(Intel_Close) Tässä siniset viivat kertovat tilastollisen merkitsevyyden, siis erottavat merkitykselliset havainnot kohinasta.
Kommentteja: (1) Aikasarja Intel-Close voi kuvion perusteella hyvin olla stationaarinen ja se ei siten vaadi differensointia. Aikasarjan taso vaihtelee kyllä melko voimakkaasti, mutta sen käyttäytyminen on lokaalisti rauhallista. Aikasarjassa ei ole monotonista trendiä eikä näkyvää kausivaihtelua. (2) Korrelaatiofunktiot viittaavat AR(2)-malliin, mikä tuleekin osoittautumaan riittäväksi malliksi (ks. alla). Yritetään sovittaa AR(2) mallia. Tämä, kuten muidenkin ARMA-mallien sovitus, tapahtuu komennolla Arima: Arima ottaa parametrikseen aikasarjan, order on ARIMA-osan asteet muodossa (p,h,q), missä p, d ja q kuten luentokalvoissa. Lisäksi on mahdollista antaa määre seasonal, joka on kolmiosainen vektori, ja vastaa parametreja (P,H,Q). Arima(Intel_Close, order=c(2,0,0)) Series: Intel_Close ARIMA(2,0,0) with non-zero mean Coefficients: ar1 ar2 intercept 1.3342-0.5263 64.3965 s.e. 0.1850 0.2038 1.0501 sigma^2 estimated as 0.8844: log likelihood=-28.2 AIC=64.39 AICc=67.06 BIC=68.38 Tämä malli sisältää nyt vakion (Intercept), sen voi asettaa nollaksi antamalla Arimalle lisämääreen include.mean=f. Arima-funktiolle voidaan lisäksi valita estimoimiseen käytetty menetelmä. Oletuksena on ns. CSS-ML (conditional sum of squares - maximum likelihood) menetelmä. Kyseisessä algoritmissa mallin parametrit estimoidaan suurimman uskottavuuden (SU) menetelmällä siten että alkuarvaus saadaan CSS-menetelmällä. Lisätietoa SUmenetelmästä viikon 4 luentokalvoissa. Mallin tulkinta: Coefficients sisältää parametrit ja niiden hajonnat (s.e.) AIC on Akaiken informaatiokriteeri, AICc tämän johdannainen ja BIC on Bayesilainen informaatiokriteeri. malli=arima(intel_close, order=c(2,0,0)) Acf(malli$res)
Residuaalit eivät näytä olevan autokorreloituneita. Voidaan myös tehdä Ljung-Box testi residuaaleille. Tämä tapahtuu seuraavasti: Box.test(malli$res,lag=h,fitdf=x,type= Ljung-Box ), missä h on viive, ja x estimoitujen parametrien määrä mallissa. Nyt esim x=2. Ljung-Box testi voidaan tehdä viipeille (lag), jotka ovat suurempia kuin x+1 (katso luento 5). Huomaa, että funktio Box.test tekee oletuksena ns. Box-Piercen testin. Tilastotieteen kirjallisuudessa Ljung-Box on kuitenkin todettu Box-Pierce testiä paremmaksi. # Loopissa vektorin koko kasvaa aina yhdellä # Huomaa, että laskennallisesti tehokkaampi tapa olisi alustaa # halutun pituinen vektori, eli # ljung_box = c(rep(na,18)) ljung_box =c() for (i in 3:20) { ljung_box=c(ljung_box,box.test(malli$res,lag=i,fitdf=2, type= "Ljung-Box")$p.value) } ljung_box [1] 0.3786061 0.4713735 0.5906405 0.6158862 0.6485075 0.7648594 0.7350293 0.5646156 0.6414046 0.5078315 0.4545944 0.5403243 0.5671877 [14] 0.1945652 0.1691062 0.2126523 0.2622378 NA Tämän testin nollahypoteesi on, että autokorrelaatiota ei ole. P-arvot ovat nyt varsin suuria, joten nollahypoteesi jää voimaan. AR(2)-malli on siis riittävä. Piirretään sovite ja alkuperäinen aineisto samaan kuvaan.
sovite <- fitted(malli) plot(sovite,type="b",col="blue",ylim=c(60,68), ylab="kurssi",xlab="aika") lines(intel_close,col="red",type="b") legend(16,68, legend=c("alkup.", "Sovite"), col=c("red", "blue"), lty=c(1,1), cex=0.8) Kuvassa alkuperäinen aikasarja on punaisella ja sovite sinisellä. Lasketaan estimaatit aikasarjan ensimmäisestä 16 havainnosta ja katsotaan miten hyvin malli ennustaa viimeistä 4 havaintoa. malli_ver <- Arima(Intel_Close[1:16],order=c(2,0,0)) ennuste <- forecast(malli_ver,h=4,level=false)$mean #level=false, jättää luottamusvälit pois plot(intel_close,col="red",type="b",ylim=c(60,68), ylab="kurssi",xlab="aika") lines(ennuste,col="blue",type="b") legend(16,68, legend=c("alkup.", "Ennuste"), col=c("red", "blue"), lty=c(1,1), cex=0.8)
Nähdään, että 16 ensimmäistä havaintoa eivät ennusta erityisen hyvin viimeistä neljää havaintoa, vaikka AR(2)-malli todettiin riittäväksi. Tämä selittyy sillä, että alkuperäinen aikasarja on suhteellisen lyhyt. Varsinkin lyhyitä aikasarjoja ennustaessa tulee olla siis hyvin varovainen. Spots Tehtävän 1 perusteella Spots on valmiiksi stationaarinen Spots <- ts(sunspot$spots) Acf(Spots,lag.max=50) Pacf(Spots,lag.max=50)
Kommentteja: (1) Aikasarjaa Spots voi kuvion perusteella pitää stationaarisena ja se ei siten vaadi differensointia. Aikasarjan yleistaso pysyy vakiona. Aikasarjassa ei ole trendiä, mutta siinä on selvää syklistä vaihtelua, jonka jakso on n. 11 vuotta. Jaksolle ei voida löytää luontevaa selitystä (ja lisäksi jakson pituus ei ole täysin vakio), mikä sulkee pois kausidifferensoinnin käytön. (2) Korrelaatiofunktiot ja spektri voisivat viitata AR(2)-malliin, tosin pacf:ssä on näyttöä tätä vastaan (viipeet 6-8). malli=arima(spots,order=c(2,0,0)) Acf(malli$res) Nyt osa autokorrelaatioista menee merkitsevyystason ylitse. c=c() for (i in 3:50)
{ c=c(c,box.test(malli$res,lag=i,fitdf=2, type= Ljung-Box )$p.value)} c [1] 0.093379196 0.071577053 0.152711804 0.209852285 0.297590787 [6] 0.360195519 0.085111937 0.032824920 0.003785297 0.004745079 [11] 0.008116945 0.012689837 0.019920272 0.025990086 0.033572491 [16] 0.038657976 0.052563207 0.067453541 0.089710457 0.089621568 [21] 0.116261199 0.146403129 0.181490442 0.149486465 0.067496750 [26] 0.078072998 0.077236261 0.094964410 0.075039036 0.091995359 [31] 0.098584657 0.106594088 0.117899578 0.086096794 0.099363603 [36] 0.066790207 0.076974670 0.088229189 0.100735795 0.108634013 [41] 0.122469752 0.143219942 0.167114594 0.103387897 0.114468676 [46] 0.115238833 0.133627606 0.099923435 Sama tulos nähdään Ljung-Box-testillä. AR(2)-malli ei ole Ljung-Box-testien perusteella riittävä selittämään aikasarjan Spots käyttäytymistä. Kokeillaan nyt automaattista Arima-mallien sijoitusta. malli=auto.arima(spots) malli Series: Spots ARIMA(3,0,1) with non-zero mean Coefficients: ar1 ar2 ar3 ma1 intercept 0.6574 0.3494-0.5433 0.6580 49.1226 s.e. 0.2000 0.2622 0.1308 0.2128 3.4416 sigma^2 estimated as 266.4: log likelihood=-906.65 AIC=1825.3 AICc=1825.7 BIC=1845.52 Tämä käytännössä sijoittaa automaattisesti hyväksi havaitsemansa ARIMA-mallin annettuun aikasarjaan. Ilman lisämääreitä valinta tapahtuu minimoimalla AICc:tä. Tämä algoritmi on vähän huolimaton, joten sokeana ei kannata kaikkea uskoa. Acf(malli$res,lag.max=50)
Kommentteja: (1) Auringonpilkkujen määrää kuvaava aikasarja Spots osoittautuu vaikeaksi mallintaa ARMA-malleilla. Eräs ongelman aiheuttajista on se, että syklisen vaihtelun jakson pituus n. 11 vuotta ei ole täysin vakio. Ilmeisesti se on syynä siihen, että SARMA-mallit eivät toimi hyvin. (2) Auringonpilkku-aikasarjaa on tutkittu paljon. Tämänhetkisen käsityksen mukaan eräs parhaista kandidaateista selittämään sen käyttäytymistä, on ns. kynnysmalli (engl. threshold model). Kynnysmalli on eräs epälineaarisista aikasarjamalleista. Sen kuvaaminen sivuutetaan tässä. Piirretään sovitteet (AR(2)) ja aikasarja samaan kuvioon: Sovitettu aikasarja näyttää seuraavan hyvin alkuperäisen aikasarjan käyttäytymistä. Yritetään vielä ennustaa viimeistä 43 havaintoa. malli_ver <- Arima(Spots[1:172],order=c(2,0,0)) ennuste <- forecast(malli_ver,h=43,level=false)$mean plot(spots,col="red",type="l",ylim=c(0,200), ylab="lkm.",xlab="aika") lines(ennuste,col="blue",type="l") legend(1,200, legend=c("alkup.", "Ennuste"), col=c("red", "blue"), lty=c(1,1), cex=0.8)
Nähdään, että ennusteet pitkälle tulevaisuuteen epäonnistuvat pahasti. Toistetaan ennustaminen 5 aika-askeleella. Ennustaminen onnistuu taas suhteellisen hyvin muutaman aika-askeleen eteenpäin. Huonot ennusteet selittyvät lisäksi sillä, että totesimme kyseisen aikasarjan olevan vaikea mallintaa.
Sales Sales ei viikon 4 kotitehtävän perusteella ole stationaarinen, sillä on selkeä trendi. sales=ts(sales$sales,frequency=12) ts.plot(diff(sales)) Tällä aikasarjalla on puolestaan selkeä kausivaihtelu, joka näyttäisi olevan kuukausittaista. Otetaan kausidifferenssi ts.plot(diff(diff(sales),lag=12)) Näyttää stationaariselta. Kirjoitetaan salesd=diff(diff(sales),lag=12) Acf(salesd,lag.max=40)
Pacf(salesd,lag.max=40) Kommentteja: (1) Aikasarja D12DSales (jossa on siis tehty sekä tavallinen että kausidifferensointi) on stationaarinen: trendi ja näkyvä kausivaihtelu eliminoituvat. (2) Myös korrelaatiofunktiot viittaavat stationaarisuuteen (korrelaatiofunktiot kuolevat riittävän nopeasti). (3) Mallina aikasarjalle Sales voisi olla jokin SARIMA-perheen malli, kuten esim. SARIMA(2,1,0)) (1,1,0) (ks. kuitenkin alla). malli=arima(sales,order=c(2,1,0),seasonal=c(1,1,0)) Acf(malli$res,lag.max=40) #Huomaa, että Arima() ei toimi jos aikasarjan frequencyparametri on asetettu väärin
c=c() for (i in 4:50){ c=c(c,box.test(malli$res,lag=i,fitdf=3, type="ljung-box")$p.value)} c [1] 0.7248406315 0.5271186279 0.2815302456 0.3840298411 [5] 0.5159272702 0.6311255190 0.3468480317 0.1976339228 [9] 0.2293396575 0.2380502659 0.2282192715 0.0995772942 [13] 0.0509104614 0.0344255265 0.0448945465 0.0620507942 [17] 0.0836639664 0.1109048591 0.0506974373 0.0038601750 [21] 0.0009175278 0.0013330954 0.0015893990 0.0012180142 [25] 0.0016499143 0.0024536944 0.0030739259 0.0017781792 [29] 0.0015308234 0.0021889817 0.0020281789 0.0028796887 [33] 0.0036150807 0.0017784033 0.0024964193 0.0034392749 [37] 0.0021181210 0.0028490917 0.0038999331 0.0048470643 [41] 0.0063942819 0.0082266423 0.0009782449 0.0005481341 [45] 0.0006053689 0.0007278338 0.0007755318 SARIMA(2,1,0)) (1,1,0)[12]-malli ei ole Ljung-Box-testien perusteella riittävä selittämään aikasarjan Sales käyttäytymistä. Funktio auto.arima() antaa tulokseksi SARIMA(3,1,1)(1,1,2)[12]-mallin, joka ei myöskään sovi aikasarjaan Ljung-Box testien perusteella: malli.auto <- auto.arima(sales) Acf(malli.auto$res,lag.max=40) c=c() for (i in 8:50){ # Nyt estimoimme 3+1+1+2=7 parametria c=c(c,box.test(malli.auto$res,lag=i,fitdf=7, type="ljung-box")$p.value)} c
[1] 0.0242304402 0.0772142886 0.0118315115 0.0087777057 [5] 0.0182827559 0.0184330822 0.0229914047 0.0055632672 [9] 0.0035801023 0.0020972202 0.0035540170 0.0059708346 [13] 0.0097102970 0.0149003554 0.0054630998 0.0001737397 [17] 0.0002824187 0.0003612219 0.0003883306 0.0001434732 [21] 0.0002328480 0.0003571897 0.0005420872 0.0003191189 [25] 0.0003208185 0.0004523630 0.0004247775 0.0006282611 [29] 0.0008538485 0.0006246351 0.0009064446 0.0011929199 [33] 0.0008947369 0.0012682360 0.0017983764 0.0025007661 [37] 0.0029901508 0.0033178099 0.0007498938 0.0005506740 [41] 0.0007623702 0.0009139528 0.0007152571 Mallinnuksen tulosta ei voida siten pitää kovin onnistuneena. Parempaa mallia on kuitenkin vaikeata löytää ainakaan SARIMA-perheestä. Kommentti: Aikasarja Sales osoittautuu vaikeaksi mallintaa. Hyvää mallia on vaikeata löytää. Katsotaan vielä miten hyvin SARIMA(2,1,0)) (1,1,0) estimaatit sopivat alkuperäiseen aikasarjaan Aikasarjaa verifioimisen voi toteuttaa kuten aiemmissa kohdissa. Katsotaan nyt miltä mallin ennuste näyttää 24 aika-askelta (2 vuotta) eteenpäin:
plot(forecast(malli,h=24)) Saatava ennuste näyttää järkevältä, mutta SARIMA(2,1,0)) (1,1,0)-malli ei ole Ljung-Boxtestien perusteella riittävä Tehtävä 5.2. Tiedostoon MLCO2 on tallennettu aikasarja MLCO2, joka sisältää Mauna Loa-tulivuorella tehtyjen hiilidioksidimittausten tulokset 216 kuukaudelta. Aikasarjaa on tarkasteltu alustavasti tehtävässä 4.1. (a) (b) Yritä rakentaa paras mahdollinen ARMA-tyyppinen malli aikasarjalle MLCO2. Ennusta aikasarjaa 2 ja 24 askelta eteenpäin. Pohdi ennusteiden hyvyyttä.