Korrelasjon i R: Pearson & Spearman Korrelasjonsmatrise

Bivariat korrelasjon i R

Et bivariat forhold beskriver en sammenheng -eller korrelasjon- mellom to variabler i R. I denne opplæringen vil vi diskutere begrepet korrelasjon og vise hvordan det kan brukes til å måle forholdet mellom to variabler i R.

Korrelasjon i R-programmering

Det er to primære metoder for å beregne korrelasjonen mellom to variabler i R-programmering:

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

Pearson Correlation Matrix i R

Pearson-korrelasjonsmetoden brukes vanligvis som en primær sjekk for sammenhengen mellom to variabler.

De korrelasjonskoeffisient, , er et mål på styrken til lineær forhold mellom to variabler og . Det beregnes som følger:

Pearson Correlation Matrix i R

med

  • Pearson Correlation Matrix i R, dvs. standardavvik på
  • Pearson Correlation Matrix i R, dvs. standardavvik på

Korrelasjonen varierer mellom -1 og 1.

  • En verdi på nær eller lik 0 innebærer liten eller ingen lineær sammenheng mellom og .
  • I kontrast, jo nærmere 1 eller -1 kommer, jo sterkere er det lineære forholdet.

Vi kan beregne t-testen som følger og sjekke fordelingstabellen med en frihetsgrad lik:

Pearson Correlation Matrix i R

Spearman Rank Correlation i R

En rangekorrelasjon sorterer observasjonene etter rangering og beregner likhetsnivået mellom rangeringen. En rangkorrelasjon har fordelen av å være robust overfor uteliggere og er ikke knyttet til distribusjonen av dataene. Merk at en rangkorrelasjon er egnet for ordinalvariabelen.

Spearmans rangkorrelasjon, , er alltid mellom -1 og 1 med en verdi nær ekstremiteten indikerer sterk sammenheng. Det beregnes som følger:

Spearman Rank Correlation i R

med oppgitt kovariansene mellom rang og . Nevneren beregner standardavvikene.

I R kan vi bruke cor()-funksjonen. Det krever tre argumenter, og metoden.

cor(x, y, method)

argumenter:

  • x: Første vektor
  • y: Andre vektor
  • metode: Formelen som brukes til å beregne korrelasjonen. Tre strengverdier:
    • "pearson"
    • "kendall"
    • "spydmann"

Et valgfritt argument kan legges til hvis vektorene inneholder manglende verdi: use = "complete.obs"

Vi vil bruke BudgetUK-datasettet. Dette datasettet rapporterer budsjettfordelingen til britiske husholdninger mellom 1980 og 1982. Det er 1519 observasjoner med ti funksjoner, blant dem:

  • wfood: dele mat dele bruke
  • wdrivstoff: dele drivstoffforbruk
  • wcloth: budsjettandel for klærutgifter
  • valk: dele alkoholforbruk
  • wtrans: dele transportutgifter
  • wother: andel av andre varer
  • totexp: totale husholdningsforbruk i pund
  • inntekt: total netto husholdningsinntekt
  • alder: husstandens alder
  • barn: antall barn

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 tar en titt med glimpse()-funksjonen fra dplyr-biblioteket.
  • Tre poeng er over 500K, så vi bestemte oss for å ekskludere dem.
  • Det er en vanlig praksis å konvertere en monetær variabel i log. Det bidrar til å redusere virkningen av uteliggere og reduserer skjevheten i datasettet.

Utgang:

## 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 korrelasjonskoeffisienten mellom inntekts- og wfood-variabler med "pearson"- og "spearman"-metodene.

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

Utgang:

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

Utgang:

## [1] -0.2501252

Korrelasjonsmatrise i R

Den bivariate korrelasjonen er en god start, men vi kan få et bredere bilde med multivariat analyse. En korrelasjon med mange variabler er avbildet i en korrelasjonsmatrise. En korrelasjonsmatrise er en matrise som representerer parkorrelasjonen til alle variablene.

Cor()-funksjonen returnerer en korrelasjonsmatrise. Den eneste forskjellen med den bivariate korrelasjonen er at vi ikke trenger å spesifisere hvilke variabler. Som standard beregner R korrelasjonen mellom alle variablene.

Merk at en korrelasjon ikke kan beregnes for faktorvariabel. Vi må sørge for at vi slipper kategorisk funksjon før vi passerer datarammen inne i cor().

En korrelasjonsmatrise er symmetrisk, noe som betyr at verdiene over diagonalen har samme verdier som den under. Det er mer visuelt å vise halvparten av matrisen.

Vi ekskluderer children_fac fordi det er en faktornivåvariabel. cor utfører ikke korrelasjon 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 korrelasjonsmatrisen
  • runde(data, 2): Avrund korrelasjonsmatrisen med to desimaler
  • as.dist(): Viser kun andre halvdel

Utgang:

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

Signifikansnivå

Signifikansnivået er nyttig i enkelte situasjoner når vi bruker pearson- eller spearman-metoden. Funksjonen rcorr() fra biblioteket Hmisc beregner p-verdien for oss. Vi kan laste ned biblioteket fra leilighet og kopier koden for å lime den inn i terminalen:

conda install -c r r-hmisc

rcorr() krever at en dataramme lagres som en matrise. Vi kan konvertere dataene våre til en matrise før vi beregner korrelasjonsmatrisen med p-verdien.

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 inneholder tre elementer:

  • r: Utgang av korrelasjonsmatrisen
  • n: Antall observasjoner
  • P: p-verdi

Vi er interessert i det tredje elementet, p-verdien. Det er vanlig å vise korrelasjonsmatrisen med p-verdien i stedet for korrelasjonskoeffisienten.

p_value <-round(mat_2[["P"]], 3)
p_value

Kode Forklaring

  • mat_2[[“P”]]: P-verdiene er lagret i elementet kalt P
  • runde(matte_2[[“P”]], 3): Avrund elementene med tre sifre

Utgang:

           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 av korrelasjonsmatrise i R

Et varmekart er en annen måte å vise en korrelasjonsmatrise på. GGally-biblioteket er en utvidelse av ggplot2. Foreløpig er det ikke tilgjengelig i conda-biblioteket. Vi kan installere direkte i konsollen.

install.packages("GGally")

Visualisering av korrelasjonsmatrise

Biblioteket inneholder forskjellige funksjoner for å vise sammendragsstatistikken, for eksempel korrelasjonen og distribusjonen av alle variablene i en matrise.

Funksjonen ggcorr() har mange argumenter. Vi vil bare introdusere argumentene vi vil bruke i opplæringen:

ggcorr-funksjonen

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: Datasett brukt
  • metode: Formel for å beregne korrelasjonen. Som standard beregnes parvis og Pearson
  • nbreaks: Returner et kategorisk område for fargen på koeffisientene. Som standard er det ingen pause og fargegradienten er kontinuerlig
  • sifre: Avrund korrelasjonskoeffisienten. Som standard, satt til 2
  • lav: Kontroller det nedre nivået av fargen
  • mid: Kontroller det midterste nivået av fargen
  • høy: Kontroller det høye nivået på fargen
  • geom: Kontroller formen på det geometriske argumentet. Som standard, "flis"
  • etikett: Boolsk verdi. Vis eller ikke etiketten. Som standard, satt til "FALSE".

Grunnleggende varmekart

Det mest grunnleggende plottet i pakken er et varmekart. Tegnforklaringen til grafen viser en gradientfarge fra – 1 til 1, med varm farge som indikerer sterk positiv korrelasjon og kald farge, en negativ korrelasjon.

library(GGally)
ggcorr(data)

Kode Forklaring

  • ggcorr(data): Bare ett argument er nødvendig, som er datarammenavnet. Faktornivåvariabler er ikke inkludert i plottet.

Utgang:

Grunnleggende varmekart

Legge til kontroll til varmekartet

Vi kan legge til flere kontroller i grafen:

ggcorr(data,
    nbreaks = 6,
    low = "steelblue",
    mid = "white",
    high = "darkred",
    geom = "circle")

Kode Forklaring

  • nbreaks=6: bryte legenden med 6 rekker.
  • lav = "stålblå": Bruk lysere farger for negativ korrelasjon
  • mid = "hvit": Bruk hvite farger for mellomområdekorrelasjon
  • høy = "mørkerød": Bruk mørke farger for positiv korrelasjon
  • geom = "sirkel": Bruk sirkel som form på vinduene i varmekartet. Størrelsen på sirkelen er proporsjonal med den absolutte verdien av korrelasjonen.

Utgang:

Legge til kontroll til varmekartet

Legge til etikett på varmekartet

GGally lar oss legge til en etikett inne i vinduene:

ggcorr(data,
    nbreaks = 6,
    label = TRUE,
    label_size = 3,
    color = "grey50")

Kode Forklaring

  • etikett = TRUE: Legg til verdiene til korrelasjonskoeffisientene inne i varmekartet.
  • farge = "grå50": Velg farge, dvs. grå
  • label_size = 3: Sett størrelsen på etiketten til 3

Utgang:

Legge til etikett på varmekartet

ggpairs-funksjonen

Til slutt introduserer vi en annen funksjon fra GGAly-biblioteket. Ggpair. Den produserer en graf i et matriseformat. Vi kan vise tre typer beregninger innenfor en graf. Matrisen er en dimensjon, med lik antall observasjoner. Den øvre/nedre delen viser vinduer og i diagonalen. Vi kan kontrollere hvilken informasjon vi ønsker å vise i hver del av matrisen. Formelen for ggpair er:

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

argumenter:

  • df: Datasett brukt
  • kolonner: Velg kolonnene for å tegne plottet
  • tittel: Ta med en tittel
  • øverste: Kontroller boksene over diagonalen til plottet. Må oppgi typen beregninger eller graf som skal returneres. Hvis kontinuerlig = "cor", ber vi R beregne korrelasjonen. Merk at argumentet må være en liste. Andre argumenter kan brukes, se [vignetten](“http://ggobi.github.io/ggally/#custom_functions”) for mer informasjon.
  • Senk: Kontroller boksene under diagonalen.
  • Kartlegging: Indikerer grafens estetikk. For eksempel kan vi beregne grafen for forskjellige grupper.

Bivariat analyse med ggpair med gruppering

Den neste grafen plotter tre informasjon:

  • Korrelasjonsmatrisen mellom log_totexp, log_income, age og wtrans variabel gruppert etter om husholdningen har et barn eller ikke.
  • Plott fordelingen av hver variabel etter gruppe
  • Vis spredningsplottet med trend 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”, “age”, “wtrans”): Velg variablene som skal vises i grafen
  • title = "Bivariat analyse av inntektsutgifter til den britiske husholdningen": Legg til en tittel
  • øvre = liste(): Kontroller den øvre delen av grafen. Dvs over diagonalen
  • kontinuerlig = wrap(“cor”, størrelse = 3)): Beregn korrelasjonskoeffisienten. Vi pakker argumentet kontinuerlig inne i wrap()-funksjonen for å kontrollere grafens estetikk (dvs. størrelse = 3) -lower = list(): Kontroller den nedre delen av grafen. Dvs. Under diagonalen.
  • kontinuerlig = wrap(“glatt”,alfa = 0.3,størrelse=0.1): Legg til et spredningsplott med en lineær trend. Vi legger argumentet kontinuerlig inne i wrap()-funksjonen for å kontrollere grafens estetikk (dvs. størrelse=0.1, alfa=0.3)
  • mapping = aes(farge = children_fac): Vi vil at hver del av grafen skal stables av variabelen children_fac, som er en kategorisk variabel som tar verdien av 1 hvis husholdningen ikke har barn og 2 ellers

Utgang:

Bivariat analyse med ggpair med gruppering

Bivariat analyse med ggpair med partiell gruppering

Grafen nedenfor er litt annerledes. Vi endrer posisjonen til kartleggingen inne i det øvre argumentet.

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øyaktig samme kode som forrige eksempel bortsett fra:
  • mapping = aes(color = children_fac): Flytt listen i upper = list(). Vi vil bare ha beregningen stablet etter gruppe i den øvre delen av grafen.

Utgang:

Bivariat analyse med ggpair med delvis gruppering

Oppsummering

  • Et bivariat forhold beskriver et forhold -eller korrelasjon- mellom to variabler i R.
  • Det er to primære metoder for å beregne korrelasjonen mellom to variabler i R-programmering: Pearson & Spearman.
  • Pearson-korrelasjonsmetoden brukes vanligvis som en primær sjekk for sammenhengen mellom to variabler.
  • En rangekorrelasjon sorterer observasjonene etter rangering og beregner likhetsnivået mellom rangeringen.
  • Spearmans rangkorrelasjon, , er alltid mellom -1 og 1 med en verdi nær ekstremiteten indikerer sterk sammenheng.
  • En korrelasjonsmatrise er en matrise som representerer parkorrelasjonen til alle variablene.
  • Signifikansnivået er nyttig i enkelte situasjoner når vi bruker pearson- eller spearman-metoden.

Vi kan oppsummere alle korrelasjonsfunksjonene i R i tabellen nedenfor:

Bibliotek Målet Metode Kode
Base bivariate korrelasjon Pearson
cor(dfx2, method = "pearson")
Base bivariate korrelasjon Spearman
cor(dfx2, method = "spearman")
Base Multivariat korrelasjon Pearson
cor(df, method = "pearson")
Base Multivariat korrelasjon Spearman
cor(df, method = "spearman")
Hmisc P-verdi
rcorr(as.matrix(data[,1:9]))[["P"]]
Ggally varmekart
ggcorr(df)
Multivariate plott
cf code below