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:

Pearson Correlation Matrix i R

med

  • Pearson Correlation Matrix i R, altsรฅ standardafvigelse pรฅ
  • Pearson Correlation Matrix i R, 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:

Pearson Correlation Matrix i R

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:

Spearman Rank Correlation i R

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")

Visualisering af korrelationsmatrix

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:

Grundlรฆggende varmekort

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 kontrol til varmekortet

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:

Tilfรธjelse af etiket til varmekortet

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 Grouping

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:

Bivariat analyse med ggpair med partiel grouping

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

Opsummer dette indlรฆg med: