Corelația în R: Matricea de corelație Pearson și Spearman
Corelația bivariată în R
O relație bivariată descrie o relație -sau o corelație- între două variabile din R. În acest tutorial, vom discuta conceptul de corelație și vom arăta cum poate fi utilizată pentru a măsura relația dintre oricare două variabile din R.
Corelația în programarea R
Există două metode principale pentru a calcula corelația dintre două variabile în programarea R:
- Pearson: Corelație parametrică
- Spearman: Corelație neparametrică
Matricea de corelație Pearson în R
Metoda de corelație Pearson este de obicei folosită ca o verificare primară pentru relația dintre două variabile.
coeficientul de corelare, , este o măsură a puterii liniar relația dintre două variabile și . Se calculează după cum urmează:
cu
, adică abaterea standard a
, adică abaterea standard a
Corelația variază între -1 și 1.
- O valoare apropiată sau egală cu 0 implică o relație liniară mică sau deloc între și .
- În schimb, cu cât se apropie mai mult de 1 sau -1, cu atât relația liniară este mai puternică.
Putem calcula testul t după cum urmează și putem verifica tabelul de distribuție cu un grad de libertate egal cu:
Corelația rangului Spearman în R
O corelație de rang sortează observațiile după rang și calculează nivelul de similitudine dintre rang. O corelație de rang are avantajul de a fi robustă la valori aberante și nu este legată de distribuția datelor. Rețineți că, o corelație de rang este potrivită pentru variabila ordinală.
Corelația de rang a lui Spearman, , este întotdeauna între -1 și 1, cu o valoare apropiată de extremitate indică o relație puternică. Se calculează după cum urmează:
cu afirmate covarianţele dintre rang şi . Numitorul calculează abaterile standard.
În R, putem folosi funcția cor(). Este nevoie de trei argumente, și metoda.
cor(x, y, method)
Argumente:
- x: Primul vector
- y: Al doilea vector
- metodă: Formula utilizată pentru a calcula corelația. Trei valori de șir:
- „Pearson”
- „Kendall”
- „lancisor”
Un argument opțional poate fi adăugat dacă vectorii conțin valoare lipsă: use = „complete.obs”
Vom folosi setul de date BudgetUK. Acest set de date raportează alocarea bugetară a gospodăriilor britanice între 1980 și 1982. Există 1519 observații cu zece caracteristici, printre care:
- waliment: partajarea cheltuielilor alimentare
- wcombustibil: împarte cheltuielile de combustibil
- pânză: cota de buget pentru cheltuirea îmbrăcămintei
- walc: împărțiți cheltuielile cu alcool
- wtrans: împarte cheltuielile de transport
- cutare: cota din cheltuielile altor bunuri
- totexp: cheltuielile totale ale gospodăriei în lire sterline
- venituri: venitul total net al gospodăriei
- vârstă: vârsta gospodăriei
- copiilor: Numărul de copii
Exemplu
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)
Explicarea codului
- Mai întâi importăm datele și aruncăm o privire cu funcția glimpse() din biblioteca dplyr.
- Trei puncte sunt peste 500K, așa că am decis să le excludem.
- Este o practică obișnuită să convertiți o variabilă monetară în log. Ajută la reducerea impactului valorilor aberante și scade asimetria setului de date.
ieșire:
## 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, ...
Putem calcula coeficientul de corelație dintre variabilele venit și wfood cu metodele „pearson” și „spearman”.
cor(data$log_income, data$wfood, method = "pearson")
ieșire:
## [1] -0.2466986
cor(data$log_income, data$wfood, method = "spearman")
ieșire:
## [1] -0.2501252
Matricea de corelație în R
Corelația bivariată este un început bun, dar putem obține o imagine mai largă cu analiza multivariată. O corelație cu multe variabile este ilustrată în interiorul a matricea de corelare. O matrice de corelație este o matrice care reprezintă corelația de pereche a tuturor variabilelor.
Funcția cor() returnează o matrice de corelație. Singura diferență cu corelația bivariată este că nu trebuie să specificăm care variabile. În mod implicit, R calculează corelația dintre toate variabilele.
Rețineți că, o corelație nu poate fi calculată pentru variabila factor. Trebuie să ne asigurăm că renunțăm la caracteristica categorială înainte de a trece cadrul de date în interiorul cor().
O matrice de corelație este simetrică, ceea ce înseamnă că valorile de deasupra diagonalei au aceleași valori ca cele de mai jos. Este mai vizual să afișați jumătate din matrice.
Excludem children_fac deoarece este o variabilă la nivel de factor. cor nu realizează corelarea pe o variabilă categorială.
# 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
Explicarea codului
- cor(date): Afișează matricea de corelație
- rotund(date, 2): Rotunjește matricea de corelație cu două zecimale
- ca.dist(): Afișează doar a doua jumătate
ieșire:
## 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
Nivelul de semnificație
Nivelul de semnificație este util în unele situații când folosim metoda pearson sau spearman. Funcția rcorr() din biblioteca Hmisc calculează pentru noi valoarea p. Putem descărca biblioteca de pe judetul și copiați codul pentru a-l lipi în terminal:
conda install -c r r-hmisc
rcorr() necesită ca un cadru de date să fie stocat ca o matrice. Ne putem converti datele într-o matrice înainte de a calcula matricea de corelație cu valoarea 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
Obiectul listă mat_2 conține trei elemente:
- r: Ieșirea matricei de corelație
- n: Numărul de observații
- P: valoarea p
Ne interesează al treilea element, valoarea p. Este obișnuit să se arate matricea de corelație cu valoarea p în locul coeficientului de corelație.
p_value <-round(mat_2[["P"]], 3) p_value
Explicarea codului
- mat_2[[„P”]]: Valorile p sunt stocate în elementul numit P
- rotund(mat_2[[„P”]], 3): Rotunjesc elementele cu trei cifre
ieșire:
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
Vizualizarea matricei de corelație în R
O hartă termică este o altă modalitate de a afișa o matrice de corelație. Biblioteca GGally este o extensie a ggplot2. În prezent, nu este disponibil în biblioteca conda. Putem instala direct in consola.
install.packages("GGally")
Biblioteca include diferite funcții pentru a afișa statisticile sumar, cum ar fi corelarea și distribuția tuturor variabilelor dintr-un matrice.
Funcția ggcorr() are o mulțime de argumente. Vom introduce doar argumentele pe care le vom folosi în tutorial:
Funcția ggcorr
ggcorr(df, method = c("pairwise", "pearson"), nbreaks = NULL, digits = 2, low = "#3B9AB2", mid = "#EEEEEE", high = "#F21A00", geom = "tile", label = FALSE, label_alpha = FALSE)
argumente:
- df: Setul de date utilizat
- metodă: Formula pentru a calcula corelația. În mod implicit, perechi și Pearson sunt calculate
- nbreaks: Returnează un interval categoric pentru colorarea coeficienților. În mod implicit, nu există pauză și gradientul de culoare este continuu
- cifre: Rotunjește coeficientul de corelație. În mod implicit, setați la 2
- scăzut: Controlați nivelul inferior al colorației
- la mijlocul: Controlați nivelul mediu al colorației
- înalt: Controlați nivelul ridicat al colorației
- geom: Controlați forma argumentului geometric. În mod implicit, „tigla”
- etichetă: valoare booleană. Afișați sau nu eticheta. În mod implicit, setați la `FALSE`
Harta termică de bază
Cel mai elementar complot al pachetului este o hartă termică. Legenda graficului arată o culoare gradient de la – 1 la 1, cu culoarea fierbinte indicând o corelație pozitivă puternică și culoarea rece, o corelație negativă.
library(GGally) ggcorr(data)
Explicarea codului
- ggcorr(date): Este necesar un singur argument, care este numele cadrului de date. Variabilele la nivel de factor nu sunt incluse în grafic.
ieșire:
Adăugarea controlului la harta termică
Putem adăuga mai multe controale graficului:
ggcorr(data, nbreaks = 6, low = "steelblue", mid = "white", high = "darkred", geom = "circle")
Explicarea codului
- nbreaks=6: sparge legenda cu 6 ranguri.
- scăzut = „albastru de oțel”: Folosiți culori mai deschise pentru corelarea negativă
- mijloc = „alb”: Folosiți culorile albe pentru corelarea intervalelor medii
- ridicat = „întunecat”: Folosiți culori închise pentru o corelație pozitivă
- geom = „cerc”: Folosiți cerc ca formă a ferestrelor în harta termică. Mărimea cercului este proporțională cu valoarea absolută a corelației.
ieșire:
Adăugarea etichetei la harta termică
GGally ne permite să adăugăm o etichetă în interiorul ferestrelor:
ggcorr(data, nbreaks = 6, label = TRUE, label_size = 3, color = "grey50")
Explicarea codului
- etichetă = TRUE: Adăugați valorile coeficienților de corelație în interiorul hărții termice.
- culoare = „gri50”: Alegeți culoarea, adică gri
- label_size = 3: Setați dimensiunea etichetei la 3
ieșire:
Funcția ggpairs
În cele din urmă, introducem o altă funcție din biblioteca GGaly. Ggpair. Produce un grafic într-un format de matrice. Putem afișa trei tipuri de calcule într-un singur grafic. Matricea este o dimensiune, cu numărul de observații egal. Partea superioară/inferioară afișează ferestre și în diagonală. Putem controla ce informații dorim să arătăm în fiecare parte a matricei. Formula pentru ggpair este:
ggpair(df, columns = 1: ncol(df), title = NULL, upper = list(continuous = "cor"), lower = list(continuous = "smooth"), mapping = NULL)
argumente:
- df: Setul de date utilizat
- coloane: Selectați coloanele pentru a desena diagrama
- titlu: Includeți un titlu
- UPPER: Controlați casetele de deasupra diagonalei parcelei. Trebuie să furnizați tipul de calcule sau graficul de returnat. Dacă continuu = „cor”, îi cerem lui R să calculeze corelația. Rețineți că, argumentul trebuie să fie o listă. Pot fi folosite și alte argumente, consultați [vigneta](„http://ggobi.github.io/ggally/#custom_functions”) pentru mai multe informații.
- Coborâți: Controlați casetele de sub diagonală.
- Maparea: Indică estetica graficului. De exemplu, putem calcula graficul pentru diferite grupuri.
Analiză bivariată cu ggpair cu grupare
Următorul grafic prezintă trei informații:
- Matricea de corelație între log_totexp, log_income, vârstă și variabila wtrans grupată în funcție de faptul dacă gospodăria are un copil sau nu.
- Reprezentați grafic distribuția fiecărei variabile în funcție de grup
- Afișați graficul de dispersie cu tendința pe grup
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))
Explicarea codului
- coloane = c(„log_totexp”, „log_income”, „varsta”, „wtrans”): Alegeți variabilele de afișat în grafic
- titlu = „Analiza bivariată a veniturilor cheltuielilor de către gospodăria britanică”: Adăugați un titlu
- sus = lista(): Controlați partea superioară a graficului. Adică deasupra diagonalei
- continuu = wrap(„cor”, dimensiune = 3)): Calculați coeficientul de corelație. Înfășurăm argumentul continuu în interiorul funcției wrap() pentru a controla estetica graficului (adică dimensiunea = 3) -lower = list(): controlează partea inferioară a graficului. Adică Sub diagonală.
- continuu = wrap ("neted", alfa = 0.3, dimensiune = 0.1): Adăugați un grafic de dispersie cu o tendință liniară. Înfășurăm argumentul continuu în interiorul funcției wrap() pentru a controla estetica graficului (adică dimensiunea=0.1, alpha=0.3)
- cartografiere = aes(culoare = children_fac): Dorim ca fiecare parte a graficului să fie stivuită de variabila children_fac, care este o variabilă categorială care ia valoarea 1 dacă gospodăria nu are copii și 2 în caz contrar
ieșire:
Analiză bivariată cu ggpair cu grupare parțială
Graficul de mai jos este puțin diferit. Schimbăm poziția mapării în interiorul argumentului superior.
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)) )
Explicarea codului
- Exact același cod ca exemplul anterior, cu excepția:
- mapping = aes(culoare = children_fac): Mută lista în sus = list(). Vrem doar calculul stivuit pe grup în partea superioară a graficului.
ieșire:
Rezumat
- O relație bivariată descrie o relație -sau corelație- între două variabile din R.
- Există două metode principale pentru a calcula corelația dintre două variabile în Programare R: Pearson & Spearman.
- Metoda de corelație Pearson este de obicei folosită ca o verificare primară pentru relația dintre două variabile.
- O corelație de rang sortează observațiile după rang și calculează nivelul de similitudine dintre rang.
- Corelația de rang a lui Spearman, , este întotdeauna între -1 și 1, cu o valoare apropiată de extremitate indică o relație puternică.
- O matrice de corelație este o matrice care reprezintă corelația de pereche a tuturor variabilelor.
- Nivelul de semnificație este util în unele situații când folosim metoda pearson sau spearman.
Putem rezuma toate funcțiile de corelație din R în tabelul de mai jos:
Bibliotecă | Obiectiv | Metodă | Cod |
---|---|---|---|
bază | corelație bivariată | Pearson |
cor(dfx2, method = "pearson") |
bază | corelație bivariată | Spearman |
cor(dfx2, method = "spearman") |
bază | Corelație multivariată | Pearson |
cor(df, method = "pearson") |
bază | Corelație multivariată | Spearman |
cor(df, method = "spearman") |
Hmisc | Valoarea P |
rcorr(as.matrix(data[,1:9]))[["P"]] |
|
Ggally | harta termografica |
ggcorr(df) |
|
Parcele multivariate |
cf code below |