Correlazione in R: Pearson & Spearman con Matrix Example

Una relazione bivariata descrive una relazione -o correlazione- tra due variabili e. In questo tutorial, discutiamo il concetto di correlazione e mostriamo come può essere utilizzato per misurare la relazione tra due variabili qualsiasi.

Esistono due metodi principali per calcolare la correlazione tra due variabili.

  • Pearson: correlazione parametrica
  • Spearman: correlazione non parametrica

In questo tutorial imparerai

  • Correlazione di Pearson
  • Spearman Rank Correlation
  • Matrice di correlazione
  • Visualizza la matrice di correlazione

Correlazione di Pearson

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

Il coefficiente di correlazione,, è una misura della forza della relazione lineare tra due variabili e. Viene calcolato come segue:

con

  • , ovvero deviazione standard di
  • , ovvero deviazione standard di

La correlazione è compresa tra -1 e 1.

  • Un valore vicino o uguale a 0 implica una relazione lineare minima o nulla tra e.
  • Al contrario, più ci 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à uguale a:

Spearman Rank Correlation

Una correlazione di rango ordina le osservazioni in base al rango e calcola il livello di somiglianza tra il rango. Una correlazione di rango ha il vantaggio di essere robusta ai valori anomali e non è collegata alla distribuzione dei dati. Notare 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:

con dichiarato 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 di stringa:
    • "Pearson"
    • "kendall"
    • "lanciere"

È possibile aggiungere un argomento facoltativo se i vettori contengono un valore mancante: use = "complete.obs"

Useremo il set di dati BudgetUK. Questo set di dati riporta l'allocazione del budget delle famiglie britanniche tra il 1980 e il 1982. Ci sono 1519 osservazioni con dieci caratteristiche, tra cui:

  • wfood: condividi la spesa per il cibo
  • wfuel: condividi la spesa per il carburante
  • wcloth: quota di budget per la spesa per l'abbigliamento
  • walc: condividi la spesa per l'alcol
  • wtrans: condividi la spesa per i trasporti
  • wother: quota di altri beni spesi
  • totexp: spesa familiare totale in sterline
  • reddito reddito familiare netto totale
  • età: età della famiglia
  • 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 uno sguardo alla funzione glimpse () dalla libreria dplyr.
  • Tre punti sono superiori a 500K, quindi abbiamo deciso di escluderli.
  • È pratica comune convertire una variabile monetaria in logaritmo. Aiuta a ridurre l'impatto dei valori anomali e diminuisce l'asimmetria nel set di dati.

Produzione:

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

Possiamo calcolare il coefficiente di correlazione tra le variabili reddito e wfood 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

La correlazione bivariata è un buon inizio, ma possiamo ottenere un quadro più ampio con l'analisi multivariata. Una correlazione con molte variabili è rappresentata all'interno di una 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.

Notare che non è possibile calcolare una correlazione per la variabile fattore. Dobbiamo assicurarci di eliminare la caratteristica categoriale 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 codemat_1 <-as.dist(round(cor(data[,1:9]),2))mat_1

Spiegazione del codice

  • cor (dati): Visualizza la matrice di correlazione
  • round (data, 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 usiamo il metodo Pearson o Spearman. La funzione rcorr () dalla libreria Hmisc calcola per noi il valore p. Possiamo scaricare la libreria da conda e copiare il codice per incollarlo nel terminale:

conda install -c r r-hmisc 

Rcorr () richiede che un data frame 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 elenco mat_2 contiene tre elementi:

  • r: output della matrice di correlazione
  • n: numero di osservazioni
  • P: valore p

Ci interessa il terzo elemento, il valore p. È comune mostrare la matrice di correlazione con il valore p invece del 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
  • round (mat_2 [["P"]], 3): arrotonda gli elementi con tre cifre

Produzione:

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

Visualizza la matrice di correlazione

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 installare direttamente nella console.

install.packages("GGally")

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

La funzione ggcorr () ha molti argomenti. Introdurremo solo gli argomenti che useremo 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 il gradiente di colore è continuo
  • cifre : arrotondare il coefficiente di correlazione. Per impostazione predefinita, impostato su 2
  • basso : controlla il livello inferiore della colorazione
  • mid : controlla il livello medio della colorazione
  • alto : controlla il livello alto della colorazione
  • geom : controlla la forma dell'argomento geometrico. Per impostazione predefinita, "tile"
  • label : valore booleano. Visualizza o meno l'etichetta. Per impostazione predefinita, impostato su "FALSO"

Mappa di calore di base

La trama più semplice del pacchetto è una mappa di calore. La legenda del grafico mostra un colore sfumato da - 1 a 1, con un colore caldo che indica una forte correlazione positiva e un colore freddo, una correlazione negativa.

library(GGally)ggcorr(data)

Spiegazione del codice

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

Produzione:

Aggiungi il controllo alla mappa termica

Possiamo aggiungere più controlli al grafico.

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

Spiegazione del codice

  • nbreaks = 6: spezza la leggenda con 6 ranghi.
  • low = "steelblue": usa colori più chiari per la correlazione negativa
  • mid = "white": utilizza i colori bianchi per la correlazione degli intervalli medi
  • high = "darkred": usa colori scuri per una correlazione positiva
  • geom = "circle": utilizza il cerchio come forma delle finestre nella mappa termica. La dimensione del cerchio è proporzionale al valore assoluto della correlazione.

Produzione:

Aggiungi l'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

  • label = TRUE: Aggiungi i valori dei coefficienti di correlazione all'interno della mappa termica.
  • color = "grey50": scegli il colore, ad es. grigio
  • label_size = 3: imposta la dimensione dell'etichetta uguale a 3

Produzione:

ggpairs

Infine, introduciamo un'altra funzione dalla libreria GGaly. Ggpair. Produce un grafico in un formato a 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 mostra le finestre e in 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 : selezionare le colonne per disegnare il grafico
  • titolo : includi un titolo
  • superiore : controlla le caselle sopra la diagonale del grafico. È necessario fornire il tipo di calcolo o grafico da restituire. Se continue = "cor", chiediamo a R di calcolare la correlazione. Nota che l'argomento deve essere un elenco. È possibile utilizzare altri argomenti, vedere la [vignetta] ("http://ggobi.github.io/ggally/#custom_functions") per ulteriori informazioni.
  • Inferiore : 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 le variabili log_totexp, log_income, age e wtrans raggruppate 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_income", "age", "wtrans"): scegli le variabili da mostrare nel grafico
  • title = "Analisi bivariata delle entrate della famiglia britannica": aggiungere un titolo
  • upper = list (): controlla la parte superiore del grafico. Cioè sopra la diagonale
  • continue = wrap ("cor", size = 3)): Calcola il coefficiente di correlazione. Avvolgiamo l'argomento continuous all'interno della funzione wrap () per controllare l'estetica del grafico (cioè size = 3) -lower = list (): controlla la parte inferiore del grafico. Cioè sotto la diagonale.
  • continue = wrap ("smooth", alpha = 0.3, size = 0.1): aggiungi un grafico a dispersione con una tendenza lineare. Avvolgiamo l'argomento continuous all'interno della funzione wrap () per controllare l'estetica del grafico (es. Size = 0.1, alpha = 0.3)
  • mapping = aes (color = children_fac): Vogliamo che ogni parte del grafico sia impilata dalla variabile children_fac, che è una variabile categoriale che assume il valore di 1 se la famiglia non ha figli e 2 altrimenti

Produzione:

Analisi bivariata con ggpair con raggruppamento parziale

Il grafico 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 esatto dell'esempio precedente tranne:
  • mapping = aes (color = children_fac): sposta l'elenco in alto = list (). Vogliamo solo il calcolo impilato per gruppo nella parte superiore del grafico.

Produzione:

Sommario

Possiamo riassumere la funzione nella tabella seguente:

biblioteca

Obbiettivo

metodo

codice

Base

correlazione bivariata

Pearson

cor(dfx2, method = "pearson")

Base

correlazione bivariata

Lanciere

cor(dfx2, method = "spearman")

Base

Correlazione multivariata

Pearson

cor(df, method = "pearson")

Base

Correlazione multivariata

Lanciere

cor(df, method = "spearman")

Hmisc

Valore P.

rcorr(as.matrix(data[,1:9]))[["P"]]

Ggally

mappa di calore

ggcorr(df)

Grafici multivariati

cf code below

Articoli interessanti...