MS-C2128 Ennustaminen ja aikasarja-analyysi 1. harjoitukset / Tehtävät Kotitehtävät: 2 Aiheet: Aluksi Yleinen lineaarinen malli eli usean selittäjän lineaarinen regressiomalli Tällä kurssilla käytetään R-ohjelmistoa, jonka käyttämisestä lienee muutama sana paikallaan. R-ohjelmisto on laajasti käytetty vapaassa levityksessä oleva ammattimaiseen tilastolliseen analyysin soveltuva ohjelmistoympäristö. Aallon koneilta R löytyy kurssin henkilökunnan tietojen mukaan kaikista päärakennuksen ja Maarintalon tietokoneluokista. Ohjelman nimi on Rstudio, ja se löytyy polusta c:\program files\rstudio\bin\rstudio.exe Rstudio on niin ikään vapaasti saatavilla, eli sen voi halutessaan ladata omalle koneelleen. Peruskomentoja Komentoja esitellään kurssin kuluessa sitä mukaan kun niitä tarvitaan. Tässä muutamia käyttökelpoisia komentoja, joista voi olla apua alkuun pääsemiseksi. Muuttujien syöttäminen Muuttujia voidaan syöttää kuten esim. Matlabissa: x = 5 tai vaihtoehtoisesti x < 5 Vektoreita saadaan komennolla c() x = c(1,2,3) Matriisi voidaan syöttää vektorina X = matrix(c(1,1,1,1,1,1,1,1,2,3,4,5,6,7,8,9), nrow=8, ncol=2, byrow=false) Argumentit nrow ja ncol kertoo rivien ja sarakkeiden lukumäärän. Argumentti byrow kertoo miten matriisi täytetään, tässä tapauksessa sarakkeittain, eli ylhäältä alas ja vasemmalta oikealle. Huomaa, että R:ssä iso ja pieni kirjain eivät ole sama asia! Koodia kommentoidaan tuttuun tapaan merkillä #.
Työhakemiston vaihtaminen Työhakemistoa voidaan asettaa komennolla setwd(), ja hakemisto tulee siis sulkujen sisään. Ohjelmistossa Rstudio tämä onnistuu myös graafisesti valitsemalla ohjelman ylävalikosta Session Set Working Directory Choose Directory. Scriptit Kurssin tehtävät kannattaa tehdä R-scripteinä, joihin voi tarvittaessa palata myöhemmin. Scripti luodaan ohjelman ylävalikosta File New File- R Script. Scriptin voi ajaa komennolla source( scriptin_nimi.r ). Yksittäiset Scriptin rivit voi ajaa Windows-koneissa näppäinyhdistelmällä ctrl + r (huomaa että Ubuntussa vastaava on ctrl + ENTER). Datan lataaminen Kurssilla käsitellään usein dataa, joka on tallennettu ulkoiseen tiedostoon. Esimerkiksi työhakemistossa oleva tiedosto data.txt voidaan ladata komennolla read.table( data.txt, header=t, sep= \t ) Argumentti header=t kertoo, että tiedoston ensimmäinen rivi on otsikkorivi. Jos tiedoston ensimmäinen rivi halutaan tulkita dataksi, niin voidaan kirjoittaa header=f sen sijaan. Lisäksi jossain tapauksissa aineisto on eroteltu esimerkiksi tabulaattorilla, tällöin voidaan kirjoittaa sep= \t tai vaihtoehtoisesti jokin muu dataa erottava merkki (oletuksena pilkku). Komentojen etsiminen ja help Lisätietoja monista asioista saa komennolla help(). Esimerkiksi help(matrix) kertoo miten komennolla matrix voidaan luoda matriiseja. Erityisen kätevä on myös help.search( ), jolla komentoja yms. Voi hakea vapaalla sanahaulla. Esimerkiksi help.search( transpose ) hakee tietokannasta komentoja, joiden help-tiedostossa esiintyy sana transpose. Ajamalla haku huomataan, että matriisin X transpoosi voidaan ottaa komennolla t(x). Muuta:
R:n käyttämiseen on runsaasti materiaalia olemassa, mm. http://a-little-book-of-r-for-time-series.readthedocs.org/en/latest/ on R-opas aikasarja-analyysiä varten. Tehtävä 1.1. Tiedostoon NPAASTOT.txt on talletettu tulokset tutkimuksesta, jossa on selvitetty ilman kosteuden (Humidity), lämpötilan (Temp) ja paineen (Pressure) vaikutuksia kuorma-auton dieselmoottorin typpipäästöihin (NOx). (a) Tutustu aineistoon estimoimalla aineistoa kuvaavia tunnuslukuja ja piirtämällä muuttujia kuvaavat histogrammit. Ovatko muuttujat normaalijakautuneita? (b) Estimoi lineaarinen malli, jossa typpipäästöjä selitetään muuttujilla kosteus, lämpötila ja paine (c) Mikä on estimoidun mallin selitysaste? (d) Testaa permutaatiotestillä, mitkä regressiokertoimet ovat merkitseviä. Toista permutointi 2000 kertaa. (e) Poista selittäjät, jotka eivät ole merkitseviä ja estimoi lineaarinen malli. Suorita seuraavat kohdat ilman poistettuja selittäjiä. (f) Laske regressiokertoimien keskihajonnat käyttämällä luentokalvojen kaavoja. (g) Oletetaan, että normaalisuusoletus patee. Laske regressiokertoimien 95 % luottamusvälit komennolla confint(). (h) Oletetaan, että normaalisuusoletus pätee. Toista (g) käyttämällä luentokalvojen kaavoja. (i) Laske regressiokertoimien 95 % luottamusvälit käyttämällä bootstrapping menetelmää ja vertaa tuloksia kohtaan (g) ja (h). Käytä bootstrap-estimoimisessa silmukkaa, jonka pituus on 2000. Piirrä myös histogrammit boostrapestimaateista. Tehtävä 1.1. Ratkaisu: Ladataan tiedosto NPAASTOT.TXT ja liitetään sen sisältämät muuttujat. Lisäksi asetetaan seed(123), jotta saadaan vastaavat tulokset kun malleissa. paastot=read.table("npaastot.txt", header=t, sep="\t") set.seed(123)
Tämä sisältää 5 muuttujaa, nimiltään ObsNo, NOx, Humidity,Temp ja Pressure. ObsNo on vain havaintonumero, eikä se sisällä mielenkiintoista informaatiota. Aineiston tärkeimmät tunnusluvut saadaan kätevästi komennolla summary() summary(paastot) ObsNo NOx Humidity Temp Pressure Min. : 1.00 Min. :0.6900 Min. : 33.85 Min. :65.44 Min. :28.87 1st Qu.: 5.75 1st Qu.:0.7175 1st Qu.: 77.94 1st Qu.:73.50 1st Qu.:29.03 Median :10.50 Median :0.7600 Median : 96.22 Median :77.82 Median :29.07 Mean :10.50 Mean :0.7910 Mean : 93.98 Mean :78.57 Mean :29.15 3rd Qu.:15.25 3rd Qu.:0.8275 3rd Qu.:111.55 3rd Qu.:86.03 3rd Qu.:29.16 Max. :20.00 Max. :1.0100 Max. :139.47 Max. :89.28 Max. :29.98 Histogrammit saadaan piirrettyä komennolla hist() hist(paastot[,2]) tai hist(paastot[, NOx ]) hist(paastot[, Humidity ])
hist(paastot[,temp]) hist(paastot[, Pressure ]) Korrelaatiomatriisi saadaan laskettua komennolla cor()
cor(paastot) ObsNo NOx Humidity Temp Pressure ObsNo 1.0000000-0.1260915 0.3686937 0.25908229-0.24143057 NOx -0.1260915 1.0000000-0.8729408 0.65591970 0.27825058 Humidity 0.3686937-0.8729408 1.0000000-0.47282672-0.27050695 Temp 0.2590823 0.6559197-0.4728267 1.00000000 0.02677886 Pressure -0.2414306 0.2782506-0.2705070 0.02677886 1.00000000 Muuttuja NOx korreloi negatiivisesti muuttujan Humidity kanssa ja positiivisesti muuttujin Temp ja Pressure kanssa. Muuttujat eivät näytä normaalijakautuneilta. (b) Usean muuttujan regressio hoituu R:ssä laittamalla oikealle puolelle selittäjät + merkillä eroteltuna. sovite1 <- lm(nox ~Humidity+Temp+Pressure,data=paastot) summary(sovite1) Tämä tulostaa Call: lm(formula = NOx ~ Humidity + Temp + Pressure,data=paastot) Residuals: Min 1Q Median 3Q Max -0.061616-0.034795 0.003699 0.029233 0.077782 Coefficients: Estimate Std. Error t value Pr(> t ) (Intercept) -0.2707790 1.2538066-0.216 0.8317 Humidity -0.0025280 0.0004242-5.959 2e-05 *** Temp 0.0043960 0.0015320 2.869 0.0111 * Pressure 0.0327257 0.0418425 0.782 0.4456 --- Signif. codes: 0 *** 0.001 ** 0.01 * 0.05. 0.1 1 Residual standard error: 0.04249 on 16 degrees of freedom Multiple R-squared: 0.8441, Adjusted R-squared: 0.8149 F-statistic: 28.89 on 3 and 16 DF, p-value: 1.079e-06 (c) Mallin selitysaste on 84,4 %, mikä siis on luettu tulosteen kohdasta Multiple R-squared. Vastaava saadaan myös varianssianalyysihajotelmalla.
(d) Koska muuttujat eivät ole normaalijakautuneita, on kyseenalaista päätellä (b) kohdan taulukosta suoraan merkitsevät selittäjät. Permutoidaan selittävät muuttujat yksi kerrallaan ja katsotaan miten se vaikuttaa selitysasteeseen. k <- 2000 y.mean <- mean(paastot[,"nox"]) SST <- sum( (paastot[,"nox"] - y.mean)^2 ) SSE <- sum( (sovite1$res)^2) Rsquare1 <- 1 SSE/SST perm <- matrix(na,nrow=2000,ncol=3) for(i in 1:k){ tmp1 <- paastot tmp2 <- paastot tmp3 <- paastot tmp1[,"pressure"] <- sample(tmp1[,"pressure"]) tmp2[,"humidity"] <- sample(tmp2[,"humidity"]) tmp3[,"temp"] <- sample(tmp3[,"temp"]) tmpsovite1 <- lm(nox ~ Humidity + Temp + Pressure, data=tmp1) tmpsovite2 <- lm(nox ~ Humidity + Temp + Pressure, data=tmp2) tmpsovite3 <- lm(nox ~ Humidity + Temp + Pressure, data=tmp3) SSE1 <- sum( (tmpsovite1$res)^2) SSE2 <- sum( (tmpsovite2$res)^2) SSE3 <- sum( (tmpsovite3$res)^2) perm[i,1] <- 1 - SSE1/SST perm[i,2] <- 1 - SSE2/SST perm[i,3] <- 1 - SSE3/SST } pre <- 1- sum(perm[,1]<rsquare1)/k #0.4635
hum <- 1- sum(perm[,2]<rsquare1)/k #0 temp <- 1- sum(perm[,3]<rsquare1)/k #0.0115 (e) Muuttujat pre,hum ja temp ovat muodostettu siten että ykkösestä on vähennetty se osuus permutaatioista, joissa selitysaste on pienentynyt. Huomaa, että seed:in vaihtaminen saattaa muuttaa tuloksia hieman. Kyseiset luvut ovat nähdään koodissa kommentteina. Muuttujat kuvaavat nollahypoteesin (H0:regressiokerroin ei ole merkitsevä) p-arvoa (katso luentokalvot). Lukujen perusteella muuttujan Pressure nollahypoteesi voidaan hyväksyä 5% merkitsevyystasolla ja täten jättää pois mallista. Muiden regressiokertoimien nollahypoteesit hylätään. Perehdymme mallinvalintakriteereihin lisää ensi viikon harjoituksissa. sovite2=lm(nox ~ Humidity+Temp, data=paastot) summary(sovite2) Ja tuloste on: Call: lm(formula = NOx ~ Humidity + Temp, data=paastot) Residuals: Min 1Q Median 3Q Max -0.065394-0.018456-0.001075 0.032302 0.072869 Coefficients: Estimate Std. Error t value Pr(> t ) (Intercept) 0.703544 0.140272 5.016 0.000106 *** Humidity -0.002625 0.000401-6.547 4.98e-06 *** Temp 0.004253 0.001504 2.829 0.011586 * --- Signif. codes: 0 *** 0.001 ** 0.01 * 0.05. 0.1 1 Residual standard error: 0.04201 on 17 degrees of freedom Multiple R-squared: 0.8382, Adjusted R-squared: 0.8191 F-statistic: 44.03 on 2 and 17 DF, p-value: 1.891e-07
(f) Muodostetaan ensin uusi datamatriisi, josta on poistettu ylimääräiset selittäjät. Tehdään lisäksi tyyppimuunnos data framesta matriisiksi ja lisätään sarake mallin vakiota (intercept) varten tmp <- as.matrix(paastot[,c(3,4)]) paastot2 <- cbind(c(rep(1,20)),tmp) n <- dim(paastot2)[1] p <- dim(paastot2)[2] Lasketaan jäännösvarianssin harhaton estimaatti s 2 res <- sovite2$res s2 <- sum(res^2)/(n-p) Regressiokertoimien otosvarianssit saadaan kaavasta D 2(b j ) = s 2 [(X T X) 1 ] j+1,j+1 Otoskeskihajonnat ovat siis s 2 [(X T X) -1 ] diagonaalialkioiden neliöjuuria stdev <- sqrt(diag( s2*solve(t(paastot2)%*%paastot2))) Joka vastaa kohdan (e) taulukon arvoja. (g) (h) confinterval <-confint(sovite2,level=0.95) Ja tuloste on: 2.5 % 97.5 % (Intercept) 0.407595872 0.999491779 Humidity -0.003471148-0.001779119 Temp 0.001080766 0.007425475 Vastaavat tulosteet saadaan komennoilla (i) coef <- sovite2$coef up <- coef + stdev * qt(0.975,n-p) down <- coef stdev * qt(0.975,n-p) missä komento qt( ) antaa t-jakauman kvantiilin vapauasteella n-p. k <- 2000
bootmat <- matrix(na,nrow=k,ncol=3) for(i in 1:k){ tmp <- as.data.frame(paastot[sample(seq(n),replace=true),]) } sovite3 <- lm(nox ~ Humidity + Temp, data=tmp) bootmat[i,] <- sovite3$coef hist(bootmat[,1]) hist(bootmat[,2]) hist(bootmat[,3]) qconst <- quantile(bootmat[,1], probs = c(0.025,0.975)) qhum <- quantile(bootmat[,2], probs = c(0.025,0.975)) qtemp <- quantile(bootmat[,3], probs = c(0.025,0.975)) Luottamusvälit ovat nyt muuttujille pienemmät suhteessa (g) kohtaan. Miksi? Analysoiminen on jätetty osaksi tämän viikon kotitehtävää. Tehtävä 1.2 Tiedostossa TUPAKKA.txt on annettu seuraavat tiedot 11 maasta: KULUTUS = Savukkeiden kulutus per capita 1930 SAIRAST = Keuhkosyöpätapausten lukumäärä per 100 000 henkilöä 1950 Maat on numeroitu tiedostossa seuraavasti 1 = Islanti 7 = USA 2 = Norja 8 = Hollanti 3 = Ruotsi 9 = Sveitsi 4 = Kanada 10 =Suomi 5 = Tanska 11 =GB 6 = Itavalta Huomaa, että aineisto sisältää myös tämän tehtävän kannalta paljon ylimääräistä informaatiota. (a) Formuloi yhden selittäjän lineaarinen regressiomalli, jossa muuttujaa SAIRAST selitetään muuttujalla KULUTUS ja jossa on mukana vakio.
(b) (c) (d) (e) (f) (g) (h) (i) (j) Estimoi mallin regressiokertoimet PNS-menetelmällä ja esitä tulkinnat estimoiduille regressiokertoimille. Määrää estimoidun mallin selitysaste. Onko regressiosuoran kulmakerroin tilastollisesti merkitsevä? Käytä testissä 1 %:n merkitsevyystasoa. Testaa nollahypoteesia, jonka mukaan muuttujan KULUTUS regressiokerroin on nolla estimoidun mallin selitysasteeseen perustuvalla F-testillä 1 %:n merkitsevyystasoa käyttäen. Ota saamastasi testisuureen arvosta neliöjuuri ja vertaa sitä kohdassa (d) käyttämäsi testisuureen arvoon. Onko tulos sattuma? Piirrä estimoitu regressiosuora aineistoa kuvaavaan pistediagrammiin. Selitä mitä tarkoitetaan käsitteellä luottamusväli. Oleta normaalisuusoletuksen pätevän. Määrää kertoimien hajonnat sekä muodosta regressiosuoran kulmakertoimelle 95 %:n luottamusväli. Mikä on 99 %:n luottamusväli? Laske regressiokertoimien 95 % luottamusvälit käyttämällä bootstrapping menetelmää (2000 toistoa). Vertaa tuloksia kohtaan (h) Mitä etua bootstrapping menetelmästä on luottamusvälien laskemisessa suhteessa perinteiseen tapaaan laskea luottamusvälit?