0. Opfris — enkelvoudige regressie vóór het echte werk

Sjonge sjonge — daar gaan we weer

“Sjonge sjonge,” zei de das, en hij bleef in zijn hol liggen. “Alleen opstaan kost me al moeite. En dan nog extra moeite per ding dat ik vandaag moet doen. En dat zijn er nogal wat.”

Aan het begin van MVDA is dat een bekend gevoel. Regressie ophalen, want dat heb je ooit gehad. ANOVA ergens vandaan halen — die was anders, of niet? ANCOVA, MANOVA, logistische regressie, repeated measures, mediatie — dat komt allemaal nog. Sjonge sjonge.

Dus voor we daaraan beginnen, eerst dit: één kort hoofdstuk waarin we enkelvoudige regressie ophalen — niet om je voor schut te zetten als je het niet meer weet, maar omdat het echt wat helpt. Het is een tijdje geleden voor de meesten. Geen schaamte. Even terug naar het simpelste model dat we hebben.

En kijk: in wat de das zei, zit eigenlijk al alles wat je over enkelvoudige regressie hoeft te weten. “Alleen opstaan kost me al moeite” — dat is een basisniveau: wat er al is bij nul dingen, als X=0X = 0. “Extra moeite per ding” — dat is een helling: hoeveel er per eenheid bijkomt. Samen vormen die twee getallen een lijn. En een lijn — dat is wat een regressiemodel doet.

De das gaat ervan uit dat elk ding hem iets kóst. Of dat klopt, zie je zo meteen in de data: een ding kan ook iets opleveren.

We doen dit hoofdstuk in zeven stappen:

  1. Negen sjacherijns — een mini-dataset waarbij je de regressielijn met het potlood kunt tekenen, zonder formule.
  2. Formules erbij — pas dan praten we over b0b_0 en b1b_1, wat ze betekenen, en hoe ver je de lijn mag doortrekken.
  3. Hoe goed werkt onze lijn? — DATA = FIT + RESIDU, de drie kwadratensommen als plaatje, en R2R^2 als hoofdmaat.
  4. Toetsen — vrijheidsgraden, de ANOVA-tabel als sudoku, wat een FF-toets eigenlijk zegt, en waarom FF en tt hier hetzelfde zeggen.
  5. rr, b1b_1 en β\beta — drie getallen, één verhouding.
  6. Waarom MVDA straks anders wordt — vooruitkijk naar wat er verandert zodra er meer dan één voorspeller in het spel is.
  7. Wat hierna komt — een korte teaser per thema, zonder uitleg.

Wat een toets eigenlijk zegt, komt hier één keer langs, met een bakker erbij. Hoe je toetsen rapporteert en wanneer je welke kiest, hoort bij thema 1 en verder.

TipWat je na dit hoofdstuk moet kunnen

Dit hoofdstuk is de bodem onder thema 1. Na dit hoofdstuk kun je:

  1. b0b_0 en b1b_1 uit de uitvoer van lm() halen, in gewone woorden zeggen wat ze over YY vertellen, en zeggen of b0b_0 iets betekent;
  2. bij een gegeven XX de voorspelde Ŷ\hat Y en het residu e=Y−Ŷe = Y - \hat Y uitrekenen;
  3. de variantie in YY splitsen in wat het model verklaart en wat overblijft (SST=SSM+SSESS_T = SS_M + SS_E), en daaruit R2R^2 halen;
  4. een halve ANOVA-tabel aanvullen: de ontbrekende SSSS, dfdf, MSMS en FF terugrekenen uit wat er wél staat;
  5. de nulhypothese opschrijven als uitspraak over de populatie, en zeggen wat de pp-waarde wel en niet zegt;
  6. de FF-toets van het model en de tt-toets van de helling lezen, en zien dat ze bij één voorspeller hetzelfde zeggen;
  7. uitleggen waarom bij één voorspeller het gestandaardiseerde gewicht gelijk is aan de correlatie.

In R doe je dat met lm(), summary() en anova().


0.1 Negen sjacherijns — intuïtief zien

De dag is begonnen. Negen diertjes liggen, hangen, of staan ergens — geen van allen heeft zin. Een das blijft in zijn hol. Een muis kijkt naar zijn nestje vol zandkorrels en weet wat-er-zou-moeten, maar het hoeft niet. Een mus kuiert wat door de struiken zonder zelfs te neuriën.

De vraag voor vandaag: als ze toch wat taakjes oppakken — hoe groot is het verschil aan het eind van de dag in hoe rustig ze kunnen slapen?

load("data/sjacherijns.RData")
sjacherijns
  sjacherijn                 taakje rondjes slaap_rust
1        das      bleef in zijn hol       0         30
2       muis     nestje schoonmaken       1         40
3        mus      kindertjes voeren       2         50
4       egel slakken-route afleggen       3         50
5     kikker         vliegen vangen       4         60
6     konijn         gras knabbelen       5         70
7      merel         wormen pluizen       6         70
8   veldmuis     zaadjes verzamelen       7         80
9    bunzing  sluiproutes verkennen       8         90

Elk diertje heeft één hoofdtaak voor vandaag. Sommige doen ’m niet (das blijft in hol), sommige doen ’m één of twee keer, en de bunzing — die ondanks zichzelf onafgebroken sluiproutes is gaan verkennen — doet hem acht keer. De ironie van de meest-sjacherijn-zijnde sjacherijn die de meeste rondjes afmaakt zonder het te merken.

We vragen: hoe is hun slaaprust ’s avonds, op een schaal van 00 tot 100100?

OpmerkingVraag 0.1.a — Pen-en-papier (eerst kijken, dan rekenen)

Hieronder zie je de scatter van de data. Geen formule nog. Geen R. Alleen kijken.

Figuur 1: De negen sjacherijns: per diertje het aantal rondjes dat het vandaag deed, tegen zijn slaaprust ’s avonds (0–100).

a) Pak een potlood (of denk in je hoofd). Teken de lijn die volgens jou het beste door deze negen punten loopt. Niet uitrekenen — gewoon zien.

b) Waar snijdt jouw lijn de y-as? Dat is het basisniveau — een sjacherijn die nul rondjes doet (de das, die in zijn hol blijft): hoe rustig slaapt hij ’s avonds?

c) Hoeveel stijgt jouw lijn als je één eenheid naar rechts gaat? Dat is de helling — per extra rondje, hoeveel rustiger slaap je?

a) De punten liggen bijna op een rechte lijn. Met het oog trek je hem ergens van de das linksonder, (0,30)(0, 30), naar de bunzing rechtsboven, (8,90)(8, 90). De lijn die je zo meteen uitrekent, loopt net iets vlakker: van (0,32)(0, 32) naar (8,88)(8, 88), omdat de zeven punten ertussen ook meetellen.

b) Jouw lijn snijdt de y-as ergens rond de 3030 (op schaal 00–100100); de uitgerekende lijn doet het bij 3232. Dat is je intuïtieve b0b_0: de slaaprust die de lijn voorspelt voor een sjacherijn die nul rondjes doet. De das zelf, die in zijn hol bleef, zit op 3030. Niet bovenmatig laag, niet bovenmatig hoog. Sjacherijn-baseline. Hij is er, hij ademt, hij eet ergens een wortel, maar veel verder komt hij niet zomaar.

c) Per extra rondje stijgt de lijn met ongeveer 77. Dus per taakje dat hij vandaag oppakt: +7+7 slaaprust ’s avonds. Niet veel per taakje. Maar hij heeft het niet door dat dit gebeurt. De sjacherijn die ondanks zichzelf het meeste deed, de bunzing met 88 rondjes, slaapt het rustigst.

Inzicht. Je hebt zojuist met je oog gedaan wat een regressiemodel doet: een rechte lijn door een wolk punten leggen. Het basisniveau heet straks b0b_0 (de intercept), de helling heet b1b_1. Aandacht doet meer dan je denkt — ook voor sjacherijns. Hieronder zien we hoe je dat exact uitrekent.

0.2 Formules erbij — eindelijk

De regressievergelijking zegt: de uitkomst YY ligt op een rechte lijn van XX, plus een beetje toevalsruis ee:

Yi=b0+b1Xi+eiY_i = b_0 + b_1 X_i + e_i

In gewone woorden, en met de woorden van de das:

  • b0b_0 = basisniveau. “Alleen opstaan kost me al moeite” — wat er al is op het moment dat X=0X = 0. Bij ons: de slaaprust van een sjacherijn die geen enkel rondje afwerkt.
  • b1b_1 = helling. “Extra moeite per ding” — hoeveel YY verandert per eenheid stijging in XX. Bij ons: hoeveel extra slaaprust per extra rondje. Hier had de das het mis: bij hem kost elk ding iets, bij onze sjacherijns levert elk rondje rust op.
  • eie_i = residu. Wat het model nog niet snapt — de afwijking van punt ii van de lijn.

Voor enkelvoudige regressie zijn b0b_0 en b1b_1 rechtstreeks uit de data te halen:

b1=SSXYSSXb0=Y‾−b1⋅X‾b_1 = \frac{SS_{XY}}{SS_X} \qquad b_0 = \bar{Y} - b_1 \cdot \bar{X}

waarbij:

SSX=∑(Xi−X‾)2SSXY=∑(Xi−X‾)(Yi−Y‾)SS_X = \sum (X_i - \bar{X})^2 \qquad SS_{XY} = \sum (X_i - \bar{X})(Y_i - \bar{Y})

De formule voor b0b_0 zegt ook iets over de lijn zelf: hij loopt altijd door het punt (X‾,Y‾)(\bar X, \bar Y), het midden van de wolk.

OpmerkingVraag 0.2.a — Pen-en-papier (uit het hoofd te doen)

Voor onze negen sjacherijns:

a) Bereken X‾\bar{X} en Y‾\bar{Y}. (Tip: X=0,1,2,…,8X = 0, 1, 2, \ldots, 8 — wat is de som? En de som van Y=30,40,50,50,60,70,70,80,90Y = 30, 40, 50, 50, 60, 70, 70, 80, 90?)

b) Bereken SSX=∑(Xi−X‾)2SS_X = \sum (X_i - \bar{X})^2.

c) Bereken SSXY=∑(Xi−X‾)(Yi−Y‾)SS_{XY} = \sum (X_i - \bar{X})(Y_i - \bar{Y}).

(Tip bij b en c: zet het in een tabel met één rij per diertje en kolommen voor Xi−X‾X_i - \bar X, Yi−Y‾Y_i - \bar Y, hun kwadraten en hun product. De somrij geeft je de antwoorden.)

d) Bereken b1b_1 en b0b_0.

e) Toets je antwoord tegen de R-output hieronder.

m_sj <- lm(slaap_rust ~ rondjes, data = sjacherijns)
round(coef(m_sj), 3)
(Intercept)     rondjes 
         32           7 

a) ∑X=0+1+…+8=36\sum X = 0+1+\ldots+8 = 36, dus X‾=36/9=𝟒\bar{X} = 36/9 = \mathbf{4}. ∑Y=30+40+50+50+60+70+70+80+90=540\sum Y = 30+40+50+50+60+70+70+80+90 = 540, dus Y‾=540/9=𝟔𝟎\bar{Y} = 540/9 = \mathbf{60}.

b) en c) De hele tabel, met de somrij onderaan:

De negen sjacherijns en hun afwijkingen van het gemiddelde
Dier XiX_i YiY_i Xi−X‾X_i - \bar X Yi−Y‾Y_i - \bar Y (Xi−X‾)2(X_i-\bar X)^2 (Yi−Y‾)2(Y_i-\bar Y)^2 (Xi−X‾)(Yi−Y‾)(X_i-\bar X)(Y_i-\bar Y)
das 0 30 −4 −30 16 900 120
muis 1 40 −3 −20 9 400 60
mus 2 50 −2 −10 4 100 20
egel 3 50 −1 −10 1 100 10
kikker 4 60 0 0 0 0 0
konijn 5 70 1 10 1 100 10
merel 6 70 2 10 4 100 20
veldmuis 7 80 3 20 9 400 60
bunzing 8 90 4 30 16 900 120
Som 60 3000 420
Note. XX = aantal rondjes, YY = slaaprust (0–100). De somrij telt de laatste drie kolommen op.

SSX=𝟔𝟎SS_X = \mathbf{60} en SSXY=𝟒𝟐𝟎SS_{XY} = \mathbf{420} staan in de somrij. De kolom (Yi−Y‾)2(Y_i - \bar Y)^2 telt op tot SSY=3000SS_Y = 3000; die heb je nu nog niet nodig, en hij komt terug als SSTSS_T, de totale kwadratensom.

d) b1=420/60=𝟕b_1 = 420 / 60 = \mathbf{7}. b0=Y‾−b1⋅X‾=60−7⋅4=60−28=𝟑𝟐b_0 = \bar{Y} - b_1 \cdot \bar{X} = 60 - 7 \cdot 4 = 60 - 28 = \mathbf{32}.

e) De R-uitvoer zegt hetzelfde: b0=32b_0 = 32 en b1=7b_1 = 7, precies.

Inzicht. Je schatting met het oog bij 0.1.a (rond de 3030, en zo’n 77 per rondje) zat er dicht bij. Een regressielijn is geen mysterieuze machine — je oog deed feitelijk hetzelfde wat de formule doet, alleen ruwer. Aandacht is wat erbij komt, niet wat het leven dragend houdt.

WaarschuwingTrek de lijn niet verder door dan je data

Hier mag je b0=32b_0 = 32 gewoon lezen als de slaaprust die de lijn voorspelt voor een sjacherijn die nul rondjes doet: de das ís zo’n dier (zelf zit hij op 3030), dus X=0X = 0 ligt in je data. Dat is lang niet altijd zo. Ligt X=0X = 0 buiten je data (bij lengte in centimeters is niemand 00), dan is b0b_0 alleen het punt waar de lijn de y-as snijdt — gebruik hem voor de lijn, maar zeg niets over X=0X = 0.

Hetzelfde geldt aan de andere kant. Trek de lijn door naar 1010 rondjes en hij voorspelt 32+7⋅10=10232 + 7 \cdot 10 = 102: meer slaaprust dan de schaal van 00 tot 100100 toelaat. Een lijn geldt waar je data liggen; daarbuiten gok je.

0.3 Hoe goed werkt onze lijn? — DATA = FIT + RESIDU

We hebben een lijn: Ŷ=32+7⋅X\hat{Y} = 32 + 7 \cdot X. Maar hoe goed past die lijn? Voor elk diertje kunnen we drie getallen naast elkaar leggen:

  • DATA (YiY_i) — wat we werkelijk gemeten hebben (de slaap_rust uit de tabel)
  • FIT (Ŷi\hat{Y}_i) — wat het model voorspelt voor dit dier (uit de formule)
  • RESIDU (ei=Yi−Ŷie_i = Y_i - \hat{Y}_i) — wat het model voor dit dier niet snapt

Het is een heel eenvoudige optelling: DATA = FIT + RESIDU. Letterlijk:

Yi=Ŷi+eiY_i \;=\; \hat{Y}_i \;+\; e_i

Wat het model snapt komt in de FIT, wat het niet snapt blijft achter in het RESIDU. Voor onze negen sjacherijns:

# Het dollarteken zet een nieuwe kolom bij de data.
sjacherijns$fit    <- 32 + 7 * sjacherijns$rondjes    # b0 + b1 * X
sjacherijns$residu <- sjacherijns$slaap_rust - sjacherijns$fit

# De komma in [ , ... ] betekent: alle rijen, deze kolommen.
sjacherijns[, c("sjacherijn", "rondjes", "slaap_rust", "fit", "residu")]
  sjacherijn rondjes slaap_rust fit residu
1        das       0         30  32     -2
2       muis       1         40  39      1
3        mus       2         50  46      4
4       egel       3         50  53     -3
5     kikker       4         60  60      0
6     konijn       5         70  67      3
7      merel       6         70  74     -4
8   veldmuis       7         80  81     -1
9    bunzing       8         90  88      2
# Lees |> als "en dan": neem sjacherijns, en dan mutate().
# mutate() zet kolommen erbij en geeft de hele tabel terug. Binnen dezelfde
# mutate() mag residu al leunen op fit, dat een regel eerder ontstaat.
sjacherijns <- sjacherijns |>
  mutate(fit    = 32 + 7 * rondjes,        # b0 + b1 * X
         residu = slaap_rust - fit)

# select() kiest de kolommen die je wilt zien, bij hun kale naam.
sjacherijns |>
  select(sjacherijn, rondjes, slaap_rust, fit, residu)
  sjacherijn rondjes slaap_rust fit residu
1        das       0         30  32     -2
2       muis       1         40  39      1
3        mus       2         50  46      4
4       egel       3         50  53     -3
5     kikker       4         60  60      0
6     konijn       5         70  67      3
7      merel       6         70  74     -4
8   veldmuis       7         80  81     -1
9    bunzing       8         90  88      2
OpmerkingVraag 0.3.a — Pen-en-papier (rondjes hand-bereken)

a) Voor de das (rondjes=0\text{rondjes} = 0): wat is Ŷ\hat{Y}? En het residu?

b) Voor de muis (rondjes=1\text{rondjes} = 1, Y=40Y = 40): hetzelfde.

c) Voor de bunzing (rondjes=8\text{rondjes} = 8, Y=90Y = 90): hetzelfde.

d) Tel alle residuen bij elkaar op. Wat krijg je? Waarom?

a) Das: Ŷ=32+7⋅0=32\hat{Y} = 32 + 7 \cdot 0 = 32. Residu =30−32=−2= 30 - 32 = -2. Het model voorspelt iets hoger dan de echte slaap_rust van de das.

b) Muis: Ŷ=32+7⋅1=39\hat{Y} = 32 + 7 \cdot 1 = 39. Residu =40−39=+1= 40 - 39 = +1. De muis slaapt nét rustiger dan het model voorspelt.

c) Bunzing: Ŷ=32+7⋅8=32+56=88\hat{Y} = 32 + 7 \cdot 8 = 32 + 56 = 88. Residu =90−88=+2= 90 - 88 = +2. Ook bij de bunzing zit het model nét eronder.

d) ∑ei=−2+1+4+(−3)+0+3+(−4)+(−1)+2=𝟎\sum e_i = -2 + 1 + 4 + (-3) + 0 + 3 + (-4) + (-1) + 2 = \mathbf{0}.

Niet toevallig: de regressielijn wordt zo gekozen dat de residuen optellen tot nul. Het is een eigenschap van de kleinste-kwadraten-fit: de residuen zijn gebalanceerd rond nul. Anders zou je de lijn nog kunnen verschuiven.

Drie kwadratensommen — SSTSS_T, SSMSS_M, SSESS_E

Stel dat je het aantal rondjes niet kende. Dan was je beste gok voor elk diertje gewoon het gemiddelde, Y‾=60\bar Y = 60: een platte streep door de wolk. Elk diertje wijkt van die streep af, en die afwijking valt in twee stukken uiteen — wat de lijn ervan verklaart, en wat overblijft:

Yi−Y‾⏟totaal=Ŷi−Y‾⏟model+Yi−Ŷi⏟residu\underbrace{Y_i - \bar Y}_{\text{totaal}} \;=\; \underbrace{\hat Y_i - \bar Y}_{\text{model}} \;+\; \underbrace{Y_i - \hat Y_i}_{\text{residu}}

Toon code (tekening van de drie stukjes)
par(mar = c(4, 4, 1, 1))
# Dezelfde y-as van 0 tot 100 als de scatter in 0.1, zodat je de twee naast elkaar kunt leggen.
plot(X, Y, xlim = c(0, 8.5), ylim = c(0, 100),
     xlab = "Aantal rondjes", ylab = "Slaaprust (0–100)",
     pch = 19, col = "#BBBBBB", las = 1)
abline(h = mean(Y), col = col_ybar, lty = 2, lwd = 1.5)
abline(a = b0, b = b1, col = col_line, lwd = 3)
text(8.5, mean(Y) - 4, bquote(bar(italic(Y)) == .(mean(Y))), col = col_ybar, adj = 1)
text(1.2, b0 + 7 * 1.2 + 8, bquote(hat(italic(Y)) == .(b0) + .(b1) * italic(X)),
     col = "#998811", adj = 1, font = 2)

# Drie verticale streepjes naast elkaar, zodat ze niet over elkaar vallen.
xk <- X[k]; sh <- 0.15
segments(xk - sh, mean(Y), xk - sh, Y[k], col = col_total, lwd = 5)
segments(xk, mean(Y), xk, Yhat[k], col = col_model, lwd = 5)
segments(xk + sh, Yhat[k], xk + sh, Y[k], col = col_error, lwd = 5)

# Y en X staan cursief, zoals elk Latijns symbool voor een grootheid. Elk label
# staat op een lege plek: blauw linksboven en rood rechtsboven, elk met een dun
# streepje naar zijn eigen stuk; groen rechts, tussen de stippellijn en de gele
# lijn, op de hoogte van zijn eigen streep, ook met een streepje, dat onder het
# rode stuk door naar de groene streep loopt.
segments(xk - sh, mean(Y) + k_tot / 2, 3.65, 84, col = col_total, lwd = 1)
text(3.6, 86, bquote(italic(Y) - bar(italic(Y)) == .(k_tot)),
     col = col_total, adj = 1, font = 2)
segments(xk + 0.04, mean(Y) + k_mod / 2, xk + 0.32, mean(Y) + k_mod / 2,
         col = col_model, lwd = 1)
text(xk + 0.35, mean(Y) + k_mod / 2, bquote(hat(italic(Y)) - bar(italic(Y)) == .(k_mod)),
     col = col_model, adj = 0, font = 2)
segments(xk + sh, Y[k] + 1, xk + sh + 0.85, 87, col = col_error, lwd = 1)
text(xk + sh + 0.9, 89, bquote(italic(Y) - hat(italic(Y)) == .(k_res)),
     col = col_error, adj = 0, font = 2)
points(xk, Y[k], pch = 19, col = "black", cex = 1.3)
text(xk, Y[k] + 5, "konijn", adj = c(0.5, 0), cex = 0.9)
Figuur 2: Het konijn (X=5X = 5, Y=70Y = 70) in drie stukjes. De blauwe streep loopt van de grijze stippellijn (het gemiddelde, Y‾=60\bar Y = 60) omhoog tot het konijn: Y−Y‾=10Y - \bar Y = 10. Ernaast staan twee strepen die op elkaar aansluiten. De groene loopt van het gemiddelde tot de gele regressielijn, Ŷ−Y‾=7\hat Y - \bar Y = 7: dat stuk verklaart de lijn. De rode begint waar de groene ophoudt en loopt van de lijn tot het konijn, Y−Ŷ=3Y - \hat Y = 3: dat stuk blijft over. Groen en rood samen reiken precies zo hoog als blauw: 10=7+310 = 7 + 3. De grijze stippen zijn de andere acht sjacherijns.

Kijk ook even waar de gele lijn de grijze stippellijn kruist: precies bij X=4X = 4. Dat is het punt (X‾,Y‾)(\bar X, \bar Y), waar de lijn altijd doorheen loopt.

De optelling klopt voor elk dier, ook als een stukje negatief is. Maar we willen niet één dier, we willen alle negen tegelijk. En dan tellen we niet de afstanden op, maar hun kwadraten — anders heffen plussen en minnen elkaar op, zoals bij de residuen hierboven:

SST=∑(Yi−Y‾)2(totaal — alles wat Y doet)SS_T \;=\; \sum (Y_i - \bar{Y})^2 \qquad \text{(totaal — alles wat } Y \text{ doet)}

SSM=∑(Ŷi−Y‾)2(model — wat de lijn wél verklaart)SS_M \;=\; \sum (\hat{Y}_i - \bar{Y})^2 \qquad \text{(model — wat de lijn wél verklaart)}

SSE=∑(Yi−Ŷi)2=∑ei2(error — wat overblijft)SS_E \;=\; \sum (Y_i - \hat{Y}_i)^2 \;=\; \sum e_i^2 \qquad \text{(error — wat overblijft)}

En tussen die drie zit een prachtige decompositie:

SST=SSM+SSESS_T \;=\; SS_M \;+\; SS_E

In woorden: de totale variatie in YY valt netjes uiteen in een deel dat het model verklaart (SSMSS_M) en een deel dat het niet verklaart (SSESS_E). Dat is DATA = FIT + RESIDU op variantie-niveau.

OpmerkingVraag 0.3.b — Pen-en-papier (de drie kwadratensommen uitrekenen)

Voor onze sjacherijns met Y‾=60\bar{Y} = 60:

a) Bereken SST=∑(Yi−Y‾)2SS_T = \sum (Y_i - \bar{Y})^2. (Tip: Y−Y‾Y - \bar{Y} wordt −30,−20,−10,−10,0,10,10,20,30-30, -20, -10, -10, 0, 10, 10, 20, 30. Kwadrateer en tel op.)

b) Bereken SSE=∑ei2SS_E = \sum e_i^2 met de residuen uit vraag 0.3.a: −2,1,4,−3,0,3,−4,−1,2-2, 1, 4, -3, 0, 3, -4, -1, 2.

c) Bereken SSMSS_M via de decompositie: SSM=SST−SSESS_M = SS_T - SS_E.

d) Check SSMSS_M ook direct met ∑(Ŷi−Y‾)2\sum (\hat{Y}_i - \bar{Y})^2. (De fits zijn 32,39,46,53,60,67,74,81,8832, 39, 46, 53, 60, 67, 74, 81, 88.) Klopt het?

a) SST=900+400+100+100+0+100+100+400+900=𝟑𝟎𝟎𝟎SS_T = 900 + 400 + 100 + 100 + 0 + 100 + 100 + 400 + 900 = \mathbf{3000}.

b) SSE=4+1+16+9+0+9+16+1+4=𝟔𝟎SS_E = 4 + 1 + 16 + 9 + 0 + 9 + 16 + 1 + 4 = \mathbf{60}.

c) SSM=3000−60=𝟐𝟗𝟒𝟎SS_M = 3000 - 60 = \mathbf{2940}.

d) Ŷ−Y‾=−28,−21,−14,−7,0,7,14,21,28\hat{Y} - \bar{Y} = -28, -21, -14, -7, 0, 7, 14, 21, 28. Kwadrateren en tellen: 784+441+196+49+0+49+196+441+784=𝟐𝟗𝟒𝟎784 + 441 + 196 + 49 + 0 + 49 + 196 + 441 + 784 = \mathbf{2940}. ✓ Identiek.

Inzicht. De decompositie SST=SSM+SSESS_T = SS_M + SS_E is een boekhoudkundige eigenschap van de kleinste-kwadraten-fit. Geen verlies, geen winst — alle variatie in YY verdeelt zich exact over wat het model verklaart en wat het overlaat. Klopt het bij jou niet? Dan zit er ergens een rekenfout in jouw blokje, niet in de theorie.

En zo zien die drie sommen eruit als oppervlakken:

Toon code (tekening van de drie vierkanten)
# De zijde van elk vierkant is de wortel uit zijn kwadratensom, dus het
# oppervlak ís de kwadratensom.
sT <- sqrt(SS_T); sM <- sqrt(SS_M); sE <- sqrt(SS_E)
tussen <- 9                                   # ruimte voor "=" en "+"
x_m <- sT + 2 * tussen                        # waar het groene vierkant begint
x_e <- x_m + sM + 2 * tussen                  # waar het rode vierkant begint

par(mar = c(0, 0, 0, 0))
plot(NA, xlim = c(0, x_e + sE + 22), ylim = c(-2, sT + 2),
     asp = 1, axes = FALSE, xlab = "", ylab = "")
# Alle drie de vierkanten op dezelfde middellijn als het "=" en het "+", zodat
# het kleine rode vierkant leest als de derde term van de som.
mid <- sT / 2
rect(0, mid - sT / 2, sT, mid + sT / 2, col = col_total, border = NA)
text(sT / 2, mid, bquote(italic(SS)[T] == .(SS_T)), col = "white", font = 2)
text(sT + tussen, mid, "=", cex = 2.5)
rect(x_m, mid - sM / 2, x_m + sM, mid + sM / 2, col = col_model, border = NA)
text(x_m + sM / 2, mid, bquote(italic(SS)[M] == .(SS_M)), col = "white", font = 2)
text(x_m + sM + tussen, mid, "+", cex = 2.5)
rect(x_e, mid - sE / 2, x_e + sE, mid + sE / 2, col = col_error, border = NA)
# Het rode vierkant is te klein voor zijn eigen label: dat staat erboven.
text(x_e + sE / 2, mid + sE / 2 + 6, bquote(italic(SS)[E] == .(SS_E)), col = col_error, font = 2)
Figuur 3: De kwadratensommen als oppervlakken: de zijde van elk vierkant is de wortel uit zijn kwadratensom. Het blauwe vierkant (SST=3000SS_T = 3000) is precies even groot als het groene (SSM=2940SS_M = 2940) en het rode (SSE=60SS_E = 60) samen. Het rode vierkantje rechts, zeven keer zo klein van zijde als het blauwe, is de derde term: wat de lijn niet verklaart.

R2R^2 — proportie verklaarde variantie

Dan komt R2R^2 er bijna vanzelf. Het is de fractie van de totale variantie die het model verklaart:

R2=SSMSST=29403000=0.98R^2 \;=\; \frac{SS_M}{SS_T} \;=\; \frac{2940}{3000} \;=\; 0.98

Je ziet hem ook geschreven als 1−SSE/SST=1−60/3000=0.981 - SS_E / SS_T = 1 - 60 / 3000 = 0.98: hetzelfde getal, want SSM=SST−SSESS_M = SS_T - SS_E.

Er is nog een tweede weg naar hetzelfde getal: kwadrateer de correlatie tussen XX en YY. SSYSS_Y hieronder is de somrij van de kolom (Yi−Y‾)2(Y_i - \bar Y)^2 uit 0.2.a, en dat is hetzelfde getal als SSTSS_T. (Ken je rr als covariantie gedeeld door de twee standaardafwijkingen, sXY/(sXsY)s_{XY} / (s_X s_Y)? Dat is dezelfde breuk, alleen met de sommen zelf: de deling door N−1N - 1 zit boven én onder, en valt weg.)

r=SSXYSSX⋅SSY=42060⋅3000=420424.264=0.9899R2=r2=0.98992=0.98 \begin{aligned} r &= \frac{SS_{XY}}{\sqrt{SS_X \cdot SS_Y}} = \frac{420}{\sqrt{60 \cdot 3000}} = \frac{420}{424.264} = 0.9899 \\ R^2 &= r^2 = 0.9899^2 = 0.98 \end{aligned}

Twee wegen, één getal. Bij één voorspeller zijn “welk deel van de variantie verklaart de lijn” en “de correlatie in het kwadraat” hetzelfde. En als twee cirkels, één voor YY en één voor XX:

Toon code (tekening van de twee cirkels)
# Twee cirkels met straal 1 die elkaar overlappen voor een aandeel r2 van hun
# oppervlak. De afstand d tussen de middelpunten volgt uit de oppervlakte van
# de lens waarin ze overlappen.
lens <- function(d) 2 * acos(d / 2) - (d / 2) * sqrt(4 - d^2)
venn2 <- function(r2, titel) {
  d <- uniroot(function(d) lens(d) / pi - r2, c(0, 2))$root
  hoek <- seq(0, 2 * pi, length.out = 400)
  plot.new()
  plot.window(xlim = c(-2.3, 2.3), ylim = c(-1.35, 1.35), asp = 1)
  polygon(-d / 2 + cos(hoek), sin(hoek), col = adjustcolor("#0077BB", 0.25),
          border = "#0077BB", lwd = 3)
  polygon( d / 2 + cos(hoek), sin(hoek), col = adjustcolor("#CCBB44", 0.25),
          border = "#CCBB44", lwd = 3)
  # Past het getal niet in de overlap, dan staat het eronder, met een streepje
  # naar de overlap toe.
  if (r2 > .5) {
    text(0, 0, zonder0(r2), font = 2, cex = 1.2)
  } else {
    segments(0, -0.15, 0, -1.05, lwd = 1)
    text(0, -1.2, zonder0(r2), font = 2, cex = 1.2)
  }
  text(-d / 2 - 1.05, 0.95, quote(italic(Y)), col = "#0077BB", font = 2, adj = 1)
  text( d / 2 + 1.05, 0.95, quote(italic(X)), col = "#998811", font = 2, adj = 0)
  title(main = titel, font.main = 1, cex.main = 1)
}
par(mfrow = c(1, 2), mar = c(0.5, 0.5, 2, 0.5))
venn2(r2_sj,  "sjacherijns: slaaprust en rondjes")
venn2(r2_ter, "ter vergelijking")
Figuur 4: R2R^2 als overlap van twee cirkels: links de sjacherijns, rechts ter vergelijking een model dat weinig verklaart. Elke cirkel is op 1 gezet, want het gaat hier om aandelen en niet om de kwadratensommen van de vierkanten. Rechts overlappen de cirkels voor .12 en ligt het meeste erbuiten. Links overlappen ze voor .98: ze vallen bijna samen, en buiten de overlap blijft alleen een smal randje van .02 over.

Oftewel: 98%98\% van de variantie in slaaprust valt samen met variantie in rondjes. De overige 2%2\% is wat het model overlaat — wat de bunzing rustiger maakt dan zijn fit voorspelt, wat de egel onrustiger maakt dan zijn fit voorspelt, enzovoort. Over oorzaak zegt het niets: alleen dat ze samen variëren.

TipR2R^2 is de hoofdmaat, niet FF of tt

In de hoofdstukken hierna kom je nog veel toets-statistieken tegen (FF, tt, zz, χ2\chi^2). Die zeggen iets over of het effect significant van nul afwijkt. Maar de vraag hoe goed werkt het model — dat is R2R^2. Een model met R2=.98R^2 = .98 verklaart bijna alles wat er valt te verklaren. Een model met R2=.12R^2 = .12 verklaart een sliertje. En dat is een betekenisvol getal, ook zonder dat er een pp-waarde aan hangt.

In MRA krijgt R2R^2 een correctie voor het aantal voorspellers (adjusted R2R^2). In LRA (binair YY) bestaat R2R^2 niet in deze vorm en gebruiken we een pseudo-R2R^2. Maar het basisidee — welk deel van de variantie verklaart het model — komt terug in alle thema’s. DATA = FIT + RESIDU is de spil.

0.4 Toetsen — model als geheel én voorspeller apart

Tot nu toe weten we wat de lijn is (b0b_0 en b1b_1), en hoe goed hij past (R2R^2 via DATA = FIT + RESIDU). Wat we nog niet weten: of rondjes en slaaprust ook in de populatie samenhangen, en niet alleen bij deze negen. Daarvoor toetsen we.

Er zijn eigenlijk twee vragen die je kunt stellen — en het is goed om die uit elkaar te houden, want straks bij MVDA worden ze écht verschillend:

Vraag Wat het meet Toets
Hoe goed werkt de lijn? fit-kwaliteit van het hele model FF, R2R^2
Wat doet de lijn? effect-grootte per voorspeller bb, tt

Bij enkelvoudige regressie zijn die twee vragen één en dezelfde — er ís maar één voorspeller, dus hoe goed werkt het model en wat doet deze voorspeller zijn letterlijk dezelfde vraag. Wiskundig: F=t2F = t^2 en R2=r2R^2 = r^2. Bij MVDA (vanaf thema 1, met meerdere voorspellers tegelijk) lopen ze uit elkaar — het hele model kan iets verklaren terwijl een losse voorspeller niets doet, of omgekeerd.

Toets 1 — FF-toets op het model als geheel. “Doet het model iets, vergeleken met geen voorspellers?” Vergelijkt de variantie verklaard door het model met de niet-verklaarde variantie, elk gedeeld door zijn vrijheidsgraden:

F=MSMMSE=SSM/dfMSSE/dfEF = \frac{MS_M}{MS_E} = \frac{SS_M / df_M}{SS_E / df_E}

Vrijheidsgraden — wie zit vast, wie is vrij?

OpmerkingVrijheidsgraden zonder formule

Stel: vier sjacherijns, en hun gemiddelde slaaprust is 6060. Drie ken je al: 4040, 5050 en 7070. Hoe rustig sliep de vierde?

Geen ontsnappen aan — 8080. Eén getal kan het zijn, en jij rekent het uit: 4⋅60−40−50−70=804 \cdot 60 - 40 - 50 - 70 = 80. De vierde zit vast aan wat de eerste drie zijn, gegeven het gemiddelde. Drie zijn vrij; eentje moet de boel weer kloppend maken.

Dat is een vrijheidsgraad in zijn eenvoudigste vorm: hoeveel getallen nog vrij mogen variëren als je een paar dingen al hebt vastgelegd. Bij een gemiddelde van NN getallen ligt er één ding vast, dus zijn er N−1N - 1 vrij.

Bij een regressielijn liggen er twee dingen vast. Het eerste ken je uit vraag 0.3.a: de residuen tellen samen op tot nul. Het tweede: de residuen hangen niet samen met XX — anders kon de lijn nog een tikje kantelen en kwam hij dichter bij de punten. Twee voorwaarden, dus van de negen residuen volgen er twee uit de andere zeven. Voor de sjacherijns, met N=9N = 9:

  • dfE=N−2=7df_E = N - 2 = 7 — zoveel residuen zijn vrij;
  • dfM=1df_M = 1 — het model heeft één helling, voor één voorspeller;
  • dfT=N−1=8df_T = N - 1 = 8 — net als bij het gemiddelde.

Check: dfT=dfM+dfEdf_T = df_M + df_E, dus 8=1+78 = 1 + 7. ✓ — altijd. Met meer voorspellers liggen er meer dingen vast; hoe dat gaat, zie je in thema 1.

Deel je een kwadratensom door zijn vrijheidsgraden, dan krijg je een gemiddeld kwadraat mean square, MSMS: MSM=SSM/dfMMS_M = SS_M / df_M en MSE=SSE/dfEMS_E = SS_E / df_E. Die twee delingen stonden al in de formule voor FF hierboven.

De sudoku — een halve ANOVA-tabel aanvullen

Wie dit eens met de hand heeft gedaan, leest een ANOVA-tabel daarna als een sudoku: ontbreken er een paar getallen, dan reken je ze terug. Alles volgt uit twee optellingen (SST=SSM+SSESS_T = SS_M + SS_E, dfT=dfM+dfEdf_T = df_M + df_E) en twee delingen (MS=SS/dfMS = SS / df, F=MSM/MSEF = MS_M / MS_E).

OpmerkingVraag 0.4.a — De sudoku

Vul de lege cellen in deze ANOVA-tabel met de hand. Je hoeft niets te schatten, alleen terug te rekenen.

Sudoku: de ANOVA-tabel van slaaprust op rondjes, met lege cellen
Bron SS df MS F
Model 2940
Error 7 8.57 —
Totaal 3000 8 — —
Note. Negen sjacherijns. SS = kwadratensom, df = vrijheidsgraden, MS = gemiddeld kwadraat (SS/df). Een lege cel vul je zelf in; een — blijft leeg.
De ANOVA-tabel van slaaprust op rondjes, ingevuld
Bron SS df MS F
Model 2940 1 2940.00 343.00
Error 60 7 8.57 —
Totaal 3000 8 — —
Note. Negen sjacherijns. SS = kwadratensom, df = vrijheidsgraden, MS = gemiddeld kwadraat (SS/df). Een — blijft in een ANOVA-tabel leeg.

SSE=SST−SSM=3000−2940=60SS_E = SS_T - SS_M = 3000 - 2940 = 60. dfM=dfT−dfE=8−7=1df_M = df_T - df_E = 8 - 7 = 1. MSM=2940/1=2940MS_M = 2940 / 1 = 2940. En dan F=MSM/MSE=2940/8.57=343.06F = MS_M / MS_E = 2940 / 8.57 = 343.06.

Kwam je op 343.06343.06 en niet op 343.00343.00? Dan rekende je goed. De 8.578.57 in de tabel is afgerond; met de onafgeronde MSE=60/7MS_E = 60 / 7 komt er precies 2940/(60/7)=3432940 / (60 / 7) = 343 uit. Vier optellingen en delingen, meer niet.

Wat zegt die FF eigenlijk? — de bakker

Aan het einde van de straat zit een bakker. Al jaren. Je weet wat je krijgt: croissantjes, een bruin brood, een kruimelvlaai op zaterdag. Op een dag loop je naar binnen — en in het midden van de winkel staat een fiets. Een echte. Met bel. Niks geen brood, alleen een fiets.

Eerste gedachte: hij is geen bakker meer. Niet omdat een bakker geen fiets in zijn zaak mag hebben — dat mag van mij — maar omdat het zo schreeuwend onwaarschijnlijk is dat een bakker daar een fiets neerzet. Iets klopt niet. Iets is veránderd.

Dat is precies wat een toets is. Je hebt een nulhypothese H0H_0: “er is niks aan de hand, de bakker is nog gewoon bakker.” Bij de sjacherijns is dat: in de populatie van sjacherijns hangt het aantal rondjes niet samen met de slaaprust, H0:b1*=0H_0: b_1^* = 0. Het sterretje betekent: in de populatie. Over b1=7b_1 = 7 valt niets te toetsen, dat lees je gewoon af; de toets gaat over alle sjacherijns die je níét hebt gezien.

Dan loop je de winkel binnen (= je trekt een steekproef), en je rekent uit hoe gek wat je ziet zou zijn als de bakker écht nog bakker was. Dat hoe-gek-getal heet de pp-waarde: de kans op iets dat minstens zo extreem is als wat jij vond, gegeven dat H0H_0 klopt. Die kans rekent R voor je uit; je ziet hem zo meteen in de uitvoer.

Voor de sjacherijns is F=343F = 343, en de pp-waarde is kleiner dan .001.001. Een FF van 343343 is geen croissantje meer, dat is een fiets. Dus verwerpen we de nulhypothese dat het aantal rondjes in de populatie niet samenhangt met de slaaprust, en gaan we ervan uit dat het aantal rondjes in de populatie wél samenhangt met de slaaprust (b1*≠0b_1^* \neq 0). Bewezen is dat niet — een bakker kán een fiets neerzetten — maar het is te gek om de nulhypothese nog te geloven.

WaarschuwingWat de bakker je leert over H0H_0
  1. H0H_0 gaat altijd over de populatie, nooit over je steekproef. “De bakker is nog gewoon bakker” gaat over de winkel zelf, niet over dat ene bezoek waarbij jij die fiets zag. Bij de sjacherijns: over alle sjacherijns, niet over deze negen.
  2. De toets gelooft eerst H0H_0. Hij rekent uit: gegeven dat H0H_0 klopt, hoe verrassend is wat ik vond? Niet andersom: de pp-waarde is niet de kans dat H0H_0 waar is.
  3. Een rijmpje voor onder de douche: “When pp is low, H0H_0 must go.” Lage pp (<.05< .05 is de gangbare grens): de nulhypothese wegtrappen. Hoge pp: je kunt de nulhypothese niet wegtrappen, en dan blijft de nulhypothese voorlopig staan — niet bewezen, alleen niet weerlegd.
  4. Een toets kan zich op twee manieren vergissen. Je roept “geen bakker meer!” terwijl hij gewoon bakker is, en die fiets was toeval: vals alarm, een type-1-fout (H0H_0 verworpen terwijl H0H_0 klopt). Of de bakker ís gestopt, maar jij liep binnen op de dag dat er toevallig nog croissantjes lagen: gemist alarm, een type-2-fout (H0H_0 laten staan terwijl er wél iets veranderd is). Hoeveel valse alarmen je op den duur accepteert, kies je vooraf zelf: dat is α\alpha, dezelfde .05.05 als de grens hierboven. De kans dat je een echte verandering wél opmerkt, heet power; hoe vaker je binnenloopt, hoe groter die kans.

De tt-toets, en R rekent mee

Toets 2 — tt-toets op de voorspeller-coëfficiënt. “Wijkt b1b_1 van nul af?” Vergelijkt de coëfficiënt met zijn standaardfout:

t=b1SEb1t = \frac{b_1}{SE_{b_1}}

R doet beide toetsen in één keer. summary() geeft de coëfficiënten met hun tt-toets en onderaan de FF-toets; anova() geeft de ANOVA-tabel van je sudoku.

Het is een flinke lap uitvoer. Zoek er deze vijf dingen in:

  • (Intercept) onder Estimate = b0=32b_0 = 32, en rondjes = b1=7b_1 = 7;
  • Multiple R-squared = 0.980.98, je R2R^2;
  • F-statistic = 343343 op 11 en 77 vrijheidsgraden;
  • in anova(): Sum Sq 29402940 bij rondjes en 6060 bij Residuals — dezelfde getallen als in je sudoku;
  • de pp-waarde van de bakker, twee keer: achter rondjes in de kolom Pr(>|t|), en onderaan achter p-value. Waarom dat hetzelfde getal is, vraagt 0.4.b.
summary(m_sj)

Call:
lm(formula = slaap_rust ~ rondjes, data = sjacherijns)

Residuals:
   Min     1Q Median     3Q    Max 
    -4     -2      0      2      4 

Coefficients:
            Estimate Std. Error t value    Pr(>|t|)    
(Intercept)   32.000      1.800   17.78 0.000000439 ***
rondjes        7.000      0.378   18.52 0.000000332 ***
---
Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1

Residual standard error: 2.928 on 7 degrees of freedom
Multiple R-squared:   0.98, Adjusted R-squared:  0.9771 
F-statistic:   343 on 1 and 7 DF,  p-value: 0.0000003319
anova(m_sj)
Analysis of Variance Table

Response: slaap_rust
          Df Sum Sq Mean Sq F value       Pr(>F)    
rondjes    1   2940 2940.00     343 0.0000003319 ***
Residuals  7     60    8.57                         
---
Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
OpmerkingVraag 0.4.b — Pen-en-papier (en R)

a) Lees uit de R-output: wat is de FF-waarde van het model? En wat is de tt-waarde van rondjes?

b) Bereken t2t^2. Klopt dat met FF?

c) Wat zijn de pp-waardes van beide toetsen? Verschillen ze?

d) Verklaar in één zin waarom dit zo is bij enkelvoudige regressie.

a) F=343F = 343 op df1=1df_1 = 1, df2=7df_2 = 7. t=18.52t = 18.52 voor rondjes (dat is b1/SEb1=7/0.378b_1 / SE_{b_1} = 7 / 0.378).

b) Met de afgeronde tt: 18.522=342.9918.52^2 = 342.99. Dat is 343343 op het afronden na; met de onafgeronde tt uit R komt er precies 343343 uit. ✓ Gelijk aan FF.

c) Beide p<.001p < .001. Identiek (de R-output geeft voor allebei hetzelfde getal).

d) Bij enkelvoudige regressie is de enige voorspeller in het model dezelfde coëfficiënt waar de tt-toets op slaat. “Doet het model iets?” en “Doet deze ene voorspeller iets?” zijn letterlijk dezelfde vraag, alleen anders geformuleerd. Wiskundig: t2=Ft^2 = F wanneer df1=1df_1 = 1. Het maakt geen ruk uit welke toets je rapporteert — kies wat past bij de uitleg.

TipOnthouden — bij één voorspeller zijn FF en tt broers
Toets Wat hij toetst Bij enkelvoudige regressie
FF model als geheel =t2= t^2 van de helling
tt voorspeller-coëfficiënt =F= \sqrt{F}

Pas in MVDA (vanaf thema 1) — als er meerdere voorspellers tegelijk in het model zitten — gaan deze twee niet meer dezelfde vraag stellen. Het model-als-geheel (FF) kan significant zijn terwijl geen enkele losse voorspeller dat is, en omgekeerd kan een losse voorspeller significant zijn terwijl het model-als-geheel niets oplevert. Dat is de hele crux van multipele regressie.

0.5 rr, b1b_1 en β\beta — dezelfde verhouding in andere kleren

Drie getallen die allemaal iets zeggen over hoe rondjes en slaaprust samen bewegen: de helling b1b_1, de correlatie rr, en het gestandaardiseerde gewicht β\beta. Het laatste rekent in standaardafwijkingen, en daarvoor eerst even dit.

OpmerkingEven terug: de z-score

Een z-score is het aantal standaardafwijkingen dat een ruwe waarde XX van het gemiddelde af ligt. Zie de standaardafwijking als een lineaaltje. Een IQ van 130130, bij een gemiddelde van 100100 en een standaardafwijking van 1515: tussen 100100 en 130130 past het lineaaltje van 1515 punten precies twee keer. Dus z=2z = 2.

z=X−X‾sXz = \frac{X - \bar X}{s_X}

Een z-score is een telling — hoe vaak het lineaaltje past — en geen kans. Over de vorm van de verdeling zegt hij niets. Gestandaardiseerd betekent hieronder: XX en YY allebei gemeten in hun eigen lineaaltje.

Voor de sjacherijns hebben we:

  • b1=7b_1 = 7 (helling in ruwe eenheden: slaaprust per rondje)
  • r=0.9899r = 0.9899 (correlatie, zonder eenheid)
  • β=?\beta = ? (gestandaardiseerde helling)

Eerst de twee lineaaltjes, de standaardafwijkingen van XX en van YY:

sX=SSXN−1=608=7.5=2.7386sY=SSYN−1=30008=375=19.365 \begin{aligned} s_X &= \sqrt{\frac{SS_X}{N-1}} = \sqrt{\frac{60}{8}} = \sqrt{7.5} = 2.7386 \\[4pt] s_Y &= \sqrt{\frac{SS_Y}{N-1}} = \sqrt{\frac{3000}{8}} = \sqrt{375} = 19.365 \end{aligned}

Tussen rr en b1b_1 zit de verhouding van die twee:

b1=r⋅sYsX=0.9899⋅19.3652.7386=0.9899⋅7.07=7.00✓b_1 = r \cdot \frac{s_Y}{s_X} = 0.9899 \cdot \frac{19.365}{2.7386} = 0.9899 \cdot 7.07 = 7.00 \checkmark

(Ken je b1b_1 als covariantie gedeeld door variantie, sXY/sX2s_{XY} / s_X^2? Dat is dezelfde breuk als SSXY/SSXSS_{XY} / SS_X: de N−1N - 1 boven en onder valt weg.)

En de gestandaardiseerde helling: zet b1b_1 om in lineaaltjes, met precies de omgekeerde verhouding:

𝛽=b1⋅sXsY=7⋅2.738619.365=0.9899\mathit{\beta} = b_1 \cdot \frac{s_X}{s_Y} = 7 \cdot \frac{2.7386}{19.365} = 0.9899

Waarom dat precies rr is: vul voor b1b_1 de regel erboven in, 𝛽=r⋅sYsX⋅sXsY\mathit{\beta} = r \cdot \frac{s_Y}{s_X} \cdot \frac{s_X}{s_Y}. De twee verhoudingen vallen tegen elkaar weg, en rr blijft over.

Dus: 𝛽=r\mathit{\beta} = r in enkelvoudige regressie. Dezelfde grootheid — alleen herschaald naar standaardafwijkingen. Eén rondje meer is 77 punten slaaprust meer; één lineaaltje rondjes meer is 0.990.99 lineaaltje slaaprust meer.

OpmerkingSteekproef en populatie — twee gezichten van elk getal

Elk getal hierboven heeft een broer in de populatie. Wat je uit je steekproef uitrekent, krijgt meestal een Latijnse letter; wat je over de populatie wilt weten, meestal een Griekse. Het steekproefgetal is je schatting van het populatiegetal.

Wat het is Steekproef Populatie
Gemiddelde Y‾\bar Y μ\mu
Standaardafwijking ss σ\sigma
Pearson-correlatie rr ρ\rho
Verklaarde variantie R2R^2 ρ2\rho^2
Regressiecoëfficiënt (ruw) bb b*b^*
Regressiecoëfficiënt (gestandaardiseerd) β\beta β*\beta^*

De twee onderste rijen breken de regel. De populatie krijgt daar geen Griekse letter maar een sterretje — dat van de bakker, b1*=0b_1^* = 0. En β\beta is in dit oefenboek een steekproefgetal, zoals hierboven. Andere boeken gebruiken β\beta juist voor de populatie; kom je β\beta ergens anders tegen, kijk dan eerst welke van de twee dat boek bedoelt.

Bij meer dan één voorspeller houdt de gelijkheid 𝛽=r\mathit{\beta} = r op. Waarom, en waarom dat de reden is dat er meervoudige regressie bestaat, lees je aan het begin van thema 1.

0.6 Waarom MVDA straks anders wordt

Bij enkelvoudige regressie is er één XX en één YY. Eén vraag, eén lijn, één b1b_1. Het maakt niet uit of je FF of tt rapporteert — ze zeggen hetzelfde.

Bij meervoudige regressie (MRA, thema 1) komen er meerdere XX-en bij. Het model wordt:

Yi=b0+b1X1i+b2X2i+…+bkXki+eiY_i = b_0 + b_1 X_{1i} + b_2 X_{2i} + \ldots + b_k X_{ki} + e_i

Nu kun je drie verschillende vragen stellen die niet meer dezelfde zijn:

  1. Model als geheel — “Verklaart het geheel van voorspellers iets?” — overall FF-toets.
  2. Voorspeller apart — “Wat doet deze ene voorspeller, gecontroleerd voor de andere?” — tt-toets per coëfficiënt.
  3. Klopt het allemaal — “Houden de aannames stand?” — assumpties checken (lineariteit, gelijke spreiding, normaliteit, geen multicollineariteit, geen invloedrijke outliers).

Vanaf thema 1 doe je deze drie altijd in deze volgorde. Het 3-stappen-plan noemen we het: Model — Voorspellers — Assumpties. Dat is jouw werkstroom voor MRA, ANCOVA, MANOVA, RMA — overal waar meerdere voorspellers tegelijk in het spel zijn.

TipWaar gaat het bij MVDA over?
Bij enkelvoudig Bij MVDA
Eén XX verklaart iets van YY Meerdere XX-en delen samen iets te zeggen over YY
FF en tt zijn dezelfde toets FF en tt-per-coëfficiënt zeggen verschillende dingen
𝛽=r\mathit{\beta} = r βj\beta_j en rr zeggen verschillende dingen
Geen partial-effecten Wel partial-effecten (effect van X1X_1 op YY na controle voor X2X_2)
Geen multicollineariteit Wel: voorspellers kunnen op elkaar lijken
Eén lijn in twee dimensies Een vlak (of een hyper-vlak) in meer dimensies

Vanaf thema 1 wordt elk van deze elementen één voor één behandeld. Hier in 0 alleen de pure-enkelvoudige-vorm als ankerpunt.

0.7 Wat hierna komt — kort overzicht van zeven thema’s

# Techniek Wanneer Dier
1 MRA — multipele regressie YY interval, meerdere XX-en (interval) eekhoorn + mier
2 ANOVA — variantie-analyse YY interval, XX-en nominaal (factoren) mol
3 ANCOVA YY interval, mengvorm nominaal + interval bever
4 LRA — logistische regressie YY binair (wel/niet) pad
5 MANOVA — multivariate ANOVA meerdere YY-en tegelijk, XX nominaal leeuw
6 RMA — repeated measures YY herhaald gemeten op zelfde individu kameleon
7 Mediation — indirecte effecten X→M→YX \to M \to Y, pad via tussenliggende variabele slak

Bij elk thema doorloop je dezelfde drie stappen: model — voorspellers — assumpties. Bij elk thema heb je een dier dat het verhaal draagt. En bij elk thema krijg je weinig theorie vooraf — eerst aan de slag, theorie wanneer het aankomt.

Sjonge sjonge. Daar gaan we dan. Veel succes.


OpmerkingWanneer terugkomen naar dit opfris-hoofdstuk

Anders: doorlopen, één keer, en dan vooruit.

Terug naar boven