ANOVA în R: Test unidirecțional și bidirecțional cu exemple
⚡ Rezumat inteligent
ANOVA în R compară mediile a trei sau mai multe grupuri prin împărțirea variației totale în componente între grupuri și în cadrul grupului. Această demonstrație execută teste unidirecționale și bidirecționale pe setul de date despre otrăvuri, verifică ipotezele și izolează perechi diferite cu Tukey HSD.

Ce este ANOVA?
Analiza variatiei (ANOVA) este o tehnică statistică utilizată pentru a compara mediile a două sau mai multe grupuri. Testul funcționează prin împărțirea variației totale a unei măsurători în partea explicată prin apartenența la un grup și partea rămasă ca zgomot aleatoriu. Prin urmare, ANOVA în R vă spune dacă cel puțin o medie a grupului diferă de celelalte, nu care dintre ele. Este o extensie directă a testul t la situații în care variabila factor are mai mult de două niveluri.
Înainte de a rula un test, este util să știți care membru al familiei ANOVA se potrivește designului dumneavoastră.
Tipuri de teste ANOVA în R
„ANOVA” este o familie de teste, nu o singură procedură. Alegerea membrului potrivit depinde de numărul de factori pe care îi aveți și de modul în care au fost colectate datele.
| Testare | Când să-l folosiți | Apel R |
|---|---|---|
| ANOVA cu sens unic | Un factor cu trei sau mai multe niveluri | aov(y ~ x, date = dl) |
| ANOVA în două sensuri | Doi factori independenți | aov(y ~ x1 + x2, date = df) |
| Bidirecțional cu interacțiune | Efectul unui factor depinde de celălalt | aov(y ~ x1 * x2, date = dl) |
| ANOVA cu măsurători repetate | Aceiași subiecți au măsurat de mai multe ori | aov(y ~ x + Error(subject/x)) |
| ANCOVA | O covariabilă continuă trebuie controlată pentru | aov(y ~ x + covariabilă, date = dl) |
| MANOVA | Două sau mai multe variabile de răspuns simultan | manova(cbind(y1, y2) ~ x) |
Acest tutorial acoperă primele trei. Variantele rămase folosesc aceeași interfață aov(), așa că odată ce puteți citi un tabel de ieșire, le puteți citi pe toate.
ANOVA vs. testul T în R: Diferențe cheie
Ambele teste compară mediile, așa că merită să fim precisi în ceea ce privește locul în care unul îl înlocuiește pe celălalt.
| Criterii | Testul T | ANOVA |
|---|---|---|
| Numărul de grupuri | Exact două | Două sau mai multe |
| Statistici de testare | t | F, egal cu t la pătrat când există două grupuri |
| Rezultat | Numește direcția diferenței | Raportează doar că există o diferență |
| Urmărire necesară | Nici unul | Test post-hoc, cum ar fi Tukey HSD |
| Funcția R | t.test() | aov() |
Tentația cu trei grupuri este de a rula trei teste t separate. Rezistați. Fiecare test are propria rată de eroare de 5%, așa că trei comparații cresc șansa unui rezultat fals pozitiv la aproximativ 14%. ANOVA răspunde aceleiași întrebări cu un singur test, iar Tukey HSD se ocupă apoi de detaliile perechi, ținând rata de eroare sub control. Pentru cazul cu două grupuri, consultați tutorial test t.
ANOVA cu sens unic
Există multe situații în care trebuie să comparați media dintre mai multe grupuri. De exemplu, departamentul de marketing vrea să știe dacă trei echipe au aceeași performanță de vânzări.
- Echipa: factor de nivel 3: A, B și C
- Vânzare: o măsură a performanței
Testul ANOVA poate spune dacă cele trei grupuri au performanțe similare.
Pentru a clarifica dacă datele provin de la aceeași populație, puteți efectua a analiza unidirecțională a varianței (denumită în continuare ANOVA cu o singură direcție). Ca orice alt test statistic, acesta oferă dovezi despre dacă ipoteza H0 poate fi respinsă. Rețineți că eșecul de a respinge H0 nu este același lucru cu demonstrarea veridicității acesteia.
Ipoteza în testul ANOVA unidirecțional
- H0: Mijloacele dintre grupuri sunt identice
- H1: Cel puțin, media unui grup este diferită
Cu alte cuvinte, eșecul de a respinge H0 înseamnă că nu există suficiente dovezi pentru a concluziona că vreo medie de grup diferă de celelalte.
Acest test este similar cu testul t, dar ANOVA este alegerea corectă atunci când există mai mult de două grupuri. Cu exact două grupuri, cele două teste sunt echivalente, iar statistica F este egală cu pătratul statisticii t.
Presupuneri
ANOVA unidirecțională se bazează pe trei condiții: observațiile sunt eșantionate aleatoriu și independente unele de altele, reziduurile din fiecare grup sunt distribuite aproximativ normal, iar varianța este aceeași în fiecare grup (omogenitatea varianței). Secțiunea de mai jos despre verificarea ipotezelor arată cum se testează fiecare dintre ele în R.
Interpretarea testului ANOVA
Statistica F este utilizată pentru a testa dacă datele provin din populații semnificativ diferite, adică medii diferite ale eșantionului.
Pentru a calcula statistica F, trebuie să împărțiți variabilitate între grupuri peste variabilitate în cadrul grupului.
între-grup Variabilitatea reflectă cât de departe se află media fiecărui grup față de media generală. Comparați cele două grafice de mai jos pentru a înțelege ideea.
Graficul din stânga arată o variație foarte mică între cele trei grupuri, astfel încât mediile tuturor celor trei grupuri se situează aproape de global Rău.
Graficul din dreapta prezintă trei distribuții depărtate una de cealaltă, fără suprapunere, deci diferența dintre media generală și media fiecărui grup este mare.
în cadrul grupului Variabilitatea măsoară cât de departe se abat observațiile individuale de media propriului grup. Unele puncte se află departe de media grupului lor, iar termenul intragrup surprinde exact această dispersie, care este eroarea de eșantionare.
Pentru a înțelege vizual conceptul de variabilitate în cadrul grupului, priviți graficul de mai jos.
Partea din stânga reprezintă grafic distribuția a trei grupuri diferite. Ați mărit dispersia fiecărui eșantion și este clar că varianța individuală este mare. Statistica F scade, deci nu ați putea respinge ipoteza nulă.
Partea din dreapta prezintă eșantioane cu aceleași medii, dar cu o dispersie mult mai mică. Aceasta ridică statistica F și indică în favoarea ipotezei alternative.
Puteți utiliza ambele măsuri pentru a construi statisticile F. Este foarte intuitiv să înțelegeți statistica F. Dacă numărătorul crește, înseamnă că variabilitatea între grupuri este mare și este probabil că grupurile din eșantion sunt extrase din distribuții complet diferite.
Cu alte cuvinte, o statistică F scăzută indică o diferență mică sau deloc semnificativă între mediile grupurilor.
Exemplu Test ANOVA unidirecțional
Veți folosi setul de date otrăvire pentru a implementa testul ANOVA unidirecțional. Setul de date conține 48 de rânduri și 3 variabile:
- Timp: timpul de supraviețuire al animalului
- otravă: Tip de otravă utilizată: nivel de factor: 1,2 și 3
- trata: Tip de tratament utilizat: nivel de factor: 1,2 și 3
Înainte de a începe să calculați testul ANOVA, trebuie să pregătiți datele după cum urmează:
- Pasul 1: importați datele
- Pasul 2: Eliminați variabilele inutile
- Pasul 3: Convertiți otrava variabilă ca nivel comandat
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)
ieșire:
## 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, ...
Obiectivul nostru este să testăm următoarea ipoteză:
- H0: Nu există nicio diferență în media timpului de supraviețuire între grup
- H1: Media timpului de supraviețuire este diferită pentru cel puțin un grup.
Cu alte cuvinte, vrei să știi dacă există o diferență statistică între media timpului de supraviețuire în funcție de tipul de otravă administrată cobaiului.
Veți proceda după cum urmează:
- Pasul 1: Verificați formatul otravii variabile
- Pasul 2: Imprimați statistica rezumată: numărare, medie și abatere standard
- Pasul 3: Trasează un diagramă cu casete
- Pasul 4: Calculați testul ANOVA unidirecțional
- Pasul 5: Rulați o comparație în perechi cu Tukey HSD
Pas 1) Verificați nivelurile de otravă cu codul de mai jos. Ar trebui să vedeți valori de trei caractere, deoarece verbul mutant a convertit coloana într-un factor ordonat.
levels(df$poison)
ieșire:
## [1] "1" "2" "3"
Pas 2) Calculați media și abaterea standard.
df %>% group_by(poison) %>% summarise( count_poison = n(), mean_time = mean(time, na.rm = TRUE), sd_time = sd(time, na.rm = TRUE) )
ieșire:
## # 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
Pas 3) În pasul trei, puteți verifica grafic dacă există o diferență între distribuție. Rețineți că includeți punctul agitat.
ggplot(df, aes(x = poison, y = time, fill = poison)) + geom_boxplot() + geom_jitter(shape = 15, color = "steelblue", position = position_jitter(0.21)) + theme_classic()
ieșire:
Pas 4) Puteți rula testul ANOVA unidirecțional cu comanda aov. Sintaxa de bază pentru un test ANOVA este:
aov(formula, data)
Arguments:
- formula: The equation you want to estimate
- data: The dataset used
Sintaxa formulei este:
y ~ X1+ X2+...+Xn # X1 + X2 +... refers to the independent variables y ~ . # use all the remaining variables as independent variables
Acum puteți răspunde la întrebarea: există vreo diferență în timpul de supraviețuire între cobai, având în vedere tipul de otravă administrată?
Stochează modelul într-un obiect și transmite-l către summary() pentru a obține o imprimare lizibilă a rezultatelor.
anova_one_way <- aov(time~poison, data = df) summary(anova_one_way)
Code Explicație
- aov(time ~ poison, data = df): Rulați testul ANOVA cu următoarea formulă
- summary(anova_one_way): Imprimați rezumatul testului
ieșire:
## 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
Valoarea p este de 7.66e⁻⁵, mult sub pragul obișnuit de 0.05, iar cele trei stele marchează codul cu cea mai mare semnificație. Puteți respinge H0 și concluziona că cel puțin un grup de otrăvuri are un timp mediu de supraviețuire diferit.
Cum se verifică ipotezele ANOVA în R
O valoare p ANOVA este de încredere doar atunci când sunt îndeplinite cele trei condiții enumerate anterior. Fiecare dintre ele are o verificare directă în R și toate rulează pe obiectul modelului ajustat.
1. Independența observațiilor. Aceasta este o proprietate a designului studiului, nu a datelor, deci niciun test nu o poate salva. Fiecare cobai trebuie măsurat o singură dată și atribuit grupului său în mod aleatoriu. Dacă același subiect apare pe mai multe rânduri, aveți nevoie în schimb de un model cu măsurători repetate.
2. Normalitatea reziduurilor. ANOVA presupune că reziduurile, nu datele brute, sunt aproximativ normale. Inspectați graficul QQ și confirmați cu testul Shapiro-Wilk:
par(mfrow = c(2, 2)) plot(anova_one_way) # four diagnostic plots shapiro.test(residuals(anova_one_way))
Punctele care îmbrățișează diagonala graficului Normal QQ indică reziduuri normale. O valoare p Shapiro-Wilk peste 0.05 înseamnă că nu se poate respinge normalitatea.
3. Omogenitatea varianței. Fiecare grup ar trebui să prezinte o dispersie similară. Diagrama Reziduuri vs. Ajustare ar trebui să arate ca o bandă plată, mai degrabă decât ca o pâlnie. Confirmați acest lucru cu testul Levene, care este mai robust la non-normalitate decât cel al lui Bartlett:
library(car)
leveneTest(time ~ poison, data = df)
bartlett.test(time ~ poison, data = df)
O valoare p peste 0.05 susține varianțe egale.
Ce trebuie făcut când o presupunere eșuează. Dacă varianțele sunt inegale, se execută oneway.test(time ~ poison, data = df, var.equal = FALSE), corecția Welch. Dacă reziduurile sunt în mod clar nenormale și eșantionul este mic, se trece la testul de rang Kruskal-Wallis, kruskal.test(time ~ poison, data = df). Cu eșantioane mari echilibrate, ANOVA este destul de robustă până la abateri moderate de la normalitate, astfel încât un rezultat Shapiro-Wilk la limită este rareori fatal.
Comparație în perechi
Un test F semnificativ vă spune că mediile grupurilor nu sunt toate egale, dar nu și care pereche diferă. Testul Tukey Honest Significant Difference răspunde la această întrebare comparând fiecare pereche, controlând în același timp rata de eroare la nivel de familie.
TukeyHSD(anova_one_way)
ieșire:
Citește ieșirea câte un rând per pereche. dif coloana conține diferența dintre cele două medii ale grupurilor, lwr și licență a limitat intervalul de încredere de 95% pentru acea diferență și p. adj. este valoarea p ajustată pentru comparații multiple. O pereche diferă semnificativ atunci când intervalul său exclude zero, în mod echivalent atunci când p adj este sub 0.05. În acest set de date, comparațiile care implică otrava 3 sunt cele semnificative, ceea ce corespunde diagramei: grupul 3 are un timp mediu de supraviețuire clar mai mic decât grupurile 1 și 2, în timp ce grupurile 1 și 2 sunt statistic imposibil de distins unul de celălalt.
ANOVA în două sensuri
O ANOVA cu două căi adaugă un al doilea factor formulei. Funcționează exact ca testul unidirecțional, doar că formula se schimbă:
y ~ x1 + x2
Aici y este variabila cantitativă de răspuns, în timp ce x1 și x2 sunt ambii factori categorici.
Ipoteza în testul ANOVA în două sensuri
- H0: Mediile grupurilor sunt egale pentru ambele variabile factoriale
- H1: Cel puțin o medie a grupului diferă pentru cel puțin unul dintre cei doi factori
Adăugați variabila „tratament” la model. Această variabilă înregistrează tratamentul administrat cobaiului. Formula aditivă de mai jos testează dacă fiecare factor afectează timpul de supraviețuire în mod independent, după luarea în considerare a celuilalt.
Ajustați codul adăugând „treat” alături de prima variabilă independentă.
anova_two_way <- aov(time~poison + treat, data = df) summary(anova_two_way)
ieșire:
## 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 ## ---
Ambele valori p (5.7e-07 pentru otravă și 6.7e-06 pentru tratament) sunt mult sub 0.05, deci respingeți H0 pentru ambii factori și concluzionați că schimbarea fie a otrăvii, fie a tratamentului afectează timpul de supraviețuire.
Adăugarea unui termen de interacțiune
Modelul aditiv de mai sus presupune că efectul otrăvii este același indiferent de tratament. Pentru a testa această presupunere, înlocuiți semnul plus cu un asterisc, care se potrivește atât cu efectele principale, cât și cu interacțiunea dintre ele:
anova_interaction <- aov(time~poison * treat, data = df) summary(anova_interaction)
Dacă rândul poison:treat nu este semnificativ, modelul aditiv este alegerea mai bună deoarece folosește mai puține grade de libertate.
ANOVA în R: Referință rapidă pentru teste
Tabelul de mai jos listează fiecare test utilizat mai sus, apelul R care îl execută și ipoteza pe care o evaluează:
| Testare | Code | Ipoteză | P-valoare |
|---|---|---|---|
| ANOVA într-un singur sens |
aov(y ~ X, data = df)
|
H1: Media este diferită pentru cel puțin un grup | 0.05 |
| Perechi |
TukeyHSD(ANOVA summary) |
0.05 | |
| ANOVA cu două sensuri |
aov(y ~ X1 + X2, data = df)
|
H1: Cel puțin o medie a grupului diferă pentru oricare dintre factori | 0.05 |




