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:
med
- , dvs. standardavvik på
- , 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:
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:
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")
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:
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 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:
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 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:
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 |