mercoledì 23 gennaio 2019

Coefficienti di correlazione parametrici e non parametrici

Come sottolineato altrove, l'assunzione implicita di un rapporto di causa-effetto in seguito ad un coefficiente di correlazione significativo è una delle trappole mentali più ricorrenti e più subdole della statistica: perché non esiste una connessione logica tra correlazione e causazione [1].

Nonostante da questo derivi l'invito ad impiegare la correlazione con parsimonia, con prudenza e con spirito critico nel trarne le conclusioni, risulta difficile ignorare l'esistenza in R di due strumenti.

Il primo sono i classici coefficienti di correlazione e precisamente:
→ il coefficiente di correlazione (lineare) r di Pearson, il classico test parametrico;
→ il coefficiente di correlazione per ranghi ρ (rho) di Spearman (test non parametrico);
→ il coefficiente di correlazione τ (tau) di Kendall (test non parametrico).

Il secondo sono i correlogrammi [2], una rappresentazione un po' particolare ma interessante della correlazione tra variabili, utile come complemento grafico ai coefficienti di correlazione di cui sopra. 

Va ricordato che il più ampiamente usato (e abbondantemente abusato) coefficiente di correlazione r fornisce una misura del grado di correlazione lineare ed è pertanto valido solamente se le due variabili a confronto hanno una relazione di tipo lineare, mentre i coefficienti di correlazione non parametrici forniscono una misura della correlazione valida anche anche nel caso di relazioni non lineari.

In questo primo script viene impiegato il set di dati galton [3], nel quale sono riportate le altezze (in pollici) di 928 coppie padre-figlio. Sono richiesti i pacchetti aggiuntivi psychTools e Hmisc, che devono essere preventivamente scaricati e installati dal CRAN.

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

# COEFFICIENTI DI CORRELAZIONE parametrici e non parametrici
#
library(psychTools) # carica il pacchetto che include il set di dati galton
str(galton) # mostra la struttura dei dati
#
# calcola i coefficienti di correlazione con i metodi di pearson (il classico r), spearman, kendall
#
round(cor(galton, use="complete.obs", method="pearson"), digits=2) # r di Pearson
round(cor(galton, use="complete.obs", method="spearman"), digits=2) # rho di Spearman
round(cor(galton, use="complete.obs", method="kendall"), digits=2) # tau di Kendall
#
# calcola i coefficienti di correlazione con i livelli di significatività
#
library(Hmisc) # carica il pacchetto
rcorr(as.matrix(galton), type="pearson") # type può essere solo “pearson” (il classico r) o “spearman”
rcorr(as.matrix(galton), type="spearman")
#

Questi sono i risultati ottenuti con i tre metodi per il calcolo della correlazione:

> round(cor(galton, use="complete.obs", method="pearson"), digits=2) # r di Pearson 
       parent child
parent   1.00  0.46
child    0.46  1.00
> round(cor(galton, use="complete.obs", method="spearman"), digits=2) # rho di Spearman 
       parent child
parent   1.00  0.43
child    0.43  1.00
> round(cor(galton, use="complete.obs", method="kendall"), digits=2) # tau di Kendall 
       parent child
parent   1.00  0.33
child    0.33  1.00

La funzione cor() viene impiegata per calcolare i coefficienti di correlazione con gli argomenti:
galton che indica i dati da elaborare;
use=”complete.obs” che comporta l'eliminazione automatica dei casi nei quali manchi l'uno o l'altro dato, argomento che qui non servirebbe impiegare, ma che viene riportato per completezza;
method= che di volta in volta riporta i valori "pearson", "spearman", "kendall", per calcolare le rispettive statistiche.

Da notare che la funzione cor() è stata annidata nella funzione round() che con l'argomento digits=2 provvede ad arrotondare a due cifre decimali i risultati: e che i coefficienti di correlazione non parametrici forniscono, come atteso, valori inferiori a quelli del classico coefficiente di correlazione parametrico r di Pearson (sono più conservativi).

Infine lo script impiega la funzione rcorr() del pacchetto Hmisc per calcolare la significatività del coefficiente r di Pearson e del coefficiente ρ (rho) di Spearman. La probabilità p di osservare per caso i valori di r e di rho qui ottenuti è molto bassa e, come potrete vedere se eseguite lo script, viene riportata come uguale a 0 (zero). Quindi entrambi questi coefficienti di correlazione risultano essere significativi.

In questo secondo script sono impiegati i dati contenuti nella tabella ais del pacchetto DAAG - accertatevi di avere installato il pacchetto o in alternativa procedete come indicato in [4].

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

# COEFFICIENTI DI CORRELAZIONE parametrici e non parametrici
#
library(DAAG) # carica il pacchetto incluso il set di dati ais
str(ais) # struttura di ais
mydata <- ais[c(1,2,3,4,5,6,7,8,9,10,11)] # salva sole le colonne con le variabili numeriche in mydata
str(mydata) # mostra la struttura di mydata
#
# method può essere pearson (il classico r), spearman, kendall
#
round(cor(mydata, use="complete.obs", method="pearson"), digits=2) # r di Pearson
round(cor(mydata, use="complete.obs", method="spearman"), digits=2) # rho di Spearman
round(cor(mydata, use="complete.obs", method="kendall"), digits=2) # tau di Kendall
#
# calcola i coefficienti di correlazione con i livelli di significatività
#
library(Hmisc) # carica il pacchetto
rcorr(as.matrix(mydata), type="pearson") # type può essere solo “pearson” (il classico r) o “spearman”
rcorr(as.matrix(mydata), type="spearman")
#
# approfondimenti grafici sulla correlazione lineare
#
library(car) # carica il pacchetto
windows() # apre una finestra grafica
scatterplotMatrix(~rcc+wcc+hc+hg+ferr+bmi+ssf+pcBfat+lbm+ht+wt, regLine = list(method=lm, lty=1, lwd=2, col="red"), smooth=FALSE, diagonal=list(method="density", bw="nrd0", adjust=1, kernel="gaussian", na.rm=TRUE), col = "black", main="Matrice di dispersione", data=ais) # traccia il grafico di dispersione xy che incrocia tutte le variabili
#

Nella parte iniziale dello script dopo avere caricato il pacchetto DAAG con la funzione str(ais) viene mostrata la struttura dell'oggetto/set di dati, che contiene 13 variabili, 11 numeriche e 2 non numeriche. Dato che siamo interessati alle sole variabili numeriche, queste, che sono comprese nelle colonne da 1 a 11 della tabella (o dataframe o dataset) ais, le salviamo in un nuovo oggetto denominato mydata che è quello sul quale lavoreremo. Infine per la conferma dell'avvenuta operazione di selezione delle colonne viene mostrata la struttura del nuovo oggetto con str(mydata).

Il resto del codice è praticamente identico allo script precedente. I risultati sono presentati sotto forma di una matrice che contiene i valori dei coefficienti di correlazione che la funzione cor() calcola per tutte le coppie di variabili. Questi valori sono simmetrici rispetto alla diagonale, nella quale è riportato sempre un valore uguale a 1 per i coefficienti di correlazione di ciascuna variabile con se stessa. I valori evidenziati (manualmente dal sottoscritto) sono quelli che nel successivo grafico mostrano una relazione tra le variabili che più si avvicina ad una retta.

> round(cor(mydata, use="complete.obs", method="pearson"), digits=2) # r di Pearson
         rcc  wcc    hc    hg  ferr  bmi   ssf pcBfat   lbm    ht   wt
rcc     1.00 0.15  0.92  0.89  0.25 0.30 -0.40  -0.49  0.55  0.36 0.40
wcc     0.15 1.00  0.15  0.13  0.13 0.18  0.14   0.11  0.10  0.08 0.16
hc      0.92 0.15  1.00  0.95  0.26 0.32 -0.45  -0.53  0.58  0.37 0.42
hg      0.89 0.13  0.95  1.00  0.31 0.38 -0.44  -0.53  0.61  0.35 0.46
ferr    0.25 0.13  0.26  0.31  1.00 0.30 -0.11  -0.18  0.32  0.12 0.27
bmi     0.30 0.18  0.32  0.38  0.30 1.00  0.32   0.19  0.71  0.34 0.85
ssf    -0.40 0.14 -0.45 -0.44 -0.11 0.32  1.00   0.96 -0.21 -0.07 0.15
pcBfat -0.49 0.11 -0.53 -0.53 -0.18 0.19  0.96   1.00 -0.36 -0.19 0.00
lbm     0.55 0.10  0.58  0.61  0.32 0.71 -0.21  -0.36  1.00  0.80 0.93
ht      0.36 0.08  0.37  0.35  0.12 0.34 -0.07  -0.19  0.80  1.00 0.78
wt      0.40 0.16  0.42  0.46  0.27 0.85  0.15   0.00  0.93  0.78 1.00
> round(cor(mydata, use="complete.obs", method="spearman"), digits=2) # rho di Spearman
         rcc  wcc    hc    hg  ferr  bmi   ssf pcBfat   lbm    ht    wt
rcc     1.00 0.17  0.91  0.89  0.25 0.29 -0.40  -0.50  0.59  0.40  0.42
wcc     0.17 1.00  0.17  0.14  0.05 0.23  0.15   0.14  0.11  0.04  0.17
hc      0.91 0.17  1.00  0.95  0.25 0.32 -0.44  -0.54  0.63  0.43  0.45
hg      0.89 0.14  0.95  1.00  0.31 0.37 -0.43  -0.54  0.67  0.41  0.49
ferr    0.25 0.05  0.25  0.31  1.00 0.30 -0.11  -0.19  0.34  0.17  0.30
bmi     0.29 0.23  0.32  0.37  0.30 1.00  0.29   0.15  0.70  0.35  0.84
ssf    -0.40 0.15 -0.44 -0.43 -0.11 0.29  1.00   0.96 -0.22 -0.10  0.13
pcBfat -0.50 0.14 -0.54 -0.54 -0.19 0.15  0.96   1.00 -0.41 -0.25 -0.05
lbm     0.59 0.11  0.63  0.67  0.34 0.70 -0.22  -0.41  1.00  0.80  0.91
ht      0.40 0.04  0.43  0.41  0.17 0.35 -0.10  -0.25  0.80  1.00  0.78
wt      0.42 0.17  0.45  0.49  0.30 0.84  0.13  -0.05  0.91  0.78  1.00
> round(cor(mydata, use="complete.obs", method="kendall"), digits=2) # tau di Kendall
         rcc  wcc    hc    hg  ferr  bmi   ssf pcBfat   lbm    ht    wt
rcc     1.00 0.11  0.75  0.71  0.17 0.19 -0.26  -0.33  0.41  0.27  0.28
wcc     0.11 1.00  0.11  0.09  0.03 0.15  0.10   0.10  0.08  0.03  0.12
hc      0.75 0.11  1.00  0.83  0.17 0.22 -0.29  -0.35  0.44  0.29  0.30
hg      0.71 0.09  0.83  1.00  0.22 0.25 -0.29  -0.36  0.46  0.28  0.33
ferr    0.17 0.03  0.17  0.22  1.00 0.20 -0.07  -0.13  0.22  0.11  0.20
bmi     0.19 0.15  0.22  0.25  0.20 1.00  0.20   0.11  0.52  0.24  0.65
ssf    -0.26 0.10 -0.29 -0.29 -0.07 0.20  1.00   0.82 -0.13 -0.07  0.09
pcBfat -0.33 0.10 -0.35 -0.36 -0.13 0.11  0.82   1.00 -0.24 -0.16 -0.01
lbm     0.41 0.08  0.44  0.46  0.22 0.52 -0.13  -0.24  1.00  0.61  0.77
ht      0.27 0.03  0.29  0.28  0.11 0.24 -0.07  -0.16  0.61  1.00  0.59
wt      0.28 0.12  0.30  0.33  0.20 0.65  0.09  -0.01  0.77  0.59  1.00

L'ultima parte dello script realizza un grafico che fornisce la necessaria integrazione grafica all'analisi numerica.

Impiegando la funzione scatterplotMatrix() viene realizzato con una sola riga di codice un grafico che riporta sulla diagonale per ciascuna variabile il kernek density plot, e per ciascuna coppia di variabili il grafico di dispersione (xy) con la relativa retta di regressione.


I dettagli delle funzioni qui impiegate, tutte molto semplici, li trovate come al solito digitando help(nomedellafunzione) nella Console di R.


----------

[1] Vedere il post Correlazione e causazione.

[2] Vedere il post Correlogrammi.

[3] Vedere il post Il set di dati Galton.

[4] Vedere il post Il set di dati ais nel quale trovate anche come caricare i dati della tabella senza impiegare il pacchetto DAAG


Nessun commento:

Posta un commento