Korrelation i R: Pearson & Spearman med matrixeksempel

Et bivariat forhold beskriver et forhold - eller sammenhæng - mellem to variabler og. I denne vejledning diskuterer vi begrebet korrelation og viser, hvordan det kan bruges til at måle forholdet mellem to variabler.

Der er to primære metoder til at beregne sammenhængen mellem to variabler.

  • Pearson: Parametrisk korrelation
  • Spearman: Ikke-parametrisk korrelation

I denne vejledning lærer du

  • Pearson-sammenhæng
  • Spearman Rank Correlation
  • Korrelationsmatrix
  • Visualiser korrelationsmatrix

Pearson-sammenhæng

Pearson-korrelationsmetoden bruges normalt som en primær kontrol for forholdet mellem to variabler.

Den Korrelationskoefficienten ,, er et mål for styrken af den lineære sammenhæng mellem to variable og. Det beregnes som følger:

med

  • , dvs. standardafvigelse på
  • , dvs. standardafvigelse på

Korrelationen ligger mellem -1 og 1.

  • En værdi på næsten eller lig med 0 indebærer lille eller ingen lineær sammenhæng mellem og.
  • I modsætning hertil kommer 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 distributionstabellen med en frihedsgrad svarende til:

Spearman Rank Correlation

En rangkorrelation sorterer observationer efter rang og beregner niveauet for lighed mellem rangen. En rangkorrelation har fordelen af ​​at være robust over for outliers og er ikke knyttet til distributionen af ​​dataene. Bemærk, at en rangkorrelation er egnet til den ordinære variabel.

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 angivet samvariationer 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 en manglende værdi: use = "complete.obs"

Vi bruger BudgetUK-datasættet. Dette datasæt rapporterer budgetfordelingen for britiske husstande mellem 1980 og 1982. Der er 1519 observationer med ti funktioner, blandt dem:

  • wfood: del madforbrug
  • wfuel: del brændstofforbrug
  • wcloth: budgetandel for tøjudgifter
  • walc: del alkoholforbrug
  • wtrans: del transportudgifter
  • anden: andel af andre varer
  • totexp: samlede husstandsudgifter i pund
  • indkomst samlet netto husstandsindkomst
  • 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 funktionen glimpse () fra dplyr-biblioteket.
  • Tre point er over 500K, så vi besluttede at udelukke dem.
  • Det er en 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.

Produktion:

## 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,… 

Vi kan beregne korrelationskoefficienten mellem indkomst- og wfoodvariabler med metoderne "pearson" og "spearman".

cor(data$log_income, data$wfood, method = "pearson")

produktion:

## [1] -0.2466986
cor(data$log_income, data$wfood, method = "spearman")

Produktion:

## [1] -0.2501252 

Korrelationsmatrix

Den bivariate korrelation er en god start, men vi kan få et bredere billede med multivariat analyse. En korrelation med mange variabler er afbildet inde i en korrelationsmatrix . En korrelationsmatrix er en matrix, der repræsenterer par korrelationen af ​​alle variablerne.

Funktionen cor () returnerer en korrelationsmatrix. Den eneste forskel med den bivariate korrelation er, at vi ikke behøver at specificere, hvilke variabler. Som standard beregner R korrelationen mellem alle variablerne.

Bemærk, at en korrelation ikke kan beregnes for faktorvariabel. Vi er nødt til at sikre, at vi dropper kategorisk funktion, før vi sender datarammen inde i cor ().

En korrelationsmatrix er symmetrisk, hvilket betyder, at værdierne over diagonalen har de samme værdier som nedenstående. Det er mere visuelt at vise halvdelen af ​​matrixen.

Vi ekskluderer children_fac, fordi det er en faktor niveau variabel. 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 codemat_1 <-as.dist(round(cor(data[,1:9]),2))mat_1

Kode Forklaring

  • cor (data): Vis korrelationsmatrixen
  • runde (data, 2): Rund korrelationsmatrixen med to decimaler
  • as.dist (): Viser kun anden halvdel

Produktion:

## 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

Betydningsniveauet 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 kopiere koden for at indsætte den i terminalen:

conda install -c r r-hmisc 

Rcorr () kræver, at en dataramme gemmes som en matrix. Vi kan konvertere vores data til en matrix før for 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 interesseret i det tredje element, p-værdien. Det er almindeligt at vise korrelationsmatrixen 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): Rund elementerne med tre cifre

Produktion:

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

Visualiser korrelationsmatrix

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, der viser oversigtsstatistikkerne, som f.eks. Korrelation og fordeling af alle variablerne i en matrix.

Funktionen ggcorr () har mange argumenter. Vi introducerer kun de argumenter, vi vil bruge i vejledningen:

Funktionen ggcorr

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 : Brugt datasæt
  • metode : Formel til beregning af korrelationen. Som standard beregnes parvis og Pearson
  • nbrud : Returner et kategorisk område til farvning af koefficienterne. Som standard er der ingen pause, og farvegradienten er kontinuerlig
  • cifre : Rund korrelationskoefficienten. Som standard skal du indstille til 2
  • lav : Kontroller det lavere niveau af farven
  • midt : Kontroller farvenes midterste niveau
  • høj : Kontroller det høje niveau for farven
  • geom : Styr formen på det geometriske argument. Som standard "tile"
  • label : Boolsk værdi. Vis etiketten eller ej. Som standard skal du indstille til "FALSE"

Grundlæggende varmekort

Det mest grundlæggende plot i pakken er et varmekort. Tegnforklaringen viser en gradientfarve fra - 1 til 1, med varm farve, der indikerer stærk positiv korrelation og kold farve, en negativ korrelation.

library(GGally)ggcorr(data)

Kode Forklaring

  • ggcorr (data): Der kræves kun et argument, som er datarammenavnet. Faktorniveauvariabler er ikke inkluderet i plottet.

Produktion:

Tilføj 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.
  • low = "steelblue": Brug lysere farver til negativ korrelation
  • mid = "hvid": Brug hvide farver til korrelation mellem mellemklasser
  • high = "darkred": Brug mørke farver til positiv sammenhæng
  • geom = "cirkel": Brug cirkel som vinduesform i varmekortet. Størrelsen på cirklen er proportional med den absolutte værdi af korrelationen.

Produktion:

Føj 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

  • label = TRUE: Tilføj værdierne for korrelationskoefficienterne inde i varmekortet.
  • color = "grey50": Vælg farve, dvs. grå
  • label_size = 3: Indstil størrelsen på etiketten lig med 3

Produktion:

ggpar

Endelig 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. Matricen er en dimension med lig antallet af observationer. Den øverste / nederste del viser vinduer og i diagonalen. Vi kan kontrollere, hvilke oplysninger vi vil vise i hver del af matrixen. Formlen for ggpair er:

ggpair(df, columns = 1: ncol(df), title = NULL,upper = list(continuous = "cor"),lower = list(continuous = "smooth"),mapping = NULL)

Argumenter :

  • df : Brugt datasæt
  • kolonner : Vælg kolonnerne for at tegne plottet
  • titel : Inkluder en titel
  • øvre : Kontroller boksene over plotens diagonal. Brug for at levere den type beregninger eller graf, der skal returneres. Hvis kontinuerlig = "cor", beder vi R om at beregne korrelationen. Bemærk, at argumentet skal være en liste. Andre argumenter kan bruges, se [vignette] ("http://ggobi.github.io/ggally/#custom_functions") for mere information.
  • Nederst : Kontroller boksene under diagonalen.
  • Kortlægning : Angiver grafens æstetik. For eksempel kan vi beregne grafen til forskellige grupper.

Bivariat analyse med ggpair med gruppering

Den næste graf viser tre oplysninger:

  • Korrelationsmatrixen mellem log_totexp, log_income, alder og wtrans variabel grupperet efter, om husstanden har et barn eller ej.
  • Plot fordelingen af ​​hver variabel efter gruppe
  • Vis spredningsdiagrammet med trenden efter 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", "age", "wtrans"): Vælg de variabler, der skal vises i grafen
  • title = "Bivariat analyse af den britiske husstands indtægtsudgifter": Tilføj en titel
  • upper = list (): Styr den øverste del af grafen. Det vil sige over diagonalen
  • kontinuerlig = wrap ("cor", størrelse = 3)): Beregn korrelationskoefficienten. Vi indpakker argumentet kontinuerligt inde i wrap () -funktionen for at kontrollere grafens æstetik (dvs. størrelse = 3) -lower = liste (): Styr den nederste del af grafen. Det vil sige under diagonalen.
  • kontinuerlig = wrap ("glat", alfa = 0,3, størrelse = 0,1): Tilføj et spredningsdiagram med en lineær tendens. Vi indpakker argumentet kontinuerligt inde i wrap () -funktionen for at kontrollere grafens æstetik (dvs. størrelse = 0,1, alfa = 0,3)
  • kortlægning = aes (farve = børnefac): Vi ønsker, at hver del af grafen skal stables med variablen børnefac, som er en kategorisk variabel, der tager værdien 1, hvis husstanden ikke har børn og 2 ellers

Produktion:

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

  • Præcis samme kode som forrige eksempel bortset fra:
  • mapping = aes (color = children_fac): Flyt listen i øverste = liste (). Vi vil kun have beregningen stablet efter gruppe i den øverste del af grafen.

Produktion:

Resumé

Vi kan opsummere funktionen i nedenstående tabel:

bibliotek

Objektiv

metode

kode

Grundlag

bivariat korrelation

Pearson

cor(dfx2, method = "pearson")

Grundlag

bivariat korrelation

Spearman

cor(dfx2, method = "spearman")

Grundlag

Multivariat korrelation

Pearson

cor(df, method = "pearson")

Grundlag

Multivariat korrelation

Spearman

cor(df, method = "spearman")

Hmisc

P-værdi

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

Ggally

varmekort

ggcorr(df)

Multivariate plot

cf code below

Interessante artikler...