Korrelation i R: Pearson & Spearman Korrelationsmatrix
Bivariat korrelation i R
Et bivariat forhold beskriver en sammenhรฆng -eller korrelation- mellem to variable i R. I denne tutorial vil vi diskutere begrebet korrelation og vise, hvordan det kan bruges til at mรฅle sammenhรฆngen mellem to variable i R.
Korrelation i R-programmering
Der er to primรฆre metoder til at beregne korrelationen mellem to variable i R-programmering:
- Pearson: Parametrisk korrelation
- Spearman: Ikke-parametrisk korrelation
Pearson Correlation Matrix i R
Pearson-korrelationsmetoden bruges normalt som en primรฆr kontrol for sammenhรฆngen mellem to variable.
korrelationskoefficient, , er et mรฅl for styrken af lineรฆr sammenhรฆng mellem to variable og . Det beregnes som fรธlger:
med
, altsรฅ standardafvigelse pรฅ
, altsรฅ standardafvigelse pรฅ
Korrelationen ligger mellem -1 og 1.
- En vรฆrdi pรฅ nรฆr eller lig med 0 indebรฆrer ringe eller ingen lineรฆr sammenhรฆng mellem og .
- I modsรฆtning hertil, jo tรฆttere pรฅ 1 eller -1, jo stรฆrkere er det lineรฆre forhold.
Vi kan beregne t-testen som fรธlger og kontrollere fordelingstabellen med en frihedsgrad svarende til:
Spearman Rank Correlation i R
En rangkorrelation sorterer observationerne efter rang og beregner niveauet af lighed mellem rangeringen. En rangkorrelation har den fordel, at den er robust over for outliers og er ikke knyttet til fordelingen af โโdataene. Bemรฆrk, at en rangkorrelation er velegnet til ordinalvariablen.
Spearmans rangkorrelation, , er altid mellem -1 og 1 med en vรฆrdi tรฆt pรฅ ekstremiteten indikerer et stรฆrkt forhold. Det beregnes som fรธlger:
med anfรธrte kovarianserne mellem rang og . Nรฆvneren beregner standardafvigelserne.
I R kan vi bruge cor()-funktionen. Det krรฆver tre argumenter, og metoden.
cor(x, y, method)
argumenter:
- x: Fรธrste vektor
- y: Anden vektor
- metode: Formlen, der bruges til at beregne korrelationen. Tre strengvรฆrdier:
- "pearson"
- โkendallโ
- "spydmand"
Et valgfrit argument kan tilfรธjes, hvis vektorerne indeholder manglende vรฆrdi: use = "complete.obs"
Vi vil bruge BudgetUK-datasรฆttet. Dette datasรฆt rapporterer budgettildelingen af โโbritiske husholdninger mellem 1980 og 1982. Der er 1519 observationer med ti funktioner, blandt dem:
- wfood: dele mad dele forbrug
- wbrรฆndstof: del brรฆndstofforbrug
- wcloth: budgetandel for tรธjudgifter
- walc: dele alkoholforbrug
- wtrans: dele transportudgifter
- wother: andel af andre varer forbrug
- totexp: husstandens samlede forbrug i pund
- indkomst: husstandens samlede nettoindkomst
- alder: husstandens alder
- bรธrn: antal bรธrn
Eksempel
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)
Code Forklaring
- Vi importerer fรธrst dataene og ser med glimpse()-funktionen fra dplyr-biblioteket.
- Tre point er over 500K, sรฅ vi besluttede at ekskludere dem.
- Det er almindelig praksis at konvertere en monetรฆr variabel i log. Det hjรฆlper med at reducere virkningen af โโoutliers og mindsker skรฆvheden i datasรฆttet.
Output:
## 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, ...
Vi kan beregne korrelationskoefficienten mellem indkomst- og wfood-variabler med "pearson"- og "spearman"-metoderne.
cor(data$log_income, data$wfood, method = "pearson")
Output:
## [1] -0.2466986
cor(data$log_income, data$wfood, method = "spearman")
Output:
## [1] -0.2501252
Korrelationsmatrix i R
Den bivariate korrelation er en god start, men vi kan fรฅ et bredere billede med multivariat analyse. En korrelation med mange variable er afbildet inde i en korrelationsmatrix. En korrelationsmatrix er en matrix, der reprรฆsenterer parkorrelationen af โโalle variablerne.
Cor()-funktionen returnerer en korrelationsmatrix. Den eneste forskel med den bivariate korrelation er, at vi ikke behรธver at specificere hvilke variable. Som standard beregner R korrelationen mellem alle variablerne.
Bemรฆrk, at en korrelation ikke kan beregnes for faktorvariabel. Vi skal sรธrge for, at vi dropper kategoriske funktioner, fรธr vi passerer datarammen inde i cor().
En korrelationsmatrix er symmetrisk, hvilket betyder, at vรฆrdierne over diagonalen har samme vรฆrdier som nedenstรฅende. Det er mere visuelt at vise halvdelen af โโmatrixen.
Vi ekskluderer children_fac, fordi det er en faktorniveauvariabel. cor udfรธrer ikke korrelation pรฅ en kategorisk variabel.
# 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
Code Forklaring
- cor(data): Vis korrelationsmatrixen
- runde(data, 2): Afrund korrelationsmatrixen med to decimaler
- as.dist(): Viser kun anden halvdel
Output:
## 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
Betydningsniveau
Signifikansniveauet er nyttigt i nogle situationer, nรฅr vi bruger pearson- eller spearman-metoden. Funktionen rcorr() fra biblioteket Hmisc beregner p-vรฆrdien for os. Vi kan downloade biblioteket fra Conda og kopier koden for at indsรฆtte den i terminalen:
conda install -c r r-hmisc
rcorr() krรฆver, at en dataramme lagres som en matrix. Vi kan konvertere vores data til en matrix fรธr at beregne korrelationsmatrixen med p-vรฆrdien.
library("Hmisc")
data_rcorr <-as.matrix(data[, 1: 9])
mat_2 <-rcorr(data_rcorr)
# mat_2 <-rcorr(as.matrix(data)) returns the same output
Listeobjektet mat_2 indeholder tre elementer:
- r: Output af korrelationsmatrixen
- n: Antal observationer
- P: p-vรฆrdi
Vi er interesserede i det tredje element, p-vรฆrdien. Det er almindeligt at vise korrelationsmatricen med p-vรฆrdien i stedet for korrelationskoefficienten.
p_value <-round(mat_2[["P"]], 3) p_value
Code Forklaring
- mat_2[[โPโ]]: P-vรฆrdierne er gemt i elementet kaldet P
- runde(mat_2[[โPโ]], 3): Afrund elementerne med tre cifre
Output:
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
Visualisering af korrelationsmatrix i R
Et varmekort er en anden mรฅde at vise en korrelationsmatrix pรฅ. GGally-biblioteket er en udvidelse af ggplot2. I รธjeblikket er det ikke tilgรฆngeligt i conda-biblioteket. Vi kan installere direkte i konsollen.
install.packages("GGally")
Biblioteket indeholder forskellige funktioner til at vise oversigtsstatistikken, sรฅsom korrelationen og fordelingen af โโalle variablerne i en matrix.
Funktionen ggcorr() har mange argumenter. Vi vil kun introducere de argumenter, vi vil bruge i selvstudiet:
ggcorr-funktionen
ggcorr(df, method = c("pairwise", "pearson"),
nbreaks = NULL, digits = 2, low = "#3B9AB2",
mid = "#EEEEEE", high = "#F21A00",
geom = "tile", label = FALSE,
label_alpha = FALSE)
argumenter:
- df: Datasรฆt brugt
- metode: Formel til at beregne korrelationen. Som standard beregnes parvis og Pearson
- nbreaks: Returner et kategorisk interval for koefficienternes farve. Som standard er der ingen pause, og farvegradienten er kontinuerlig
- cifre: Afrund korrelationskoefficienten. Som standard indstilles til 2
- lav: Styr det nederste niveau af farven
- mid: Styr det midterste niveau af farven
- hรธj: Styr det hรธje farveniveau
- geom: Styr formen af โโdet geometriske argument. Som standard "flise"
- label: Boolesk vรฆrdi. Vis eller ej etiketten. Som standard indstilles til 'FALSK'
Grundlรฆggende varmekort
Pakkens mest grundlรฆggende plot er et varmekort. Forklaringen pรฅ grafen viser en gradientfarve fra โ 1 til 1, hvor varm farve indikerer stรฆrk positiv korrelation og kold farve, en negativ korrelation.
library(GGally) ggcorr(data)
Code Forklaring
- ggcorr(data): Kun et argument er nรธdvendigt, som er datarammenavnet. Faktorniveauvariable er ikke inkluderet i plottet.
Output:
Tilfรธjelse af kontrol til varmekortet
Vi kan tilfรธje flere kontroller til grafen:
ggcorr(data,
nbreaks = 6,
low = "steelblue",
mid = "white",
high = "darkred",
geom = "circle")
Code Forklaring
- nbreaks=6: bryd legenden med 6 rรฆkker.
- lav = "stรฅlblรฅ": Brug lysere farver til negativ korrelation
- mid = "hvid": Brug hvide farver til mellemomrรฅdekorrelation
- hรธj = "mรธrkerรธd": Brug mรธrke farver til positiv korrelation
- geom = "cirkel": Brug cirkel som form pรฅ vinduerne i varmekortet. Cirklens stรธrrelse er proportional med den absolutte vรฆrdi af korrelationen.
Output:
Tilfรธjelse af etiket til varmekortet
GGally giver os mulighed for at tilfรธje en etiket inde i vinduerne:
ggcorr(data,
nbreaks = 6,
label = TRUE,
label_size = 3,
color = "grey50")
Code Forklaring
- etiket = SAND: Tilfรธj vรฆrdierne af korrelationskoefficienterne inde i varmekortet.
- farve = "grรฅ50": Vรฆlg farve, dvs. grรฅ
- label_size = 3: Indstil stรธrrelsen pรฅ etiketten til 3
Output:
ggpairs-funktionen
Til sidst introducerer vi en anden funktion fra GGaly-biblioteket. Ggpair. Det producerer en graf i et matrixformat. Vi kan vise tre slags beregninger inden for en graf. Matrixen er en dimension, der svarer til antallet af observationer. Den รธverste/nederste del viser vinduer og i diagonalen. Vi kan styre, hvilken information vi รธnsker at vise i hver del af matricen. Formlen for ggpair er:
ggpair(df, columns = 1: ncol(df), title = NULL,
upper = list(continuous = "cor"),
lower = list(continuous = "smooth"),
mapping = NULL)
argumenter:
- df: Datasรฆt brugt
- kolonner: Vรฆlg kolonnerne for at tegne plottet
- titel: Inkluder en titel
- รธverst: Styr boksene over diagonalen af โโplottet. Skal levere den type beregninger eller graf, der skal returneres. Hvis kontinuert = "cor", beder vi R om at beregne korrelationen. Bemรฆrk, at argumentet skal vรฆre en liste. Andre argumenter kan bruges, se [vignetten](โhttp://ggobi.github.io/ggally/#custom_functionsโ) for mere information.
- Sรฆnk: Styr boksene under diagonalen.
- Kortping: Angiver grafens รฆstetik. For eksempel kan vi beregne grafen for forskellige grupper.
Bivariat analyse med ggpair med grouping
Den nรฆste graf viser tre oplysninger:
- Korrelationsmatricen mellem log_totexp, log_income, age og wtrans variabel grupperet efter om husstanden har et barn eller ej.
- Plot fordelingen af โโhver variabel efter gruppe
- Vis spredningsplottet med tendensen for gruppe
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))
Code Forklaring
- kolonner = c("log_totexp", "log_income", "alder", "wtrans"): Vรฆlg de variable, der skal vises i grafen
- title = "Bivariat analyse af den britiske husholdnings indtรฆgtsudgifter": Tilfรธj en titel
- รธvre = liste(): Styr den รธverste del af grafen. Dvs. over diagonalen
- kontinuerlig = wrap(โcorโ, stรธrrelse = 3)): Beregn korrelationskoefficienten. Vi pakker argumentet kontinuerligt inde i wrap()-funktionen for at kontrollere grafens รฆstetik (dvs. stรธrrelse = 3) -lower = list(): Styr den nederste del af grafen. Dvs. Under diagonalen.
- kontinuerlig = wrap(โglatโ,alfa = 0.3,stรธrrelse=0.1): Tilfรธj et spredningsplot med en lineรฆr tendens. Vi ombryder argumentet kontinuerligt inde i wrap()-funktionen for at kontrollere grafens รฆstetik (dvs. stรธrrelse=0.1, alfa=0.3)
- kortping = aes(farve = bรธrne_facade): Vi รธnsker, at hver del af grafen skal stables af variablen children_fac, som er en kategorisk variabel, der tager vรฆrdien 1, hvis husstanden ikke har bรธrn og 2 ellers
Output:
Bivariat analyse med ggpair med delvis grouping
Grafen nedenfor er en smule anderledes. Vi รฆndrer kortets position.ping inde i det รธverste argument.
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))
)
Code Forklaring
- Nรธjagtig samme kode som tidligere eksempel bortset fra:
- kortping = aes(color = children_fac): Flytter listen i upper = list(). Vi รธnsker kun at beregningen skal vรฆre stablet efter gruppe i den รธverste del af grafen.
Output:
Resumรฉ
- Et bivariat forhold beskriver et forhold - eller korrelation - mellem to variable i R.
- Der er to primรฆre metoder til at beregne korrelationen mellem to variabler i R-programmering: Pearson & Spearman.
- Pearson-korrelationsmetoden bruges normalt som en primรฆr kontrol for sammenhรฆngen mellem to variable.
- En rangkorrelation sorterer observationerne efter rang og beregner niveauet af lighed mellem rangeringen.
- Spearmans rangkorrelation, , er altid mellem -1 og 1 med en vรฆrdi tรฆt pรฅ ekstremiteten indikerer en stรฆrk sammenhรฆng.
- En korrelationsmatrix er en matrix, der reprรฆsenterer parkorrelationen af โโalle variablerne.
- Signifikansniveauet er nyttigt i nogle situationer, nรฅr vi bruger pearson- eller spearman-metoden.
Vi kan opsummere alle korrelationsfunktionerne i R i nedenstรฅende tabel:
| Bibliotek | Objektiv | Metode | Code |
|---|---|---|---|
| Base | bivariat korrelation | Pearson |
cor(dfx2, method = "pearson") |
| Base | bivariat korrelation | Spearman |
cor(dfx2, method = "spearman") |
| Base | Multivariat korrelation | Pearson |
cor(df, method = "pearson") |
| Base | Multivariat korrelation | Spearman |
cor(df, method = "spearman") |
| Hmisc | P vรฆrdi |
rcorr(as.matrix(data[,1:9]))[["P"]] |
|
| Ggally | varmekort |
ggcorr(df) |
|
| Multivariate plots |
cf code below |









