Korrelation i R: Pearson & Spearman med Matrix Exempel

Ett bivariat förhållande beskriver en relation - eller korrelation - mellan två variabler, och. I denna handledning diskuterar vi begreppet korrelation och visar hur det kan användas för att mäta förhållandet mellan två variabler.

Det finns två primära metoder för att beräkna korrelationen mellan två variabler.

  • Pearson: Parametrisk korrelation
  • Spearman: Icke-parametrisk korrelation

I den här handledningen lär du dig

  • Pearson-korrelation
  • Spearman Rank Correlation
  • Korrelationsmatris
  • Visualisera korrelationsmatris

Pearson-korrelation

Pearson-korrelationsmetoden används vanligtvis som en primär kontroll för sambandet mellan två variabler.

Den Korrelationskoefficienten ,, är ett mått på styrkan hos den linjära förhållandet mellan två variabler och. Det beräknas enligt följande:

med

  • , dvs standardavvikelse för
  • , dvs standardavvikelse för

Korrelationen ligger mellan -1 och 1.

  • Ett värde på nära eller lika med 0 innebär liten eller ingen linjär relation mellan och.
  • Däremot, ju närmare 1 eller -1 desto starkare är det linjära förhållandet.

Vi kan beräkna t-testet enligt följande och kontrollera distributionstabellen med en frihetsgrad som är lika med:

Spearman Rank Correlation

En rangkorrelation sorterar observationerna efter rang och beräknar likhetsnivån mellan rang. En rangkorrelation har fördelen att den är robust mot avvikare och är inte kopplad till distributionen av data. Observera att en rangkorrelation är lämplig för den ordinarie variabeln.

Spearmans rangkorrelation, är alltid mellan -1 och 1 med ett värde nära extremiteten indikerar starkt förhållande. Det beräknas enligt följande:

med angivna kovarianter 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"
    • "spjutman"

Ett valfritt argument kan läggas till om vektorerna innehåller värde som saknas: use = "complete.obs"

Vi kommer att använda datamängden BudgetUK. Denna dataset rapporterar budgetfördelningen för brittiska hushåll mellan 1980 och 1982. Det finns 1519 observationer med tio funktioner, bland dem:

  • wfood: dela matandelarna
  • wfuel: dela bränsleutgifter
  • wcloth: budgetandel för kläder
  • walc: dela alkoholutgifter
  • wtrans: dela transportutgifter
  • övrigt: andel av andra varor
  • totexp: totala hushållsutgifter i pund
  • inkomst total hushållsinkomst
  • ålder: hushållets ålder
  • barn: antal barn
Exempel
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 tittar med glimpse () -funktionen från dplyr-biblioteket.
  • Tre poäng är över 500 000, så vi bestämde oss för att utesluta dem.
  • Det är vanligt att konvertera en monetär variabel i loggen. Det hjälper till att minska effekterna av avvikare och minskar snedheten i datasetet.

Produktion:

## Observations: 1,516## Variables: 10## $ wfood  0.4272, 0.3739, 0.1941, 0.4438, 0.3331, 0.3752, 0… ## $ wfuel  0.1342, 0.1686, 0.4056, 0.1258, 0.0824, 0.0481, 0… ## $ wcloth  0.0000, 0.0091, 0.0012, 0.0539, 0.0399, 0.1170, 0… ## $ walc  0.0106, 0.0825, 0.0513, 0.0397, 0.1571, 0.0210, 0… ## $ wtrans  0.1458, 0.1215, 0.2063, 0.0652, 0.2403, 0.0955, 0… ## $ wother  0.2822, 0.2444, 0.1415, 0.2716, 0.1473, 0.3431, 0… ## $ age  25, 39, 47, 33, 31, 24, 46, 25, 30, 41, 48, 24, 2… ## $ log_income  4.867534, 5.010635, 5.438079, 4.605170, 4.605170,… ## $ log_totexp  3.912023, 4.499810, 5.192957, 4.382027, 4.499810,… ## $ children_fac  Yes, Yes, Yes, Yes, No, No, No, No, No, No, Yes,… 

Vi kan beräkna korrelationskoefficienten mellan inkomst- och wfoodvariabler 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

Den bivariata korrelationen är en bra start, men vi kan få en bredare bild med multivariata analyser. En korrelation med många variabler visas i en korrelationsmatris . En korrelationsmatris är en matris som representerar parkorrelationen för alla variabler.

Funktionen cor () returnerar en korrelationsmatris. Den enda skillnaden med den bivariata korrelationen är att vi inte behöver ange 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 tappar kategorisk funktion innan vi skickar dataramen inuti cor ().

En korrelationsmatris är symmetrisk vilket innebär att värdena ovanför diagonalen har samma värden som nedan. Det är mer visuellt att visa hälften av matrisen.

Vi utesluter child_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 codemat_1 <-as.dist(round(cor(data[,1:9]),2))mat_1

Kodförklaring

  • cor (data): Visa korrelationsmatrisen
  • runda (data, 2): Runda korrelationsmatrisen med två decimaler
  • as.dist (): Visar endast andra halvan

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å

Betydelsesnivån är användbar i vissa situationer när vi använder pearson- eller spearman-metoden. Funktionen rcorr () från biblioteket Hmisc beräknar p-värdet för 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 för att beräkna 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: Output av 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 det element som heter P
  • runda (mat_2 [["P"], 3): Runda elementen med tre siffror

Produktion:

wfood wfuel wcloth walc wtrans wother age log_income log_totexpwfood NA 0.000 0.000 0.000 0.000 0.000 0.365 0.000 0wfuel 0.000 NA 0.000 0.000 0.000 0.000 0.076 0.000 0wcloth 0.000 0.000 NA 0.001 0.000 0.000 0.160 0.000 0walc 0.000 0.000 0.001 NA 0.000 0.000 0.000 0.105 0wtrans 0.000 0.000 0.000 0.000 NA 0.000 0.259 0.020 0wother 0.000 0.000 0.000 0.000 0.000 NA 0.355 0.000 0age 0.365 0.076 0.160 0.000 0.259 0.355 NA 0.000 0log_income 0.000 0.000 0.000 0.105 0.020 0.000 0.000 NA 0log_totexp 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 NA

Visualisera korrelationsmatris

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 den inte tillgänglig i conda-biblioteket. Vi kan installera direkt i konsolen.

install.packages("GGally")

Biblioteket innehåller olika funktioner för att visa sammanfattningsstatistiken, såsom korrelation och fördelning av alla variabler i en matris.

Funktionen ggcorr () har många argument. Vi presenterar endast argumenten vi kommer att använda i handledningen:

Funktionen ggcorr

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
  • nbrott : Returnera ett kategoriskt intervall för färgning av koefficienterna. Som standard är inget avbrott och färggradienten kontinuerlig
  • siffror : Runda korrelationskoefficienten. Ställ in som standard på 2
  • low : Kontrollera färgens nedre nivå
  • mitten : Kontrollera färgens mittnivå
  • hög : Kontrollera den höga nivån för färgningen
  • geom : Kontrollera formen på det geometriska argumentet. Som standard är "tile"
  • etikett : Booleskt värde. Visa eller inte etiketten. Som standard, ställ in på "FALSE"

Grundläggande värmekarta

Den mest grundläggande planen i paketet är en värmekarta. Förklaringen till diagrammet visar en lutningsfä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 dataramnamnet. Faktornivåvariabler ingår inte i diagrammet.

Produktion:

Lägg till kontroll på 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.
  • low = "steelblue": Använd ljusare färger för negativ korrelation
  • mid = "white": Använd vita färger för korrelation mellan mitten
  • high = "darkred": Använd mörka färger för positiv korrelation
  • geom = "cirkel": Använd cirkeln som formen på fönstren i värmekartan. Storleken på cirkeln är proportionell mot korrelationens absoluta värde.

Produktion:

Lägg till etikett på värmekartan

GGally tillåter oss att lägga till en etikett inuti fönstren.

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

Kodförklaring

  • label = TRUE: Lägg till värdena för korrelationskoefficienterna i värmekartan.
  • color = "grey50": Välj färg, dvs. grå
  • label_size = 3: Ställ in etikettens storlek lika med 3

Produktion:

ggpairs

Slutligen introducerar vi en annan funktion från GGaly-biblioteket. Ggpair. Det producerar en graf i ett matrisformat. Vi kan visa tre typer av beräkningar inom ett diagram. Matrisen är en dimension med lika många observationer. Den övre / nedre delen visar fönster och i diagonalen. Vi kan kontrollera 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
  • kolumner : Välj kolumnerna för att rita plot
  • title : Inkludera en titel
  • övre : Kontrollera rutorna ovanför diagonalen på diagrammet. Behöver ange vilken typ av beräkningar eller diagram 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 [vignetten] ("http://ggobi.github.io/ggally/#custom_functions") för mer information.
  • Nedre : Kontrollera rutorna under diagonalen.
  • Mapping : Indikerar grafens estetik. Vi kan till exempel beräkna diagrammet för olika grupper.

Bivariat analys med ggpair med gruppering

Nästa graf plottar tre uppgifter:

  • Korrelationsmatrisen mellan log_totexp, log_income, age och wtrans variabel grupperad efter huruvida hushållet har ett barn eller inte.
  • Plotta fördelningen av varje variabel efter grupp
  • Visa spridningsdiagrammet med trenden efter 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 diagrammet
  • title = "Bivariat analys av det brittiska hushållets intäktsutgifter": Lägg till en titel
  • upper = list (): Styr den övre delen av diagrammet. Dvs ovanför diagonalen
  • kontinuerlig = wrap ("cor", storlek = 3)): Beräkna korrelationskoefficienten. Vi slår in argumentet kontinuerligt inuti wrap () -funktionen för att kontrollera grafens estetik (dvs. storlek = 3) -lower = list (): Styr den nedre delen av diagrammet. Dvs nedanför diagonalen.
  • kontinuerlig = wrap ("slät", alfa = 0,3, storlek = 0,1): Lägg till ett spridningsdiagram med en linjär trend. Vi slår in argumentet kontinuerligt inuti funktionen wrap () för att kontrollera grafens estetik (dvs. storlek = 0,1, alfa = 0,3)
  • mapping = aes (color = child_fac): Vi vill att varje del av diagrammet ska staplas av variabeln child_fac, vilket ä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

Diagrammet nedan är lite annorlunda. Vi ändrar kartläggningens position 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 = child_fac): Flytta listan i övre = listan (). Vi vill bara att beräkningen staplas efter grupp i den övre delen av diagrammet.

Produktion:

Sammanfattning

Vi kan sammanfatta funktionen 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 tomter

cf code below

Intressanta artiklar...