Korrelation i R: Pearson & Spearman Correlation Matrix
Bivariat korrelation i R
En bivariat relation beskriver ett samband -eller korrelation- mellan två variabler i R. I denna handledning kommer vi att diskutera begreppet korrelation och visa hur det kan användas för att mäta sambandet mellan två valfria variabler i R.
Korrelation i R-programmering
Det finns två primära metoder för att beräkna korrelationen mellan två variabler i R-programmering:
- Pearson: Parametrisk korrelation
- Spearman: Icke-parametrisk korrelation
Pearson Correlation Matrix i R
Pearson-korrelationsmetoden används vanligtvis som en primär kontroll för sambandet mellan två variabler.
Smakämnen korrelationskoefficient, , är ett mått på styrkan hos linjär samband mellan två variabler och . Det beräknas enligt följande:
med
, dvs standardavvikelse på
, dvs standardavvikelse på
Korrelationen sträcker sig mellan -1 och 1.
- Ett värde nära eller lika med 0 innebär lite eller inget linjärt samband mellan och .
- Däremot, ju närmare 1 eller -1 kommer, desto starkare är det linjära sambandet.
Vi kan beräkna t-testet enligt följande och kontrollera distributionstabellen med en frihetsgrad som är lika med:
Spearman Rank Correlation i R
En rangkorrelation sorterar observationerna efter rangordning och beräknar graden av likhet mellan rangordningen. En rangkorrelation har fördelen att den är robust mot extremvärden och är inte kopplad till distributionen av data. Observera att en rangkorrelation är lämplig för ordinalvariabeln.
Spearmans rangkorrelation, , är alltid mellan -1 och 1 med ett värde nära extremiteten indikerar starkt samband. Det beräknas enligt följande:
med angav kovarianserna mellan rang och . Nämnaren beräknar standardavvikelserna.
I R kan vi använda cor()-funktionen. Det krävs tre argument, , och metoden.
cor(x, y, method)
Argument:
- x: Första vektorn
- y: Andra vektorn
- metod: Formeln som används för att beräkna korrelationen. Tre strängvärden:
- "pearson"
- "kendall"
- "spearman"
Ett valfritt argument kan läggas till om vektorerna innehåller saknat värde: use = "complete.obs"
Vi kommer att använda datauppsättningen BudgetUK. Denna datauppsättning rapporterar budgettilldelningen för brittiska hushåll mellan 1980 och 1982. Det finns 1519 observationer med tio funktioner, bland dem:
- wfood: dela mat dela spendera
- wbränsle: dela bränsleförbrukning
- wcloth: budgetandel för utgifter för kläder
- valk: dela alkoholutgifter
- wtrans: dela transportkostnader
- wother: andel av andra varor som spenderas
- totexp: hushållens totala utgifter i pund
- intäkter: hushållens totala nettoinkomst
- ålder: hushållets ålder
- barn: Antal barn
Exempelvis
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)
Kodförklaring
- Vi importerar först data och tar en titt med funktionen glimpse() från dplyr-biblioteket.
- Tre poäng är över 500K, så vi bestämde oss för att utesluta dem.
- Det är vanligt att konvertera en monetär variabel i log. Det hjälper till att minska effekten av extremvärden och minskar skevheten i datamängden.
Produktion:
## 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 beräkna korrelationskoefficienten mellan inkomst- och wfood-variabler med metoderna "pearson" och "spearman".
cor(data$log_income, data$wfood, method = "pearson")
Produktion:
## [1] -0.2466986
cor(data$log_income, data$wfood, method = "spearman")
Produktion:
## [1] -0.2501252
Korrelationsmatris i R
Den bivariata korrelationen är en bra början, men vi kan få en bredare bild med multivariat analys. En korrelation med många variabler visas inuti a korrelationsmatris. En korrelationsmatris är en matris som representerar parkorrelationen för alla variabler.
Cor()-funktionen returnerar en korrelationsmatris. Den enda skillnaden med den bivariata korrelationen är att vi inte behöver specificera vilka variabler. Som standard beräknar R korrelationen mellan alla variabler.
Observera att en korrelation inte kan beräknas för faktorvariabel. Vi måste se till att vi släpper kategoriska funktioner innan vi skickar dataramen inuti cor().
En korrelationsmatris är symmetrisk vilket innebär att värdena ovanför diagonalen har samma värden som den nedanför. Det är mer visuellt att visa hälften av matrisen.
Vi exkluderar children_fac eftersom det är en faktornivåvariabel. cor utför inte 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
Kodförklaring
- cor(data): Visa korrelationsmatrisen
- runda(data, 2): Avrunda korrelationsmatrisen med två decimaler
- as.dist(): Visar endast andra halvlek
Produktion:
## 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ån är användbar i vissa situationer när vi använder pearson- eller spearmanmetoden. Funktionen rcorr() från biblioteket Hmisc beräknar p-värdet åt oss. Vi kan ladda ner biblioteket från Conda och kopiera koden för att klistra in den i terminalen:
conda install -c r r-hmisc
rcorr() kräver att en dataram lagras som en matris. Vi kan konvertera våra data till en matris innan vi beräknar korrelationsmatrisen med p-värdet.
library("Hmisc") data_rcorr <-as.matrix(data[, 1: 9]) mat_2 <-rcorr(data_rcorr) # mat_2 <-rcorr(as.matrix(data)) returns the same output
Listobjektet mat_2 innehåller tre element:
- r: Utdata från korrelationsmatrisen
- n: Antal observationer
- P: p-värde
Vi är intresserade av det tredje elementet, p-värdet. Det är vanligt att visa korrelationsmatrisen med p-värdet istället för korrelationskoefficienten.
p_value <-round(mat_2[["P"]], 3) p_value
Kodförklaring
- mat_2[[“P”]]: P-värdena lagras i elementet som kallas P
- round(mat_2[[“P”]], 3): Avrunda elementen med tre siffror
Produktion:
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
Visualisera korrelationsmatris i R
En värmekarta är ett annat sätt att visa en korrelationsmatris. GGally-biblioteket är en förlängning av ggplot2. För närvarande är det inte tillgängligt i conda-biblioteket. Vi kan installera direkt i konsolen.
install.packages("GGally")
Biblioteket innehåller olika funktioner för att visa den sammanfattande statistiken såsom korrelationen och fördelningen av alla variabler i en matris.
Funktionen ggcorr() har många argument. Vi kommer endast att introducera de argument vi kommer att använda i handledningen:
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)
argument:
- df: Dataset används
- metod: Formel för att beräkna korrelationen. Som standard beräknas parvis och Pearson
- nbreaks: Returnera ett kategoriskt område för färgen på koefficienterna. Som standard är det inget avbrott och färggradienten är kontinuerlig
- siffror: Avrunda korrelationskoefficienten. Som standard ställs in på 2
- låg: Styr den lägre nivån av färgningen
- mitten: Styr mellannivån för färgningen
- hög: Kontrollera den höga färgnivån
- geom: Styr formen på det geometriska argumentet. Som standard, "bricka"
- etikett: Booleskt värde. Visa eller inte etiketten. Som standard ställs in på "FALSE".
Grundläggande värmekarta
Den mest grundläggande handlingen i paketet är en värmekarta. Förklaringen av grafen visar en gradientfärg från – 1 till 1, med varm färg som indikerar stark positiv korrelation och kall färg, en negativ korrelation.
library(GGally) ggcorr(data)
Kodförklaring
- ggcorr(data): Endast ett argument behövs, vilket är dataramens namn. Faktornivåvariabler ingår inte i diagrammet.
Produktion:
Lägga till kontroll till värmekartan
Vi kan lägga till fler kontroller i diagrammet:
ggcorr(data, nbreaks = 6, low = "steelblue", mid = "white", high = "darkred", geom = "circle")
Kodförklaring
- nbreaks=6: bryt legenden med 6 led.
- låg = "stålblå": Använd ljusare färger för negativ korrelation
- mitt = "vit": Använd vita färger för mellanintervallkorrelation
- hög = "mörkröd": Använd mörka färger för positiv korrelation
- geom = "cirkel": Använd cirkel som formen på fönstren i värmekartan. Cirkelns storlek är proportionell mot korrelationens absoluta värde.
Produktion:
Lägger till etikett till värmekartan
GGally låter oss lägga till en etikett i fönstren:
ggcorr(data, nbreaks = 6, label = TRUE, label_size = 3, color = "grey50")
Kodförklaring
- etikett = SANT: Lägg till värdena för korrelationskoefficienterna inuti värmekartan.
- färg = "grå50": Välj färg, dvs grått
- label_size = 3: Ställ in storleken på etiketten lika med 3
Produktion:
ggpairs-funktionen
Slutligen introducerar vi en annan funktion från GGaly-biblioteket. Ggpair. Den producerar en graf i ett matrisformat. Vi kan visa tre typer av beräkningar inom en graf. Matrisen är en dimension, med lika med antalet observationer. Den övre/nedre delen visar fönster och i diagonalen. Vi kan styra vilken information vi vill visa i varje del av matrisen. Formeln för ggpair är:
ggpair(df, columns = 1: ncol(df), title = NULL, upper = list(continuous = "cor"), lower = list(continuous = "smooth"), mapping = NULL)
argument:
- df: Dataset används
- kolonner: Välj kolumnerna för att rita plotten
- rubricerade: Inkludera en titel
- övre: Styr rutorna ovanför diagrammets diagonal. Behöver ange vilken typ av beräkningar eller graf som ska returneras. Om kontinuerlig = "cor", ber vi R att beräkna korrelationen. Observera att argumentet måste vara en lista. Andra argument kan användas, se [vinjetten](“http://ggobi.github.io/ggally/#custom_functions”) för mer information.
- Sänk: Styr rutorna under diagonalen.
- Kartläggning: Indikerar grafens estetik. Vi kan till exempel beräkna grafen för olika grupper.
Bivariat analys med ggpair med gruppering
Nästa graf visar tre information:
- Korrelationsmatrisen mellan log_totexp, log_income, age och wtrans variabel grupperad efter om hushållet har ett barn eller inte.
- Rita fördelningen av varje variabel per grupp
- Visa spridningsdiagrammet med trenden för grupp
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))
Kodförklaring
- kolumner = c(“log_totexp”, “log_income”, “age”, “wtrans”): Välj de variabler som ska visas i grafen
- title = "Bivariat analys av det brittiska hushållets inkomstutgifter": Lägg till en titel
- övre = lista(): Styr den övre delen av grafen. Dvs ovanför diagonalen
- kontinuerlig = wrap(“cor”, storlek = 3)): Beräkna korrelationskoefficienten. Vi lindar argumentet kontinuerligt inuti wrap()-funktionen för att kontrollera grafens estetik (dvs storlek = 3) -lower = list(): Styr den nedre delen av grafen. Dvs. Under diagonalen.
- kontinuerlig = wrap(“slät”,alfa = 0.3,storlek=0.1): Lägg till ett spridningsdiagram med en linjär trend. Vi lindar argumentet kontinuerligt inuti wrap()-funktionen för att kontrollera grafens estetik (dvs storlek=0.1, alfa=0.3)
- mappning = aes(färg = barn_fac): Vi vill att varje del av grafen ska staplas av variabeln children_fac, som är en kategorisk variabel som tar värdet 1 om hushållet inte har barn och 2 annars
Produktion:
Bivariat analys med ggpair med partiell gruppering
Grafen nedan är lite annorlunda. Vi ändrar placeringen av mappningen 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)) )
Kodförklaring
- Exakt samma kod som föregående exempel förutom:
- mapping = aes(color = children_fac): Flytta listan i övre = list(). Vi vill bara ha beräkningen staplad efter grupp i den övre delen av grafen.
Produktion:
Sammanfattning
- Ett bivariat samband beskriver ett samband -eller korrelation- mellan två variabler i R.
- Det finns två primära metoder för att beräkna korrelationen mellan två variabler i R-programmering: Pearson & Spearman.
- Pearson-korrelationsmetoden används vanligtvis som en primär kontroll för sambandet mellan två variabler.
- En rangkorrelation sorterar observationerna efter rangordning och beräknar graden av likhet mellan rangordningen.
- Spearmans rangkorrelation, , är alltid mellan -1 och 1 med ett värde nära extremiteten indikerar starkt samband.
- En korrelationsmatris är en matris som representerar parkorrelationen för alla variabler.
- Signifikansnivån är användbar i vissa situationer när vi använder pearson- eller spearmanmetoden.
Vi kan sammanfatta alla korrelationsfunktioner i R i tabellen nedan:
Bibliotek | Mål | Metod | Koda |
---|---|---|---|
Bas | bivariat korrelation | Pearson |
cor(dfx2, method = "pearson") |
Bas | bivariat korrelation | Spearman |
cor(dfx2, method = "spearman") |
Bas | Multivariat korrelation | Pearson |
cor(df, method = "pearson") |
Bas | Multivariat korrelation | Spearman |
cor(df, method = "spearman") |
Hmisc | P-värde |
rcorr(as.matrix(data[,1:9]))[["P"]] |
|
Ggally | värmekarta |
ggcorr(df) |
|
Multivariata plotter |
cf code below |