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.

Ocuco 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

Sammendrag

  • 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

Oppsummer dette innlegget med: