1.0 1.5 2.0 2.5
0.00.20.40.60.81.0
ecdf(masse)
x
Fn(x)
Figura 5.1: Test di Kolmogorov-Smirnov per l’uniformit`a.
5.1.2 Test di Kolmogorov-Smirnov per due campioni
Se si vogliono confrontare due campioni A e B per stabilire se possano provenire da una stessa distribuzione si usa il test di Kolmogorov-Smirnov nel modo seguente:
> ks.test(A, B)
Esempio
Si confrontino le distribuzioni di dei valori contenuti nei vettori A e B.
> A <- rnorm(30)
> B <- rnorm(20, m=0, sd=1.2)
> ks.test(A, B)
Two-sample Kolmogorov-Smirnov test data: A and B
D = 0.4333, p-value = 0.01693 alternative hypothesis: two.sided
Si conclude che le due distribuzioni differiscono in maniera significativa. Per confrontarle graficamente si usano i comandi:
> plot(ecdf(B), do.points=FALSE, verticals=TRUE)
> lines(ecdf(A), do.points=FALSE, verticals=TRUE, col.vert="red", col.hor="red") che producono il grafico in Fig. 5.2.
5.2 Metodi non parametrici 99
−3 −2 −1 0 1 2 3
0.00.20.40.60.81.0
ECDF
x
Fn(x)
Figura 5.2: Test di Kolmogorov-Smirnov per il confronto di due serie osservate dell’esempio 5.1.2.
5.2.1 Test di Wilcoxon
Questo test `e disponibile nelle due varianti di test di Wilcoxon dei ranghi con segno (equivalente al test t per dati appaiati) e test di Wilcoxon della somma dei ranghi (equivalente al test t per campioni indipendenti).
Si considerino per cominciare due campioni A e B appaiati. Se non `e possibile utilizzare il test t per verificare se vi sia una differenza significativa fra le loro medie si ricorre al test di Wilcoxon dei ranghi con segno.
Esempio
Si vuole stabilire l’efficacia di un farmaco. Su un campione di 8 pazienti si misura su una scala da 1 a 5 la gravit`a delle lesioni prima della cura (A). Gli stessi pazienti vengono valutati a trattamento concluso (B). I dati suggeriscono che la cura ha avuto un effetto significativo?
Il test di Wilcoxon, appropriato per una situazione di questo genere si esegue con le chiamate:
> A <- c(2,2,3,4,4,2,3,5)
> B <- c(3,1,3,5,4,3,4,4)
> wilcox.test(A, B, paired=TRUE, correct=FALSE) Wilcoxon signed rank test
data: A and B
V = 7, p-value = 0.4142
alternative hypothesis: true mu is not equal to 0
Si conclude che non vi `e evidenza di effetto significativo del farmaco. L’opzione paired = T RU E specifica che i campioni vanno trattati come dati appaiati, mentre correct = F ALSE specifica di non utilizzare la correzione di continuit`a nell’approssimazione normale alla distribuzione di Wilcoxon, usata per calcolare il valore p. Per quanto riguarda questo calcolo, per campioni di taglia inferiore a 50 e in assenza di ties il valore p viene calcolato in modo esatto, altrimenti R ricorre all’approssimazione
normale.
Nel caso di campioni indipendenti si ricorre al test di Wilcoxon della somma dei ranghi (equivalente al test U di Mann-Whitney). Usando i dati dell’esempio precedente la chiamata sar`a semplicemente:
[...]
> wilcox.test(A, B, correct=FALSE) Wilcoxon rank sum test
data: A and B
W = 26.5, p-value = 0.55
alternative hypothesis: true mu is not equal to 0
5.2.2 Test di Kruskal-Wallis
Nel caso di pi`u di due serie di dati indipendenti, se non `e possibile ricorrere ad una ANOVA, si utilizza il test di Kruskal-Wallis, che nel caso di due sole serie di dati fornisce un risultato analogo a quello del test di Wilcoxon della somma dei ranghi. In questo caso `e necessario unire tutti i dati in un unico vettore e utilizzare un vettore complementare in cui tenere traccia del gruppo di provenienza:
> A <- c(2,2,3,4,4,2,3,5)
> B <- c(3,1,3,5,4,3,4,4)
> dati <- c(A, B)
> g <- rep(1:2, each=8)
o in alternativa riunirli in una lista:
> dati2 <- list(g1=A, g2=B)
Quest’ultima chiamata crea un oggetto di tipo lista (l’equivalente di una struttura C) che contiene due variabili: la prima, chiamata “g1”, contenente il vettore A e la seconda, di nome “g2”, contenente il vettore B.
Si procede quindi con il test:
> kruskal.test(dati, g) # usando i vettori
> kruskal.test(dati2) # usando la lista Kruskal-Wallis rank sum test
data: dati2
Kruskal-Wallis chi-squared = 0.3573, df = 1, p-value = 0.55
Come si vede il valore p `e identico a quello ottenuto nel caso di test di Wilcoxon della somma dei ranghi.
5.2.3 Test di Friedman
Questo test `e l’analogo non parametrico dell’analisi della varianza a due fattori a blocchi randomizzati.
Esempio
A 6 psicologi vengono richieste le valutazioni (con un punteggio da 0 a 5 in ordine crescente di validit`a) di 4 terapie. Si stabilisca se vi sono delle differenze di valutazione fra le 4 diverse terapie.
Il modo pi`u rapido di procedere `e inserire i dati relativi alle valutazioni dei 6 medici e unirli in una matrice:
> c1 <- c(4, 3, 0, 2)
> c2 <- c(4, 2, 2, 2)
> c3 <- c(3, 2, 2, 1)
> c4 <- c(5, 1, 2, 2)
> c5 <- c(3, 4, 1, 2)
5.2 Metodi non parametrici 101
> c6 <- c(5, 4, 3, 3)
> mat <- rbind(c1, c2, c3, c4, c5, c6)
La funzione rbind unisce i vettori in una matrice disponendoli per riga. Il test si esegue semplicemente con la chiamata:
> friedman.test(mat)
Friedman rank sum test data: mat
Friedman chi-squared = 11.3774, df = 3, p-value = 0.00985
Si evidenzia una differenza altamente significativa fra i 4 tipi terapia. In alternativa `e sempre possibile trasformare i dati all’interno di ciascun blocco in ranghi ed eseguire una ANOVA a due vie sui dati trasformati. Il processo risulta pi`u lungo e macchinoso:
> dati <- c(c1, c2, c3, c4, c5, c6)
> gruppo <- factor(rep(1:4, 6))
> blocco <- factor(rep(1:6, each=4))
> rg <- tapply(dati, blocco, rank) # calcolo i ranghi nei blocchi
> ranghi <- stack(rg)[[1]] # concateno la lista ed estraggo la prima colonna
> anova(aov(ranghi ~ gruppo + blocco)) Analysis of Variance Table
Response: ranghi
Df Sum Sq Mean Sq F value Pr(>F) gruppo 3 16.7500 5.5833 8.5897 0.001474 **
blocco 5 5.017e-30 1.003e-30 1.544e-30 1.000000 Residuals 15 9.7500 0.6500
Si noti che il valore di significativit`a `e diverso dalla tecnica precedente.
5.2.4 Correlazione non parametrica
Per valutare l’associazione fra due serie di dati, in R sono disponibili due misure non parametriche:
ρ di Spearman e τ di Kendall. Entrambe sono accessibili dalla funzione cor.test (vedi Sezione 2.3) specificando l’opzione method appropriata.
Esempio
Si studia la correlazione non parametrica tra i valori degli indici di soddisfazione IS degli abitanti di sette citt`a (espressi in una scala da 1 a 10) e l’area media (in km2) di zone verdi disponibili nel centro urbano.
Si inseriscono i dati:
> IS <- c(1, 2, 3, 4, 5, 6, 8, 10)
> ZV <- c(0.7, 0.4, 1.0, 1.0, 1.1, 1.2, 1.2, 1.2) Per eseguire il test di Spearman si usa la chiamata:
> cor.test(IS, ZV, method="spearman") Spearman’s rank correlation rho
data: IS and ZV S = 4, p-value = 0.002171 alternative hypothesis: true rho is not equal to 0 sample estimates:
rho 0.94523
Per il test di Kendall la sintassi `e:
> cor.test(IS, ZV, method="kendall") Kendall’s rank correlation tau data: IS and ZV
z.tau = 2.9399, p-value = 0.003283
alternative hypothesis: true tau is not equal to 0 sample estimates:
tau 0.8486684
La conclusione in entrambi i casi `e che esiste evidenza di associazione altamente significativa fra i due indici considerati.