ANOVA i R: Envejs- og tovejstest med eksempler

⚡ Smart opsummering

ANOVA i R sammenligner middelværdierne af tre eller flere grupper ved at opdele den samlede variation i komponenter mellem grupper og inden for grupper. Denne gennemgang kører envejs- og tovejs-tests på giftdatasættet, kontrollerer antagelser og isolerer forskellige par med Tukey HSD.

  • 📐 Kernestatistik: F-forholdet dividerer variabiliteten mellem grupper med variabiliteten inden for grupperne, så større værdier taler imod lige gennemsnit.
  • 🧪 Envejssyntaks: aov(tid~gift, data = df) efterfulgt af summary() returnerer frihedsgraderne, F-værdien og p-værdien.
  • ✅ Antagelsestjek: Test uafhængighed, normalitet af residualer med shapiro.test() og lige stor varians med leveneTest() før p-værdien er påliden.
  • 🔎 Post hoc-analyse: TukeyHSD() sammenligner hvert par af grupper, mens den familievise fejlrate holdes på det angivne niveau.
  • 🧮 Tovejsudvidelse: aov(tid~gift + behandling, data = df) tilføjer en anden faktor, og gift:behandling tilføjer interaktionstermen.
  • 📊 Læseresultater: En p-værdi under 0.05 forkaster nulhypotesen om lige gennemsnit, men identificerer aldrig hvilken gruppe der er forskellig.

ANOVA i R Envejs Tovejs

Hvad er ANOVA?

Analyse af variation (ANOVA) er en statistisk teknik, der bruges til at sammenligne middelværdierne af to eller flere grupper. Testen fungerer ved at opdele den samlede variation i en måling i den del, der forklares af gruppemedlemskab, og den del, der er tilbage som tilfældig støj. ANOVA i R fortæller dig derfor, om mindst én gruppemiddelværdi afviger fra de andre, ikke hvilken. Det er en direkte forlængelse af t-test i situationer, hvor faktorvariablen har mere end to niveauer.

Før du kører en test, er det nyttigt at vide, hvilket medlem af ANOVA-familien der passer til dit design.

Typer af ANOVA-tests i R

"ANOVA" er en familie af tests snarere end en enkelt procedure. Valget af det rigtige medlem afhænger af, hvor mange faktorer du har, og hvordan dataene blev indsamlet.

Test Hvornår skal du bruge det? R-opkald
Envejs ANOVA En faktor med tre eller flere niveauer aov(y ~ x, data = df)
To-vejs ANOVA To uafhængige faktorer aov(y ~ x1 + x2, data = df)
Tovejs med interaktion Effekten af ​​den ene faktor afhænger af den anden aov(y ~ x1 * x2, data = df)
Gentagne målinger ANOVA De samme forsøgspersoner blev målt mere end én gang aov(y ~ x + Fejl(subjekt/x))
ANCOVA En kontinuerlig kovariat skal kontrolleres for aov(y ~ x + kovariat, data = df)
MANOVA To eller flere responsvariabler på én gang manova(cbind(y1, y2) ~ x)

Denne vejledning dækker de første tre. De resterende varianter bruger den samme aov()-grænseflade, så når du kan læse én outputtabel, kan du læse dem alle.

ANOVA vs. T-test i R: Nøgleforskelle

Begge tests sammenligner middelværdier, så det er værd at være præcis omkring, hvor den ene erstatter den anden.

Kriterier T-test ANOVA
Antal grupper Præcis to To eller flere
Test statistik t F, lig med t i anden kvadrat, når der er to grupper
Resultat Navngiver retningen af ​​forskellen Kun rapporter om, at der er en forskel
Opfølgning nødvendig Ingen Post hoc-test såsom Tukey HSD
R funktion t.test() aov()

Fristelsen med tre grupper er at køre tre separate t-tests. Modstå den. Hver test har sin egen fejlrate på 5 procent, så tre sammenligninger øger chancen for en falsk positiv til cirka 14 procent. ANOVA besvarer det samme spørgsmål med en enkelt test, og Tukey HSD håndterer derefter de parvise detaljer med fejlraten holdt i skak. For tilfældet med to grupper, se t-test tutorial.

Envejs ANOVA

Der er mange situationer, hvor du skal sammenligne gennemsnittet mellem flere grupper. For eksempel vil marketingafdelingen gerne vide, om tre teams har den samme salgspræstation.

  • Hold: Faktor på 3 niveauer: A, B og C
  • Salg: Et mål for ydeevne

ANOVA-testen kan fortælle, om de tre grupper har lignende præstationer.

For at afklare, om dataene kommer fra samme population, kan du udføre en envejs variansanalyse (herefter envejs ANOVA). Ligesom enhver anden statistisk test giver den bevis for, om H0-hypotesen kan forkastes. Bemærk, at det ikke er det samme som at bevise, at den er sand, hvis man ikke forkaster H0.

Hypotese i envejs ANOVA-test

  • H0: Middelværdierne mellem grupperne er identiske
  • H1: I det mindste er gennemsnittet af en gruppe anderledes

Med andre ord, hvis H0 ikke forkastes, er der ikke tilstrækkeligt bevis til at konkludere, at en gruppes middelværdi afviger fra de andre.

Denne test ligner t-testen, men ANOVA er det korrekte valg, når der er mere end to grupper. Med præcis to grupper er de to tests ækvivalente, og F-statistikken er lig med kvadratet af t-statistikken.

Forudsætninger

Envejs-ANOVA hviler på tre betingelser: observationerne er tilfældigt udtaget og uafhængige af hinanden, residualerne inden for hver gruppe er omtrent normalfordelte, og variansen er den samme i hver gruppe (varianshomogenitet). Afsnittet om kontrol af antagelser nedenfor viser, hvordan man tester hver enkelt i R.

Fortolk ANOVA test

F-statistikken bruges til at teste, om data er fra signifikant forskellige populationer, dvs. forskellige stikprøvegennemsnit.

For at beregne F-statistikken skal du dividere variation mellem grupper over variation inden for gruppen.

mellem-gruppe Variabiliteten afspejler, hvor langt hver gruppes gennemsnit ligger fra det samlede gennemsnit. Sammenlign de to grafer nedenfor for at se ideen.

Den venstre graf viser meget lille variation mellem de tre grupper, så alle tre gruppegennemsnit ligger tæt på samlet betyde.

Den højre graf viser tre fordelinger langt fra hinanden uden overlap, så forskellen mellem det samlede gennemsnit og gennemsnittet for hver gruppe er stor.

Fortolk ANOVA test

inden for gruppen Variabilitet måler, hvor langt individuelle observationer afviger fra middelværdien af ​​deres egen gruppe. Nogle punkter ligger langt fra deres gruppegennemsnit, og indenforgruppen-termen indfanger præcis denne spredning, hvilket er stikprøvefejlen.

For visuelt at forstå konceptet inden for gruppevariabilitet, se på grafen nedenfor.

Den venstre del viser fordelingen af ​​tre forskellige grupper. Du øgede spredningen af ​​hver stikprøve, og det er tydeligt, at den individuelle varians er stor. F-statistikken falder, så du ville ikke kunne forkaste nulhypotesen.

Den højre del viser stikprøver med samme gennemsnit, men meget lavere spredning. Det hæver F-statistikken og peger til fordel for den alternative hypotese.

Fortolk ANOVA test

Du kan bruge begge mål til at konstruere F-statistikken. Det er meget intuitivt at forstå F-statistikken. Hvis tælleren stiger, betyder det, at variabiliteten mellem grupper er høj, og det er sandsynligt, at grupperne i stikprøven er trukket fra helt forskellige fordelinger.

Med andre ord indikerer en lav F-statistik en lille eller ingen meningsfuld forskel mellem gruppens gennemsnit.

Eksempel Envejs ANOVA-test

Du vil bruge giftdatasættet til at implementere envejs ANOVA-testen. Datasættet indeholder 48 rækker og 3 variabler:

  • Tid: Dyrets overlevelsestid
  • gift: Type brugt gift: faktorniveau: 1,2 og 3
  • behandle: Anvendt behandlingstype: faktorniveau: 1,2 og 3

Før du begynder at beregne ANOVA-testen, skal du forberede dataene som følger:

  • Trin 1: Importer dataene
  • Trin 2: Fjern unødvendig variabel
  • Trin 3: Konverter den variable gift som bestilt 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, ...		

Vores mål er at teste følgende antagelse:

  • H0: Der er ingen forskel i overlevelsestidsgennemsnit mellem grupperne
  • H1: Overlevelsestidsgennemsnittet er forskelligt for mindst én gruppe.

Med andre ord vil du vide, om der er en statistisk forskel mellem den gennemsnitlige overlevelsestid i forhold til den type gift, marsvinet får.

Du vil fortsætte som følger:

  • Trin 1: Tjek formatet af den variable gift
  • Trin 2: Udskriv den sammenfattende statistik: antal, middelværdi og standardafvigelse
  • Trin 3: Plot et boksplot
  • Trin 4: Beregn envejs ANOVA-testen
  • Trin 5: Kør en parvis sammenligning med Tukey HSD

Trin 1) Tjek giftniveauerne med koden nedenfor. Du bør se tre tegnværdier, fordi det muterede verbum konverterede kolonnen til en ordnet faktor.

levels(df$poison)

Output:

## [1] "1" "2" "3"

Trin 2) Du beregner middelværdien og standardafvigelsen.

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

Trin 3) I trin tre kan du grafisk tjekke, om der er forskel på fordelingen. Bemærk, at du inkluderer den rystede prik.

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:

Envejs ANOVA-testeksempel

Trin 4) Du kan køre envejs ANOVA-testen med kommandoen aov. Den grundlæggende syntaks for en ANOVA-test er:

aov(formula, data)
Arguments:			
- formula: The equation you want to estimate
- data: The dataset used	

Formlens syntaks er:

y ~ X1+ X2+...+Xn # X1 +  X2 +... refers to the independent variables
y ~ . # use all the remaining variables as independent variables

Du kan nu besvare spørgsmålet: er der nogen forskel i overlevelsestiden mellem marsvinene, givet den type gift, der administreres?

Gem modellen i et objekt og send den til summary() for at få en læsbar udskrift af resultaterne.

anova_one_way <- aov(time~poison, data = df)
summary(anova_one_way)

Code Forklaring

  • aov(tid ~ gift, data = df): Kør ANOVA-testen med følgende formel
  • summary(anova_one_way): Udskriv resuméet af testen

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

P-værdien er 7.66e⁻⁶, langt under den sædvanlige tærskel på 0.05, og de tre stjerner markerer den stærkeste signifikanskode. Man kan forkaste H₂ og konkludere, at mindst én giftgruppe har en forskellig gennemsnitlig overlevelsestid.

Sådan kontrollerer du ANOVA-antagelser i R

En ANOVA p-værdi er kun troværdig, når de tre tidligere nævnte betingelser er opfyldt. Hver af dem har en direkte kontrol i R, og de kører alle på det tilpassede modelobjekt.

1. Observationers uafhængighed. Dette er en egenskab ved studiedesignet, ikke ved dataene, så ingen test kan redde det. Hvert forsøgskanin skal måles én gang og tildeles tilfældigt til sin gruppe. Hvis den samme forsøgsperson optræder i flere rækker, har du i stedet brug for en model med gentagne målinger.

2. Residualernes normalitet. ANOVA antager, at residualerne, ikke rådataene, er omtrent normale. Undersøg QQ-plottet og bekræft det med Shapiro-Wilk-testen:

par(mfrow = c(2, 2))
plot(anova_one_way)          # four diagnostic plots

shapiro.test(residuals(anova_one_way))

Punkter, der strækker sig langs diagonalen i Normal QQ-plottet, angiver normale residualer. En Shapiro-Wilk p-værdi over 0.05 betyder, at man ikke kan afvise normalitet.

3. Varianshomogenitet. Hver gruppe bør vise en lignende spredning. Residuals vs. Fitted-plottet bør ligne et fladt bånd snarere end en tragt. Bekræft det med Levenes test, som er mere robust over for ikke-normalitet end Bartletts:

library(car)
leveneTest(time ~ poison, data = df)

bartlett.test(time ~ poison, data = df)

En p-værdi over 0.05 understøtter lige store varianser.

Hvad skal man gøre, når en antagelse fejler. Hvis varianserne er ulige, køres oneway.test(time ~ poison, data = df, var.equal = FALSE), Welch-korrektionen. Hvis residualerne tydeligvis ikke er normale, og stikprøven er lille, skiftes til Kruskal-Wallis rangtest, kruskal.test(time ~ poison, data = df). Med store, afbalancerede stikprøver er ANOVA forholdsvis robust til moderate afvigelser fra normalitet, så et Shapiro-Wilk-resultat på grænsen af ​​niveauet er sjældent fatalt.

Parvis sammenligning

En signifikant F-test fortæller dig, at gruppens middelværdier ikke alle er ens, men ikke hvilket par der adskiller sig. Tukeys Honest Significant Difference-test besvarer dette ved at sammenligne hvert par, samtidig med at den familievise fejlrate kontrolleres.

TukeyHSD(anova_one_way)

Output:

Parvis sammenligning

Læs outputtet én række pr. par. diff kolonnen indeholder forskellen mellem de to gruppemiddelværdier, lwr og licens begrænsede 95 procents konfidensintervallet for den forskel, og p adj. er p-værdien justeret for multiple sammenligninger. Et par afviger signifikant, når dets interval udelukker nul, ækvivalent når p adj er under 0.05. I dette datasæt er sammenligningerne, der involverer gift 3, de signifikante, hvilket matcher boksplottet: gruppe 3 har en klart lavere gennemsnitlig overlevelsestid end gruppe 1 og 2, mens gruppe 1 og 2 er statistisk umulige at skelne fra hinanden.

To-vejs ANOVA

En tovejs ANOVA tilføjer en anden faktor til formlen. Den fungerer præcis som envejstesten, kun formlen ændres:

y ~ x1 + x2

Her er y den kvantitative responsvariabel, mens x1 og x2 begge er kategoriske faktorer.

Hypotese i to-vejs ANOVA test

  • H0: Gruppens middelværdier er ens for begge faktorvariabler
  • H1: Mindst én gruppes gennemsnit er forskellig for mindst én af de to faktorer

Du tilføjer behandlingsvariablen til modellen. Denne variabel registrerer den behandling, marsvinet har fået. Den additive formel nedenfor tester, om hver faktor påvirker overlevelsestiden i sig selv, efter at den anden er taget i betragtning.

Juster koden ved at tilføje treat ved siden af ​​den første uafhængige variabel.

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                    
## ---

Begge p-værdier (5.7e-07 for gift og 6.7e-06 for behandling) ligger langt under 0.05, så du forkaster H0 for begge faktorer og konkluderer, at ændring af enten giften eller behandlingen påvirker overlevelsestiden.

Tilføjelse af et interaktionsterm

Den additive model ovenfor antager, at giftens effekt er den samme uanset behandlingen. For at teste denne antagelse skal plustegnet erstattes med en asterisk, som passer til både hovedeffekterne og deres interaktion:

anova_interaction <- aov(time~poison * treat, data = df)
summary(anova_interaction)

Hvis rækken forgiftning:behandling ikke er signifikant, er den additive model det bedre valg, fordi den bruger færre frihedsgrader.

ANOVA i R: Hurtig testreference

Tabellen nedenfor viser hver test, der er brugt ovenfor, det R-kald, der kører den, og den hypotese, den evaluerer:

Test Code Hypotese P-værdi
Envejs ANOVA
aov(y ~ X, data = df)
H1: Gennemsnit er forskelligt for mindst én gruppe 0.05
Parvis
TukeyHSD(ANOVA summary)
0.05
Tovejs ANOVA
aov(y ~ X1 + X2, data = df)
H1: Mindst én gruppegennemsnit er forskellig for begge faktorer 0.05

Ofte Stillede Spørgsmål

F-værdien er forholdet mellem varians mellem grupper og varians inden for grupper. Værdier nær 1 antyder, at gruppens middelværdier er ens. Store værdier angiver, at grupperne er trukket fra populationer med forskellige middelværdier.

Brug oneway.test() med var.equal = FALSE, når varianserne er ulige, og kruskal.test() når residualerne tydeligvis ikke er normale. Transformation af et skævt svar med log() gendanner ofte både normalitet og ligelig varians.

Hver t-test har sin egen risiko for falsk positiv på 5 procent. Tre parvise tests øger den familievise fejlrate til omkring 14 procent. ANOVA holder en enkelt samlet test på 5 procent, og Tukey HSD justerer de parvise sammenligninger.

ANOVA er et standardfilter til funktionsudvælgelse: det rangerer kategoriske prædiktorer efter, hvor stærkt de adskiller et numerisk mål. AI-teams bruger det også til at sammenligne modelvarianter på tværs af krydsvalideringsfoldninger.

Ja. AI-assistenter kan forklare frihedsgrader, oversætte p-værdier til et letforståeligt sprog og markere brud på antagelser i diagnostiske plots. Bekræft altid aflæsningen mod dine egne leveneTest() og shapiro.test() resultater.

Opsummer dette indlæg med: