Vierde beweging · Verschil onthechten
Oefening 9.4 · Eenweg ANOVA en η²
Eenweg variantieanalyse en η² · one-way analysis of variance
In deze oefening
Data bij deze oefening — penguins.csv 342 pinguïns · diamantjes.csv de twaalf steentjes uit het boek · wat elke kolom betekent
prikkel
Drie soorten op één weegschaal
meerdere groepen · gemiddelden · losse t-toetsen
Terug naar de rots bij Antarctica, maar nu met drie soorten pinguïns naast elkaar op de weegschaal.1 In dít stapeltje wegen de Adélies gemiddeld 3701 gram, de Chinstraps 3733 gram, en de Gentoo’s 5076 gram. Twee soorten die bijna even zwaar zijn, en één die er ruim een kilo bovenuit torent.
De vorige keer legden we telkens twee groepen naast elkaar met een t-toets. Maar hier zijn er drie. Je zou drie losse t-toetsen kunnen doen — Adélie tegen Chinstrap, Adélie tegen Gentoo, Chinstrap tegen Gentoo — maar dat voelt al omslachtig, en met vijf of tien soorten wordt het een moeras. Kan het niet in één keer? En de vraag eronder: zit er in déze drie stapeltjes echt ergens een verschil, of kan toeval zulke verschillen tussen groepen zomaar namaken?
Trek even mee. Er is één toets die naar álle groepen tegelijk kijkt.
speel het
Toets alle drie de soorten in één keer
eenweg variantieanalyse · F · post-hoc-toets (Tukey)
d <- read.csv("diamantjes.csv")
# dezelfde vergelijking, nu als variantieanalyse
model.merk <- aov(glans ~ merk, data = d)
# summary() → F = 3.00 p = .114
summary(model.merk)
# en dit is geen toeval: F is t in het kwadraat. Pak de t met al zijn
# decimalen, niet de afgeronde -1.73 van je scherm.
tw <- t.test(glans ~ merk, data = d, var.equal = TRUE)$statistic
# tw^2 → 3
unname(tw^2)lm(), t.test() en aov() zijn in beide talen precies dezelfde functie — daar valt niets te vertalen. Het verschil tussen base R en dplyr zit in het klaarzetten van de data, niet in het model.
Dezelfde vergelijking nog één keer, nu als eenweg variantieanalyse: F = 3.00, en dat is de t van net in het kwadraat. Niet ongeveer maar precies — al moet je die t dan wel met al zijn decimalen pakken. Kwadrateer je de afgeronde −1.73, dan staat er 2.99 en lijkt het nét mis te gaan. Bij twee groepen zijn de t-toets en de eenweg ANOVA dezelfde toets in een andere jas. Pas bij drie of meer groepen wordt hij zichzelf.
Nu jij — en daar heb je de pinguïns weer, maar nu met alle drie de soorten tegelijk op de weegschaal.
Eén toets, drie groepen. Hij heet eenweg variantieanalyse — one-way analysis of variance, kortweg eenweg ANOVA. Eenweg, omdat je op één ding groepeert: de soort. Die eerste helft van de naam laat je nooit weg; waaróm niet staat in Oefening 9.1. De naam klinkt als iets anders dan de t-toets, maar de vraag is dezelfde familie: verschillen de gemiddelden van de groepen meer dan je door toeval zou verwachten? Alleen kijkt hij naar alle groepen in één beweging.
peng <- read.csv("penguins.csv")
# Adelie, Chinstrap, Gentoo
# tapply() → 3701 3733 5076
tapply(peng$gewicht, peng$soort, mean)
model.soort <- aov(gewicht ~ soort, data = peng)
# Df, Sum Sq, F value en p van soort, Df van Residuals: summary() → 2 146864214 343.6 <2e-16 339
summary(model.soort)Daar staat-ie: F(2, 339) = 343.6, p < .001. Die F is één getal voor “hoeveel groter is het verschil tussen de groepen dan de rommel binnen de groepen?”. Ligt F rond 1, dan is het verschil tussen de groepen niet groter dan de spreiding die je toch al binnen elke groep hebt — niks bijzonders. Hoe hoger F, hoe sterker de groepen uit elkaar liggen ten opzichte van hun eigen ruis. En 343.63 is geen hoge F, dat is een absurde F. Hier zit overduidelijk ergens verschil.
Je ziet nu twee vormen van hetzelfde getal op één bladzij, en dat hoort zo. summary() kort de F af tot 343.6; voluit is hij 343.6263, en die haal je op met summary(model.soort)[[1]][["F value"]][1]. In een rapportagezin gaat hij op twee decimalen: 343.63. En η² raakt straks ook zijn nul vóór de punt kwijt — net als r kan die maat niet voorbij de 1, en dat is precies wat in 3.1 langskwam. Aflezen doe je van je scherm, rapporteren doe je volgens APA.
Maar let op wat die ene toets je niet vertelt: alleen dát er ergens een verschil zit, niet wélke soorten van elkaar afwijken. Daarvoor bestaat een post-hoc-toets (letterlijk “achteraf”) die alle paren nagaat:
# diff en p adj van Chinstrap-Adelie, geen verschil: TukeyHSD() → 32.42598 0.8806666
# diff en p adj van Gentoo-Adelie, fors: TukeyHSD() → 1375.35401 0.0000000
# diff en p adj van Gentoo-Chinstrap, fors: TukeyHSD() → 1342.92802 0.0000000
TukeyHSD(model.soort)En kijk, nu wordt het interessant. Adélie en Chinstrap verschillen niet (32 gram, p = .88 — dat is toeval). Het is de Gentoo die het hele feest maakt: ruim 1300 gram zwaarder dan de andere twee. De eenweg ANOVA riep “ergens is verschil!”, de post-hoc wijst aan wáár.
schud het
Duizend werelden waarin de soort niets zegt
labels husselen · nul-werelden · geschudde F’en
Eerst de vraag die telt: is die F van 343.63 echt, of kan toeval zomaar zulke verschillen tussen drie groepen namaken? We bouwen het toeval na. De truc is dezelfde als altijd, en hij is mooi: we maken duizend werelden waarin de waarheid nul is — waarin de soort niets te maken heeft met het gewicht — en kijken hoe hoog de F dan door puur geluk nog oploopt.
Dat doe je door de soort-labels te husselen. Je houdt alle gewichten precies zoals ze zijn, maar plakt er lukraak “Adélie”, “Chinstrap” of “Gentoo” op. En dit is de kern: door te husselen koppel je de soort los van het gewicht. Je haalt met eigen handen weg dat een bepaald gewicht bij een bepaalde soort hoort. In zo’n losgekoppelde wereld kán er geen echt soortverschil meer zijn — dus elke F die je er nog in meet, is per definitie puur toeval.
set.seed(42)
nul <- replicate(1000,
summary(aov(gewicht ~ sample(soort, replace = FALSE),
data = peng))[[1]][1, "F value"]
)
# niet intikken, ophalen
# summary() → 343.6263
echt <- summary(model.soort)[[1]][["F value"]][1]
# eerst het bergje van dichtbij
hist(nul)
# en nu uitgezoomd, tot voorbij de echte F
hist(nul, xlim = c(0, 360))
# dáár staat-ie, in dit tweede plaatje
abline(v = echt, col = "red", lwd = 2)
# ongeveer: range() → 0 7.6
range(nul)Twee plaatjes van hetzelfde bergje, en het uitzoomen ís de les: van dichtbij is het een keurige verdeling met een staart naar rechts, en zodra de as tot 360 loopt schrompelt datzelfde bergje tot een streepje tegen nul aan. Duizend werelden die dansen rond nul — al kunnen F’en niet negatief worden, dus ze kruipen laag: het gros dobbert rond 1, en zelfs de allergrootste toeval-uitschieter komt niet boven de 8 uit. Dat is logisch: in een losgekoppelde wereld is het verschil tussen de groepen niet groter dan de ruis binnen de groepen, dus F blijft klein. En dan die rode streep op 343.63 — kilometers, lichtjaren rechts van het hele bergje. Geen enkele van de duizend nul-werelden komt ook maar in de verte in de buurt. Dát is “geen toeval”: geen p-waarde die je moet geloven, maar een afstand die je zíet.
snap het
Wat een F van 343.63 wél en niet vertelt
effectgrootte η² · verklaard aandeel · significant versus groot
De eenweg ANOVA is dus overduidelijk: ergens tussen de soorten zit echt verschil. Maar net als bij de t-toets in het vorige blok is “echt” niet hetzelfde als “groot” — en die astronomische F van 343.63 kan je op het verkeerde been zetten.
Zo’n duizelingwekkende F betekent niet dat dit het belangrijkste verschil op aarde is. Hij is zo hoog om twee saaie redenen: het verschil ís bruut (de Gentoo torent er ruim een kilo bovenuit) én we hebben veel dieren (342 stuks). Bij een groot, duidelijk verschil met een royale N is significantie triviaal — de toets bevestigt alleen wat je met het blote oog al zag. De p is dan niet het nieuws. De grootte is het nieuws.
Voor die grootte bestaat bij een eenweg ANOVA de effectgrootte η² (eta-kwadraat, eta squared). Die vertelt je welk aandeel van alle verschil in gewicht verklaard wordt door de soort:
s <- summary(model.soort)[[1]]
# η² → 0.67
s[1, "Sum Sq"] / sum(s[, "Sum Sq"])
# of kant-en-klaar:
# library(effectsize); eta_squared(model.soort)η² = .67. Van al het verschil in gewicht tussen deze 342 pinguïns wordt 67% verklaard door welke soort het is. Dat is enorm — weet je de soort, dan weet je het gewicht al bijna. Dáár zit het verhaal, niet in de F. En η² sluit naadloos aan op de r² uit het correlatieblok en op Cohens d uit het d-blok: allemaal manieren om te zeggen hoe groot iets is, los van of het er is.
En dan de aansluiting die dit hoofdstuk rondmaakt. Die F van 343.63 zag je in de eerste oefening van dit hoofdstuk al staan, drie keer achter elkaar: onder de regressie met je zelfgebouwde dummy’s, onder de regressie waarin het programma ze zelf maakte, en onder de eenweg ANOVA. En η² is geen neefje van de R² uit die regressie — het is hetzelfde getal, .6697, tot op de laatste decimaal. Dat is geen toeval en geen benadering: de eenweg ANOVA en de dummy-regressie zíjn één model. De toets vraagt “zit er ergens verschil?” en de regressie vraagt “hoeveel, en tussen wie?”, maar ze rekenen aan precies dezelfde som.
De les van dit blok, in drie zinnen:
- Drie of meer groepen op één groepering → eenweg ANOVA. Eén toets in plaats van een stapel losse t-toetsen. Hij vraagt: zit er ergens een verschil tussen de groepen? Groepeer je op twee dingen tegelijk, dan heet het een tweeweg ANOVA, en dat is de volgende oefening over interactie.
- Hij zegt “ergens”, de post-hoc zegt “waar”. Hier: niet Adélie tegen Chinstrap (die zijn even zwaar), maar de Gentoo die er bovenuit steekt.
- Significant zegt “waarschijnlijk niet nul”, niet “groot”. Bij een F van 343 is de p geen nieuws; η² wél. Rapporteer de effectgrootte naast de toets.
Zou je het in één eerlijke zin opschrijven, dan niet “de soorten verschillen significant in gewicht (p < .001)”, maar: “de drie soorten verschillen sterk in gewicht (η² = .67); dat verschil zit vrijwel helemaal in de Gentoo, die ruim 1300 gram zwaarder is dan de andere twee, die onderling niet verschillen.” Het getal met een maat eromheen, en meteen wélke groep het doet.
jouw beurt
Van soort naar sekse
een tweede groepering · ontbrekende waarden · F = t²
Jouw beurt — bekende beesten, nieuwe knip. Het hele hoofdstuk sneed de pinguïns op soort, maar het bestand heeft nog een tweede groepskolom: sekse. Twee groepen maar — en juist daarom kun je hier iets sluiten wat dit blok tot nu toe alleen op de twaalf steentjes liet zien: bij twee groepen is F precies t in het kwadraat.
Draai eerst de vier regels hieronder, en beantwoord daarna de vragen. De laatste heet met opzet Z) en niet l): de aannames staan altijd achteraan, en die vreemde letter zegt “en ook, elke keer, deze”. En onder Tentamenvragen, aan het eind van deze oefening, staan dezelfde onderwerpen nog een keer in de vorm waarin een tentamen ze stelt.
peng <- read.csv("penguins.csv")
model.sekse <- aov(gewicht ~ sekse, data = peng)
summary(model.sekse)
tapply(peng$gewicht, peng$sekse, mean)a) Hoeveel pinguïns hebben een vastgestelde sekse, en hoeveel staan er in het bestand? Tel het vóór je toetst, met sum(is.na(peng$sekse)) en table(peng$sekse). (drie getallen: per sekse, samen, en hoeveel er leeg zijn)
b) Schrijf de nulhypothese voor het model als geheel voluit op, in woorden én in symbolen. (één zin, en die ook in symbolen)
c) Toets het model als geheel. (rapporteer F(df1, df2) en p)
d) Kijk naar de tweede df. Die is 331, en niet 340. Waar zijn de negen gebleven, en waar op je scherm stond dat?
e) Hoeveel wegen de twee seksen gemiddeld, en hoeveel scheelt dat? (rapporteer M per sekse en het verschil, in grammen)
f) Hoeveel procent van alle verschil in gewicht verklaart de sekse? Reken η² uit met s <- summary(model.sekse)[[1]] en s[1,"Sum Sq"] / sum(s[,"Sum Sq"]). (rapporteer η²)
g) Draai dezelfde vergelijking nu als t-toets, met de spreidingen gepoold: t.test(gewicht ~ sekse, data = peng, var.equal = TRUE). (rapporteer t(df) en p)
h) Kwadrateer die t — met al zijn decimalen van je scherm, niet met de afgeronde −8.54 — en leg het naast je F uit c). (twee getallen die gelijk horen te zijn)
i) Laat var.equal = TRUE nu eens weg. Je krijgt een andere t, een andere df en een kwadraat dat de F nét niet haalt. Welke drie getallen, en waarom is dat géén gat in de belofte van h)? (drie getallen en één zin)
j) Leg η² van de sekse naast die van de soort uit dit blok. Hoeveel keer verklaart de soort er meer? (twee η²’s en één verhouding)
k) Iemand zet één pinguïn achter een gordijn en je mag één vraag stellen voor je het gewicht raadt: welke soort? of welke sekse? Welke kies je, welk getal uit deze oefening zei je dat — en waarom kon de p dat niet zeggen?
Z) Mag je alles hierboven geloven? Loop de aannames van een eenweg ANOVA na: is de spreiding in gewicht ongeveer gelijk in de twee seksen (tapply(peng$gewicht, peng$sekse, sd)), liggen de residuen ongeveer symmetrisch, en telt elke pinguïn maar één keer mee? (drie uitspraken, elk met het getal waar je hem op baseert)
a) 165 vrouwtjes en 168 mannetjes, samen 333 — geen 342. Bij 9 pinguïns is de sekse in het veld nooit vastgesteld; de bladzij over de datasets vertelt het al. Onthoud die negen, ze duiken zo op waar je ze niet verwacht.
b) De nulhypothese: de sekse verklaart níéts van de verschillen in gewicht. In symbolen: \(H_0:\ \rho^2 = 0\) tegen \(H_1:\ \rho^2 > 0\) — Grieks, want het gaat over de populatie en niet over deze 333. Je mag het ook over de twee populatiegemiddelden zeggen, \(H_0: \mu_{\text{vrouw}} = \mu_{\text{man}}\); één van de twee is genoeg.
c) F(1, 331) = 72.96, p < .001. Die mag dus de deur uit.
d) aov() heeft de negen rijen zonder sekse stilzwijgend weggegooid — geen melding, geen waarschuwing. 331 is 333 − 2, niet 342 − 2. De df is de plek waar dat zichtbaar wordt, en jij zag het aankomen, want je had bij a) geteld.
e) Vrouwtjes M = 3862.27 g, mannetjes M = 4545.68 g. De mannetjes wegen gemiddeld 683.41 gram meer.
f) η² = .18. De sekse verklaart 18% van alle verschil in gewicht tussen deze dieren.
g) t(331) = −8.54, p < .001. Hetzelfde aantal vrijheidsgraden als de noemer-df bij c), en dat is geen toeval.
h) (−8.5417)² = 72.96, precies de F uit c). Kwadrateer je de afgeronde −8.54, dan staat er 72.93 en klopt het nét niet — dezelfde valkuil als bij de diamantjes, een cijfer verderop.
i) Zonder var.equal = TRUE draait R zijn eigen standaard: een t-toets die elke groep zijn eigen spreiding gunt, de Welch-toets. Die geeft t(323.90) = −8.55, en (−8.5545)² = 73.18 — nét niet de 72.96. Geen gat in de belofte: aov() voegt de spreidingen van de twee groepen samen tot één, en alleen de t-toets die hetzelfde doet, maakt de som rond. Wie dat niet weet, rekent het na, ziet 73.18 staan en denkt dat de belofte niet klopt.
j) Soort η² = .67, sekse η² = .18 — de soort verklaart er 3.7 keer zoveel. En allebei zijn ze kraakhelder significant.
k) Vraag welke soort? Dat zei η²: .67 tegen .18. De p kon het niet zeggen, want die beantwoordt een andere vraag — is er verschil? — en bij 333 dieren is het antwoord daarop bij allebei even overtuigend “ja”. Hoe groot dat verschil is, staat alleen in de effectgrootte.
Z) Ja, met de gebruikelijke slag om de arm. De spreiding in gewicht is 666.17 g bij de vrouwtjes en 787.63 g bij de mannetjes — de grootste is 1.18 keer de kleinste, ruim onder de 2, dus gelijke spreiding is hier geen probleem. De residuen liggen bijna symmetrisch (scheefheid 0.40). En elke pinguïn is één keer gewogen, dus de waarnemingen zijn onafhankelijk.
En de weg terug, voor als een van die drie wél was gezakt:
- Blijft staan: de twee gemiddelden bij e) en het verschil van 683.41 gram. Dat zijn beschrijvingen van deze 333 dieren, en daar verandert geen aanname iets aan.
- Doe je over: de F en de p bij c), de t bij g), en daarmee je conclusie. Die rusten alle drie op één gedeelde spreiding, en die is er dan niet.
η² zit tussen die twee in: hij is een verhouding van kwadratensommen en blijft dus gewoon staan als beschrijving, maar je mag hem niet meer als schatting voor de populatie lezen.
rapportage
Schrijf het op als een onderzoeker
APA-rapportage · symbolen cursief, η² rechtop · twee decimalen
Het voorbeeld hieronder gaat over een kolom die je in dit blok niet hebt gedraaid: de vinlengte van dezelfde 342 pinguïns. De drie soorten gaan in één eenweg ANOVA, en de Adélies en de Chinstraps daarna nog eens apart in een t-toets met Cohens d. Zo’n stuk zelf schrijven doe je in de Eindopdracht van dit hoofdstuk, aan het eind van Oefening 9.5.
Drie soorten, één toets, en een verschil dat je met een maat eromheen opschrijft — het klinkt als veel, maar het is nog steeds gewoon een boodschappenlijstje in zinsvorm: wat onderzocht je, wat kwam eruit, en hoe groot was het. Alleen ligt dat lijstje in een artikel in twee stukken, en die houd je uit elkaar. Zo:
Methode en data-analyse
Om te onderzoeken of de drie pinguïnsoorten verschillen in vinlengte, vergeleken we de vinlengte van 342 pinguïns met een eenweg variantieanalyse. Van alle 342 dieren was de vinlengte bekend. De spreiding in vinlengte liep tussen de soorten weinig uiteen (de standaarddeviaties lagen tussen 6.48 en 7.13 mm), elke pinguïn werd één keer gemeten, en de residuen lagen vrijwel symmetrisch. Adélies en Chinstraps vergeleken we aanvullend met een t-toets voor onafhankelijke steekproeven volgens Welch, met Cohens d als effectgrootte.
Resultaten
De soorten verschilden sterk in vinlengte, F(2, 339) = 594.80, p < .001, η² = .78: welke soort een pinguïn is, verklaarde zo’n 78% van alle verschil in vinlengte. Adélies (M = 189.95, SD = 6.54, n = 151) en Chinstraps (M = 195.82, SD = 7.13, n = 68) — twee soorten die in gewicht niet te onderscheiden waren — verschilden in vinlengte wél duidelijk, met een groot effect, t(119.7) = −5.78, p < .001, d = 0.87.
Waarom die twee stukken uit elkaar staan. Dit hoort bij de les en niet bij de zin: wie de zinnen overschrijft, laat dit hier liggen. In het eerste stuk staat geen enkele uitkomst van je onderzoeksvraag, en dat is met opzet — wat er wél staat zijn de controles die je mócht doen voordat je begon. Je lezer moet kunnen beoordelen óf hij je getallen mag geloven vóórdat hij ze ziet — waren die drie spreidingen wél ver uiteen gelopen, dan had hij dat hier gelezen en met die kennis naar je F gekeken. Zet je die mededeling achteraan, dan heeft hij je conclusie al binnen en leest hij de aannames als een naschrift.
Kijk nu wat er staat, en wat niet. Alléén de symbolen zijn cursief (F, M, SD, t, p, d) — de Griekse η² blijft rechtop, zoals APA het wil — en de gewone woorden staan gewoon rechtop. De getallen krijgen twee decimalen (594.80, 0.87), netjes APA-precies, terwijl je in lopende uitleg gerust mag afronden (“bijna 80%”) voor de intuïtie. Alles staat in de verleden tijd, want je vertelt wat er gevónden werd, en de zinnen staan op eigen benen: wie ze uit dit blok tilt, weet nog steeds wie er gemeten werd, wat er gemeten werd, en hoe groot het verschil was.
Jouw beurt: schrijf zelf de rapportage voor het gewicht uit dit blok — de eenweg ANOVA over de drie soorten (F(2, 339) = 343.63, p < .001, η² = .67), eventueel met de Gentoo die er als enige bovenuit steekt. Doe het in dezelfde twee stukken, dus met een methode-stukje waarin je aanname-controle staat: de spreidingen in gewicht waren 458.57, 384.34 en 504.12 gram, en die heb je in Oefening 9.1 al bij Z) nagekeken. De zinnen hierboven mag je lenen; hardop voorlezen mag ook.
En dan nog één, want dit hoofdstuk begon met twee dummy’s. Schrijf hetzelfde resultaat nóg een keer op, maar nu als regressie: met de Adélies als referentiecategorie, en met de twee regressiegewichten in plaats van de F. Vergelijk je twee zinnen daarna naast elkaar. Ze gaan over dezelfde 342 pinguïns, ze rusten op hetzelfde model, en ze vertellen een net iets ander verhaal — de ANOVA-zin zegt dat de soorten verschillen, de regressie-zin zegt wie van wie en hoeveel. Alleen die tweede zin moet je erbij vertellen vanaf wie er geteld is; de eerste hoeft dat niet.
tentamen
Tentamenvragen
wat F wél zegt · post-hoc · η² lezen · F = t² · waar de df vandaan komt
Deze vijf hebben de vorm waarin een tentamen dit onderwerp stelt: vier opties, en precies één is de beste — de andere drie kunnen best waar klínken en toch niet het beste antwoord zijn. Rekenen hoeft nergens — aflezen en naast elkaar leggen wel.
1. De eenweg ANOVA over de drie soorten geeft F(2, 339) = 343.63, p < .001. Wat mag je daaruit besluiten?
- Alle drie de soorten verschillen in gewicht van elkaar, want de toets kijkt naar alle drie tegelijk en komt ruim boven de grens uit.
- Ergens tussen de drie soorten zit verschil in gewicht; wélke, zegt deze toets niet.
- Het verschil in gewicht tussen de soorten is groot, want 343.63 is een enorm getal en de p komt niet eens meer op het scherm.
- De soorten schelen gemiddeld 343.63 gram in gewicht, en dat is meer dan een pond.
2. De post-hoc-toets geeft: Chinstrap − Adélie 32.43 gram met p = .88, Gentoo − Adélie 1375.35 gram met p < .001, en Gentoo − Chinstrap 1342.93 gram met p < .001. Welke samenvatting is de beste?
- De Gentoo verschilt alleen van de Adélie; van de Chinstrap verschilt hij niet aantoonbaar in gewicht.
- De post-hoc spreekt de eenweg ANOVA tegen, want die zei dat er verschil in gewicht was en hier haalt één van de drie paren de grens niet; een van de twee uitkomsten moet dus fout zijn.
- De eenweg ANOVA zei dat er érgens verschil in gewicht zit; de post-hoc wijst aan waar: bij de Gentoo, en niet tussen Adélie en Chinstrap.
- Alle drie de paren verschillen in gewicht, want de eenweg ANOVA over deze drie soorten was significant.
3. Voor diezelfde eenweg ANOVA is η² = .67. Wat betekent dat getal?
- Het gewicht van een Gentoo ligt 67% boven dat van een Adélie, en dat is het verschil dat de toets heeft gevonden.
- Van al het verschil in gewicht tussen deze 342 pinguïns wordt 67% verklaard door welke soort het is.
- Van de 342 pinguïns weegt 67% ongeveer wat je op grond van hun soort zou verwachten, en de rest wijkt af.
- De kans dat de eenweg ANOVA dit gewichtsverschil vindt is .67, en dat is ruim boven het toeval.
4. Op de sekse geeft aov() een F van 72.96, en de t-toets mét var.equal = TRUE geeft t = −8.5417: het kwadraat daarvan is 72.96, precies. Laat je die schakelaar weg, dan geeft R t = −8.5545, en dat kwadraat is 73.18. Waarom is die 73.18 géén gat in de belofte F = t²?
- Het scheelt maar drie tiende procent, dus het is een afrondkwestie.
- De belofte geldt alleen bij precies even grote groepen, en die zijn er hier niet: 165 vrouwtjes tegen 168 mannetjes, dus drie te veel.
aov()voegt de twee spreidingen samen tot één; alleen de t-toets die hetzelfde doet, maakt de som rond.- Zonder die schakelaar rekent R met andere vrijheidsgraden, en dat verschil zit in het kwadraat.
5. Bij die eenweg ANOVA op de sekse staat er 331 als tweede df, terwijl het bestand 342 pinguïns bevat. Waar komt 331 vandaan?
- Van negen pinguïns is de sekse nooit vastgesteld;
aov()laat die rijen zonder melding weg, en van de 333 die overblijven gaan er nog twee vrijheidsgraden af: 333 − 2 = 331. - Negen pinguïns wogen zoveel af van hun soortgenoten dat
aov()ze als uitschieter buiten het model heeft gelaten. - Een eenweg ANOVA verliest altijd elf vrijheidsgraden aan het model, dus 342 − 11 = 331.
- Er moet iets misgegaan zijn: R waarschuwt altijd als hij rijen weglaat, en die waarschuwing kwam niet — met alle 342 dieren erin had er dus gewoon 342 − 2 = 340 moeten staan.
1 b · 2 c · 3 b · 4 c · 5 a
Hieronder staat per vraag waaróm, en waarom de drie andere opties aantrekkelijk zijn. Heb je er een goed, dan kun je die overslaan.
1. b. De eenweg ANOVA kijkt naar alle groepen in één beweging en geeft één antwoord: érgens zit verschil. a is het antwoord dat de meeste mensen als eerste geven, en de post-hoc laat zien dat het te veel beweert: tussen Adélie en Chinstrap staat een verschil van 32 gram bij p = .88, en dat paar is dus niet aangetoond. Eén significante F betekent niet dat élk paar verschilt. (Let op de formulering — niet aangetoond is niet hetzelfde als aangetoond dat ze gelijk zijn; daar gaat vraag 2 over.) c verwart echt met groot. De F is zo hoog om twee saaie redenen — het verschil ís bruut en er zijn 342 dieren — en hoe groot het is zegt η², niet F. d plakt grammen aan een getal dat er geen heeft: F is een verhouding, en het gemiddelde verschil in grammen staat in de post-hoc-uitvoer (32, 1343 en 1375 gram).
2. c. Precies de rolverdeling: de toets zegt dat, de post-hoc zegt waar. a leest de tabel half: het paar Gentoo − Chinstrap staat er met 1342.93 gram en p < .001 gewoon bij, dus de Gentoo verschilt van allebei de andere soorten. b ziet een tegenspraak die er niet is — de eenweg ANOVA belooft niet dat álle paren verschillen, alleen dat er érgens verschil zit, en dat klopt hier ruimschoots. d is dezelfde denkfout als 1a, nu met de post-hoc-tabel er gewoon bij afgedrukt.
Nog één ding over dat paar Adélie–Chinstrap, want de tekst hierboven zegt kort “die zijn even zwaar” en dat is spreektaal. Wat er werkelijk staat is dit: 32 gram op een gezamenlijke spreiding van 437 gram is een effect van d = 0.07, en de kans dat een opzet van deze omvang zoiets oppikt is .07. Om een verschil van die grootte met power .80 te zien, had je er zo’n 2852 per soort nodig gehad. Je hebt dus niet aangetoond dat ze gelijk zijn — je hebt gekeken met een instrument dat dit verschil bijna nooit kán zien. Op een tentamen is precies dat onderscheid vaak de vraag.
3. b. η² is een aandeel: het deel van alle verschil in gewicht dat de soort voor zijn rekening neemt. a maakt er een verschil tussen twee soorten van, en dat is een ander getal — een Gentoo weegt gemiddeld 1.37 keer zoveel als een Adélie, dus 37% meer, niet 67%. c telt pinguïns in plaats van verschil; η² gaat over de spreiding in de kolom, niet over hoeveel dieren “kloppen”. d verwart de effectgrootte met de kans om een effect te vínden — dat heet power, en daar gaat de oefening over power over.
4. c. aov() rekent met één gezamenlijke spreiding, en de belofte F = t² geldt tussen twee sommen die hetzelfde doen. Zonder de schakelaar gunt R elke sekse zijn eigen spreiding en rekent dus iets anders uit; dat er dan een ander getal uitkomt is geen fout maar het verschil zelf. a heeft het rékenwerk goed en de conclusie fout: 73.18 − 72.96 = 0.22, en dat is inderdaad drie tiende procent van 72.96. Alleen: een afrondingsverschil krímpt zodra je meer decimalen pakt, en dit verschil niet — het zit in de toets en niet in de weergave. b noemt een voorwaarde die er niet is, en dat is hier te zien: de twee groepen zijn écht ongelijk (165 tegen 168) en tóch klopt de belofte tot op de laatste decimaal. Eén gedeelde spreiding is de voorwaarde, gelijke groepsgrootte niet. d wijst het enige zichtbare getal aan dat afwijkt — de vrijheidsgraden — en dat is een verstandige reflex, maar vrijheidsgraden gaan niet mee in een kwadraat. Ze bepalen alleen bij welke verdeling je de t opzoekt, dus ze kunnen het verschil tussen 72.96 en 73.18 niet maken.
5. a. Je had het aan zien komen bij a) van Jouw beurt: 165 plus 168 is 333 en niet 342. b verzint een opschoning die niet gebeurd is — aov() verwijdert nooit uit zichzelf een waarneming omdat die ver van de rest ligt. c maakt van elf een vaste aftrek. Dat getal is hier toevallig elf: negen dieren vallen weg, en van de 333 die overblijven gaat er één vrijheidsgraad naar het algemeen gemiddelde en één naar de sekse. Bij een compleet bestand was de aftrek twee geweest, en had er 340 gestaan. d is de gevaarlijkste van de vier, want de gewoonte erachter is juist een goede: vertrouwen dat je programma iets zegt. Alleen doet R dat hier níét — geen melding, geen waarschuwing, alleen een df die opeens negen lager staat. Dáárom telt de goede lezer vóór hij toetst.
Wil je de getallen uit de bespreking zelf zien ontstaan — geen ervan is overgetikt:
peng <- read.csv("penguins.csv")
m <- tapply(peng$gewicht, peng$soort, mean)
# vraag 3a — zoveel keer zwaarder is een Gentoo dan een Adelie → 1.37
unname(m[["Gentoo"]] / m[["Adelie"]])
model.sekse <- aov(gewicht ~ sekse, data = peng)
F.sekse <- summary(model.sekse)[[1]][["F value"]][1]
t.welch <- t.test(gewicht ~ sekse, data = peng, var.equal = FALSE)$statistic
# vraag 4a — zoveel procent van 72.96 is het verschil met 73.18 → 0.3
100 * (unname(t.welch^2) - F.sekse) / F.sekse
ad <- peng$gewicht[peng$soort == "Adelie"]
ch <- peng$gewicht[peng$soort == "Chinstrap"]
sp.ac <- sqrt(((length(ad)-1)*var(ad) + (length(ch)-1)*var(ch)) /
(length(ad)+length(ch)-2))
# vraag 2 — Adelie tegen Chinstrap: hun gezamenlijke spreiding → 437
round(sp.ac)
# vraag 2 — en dat maakt hun verschil een effect van → 0.07
(mean(ch) - mean(ad)) / sp.ac
# vraag 2 — de kans dat zo'n opzet dat effect oppikt. power.t.test() wil EEN n,
# dus gaan 151 en 68 er als hun harmonisch gemiddelde in -- de gebruikelijke
# manier om twee ongelijke groepen in een getal te vatten (hier 93.77) → 0.07
power.t.test(n = 2*length(ad)*length(ch)/(length(ad)+length(ch)),
delta = mean(ch) - mean(ad), sd = sp.ac)$power
# vraag 2 — en zoveel per soort had je nodig gehad voor power .80 → 2852
power.t.test(delta = mean(ch) - mean(ad), sd = sp.ac, power = .80)$n◠ Zelfde vorm in het boek
Hier: drie of meer groepen, één toets die vraagt of er érgens verschil zit, en de effectgrootte die zegt hoe groot dat verschil is.
In het boek: W9 — Groepen zijn ook getallen
Voetnoten
Palmer Penguins — Gorman, Williams & Fraser (2014), Palmer Station Antarctica LTER; via het R-pakket
palmerpenguins(CC0).penguins.csv, 342 pinguïns. Alle getallen op die échte data nagerekend.↩︎