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:

Pearson Correlation Matrix i R

med

  • Pearson Correlation Matrix i R, dvs standardavvikelse på
  • Pearson Correlation Matrix i R, 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:

Pearson Correlation Matrix i R

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:

Spearman Rank Correlation i R

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

Visualisera korrelationsmatris

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:

Grundläggande värmekarta

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ägga till kontroll till värmekartan

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:

Lägger till etikett till värmekartan

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 gruppering

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:

Bivariat analys med ggpair med partiell gruppering

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