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.

  • 📐 Statistică de bază: Raportul F împarte variabilitatea între grupuri la variabilitatea în cadrul grupului, astfel încât valorile mai mari contrazic egalitatea mediilor.
  • 🧪 Sintaxă unidirecțională: aov(time~poison, data = df) urmată de summary() returnează gradele de libertate, valoarea F și valoarea p.
  • Verificări ale presupunerilor: Testați independența, normalitatea reziduurilor cu shapiro.test() și egalitatea varianței cu leveneTest() înainte de a acorda încredere valorii p.
  • 🔎 Analiză post-hoc: TukeyHSD() compară fiecare pereche de grupuri, menținând rata de eroare la nivel de familie la nivelul specificat.
  • 🧮 Extensie bidirecțională: aov(time~poison + treat, data = df) adaugă un al doilea factor, iar poison:treat adaugă termenul de interacțiune.
  • 📊 Rezultatele lecturii: O valoare p sub 0.05 respinge ipoteza nulă a mediilor egale, dar nu identifică niciodată care grup diferă.

ANOVA în R One Way Two Way

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.

Interpretarea testului ANOVA

î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.

Interpretarea testului ANOVA

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:

Exemplu de test ANOVA unidirecțional

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:

Comparație în perechi

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

Întrebări frecvente

Valoarea F este raportul dintre varianța între grupuri și varianța în cadrul grupului. Valorile apropiate de 1 sugerează că mediile grupurilor sunt similare. Valorile mari indică faptul că grupurile sunt extrase din populații cu medii diferite.

Folosește oneway.test() cu var.equal = FALSE când varianțele sunt inegale și kruskal.test() când reziduurile sunt în mod clar nenormale. Transformarea unui răspuns asimetric cu log() restabilește adesea atât normalitatea, cât și egalitatea varianței.

Fiecare test t are propriul risc fals pozitiv de 5%. Trei teste perechi cresc rata de eroare la nivel de familie la aproximativ 14%. ANOVA menține un singur test general la 5%, iar Tukey HSD ajustează comparațiile perechi.

ANOVA este un filtru standard de selecție a caracteristicilor: clasifică predictorii categorici în funcție de cât de mult separă o țintă numerică. Echipele de inteligență artificială îl folosesc și pentru a compara variantele modelului în mai multe etape de validare încrucișată.

Da. Asistenții inteligenți artificiali pot explica gradele de libertate, pot traduce valorile p în limbaj simplu și pot semnala încălcări ale ipotezelor în graficele de diagnosticare. Confirmați întotdeauna citirea cu propriile rezultate leveneTest() și shapiro.test().

Rezumați această postare cu: