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)

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

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)

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

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

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:

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.
  • 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 gruppering

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:

Bivariat analyse med ggpair med delvis gruppering

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