Varianssianalyysi: perusmalli

Varianssianalyysi (ANOVA, ``Analysis of Variance'') on lineaarinen malli, jossa vastemuuttuja on edelleen jatkuva mutta selittävät tekijät ovat luokkamuuttujia. Varianssianalyysin voi tehdä funktiolla lm. Perinteisesti varianssianalyysin tulokset esitetään kuitenkin toisin kuin regressioanalyysissä, jonka tuloksina ilmoitettiin regressiokertoimet, niiden keskivirheet ja t-arvot. Moniluokkaisen selittäjän jokainen luokka saa oman kertoimen ja muut tunnusluvut käytettäessä funktiota lm. ANOVAssa ei useinkaan haluta muuttujan jokaiselle luokalle tunnuslukuja vaan koko moniluokkaiselle muuttujalle yksi luku, joka kuvaa sen tilastollista merkitsevyyttä. Tämän vuoksi myös R:ssä on vaihtoehtoinen ANOVA-funktio nimeltään aov. Vastaavat tulokset saa myös sovittamalla hierarkisen sarjan lm-malleja ja vertaamalla niitä anova-funktiolla, kuten regressioanalyysin yhteydessä teimme. Funktio aov on oikotie tähän tarkoitukseen.

Tarkastelemme yksinkertaista varianssianalyysiä Biometrian oppikirjan esimerkillä, missä ollaan tutkivinaan istutustavan vaikutusta männyn taimien kasvuun (Esimerkit 8.1, 8.10 Ranta et al., 1989, aineisto taimet paketissa rekola). Esimerkki on fiktiivinen, joten kovin pitkälle meneviä metsänhoidollisia päätelmiä ei pidä tehdä.

Aineisto on saatavissa suoraan komennolla data(taimet), mutta opetuksellisista syistä katsomme kuinka aineisto (data.frame) on alkujaan muodostettu. Syötämme aineiston Esimerkin 8.10 (Ranta et al., 1989) mukaisessa muodossa 3 x 5 taulukkona, jonka rivit ovat istustapoja ja kukin sarake edustaa yhtä emopuuta:

> pituus <- c(46,49,47,50,53,
+             52,54,58,61,55,
+             49,50,51,51,54)
> istutus <- c(rep("kenno",5), rep("ruukku",5), rep("rulla",5))
> emo <- rep(seq(1,5),3)
> istutus <- factor(istutus, levels=c("kenno","ruukku","rulla"))
> emo <- factor(emo)
> taimet <- data.frame(pituus=pituus, istutus=istutus, emo=emo)
> str(taimet)
`data.frame':   15 obs. of  3 variables:
 $ pituus : num  46 49 47 50 53 52 54 58 61 55 ...
 $ istutus: Factor w/ 3 levels "kenno","ruukku",..: 1 1 1 1 1 2 2 2 2 2 ...
 $ emo    : Factor w/ 5 levels "1","2","3","4",..: 1 2 3 4 5 1 2 3 4 5 ...

Faktorien istutus ja emo luomiseksi käytettiin sopivasti yhdisteltynä sarjoja (seq) ja toistoja (rep) (§3.4, sivu [*]), joiden avulla pystyy näppärästi määrittelemään monimutkaisiakin koeasetelmia. Komento factor muuttaa alkuperäisen muuttujamme faktoreiksi. Faktorien tasot järjestetään nimen mukaan ja ilman parametria levels faktorin istutus tasot olisivat olleet aakkosjärjestyksessä; parametri varmistaa, että ne ovat samassa järjestyksessä kuin taulukossa alkujaan. Komennolla data.frame luomme aineistoin (§3.7, sivu [*]). Aineisto on luettelon (§3.8, sivu [*]) erikoistapaus, ja luettelo määritellään tyyliin komponentti = muuttuja. Alkuperäiset muuttujamme ja aineistomme komponentit ovat samannimisiä, minkä takia määrittely on hieman tyhmän näköinen. Lopulta komento str näyttää, että kaikki onnistui.

Biometrian kirjassa (Ranta et al., 1989) aineisto analysoidaan erikseen yksisuuntaisena (Esimerkki 8.1) ja kaksisuuntaisena ANOVAna (Esimerkki 8.10). Käsin laskeminen onkin näille melko lailla erilaista, mutta R:ssä ainoa ero on mallilauseke. Tarkastelemme vain kaksisuuntaista analyysiä:

> taimet.lm <- lm(pituus ~ istutus + emo, data=taimet)
> summary(taimet.lm)

Call:
lm(formula = pituus ~ istutus + emo, data = taimet)

Coefficients:
              Estimate Std. Error t value Pr(>|t|)
(Intercept)     46.000      1.528  30.114 1.60e-09
istutusruukku    7.000      1.414   4.950  0.00112
istutusrulla     2.000      1.414   1.414  0.19502
emo2             2.000      1.826   1.095  0.30520
emo3             3.000      1.826   1.643  0.13897
emo4             5.000      1.826   2.739  0.02550
emo5             5.000      1.826   2.739  0.02550

Residual standard error: 2.236 on 8 degrees of freedom
Multiple R-Squared: 0.8214,     Adjusted R-squared: 0.6875
F-statistic: 6.133 on 6 and 8 degrees of freedom,       p-value: 0.01122

R muodostaa moniluokkaisen tekijän nimen yhdistämällä muuttujan ja sen tason nimet. Kertoimet (Estimate) ovat tällä kertaa käsittelyn eroja verrattuna ``vakioon'' (Intercept) eli tässä tapauksessa istutustapaan kenno ja emopuu 1. Estimaattien esitystapaa voi olla toinenkin, mutta siitä myöhemmin (§7.5). Tuloksia luetaan siten, että emopuun 1 kennotaimet olivat keskimäärin 46 cm pitkiä, ruukkutaimet 7 cm ja rullataimet 2 cm kennotaimia pitempiä. Vastaavasti emopuun 2 jälkeläiset olivat 2 cm pitempiä kuin emopuun 1 jne. Aivan samoin kuin estimaatit, myös niiden keskivirheet, t-arvot ja näiden merkitsevyydet koskevat vertailua vakiotermiin. Tämä voi olla hyödyllistä, mutta tätä emme ehkä halunneet.

R-funktio aov tekee periaatteessa samat analyysit kuin lm, mutta antaa meille perinteisen ANOVA-taulukon:


> taimet.aov <- aov(pituus ~ istutus + emo, data=taimet)
> summary(taimet.aov)
            Df Sum Sq Mean Sq F value   Pr(>F)
istutus      2  130.0    65.0    13.0 0.003065
emo          4   54.0    13.5     2.7 0.108134
Residuals    8   40.0     5.0                 

Vaikutusten numeeriset arvot saa selville komennolla model.tables joka näyttää erot yleiskeskiarvoon nähden (tässä tapauksessa 52 cm):

> model.tables(taimet.aov)
Tables of effects

 istutus
 kenno ruukku  rulla
    -3      4     -1

 emo
 1  2  3  4  5
-3 -1  0  2  2

Funktio aov on vain ``kääre'' funktiolle lm. Pääasiallinen ero on, että print ja summary esittävät tulokset perinteisen varianssianalyysin tapaan eivätkä perinteisen lineaarisen mallin tyyliin.

Katsokaamme kuitenkin, miten aov itse asiassa toimii:

> taimet.ist <- update(taimet.lm, . ~ . -emo) # Poistetaan emo
> taimet.emo <- update(taimet.lm, . ~ . -istutus) # ja istutus
> anova(taimet.emo, taimet.lm)      ## istutuksen vaikutus
Analysis of Variance Table

Model 1: pituus ~ emo
Model 2: pituus ~ istutus + emo
  Res.Df Res.Sum Sq Df Sum Sq F value   Pr(>F)
1     10        170                           
2      8         40  2    130      13 0.003065
> anova(taimet.ist, taimet.lm)       ## emon vaikutus
Analysis of Variance Table

Model 1: pituus ~ istutus
Model 2: pituus ~ istutus + emo
  Res.Df Res.Sum Sq Df Sum Sq F value Pr(>F)
1     12         94                         
2      8         40  4     54     2.7 0.1081

Käytimme yllä funktiota update päivittämään perusmalliamma taimet.lm. Mallilausekkeen pisteet ``. ~ .'' ovat lyhenteitä päivitettävälle malliyhtälölle ja oikealle puolelle lisätty ``-'' tarkoittaa että poistetaan kyseinen tekijä. ANOVAssa tekijän ``merkitsevyys'' määräytyy sen mukaan, kuinka paljon tekijän lisääminen malliin pienentään neliösummaa (ja kuinka paljon se vastaavasti kuluttaa vapausasteita). Käsittelyn istutus vaikutus arvioidaan vertaamalla mallia, jossa on mukana vain emo (taimet.emo) malliin jossa on mukana lisäksi istutus (taimet.lm). Funktion aov tulostama perinteinen ANOVA-taulukko on vakiintunut tapa esittää monimutkaisten mallien vertailu yhdessä taulukossa ilman suoraa vertailtavien mallien rakentamista.

Funktio aov palauttaa olion, joka on perinyt luokan lm ominaisuudet, mutta lisäksi sillä on luokan aov ominaisuudet:

> class(taimet.lm)
[1] "lm"
> class(taimet.aov)
[1] "aov" "lm"

Esimerkiksi plot.lm-komentoa käytetään myös aov:n tulosten esittämiseen (ainakin vielä tätä kirjoitettaessa), joten plot(taimet.lm) ja plot(taimet.aov) tuottavat samat diagnostiset kuvat. Voimme vaatia myös käyttöön luokan lm komennot aov-olioille:

> summary(taimet.aov)      # Anova-taulukko
> summary.lm(taimet.aov)   # Sama kuin summary(taimet.lm)


Jari Oksanen 2003-01-21