Hoofdstuk 7 · De p-waarde

Hoe slecht passen de data bij ‘er is niks’? · the p-value

De prikkel

Dertig planten, drie potjes voer.1 Tien krijgen niks bijzonders (controle), tien krijgen het ene goedje, tien het andere. Aan het eind weeg je van elke plant het droge gewicht. De controle-planten wegen gemiddeld 5.03 gram, de planten op behandeling 2 gemiddeld 5.53. Een half grammetje meer.

Doet het voer iets? Of is dat halve grammetje gewoon toeval — hadden er nou eenmaal een paar zware planten in het verkeerde potje gestaan?

Dat is de vraag onder bijna élk onderzoek. En het antwoord komt straks in één klein getalletje: p = .048. In dit blok gaan we dat getal niet geloven — we gaan het tellen.

Speel het

⬇ Download de data — plantgroei.csv

Haal de planten binnen en laat de klassieke t-toets het verschil wegen tussen controle en behandeling 2.

OpmerkingIn R · trek eraan
pg <- read.csv("plantgroei.csv")

# gemiddeld gewicht per groep
tapply(pg$gewicht, pg$groep, mean)          # controle 5.03, behandeling2 5.53

# vergelijk controle vs behandeling2
tweetal <- pg[pg$groep %in% c("controle", "behandeling2"), ]
t.test(gewicht ~ groep, data = tweetal)     # t = -2.13, p = 0.048

Daar staat het: het verschil is 0.50 gram, t = −2.13, en p = .048. Het 95%- betrouwbaarheidsinterval loopt van −0.98 tot −0.01 — het schampt de nul, maar gaat er nét niet overheen. Volgens de gewoonte-grens van .05 is dit “significant” — nét. Maar wat ís die .048 eigenlijk? Voor je die vraag beantwoordt uit een tabel, gaan we hem zelf maken.

Schud het

Hier is de truc, en het is de mooiste van het hele boek. Stel: het voer doet niks. Helemaal niks. Dan is het etiket “controle” of “behandeling2” op een plant volstrekt willekeurig — je had de labels net zo goed door elkaar kunnen gooien, het gewicht zou hetzelfde blijven. Dus dat doen we. Duizend keer.

Elke keer husselen we de twintig groepslabels lukraak over de twintig planten, en meten we het verschil tussen de twee nep-groepen. Zo bouwen we duizend werelden waarin het voer bewijsbaar niks doet — en kijken hoe vaak het blinde toeval alléén al een verschil oplevert dat even groot is als (of groter dan) onze echte 0.50.

OpmerkingIn R · schud de labels door elkaar
tweetal <- pg[pg$groep %in% c("controle", "behandeling2"), ]

echt <- diff(tapply(tweetal$gewicht, tweetal$groep, mean))   # het echte verschil, 0.50

# één toeval-wereld: plak de labels lukraak op de gewichten
schud <- function() {
  nep <- sample(tweetal$groep)                     # labels door elkaar
  abs(diff(tapply(tweetal$gewicht, nep, mean)))    # verschil in die wereld
}

set.seed(42)
werelden <- replicate(1000, schud())
hist(werelden)                                     # een bergje rond nul
abline(v = abs(echt), col = "red", lwd = 2)        # daar staat de echte 0.50

# tel: hoe vaak komt het toeval even ver of verder?
mean(werelden >= abs(echt))                        # → ongeveer 0.048

Kijk naar dat plaatje. De duizend toeval-verschillen kruipen dicht om nul — de meeste werelden komen niet in de buurt van een half grammetje. En dan tel je hoe vaak het toeval tóch even ver reikt als jouw echte planten: zo’n 48 van de 1000. Dat aandeel — .048 — ís de p-waarde. Geen formule die je uit een tabel moet geloven, maar een fractie die je hebt geteld:

De p is de fractie toeval-werelden die net zo ver komen als de jouwe.

Zeldzaam is het, die 48 op 1000 — maar niet onmogelijk. En het staat op het randje. Dat randje is de hele les.

Snap het

Nu je p zelf geteld hebt, kun je precies zien wat het wél en niet zegt.

Wat het zegt. Onze p = .048 betekent: als het voer niks deed, zou zó’n groot verschil in maar ongeveer 5 van de 100 toeval-werelden opduiken. De data passen dus slécht bij het idee “er is niks”. Dat is precies wat een p-waarde meet — hoe slecht de data bij ‘er is niks’ passen, en niets meer.

Wat het níét zegt. Let op, want hier struikelt bijna iedereen:

  • p is niet hoe groot het effect is. Ons effect is een half grammetje — dat lees je af aan het verschil (0.50) en het interval [−0.98, −0.01], niet aan de p. Een piepklein effect kan een piepkleine p krijgen als je maar genoeg planten weegt.
  • p is niet de kans dat er niks aan de hand is. Hij rekent de andere kant op: hij vertrekt vanuit “er is niks” en vraagt hoe raar jouw data dan zijn — niet vanuit jouw data hoe waarschijnlijk “er is niks” is. P(data | er is niks) is iets heel anders dan P(er is niks | data).

En dat randje. Onze .048 haalt de gewoonte-grens van .05 — nét. Maar bedenk: was er één zware controle-plant net iets lichter geweest, dan stond er misschien .052, en dan zou dezelfde uitkomst ineens “niet significant” heten. Dat kan niet kloppen. .05 is een afspraak, geen natuurgrens. Een p van .048 en een p van .052 vertellen hetzelfde verhaal: een zwak, wankel signaaltje dat om nuance vraagt, niet om een ja/nee-stempel.

En de andere kant op. Reken voor de grap ook eens controle tegen behandeling 1 uit:

OpmerkingIn R · de andere behandeling
ander <- pg[pg$groep %in% c("controle", "behandeling1"), ]
t.test(gewicht ~ groep, data = ander)       # p = 0.25 — dik niet-significant

Daar komt p = .25 uit: het toeval haalt zó’n verschil moeiteloos, in een kwart van de werelden. Niks aan de hand? Voorzichtig. “Niet significant” betekent niet aangetoond — niet aangetoond dat er niks is. Misschien werkt behandeling 1 wél en waren tien planten te weinig om het te zien. Afwezigheid van bewijs is geen bewijs van afwezigheid. Een p die groot is, sluit niets uit; hij zwijgt alleen.

Zelfde vorm in het boek

Hier: het toeval duizend keer laten dansen om nul, en tellen hoe vaak het even ver komt als jij — dat aandeel is de p.

In het boek: W6 — Bestaat het verschil echt?

Daar wordt de toets een omkering: stel dat er niks is — hoe raar zijn onze data dán? De p is het antwoord op die omgekeerde vraag, nooit op de vraag zelf.

TODO (broertje-proof, geschreven naar het charter 24-7): W6 (Bestaat het verschil echt?) is nog een grove boek-schets — anker en formulering checken zodra dat hoofdstuk staat. De schud-zet is hier de kern van het blok, niet “default aan / natuurlijk uit”: bij de p-waarde ís de simulatie de definitie. Getallen (n=30, M 5.03 / 5.53, verschil 0.50, t=−2.13, p=.048, CI [−0.98,−0.01], contrast p=.25) op de echte PlantGrowth-data nagerekend. De ~48/1000 volgt direct uit p=.048; de exacte simulatie-telling wiebelt met de seed rond .048. Verhaal-stem-opening = eerste stem-pas; kan nog stiller. De JASP-tweeling deelt deze tekst; alleen “Speel het / Schud het” verschilt (JASP kan de shuffle niet zelf — zie het JASP-blok voor de gekozen oplossing).

Voetnoten

  1. PlantGrowth — droog gewicht van planten onder drie condities; Dobson (1983), via R (datasets::PlantGrowth, publieke data). Alle getallen in dit blok zijn op die échte data nagerekend.↩︎