9 Tilastollinen testaaminen
9.1 Testaamisen periaatteita
Tilastollisilla testeillä pyritään arvioimaan perusjoukkoa koskevien väiteiden paikkansapitävyyttä todennäköisyyslaskennan keinoin. Lähtökohtana on niin sanottu nollahypoteesi (\(H_0\)), joka yleensä vastaa tilannetta, jossa mahdolliset väitettä tukevat haivainnot ovat vain sattuman seurausta. Esimerkiksi jos tutkitaan onko jokin lääkeaine tehokas hoitokeino, voisi nollahypoteesi olla muotoa “ei vaikutusta”. Nollahypoteesiin liittyy aina vastahypoteesi (\(H_1\)), joka yleensä nollahypoteesin vastakohta, ja vastaa mielenkiinnon kohteena olevaa väitettä (esim. “on vaikutusta”).
Tilastolliset testit olettava nollahypoteesin olevan totta, jolloin epäuskottavat tulokset antavat aihetta epäillä nollahypoteesin mielekkyyttä. Testiin liittyy yleensä testisuure, joka on jokin aineistosta laskettu tunnusluku. Testisuureen jakauman perusteella voidaan arvioida todennäköisyyttä, että havaittu tulos olisi vain sattuman seurausta. Tätä todennäköisyyttä kutsutaan p-arvoksi. Perinteisesti tilastotieteessä asetetaan etukäteen jokin riskitaso (\(\alpha\)), ja jos saatu p-arvo on riskitasoa pienempi niin nollahypoteesi hylätään (yleensä \(\alpha = 0.05\)). Jos p-arvo on riskitasoa pienempi, niin havaintoa kutsutaan tilastollisesti merkitseväksi.
9.2 t-testi
Studentin t-testi on yksi tunnetuimmista tilastollisista testeistä. Se testaa muuttujien odotusarvoja.
Tarkastellaan R:n sisäistä dataa sleep
, joka sisältää muutoksia oppilaiden unen määrässä (muuttuja extra
, muutos unen määrässä tunneissa) kahdella eri lääkkeellä (muuttuja group
). Jokainen oppilas kokeili kumpaakin lääkettä, muuttuja ID
yksilöi oppilaat.
9.2.1 Yhden otoksen t-testi
Testaamme aluksi hypoteesia, että muutos unen määrässä lääkkeen käytön jälkeen on 0 (\(H_0 : \mu = 0\)). Funktiota t.test
voi käyttää monella tapaa. Tässä esimerkissä annamme funktiolle kaavan extra ~ 1
, eli ns. formula
-objektin ensimmäisenä argumenttina, joka on osa R:n syntaksia tilastollisten mallien ja riippuvuusrakenteiden määrittellyyn. Kaava määrittelee, että ~
-merkin vasen puoli on vastemuuttuja, ja oikea puoli sisältää selittävät muuttujat. Koska emme tee testiä minkään toisen muuttujan suhteen, niin kaavan oikean puoli on vain luku 1, joka R:n syntaksissa tarkoittaa, että se on vakio. Tämä ei siis tarkoita esimerkiksi sitä, että nollahypoteesimme olisi, että muutos unen määrässä olisi 1 tunti. Nollahypoteesin mukainen odotusarvo määritellään argumentilla mu
, joka yhden otoksen testissä saa oletusarvon 0.
# One sample test
<- t.test(extra ~ 1, data = sleep)
tt1 tt1
##
## One Sample t-test
##
## data: extra
## t = 3.413, df = 19, p-value = 0.002918
## alternative hypothesis: true mean is not equal to 0
## 95 percent confidence interval:
## 0.5955845 2.4844155
## sample estimates:
## mean of x
## 1.54
Tuloksena saamme t-testisuureen arvon, vapausasteet sekä testin p-arvon. Koska p-arvo on pieni (perinteisesti rajana käytetään lukua 0.05, mutta tämä vaihtelee tieteenalasta riippuen) niin nollahypoteesi hylätään, eli testin mukaan muutos unen määrässä poikkeaa tilastollisesti merkitsevästi nollasta kumpaa tahansa lääkettä käytettäessä. Tuloste kertoo myös testin vastahypoteesin \(H_1\) kohdassa “alternative hypothesis”.
Testiin liittyvät tunnusluvut saamme eriteltyä tulosobjektista tt1
seuraavasti:
# Test statistic
$statistic tt1
## t
## 3.412965
# Degrees of freedom
$parameter tt1
## df
## 19
# p-value
$p.value tt1
## [1] 0.00291762
9.2.2 Kahden otoksen t-testi
Entäpä jos haluammekin testata hypoteesia, että kumpikin lääke vaikuttaa samalla tavalla unen määrään (\(H_0 : \mu_1 = \mu_2\))? Voimme tässäkin tapauksessa käyttää formula
-syntaksia hyödyksi. Vakion 1 sijaan sijoitamme nyt lääkettä vastaavan muuttujan group
kaavassa ~
-merkin oikealle puolelle.
<- t.test(extra ~ group, data = sleep)
tt2 tt2
##
## Welch Two Sample t-test
##
## data: extra by group
## t = -1.8608, df = 17.776, p-value = 0.07939
## alternative hypothesis: true difference in means between group 1 and group 2 is not equal to 0
## 95 percent confidence interval:
## -3.3654832 0.2054832
## sample estimates:
## mean in group 1 mean in group 2
## 0.75 2.33
Testiobjektin sisältö vastaa yhden otoksen testiä suurimmilta osin. Näämme, että testin tulos ei tällä kertaa ollut tilastollisesti merkitsevä (merkitsevyystasolla 0.05) eli testin mukaan ei ole näyttöä siitä, että lääkkeet vaikuttaisivat eri tavalla unen määrään, jolloin nollahypoteesia ei hylätä.
Tarkkasilmäinen lukija saattoi kuitenkin huomata, että tämä testi ei aivan vastaa tarkoitusta, sillä sleep
-aineistossa jokainen koehenkilö kokeili kumpaakin lääkettä, jolloin oikea tapa olisi testata lääkkeiden vaikutuksen erotusta, mikä tehdäänkin seuraavaksi.
9.2.3 Parittaisten otosten t-testi
Jotta mittausparit tulevat otettua huomioon testissä, on t.test
-funktiolle annettava argumentti paired = TRUE
. Tässä testissä nollahypoteesi on, että lääkkeiden vaikutuksen erotuksen odotusarvo on 0 (\(H_0 : \mu_d = 0\)).
<- t.test(extra ~ group, data = sleep, paired = TRUE)
tt3 tt3
##
## Paired t-test
##
## data: extra by group
## t = -4.0621, df = 9, p-value = 0.002833
## alternative hypothesis: true mean difference is not equal to 0
## 95 percent confidence interval:
## -2.4598858 -0.7001142
## sample estimates:
## mean difference
## -1.58
Tällä kertaa tulos on taas tilastollisesti merkitsevä, eli lääkkeiden vaikutuksessa unen määrään on tilastollisesti merkitsevä ero, jolloin nollahypoteesi hylätään.
9.3 Khiin neliö -testi
Kahden kategorisen muuttujan riippuvuuden tutkimiseen voidaan käyttää khiin neliö -testiä. Tyypillisesti halutaan verrata jotain ryhmien välisiä eroja, kuten puoluekannatusta alueittain tai sukupuolten suhteen. Testin ideana on verrata havaittua ristiintaulukkoa nollahypoteesin mukaiseen ristiintaulukkoon, jossa muuttujien välillä ei ole lainkaan riippuvuutta. Khiin neliö -testin testisuure perustuu näiden kahden taulukon eroihin.
Tarkastellaan Yhdysvaltalaista kyselytutkimusaineistoa, joka sisältää tiedon henkilön puoluekannatuksesta ja sukupuolesta. Tutkitaan khiin neliö -testin avulla, riippuuko puoluekannatus sukupuolesta. R:ssä tämä voidaan tehdä funktiolla chisq.test
.
## From Agresti(2007) p.39
<- as.table(rbind(c(762L, 327L, 468L), c(484L, 239L, 477L)))
M dimnames(M) <- list(gender = c("F", "M"),
party = c("Democrat", "Independent", "Republican"))
<- chisq.test(M)) # Prints test summary (Xsq
##
## Pearson's Chi-squared test
##
## data: M
## X-squared = 30.07, df = 2, p-value = 2.954e-07
$observed # observed counts (same as M) Xsq
## party
## gender Democrat Independent Republican
## F 762 327 468
## M 484 239 477
$expected # expected counts under the null Xsq
## party
## gender Democrat Independent Republican
## F 703.6714 319.6453 533.6834
## M 542.3286 246.3547 411.3166
$residuals # Pearson residuals Xsq
## party
## gender Democrat Independent Republican
## F 2.1988558 0.4113702 -2.8432397
## M -2.5046695 -0.4685829 3.2386734
$stdres # standardized residuals Xsq
## party
## gender Democrat Independent Republican
## F 4.5020535 0.6994517 -5.3159455
## M -4.5020535 -0.6994517 5.3159455
Koska testin p-arvo on pieni, niin nollahypoteesi hylätään ja todetaan, että puoluekannatus riippuu tilastollisesti merkitsevästi sukupuolesta. Testin luotettavuuden kannalta on kuitenkin hyvä huomioida, että testiin liittyy oletuksia, jotka koskevat odotettuja frekvenssejä (eli nollahypoteesin mukaisen ristiintaulukon frekvenssejä). Tyypillisesti vaaditaan, että odotetun frekvenssin on oltava vähintään 5 vähintään 80%:ssa taulukon soluista, eikä yhdenkään solun odotettu frekvenssi ole alle 1. Tarkistetaan oletukset edellisen esimerkin tapauksessa:
all(Xsq$expected >= 1)
## [1] TRUE
mean(Xsq$expected >= 5) >= 0.80
## [1] TRUE
Oletukset ovat tältä osin kunnossa. Edellä funktio all
ottaa syötteenään loogisen vektorin ja palauttaa TRUE
jos syötteen kaikki alkiot ovat TRUE
. Muutoin funktio palauttaa FALSE
.
Edellisessä esimerkissä ristiintaulukko oli valmiiksi rakennettu annetuista frekvensseistä. Ristiintaulukko voitaisiin myös rakentaa yksilötason aineistosta, esimerkiksi datakehikosta, joka sisältää rivin jokaista kyselyyn vastannutta henkilöä kohden ja tiedon vastaajan ilmoittamasta puolueesta ja sukupuolesta. Seuraavassa esimerkissä kyselytutkimusaineisto on muuttujassa poll_data
, joka voidaan muuntaa ristiintauloksi funktiolla table
. Huomataan, että tällä tavalla muodostettu ristiintaulukko on sama kuin suoraan frekvensseistä koottu taulukko.
head(poll_data)
## gender party
## 1 F Democrat
## 2 F Democrat
## 3 F Democrat
## 4 F Democrat
## 5 F Democrat
## 6 F Democrat
nrow(poll_data)
## [1] 2757
# The cross tabulations are the same
identical(M, table(poll_data))
## [1] TRUE
9.4 Varianssianalyysi
Varianssianalyysin voidaan ajatella olevan t-testin yleistys, jossa yhden tai kahden odotusarvon sijaan verrataankin kerralla useamman ryhmän odotusarvoja keskenään. Menetelmä saa nimensä siitä, että sen testisuure perustuu kiinnostuksen kohteena olevan muuttujan kokonaisvaihtelun (varianssin) jakamiseen verratavien ryhmien sisäiseen vaihteluun ja niiden väliseen vaihteluun. Koska harjoitusaineistossa study_data
ei vielä ole kategorista muuttujaa, jossa on vähintään kolme kategoriaa, niin luodaan sellainen.
# create a new categorical variable called age_group
# 3,5,6 => ryhmä 1
# 2,4,8 => ryhmä 2
# 1,7 => ryhmä 3
# vaste: weight
$age_group <- c("3", "2", "1", "2", "1", "1", "3", "2")
study_data$fage_group <- factor(study_data$age_group) study_data
Hypoteesit ovat:
- \(H_0\): Ryhmien odotusarvot ovat samat tarkasteltavan muuttujan suhteen (\(\mu_1 = \mu_2 = \dots = \mu_n\)),
- \(H_1\): Ryhmien odotusarvoissa on eroa tarkasteltavan muuttujan suhteen (\(\mu_i \ne \mu_j\) ainakin joillekin \(i \ne j\)).
# conduct Analysis of Variance (ANOVA) for study_data
# we test if averages of height differ between age groups
summary(aov(height ~ fage_group, data = study_data))
## Df Sum Sq Mean Sq F value Pr(>F)
## fage_group 2 198.7 99.34 1.097 0.417
## Residuals 4 362.4 90.60
## 1 observation deleted due to missingness
Varianssianalyysin summary
sisältää seuraavat sarakkeet: Df
kertoo testiin liittyvän \(F\)-jakauman vapausasteet, Sum Sq
kertoo ryhmiin liittyvän neliösumman ja jäännösneliösumman, Mean Sq
kertoo vastaavan keskineliösumman, F value
kertoo testisuureen arvon ja Pr(>F)
kertoo testin P-arvon. Tässä tapauksessa testin p-arvo on \(0.417\), joten nollahypoteesia ei hylätä.
9.5 Levenen testi
Levenen testillä tutkitaan ovatko jonkin muuttujan varianssit samat kahdessa tai useammassa ryhmässä. Testiä ei ole toteutettu valmiiksi R:ssä, mutta se on saatavilla Rcourse-paketin kautta funktiossa leveneTest
. Testin nollahypoteesi on, että muuttujan varianssit ovat samat joka ryhmässä.
Selvitetään onko harjoitusaineiston study_data
muuttujan height
varianssissa eroa eri ikäryhmien välillä (fage_group
) Levenen testillä.
leveneTest(height ~ fage_group, data = study_data)
## Levene's Test for Homogeneity of Variance (center = median)
## Df F value Pr(>F)
## group 2 0.5597 0.6105
## 4
Testin p-arvo löytyy sarakkeesta Pr(>F)
, ja se on \(0.6105\). Testin mukaan muuttujan varianssit ovat siis samat joka ryhmässä, ja nollahypoteesi jää voimaan.
9.6 Shapiro-Wilk -testi
Shapiro-Wilk -testillä tutkitaan onko jokin muuttuja normaalijakautunut. Testi löytyy funktiosta shapiro.test
, ja se ottaa argumenttinaan yhden muuttujan havainnot vektorina. Funktiolla ei voi siis suoraan testata esimerkiksi sitä, onko muuttuja normaalijakautunut joissakin osaryhmissä, vaan aineisto on ensin jaettava sopiviin osiin. Testin nollahypoteesi on, että muuttuja on normaalijakautunut.
Tarkastellaan jälleen harjoitusaineistoa study_data
ja testataan muuttujan height
normaalisuutta.
shapiro.test(study_data$height)
##
## Shapiro-Wilk normality test
##
## data: study_data$height
## W = 0.96985, p-value = 0.8973
Testin p-arvon voi lukea kohdasta p-value
ja se on aineistolle \(0.8973\), eli height
-muuttuja on testin mukaan normaalijakautunut, ja nollahypoteesi jää voimaan.