Nagu t-testigi puhul, on lineaarse regressiooni eelduseks, et
Kasutame eelmisest korrast tuttavat Levshina õpiku andmestikku ldt
. Eelmisel korral leidsime, et sõnade äratundmise keskmise reaktsiooniaja ja sõna pikkuse vahel oli positiivne korrelatsioon. Proovime sama lineaarse regressioonimudeliga testida.
ldt <- read.csv("ldt.csv")
plot(Mean_RT~Length, data=ldt, xlab="Sõna pikkus", ylab="Keskmine reaktsioonikiirus")
m <- lm(Mean_RT~Length, data=ldt, subset=Mean_RT < 1200)
abline(m, col="red")
Kas mudeli eeldused on täidetud?
Lineaarse mudeli saab käsuga lm()
, mida kasutasime juba regressioonijoone joonistamiseks.
Mudelist ülevaate saamiseks kasutame käsku summary()
##
## Call:
## lm(formula = Mean_RT ~ Length, data = ldt2)
##
## Residuals:
## Min 1Q Median 3Q Max
## -259.247 -63.097 -0.795 53.320 224.378
##
## Coefficients:
## Estimate Std. Error t value Pr(>|t|)
## (Intercept) 547.379 35.950 15.226 < 2e-16 ***
## Length 30.242 4.261 7.096 2.29e-10 ***
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## Residual standard error: 99.96 on 95 degrees of freedom
## Multiple R-squared: 0.3465, Adjusted R-squared: 0.3396
## F-statistic: 50.36 on 1 and 95 DF, p-value: 2.289e-10
## [1] "0.0000000002289"
Niisiis mudel on oluline tasemel p<0.001***. See tähendab, et tõenäosus juhuslikult selline tulemus saada on väga väike ja võime hüljata 0-hüpoteesi.
Vaatame joonist uuesti natuke lähemalt:
Vabaliige on y telje väärtus, kui x on 0, kalle on y väärtuse muutus, kui x on 1. See, et tegelikult andmed x-teljel 0 ja 1 punkte ei läbi (ei saagi läbida, sest ühegi sõna pikkus ei saa olla 0), ei oma tähtsust. Kuna tegemist on lineaarse regressiooniga, siis me võime vabaliikme ja kalde väärtuste põhjal tuletada ükskõik millise punkti väärtused.
Loeme sisse tabeli eesti keele eriala doktoritööde bibliograafiaga. Kuna see on tabulatsioonidega eristatud tabelifail, siis võib selle lugemiseks kasutada read.table()
alamkäsku read.delim()
. Funktsioon on sama, argumentide vaikeväärtused on veidi erinevad.
Kontrollime mudeli eeldusi: - Sõltumatute tunnuste eeldus kehtib: mõõtmised on sõltumatud, iga rida andmestikus on üks iseseisev dissertatsioon, korduvaid autoreid või korduvaid väitekirju ei esine. - kas lehekülgede arv ja ilmumisaasta on normaaljaotusega? Kontrollime qqnorm ja Shapiro testiga.
Teeme lineaarse mudeli, kus aasta on kirjeldav tunnus ja lehekülgede arv on sõltuv tunnus. Kui korrelatsiooni puhul ei olnud oluline, kumb on x ja kumb on y, siis lineaarses mudelis y on sõltuv tunnus, mida sõltumatud kirjeldavad tunnused kirjeldavad. Kahe arvulise tunnuse seose vaatamisel töötaks seos sama hästi ka teist pidi, aga ei pruugi olla loogiline. Näiteks siingi on loogiline, et väitekirja maht võib sõltuda sellest, millal ta kirjutati, aga kindlasti ei saa sõltuda väitekirja kirjutamise aasta sellest, kui mahukaid töid siis kaitsti.
##
## Call:
## lm(formula = lk ~ aasta, data = dokt)
##
## Residuals:
## Min 1Q Median 3Q Max
## -154.720 -48.182 -1.818 28.347 238.156
##
## Coefficients:
## Estimate Std. Error t value Pr(>|t|)
## (Intercept) -4628.590 3148.199 -1.470 0.149
## aasta 2.412 1.568 1.538 0.131
##
## Residual standard error: 77.48 on 42 degrees of freedom
## Multiple R-squared: 0.05333, Adjusted R-squared: 0.03079
## F-statistic: 2.366 on 1 and 42 DF, p-value: 0.1315
See mudel ei ole oluline: mudeli väljundi viimane rida ütleb, et võimalus sellist seost juhuslikult leida on 13% ehk p on suurem kui ɑ ehk 0.05. Seega tuleb jääda 0-hüpoteesi juurde.
Kuigi see mudel ei ole oluline ja ülejäänud mudeli väljundit pole põhjust anlüüsid, võiks korraks vaadata koefitsiente. Miks mudeli vabaliige (Intercept) on negatiivne? Sest mudel arvestab seda lõikumisena 0-punktis ja seletava tunnuse aasta mõõdetud väärtused on 0-punktist väga kaugel. Kui eeldada lineaarset suhet, siis mudeli järgi oli aastal 0 doktoritööde maht -4628 lehekülge. Tegelikult ei peaks muidugi vaatama mudelit tegelike andmete muutumispiirkonnast väljaspool. Põhimõtteliselt oleks ka võimalik mitte mudelile vabaliiget jätta või siis teisendada andmeid nii, et 0 oleks näiteks esimene vaadeldav aasta, kust meil on mõõtmisi.
Lineaarse regressiooni mudeli seletavaks tunnuseks võib olla ka nominaalne tunnus ehk faktor. Faktori puhul valitakse üks tase baastasemeks. Teiste tasemete väärtust hinnatakse baastaseme suhtes. Baastase on mudeli vabaliige ehk intercept ning iga teise taseme kohta arvutatakse erinevus baastasemest. Erinevus arvulise kirjeldava tunnusega mudelist on see, et kui arvulise tunnuse puhul on üks kalde kordaja, siis nominaalse tunnuse puhul on iga baastasemest erineva taseme kohta eraldi kordaja.
Võtame valimistulemuste andmestiku ja vaatame alustuseks kahe tasemega faktorit: kas sugu mõjutab häältesaaki?
Kas mudeli eeldused on täidetud?
Milline tase valida baastasemeks? Mõnel juhul on lihtne ja selge, et üks väärtus on kuidagi moodi vaikimisi väärtus ja teised väärtused on markeeritud. Aga ka siis, kui meil pole mingit sisulist või ideoloogilist eelistust, peame valima ühe taseme baastasemeks.
Kahetasemelise faktori puhul ei ole mudeli väljundi tõlgenduse seisukohast väga suurt vahet, mis on baastase, aga sellest sõltub, mis on vabaliige ehk intercept. Vaikimisi on baastase faktori esimene tase ja kui me pole nominaalse tunnuse tasemete järjekorda faktorina eksplitsiitselt määranud, siis enamasti on see lihtsalt tähestikulises järjekorras.
##
## Call:
## lm(formula = log(haali_kokku) ~ sugu, data = kandidaadid)
##
## Residuals:
## Min 1Q Median 3Q Max
## -5.0875 -1.1053 0.0254 1.0231 5.0573
##
## Coefficients:
## Estimate Std. Error t value Pr(>|t|)
## (Intercept) 5.08749 0.05773 88.120 <2e-16 ***
## sugunaine -0.23767 0.10018 -2.372 0.0178 *
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## Residual standard error: 1.564 on 1097 degrees of freedom
## Multiple R-squared: 0.005104, Adjusted R-squared: 0.004197
## F-statistic: 5.628 on 1 and 1097 DF, p-value: 0.01785
Muus osas on nominaalse faktoriga mudeli väljund sama nagu arvuilse sõltumatu tunnuse puhul:
AGA nüüd on vabaliikmeks ehk mõtteliseks 0-punktiks faktori baastase. St esimene rida (Intercept) ütleb, mis on häältesaagi väärtus juhul, kui sugu on baastasemel ehk “mees” ning teine rida ehk slope ütleb seda, kui palju see muutub siis, kui faktori tase on “naine”.
Mudel annab prognoositud väärtused: meeste häälesaak on 5.08749 ühikut ja naiste oma on meeste omast -0.23767 võrra erinev. Ühikud on üldiselt samad mudeli sisendiks olnud ühikud, ehk hääled, AGA siin peab meeles pidama, et kui normaliseerimise eesmärgil sai uuritav tunnus logaritmitud, siis mudeli prognoositud väärtustest algse ühiku kätte saamiseks peame tegema logaritmimise pöördtehte ehk astendama:
## (Intercept)
## 161.9826
# Naiste väärtuse saamiseks tuleb koefitsiendid kokku liita
exp(sugu.lm$coefficients[1]+sugu.lm$coefficients[2])
## (Intercept)
## 127.7179
Proovime nüüd testida seletavat tunnust, millel oleks rohkem kui kaks taset. Haridusel on kandidaatide andmestikus 4 taset, aga kuna algharidusega kandidaate on ainult 1, siis ilmselt oleks mõistlik jätta see kandidaat analüüsist välja, sest üks mõõtmispunkt on liiga vähe, et seost kirjeldada.
haridus.lm <- lm(log(haali_kokku)~haridus, data=kandidaadid, subset = haridus != "Algharidus")
summary(haridus.lm)
##
## Call:
## lm(formula = log(haali_kokku) ~ haridus, data = kandidaadid,
## subset = haridus != "Algharidus")
##
## Residuals:
## Min 1Q Median 3Q Max
## -4.3599 -1.0568 0.0468 0.9530 4.6607
##
## Coefficients:
## Estimate Std. Error t value Pr(>|t|)
## (Intercept) 4.35993 0.09282 46.971 <2e-16 ***
## haridusKõrgharidus 0.88651 0.10679 8.302 3e-16 ***
## haridusPõhiharidus -1.02977 0.41437 -2.485 0.0131 *
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## Residual standard error: 1.511 on 1095 degrees of freedom
## Multiple R-squared: 0.07314, Adjusted R-squared: 0.07144
## F-statistic: 43.2 on 2 and 1095 DF, p-value: < 2.2e-16
Mudeli väljund ütleb meile et:
exp()
): kõrgharitute logaritmitud häältesaak oli 4.36 + 0.89 = 5.25 ehk 189.89. Ja see erinevus keskharidusega kandidaatidest on oluliselt erinev p<0.001.Anova võrdleb rühmade hajuvust valimi üldise hajuvusega. R-is on ANOVA seotud lineaarse mudeliga, selle saab, kui lineaarne mudel anda käsu anova()
sisendiks. Mõnes mõttes see on lihtsalt alternatiivne viis seost kirjeldada, selle kaudu saab anda ühe üldhinnangu kategoriaalse faktori olulisusele, samas kui lineaarne mudel annab iga taseme võrdluse baastasemega.
## Analysis of Variance Table
##
## Response: log(haali_kokku)
## Df Sum Sq Mean Sq F value Pr(>F)
## sugu 1 13.77 13.7696 5.6281 0.01785 *
## Residuals 1097 2683.88 2.4466
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
Kuidas väljundit lugeda?
Kahe tasemega faktori puhul on tulemus võrdlemisi sarnane t-testiga.
##
## Welch Two Sample t-test
##
## data: log(haali_kokku) by sugu
## t = 2.4084, df = 756.57, p-value = 0.01626
## alternative hypothesis: true difference in means is not equal to 0
## 95 percent confidence interval:
## 0.04394483 0.43138548
## sample estimates:
## mean in group mees mean in group naine
## 5.087489 4.849824
Nüüd näide rohkem kui kahe tasemega faktorist: kandidaatide andmestikus haridus on 4 taset, või kui ainult ühe mõõtmisega põhiharidus välja visata, siis on 3 taset. Ainult üks mõõtmine on endiselt liiga vähe. Aga kolme rühmaga enam t-testi teha ei saa.
haridus.lm <- lm(log(haali_kokku)~haridus, data=kandidaadid, subset = haridus != "Algharidus")
anova(haridus.lm)
## Analysis of Variance Table
##
## Response: log(haali_kokku)
## Df Sum Sq Mean Sq F value Pr(>F)
## haridus 2 197.27 98.637 43.202 < 2.2e-16 ***
## Residuals 1095 2500.07 2.283
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
Iga kord, kui me teeme mõne statistilise testi, on teatav võimalus, et me saame olulise tulemuse juhuslikult. Sama andmestiku peal veidi erinevate kombinatsioonidega sama testide tegemisel kõik juhuslikud efektid kasvavad. Samas, kui oleme ANOVA testiga teada saanud, et rohkem kui kahe tasemega faktoril on oluline üldefekt, tahaks me teada, milliste faktori tasemete vahel erinevus oli. Selleks peaks faktori tasemeid paari kaupa testima, aga tulemuste tõlgendamisel arvestama kordustega. Seda nimetatakse post-hoc testimiseks.
Üks võimalus oleks korrata lineaarset mudelit nii mitu korda, nagu on tarvis kõigite tasemete võrdlemiseks, muutes iga testikorral vastavalt faktori baastaset. Seejärel tulemuste tõlgendamisel jagatakse usaldusnivoo korduste arvuga. Seda nimetatakse Bonferroni paranduseks (Bonferroni correction). Näiteks kui meil on 3 faktori taset, siis kõigi võrdluste saamiseks peame kordama testi 2 korda ja langetama ɑ taset vastavalt 0.05/2 = 0.025.
Näites 4 saime teada, et keskharidusega (baastase) kandidaatide häältesaak oli oluliselt erinev kõrgharidusega (p<0.001) ja põhiharidusega (p<0.05) kandidaatidest:
ning ANOVA testi põhjal võime öelda, et haridus on oluline faktor [F(2, 1095) = 43.202, p < 0.001], sest leidub tase, mis on teistest erinev:
siis me ei tea, kas kõrgharidus ja põhiharidus omavahel ka erinevad on.
Kordame lihtsalt lineaarset mudelit muudetud baasväärtusega. Sellks võib andmestikus muuta ära baasväärtuse käsuga relevel()
, aga kui me ei taha andmestikku muuta, võib ainult lm()
käsu sees muuta faktori baastaset käsuga C()
. Lisaks, kuna ühe haridustaseme jätsime välja, tuleks kasutada käsku droplevels()
, mis eemaldab faktoritasemed, mida ei esine.
haridus.lm1 <- lm(log(haali_kokku)~C(droplevels(haridus), base=1), data=kandidaadid[ kandidaadid$haridus != "Algharidus",])
haridus.lm2 <- lm(log(haali_kokku)~C(droplevels(haridus), base=3), data=kandidaadid[ kandidaadid$haridus != "Algharidus",])
summary(haridus.lm1)
##
## Call:
## lm(formula = log(haali_kokku) ~ C(droplevels(haridus), base = 1),
## data = kandidaadid[kandidaadid$haridus != "Algharidus", ])
##
## Residuals:
## Min 1Q Median 3Q Max
## -4.3599 -1.0568 0.0468 0.9530 4.6607
##
## Coefficients:
## Estimate Std. Error t value Pr(>|t|)
## (Intercept) 4.35993 0.09282 46.971 <2e-16 ***
## C(droplevels(haridus), base = 1)2 0.88651 0.10679 8.302 3e-16 ***
## C(droplevels(haridus), base = 1)3 -1.02977 0.41437 -2.485 0.0131 *
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## Residual standard error: 1.511 on 1095 degrees of freedom
## Multiple R-squared: 0.07314, Adjusted R-squared: 0.07144
## F-statistic: 43.2 on 2 and 1095 DF, p-value: < 2.2e-16
##
## Call:
## lm(formula = log(haali_kokku) ~ C(droplevels(haridus), base = 3),
## data = kandidaadid[kandidaadid$haridus != "Algharidus", ])
##
## Residuals:
## Min 1Q Median 3Q Max
## -4.3599 -1.0568 0.0468 0.9530 4.6607
##
## Coefficients:
## Estimate Std. Error t value Pr(>|t|)
## (Intercept) 3.3302 0.4038 8.246 4.64e-16 ***
## C(droplevels(haridus), base = 3)1 1.0298 0.4144 2.485 0.0131 *
## C(droplevels(haridus), base = 3)2 1.9163 0.4073 4.705 2.86e-06 ***
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## Residual standard error: 1.511 on 1095 degrees of freedom
## Multiple R-squared: 0.07314, Adjusted R-squared: 0.07144
## F-statistic: 43.2 on 2 and 1095 DF, p-value: < 2.2e-16
Nüüd saame mudeli väljunditest välja noppida kõikide paaride võrdluste p-väärtused. Kuna kordasime testi 2 korda, siis peame usaldusnivood langetama poole võrra, mis tähendab seda, et harjumuspäraste p-väärtuste saamiseks hoopis korutame need korduste arvuga:
## C(droplevels(haridus), base = 1)2 C(droplevels(haridus), base = 1)3
## 5.993082e-16 2.619409e-02
## C(droplevels(haridus), base = 3)1 C(droplevels(haridus), base = 3)2
## 2.619409e-02 5.721540e-06
Ja lõpetuseks veel, kui e astmetega komakohtade arvutamine tundub tüütu, võib R-i sundida teisendama:
## C(droplevels(haridus), base = 1)2 C(droplevels(haridus), base = 1)3
## "0.0000000000000005993082" "0.0261940889199223300721"
## C(droplevels(haridus), base = 3)1 C(droplevels(haridus), base = 3)2
## "0.02619408892" "0.00000572154"
Siit nüüd saame välja lugeda, et erinevused on:
Teine võimalus on kasutada Tukey Honest Significant Differences testi, mis teeb kõigi kombinatsioonide võrdlused ja korrigeerib p-väärtuseid vastavalt.
R-is on Tukey testi sisendiks anova test. Anova testi tegemiseks on R-is mitu eri süntaksit, üks variant on panna lineaarne mudel anova käsu sisse. Tukey testi sisendiks peab aga kasutama käsku aov().
haridus.anova <- aov(log(haali_kokku)~haridus, data=kandidaadid, subset = haridus != "Algharidus")
summary(haridus.anova)
## Df Sum Sq Mean Sq F value Pr(>F)
## haridus 2 197.3 98.64 43.2 <2e-16 ***
## Residuals 1095 2500.1 2.28
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## Tukey multiple comparisons of means
## 95% family-wise confidence level
##
## Fit: aov(formula = log(haali_kokku) ~ haridus, data = kandidaadid, subset = haridus != "Algharidus")
##
## $haridus
## diff lwr upr
## Kõrgharidus-Keskharidus (sh keskeriharidus) 0.8865119 0.6358934 1.13713034
## Põhiharidus-Keskharidus (sh keskeriharidus) -1.0297743 -2.0022493 -0.05729919
## Põhiharidus-Kõrgharidus -1.9162861 -2.8721144 -0.96045787
## p adj
## Kõrgharidus-Keskharidus (sh keskeriharidus) 0.0000000
## Põhiharidus-Keskharidus (sh keskeriharidus) 0.0349434
## Põhiharidus-Kõrgharidus 0.0000085
Tukey testi väljund annab paarikaupa võrdluses:
Kordamisküsimuste testi saad teha moodlis, seal näed peale vastamist ka õigeid vastuseid ja kommentaare. Testi võib teha mitu korda ja sinu vastuseid ei arvestata kursuse soorituse hindamisel.
## Estimate Std. Error t value Pr(>|t|)
## (Intercept) 547.3792 35.949589 15.226300 3.130610e-27
## Length 30.2416 4.261484 7.096495 2.289494e-10