Visualizzazione post con etichetta leveneTest(). Mostra tutti i post
Visualizzazione post con etichetta leveneTest(). Mostra tutti i post

sabato 21 dicembre 2024

Analisi della varianza a due fattori con replicati

L'analisi della varianza o ANOVA – denominazione tradizionalmente impiegata per indicare una serie di tecniche che, a dispetto del nome, consentono di effettuare un confronto globale tra più medie – è stata presentata e illustrata in tutti i suoi aspetti in due post ai quali si rimanda [1].

Qui impieghiamo lo stesso disegno sperimentale riportato per l'analisi della varianza a due fattori e cioè


ma questa volta ciascuna delle misure di produzione per macchina/operatore è stata ripetuta quattro volte al fine di migliorarne la stima. Così ad esempio per macchina i=1 operatore j=2 nel file di dati che impieghiamo oltre al valore singolo 45.7 riportato qui sopra nella tabella originaria abbiamo in aggiunta le misure 46.9, 49.1 e 45.2 (questi dati sono stati evidenziati in colore nei dati riportati qui sotto) e quindi in totale quattro misure replicate. Questo è il disegno sperimentale tipico della analisi della varianza a due fattori con replicati.

Per proseguire è necessario:
→ effettuare il download del file di dati anova2r.csv
→ salvare il file nella cartella C:\Rdati\

Per il file di dati trovate link e modalità di download alla pagina Dati, ma potete anche semplicemente copiare i dati riportati qui sotto aggiungendo un ↵ Invio al termine dell'ultima riga e salvarli in C:\Rdati\ in un file di testo denominato anova2r.csv (assicuratevi che il file sia effettivamente salvato con l'estensione .csv).

macchina;operatore;replicato;produzione
i1;j1;1;57.2
i1;j1;2;56.7
i1;j1;3;55.9
i1;j1;4;58.3
i1;j2;1;45.7
i1;j2;2;46.9
i1;j2;3;49.1
i1;j2;4;45.4
i1;j3;1;47.3
i1;j3;2;49.4
i1;j3;3;48.1
i1;j3;4;47.5
i1;j4;1;54.9
i1;j4;2;52.6
i1;j4;3;53.5
i1;j4;4;54.1
i1;j5;1;35.9
i1;j5;2;37.2
i1;j5;3;38.7
i1;j5;4;36.4
i2;j1;1;64.5
i2;j1;2;61.1
i2;j1;3;63.9
i2;j1;4;64.7
i2;j2;1;52.4
i2;j2;2;55.3
i2;j2;3;57.2
i2;j2;4;53.9
i2;j3;1;54.1
i2;j3;2;56.2
i2;j3;3;52.3
i2;j3;4;53.8
i2;j4;1;57.5
i2;j4;2;55.9
i2;j4;3;56.3
i2;j4;4;58.8
i2;j5;1;52.5
i2;j5;2;50.3
i2;j5;3;51.4
i2;j5;4;53.3
i3;j1;1;56.6
i3;j1;2;59.7
i3;j1;3;56.3
i3;j1;4;56.5
i3;j2;1;51.6
i3;j2;2;50.3
i3;j2;3;47.8
i3;j2;4;52.6
i3;j3;1;49.5
i3;j3;2;52.7
i3;j3;3;49.1
i3;j3;4;47.7
i3;j4;1;56.9
i3;j4;2;58.5
i3;j4;3;57.1
i3;j4;4;55.2
i3;j5;1;44.2
i3;j5;2;46.7
i3;j5;3;43.9
i3;j5;4;42.6

Per l'analisi della varianza anche in questo caso viene impiegata la funzione aov() impiegata per le altre [1] specificando questa volta che la variabilità deve essere decomposta in variabilità dovuta alla macchina, dovuta all'operatore e dovuta ai replicati eseguiti. 

Copiate e incollate nella Console di R questo script e premete ↵ Invio.

# ANOVA analisi della varianza a due fattori con replicati
#
mydata <- read.table("c:/Rdati/anova2r.csv", header=TRUE, sep=";", dec=".") # importa i dati 
#
anova2r <- aov(produzione~macchina+operatore+replicato, data=mydata) # calcola la variabilità tra macchine, operatori e replicati
#
summary(anova2r) # mostra i risultati
#

Il risultato della ANOVA

> summary(anova2r) # mostra i risultati
            Df Sum Sq Mean Sq F value   Pr(>F)    
macchina     2  602.8   301.4  54.792 1.58e-13 ***
operatore    4 1552.2   388.1  70.544  < 2e-16 ***
replicato    1    0.3     0.3   0.048    0.827    
Residuals   52  286.0     5.5                     
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

ci dice che le differenze di produzione tra le tre macchine e le differenze di produzione tra i cinque operatori sono significative, mentre le misure di produzione replicate all'interno della stessa coppia macchina/operatore non differiscono significativamente (p=0.827).

Possiamo avere anche un riscontro grafico dei dati, copiate e incollate nella Console di R queste righe e premete ↵ Invio.

# traccia boxplot per macchina e operatore
#
boxplot(produzione~macchina+operatore, data=mydata) 
#

(per mostrare sulle ascisse i nomi di tutte le variabili, dopo avere generato il grafico ho "afferrato" con il mouse il lato sinistro della finestra per allargarla)


A questo punto manca però la verifica che i dati siano conformi ai due assunti alla base dell'ANOVA, che abbiano cioè:
→ una distribuzione normale (gaussiana);
→ varianze omogenee;
due esigenze che abbiamo già illustrato nei precedenti post sulla ANOVA [1].

Per valutare la normalità (gaussianità) dei dati impieghiamo il test di normalità di Shapiro-Wilk, copiate queste ultime righe, incollatele nella Console di R e premete ↵ Invio:

# ANOVA verifica della normalità delle distribuzioni
#
mac <- split(mydata$produzione, mydata$macchina) # estrae e separa i dati di produzione per macchina
#
sapply(mac, shapiro.test) # verifica se i dati delle macchine sono distribuiti in modo gaussiano
#

La funzione split() estrae dall'oggetto mydata i dati di produzione (mydata$produzione) per ciascuna macchina (mydata$macchina) e li riporta, separatamente, nell'oggetto mac. Se digitate

mac 

potete vedere come sono organizzati i dati estratti per le tre macchine.

> mac
$i1
 [1] 57.2 56.7 55.9 58.3 45.7 46.9 49.1 45.4 47.3 49.4 48.1 47.5 54.9 52.6 53.5
[16] 54.1 35.9 37.2 38.7 36.4

$i2
 [1] 64.5 61.1 63.9 64.7 52.4 55.3 57.2 53.9 54.1 56.2 52.3 53.8 57.5 55.9 56.3
[16] 58.8 52.5 50.3 51.4 53.3

$i3
 [1] 56.6 59.7 56.3 56.5 51.6 50.3 47.8 52.6 49.5 52.7 49.1 47.7 56.9 58.5 57.1
[16] 55.2 44.2 46.7 43.9 42.6

A questo punto con la funzione sapply() il test di Shapiro-Wilk viene applicato automaticamente ai dati delle tre macchine.

> sapply(mac, shapiro.test) # verifica se i dati delle macchine sono distribuiti in modo gaussiano
          i1                            i2                           
statistic 0.9202174                     0.9052156                    
p.value   0.1000444                     0.05170547                   
method    "Shapiro-Wilk normality test" "Shapiro-Wilk normality test"
data.name "X[[i]]"                      "X[[i]]"                     
          i3                           
statistic 0.9449654                    
p.value   0.2970447                    
method    "Shapiro-Wilk normality test"
data.name "X[[i]]"   

I valori di p ci dicono che le distribuzioni possono essere considerate gaussiane, quindi questo assunto dell'ANOVA è rispettato. 

Ora valutiamo l'omogeneità delle varianze impiegando il test di Levene, copiate queste righe, incollatele nella Console di R e premete ↵ Invio:

# Test di Levene per l'omogeneità tra varianze
#
library(car) # carica il pacchetto necessario per eseguire il test
#
leveneTest(produzione~macchina, data=mydata) # verifica se le varianze risultano omogenee
#

Dopo avere caricato il pacchetto car il test di Levene viene eseguito impiegando la funzione leveneTest() sui dati di produzione per ciascuna delle tre macchine (produzione~macchina). Il messaggio di avvertimento può essere ignorato in quanto ci dice semplicemente che la funzione ha trasformato automaticamente la nostra variabile in una variabile "fattore".

> leveneTest(produzione~macchina, data=mydata) # verifica se le varianze risultano omogenee
Levene's Test for Homogeneity of Variance (center = median)
      Df F value  Pr(>F)  
group  2  2.4955 0.09142 .
      57                  
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1
Messaggio di avvertimento:
In leveneTest.default(y = y, group = group, ...) : group coerced to factor.

Il valor di p (0.09142) ci dice che le varianze sono omogenee, quindi anche questo assunto è rispettato.

La conclusione: stabilito che per i dati di produzione per macchina i due requisiti del modello statistico alla base dell'ANOVA sono rispettati, possiamo accettare il risultato della analisi della varianza a due fattori con replicati che ci dice che esiste una differenza statisticamente significativa tra le medie di produzione delle tre macchine (p=1.58e-13).

Sono lasciati come esercizio l'applicazione del test di normalità e del test di omogeneità tra varianze ai dati di produzione per operatore e le relative conclusioni, mentre per questo specifico disegno della ANOVA valgono, identiche, le considerazioni generali riportate nei due post precedenti, ai quali si rimanda [1]


----------


mercoledì 6 novembre 2024

Valutare l'omogeneità tra varianze

L'analisi della varianza (ANOVA) è basata "... su due importanti ipotesi: (a) la normalità delle distribuzioni delle osservazioni … e (b) la costanza delle varianze nei diversi gruppi" [1]. 

Per valutare la normalità (gaussianità) delle distribuzioni vi è solo l'imbarazzo della scelta tra i molti test disponibili, molti dei quali li trovate illustrati anche in questo sito [2]. 

Poiché invece qualche difficoltà può sorgere in merito al metodo per valutare la omogeneità delle varianze, qui illustro come per questo si può impiegare il test di Levene.

I dati sono quelli già impiegati nella ANOVA a un fattore [3], copiate le sedici righe riportate qui sotto aggiungendo un ↵ Invio al termine dell'ultima riga e salvatele in C:\Rdati\ in un file di testo denominato anova1.csv (attenzione all'estensione .csv al momento del salvataggio del file).

macchina;produzione
i1;48.4
i1;49.7
i1;48.7
i1;48.5
i1;47.7
i2;56.1
i2;56.3
i2;56.9
i2;57.6
i2;55.1
i3;52.1
i3;51.1
i3;51.6
i3;52.1
i3;51.1

In alternativa andate alla pagina Dati nella quale trovate diverse opzioni per scaricare questo e altri file di dati, quindi copiate il file anova1.csv nella cartella C:\Rdati\


Copiate lo script, incollatelo nella Console di R e premete ↵ Invio:

# Test di Levene per l'omogeneità tra varianze
#
library(car) # carica il pacchetto necessario per eseguire il test
#
mydata <- read.table("c:/Rdati/anova1.csv", header=TRUE, sep=";", dec=".") # importa i dati
#
leveneTest(produzione~macchina, data=mydata) # verifica se le varianze risultano omogenee
#

Dopo avere caricato il pacchetto car che include la funzione leveneTest() sono importati i dati nell'oggetto mydata

Il senso dello script risiede tutto nella terza riga di codice: prima di eseguire la ANOVA vogliamo verificare in via preliminare se le varianze dei cinque dati di produzione rilevati per ciascuna delle tre macchine i1, i2 e i3 sono tra loro omogenee applicando il test di Levene sui dati (mydata) con i valori di produzione aggregati per macchina (produzione~macchina). Questo è quanto ci compare:

> leveneTest(produzione~macchina, data=mydata) # verifica se le varianze risultano omogenee
Levene's Test for Homogeneity of Variance (center = median)
      Df F value Pr(>F)
group  2  0.4238  0.664
      12               
Messaggio di avvertimento:
In leveneTest.default(y = y, group = group, ...) : group coerced to factor.

Perché le tre varianze calcolate per le produzioni delle tre macchine possano essere considerate diverse dovremmo avere p<0.05, ma qui abbiamo un p=0.664 e pertanto concludiamo che le varianze delle produzioni ottenute con le tre diverse macchine non differiscono tra loro in modo significativo. Quindi l'omogeneità delle varianze – uno dei due prerequisiti della ANOVA – risulta rispettato.

Da notare che il Messaggio di avvertimento appare in quanto la variabile di raggruppamento utilizzata per calcolare il test di Levene deve essere una variabile "fattore". Se la variabile utilizzata non lo è, ma è comunque la variabile qualitativa con la quale vogliamo raggruppare i dati, come "macchina" nel nostro esempio, la funzione leveneTest() ci viene in aiuto in quanto trasforma automaticamente la nostra variabile in una variabile "fattore", pertanto il messaggio può essere ignorato.

Conclusione: i risultati dell'ANOVA devono essere validati accertando che siano rispettati due requisiti:
(a) i dati devono essere distribuiti in modo gaussiano, cosa che può essere verificata con uno o più dei numerosi test di normalità (gaussianità) disponibili;
(b) i dati devono avere varianze simili (omogeneità delle varianze), cosa che può essere verificata impiegando il test di Levene qui illustrato.


----------

[1] Armitage P. Statistica medica. Giangiacomo Feltrinelli Editore, Milano, 1979, pp. 195-196.

[2] I metodi per l'analisi della normalità (gaussianità) di una distribuzione sono riportati in: