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)
Kode 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
Kode 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
Kode 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)
Kode 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")
Kode 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")
Kode 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.
- Kortlægning: Angiver grafens æstetik. For eksempel kan vi beregne grafen for forskellige grupper.
Bivariat analyse med ggpair med gruppering
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))
Kode 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)
- mapping = aes(farve = børn_fac): 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 gruppering
Grafen nedenfor er lidt anderledes. Vi ændrer placeringen af kortlægningen 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)) )
Kode Forklaring
- Nøjagtig samme kode som tidligere eksempel bortset fra:
- mapping = aes(color = children_fac): Flyt listen i upper = list(). Vi ønsker kun beregningen 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 | Kode |
---|---|---|---|
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 |