set.seed(), in modo che il risultato sia sempre lo stessoIndice
Test di Shapiro-Wilk (test di normalità)
Il test di Shapiro-Wilk è un test per la verifica della normalità, adatto in particolare per piccoli campioni, molto usato per validare gli assunti di normalità nell'Anova.
Nell'Anova, si presuppone che i residui del modello (cioè le differenze tra i valori osservati e quelli predetti) seguano una distribuzione normale con varianza costante. Se il test indica che i residui non sono normali (p-value basso), potrebbe essere necessario trasformare i dati o considerare tecniche non parametriche come il test di Kruskal-Wallis.
La logica del test
Il test assume che i dati provengano da un campione casuale (siano indipendenti), e si basa sulla statistica $W$,che mette a confronto la varianza della distribuzione osservata con quella che potremmo attenderci in caso di normalità.
$$W = \frac{\left(\sum a_i X_{(i)}\right)^2}{\sum (X_i - \bar{X})^2}$$
dove:
- $X_{(i)}$ = valori del campione ordinati dal più piccolo al più grande; e
- al numeratore, troviamo i dati ordinati pesati in base a coefficienti che dipendono dalla distribuzione normale ideale ($a_i X_{(i)}$);
- al denominatore abbiamo la varianza osservata ($\sum (X_i - \bar{X})^2$).
La statistica $W$ può essere concettualmente vista come una misura della linearità della relazione, rappresentata nel Q-Q plot, fra i quantili ordinati del campione e quelli attesi di una distribuzione normale: più $W$ si avvicina a 1, più forte è l'evidenza a favore della normalità dei dati.
Il test non può essere applicato a campioni molto grandi (>3.000 casi), in quanto diventa molto sensibile anche a piccole deviazioni dalla normalità (in questo caso, R non lo calcola).
Il test in R
Con una variabile casuale non normale
Costruiamo una variabile casuale con la funzione runif() (vedi in Distribuzioni di probabilità) 1):
# variabile pseudocasuale con seme set.seed(5) X <- runif(n = 100, # numero di osservazioni min = 2, max = 4)
Ed eseguo il test:
# shapiro test shapiro.test(X)
## Shapiro-Wilk normality test ## ## data: X ## W = 0.9341, p-value = 8.57e-05
L'ipotesi nulla è che la distribuzione sia normale. Un p-value maggiore di 0,05 indica che i dati non si discostano significativamente dalla normalità. In questo caso, dobbiamo respingere l'ipotesi nulla.
La distribuzione si discosta significativamente dalla normalità (p = 0), come possiamo vedere anche dall'istogramma in Fig. 1.
# confronto con istogramma hist(X)
Con una variabile casuale normale
Costruiamo ora una variabile normale con rnorm() (Vedi: Le distribuzioni di probabilità in R):
set.seed(5) Y <- rnorm(n = 100, mean = 5, sd = 3) # parametri della distribuzione normale
shapiro.test(Y)
## ## Shapiro-Wilk normality test ## ## data: Y ## W = 0.98711, p-value = 0.445
Non si discosta significativamente dalla normalità.
hist(Y)
Script di esempio
E' possibile scaricare ed eseguire lo script dell'esempio:
- nome_file.R
# variabile pseudocasuale con seme set.seed(5) X <- runif(n = min = 2, max = 4) # shapiro test shapiro.test(X) # variabile normale set.seed(5) Y <- rnorm(n = 100, mean = 5, sd = 3) shapiro.test(Y)
