ANOVA in R: Eenweg- en tweewegtoetsen met voorbeelden
โก Slimme samenvatting
ANOVA in R vergelijkt de gemiddelden van drie of meer groepen door de totale variatie op te splitsen in componenten tussen groepen en binnen groepen. Deze handleiding voert eenweg- en tweewegtoetsen uit op de dataset met vergiften, controleert de aannames en isoleert verschillende paren met behulp van de Tukey HSD-test.

Wat is ANOVA?
Analyse van variantie ANOVA (variantieanalyse van de variantie) is een statistische techniek die wordt gebruikt om de gemiddelden van twee of meer groepen te vergelijken. De test werkt door de totale variatie in een meting op te splitsen in het deel dat wordt verklaard door groepslidmaatschap en het deel dat overblijft als willekeurige ruis. ANOVA in R vertelt je daarom of ten minste รฉรฉn groepsgemiddelde verschilt van de andere, niet welk gemiddelde. Het is een directe uitbreiding van de t-toets voor situaties waarin de factorvariabele meer dan twee niveaus heeft.
Voordat je een test uitvoert, is het handig om te weten welke variant van de ANOVA-methode het beste bij je ontwerp past.
Soorten ANOVA-tests in R
"ANOVA" is een reeks tests, geen afzonderlijke procedure. De keuze voor de juiste test hangt af van het aantal factoren en de manier waarop de gegevens zijn verzameld.
| Test | Wanneer u het moet gebruiken | R-oproep |
|---|---|---|
| Eenrichtings ANOVA | Eรฉn factor met drie of meer niveaus | aov(y ~ x, data = df) |
| Bidirectionele ANOVA | Twee onafhankelijke factoren | aov(y ~ x1 + x2, data = df) |
| Tweewegcommunicatie met interactie | Het effect van de ene factor hangt af van de andere. | aov(y ~ x1 * x2, data = df) |
| ANOVA met herhaalde metingen | Dezelfde proefpersonen werden meer dan eens gemeten. | aov(y ~ x + Fout(onderwerp/x)) |
| ANCOVA | Er moet worden gecontroleerd voor een continue covariabele. | aov(y ~ x + covariaat, data = df) |
| MANOVA | Twee of meer responsvariabelen tegelijk | manova(cbind(y1, y2) ~ x) |
Deze handleiding behandelt de eerste drie. De overige varianten gebruiken dezelfde aov()-interface, dus als je eenmaal รฉรฉn uitvoertabel kunt lezen, kun je ze allemaal lezen.
ANOVA versus T-toets in R: Belangrijkste verschillen
Beide tests vergelijken gemiddelden, dus het is belangrijk om precies aan te geven waar de ene test de andere vervangt.
| criteria | T-test | ANOVA |
|---|---|---|
| Aantal groepen | Precies twee | Twee of meer |
| Test statistiek | t | F is gelijk aan t kwadraat wanneer er twee groepen zijn. |
| Resultaat | Geeft de richting van het verschil aan. | Alleen rapporten geven aan dat er een verschil bestaat. |
| Vervolg nodig | Geen | Post-hoc tests zoals de Tukey HSD-test. |
| R-functie | t.test() | aov() |
Bij drie groepen is de verleiding groot om drie afzonderlijke t-toetsen uit te voeren. Weersta die verleiding. Elke toets heeft een eigen foutmarge van 5 procent, dus drie vergelijkingen verhogen de kans op een vals positief resultaat tot ongeveer 14 procent. ANOVA beantwoordt dezelfde vraag met รฉรฉn enkele toets, en Tukey HSD behandelt vervolgens de paarsgewijze details met een beheersbare foutmarge. Voor het geval met twee groepen, zie de t-test handleiding.
Eenrichtings ANOVA
Er zijn veel situaties waarin u het gemiddelde van meerdere groepen moet vergelijken. De marketingafdeling wil bijvoorbeeld weten of drie teams dezelfde verkoopprestaties hebben.
- Team: 3 niveaufactoren: A, B en C
- Verkoop: een maatstaf voor prestaties
Met de ANOVA-test kan worden vastgesteld of de drie groepen vergelijkbare prestaties leveren.
Om te verduidelijken of de gegevens uit dezelfde populatie komen, kunt u een eenzijdige variantieanalyse (hierna eenweg-ANOVA genoemd). Net als elke andere statistische toets geeft deze toets bewijs over de vraag of de nulhypothese (H0) verworpen kan worden. Merk op dat het niet verwerpen van H0 niet hetzelfde is als het bewijzen dat deze waar is.
Hypothese in een eenrichtings-ANOVA-test
- H0: De gemiddelden tussen groepen zijn identiek
- H1: Het gemiddelde van รฉรฉn groep is tenminste verschillend
Met andere woorden: als we H0 niet verwerpen, betekent dit dat er onvoldoende bewijs is om te concluderen dat het gemiddelde van een groep verschilt van dat van de andere groepen.
Deze test is vergelijkbaar met de t-test, maar ANOVA is de juiste keuze wanneer er meer dan twee groepen zijn. Bij precies twee groepen zijn de twee tests equivalent en is de F-statistiek gelijk aan het kwadraat van de t-statistiek.
Veronderstellingen
De eenweg-ANOVA is gebaseerd op drie voorwaarden: de waarnemingen zijn willekeurig geselecteerd en onafhankelijk van elkaar, de residuen binnen elke groep zijn bij benadering normaal verdeeld en de variantie is in elke groep gelijk (homogeniteit van de variantie). In het onderstaande gedeelte over het controleren van de aannames wordt uitgelegd hoe u elk van deze voorwaarden in R kunt testen.
Interpreteer ANOVA-test
De F-statistiek wordt gebruikt om te testen of de gegevens afkomstig zijn uit significant verschillende populaties, dat wil zeggen verschillende steekproefgemiddelden.
Om de F-statistiek te berekenen, moet je de delen variabiliteit tussen groepen de variabiliteit binnen de groep.
De tussen-groep Variabiliteit geeft aan hoe ver het gemiddelde van elke groep van het algehele gemiddelde afwijkt. Vergelijk de twee onderstaande grafieken om dit te begrijpen.
De linker grafiek laat zien dat er zeer weinig variatie is tussen de drie groepen, waardoor de gemiddelden van alle drie de groepen dicht bij elkaar liggen. totaal gemeen.
De grafiek rechts toont drie verdelingen die ver uit elkaar liggen en elkaar niet overlappen, waardoor het verschil tussen het algemene gemiddelde en het gemiddelde van elke groep groot is.
De binnen de groep Variabiliteit meet hoe ver individuele waarnemingen afwijken van het gemiddelde van hun eigen groep. Sommige punten liggen ver van het groepsgemiddelde, en de term 'binnen de groep' geeft precies die spreiding weer, oftewel de steekproefafwijking.
Om het concept van variabiliteit binnen een groep visueel te begrijpen, kunt u de onderstaande grafiek bekijken.
Het linkergedeelte toont de verdeling van drie verschillende groepen. Je hebt de spreiding van elk monster vergroot en het is duidelijk dat de individuele variantie groot is. De F-statistiek daalt, dus je zou de nulhypothese niet verwerpen.
Het rechterdeel toont steekproeven met dezelfde gemiddelden, maar een veel kleinere spreiding. Dat verhoogt de F-statistiek en pleit in het voordeel van de alternatieve hypothese.
U kunt beide metingen gebruiken om de F-statistieken samen te stellen. Het is zeer intuรฏtief om de F-statistiek te begrijpen. Als de teller toeneemt, betekent dit dat de variabiliteit tussen de groepen hoog is en dat de groepen in de steekproef waarschijnlijk uit totaal verschillende verdelingen komen.
Met andere woorden, een lage F-statistiek geeft aan dat er weinig tot geen significant verschil is tussen de groepsgemiddelden.
Voorbeeld van een eenrichtings-ANOVA-test
U gebruikt de poison dataset om de one-way ANOVA-test te implementeren. De dataset bevat 48 rijen en 3 variabelen:
- Tijd: overlevingstijd van het dier
- gif: Gebruikt giftype: factorniveau: 1,2 en 3
- treat: Type behandeling: factorniveau: 1,2 en 3
Voordat u begint met het uitvoeren van de ANOVA-test, moet u de gegevens als volgt voorbereiden:
- Stap 1: Importeer de gegevens
- Stap 2: Verwijder onnodige variabele
- Stap 3: Converteer het variabele gif naar het bestelde niveau
library(dplyr) PATH <- "https://raw.githubusercontent.com/guru99-edu/R-Programming/master/poisons.csv" df <- read.csv(PATH) %>% select(-X) %>% mutate(poison = factor(poison, ordered = TRUE)) glimpse(df)
Output:
## Observations: 48 ## Variables: 3 ## $ time <dbl> 0.31, 0.45, 0.46, 0.43, 0.36, 0.29, 0.40, 0.23, 0.22, 0... ## $ poison <ord> 1, 1, 1, 1, 2, 2, 2, 2, 3, 3, 3, 3, 1, 1, 1, 1, 2, 2, 2... ## $ treat <fctr> A, A, A, A, A, A, A, A, A, A, A, A, B, B, B, B, B, B, ...
Ons doel is om de volgende aanname te testen:
- H0: Er is geen verschil in gemiddelde overlevingstijd tussen groepen
- H1: Het gemiddelde van de overlevingstijd is voor ten minste รฉรฉn groep verschillend.
Met andere woorden, je wilt weten of er een statistisch verschil is tussen de gemiddelde overlevingstijd afhankelijk van het type gif dat aan de cavia is toegediend.
U gaat als volgt te werk:
- Stap 1: Controleer het formaat van de variabele gif
- Stap 2: Druk de samenvattende statistiek af: aantal, gemiddelde en standaarddeviatie
- Stap 3: Teken een boxplot
- Stap 4: Bereken de eenrichtings-ANOVA-test
- Stap 5: Voer een paarsgewijze vergelijking uit met Tukey HSD.
Stap 1) Controleer de gifinkomsten met de onderstaande code. Je zou waarden van drie tekens moeten zien, omdat het commando `mutate` de kolom heeft omgezet in een geordende factor.
levels(df$poison)
Output:
## [1] "1" "2" "3"
Stap 2) Je berekent het gemiddelde en de standaarddeviatie.
df %>% group_by(poison) %>% summarise( count_poison = n(), mean_time = mean(time, na.rm = TRUE), sd_time = sd(time, na.rm = TRUE) )
Output:
## # A tibble: 3 x 4 ## poison count_poison mean_time sd_time ## <ord> <int> <dbl> <dbl> ## 1 1 16 0.617500 0.20942779 ## 2 2 16 0.544375 0.28936641 ## 3 3 16 0.276250 0.06227627
Stap 3) In stap drie kunt u grafisch controleren of er een verschil is tussen de verdelingen. Houd er rekening mee dat u de jitterende stip opneemt.
ggplot(df, aes(x = poison, y = time, fill = poison)) + geom_boxplot() + geom_jitter(shape = 15, color = "steelblue", position = position_jitter(0.21)) + theme_classic()
Output:
Stap 4) U kunt de one-way ANOVA-test uitvoeren met de opdracht aov. De basissyntaxis voor een ANOVA-test is:
aov(formula, data)
Arguments:
- formula: The equation you want to estimate
- data: The dataset used
De syntaxis van de formule is:
y ~ X1+ X2+...+Xn # X1 + X2 +... refers to the independent variables y ~ . # use all the remaining variables as independent variables
Je kunt nu de vraag beantwoorden: is er een verschil in overlevingstijd tussen de cavia's, gegeven het type gif dat is toegediend?
Sla het model op in een object en geef dit door aan summary() om een โโleesbare afdruk van de resultaten te krijgen.
anova_one_way <- aov(time~poison, data = df) summary(anova_one_way)
Code Uitleg
- aov(tijd ~ gif, data = df): Voer de ANOVA-test uit met de volgende formule
- samenvatting(anova_one_way): Druk de samenvatting van de test af
Output:
## Df Sum Sq Mean Sq F value Pr(>F) ## poison 2 1.033 0.5165 11.79 7.66e-05 *** ## Residuals 45 1.972 0.0438 ## --- ## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
De p-waarde is 7.66e-05, ver onder de gebruikelijke drempelwaarde van 0.05, en de drie sterren duiden op de sterkste significantiecode. Je kunt H0 verwerpen en concluderen dat ten minste รฉรฉn vergiftigingsgroep een andere gemiddelde overlevingstijd heeft.
Hoe controleer je de aannames van een ANOVA-analyse in R?
Een p-waarde van een ANOVA-analyse is alleen betrouwbaar als aan de drie eerder genoemde voorwaarden is voldaan. Elk van deze voorwaarden kan direct in R worden gecontroleerd en alle controles worden uitgevoerd op het aangepaste modelobject.
1. Onafhankelijkheid van de waarnemingen. Dit is een eigenschap van het onderzoeksontwerp, niet van de data, dus geen enkele test kan dit verhelpen. Elk proefdier moet eenmaal gemeten worden en willekeurig aan een groep worden toegewezen. Als hetzelfde proefdier in meerdere rijen voorkomt, is een model met herhaalde metingen nodig.
2. Normaliteit van de residuen. ANOVA gaat ervan uit dat de residuen, en niet de ruwe data, bij benadering normaal verdeeld zijn. Bekijk de QQ-plot en bevestig dit met de Shapiro-Wilk-test:
par(mfrow = c(2, 2)) plot(anova_one_way) # four diagnostic plots shapiro.test(residuals(anova_one_way))
Punten die dicht bij de diagonaal van de normale QQ-plot liggen, duiden op normale residuen. Een Shapiro-Wilk p-waarde boven 0.05 betekent dat normaliteit niet verworpen kan worden.
3. Homogeniteit van de variantie. Elke groep zou een vergelijkbare spreiding moeten vertonen. De grafiek van residuen versus voorspelde waarden zou eruit moeten zien als een vlakke band in plaats van een trechter. Bevestig dit met de Levene-test, die robuuster is tegen niet-normaliteit dan de Bartlett-test:
library(car)
leveneTest(time ~ poison, data = df)
bartlett.test(time ~ poison, data = df)
Een p-waarde boven 0.05 ondersteunt de aanname van gelijke varianties.
Wat te doen als een aanname niet klopt. Als de varianties ongelijk zijn, voer dan de Welch-correctie uit met `oneway.test(time ~ poison, data = df, var.equal = FALSE)`. Als de residuen duidelijk niet normaal verdeeld zijn en de steekproef klein is, schakel dan over naar de Kruskal-Wallis rangtoets: `kruskal.test(time ~ poison, data = df)`. Bij grote, evenwichtige steekproeven is ANOVA redelijk robuust tegen matige afwijkingen van normaliteit, waardoor een grensgeval van de Shapiro-Wilk-test zelden fataal is.
Paargewijze vergelijking
Een significante F-toets geeft aan dat de groepsgemiddelden niet allemaal gelijk zijn, maar niet welk paar verschilt. De Tukey Honest Significant Difference-toets beantwoordt die vraag door elk paar te vergelijken en tegelijkertijd de gezamenlijke foutenmarge te controleren.
TukeyHSD(anova_one_way)
Output:
Lees de uitvoer, รฉรฉn rij per paar. De diff De kolom bevat het verschil tussen de gemiddelden van de twee groepen. links en vergunning begrens het 95 procent betrouwbaarheidsinterval voor dat verschil, en p adj De p-waarde is gecorrigeerd voor meervoudige vergelijkingen. Een paar verschilt significant wanneer het interval nul uitsluit, oftewel wanneer de gecorrigeerde p-waarde lager is dan 0.05. In deze dataset zijn de vergelijkingen met gifstof 3 significant, wat overeenkomt met de boxplot: groep 3 heeft een duidelijk lagere gemiddelde overlevingstijd dan groep 1 en 2, terwijl groep 1 en 2 statistisch gezien niet van elkaar te onderscheiden zijn.
Bidirectionele ANOVA
Een tweeweg-ANOVA voegt een tweede factor toe aan de formule. Het werkt precies hetzelfde als de eenwegtoets, alleen de formule verandert:
y ~ x1 + x2
Hier is y de kwantitatieve responsvariabele, terwijl x1 en x2 beide categorische factoren zijn.
Hypothese in tweeweg-ANOVA-test
- H0: De groepsgemiddelden zijn gelijk voor beide factorvariabelen.
- H1: Ten minste รฉรฉn groepsgemiddelde verschilt, voor ten minste รฉรฉn van de twee factoren.
Je voegt de variabele 'behandeling' toe aan het model. Deze variabele registreert de behandeling die de cavia heeft gekregen. De onderstaande additieve formule test of elke factor op zichzelf de overlevingstijd beรฏnvloedt, na rekening te hebben gehouden met de andere factoren.
Pas de code aan door 'treat' toe te voegen naast de eerste onafhankelijke variabele.
anova_two_way <- aov(time~poison + treat, data = df) summary(anova_two_way)
Output:
## Df Sum Sq Mean Sq F value Pr(>F) ## poison 2 1.0330 0.5165 20.64 5.7e-07 *** ## treat 3 0.9212 0.3071 12.27 6.7e-06 *** ## Residuals 42 1.0509 0.0250 ## ---
Beide p-waarden (5.7e-07 voor gif en 6.7e-06 voor behandeling) liggen ver onder de 0.05, dus verwerp je H0 voor beide factoren en concludeer je dat het veranderen van het gif of de behandeling de overlevingstijd beรฏnvloedt.
Een interactieterm toevoegen
Het bovenstaande additieve model gaat ervan uit dat het effect van het gif hetzelfde is, ongeacht de behandeling. Om die aanname te testen, vervangt u het plusteken door een asterisk, wat zowel de hoofdeffecten als hun interactie weergeeft:
anova_interaction <- aov(time~poison * treat, data = df) summary(anova_interaction)
Als de rij 'gif:behandeling' niet significant is, is het additieve model de betere keuze omdat het minder vrijheidsgraden gebruikt.
ANOVA in R: Sneltestreferentie
De onderstaande tabel geeft een overzicht van elke hierboven gebruikte test, de R-aanroep waarmee deze wordt uitgevoerd en de hypothese die ermee wordt geรซvalueerd:
| Test | Code | Hypothese | P-waarde |
|---|---|---|---|
| Eenrichtings-ANOVA |
aov(y ~ X, data = df)
|
H1: Gemiddeld is voor tenminste รฉรฉn groep verschillend | 0.05 |
| paarsgewijs |
TukeyHSD(ANOVA summary) |
0.05 | |
| Tweeweg-ANOVA |
aov(y ~ X1 + X2, data = df)
|
H1: Ten minste รฉรฉn groepsgemiddelde verschilt voor een van beide factoren. | 0.05 |




