ANOVA i R: Envägs- och tvåvägstest med exempel

⚡ Smart sammanfattning

ANOVA i R jämför medelvärdena för tre eller fler grupper genom att dela upp den totala variationen i komponenter mellan grupper och inom grupper. Denna genomgång kör envägs- och tvåvägstester på giftdatasetet, kontrollerar antaganden och isolerar olika par med Tukey HSD.

  • 📐 Kärnstatistik: F-kvoten dividerar variabiliteten mellan grupper med variabiliteten inom gruppen, så större värden talar emot lika medelvärden.
  • 🧪 Envägssyntax: aov(tid~gift, data = df) följt av summary() returnerar frihetsgraderna, F-värdet och p-värdet.
  • Antagandekontroller: Testa oberoende, normalitet hos residualer med shapiro.test() och lika varians med leveneTest() innan p-värdet litas på.
  • 🔎 Efterföljande analys: TukeyHSD() jämför varje par av grupper samtidigt som den familjevisa felfrekvensen hålls på den angivna nivån.
  • 🧮 Tvåvägsförlängning: aov(tid~gift + behandling, data = df) lägger till en andra faktor, och gift:behandling lägger till interaktionstermen.
  • 📊 Läsresultat: Ett p-värde under 0.05 förkastar nollhypotesen om lika medelvärden men identifierar aldrig vilken grupp som skiljer sig åt.

ANOVA i R Enkelriktad Tvåriktad

Vad är ANOVA?

Variansanalys (ANOVA) är en statistisk teknik som används för att jämföra medelvärdena för två eller flera grupper. Testet fungerar genom att dela upp den totala variationen i en mätning i den del som förklaras av grupptillhörighet och den del som blir kvar som slumpmässigt brus. ANOVA i R berättar därför om minst ett gruppmedelvärde skiljer sig från de andra, inte vilket. Det är en direkt förlängning av t-test till situationer där faktorvariabeln har mer än två nivåer.

Innan du kör ett test är det bra att veta vilken medlem av ANOVA-familjen som passar din design.

Typer av ANOVA-tester i R

”ANOVA” är en familj av tester snarare än en enda procedur. Att välja rätt medlem beror på hur många faktorer du har och hur data samlades in.

Testa När ska du använda den R-samtal
Envägs ANOVA En faktor med tre eller fler nivåer aov(y ~ x, data = df)
Tvåvägs ANOVA Två oberoende faktorer aov(y ~ x1 + x2, data = df)
Tvåvägs med interaktion Effekten av en faktor beror på den andra aov(y ~ x1 * x2, data = df)
Upprepade mätningar ANOVA Samma försökspersoner mättes mer än en gång aov(y ~ x + Fel(subjekt/x))
ANCOVA En kontinuerlig kovariabel måste kontrolleras för aov(y ~ x + kovariat, data = df)
MANOVA Två eller flera svarsvariabler samtidigt manova(cbind(y1, y2) ~ x)

Den här handledningen täcker de tre första. De återstående varianterna använder samma aov()-gränssnitt, så när du väl kan läsa en utdatatabell kan du läsa dem alla.

ANOVA vs T-test i R: Viktiga skillnader

Båda testerna jämför medelvärden, så det är värt att vara exakt om var det ena ersätter det andra.

Kriterier T-test ANOVA
Antal grupper Exakt två Två eller flera
Teststatistik t F, lika med t i kvadrat när det finns två grupper
Resultat Anger skillnadens riktning Rapporterar endast att det finns en skillnad
Uppföljning behövs Ingen Post hoc-test såsom Tukey HSD
R-funktion t.test() aov()

Frestelsen med tre grupper är att köra tre separata t-tester. Motstå den. Varje test har sin egen felfrekvens på 5 procent, så tre jämförelser ökar risken för ett falskt positivt resultat till ungefär 14 procent. ANOVA besvarar samma fråga med ett enda test, och Tukey HSD hanterar sedan den parvisa detaljnivån med felfrekvensen i schack. För fallet med två grupper, se handledning för t-test.

Envägs ANOVA

Det finns många situationer där du behöver jämföra medelvärdet mellan flera grupper. Marknadsavdelningen vill till exempel veta om tre team har samma försäljningsprestanda.

  • Lag: Faktor på 3 nivåer: A, B och C
  • Försäljning: Ett mått på prestanda

ANOVA-testet kan avgöra om de tre grupperna har liknande prestationer.

För att klargöra om uppgifterna kommer från samma population kan du utföra en enkelriktad variansanalys (nedan kallat envägs-ANOVA). Liksom alla andra statistiska tester ger den bevis för huruvida H0-hypotesen kan förkastas. Observera att att inte förkasta H0 inte är detsamma som att bevisa att den är sann.

Hypotes i envägs ANOVA-test

  • H0: Medelvärdena mellan grupperna är identiska
  • H1: Åtminstone är medelvärdet för en grupp olika

Med andra ord, om H0 inte förkastas, finns det inte tillräckligt med bevis för att dra slutsatsen att medelvärdet för en grupp skiljer sig från de andra.

Detta test liknar t-testet, men ANOVA är det rätta valet när det finns fler än två grupper. Med exakt två grupper är de två testerna ekvivalenta och F-statistiken är lika med kvadraten på t-statistiken.

antaganden

Envägs-ANOVA vilar på tre villkor: observationerna är slumpmässigt urvalade och oberoende av varandra, residualerna inom varje grupp är approximativt normalfördelade och variansen är densamma i varje grupp (varianshomogenitet). Avsnittet om att kontrollera antaganden nedan visar hur man testar vart och ett i R.

Tolka ANOVA-test

F-statistiken används för att testa om data kommer från signifikant olika populationer, dvs olika urvalsmedelvärden.

För att beräkna F-statistiken måste du dividera variation mellan grupper över variation inom gruppen.

Ocuco-landskapet mellan-gruppen Variabiliteten återspeglar hur långt varje gruppmedelvärde ligger från det totala medelvärdet. Jämför de två graferna nedan för att förstå konceptet.

Den vänstra grafen visar väldigt liten variation mellan de tre grupperna, så alla tre gruppmedelvärden ligger nära övergripande betyda.

Den högra grafen plottar tre fördelningar långt ifrån varandra utan överlappning, så gapet mellan det totala medelvärdet och varje gruppmedelvärde är stort.

Tolka ANOVA-test

Ocuco-landskapet inom gruppen Variabilitet mäter hur långt individuella observationer avviker från medelvärdet för sin egen grupp. Vissa punkter ligger långt från sitt gruppmedelvärde, och inomgruppens term fångar exakt den spridningen, vilket är urvalsfelet.

För att visuellt förstå konceptet inom gruppvariabilitet, titta på grafen nedan.

Den vänstra delen visar fördelningen av tre olika grupper. Du ökade spridningen för varje urval och det är tydligt att den individuella variansen är stor. F-statistiken faller, så du skulle misslyckas med att förkasta nollhypotesen.

Den högra delen visar stickprov med samma medelvärden men mycket lägre spridning. Det höjer F-statistiken och pekar till förmån för den alternativa hypotesen.

Tolka ANOVA-test

Du kan använda båda måtten för att konstruera F-statistiken. Det är väldigt intuitivt att förstå F-statistiken. Om täljaren ökar betyder det att variationen mellan grupperna är hög, och det är troligt att grupperna i urvalet kommer från helt olika fördelningar.

Med andra ord indikerar en låg F-statistik liten eller ingen meningsfull skillnad mellan gruppens medelvärden.

Exempel Envägs ANOVA-test

Du kommer att använda giftdataset för att implementera envägs ANOVA-testet. Datauppsättningen innehåller 48 rader och 3 variabler:

  • Tid: Djurets överlevnadstid
  • gift: Typ av gift som används: faktornivå: 1,2 och 3
  • behandla: Typ av behandling som används: faktornivå: 1,2 och 3

Innan du börjar beräkna ANOVA-testet måste du förbereda data enligt följande:

  • Steg 1: Importera data
  • Steg 2: Ta bort onödig variabel
  • Steg 3: Konvertera variabel gift enligt beställd nivå
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)

Produktion:

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

Vårt mål är att testa följande antagande:

  • H0: Det finns ingen skillnad i genomsnittlig överlevnadstid mellan grupper
  • H1: Genomsnittet för överlevnadstid är olika för minst en grupp.

Med andra ord vill du veta om det finns en statistisk skillnad mellan medelöverlevnadstiden beroende på vilken typ av gift som ges till marsvinet.

Du kommer att gå tillväga enligt följande:

  • Steg 1: Kontrollera formatet på det variabla giftet
  • Steg 2: Skriv ut den sammanfattande statistiken: antal, medelvärde och standardavvikelse
  • Steg 3: Rita en boxplot
  • Steg 4: Beräkna envägs ANOVA-testet
  • Steg 5: Kör en parvis jämförelse med Tukey HSD

Steg 1) Kontrollera giftnivåerna med koden nedan. Du bör se tre teckenvärden, eftersom det muterade verbet konverterade kolumnen till en ordnad faktor.

levels(df$poison)

Produktion:

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

Steg 2) Du beräknar medelvärdet och standardavvikelsen.

df %>%
	group_by(poison) %>%
	summarise(
		count_poison = n(),
		mean_time = mean(time, na.rm = TRUE),
		sd_time = sd(time, na.rm = TRUE)
	)

Produktion:

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

Steg 3) I steg tre kan du grafiskt kontrollera om det är skillnad mellan fördelningen. Observera att du inkluderar den skakiga punkten.

ggplot(df, aes(x = poison, y = time, fill = poison)) +
    geom_boxplot() +
    geom_jitter(shape = 15,
        color = "steelblue",
        position = position_jitter(0.21)) +
    theme_classic()

Produktion:

Envägs ANOVA-testexempel

Steg 4) Du kan köra envägs ANOVA-testet med kommandot aov. Den grundläggande syntaxen för ett ANOVA-test är:

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

Formelns syntax är:

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

Nu kan du besvara frågan: finns det någon skillnad i överlevnadstid mellan marsvinen, med tanke på vilken typ av gift som administreras?

Lagra modellen i ett objekt och skicka den till summary() för att få en läsbar utskrift av resultaten.

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

Code Förklaring

  • aov(tid ~ gift, data = df): Kör ANOVA-testet med följande formel
  • summary(anova_one_way): Skriv ut sammanfattningen av testet

Produktion:

##             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ärdet är 7.66e⁻⁶, långt under det vanliga tröskelvärdet på 0.05, och de tre stjärnorna markerar den starkaste signifikanskoden. Man kan förkasta H₂ och dra slutsatsen att minst en giftgrupp har en annan genomsnittlig överlevnadstid.

Hur man kontrollerar ANOVA-antaganden i R

Ett ANOVA p-värde är bara tillförlitligt när de tre tidigare angivna villkoren uppfylls. Var och en har en direkt kontroll i R, och alla körs på det anpassade modellobjektet.

1. Oberoende observationer. Detta är en egenskap hos studiedesignen, inte hos data, så inget test kan rädda den. Varje försökskanin måste mätas en gång och slumpmässigt tilldelas sin grupp. Om samma försöksperson förekommer i flera rader behöver du istället en modell med upprepade mätningar.

2. Residualernas normalitet. ANOVA antar att residualerna, inte rådata, är ungefär normala. Kontrollera QQ-diagrammet och bekräfta med Shapiro-Wilk-testet:

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

shapiro.test(residuals(anova_one_way))

Punkter som omsluter diagonalen i Normal QQ-diagrammet indikerar normala residualer. Ett Shapiro-Wilk p-värde över 0.05 innebär att man inte kan förkasta normalitet.

3. Varians homogenitet. Varje grupp bör visa en liknande spridning. Residuals vs Fitted-diagrammet bör se ut som ett platt band snarare än en tratt. Bekräfta detta med Levenes test, vilket är mer robust mot icke-normalitet än Bartletts:

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

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

Ett p-värde över 0.05 stöder lika varianser.

Vad man ska göra när ett antagande misslyckas. Om varianserna är ojämna, kör oneway.test(time ~ poison, data = df, var.equal = FALSE), Welch-korrektionen. Om residualerna är tydligt icke-normala och urvalet är litet, byt till Kruskal-Wallis rangtest, kruskal.test(time ~ poison, data = df). Med stora balanserade urval är ANOVA ganska robust till måttliga avvikelser från normalitet, så ett gränsfall till Shapiro-Wilk-resultat är sällan fatalt.

Parvis jämförelse

Ett signifikant F-test visar att gruppens medelvärden inte alla är lika, men inte vilket par som skiljer sig åt. Tukeys Honest Significant Difference-test svarar på det genom att jämföra varje par samtidigt som den familjevisa felfrekvensen kontrolleras.

TukeyHSD(anova_one_way)

Produktion:

Parvis jämförelse

Läs utdata en rad per par. diff kolumnen innehåller skillnaden mellan de två gruppmedelvärdena, lwr och lov begränsade 95-procentigt konfidensintervall för den skillnaden, och p adj är p-värdet justerat för multipla jämförelser. Ett par skiljer sig signifikant när dess intervall exkluderar noll, motsvarande när p adj är under 0.05. I denna datauppsättning är jämförelserna som involverar gift 3 de signifikanta, vilket matchar boxplottet: grupp 3 har en klart lägre genomsnittlig överlevnadstid än grupperna 1 och 2, medan grupperna 1 och 2 är statistiskt oskiljbara från varandra.

Tvåvägs ANOVA

En tvåvägs ANOVA lägger till en andra faktor till formeln. Den fungerar precis som envägstestet, bara det att formeln ändras:

y ~ x1 + x2

Här är y den kvantitativa responsvariabeln, medan x1 och x2 båda är kategoriska faktorer.

Hypotes i tvåvägs ANOVA-test

  • H0: Gruppmedelvärdena är lika för båda faktorvariablerna
  • H1: Minst ett gruppmedelvärde skiljer sig åt, för minst en av de två faktorerna

Du lägger till variabeln behandling i modellen. Denna variabel registrerar den behandling som marsvinet fått. Den additiva formeln nedan testar om varje faktor påverkar överlevnadstiden på egen hand, efter att den andra har beaktats.

Justera koden genom att lägga till treat bredvid den första oberoende variabeln.

anova_two_way <- aov(time~poison + treat, data = df)
summary(anova_two_way)

Produktion:

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

Båda p-värdena (5.7e⁻⁶ för gift och 6.7e⁻⁶ för behandling) ligger långt under 0.05, så du förkastar H0 för båda faktorerna och drar slutsatsen att en förändring av antingen giftet eller behandlingen påverkar överlevnadstiden.

Lägga till en interaktionsterm

Den additiva modellen ovan antar att giftets effekt är densamma oavsett behandling. För att testa detta antagande, ersätt plustecknet med en asterisk, vilket passar både huvudeffekterna och deras interaktion:

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

Om raden för gift:behandling inte är signifikant är den additiva modellen det bättre valet eftersom den använder färre frihetsgrader.

ANOVA i R: Snabb testreferens

Tabellen nedan listar varje test som använts ovan, R-anropet som kör det och hypotesen som det utvärderar:

Testa Code Hypotes P-värde
Envägs ANOVA
aov(y ~ X, data = df)
H1: Genomsnittet är olika för minst en grupp 0.05
Parvis
TukeyHSD(ANOVA summary)
0.05
Tvåvägs ANOVA
aov(y ~ X1 + X2, data = df)
H1: Minst ett gruppmedelvärde skiljer sig åt för endera faktorn 0.05

Vanliga frågor

F-värdet är förhållandet mellan variansen mellan grupper och variansen inom grupperna. Värden nära 1 antyder att gruppens medelvärden är lika. Höga värden indikerar att grupperna kommer från populationer med olika medelvärden.

Använd oneway.test() med var.equal = FALSE när varianserna är ojämna, och kruskal.test() när residualerna är tydligt icke-normala. Att transformera ett skevt svar med log() återställer ofta både normalitet och lika varians.

Varje t-test har sin egen risk för falskt positiva resultat på 5 procent. Tre parvisa tester höjer den familjevisa felfrekvensen till cirka 14 procent. ANOVA håller ett enskilt övergripande test på 5 procent, och Tukey HSD justerar de parvisa jämförelserna.

ANOVA är ett standardfilter för funktionsval: det rangordnar kategoriska prediktorer efter hur starkt de separerar ett numeriskt mål. AI-team använder det också för att jämföra modellvarianter över korsvalideringsveck.

Ja. AI-assistenter kan förklara frihetsgrader, översätta p-värden till enkelt språk och flagga antagandebrott i diagnostiska diagram. Bekräfta alltid avläsningen mot dina egna leveneTest()- och shapiro.test()-resultat.

Sammanfatta detta inlägg med: