Regressioonanalüüsi kodutöö Indrek Zolk 30. mai 2004. a. 1 Andmestiku kirjeldus Käesoleva kodutöö jaoks vajalik andmestik on saadud veebiaadressilt http://www-unix.oit.umass.edu/~statdata/statdata/stat-anova.html. Tegemist on 1917. aastal ilmunud raamatus esineva ja statistikas õppenäitena laialt kasutatava Laengelmavesi järvest (Tampere lähistel Soomes) püütud 7 erinevat liiki kalade andmetega. Meie valime uuritavaks kalaks latika. Valimi maht on 37 latikat, kuid ühel kalal pole massi mõõdetud, seetõttu arvame ta valimist välja. Analüüsitavaks valimiks võtame järelikult 36 latikat. Kuigi lähteandmestik sisaldab terve rea tunnuseid, kasutame neist kaht: latika mass (grammides) ja pikkus ninaotsast sabaotsani (sentimeetrites). Valime pikkuse seletavaks ja massi uuritavaks tunnuseks. Sel viisil määrates võib tulemustest kasu olla näiteks kalameestele või kala töötlemisega tegelevatele isikutele latika massi kiireks hindamiseks. Sisendfaili nimi on fishcatch.dat. Andmete analüüsimiseks kasutame statistikapaketti R, eelnevaks töötlemiseks aga UNIXi käsurea vahendeid. Käesolev tekst on vormistatud tekstikujundussüsteemis L A TEX. Vahendite suhtelise vähetuntuse tõttu eesti arvutialases kirjanduses toome lisas ka vastavad skriptifailid. 2 Statistikute hinnangud Latikate massi keskväärtuse punkthinnanguks on 626 grammi, usaldusvahemik (556.5538, 695.4462) katab parameetrit tõenäosusega 0.95. Latikate massi dispersiooni punkthinnanguks on 42685.45 (standardhälbe hinnang vastavalt 206.6046), usaldusvahemik (42616.01, 42754.9) katab parameetrit tõenäosusega 0.95. Histogrammist näeme, et latikate mass on ligikaudu normaaljaotusega (vaatlusi on vähe, seetõttu ei saa ilusat kellukesekujulist histogrammi oodatagi). latikaid 0 2 4 6 8 Latikate masside histogramm 200 400 600 800 1000 mass [g] 1
30 35 40 45 latikaid 0 1 2 3 4 5 6 7 Latikate pikkuste histogramm pikkus [cm] Latikate pikkuse keskväärtuse punkthinnanguks on 38.38529 grammi, usaldusvahemik (36.96807, 39.80252) katab parameetrit tõenäosusega 0.95. Latikate pikkuse dispersiooni punkthinnanguks on 17.77705 (standardhälbe hinnang vastavalt 4.216284), usaldusvahemik (16.35983, 19.19427) katab parameetrit tõenäosusega 0.95. Histogrammist näeme, et latikate pikkus on ligikaudu normaaljaotusega. Latikate massi ja pikkuse korrelatsioonikordaja on 0.9639427, mis näitab tugevat positiivset korrelatsiooni tunnuste vahel ja ennustab hea mudeli saamist. 3 Lineaarse regressiooni mudel Eeldusel, et andmed on sobival kujul (vt. lisa), saame paketis R järgmise väljundi: lm(formula = kalad$mass ~ kalad$pikkus) Coefficients: Estimate Std. Error t value Pr(> t ) (Intercept) -1187.119 89.000-13.34 1.29e-14 *** kalad$pikkus 47.235 2.305 20.49 < 2e-16 *** Residual standard error: 55.83 on 32 degrees of freedom Multiple R-Squared: 0.9292, Adjusted R-squared: 0.927 F-statistic: 419.9 on 1 and 32 DF, p-value: < 2.2e-16 --- Signif. codes: 0 *** 0.001 ** 0.01 * 0.05. 0.1 1 Analysis of Variance Table Response: kalad$mass Df Sum Sq Mean Sq F value Pr(>F) kalad$pikkus 1 1308869 1308869 419.88 < 2.2e-16 *** Residuals 32 99751 3117 2.5 % 97.5 % (Intercept) -1368.40523-1005.83186 kalad$pikkus 42.53931 51.93012 Siit loeme välja, et lineaarse regressiooni mudeli parameetrite punkthinnangud on: ˆα = 1187.119, ˆβ = 47.235, ˆσ 2 = 3117, usaldusvahemikud ( 1368.40523, 1005.83186) ja (42.53931, 51.93012) katavad tõenäosusega 0.95 vastavalt parameetrit α ja β, ning mudeliks on mass = 1187.119 + 47.235 pikkus, ( ) 2
kusjuures mõlemad liikmed on olulised (olulisuse märgendiks on pakett R suuruste Pr(> t ) väiksuse põhjal andnud ***, s.t. maksimaalse võimaliku). Uuritava tunnuse sõltuvus seletavast tunnusest on oluline, sest kordaja β on mudelis oluline. Mudel kirjeldab ligi 93% tunnuse varieeruvusest (R-ruut statistik), seega on tegemist võrdlemisi hea mudeliga. Nagu näha kordaja ˆβ märgist, on sõltuvus positiivne. Ühe sentimeetri latika pikkuse kasvades kasvab mass keskmiselt 47.235 grammi. Mudeli puhul tuleb muidugi silmas pidada, et negatiivse vabaliikme tõttu ei saa prognoosida väga lühikeste latikate masse (taolisi looduses peaaegu ei eksisteerigi) sest mudel annaks nende massiks negatiivse suuruse. Parameetri β usaldusvahemiku poolpikkus 4.695404 võimaldab näiteks tõenäosusega 95% öelda, et ühe sentimeetri latika pikkuse kasvades kasvab mass 47.235 ± 4.695404 grammi. Hajuvusdiagrammil on pideva sirgega märgitud mudelile ( ) vastav regressioonsirge ja punktiiriga massi keskväärtuse punkthinnang. pikkus * mass hajuvusdiagramm mass [g] 400 600 800 1000 30 35 40 45 pikkus [cm] Prognoosides massi näiteks pikkuse keskväärtuse punkthinnangu 38.38529 korral, saame massiks 1187.119 + 47.23472 38.38529 = 626.00 grammi, s.t. täpselt massi keskväärtuse punkthinnangu. 3
Lisa Sisendfaili kuju Sisendfail fishcatch.dat on järgmisel tekstilisel kujul:... 1 1 242.0 23.2 25.4 30.0 38.4 13.4 NA 2 1 290.0 24.0 26.3 31.2 40.0 13.8 NA 3 1 340.0 23.9 26.5 31.1 39.8 15.1 NA 4 1 363.0 26.3 29.0 33.5 38.0 13.3 NA 5 1 430.0 26.5 29.0 34.0 36.6 15.1 NA 156 7 1000.0 39.8 43.0 45.2 26.4 16.1 0 157 7 1100.0 40.1 43.0 45.5 27.5 16.3 0 158 7 1000.0 40.2 43.5 46.0 27.4 17.7 1 159 7 1000.0 41.1 44.0 46.6 26.8 16.3 0 Teises veerus on märgitud kala liik (latikas=1), kolmandas mass ja kuuendas pikkus ninast sabaotsani. Ülejäänud veerud pole analüüsiks momendil olulised. Sisendfaili eeltöötlus tekstitöötluskeeles awk Faili tunnused.awk sisu: BEGIN{ OFS="\t"; print "MASS", "PIKKUS" { if ($2=="1") { print $3, $6 Skript on vajalik sisendfailist ainult kahe tunnuse eraldamiseks ainult nende vaatluste korral, kus teises veerus paikneb arv 1 (latikas). Andmete töötlemine statistikapaketis R Faili andmed.r sisu: require(boot) data <- read.table("kalad.txt", header=true) data <- na.omit(data) kalasid <- nrow(data) 4
kalad <- list(mass=data[,1], PIKKUS=data[,2]) mass.k <- mean(kalad$mass) mass.d <- var(kalad$mass) mass.k # NB! mass.d on s^2 kalade massi jaoks. Keskväärtuse mass.k # dispersiooni hinnangu saamiseks (var.t0) tuleb jagada kalade arvuga norm.ci(t0=mass.k, conf=0.95, var.t0=mass.d / kalasid) mass.d sd(kalad$mass) norm.ci(t0=mass.d, conf=0.95, var.t0=mass.d / kalasid) pikkus.k <- mean(kalad$pikkus) pikkus.d <- var(kalad$pikkus) pikkus.k norm.ci(t0=pikkus.k, conf=0.95, var.t0=pikkus.d / kalasid) pikkus.d sd(kalad$pikkus) norm.ci(t0=pikkus.d, conf=0.95, var.t0=pikkus.d / kalasid) graphics.off() postscript("massihist.ps") plot(hist(kalad$mass, plot=false), main="", xlab="", ylab="") title("latikate masside histogramm", cex.main=3, xlab="mass [g]", ylab="latikaid") postscript("pikkushist.ps") plot(hist(kalad$pikkus, plot=false), main="", xlab="", ylab="") title("latikate pikkuste histogramm", cex.main=3, xlab="pikkus [cm]", ylab="latikaid") cor(kalad$mass,kalad$pikkus) mudel <- lm(kalad$mass ~ kalad$pikkus) summary(mudel) anova(mudel) piirid <- confint(mudel, level=0.95) piirid (piirid[4]-piirid[2])/2 postscript("regmudel.ps") plot(kalad$pikkus,kalad$mass, main="", xlab="", ylab="") title("pikkus * mass hajuvusdiagramm", cex.main=2.5, xlab="pikkus [cm]", ylab="mass [g]") kordajad <- coef(mudel) lines(kalad$pikkus,kordajad[1]+kordajad[2]*kalad$pikkus) lines(kalad$pikkus,array(mass.k, c(1,kalasid)),lty=2) kordajad[1]+kordajad[2]*pikkus.k Koduülesande kompileerimine Faili compile sisu: awk -f tunnused.awk fishcatch.dat > kalad.txt R --quiet --no-save < andmed.r latex regan.tex dvips regan.dvi -o regan.ps gs -q -sdevice=pdfwrite -soutputfile=regan.pdf -spapersize=a4 -dnopause -dbatch regan.ps Koduülesande pdf-väljundi saamiseks piisab seega UNIXi käsurealt anda käsk./compile, eeldusel, et jooksvas kataloogis on ülalnimetatud neli faili ning käesolev algtekst regan.tex. 5