Kasutame andmestikke:
ldt.csv
teke2
(loeme otse dataDOI repositooriumist,
ei pea faili alla laadima)Nagu t-testigi puhul, on lineaarse regressiooni eelduseks mõõtmiste sõltumatus ja normaaljaotus, aga nüüd peaks testima pigem mudeli jääkide jaotust, mitte iga üksiku tunnuse oma. Niisiis, lineaarse regressioonimudeli eeldused on:
Kasutame üle-eelmisest korrast tuttavat Levshina õpiku andmestikku
ldt
. Eelmisel korral testiseme kahe arvulise tunnuse
vahelist seost ning leidsime, et sõnade äratundmise keskmise
reaktsiooniaja ja sõna pikkuse vahel oli positiivne
korrelatsioon. Proovime sama lineaarse regressioonimudeliga testida.
ldt <- read.csv("data/ldt.csv")
plot(Mean_RT~Length, data=ldt, xlab="Sõna pikkus (tähemärkides)", ylab="Keskmine reaktsiooniaeg (ms)")
m <- lm(Mean_RT~Length, data=ldt, subset=Mean_RT < 1200)
abline(m, col="red")
Kui korrelatsiooni puhul testisime me seda, kas kahe arvulise tunnuse vahel on seos, siis nüüd otsime põhjuslikku seost. Kahe arvulise tunnuse puhul võib see olla vaid sõnastuslik küsimus, aga siiski tasuks läbi mõelda, kumb tunnus võiks põhjustada teise muutumist:
Lineaarse mudeli saab käsuga lm()
, mida kasutasime juba
regressioonijoone joonistamiseks.
Mudelist ülevaate saamiseks kasutame käsku summary()
Mudeli jäägid (residuals) on see osa uuritava tunnuse väärtustest, mis jääb mudelis kirjeldavate tunnuste kaudu seletamata. See on siis iga mõõtmispunkti kaugus regressioonijoonest.
plot(Mean_RT~Length, data=ldt2);abline(lm(m), col = "red")
for (i in 1:nrow(ldt2)) {
lines(rep(ldt2$Length[i],
length(ldt2$Mean_RT[i]:m$fitted[i])),
ldt2$Mean_RT[i]:m$fitted[i],
lty = "dashed")
}
Mudeli väljund R-is on objektitüübi poolest list (vt
mode(m)
ja str(m)
). Mudeli jäägid on vektorina
selle listi elemendis ..$residuals ja selle vektori iga väärtus vastab
ühele andmestiku mõõtmispunktile.
Lineaarse mudeli eeldus on, et mudeli jäägid on normaaljaotusega. Testime:
##
## Shapiro-Wilk normality test
##
## data: residuals(m)
## W = 0.98574, p-value = 0.3801
##
## 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
Vaatame joonist uuesti natuke lähemalt:
Vabaliige on y telje väärtus, kui x on 0, siin siis 547 ms. Kalle on y väärtuse muutus, kui x muutub 1 ühiku võrra. Kui sõna pikeneb ühe tähemärgi võrra, kasvab reaktsiooniaeg 30 millisekundi võrra. 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.
Kasutame teismeliste kõnetempo andmestikku ja vaatame, kas kõnetempo sõltub vanusest. Andmestik on pärit artiklist Lippus, Pärtel, Maarja-Liisa Pilvik, Kaidi Lõo & Liina Lindström. 2024. Kõnetempo ja -soravuse varieerumine eesti keeles. Eesti Rakenduslingvistika Ühingu aastaraamat = Estonian Papers in Applied Linguistics 20. 149–163. https://doi.org/10.5128/ERYa20.09.
load(url("https://datadoi.ee/bitstream/handle/33/592/teke_globaalne_konetempo.Rda?sequence=21&isAllowed=y"))
Kuigi artikkel, kus seda andmestikku on kasutatud, uurib kõnetempo varieerumist, ei ole tabelis see valmis kujul olemas vaid tuleb arvutada. Kõnetempona mõõdetakse, mitu silpi lausub kõneleja ühe sekundi jooksul. Andmestikus on tulp kõneleja silpide arvuga ja teine tulp tema kõnevoorude kogukestusega. Arvutame kõnetempo, jagades silpide arvu kõnevoorude kestusega:
Mis võiks olla uuritav tunnus, mis kirjeldav? Sõnastame hüpoteesid.
Teeme lineaarse mudeli.
Kas mudeli jäägid on normaaljaotusega?
Vaatame mudeli väljundit.
Vaatame veel korraks mudeli koefitsiente.
## (Intercept) vanus
## 3.1210763 0.1631468
Mis on mudeli vabaliige (Intercept) väärtus? Mudel arvestab seda lõikumisena 0-punktis ehk et see väärtus oleks uuritaval tunnusel siis, kui seletava tunnuse vanus oleks 0. Tegelikult meil algavad vaatlused alles väärtusest 10. Kui eeldada lineaarset suhet, siis mudeli järgi oli vanuses 0 doktoritööde maht 3 silpi/sek. Eeldades lineaarset kasvu, hindaks see mudel, et kasvades iga eluaastaga 0.163 silpi/sek võrra, jõudis tööde maht 10. eluaastaks 5 silp/sek ja 18. eluaastaks 6 silp/sek.
Eeldades, et seos on lineaarne, saame me selle kehtimist laiendada näiteks inimese elueale 0-90 eluaastani
plot(konetempo~vanus, data=teke2, main="Kõnetempo muutumine sõltuvalt vanusest", xlim=c(0, 90), ylim=c(3,18))
abline(mudel)
Tegelikult ei peaks muidugi vaatama mudelit tegelike andmete muutumispiirkonnast väljaspool. Mõningatel juhtudel on kasulik teisendada andmeid nii, et 0 oleks näiteks esimene vaadeldav aasta, kust meil on mõõtmisi (st siin 10-aastased), sellisel juhul on vabaliige ja kirjeldavate tunnuste efektid paremini interpreteeritavad. Siin andmestikus väga suurt nihet sellega pole, aga kui me näiteks vanuse asemel hindaks sünniaastat ja need algaksid umbes 2000. aastast, siis lineaarne kasv 0.163 silpi/sek võrra aastas eeldaks, et 0 aastal oli kõnetempo -323 silpi sekundis, mis ei meigi mingit senssi.
Kasutame andmestikku, mis on kogutud eesti keele spontaanse kõne foneetilisest korpusest, kasutatud artiklis Lippus, P., Asu, E. L., Teras, P., & Tuisk, T. (2013). Quantity-related variation of duration, pitch and vowel quality in spontaneous Estonian. Journal of Phonetics, 41(1), 17–28. https://doi.org/10.1016/j.wocn.2012.09.005
Selles töös uuriti eesti keele välte akustilisi tunnuseid. Eesti keeles on 3 väldet (nt sada : saada : saada). Töös uuriti häälikute kestus, põhitooni liikumist ja vokaalikvaliteeti sõltuvalt vältes ja sõna lauserõhust.
Andmestik on saadaval DataDOI repositooriumis: http://dx.doi.org/10.15155/repo-16 Loeme sisse otse veebilingilt.
dat <- read.delim("http://datadoi.ut.ee/bitstream/handle/33/51/Lippus_etal_JPhon2013_dataset.txt?sequence=4&isAllowed=y")
Andmestikus on info 1714 kahesilbilise sõna kohta. Tegemist on korpusuuringuga, mis tüüpiliselt rikub tavalise lineaarse mudeli mõõtmiste sõltumatuse nõuet: meil on ühelt kõnelejalt korjatud kokku kõik uurimiskriteeriumitele vastavad sõnad ja ühelt kõnelejalt on andmestikus rohkem kui üks rida; samuti võivad andmestikus esineda korduvad sõnad.
## 0% 25% 50% 75% 100%
## 23 41 64 108 203
##
## 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 20 21
## 179 63 28 18 13 8 7 8 5 4 4 1 1 1 3 4 1 2 2 1
## 23 24 25 26 31 36 38 40 50 54 56 93 117
## 2 1 1 1 1 1 1 1 1 1 1 1 1
Et andmed oleksid tavalise lineaarse mudeliga analüüsitavad ja ei rikuks sõltumatute mõõtmiste nõuet, keskmistame andmed iga kõneleja iga uuritava tunnuse kohta:
# Kodeerime numbrina sisestatud välte ümber faktoriteks:
dat$Quantity <- factor(dat$Quantity); levels(dat$Quantity) <- paste0("Q", levels(dat$Quantity))
library(tidyverse)
# keskmistatud andmestik
dat2 <- dat %>%
dplyr::filter(Struct == "cvcv") %>%
group_by(SP, Gender, Quantity, Intonation) %>%
summarise(C1 = mean(C1, na.rm=T), V1 = mean(V1), C2 = mean(C3), V2 = mean(V2),
TP.time = mean(TP.time, na.rm=T), S1.f0.end = mean(S1.f0.end, na.rm=T),
S1.f0.range = mean(S1.f0.range, na.rm=T), S2.f0.range = mean(S2.f0.range, na.rm=T),
Euk1 =mean(Euk1), Euk2 = mean(Euk2))
Näitena kahetasemega seletavast faktorist võiksime küsida, kas lauserõhulisus mõjutab sõna rõhulise vokaali kestust? Rõhulise vokaali kestus on tulbas “V1”, see on mõõdetud millisekundites, ja lauserõhulisus on tulbas Intonation, tasemed “deaccented” on rõhutu ja “H*L” aktsentueeritud (kõrge rõhulise silbi põhitoonile järgneb põhitooni langus).
Kas mudeli eeldused on täidetud?
Sõltuva ja sõltmatu tunnuse määramisel ei ole siin ilmselt vaja pikalt mõelda, sest juba tehniliselt kui me tahame kasutada lineaarset mudelit, siis uuritav tunnus peab olema arvuline. Kui eeldaksime, et lauserõhulisus sõltub kestuses, võiks seda testida logistilise regressioonimudeliga, millest tuleb juttu umbes üle-ülejärgmises praktikumis :)
Milline tase valida 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(V1) ~ Intonation, data = dat2)
##
## Residuals:
## Min 1Q Median 3Q Max
## -1.12689 -0.42499 0.07334 0.34445 0.85198
##
## Coefficients:
## Estimate Std. Error t value Pr(>|t|)
## (Intercept) 4.42273 0.06114 72.336 <2e-16 ***
## IntonationH*L 0.18561 0.08225 2.257 0.026 *
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## Residual standard error: 0.4366 on 112 degrees of freedom
## Multiple R-squared: 0.0435, Adjusted R-squared: 0.03496
## F-statistic: 5.093 on 1 and 112 DF, p-value: 0.02596
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 vokaali kestus juhul, kui lauserõhk on baastasemel ehk “deaccented” ning teine rida ehk slope ütleb seda, kui palju see muutub siis, kui faktori tase on “H*L”.
##
## Call:
## lm(formula = log(V1) ~ Intonation, data = dat2)
##
## Residuals:
## Min 1Q Median 3Q Max
## -1.12689 -0.42499 0.07334 0.34445 0.85198
##
## Coefficients:
## Estimate Std. Error t value Pr(>|t|)
## (Intercept) 4.42273 0.06114 72.336 <2e-16 ***
## IntonationH*L 0.18561 0.08225 2.257 0.026 *
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## Residual standard error: 0.4366 on 112 degrees of freedom
## Multiple R-squared: 0.0435, Adjusted R-squared: 0.03496
## F-statistic: 5.093 on 1 and 112 DF, p-value: 0.02596
Mudel annab prognoositud väärtused: lauserõhutute vokaalide kestus on 4.42273 ühikut ja rõhuliste oma on 0.18561 võrra suurem. Ühikud on üldiselt samad mudeli sisendiks olnud ühikud, ehk hääliku kestus, 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)
## 83.3231
# aktsentueeritud häälikute kestuse saamiseks tuleb koefitsiendid kokku liita
exp(inton.lm$coefficients[1]+inton.lm$coefficients[2])
## (Intercept)
## 100.3173
Teeme selguse mõttes sama mudeli ka ilma logaritmimata uuritava tunnusega, see küll eirab mudeli normaaljaotuse eeldust, aga on oluliselt lihtsam tõlgendada:
##
## Call:
## lm(formula = V1 ~ Intonation, data = dat2)
##
## Residuals:
## Min 1Q Median 3Q Max
## -64.725 -38.099 -1.825 30.522 110.848
##
## Coefficients:
## Estimate Std. Error t value Pr(>|t|)
## (Intercept) 91.725 5.871 15.625 <2e-16 ***
## IntonationH*L 17.427 7.897 2.207 0.0294 *
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## Residual standard error: 41.92 on 112 degrees of freedom
## Multiple R-squared: 0.04167, Adjusted R-squared: 0.03311
## F-statistic: 4.87 on 1 and 112 DF, p-value: 0.02937
Nüüd võime koefitsientide põhjal öelda, et deaktsentueeritud vokaalid on 92 millisekundit ja aktsentueeritud on 17 millisekundit rohkem ehk 109 ms. Ja saame mudeli prognoositud väärtusi otse võrrelda aritmeetiliste keskmiste väärtustega:
## deaccented H*L
## 91.72461 109.15181
Proovime nüüd testida seletavat tunnust, millel oleks rohkem kui kaks taset. Näiteks sobib selleks eesti keele välde, millel on kolm taset.
##
## Call:
## lm(formula = log(V1) ~ Quantity, data = dat2)
##
## Residuals:
## Min 1Q Median 3Q Max
## -0.89277 -0.12681 0.00443 0.15610 0.60252
##
## Coefficients:
## Estimate Std. Error t value Pr(>|t|)
## (Intercept) 4.02934 0.04177 96.46 <2e-16 ***
## QuantityQ2 0.62961 0.05947 10.59 <2e-16 ***
## QuantityQ3 0.85241 0.05870 14.52 <2e-16 ***
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## Residual standard error: 0.2575 on 111 degrees of freedom
## Multiple R-squared: 0.6703, Adjusted R-squared: 0.6643
## F-statistic: 112.8 on 2 and 111 DF, p-value: < 2.2e-16
Mudeli väljund ütleb meile et:
exp()
): teise välte logaritmitud kestus oli 4.03 +
0.63 = 4.66 ehk 105.53 millisekundit. Ja see erinevus esimese ja teise
välte vahel on oluliselt erinev p<0.001.ANalysis Of VAriance ehk dispersioonanalüüs
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.
Anova testi tegemiseks paneme lihtsalt lineaarse mudeli väljundi
summary()
käsu asemel anova()
käsu sisse:
## Analysis of Variance Table
##
## Response: log(V1)
## Df Sum Sq Mean Sq F value Pr(>F)
## Intonation 1 0.971 0.97100 5.0931 0.02596 *
## Residuals 112 21.353 0.19065
## ---
## 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(V1) by Intonation
## t = -2.241, df = 103.92, p-value = 0.02715
## alternative hypothesis: true difference in means between group deaccented and group H*L is not equal to 0
## 95 percent confidence interval:
## -0.34985792 -0.02136616
## sample estimates:
## mean in group deaccented mean in group H*L
## 4.422726 4.608338
Nüüd näide rohkem kui kahe tasemega faktorist: vokaali kestus ja välde.
## Analysis of Variance Table
##
## Response: log(V1)
## Df Sum Sq Mean Sq F value Pr(>F)
## Quantity 2 14.9633 7.4816 112.83 < 2.2e-16 ***
## Residuals 111 7.3606 0.0663
## ---
## 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 testi korral 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 esimese välte vokaalist oli teise välte vokaal pikem (p<0.001) ja esimese välte vokaalist oli ka kolmanda välte vokaal pikem (p<0.001):
ning ANOVA testi põhjal võime öelda, et välde on oluline faktor [F(2, 111) = 112.83, p < 0.001], sest leidub vähemalt üks välteaste, mille puhul vokaali kestus on erinev:
AGA me ei tea, kas teise ja kolmanda välte vokaalid omavahel ka erinevad on.
Post-hoc testimiseks Bonferroni korrektsiooniga võime lihtsalt
korrata lineaarset mudelit muudetud baasväärtusega. Sellks võib
andmestikus muuta ära baasväärtuse käsuga relevel()
(või
lihtsalt käsuga factor()
), aga kui me ei taha andmestikku
muuta, võib ainult lm()
käsu sees muuta faktori baastaset
käsuga C()
.
valde.lm1 <- lm(log(V1)~C(droplevels(Quantity), base=1), data=dat2)
valde.lm2 <- lm(log(V1)~C(droplevels(Quantity), base=3), data=dat2)
summary(valde.lm1)
##
## Call:
## lm(formula = log(V1) ~ C(droplevels(Quantity), base = 1), data = dat2)
##
## Residuals:
## Min 1Q Median 3Q Max
## -0.89277 -0.12681 0.00443 0.15610 0.60252
##
## Coefficients:
## Estimate Std. Error t value Pr(>|t|)
## (Intercept) 4.02934 0.04177 96.46 <2e-16 ***
## C(droplevels(Quantity), base = 1)Q2 0.62961 0.05947 10.59 <2e-16 ***
## C(droplevels(Quantity), base = 1)Q3 0.85241 0.05870 14.52 <2e-16 ***
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## Residual standard error: 0.2575 on 111 degrees of freedom
## Multiple R-squared: 0.6703, Adjusted R-squared: 0.6643
## F-statistic: 112.8 on 2 and 111 DF, p-value: < 2.2e-16
##
## Call:
## lm(formula = log(V1) ~ C(droplevels(Quantity), base = 3), data = dat2)
##
## Residuals:
## Min 1Q Median 3Q Max
## -0.89277 -0.12681 0.00443 0.15610 0.60252
##
## Coefficients:
## Estimate Std. Error t value Pr(>|t|)
## (Intercept) 4.88175 0.04123 118.39 < 2e-16 ***
## C(droplevels(Quantity), base = 3)Q1 -0.85241 0.05870 -14.52 < 2e-16 ***
## C(droplevels(Quantity), base = 3)Q2 -0.22280 0.05910 -3.77 0.000263 ***
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## Residual standard error: 0.2575 on 111 degrees of freedom
## Multiple R-squared: 0.6703, Adjusted R-squared: 0.6643
## F-statistic: 112.8 on 2 and 111 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(Quantity), base = 1)Q2 C(droplevels(Quantity), base = 1)Q3
## 3.179586e-18 4.039967e-27
## C(droplevels(Quantity), base = 3)Q1 C(droplevels(Quantity), base = 3)Q2
## 4.039967e-27 5.265602e-04
Ja lõpetuseks veel, kui e astmetega komakohtade arvutamine tundub tüütu, võib R-i sundida teisendama:
## C(droplevels(Quantity), base = 1)Q2 C(droplevels(Quantity), base = 1)Q3
## "0.000000000000000003179585974469365" "0.000000000000000000000000004039967"
## C(droplevels(Quantity), base = 3)Q1 C(droplevels(Quantity), base = 3)Q2
## "0.000000000000000000000000004039967" "0.000526560230228536240923431499539"
Siit nüüd saame välja lugeda, et erinevused on:
Või siis selle asemel et lihtsalt korduste arvuga p-väärtuseid läbi
korrutada, võib kasutada käsku p.adjust()
## C(droplevels(Quantity), base = 1)Q2 C(droplevels(Quantity), base = 1)Q3
## 3.179586e-18 4.039967e-27
Ja teisendame tavaliseks komakohtadega arvuks:
format(p.adjust(p = summary(valde.lm1)$coefficients[2:3, "Pr(>|t|)"], n=2, method="bonferroni"), scientific = F)
## C(droplevels(Quantity), base = 1)Q2 C(droplevels(Quantity), base = 1)Q3
## "0.000000000000000003179585974469365" "0.000000000000000000000000004039967"
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, nagu me varem tegimegi.
Need annavad täpselt sama tulemuse. Kuid Tukey testi sisendiks peab kasutama käsku aov().
## Df Sum Sq Mean Sq F value Pr(>F)
## Quantity 2 14.963 7.482 112.8 <2e-16 ***
## Residuals 111 7.361 0.066
## ---
## 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(V1) ~ Quantity, data = dat2)
##
## $Quantity
## diff lwr upr p adj
## Q2-Q1 0.6296095 0.48832342 0.7708956 0.0000000
## Q3-Q1 0.8524131 0.71297461 0.9918516 0.0000000
## Q3-Q2 0.2228036 0.08241398 0.3631932 0.0007646
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. Küsimustik on ainult kordamiseks mõeldud ja vastuseid ei hinnata ega 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
lm(y ~ x)
– lineaarne mudelsummary(lm())
– lineaarse mudeli väljundanova(lm())
– ANOVA testsummary(aov())
– ANOVA test (sama mis eelmine)TukeyHSD(aov())
– Tukey test (post-hoc ANOVAle)p.adjust()
– p-väärtuste korrigeerimine (Bonferroni,
Holm …)C(mingi_faktor, base = taseme_number)
– vahetab faktori
baastaset. NB! suure tähega C()
ei ole sama käsk mis väikse
tähega c()
.droplevels(faktor)
– jätab faktori tasemetest välja
andmestikus esindamata tasemed.