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.
coefficiente di correlazione, , è una misura della forza del lineare relazione tra due variabili e . Viene calcolato come segue:
con
, cioè la deviazione standard di
, 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:
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:
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")
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:
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 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:
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 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:
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 |