Correlazione in R: matrice di correlazione di Pearson e Spearman

Correlazione bivariata in R

Una relazione bivariata descrive una relazione, o correlazione, tra due variabili in R. In questo tutorial discuteremo il concetto di correlazione e mostreremo come puรฒ essere utilizzato per misurare la relazione tra due variabili qualsiasi in R.

Correlazione nella programmazione R

Esistono due metodi principali per calcolare la correlazione tra due variabili nella programmazione R:

  • Pearson: Correlazione parametrica
  • Spearman: Correlazione non parametrica

Matrice di correlazione di Pearson in R

Il metodo di correlazione di Pearson viene solitamente utilizzato come controllo primario per la relazione tra due variabili.

La frequenza delle onde ultrasoniche รจ misurata in kilohertz (kHz). Diverse frequenze puntano la grassa in modi leggermente diversi. Le frequenze piรน basse raggiungono la grassa piรน profonda, mentre le frequenze piรน alte lavorano piรน vicino alla superficie. coefficiente di correlazione, , รจ una misura della forza del lineare relazione tra due variabili e . Viene calcolato come segue:

Matrice di correlazione di Pearson in R

con

  • Matrice di correlazione di Pearson in R, cioรจ la deviazione standard di
  • Matrice di correlazione di Pearson in R, cioรจ la deviazione standard di

La correlazione varia tra -1 e 1.

  • Un valore vicino o uguale a 0 implica una relazione lineare scarsa o assente tra e .
  • Al contrario, piรน si avvicina a 1 o -1, piรน forte รจ la relazione lineare.

Possiamo calcolare il test t come segue e controllare la tabella di distribuzione con un grado di libertร  pari a:

Matrice di correlazione di Pearson in R

Correlazione del rango di Spearman in R

Una correlazione di rango ordina le osservazioni in base al rango e calcola il livello di somiglianza tra i ranghi. Una correlazione di rango ha il vantaggio di essere robusta rispetto ai valori anomali e non รจ collegata alla distribuzione dei dati. Si noti che una correlazione di rango รจ adatta per la variabile ordinale.

La correlazione del rango di Spearman, , รจ sempre compresa tra -1 e 1 con un valore vicino all'estremitร  indica una relazione forte. Viene calcolato come segue:

Correlazione del rango di Spearman in R

con dichiarate le covarianze tra rango e . Il denominatore calcola le deviazioni standard.

In R, possiamo usare la funzione cor(). Sono necessari tre argomenti, e il metodo.

cor(x, y, method)

argomenti:

  • x: Primo vettore
  • y: Secondo vettore
  • metodo: La formula utilizzata per calcolare la correlazione. Tre valori stringa:
    • โ€œperoneโ€
    • โ€œKendallโ€
    • โ€œlanciereโ€

รˆ possibile aggiungere un argomento facoltativo se i vettori contengono valori mancanti: use = โ€œcomplete.obsโ€

Utilizzeremo il set di dati BudgetUK. Questo set di dati riporta la dotazione di bilancio delle famiglie britanniche tra il 1980 e il 1982. Sono presenti 1519 osservazioni con dieci caratteristiche, tra cui:

  • wfood: condividere la spesa per il cibo
  • wcarburante: condividere la spesa per il carburante
  • wcloth: quota di budget per la spesa in abbigliamento
  • Walc: condividere la spesa per l'alcol
  • wtrans: condividere la spesa per i trasporti
  • altro: quota di spesa per altri beni
  • totex: spesa totale delle famiglie in sterline
  • reddito: reddito familiare netto totale
  • : etร  del nucleo familiare
  • bambini: Numero di bambini

Esempio

library(dplyr)
PATH <-"https://raw.githubusercontent.com/guru99-edu/R-Programming/master/british_household.csv"
data <-read.csv(PATH)
  filter(income < 500)
  mutate(log_income = log(income),
         log_totexp = log(totexp),
         children_fac = factor(children, order = TRUE, labels = c("No", "Yes")))
  select(-c(X,X.1, children, totexp, income))
glimpse(data)

Spiegazione del codice

  • Per prima cosa importiamo i dati e diamo un'occhiata con la funzione scorce() dalla libreria dplyr.
  • Tre punti sono superiori a 500, quindi abbiamo deciso di escluderli.
  • รˆ una pratica comune convertire una variabile monetaria in log. Aiuta a ridurre l'impatto dei valori anomali e diminuisce l'asimmetria nel set di dati.

Produzione:

## Observations: 1,516## Variables: 10
## $ wfood        <dbl> 0.4272, 0.3739, 0.1941, 0.4438, 0.3331, 0.3752, 0...
## $ wfuel        <dbl> 0.1342, 0.1686, 0.4056, 0.1258, 0.0824, 0.0481, 0...
## $ wcloth       <dbl> 0.0000, 0.0091, 0.0012, 0.0539, 0.0399, 0.1170, 0...
## $ walc         <dbl> 0.0106, 0.0825, 0.0513, 0.0397, 0.1571, 0.0210, 0...
## $ wtrans       <dbl> 0.1458, 0.1215, 0.2063, 0.0652, 0.2403, 0.0955, 0...
## $ wother       <dbl> 0.2822, 0.2444, 0.1415, 0.2716, 0.1473, 0.3431, 0...
## $ age          <int> 25, 39, 47, 33, 31, 24, 46, 25, 30, 41, 48, 24, 2...
## $ log_income   <dbl> 4.867534, 5.010635, 5.438079, 4.605170, 4.605170,...
## $ log_totexp   <dbl> 3.912023, 4.499810, 5.192957, 4.382027, 4.499810,...
## $ children_fac <ord> Yes, Yes, Yes, Yes, No, No, No, No, No, No, Yes, ...

Possiamo calcolare il coefficiente di correlazione tra le variabili reddito e cibo con i metodi โ€œpearsonโ€ e โ€œspearmanโ€.

cor(data$log_income, data$wfood, method = "pearson")

Produzione:

## [1] -0.2466986
cor(data$log_income, data$wfood, method = "spearman")

Produzione:

## [1] -0.2501252

Matrice di correlazione in R

La correlazione bivariata รจ un buon inizio, ma possiamo ottenere un quadro piรน ampio con lโ€™analisi multivariata. Una correlazione con molte variabili รจ raffigurata all'interno di a matrice di correlazione. Una matrice di correlazione รจ una matrice che rappresenta la correlazione di coppia di tutte le variabili.

La funzione cor() restituisce una matrice di correlazione. L'unica differenza con la correlazione bivariata รจ che non รจ necessario specificare quali variabili. Per impostazione predefinita, R calcola la correlazione tra tutte le variabili.

Si noti che non รจ possibile calcolare una correlazione per la variabile fattore. Dobbiamo assicurarci di eliminare la funzionalitร  categorica prima di passare il frame di dati all'interno di cor().

Una matrice di correlazione รจ simmetrica, il che significa che i valori sopra la diagonale hanno gli stessi valori di quello sotto. รˆ piรน visivo mostrare metร  della matrice.

Escludiamo children_fac perchรฉ รจ una variabile a livello di fattore. cor non esegue la correlazione su una variabile categoriale.

# the last column of data is a factor level. We don't include it in the code
mat_1 <-as.dist(round(cor(data[,1:9]),2))
mat_1

Spiegazione del codice

  • cor(dati): Visualizza la matrice di correlazione
  • round(dati, 2): Arrotonda la matrice di correlazione con due decimali
  • as.dist(): Mostra solo la seconda metร 

Produzione:

##            wfood wfuel wcloth  walc wtrans wother   age log_income
## wfuel       0.11                                                  
## wcloth     -0.33 -0.25                                            
## walc       -0.12 -0.13  -0.09                                     
## wtrans     -0.34 -0.16  -0.19 -0.22                               
## wother     -0.35 -0.14  -0.22 -0.12  -0.29                        
## age         0.02 -0.05   0.04 -0.14   0.03   0.02                 
## log_income -0.25 -0.12   0.10  0.04   0.06   0.13  0.23           
## log_totexp -0.50 -0.36   0.34  0.12   0.15   0.15  0.21       0.49

Livello di significativitร 

Il livello di significativitร  รจ utile in alcune situazioni quando utilizziamo il metodo Pearson o Spearman. La funzione rcorr() della libreria Hmisc calcola per noi il valore p. Possiamo scaricare la libreria da contea e copia il codice per incollarlo nel terminale:

conda install -c r r-hmisc

rcorr() richiede che un frame di dati venga memorizzato come matrice. Possiamo convertire i nostri dati in una matrice prima di calcolare la matrice di correlazione con il valore p.

library("Hmisc")
data_rcorr <-as.matrix(data[, 1: 9])

mat_2 <-rcorr(data_rcorr)
# mat_2 <-rcorr(as.matrix(data)) returns the same output

L'oggetto lista mat_2 contiene tre elementi:

  • r: Output della matrice di correlazione
  • n: Numero di osservazioni
  • P: valore p

A noi interessa il terzo elemento, il valore p. รˆ comune mostrare la matrice di correlazione con il valore p anzichรฉ con il coefficiente di correlazione.

p_value <-round(mat_2[["P"]], 3)
p_value

Spiegazione del codice

  • mat_2[[โ€œPโ€]]: I valori p sono memorizzati nell'elemento chiamato P
  • giro(mat_2[[โ€œPโ€]], 3): Arrotonda gli elementi con tre cifre

Produzione:

           wfood wfuel wcloth  walc wtrans wother   age log_income log_totexp
wfood         NA 0.000  0.000 0.000  0.000  0.000 0.365      0.000          0
wfuel      0.000    NA  0.000 0.000  0.000  0.000 0.076      0.000          0
wcloth     0.000 0.000     NA 0.001  0.000  0.000 0.160      0.000          0
walc       0.000 0.000  0.001    NA  0.000  0.000 0.000      0.105          0
wtrans     0.000 0.000  0.000 0.000     NA  0.000 0.259      0.020          0
wother     0.000 0.000  0.000 0.000  0.000     NA 0.355      0.000          0
age        0.365 0.076  0.160 0.000  0.259  0.355    NA      0.000          0
log_income 0.000 0.000  0.000 0.105  0.020  0.000 0.000         NA          0
log_totexp 0.000 0.000  0.000 0.000  0.000  0.000 0.000      0.000         NA

Visualizzazione della matrice di correlazione in R

Una mappa termica รจ un altro modo per mostrare una matrice di correlazione. La libreria GGally รจ un'estensione di ggplot2. Attualmente non รจ disponibile nella libreria conda. Possiamo installarlo direttamente nella console.

install.packages("GGally")

Visualizzazione della matrice di correlazione

La libreria include diverse funzioni per mostrare le statistiche riassuntive come la correlazione e la distribuzione di tutte le variabili in a matrice.

La funzione ggcorr() ha molti argomenti. Introdurremo solo gli argomenti che utilizzeremo nel tutorial:

La funzione ggcorr

ggcorr(df, method = c("pairwise", "pearson"),
  nbreaks = NULL, digits = 2, low = "#3B9AB2",
  mid = "#EEEEEE", high = "#F21A00",
  geom = "tile", label = FALSE,
  label_alpha = FALSE)

Argomenti:

  • df: set di dati utilizzato
  • metodo: Formula per calcolare la correlazione. Per impostazione predefinita, vengono calcolati pairwise e Pearson
  • nbreaks: Restituisce un intervallo categoriale per la colorazione dei coefficienti. Per impostazione predefinita, nessuna interruzione e la sfumatura di colore รจ continua
  • cifre: Arrotonda il coefficiente di correlazione. Per impostazione predefinita, impostato su 2
  • Basso: controlla il livello inferiore della colorazione
  • e lancio di program changes: controlla il livello medio della colorazione
  • alto: Controlla il livello elevato della colorazione
  • geome: controlla la forma dell'argomento geometrico. Per impostazione predefinita, "piastrella"
  • etichetta: valore booleano. Visualizzare o meno l'etichetta. Per impostazione predefinita, impostato su "FALSE".

Mappa termica di base

La trama piรน semplice del pacchetto รจ una mappa termica. La legenda del grafico mostra un gradiente di colore da โ€“ 1 a 1, con il colore caldo che indica una forte correlazione positiva e il colore freddo, una correlazione negativa.

library(GGally)
ggcorr(data)

Spiegazione del codice

  • ggcorr(dati): รจ necessario un solo argomento, ovvero il nome del frame di dati. Le variabili a livello di fattore non sono incluse nel grafico.

Produzione:

Mappa termica di base

Aggiunta di controllo alla mappa di calore

Possiamo aggiungere piรน controlli al grafico:

ggcorr(data,
    nbreaks = 6,
    low = "steelblue",
    mid = "white",
    high = "darkred",
    geom = "circle")

Spiegazione del codice

  • ninterruzioni=6: spezza la leggenda con 6 gradi.
  • basso = โ€œbluacciaioโ€: utilizza colori piรน chiari per la correlazione negativa
  • metร  = โ€œbiancoโ€: utilizzare i colori bianchi per la correlazione dei range medi
  • alto = โ€œrosso scuroโ€: utilizza colori scuri per una correlazione positiva
  • geom = โ€œcerchioโ€: Usa il cerchio come forma delle finestre nella mappa termica. La dimensione del cerchio รจ proporzionale al valore assoluto della correlazione.

Produzione:

Aggiunta di controllo alla mappa di calore

Aggiunta di un'etichetta alla mappa termica

GGally ci permette di aggiungere un'etichetta all'interno delle finestre:

ggcorr(data,
    nbreaks = 6,
    label = TRUE,
    label_size = 3,
    color = "grey50")

Spiegazione del codice

  • etichetta = VERO: Sommare i valori dei coefficienti di correlazione all'interno della mappa termica.
  • colore = โ€œgrigio50โ€: Scegli il colore, ovvero grigio
  • etichetta_dimensione = 3: imposta la dimensione dell'etichetta su 3

Produzione:

Aggiunta di un'etichetta alla mappa termica

La funzione ggpairs

Infine, introduciamo un'altra funzione della libreria GGaly. Ggpair. Produce un grafico in formato matrice. Possiamo visualizzare tre tipi di calcolo all'interno di un grafico. La matrice รจ una dimensione, con uguale al numero di osservazioni. La parte superiore/inferiore visualizza finestre e nella diagonale. Possiamo controllare quali informazioni vogliamo mostrare in ogni parte della matrice. La formula per ggpair รจ:

ggpair(df, columns = 1: ncol(df), title = NULL,
    upper = list(continuous = "cor"),
    lower = list(continuous = "smooth"),
    mapping = NULL)		

Argomenti:

  • df: set di dati utilizzato
  • colonne: Seleziona le colonne per disegnare la trama
  • titolo: include un titolo
  • superiore: Controlla le caselle sopra la diagonale del grafico. รˆ necessario fornire il tipo di calcoli o grafico da restituire. Se continuous = "cor", chiediamo a R di calcolare la correlazione. Nota che l'argomento deve essere un elenco. Possono essere utilizzati altri argomenti, vedere la [vignetta]("http://ggobi.github.io/ggally/#custom_functions") per maggiori informazioni.
  • Abbassare: Controlla le caselle sotto la diagonale.
  • Mappatura: Indica l'estetica del grafico. Ad esempio, possiamo calcolare il grafico per diversi gruppi.

Analisi bivariata con ggpair con raggruppamento

Il grafico successivo traccia tre informazioni:

  • La matrice di correlazione tra log_totexp, log_reddito, etร  e la variabile wtrans raggruppata in base al fatto che la famiglia abbia o meno un figlio.
  • Traccia la distribuzione di ciascuna variabile per gruppo
  • Visualizza il grafico a dispersione con l'andamento per gruppo
library(ggplot2)
ggpairs(data, columns = c("log_totexp", "log_income", "age", "wtrans"), title = "Bivariate analysis of revenue expenditure by the British household", upper = list(continuous = wrap("cor",
        size = 3)),
    lower = list(continuous = wrap("smooth",
        alpha = 0.3,
        size = 0.1)),
    mapping = aes(color = children_fac))

Spiegazione del codice

  • colonne = c("log_totexp", "log_reddito", "etร ", "wtrans"): Scegli le variabili da mostrare nel grafico
  • title = โ€œAnalisi bivariata della spesa delle entrate delle famiglie britannicheโ€: aggiungi un titolo
  • superiore = elenco(): controlla la parte superiore del grafico. Cioรจ sopra la diagonale
  • continuo = avvolgere("cor", dimensione = 3)): Calcola il coefficiente di correlazione. Avvolgiamo l'argomento continuo all'interno della funzione wrap() per controllare l'estetica del grafico (cioรจ dimensione = 3) -lower = list(): controlla la parte inferiore del grafico. Cioรจ sotto la diagonale.
  • continuo = avvolgere("liscio",alfa = 0.3,dimensione=0.1): aggiunge un grafico a dispersione con un andamento lineare. Avvolgiamo l'argomento continuo all'interno della funzione wrap() per controllare l'estetica del grafico (ad esempio size=0.1, alpha=0.3)
  • mappatura = aes(colore = bambini_fac): Vogliamo che ogni parte del grafico sia impilata dalla variabile children_fac, che รจ una variabile categoriale che assume il valore 1 se la famiglia non ha figli e 2 altrimenti

Produzione:

Analisi bivariata con ggpair con raggruppamento

Analisi bivariata con ggpair con raggruppamento parziale

Il grafico qui sotto รจ leggermente diverso. Cambiamo la posizione della mappatura all'interno dell'argomento superiore.

ggpairs(data, columns = c("log_totexp", "log_income", "age", "wtrans"),
    title = "Bivariate analysis of revenue expenditure by the British household",
    upper = list(continuous = wrap("cor",
            size = 3),
        mapping = aes(color = children_fac)),
    lower = list(
        continuous = wrap("smooth",
            alpha = 0.3,
            size = 0.1))
)

Spiegazione del codice

  • Stesso codice dell'esempio precedente tranne che per:
  • mapping = aes(color = children_fac): sposta la lista in upper = list(). Vogliamo solo il calcolo impilato per gruppo nella parte superiore del grafico.

Produzione:

Analisi bivariata con ggpair con raggruppamento parziale

Sintesi

  • Una relazione bivariata descrive una relazione, o correlazione, tra due variabili in R.
  • Esistono due metodi principali per calcolare la correlazione tra due variabili in R Programmazione: Pearson e Spearman.
  • Il metodo di correlazione di Pearson viene solitamente utilizzato come controllo primario per la relazione tra due variabili.
  • Una correlazione di rango ordina le osservazioni in base al rango e calcola il livello di somiglianza tra i ranghi.
  • La correlazione del rango di Spearman, , รจ sempre compresa tra -1 e 1 con un valore vicino all'estremitร  indica una relazione forte.
  • Una matrice di correlazione รจ una matrice che rappresenta la correlazione di coppia di tutte le variabili.
  • Il livello di significativitร  รจ utile in alcune situazioni quando utilizziamo il metodo Pearson o Spearman.

Possiamo riassumere tutte le funzioni di Correlazione in R nella tabella seguente:

Biblioteca Obiettivo Metodo Code
Tavola XY correlazione bivariata Pearson
cor(dfx2, method = "pearson")
Tavola XY correlazione bivariata Spearman
cor(dfx2, method = "spearman")
Tavola XY Correlazione multivariata Pearson
cor(df, method = "pearson")
Tavola XY Correlazione multivariata Spearman
cor(df, method = "spearman")
Hmisc Valore P
rcorr(as.matrix(data[,1:9]))[["P"]]
Ggalmente mappa di calore
ggcorr(df)
Grafici multivariati
cf code below

Riassumi questo post con: