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.

  • ๐Ÿ“ Kernstatistiek: De F-ratio deelt de variabiliteit tussen groepen door de variabiliteit binnen groepen, dus hogere waarden pleiten tegen gelijke gemiddelden.
  • ๐Ÿงช Eenrichtingssyntaxis: aov(time~poison, data = df) gevolgd door summary() retourneert de vrijheidsgraden, de F-waarde en de p-waarde.
  • โœ… Controle van aannames: Test de onafhankelijkheid en normaliteit van de residuen met shapiro.test() en de gelijke variantie met leveneTest() voordat je de p-waarde vertrouwt.
  • ๐Ÿ”Ž Post-hoc analyse: TukeyHSD() vergelijkt elk paar groepen met behoud van het family-wise error rate op het aangegeven niveau.
  • ๐Ÿงฎ Tweewegsverlenging: aov(time~poison + treat, data = df) voegt een tweede factor toe, en poison:treat voegt de interactieterm toe.
  • ๐Ÿ“Š Leesresultaten: Een p-waarde lager dan 0.05 verwerpt de nulhypothese van gelijke gemiddelden, maar geeft nooit aan welke groep verschilt.

ANOVA in R, eenrichtings- en tweerichtingsvariantieanalyse

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.

Interpreteer ANOVA-test

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.

Interpreteer ANOVA-test

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:

Voorbeeld van een eenrichtings-ANOVA-test

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:

Paargewijze vergelijking

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

Veelgestelde vragen

De F-waarde is de verhouding tussen de variantie tussen groepen en de variantie binnen groepen. Waarden dicht bij 1 suggereren dat de groepsgemiddelden gelijk zijn. Grote waarden geven aan dat de groepen afkomstig zijn uit populaties met verschillende gemiddelden.

Gebruik `oneway.test()` met `var.equal = FALSE` wanneer de varianties ongelijk zijn, en `kruskal.test()` wanneer de residuen duidelijk niet normaal verdeeld zijn. Het transformeren van een scheve respons met `log()` herstelt vaak zowel de normaliteit als de gelijke variantie.

Elke t-test heeft een eigen risico van 5 procent op een vals positief resultaat. Drie paarsgewijze tests verhogen het risico op een gezamenlijke fout tot ongeveer 14 procent. ANOVA houdt รฉรฉn algemene test op 5 procent, en Tukey HSD corrigeert de paarsgewijze vergelijkingen.

ANOVA is een standaard filter voor het selecteren van kenmerken: het rangschikt categorische voorspellers op basis van hoe sterk ze een numerieke doelvariabele scheiden. AI-teams gebruiken het ook om modelvarianten te vergelijken over verschillende validatievouwen.

Ja. AI-assistenten kunnen vrijheidsgraden uitleggen, p-waarden in begrijpelijke taal vertalen en schendingen van aannames signaleren in diagnostische grafieken. Controleer de aflezing altijd aan de hand van uw eigen leveneTest() en shapiro.test() resultaten.

Vat dit bericht samen met: