mercoledì 8 aprile 2020

Analizzare graficamente la distribuzione di una variabile

Questa volta l'obiettivo è di fornire uno strumento pratico, immediatamente riadattabile a nuovi dati, che condensa in una sola immagine quattro grafici per una valutazione “a vista” della distribuzione di una variabile: una sintesi grafica utile e complementare a tutti i test statistici di gaussianità che si vorranno eseguire.

I dati sono contenuti nel file ais.csv (vedere il post Il set di dati ais). Incollate questo script nella Console di R e premete ↵ Invio:

# ANALIZZARE GRAFICAMENTE LA DISTRIBUZIONE DI UNA VARIABILE
#
ais <- read.table("C:/Rdati/ais.csv", header=TRUE, sep=";", dec=",") # carica i dati
mydata <- ais$ferr # salva in mydata i valori della variabile ferritina
par(mfrow=c(2,2)) # suddivide la finestra in quattro quadranti, uno per grafico
#
hist(mydata, xlim=c(0,250), ylim=c(0,0.012), freq=FALSE, breaks="FD", main="Istogramma\ne kernel density plot", xlab="Ferritina in µg/L", ylab = "Densità di probabilità") # traccia l'istogramma dei dati
par(new=TRUE, ann=FALSE) # consente di sovrapporre il grafico successivo
plot(density(mydata, n=1024, from=0, to=250), xlim = c(0,250), ylim=c(0,0.012), yaxt="n", col="black") # sovrappone il kernel density plot della distribuzione campionaria
#
plot(density(mydata, n=1024, from=0, to=250), xlim = c(0,250), ylim=c(0,0.012)) # traccia il kernel density plot della distribuzione campionaria
par(new=TRUE, ann=FALSE) # consente di sovrapporre il grafico successivo
x <- seq(0,250, length.out=1024) # calcola i valori in ascisse della gaussiana teorica
y <- dnorm(x, mean=mean(mydata), sd=sd(mydata)) # calcola i valori in ordinate della gaussiana teorica
plot(x, y, xlim=c(0,250), ylim=c(0,0.012), yaxt="n", col="red", type="l") # sovrappone la distribuzione gaussiana teorica in colore rosso
title(main="Kernel density plot\nvs. gaussiana teorica", xlab="Ferritina in µg/L", ylab = "Densità di probabilità") # aggiunge titolo e legende degli assi
#
par(new=FALSE, ann=TRUE) # consente di aggiungere il grafico successivo
plot(ecdf(scale(mydata)), main="Cumulativa campionaria\nvs. cumulativa teorica", xlab="Deviata normale standardizzata z", ylab = "Frequenza cumulativa", xlog = FALSE, ylog = FALSE, xlim = c(-4,4), ylim = c(0,1), xaxp = c(-4, 4, 5), yaxp = c(0,1,5)) # traccia il grafico della distribuzione cumulativa campionaria
par(new=TRUE, ann=FALSE) # consente di sovrapporre il grafico successivo
plot(ecdf(rnorm(10000, mean=0, sd=1)), col="red", xlog = FALSE, ylog = FALSE, xlim = c(-4,4), ylim = c(0,1), xaxp = c(-4, 4, 5), yaxp = c(0,1,5)) # sovrappone la distribuzione cumulativa teorica in colore rosso
#
par(new=FALSE, ann=TRUE) # consente di aggiungere il grafico successivo
qqnorm(scale(mydata), main="Quantili campionari\nvs. quantili teorici", xlab="Quantili teorici", ylab = "Quantili campionari", xlim = c(-4,4), ylim = c(-4,4)) # traccia il grafico della distribuzione dei quantili campionari
abline (0,1, col="red") # sovrappone la distribuzione dei quantili teorica in colore rosso
#

La ferritina è una proteina che, pur con alcune limitazioni, fornisce una misura dei depositi di ferro presenti nell'organismo, necessari per garantire una adeguata produzione di emoglobina. L'analisi grafica dei dati consente di confermare visivamente per la concentrazione della ferritina nel sangue una distribuzione non gaussiana.











fare click sull'immagine per ingrandirla









I commenti inseriti al codice dello script ne illustrano gli aspetti principali. I dettagli delle funzioni e degli argomenti impiegati li trovate riportati nei post che trattano le rispettive rappresentazioni grafiche (vedere alla pagina Indice). Per tutti gli eventuali approfondimenti aggiuntivi è possibile come al solito digitare help(nomedellafunzione) nella Console di R. Qui si fa solamente notare, come piccola novità, la comparsa nel codice R di un \n che impone un “a capo” in alcune delle righe di testo.

Per riutilizzare questo script è sufficiente:
→ nella prima riga di codice sostituire ais con il nome che volete assegnare ai vostri dati e sostituire C:/Rdati/ais.csv con nome e posizione del file dal quale importare i dati, adeguando al bisogno il separatore dei campi (sep=";") e il separatore dei decimali (dec=",") a quelli da voi impiegati;
→ essendo (ad esempio) dati il nome dei vostri dati e var il nome della variabile che volete analizzare, sostituire nella seconda riga di codice ais$ferr con dati$var;
→ adattare opportunamente xlim, ylim, titoli e legende degli assi.

Vale infine la pena di ricordare che, impiegando l'utilità riportata nel post Salvare i grafici di R in un file, potete anche salvare le immagini realizzate con R, come quella qui riportata, sotto forma di file .bmp, .jpeg, .png, .pdf, .ps per poterle stampare, archiviare, inserire in una pubblicazione, in un post o in un sito web.

giovedì 12 marzo 2020

Importazione dei dati da un file di solo testo

Nel post Importazione dei dati da un file .csv abbiamo visto come sono organizzati i dati in un file .csv, il formato raccomandato per R. E abbiamo visto che un file .csv è un semplice file di testo. Se aprite con un editor di testo il file importa_csv.csv (se non l'avete già scaricato, trovate come farlo nella scheda Datiquesto è quello che vi appare:

id;sesso;anni;peso_kg;altezza_m
MT;M;69;76;1,78
GF;F;56;63;
MC;F;53;71;1,60
SB;M;28;73;1,78
FE;F;61;54;1,54
AB;M;46;92;1,84
RF;F;31;81;1,56

Se ci pensate bene, però, oltre a lettere, numeri, caratteri di interpunzione e qualche altro carattere accessorio, o, più tecnicamente, oltre a una serie di caratteri ASCII stampabili (vedere il post Codifica dei caratteri ASCII, ANSI, Unicode e UTF), nel testo è incluso un "a capo" (o se preferite un ↵ Invio) che segna il passaggio da una riga alla successiva, o, in altre parole, che separa un record dal successivo: ed è chiaro che in qualche modo questo carattere, uno dei caratteri non stampabili (o caratteri di controllo) del codice ASCII, deve essere stato codificato nel file.

Che proprio questo sia il caso è dimostrabile aprendo il file con un editor di testo che sia in grado di mostrare, oltre ai caratteri ASCII, anche i caratteri di controllo contenuti nel file, uno dei quali è appunto il carattere di "a capo". Per esempio se aprite il file importa_csv.csv con PSPad [1] ed attivate nel menù Visualizza la funzione Modalità esadecimale vedete questo:

















Sulla destra compaiono i caratteri ASCII contenuti nel file, sulla sinistra compare il valore esadecimale corrispondente. Sulla destra vedete ricorrere al termine di ogni riga/record una sequenza di due punti consecutivi (..), sulla sinistra vedete che ad essi corrisponde la sequenza 0D0A che è la rappresentazione esadecimale di CR (Carriage Return) e di LF (Line Feed) cioè rispettivamente del ritorno di carrello (0D esadecimale) e del passaggio ad una nuova riga (0A esadecimale) che l'informatica ha ereditato dalla macchina da scrivere. Questi due caratteri ASCII l'editor di testo li interpreta come caratteri di controllo, cioè come caratteri che non devono essere rappresentati, ma che indicano una azione da compiere: passare a una nuova riga di testo ovvero inserire nel testo un "a capo" (un ↵ Invio) [2].

R è ovviamente in grado di interpretare correttamente i caratteri di controllo, infatti se nella Console di R incollate questa riga di codice

mydatacsv <- read.table("C:/Rdati/importa_csv.csv", header=TRUE, sep=";", dec=",")

e premete ↵ Invio per importare i dati dal file .csv, quindi digitate

mydatacsv

e premete ↵ Invio per mostrare i dati importati, ottenete questo risultato:

> mydatacsv <- read.table("C:/Rdati/importa_csv.csv", header=TRUE, sep=";", dec=",")
> mydatacsv
  id sesso anni peso_kg altezza_m

1 MT     M   69      76      1.78
2 GF     F   56      63        NA
3 MC     F   53      71      1.60
4 SB     M   28      73      1.78
5 FE     F   61      54      1.54
6 AB     M   46      92      1.84
7 RF     F   31      81      1.56

(NA indica un dato mancante, trovate il riscontro nel file originale).

Ma con R è possibile un'altra cosa: si possono codificare i caratteri di controllo in chiaro, come viene fatto nel file importa_txt.txt che contiene gli stessi dati e che, aperto con un editor di testo, così vi appare:

MT;M;69;76;1,78\nGF;F;56;63;\nMC;F;53;71;1,60\nSB;M;28;73;1,78\nFE;F;61;54;1,54\nAB;M;46;92;1,84\nRF;F;31;81;1,56


Da notare che nel file importa_txt.txt rispetto al corrispondente file .csv:
i caratteri di controllo CR e LF (nascosti nel file .csv) sono stati sostituiti con i caratteri (in chiaro) \n ove la barra rovesciata \ (o backslash) indica a R la presenza di un carattere di controllo e n sta per New Line (“passa a una nuova riga”);
→ il file non contiene i nomi delle variabili, che devono essere specificati nella funzione read.table() mediante l'argomento col.names;
l'ultimo carattere nel file deve essere un ↵ Invio (cioè un "a capo") che in questo caso deve immediatamente seguire il 6 del dato finale 1,56.

Il file importa_txt.txt potete scaricarlo e installarlo nella cartella C:\Rdati seguendo le istruzioni fornite nella scheda Dati. Ora copiate nella Console di R questa riga di codice

mydatatxt <- read.table("c:/Rdati/importa_txt.txt", header=TRUE, col.names=c("id", "sesso", "anni", "peso_kg", "altezza_m"), sep=";", dec=",", allowEscapes=TRUE)

e premete ↵ Invio per importare i dati, quindi digitate

mydatatxt

e premete ↵ Invio per visualizzare i dati importati. 

Da notare che l'argomento allowEscapes=TRUE fa si che R interpreti la  sequenza \n come un carattere di controllo (un ↵ Invio) e non come due semplici caratteri di testo. Come vedete il risultato ottenuto

> mydatatxt <- read.table("c:/Rdati/importa_txt.txt", header=TRUE, col.names=c("id","sesso","anni","peso_kg","altezza_m"), sep=";", dec=",", allowEscapes=TRUE)
> mydatatxt
  id sesso anni peso_kg altezza_m

1 MT     M   69      76      1.78
2 GF     F   56      63        NA
3 MC     F   53      71      1.60
4 SB     M   28      73      1.78
5 FE     F   61      54      1.54
6 AB     M   46      92      1.84
7 RF     F   31      81      1.56

è identico a quello ottenuto importando i dati del file .csv.

Il senso di tutto ciò? Semplice. Guardate il set di dati Galton. Si tratta di 928 righe di dati, ciascuna corrispondente a un record, più una riga per i nomi delle variabili. Se invece di un file .csv impiegate un file .txt separando i record con \n potete compattare i dati in un numero enormemente inferiore di righe, cosa che ad esempio rende possibile inserire un numero così elevato di record in un testo.


----------


Addendum

Se siete arrivati fino a qui, avete certamente notato che nel post manca una cosa fondamentale: un metodo semplice per generare un file di testo nel quale i caratteri di controllo nascosti CR e LF sono sostituiti con un \n riportato in chiaro.

In effetti ci sono programmi che consentono di effettuare la sostituzione online. Alcuni forniscono come risultato un file nel quale la sequenza di caratteri di controllo CRLF è automaticamente sostituita con \n [3], altri forniscono come risultato un file nel quale detta sequenza è sostituita con uno spazio vuoto [4], che successivamente può essere sostituito manualmente con \n.

Qui vediamo invece come effettuare la sostituzione con questa seconda modalità, che è la più semplice, impiegando R e un comune editor di testo.

Scaricate dal CRAN e installate il pacchetto stringr [5]. Quindi copiate e incollate nella Console di R questo script e premete ↵ Invio

# SALVA I DATI IN UN FILE DI TESTO ELIMINANDO I CARATTERI DI CONTROLLO CR e LF
#
library(stringr) # carica il pacchetto
mydata <- readLines("C:/Rdati/importa_csv.csv") # legge il file
newdata <- mydata[-c(1)] # elimina la prima riga che contiene i nomi delle variabili
mystring <- str_c(newdata, collapse=" ") # concatena i record in un'unica stringa separandoli con uno spazio
write(mystring, file="C:/Rdati/temp.txt") # salva la stringa in un file di testo

Va subito precisato che il messaggio che vi comparirà

Warning message:
In readLines("C:/Rdati/importa_csv.csv") :
incomplete final line found on 'C:/Rdati/importa_csv.csv'

non indica un errore, ma è un semplice avvertimento che segnala la mancanza della sequenza CRLF (cioè di un ↵ Invio) alla fine del file: i dati sono importati correttamente, come potete constatare digitando mydata.

Nelle cinque righe di codice, nell'ordine:
→ con la funzione library() viene caricato il pacchetto stringr;
→ con readLine(s) un normale file .csv (vedere il post Importazione dei dati da un file .csv) viene importato riga per riga;
→ con [-c(1)] viene eliminata la prima riga, quella che contiene i nomi delle variabili;
→ con la funzione str_c() del pacchetto stringr le righe (record) del file importate sono concatenate in un'unica stringa separando l'una dall'altra con uno spazio (collapse=" ") ;
la stringa che risulta dal concatenamento viene salvata nel file C:/Rdati/temp.txt.

Digitate mydata, poi newdata e infine mystring per visualizzare la progressiva trasformazione dei dati.

Infine, impiegando un editor di testo come il Blocco note di Windows:
aprite il file C:/Rdati/temp.txt
utilizzate la funzione Modifica > Sostituisci per sostituire lo spazio vuoto con i caratteri \n














A questo punto ricordatevi che l'ultimo carattere del file deve essere un ↵ Invio (cioè un "a capo") che dovete inserire manualmente immediatamente dopo il 6 del dato finale 1,56. Poi salvate il risultato nel file definitivo, denominato a piacere ma possibilmente per coerenza con estensione .txt, e avrete finalmente un file di dati di R in formato testo come questo

MT;M;69;76;1,78\nGF;F;56;63;\nMC;F;53;71;1,60\nSB;M;28;73;1,78\nFE;F;61;54;1,54\nAB;M;46;92;1,84\nRF;F;31;81;1,56


che impiega come separatore di record la sequenza di caratteri \n codificata in chiaro, e che può essere importato in R mediante la funzione read.table() impiegando l'argomento allowEscapes=TRUE.

Supponendo che abbiate denominato questo file C:\Rdati\ilmiofile_txt.txt se copiate nella Console di R questa riga di codice

mydatatxt <- read.table("c:/Rdati/ilmiofile_txt.txt", header=TRUE, col.names=c("id", "sesso", "anni", "peso_kg", "altezza_m"), sep=";", dec=",", allowEscapes=TRUE)

e premete ↵ Invio per importare i dati, quindi digitate

mydatatxt

e premete ↵ Invio per visualizzare i dati importati, potete verificare che il tutto ha funzionato correttamente e che pertanto siete in grado, al bisogno, da un lato di generare un file di testo con i caratteri di controllo in chiaro, e dall'altro lato di importarne i dati in R.


----------

[1] PSPad freeware editor. URL consultato il 16/03/2020: http://bit.ly/3aUXAws

[2] In realtà esistono tre modi per codificare un "a capo" (un ↵ Invio), e dipendono dal sistema operativo impiegato:
 CRLF (\r\n): usato da MS-DOS e Microsoft Windows, al quale si fa qui riferimento;
 LF (\n): usato da sistemi Unix, Linux e Apple (GNU/Linux, Mac OS X e macOS);
 CR (\r): usato da Commodore e Apple (Mac OS fino alla versione 9 inclusa).

[3] Remove/Replace all line breaks of a text. URL consultato il 16/03/2020: http://bit.ly/39Wt2JF

[4] Convert Newlines to Spaces. URL consultato il 16/03/2020: http://bit.ly/2x481ht

[5] Vedere il manuale di riferimento del pacchetto Package 'stringr'. URL consultato il 16/03/2020: http://bit.ly/33lINaC

lunedì 6 gennaio 2020

Test parametrici e non parametrici per più campioni indipendenti

Nel post Test parametrici e non parametrici per due campioni indipendenti abbiamo visto come sia possibile, per confrontare due campioni indipendenti:
→ impiegare un metodo parametrico, il test t di Student, per confrontare le loro medie quando i dati sono distribuiti in modo gaussiano;
→ impiegare metodi non parametrici, come il test di Wilcoxon per campioni indipendenti (in genere meglio noto come test U di Mann-Whitney) e il test di Kruskall-Wallis, per confrontare le loro mediane (o i loro ranghi) quando i dati non sono distribuiti in modo gaussiano.

Tuttavia per confrontare più di due campioni indipendenti non è corretto applicare un test per due campioni indipendenti ripetitivamente a tutte le diverse possibili coppie di campioni: così, ad esempio, nel caso più semplice, quello di tre campioni, non è corretto confrontare mediante l'ordinario test t di Student (assumendo che si tratti di distribuzioni gaussiane) il primo campione con il secondo campione, il primo campione con il terzo e il secondo campione con il terzo. Questo perché la probabilità di commettere un errore di primo tipo [1], cioè la probabilità di considerare la differenza tra le medie di due campioni significativa quando invece non è significativa (probabilità di un falso positivo), nel caso di confronti multipli viene moltiplicata per il numero di confronti effettuati.

Pertanto un valore del test t di Student che nel caso di due campioni (per i quali un solo confronto è possibile) corrisponda a una probabilità di commettere un errore di primo tipo del 5%:
→ nel caso di tre campioni (essendo 3 i confronti possibili) corrisponde a una probabilità di commettere un errore di primo tipo del 3 x 5% = 15%;
→ nel caso di quattro campioni (essendo 6 i confronti possibili) corrisponde a una probabilità di commettere un errore di primo tipo del 6 x 5% = 30%;
→ nel caso di cinque campioni (essendo 10 i confronti possibili) corrisponde a una probabilità di commettere un errore di primo tipo del 10 x 5% = 50%;
e così via.
Reciprocamente il corrispondente del p = 0.05 generalmente assunto come valore soglia per la significatività (probabilità di commettere un errore del primo tipo) nel confronto di due campioni:
→ quando si confrontano tre campioni è p = 0.017 (cioè 0.05/3);
→ quando si confrontano quattro campioni è p = 0.008 (cioè 0.05/6);
→ quando si confrontano cinque campioni è p = 0.005 (cioè 0.05/10);
e così via.

I test che vediamo ora introducono opportune correzioni per controbilanciare l'aumento dei falsi positivi, cioè l'aumento della probabilità di considerare la differenza tra le medie di due campioni significativa quando invece non è significativa, derivante dall'esecuzione di confronti multipli.

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

# CONFRONTARE TRA DI LORO PIU' CAMPIONI con un metodo parametrico
#
library(DAAG) # carica il pacchetto DAAG incluso il set di dati ais
#
boxplot(hg~sport, data=ais, horizontal=FALSE, notch=FALSE, col="green", las=2, xlab="Sport praticato", ylab="Emoglobina nel sangue (g/dL)") # boxplot della concentrazione di emoglobina per sport praticato
#
pairwise.t.test(ais$hg, ais$sport, p.adjust.method="bonferroni") # test t di Student per campioni indipendenti con la correzione di Bonferroni per confronti multipli
#

Impieghiamo il set di dati ais a partire dal quale realizziamo un grafico a scatola con i baffi (boxplot) per la concentrazione hg dell'emoglobina nel sangue (espressa in g/dL) aggregando i valori in base allo sport praticato (hg~sport):









fare click sull'immagine per ingrandirla










Ora, per avere un riscontro quantitativo e oggettivo alle differenze rilevate nel grafico, impiegando la funzione pairwise.t.test() applichiamo ai dati il test t di Student con la correzione di Bonferroni (method=”bonferroni”), correzione che si rende necessaria nel caso di confronti multipli:

       Pairwise comparisons using t tests with pooled SD 

data:  ais$hg and ais$sport 

        B_Ball Field   Gym    Netball Row    Swim   T_400m T_Sprnt Tennis
Field   0.0023 -       -      -       -      -      -      -       -     
Gym     1.0000 0.1012  -      -       -      -      -      -       -     
Netball 0.0050 2.4e-11 1.0000 -       -      -      -      -       -     
Row     1.0000 0.1676  1.0000 6.5e-07 -      -      -      -       -     
Swim    1.0000 1.0000  1.0000 2.3e-06 1.0000 -      -      -       -     
T_400m  1.0000 0.8321  1.0000 2.7e-07 1.0000 1.0000 -      -       -     
T_Sprnt 0.0015 1.0000  0.0606 5.1e-11 0.0928 0.5925 0.4455 -       -     
Tennis  1.0000 0.2188  1.0000 0.0178  1.0000 1.0000 1.0000 0.1213  -     
W_Polo  0.0036 1.0000  0.1078 8.8e-11 0.2180 1.0000 0.9715 1.0000  0.2490

P value adjustment method: bonferroni 

Il test t di Student con la correzione di Bonferroni, uno dei più tradizionali, conferma che le atlete (perché si tratta di sole donne) che praticano Netball hanno in comune una bassa concentrazione dell'emoglobina, e che questa si discosta significativamente da tutti i rimanenti gruppi di atleti, con la sola eccezione del gruppo delle atlete (anche queste tutte di sesso femminile) che pratica la ginnastica (Gym). Le poche altre differenze significativa osservate possono essere facilmente individuate nella tabella.

Da notare che la funzione pairwise.t.test() prevede le seguenti correzioni alternative meno conservative [2] di quella di Bonferroni: secondo Holm (1979) (method="holm"), Hochberg (1988) (method="hochberg"), Hommel (1988) (method="hommel"), Benjamini & Hochberg (1995) (method="BH" o method="fdr"), Benjamini & Yekutieli (2001) (method="BY"), e method="none" per nessuna correzione (sconsigliato).

Vediamo ora alcuni metodi non parametrici, contenuti nel pacchetto PMCMRplus [3], che è necessario scaricare e installare dal CRAN. Copiate lo script che segue, incollatelo nella Console di R e premete ↵ Invio:

# CONFRONTARE TRA DI LORO PIU' CAMPIONI con metodi non parametrici
#
library(DAAG) # carica il pacchetto DAAG incluso il set di dati ais
#
boxplot(hg~sport, data=ais, horizontal=FALSE, notch=FALSE, col="green", las=2, xlab="Sport praticato", ylab="Emoglobina nel sangue (g/dL)") # boxplot della concentrazione di emoglobina per sport praticato
#
library(PMCMRplus) # carica il pacchetto
spearmanTest(hg~sport, data=ais) # rho di Spearman (test omnibus, non parametrico)
kwAllPairsConoverTest(hg~sport, data=ais) # test di Conover (non parametrico)
kwAllPairsDunnTest(hg~sport, data=ais) # test di Dunn (non parametrico)
kwAllPairsNemenyiTest(hg~sport, data=ais) # test di Nemenyi (non parametrico)
#

Ovviamente i dati (set di dati ais) e il grafico a scatola con i baffi (boxplot) sono sempre gli stessi. Quello che qui interessa sono le funzioni del pacchetto PMCMRplus, delle quali nello script sono riportati alcuni esempi significativi e precisamente:
la funzione spearmanTest(), per un test di tipo ρ (rho) di Spearman, che abbiamo già visto nel post Coefficienti di correlazione parametrici e non parametrici, un test non parametrico che riporta un risultato unico per tutte le coppie di campioni (test omnibus);
la funzione kwAllPairsConoverTest() per il test di Conover, un test non parametrico basato sui ranghi di tipo Kruskal, che riporta un risultato per ogni coppia di campioni;
la funzione kwAllPairsDunnTest() per il test di Dunn, anch'esso un test non parametrico basato sui ranghi di tipo Kruskal, che riporta un risultato per ogni coppia di campioni;
la funzione kwAllPairsNemenyiTest() per il test di Nemenyi, un test non parametrico basato sul confronto tra i ranghi, che riporta un risultato per ogni coppia di campioni.

Da notare che il pacchetto include tra le molte altre anche la funzione tukeyTest() per il test di Tukey, un test parametrico, per il confronto di campioni con distribuzione gaussiana e con uguale varianza, che riporta un risultato per ogni coppia di campioni, e quindi sovrapponibile per applicazione e conclusioni al test t di Student con la correzione di Bonferroni, anche se meno conservativo. La sintassi è sempre la stessa, provate a visualizzarne i risultati con questa riga di codice:

tukeyTest(hg~sport, data=ais) # test di Tukey (parametrico)

Potete notare che i risultati dei vari test, parametrici e non parametrici, portano a conclusioni molto simili tra di loro: questo supporta, anche se indirettamente, l'idea che i dati originali siano distribuiti in modo gaussiano (nel caso di distribuzioni perfettamente gaussiane i risultati dei test parametrici e non parametrici coincidono). Tuttavia va sottolineato che un approccio rigoroso e puntuale deve prevedere una verifica preliminare della gaussianità dei dati, che qui per brevità abbiamo trascurato, ma che non deve mai mancare, e che viene lasciata come esercizio rimandando ai metodi decritti nel post Test di normalità (gaussianità) e nel post Analisi della varianza a un fattore [4].


----------

[1] Wikipedia. Type I and type II errors. URL consultato il 10/01/2020: http://bit.ly/2R1VdyF

[2] Un metodo statistico “meno conservativo” a parità di condizioni riporta più frequentemente differenze significative. Personalmente preferisco in ogni caso impiegare i metodi più conservativi, in quanto riducono la probabilità di considerare significativa una differenza che invece non è significativa (ovvero riducono la probabilità di un falso positivo).

[3] PMCMR è l'acronimo di Calculate Pairwise Multiple Comparisons of Mean Rank Sums Extended. Si tratta di un pacchetto che include una serie molto ampia sia di test omnibus (che forniscono un solo risultato per tutti i confronti effettuati), sia per il confronto tra tutte le coppie di campioni, sia parametrici, sia non parametrici. Vedere sul CRAN il reference manual PMCMRplus: Calculate Pairwise Multiple Comparisons of Mean Rank Sums Extended. URL consultato il 18/12/2019: http://bit.ly/2EwRymI

[4] Di prossima pubblicazione.