ANOVA in R: test a una e due vie con esempi

โšก Riepilogo intelligente

In R, l'ANOVA confronta le medie di tre o piรน gruppi suddividendo la variazione totale in componenti tra gruppi e all'interno dei gruppi. Questa procedura guidata esegue test a una e due vie sul dataset dei veleni, verifica le ipotesi e isola le coppie differenti con il test HSD di Tukey.

  • ๐Ÿ“ Statistica fondamentale: Il rapporto F divide la variabilitร  tra i gruppi per la variabilitร  all'interno dei gruppi, quindi valori piรน elevati depongono contro l'ipotesi di medie uguali.
  • ๐Ÿงช Sintassi unidirezionale: aov(time~poison, data = df) seguito da summary() restituisce i gradi di libertร , il valore F e il valore p.
  • โœ… Verifiche delle ipotesi: Prima di fidarsi del valore p, verificare l'indipendenza, la normalitร  dei residui con shapiro.test() e l'uguaglianza delle varianze con leveneTest().
  • ๐Ÿ”Ž Analisi post hoc: La funzione TukeyHSD() confronta ogni coppia di gruppi mantenendo il tasso di errore complessivo per famiglia al livello specificato.
  • ๐Ÿงฎ Estensione bidirezionale: aov(time~poison + treat, data = df) aggiunge un secondo fattore e poison:treat aggiunge il termine di interazione.
  • ๐Ÿ“Š Risultati della lettura: Un valore p inferiore a 0.05 rifiuta l'ipotesi nulla di medie uguali, ma non identifica mai quale gruppo differisce.

ANOVA in R A una via A due vie

Cos'รจ l'ANOVA?

Analisi della varianza (ANOVA) รจ una tecnica statistica utilizzata per confrontare le medie di due o piรน gruppi. Il test funziona suddividendo la variazione totale in una misurazione nella parte spiegata dall'appartenenza al gruppo e nella parte rimanente come rumore casuale. L'ANOVA in R quindi ti dice se almeno una media di gruppo differisce dalle altre, non quale. รˆ un'estensione diretta dell' test t in situazioni in cui la variabile fattoriale ha piรน di due livelli.

Prima di eseguire un test, รจ utile sapere quale membro della famiglia ANOVA si adatta al proprio disegno sperimentale.

Tipi di test ANOVA in R

L'ANOVA รจ una famiglia di test, non una singola procedura. La scelta del test piรน adatto dipende dal numero di fattori da considerare e dalle modalitร  di raccolta dei dati.

Test Quando usarlo Chiamata R
ANOVA a senso unico Un fattore con tre o piรน livelli aov(y ~ x, dati = df)
ANOVA a due vie Due fattori indipendenti aov(y ~ x1 + x2, dati = df)
Interazione bidirezionale L'effetto di un fattore dipende dall'altro aov(y ~ x1 * x2, dati = df)
ANOVA a misure ripetute Gli stessi soggetti misurati piรน di una volta aov(y ~ x + Errore(soggetto/x))
ANCORA รˆ necessario controllare una covariata continua per aov(y ~ x + covariata, dati = df)
MANOVA Due o piรน variabili di risposta contemporaneamente manova(cbind(y1, y2) ~ x)

Questo tutorial illustra le prime tre varianti. Le varianti rimanenti utilizzano la stessa interfaccia aov(), quindi una volta che si รจ in grado di leggere una tabella di output, si possono leggere tutte.

ANOVA vs. test t in R: differenze principali

Entrambi i test confrontano le medie, quindi รจ opportuno precisare in che punto uno sostituisce l'altro.

Criteri Prova T ANOVA
Numero di gruppi Esattamente due Due o piรน
Statistica di prova t F, uguale a t al quadrato quando ci sono due gruppi
Risultato Indica la direzione della differenza Solo segnalano che esiste una differenza
รˆ necessario un follow-up Nona Test post hoc come Tukey HSD
funzione R t.test() aov()

La tentazione con tre gruppi รจ quella di eseguire tre test t separati. Resisti. Ogni test ha il suo tasso di errore del 5%, quindi tre confronti portano la probabilitร  di un falso positivo a circa il 14%. L'ANOVA risponde alla stessa domanda con un singolo test, e il test HSD di Tukey gestisce quindi i dettagli a coppie con il tasso di errore tenuto sotto controllo. Per il caso di due gruppi, vedere il tutorial sul test t.

ANOVA a senso unico

Esistono molte situazioni in cui รจ necessario confrontare la media tra piรน gruppi. Ad esempio, il reparto marketing vuole sapere se tre team hanno le stesse prestazioni di vendita.

  • Squadra: fattore di livello 3: A, B e C
  • Vendita: una misura della performance

Il test ANOVA puรฒ stabilire se i tre gruppi hanno prestazioni simili.

Per chiarire se i dati provengono dalla stessa popolazione, รจ possibile eseguire a analisi della varianza unidirezionale (ANOVA a una via d'ora in poi). Come qualsiasi altro test statistico, fornisce prove sulla possibilitร  di rifiutare l'ipotesi H0. Si noti che non rifiutare H0 non equivale a dimostrarne la veridicitร .

Ipotesi nel test ANOVA unidirezionale

  • H0: le medie tra i gruppi sono identiche
  • H1: Almeno, la media di un gruppo รจ diversa

In altre parole, non rifiutare H0 significa che non ci sono prove sufficienti per concludere che la media di un gruppo differisce da quella degli altri.

Questo test รจ simile al test t, ma l'ANOVA รจ la scelta corretta quando ci sono piรน di due gruppi. Con esattamente due gruppi, i due test sono equivalenti e la statistica F รจ uguale al quadrato della statistica t.

Ipotesi

L'ANOVA a una via si basa su tre condizioni: le osservazioni sono campionate in modo casuale e indipendenti l'una dall'altra, i residui all'interno di ciascun gruppo sono approssimativamente distribuiti normalmente e la varianza รจ la stessa in ogni gruppo (omogeneitร  della varianza). La sezione sulla verifica delle ipotesi, riportata di seguito, mostra come testare ciascuna di esse in R.

Interpretare il test ANOVA

La statistica F viene utilizzata per verificare se i dati provengono da popolazioni significativamente diverse, ovvero medie campionarie diverse.

Per calcolare la statistica F, รจ necessario dividere il variabilitร  tra gruppi sulla variabilitร  allโ€™interno del gruppo.

Migliori tra gruppi La variabilitร  riflette quanto la media di ciascun gruppo si discosti dalla media generale. Confronta i due grafici sottostanti per comprendere meglio il concetto.

Il grafico a sinistra mostra pochissima variazione tra i tre gruppi, quindi tutte e tre le medie dei gruppi sono vicine a complessivo significare.

Il grafico a destra mostra tre distribuzioni molto distanti tra loro e senza sovrapposizioni, quindi il divario tra la media complessiva e la media di ciascun gruppo รจ ampio.

Interpretare il test ANOVA

Migliori all'interno del gruppo La variabilitร  misura quanto le singole osservazioni si discostano dalla media del proprio gruppo. Alcuni punti si trovano molto distanti dalla media del gruppo e il termine "all'interno del gruppo" cattura proprio questa dispersione, che rappresenta l'errore di campionamento.

Per comprendere visivamente il concetto di variabilitร  all'interno del gruppo, guarda il grafico qui sotto.

La parte sinistra mostra la distribuzione di tre gruppi diversi. Hai aumentato la dispersione di ciascun campione ed รจ chiaro che la varianza individuale รจ elevata. La statistica F diminuisce, quindi non puoi rifiutare l'ipotesi nulla.

La parte destra mostra campioni con la stessa media ma con una dispersione molto inferiore. Ciรฒ aumenta la statistica F e depone a favore dell'ipotesi alternativa.

Interpretare il test ANOVA

รˆ possibile utilizzare entrambe le misure per costruire le statistiche F. รˆ molto intuitivo comprendere la statistica F. Se il numeratore aumenta, significa che la variabilitร  tra gruppi รจ elevata ed รจ probabile che i gruppi del campione provengano da distribuzioni completamente diverse.

In altre parole, un basso valore della statistica F indica una differenza minima o nulla tra le medie dei gruppi.

Esempio di test ANOVA unidirezionale

Utilizzerai il dataset poison per implementare il test ANOVA unidirezionale. Il dataset contiene 48 righe e 3 variabili:

  • Tempo: tempo di sopravvivenza dell'animale
  • veleno: Tipo di veleno utilizzato: livello di fattore: 1,2 e 3
  • trattare: Tipo di trattamento utilizzato: livello di fattore: 1,2 e 3

Prima di iniziare a calcolare il test ANOVA, รจ necessario preparare i dati come segue:

  • Passaggio 1: importa i dati
  • Passaggio 2: rimuovere la variabile non necessaria
  • Passaggio 3: converti la variabile veleno come livello ordinato
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)

Produzione:

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

Il nostro obiettivo รจ testare la seguente ipotesi:

  • H0: non vi รจ alcuna differenza nella media del tempo di sopravvivenza tra i gruppi
  • H1: La media del tempo di sopravvivenza รจ diversa per almeno un gruppo.

In altre parole, si vuole sapere se esiste una differenza statisticamente significativa tra la media del tempo di sopravvivenza in base al tipo di veleno somministrato alla cavia.

Procederai come segue:

  • Passaggio 1: controlla il formato della variabile veleno
  • Passaggio 2: stampare la statistica riassuntiva: conteggio, media e deviazione standard
  • Passaggio 3: tracciare un box plot
  • Passaggio 4: calcolare il test ANOVA unidirezionale
  • Passaggio 5: Eseguire un confronto a coppie con Tukey HSD

Passo 1) Verifica i livelli di veleno con il codice seguente. Dovresti visualizzare tre valori di tipo carattere, poichรฉ il verbo mutate ha convertito la colonna in un fattore ordinato.

levels(df$poison)

Produzione:

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

Passo 2) Si calcola la media e la deviazione standard.

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

Produzione:

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

Passo 3) Nel passaggio tre, puoi verificare graficamente se c'รจ una differenza tra la distribuzione. Tieni presente che includi il punto tremolante.

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

Produzione:

Esempio di test ANOVA unidirezionale

Passo 4) Puoi eseguire il test ANOVA unidirezionale con il comando aov. La sintassi di base per un test ANOVA รจ:

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

La sintassi della formula รจ:

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

Ora puoi rispondere alla domanda: c'รจ qualche differenza nel tempo di sopravvivenza tra le cavie, a seconda del tipo di veleno somministrato?

Memorizza il modello in un oggetto e passalo alla funzione summary() per ottenere una stampa leggibile dei risultati.

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

Code Spiegazione

  • aov(time ~ poison, data = df): esegui il test ANOVA con la seguente formula
  • summary(anova_one_way): Stampa il riepilogo del test

Produzione:

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

Il valore p รจ 7.66e-05, ben al di sotto della soglia usuale di 0.05, e le tre stelle indicano il codice di significativitร  piรน forte. รˆ possibile rifiutare H0 e concludere che almeno un gruppo di veleni ha un tempo di sopravvivenza medio diverso.

Come verificare le ipotesi dell'ANOVA in R

Il valore p di un'analisi ANOVA รจ affidabile solo se vengono soddisfatte le tre condizioni elencate in precedenza. Ciascuna di esse ha una verifica diretta in R, e tutte vengono eseguite sull'oggetto modello adattato.

1. Indipendenza delle osservazioni. Questa รจ una caratteristica del disegno dello studio, non dei dati, quindi nessun test puรฒ porvi rimedio. Ogni cavia deve essere misurata una sola volta e assegnata al suo gruppo in modo casuale. Se lo stesso soggetto compare in piรน righe, รจ necessario utilizzare un modello a misure ripetute.

2. Normalitร  dei residui. L'ANOVA presuppone che i residui, e non i dati grezzi, seguano una distribuzione approssimativamente normale. Esamina il grafico QQ e conferma con il test di Shapiro-Wilk:

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

shapiro.test(residuals(anova_one_way))

I punti che si trovano lungo la diagonale del grafico QQ normale indicano residui distribuiti normalmente. Un valore p del test di Shapiro-Wilk superiore a 0.05 significa che non รจ possibile rifiutare l'ipotesi di normalitร .

3. Omogeneitร  della varianza. Ogni gruppo dovrebbe mostrare una dispersione simile. Il grafico dei residui rispetto ai valori previsti dovrebbe apparire come una banda piatta piuttosto che come un imbuto. Confermatelo con il test di Levene, che รจ piรน robusto alla non normalitร  rispetto al test di Bartlett:

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

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

Un valore p superiore a 0.05 supporta l'uguaglianza delle varianze.

Cosa fare quando un'ipotesi si rivela errata. Se le varianze sono disuguali, esegui oneway.test(time ~ poison, data = df, var.equal = FALSE), la correzione di Welch. Se i residui non sono chiaramente normali e il campione รจ piccolo, passa al test di rango di Kruskal-Wallis, kruskal.test(time ~ poison, data = df). Con campioni ampi e bilanciati, l'ANOVA รจ abbastanza robusta a deviazioni moderate dalla normalitร , quindi un risultato al limite del test di Shapiro-Wilk raramente รจ fatale.

Confronto a coppie

Un test F significativo indica che le medie dei gruppi non sono tutte uguali, ma non quale coppia differisce. Il test di Tukey per la differenza significativa onesta risponde a questa domanda confrontando ogni coppia e controllando il tasso di errore complessivo.

TukeyHSD(anova_one_way)

Produzione:

Confronto a coppie

Leggi l'output una riga per coppia. diff la colonna contiene la differenza tra le medie dei due gruppi, lwr and licenza delimitare l'intervallo di confidenza del 95% per tale differenza e p adj Il valore p รจ corretto per confronti multipli. Una coppia differisce significativamente quando il suo intervallo esclude lo zero, equivalentemente quando p adj รจ inferiore a 0.05. In questo set di dati, i confronti che coinvolgono il veleno 3 sono quelli significativi, il che corrisponde al box plot: il gruppo 3 ha un tempo di sopravvivenza medio nettamente inferiore rispetto ai gruppi 1 e 2, mentre i gruppi 1 e 2 sono statisticamente indistinguibili tra loro.

ANOVA a due vie

Un'ANOVA a due vie aggiunge un secondo fattore alla formula. Funziona esattamente come il test a una via, cambia solo la formula:

y ~ x1 + x2

Qui y rappresenta la variabile di risposta quantitativa, mentre x1 e x2 sono entrambi fattori categoriali.

Ipotesi nel test ANOVA bidirezionale

  • H0: Le medie di gruppo sono uguali per entrambe le variabili fattoriali
  • H1: Almeno una media di gruppo differisce, per almeno uno dei due fattori

Si aggiunge la variabile "trattamento" al modello. Questa variabile registra il trattamento somministrato alla cavia. La formula additiva riportata di seguito verifica se ciascun fattore influisce sul tempo di sopravvivenza singolarmente, dopo aver tenuto conto degli altri.

Modifica il codice aggiungendo "treat" accanto alla prima variabile indipendente.

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

Produzione:

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

Entrambi i valori p (5.7e-07 per il veleno e 6.7e-06 per il trattamento) sono ben al di sotto di 0.05, quindi si rifiuta H0 per entrambi i fattori e si conclude che la modifica del veleno o del trattamento influisce sul tempo di sopravvivenza.

Aggiunta di un termine di interazione

Il modello additivo sopra riportato presuppone che l'effetto del veleno sia lo stesso indipendentemente dal trattamento. Per verificare tale presupposto, sostituite il segno piรน con un asterisco, che rappresenta sia gli effetti principali che la loro interazione:

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

Se la riga veleno:trattamento non รจ significativa, il modello additivo รจ la scelta migliore perchรฉ richiede un minor numero di gradi di libertร .

ANOVA in R: Guida rapida al test

La tabella seguente elenca ciascun test utilizzato in precedenza, la chiamata R che lo esegue e l'ipotesi che valuta:

Test Code Ipotesi P-value
ANOVA unidirezionale
aov(y ~ X, data = df)
H1: la media รจ diversa per almeno un gruppo 0.05
a coppie
TukeyHSD(ANOVA summary)
0.05
ANOVA bidirezionale
aov(y ~ X1 + X2, data = df)
H1: Almeno una media di gruppo differisce per entrambi i fattori 0.05

DOMANDE FREQUENTI

Il valore F รจ il rapporto tra la varianza tra i gruppi e la varianza all'interno dei gruppi. Valori prossimi a 1 suggeriscono che le medie dei gruppi sono simili. Valori elevati indicano che i gruppi provengono da popolazioni con medie diverse.

Utilizzare oneway.test() con var.equal = FALSE quando le varianze sono disuguali e kruskal.test() quando i residui non sono chiaramente distribuiti normalmente. La trasformazione di una risposta asimmetrica con log() spesso ripristina sia la normalitร  che l'uguaglianza delle varianze.

Ogni test t comporta un rischio di falsi positivi del 5%. Tre test a coppie aumentano il tasso di errore complessivo a circa il 14%. L'ANOVA mantiene un singolo test complessivo al 5%, e il test HSD di Tukey corregge i confronti a coppie.

L'ANOVA รจ un filtro standard per la selezione delle caratteristiche: classifica i predittori categorici in base alla loro capacitร  di separare un valore target numerico. I team di intelligenza artificiale la utilizzano anche per confrontare le varianti del modello tra i diversi fold della convalida incrociata.

Sรฌ. Gli assistenti IA possono spiegare i gradi di libertร , tradurre i valori p in un linguaggio semplice e segnalare le violazioni delle ipotesi nei grafici diagnostici. Conferma sempre la lettura confrontandola con i tuoi risultati ottenuti con leveneTest() e shapiro.test().

Riassumi questo post con: