Correlatie in R: Pearson & Spearman met Matrix-voorbeeld

Een bivariate relatie beschrijft een relatie -of correlatie- tussen twee variabelen, en. In deze tutorial bespreken we het concept van correlatie en laten we zien hoe het kan worden gebruikt om de relatie tussen twee willekeurige variabelen te meten.

Er zijn twee primaire methoden om de correlatie tussen twee variabelen te berekenen.

  • Pearson: parametrische correlatie
  • Spearman: niet-parametrische correlatie

In deze tutorial leer je

  • Pearson correlatie
  • Spearman Rank Correlation
  • Correlatiematrix
  • Visualiseer de correlatiematrix

Pearson correlatie

De Pearson-correlatiemethode wordt meestal gebruikt als primaire controle voor de relatie tussen twee variabelen.

De correlatiecoëfficiënt`` is een maat voor de sterkte van de lineaire relatie tussen twee variabelen en. Het wordt als volgt berekend:

met

  • , dwz standaarddeviatie van
  • , dwz standaarddeviatie van

De correlatie varieert tussen -1 en 1.

  • Een waarde van bijna of gelijk aan 0 impliceert weinig of geen lineaire relatie tussen en.
  • Daarentegen, hoe dichter bij 1 of -1 komt, hoe sterker de lineaire relatie.

We kunnen de t-test als volgt berekenen en de distributietabel controleren met een vrijheidsgraad gelijk aan:

Spearman Rank Correlation

Een rangcorrelatie sorteert de waarnemingen op rang en berekent het niveau van overeenkomst tussen de rangschikking. Een rangcorrelatie heeft het voordeel robuust te zijn voor uitschieters en is niet gekoppeld aan de distributie van de gegevens. Merk op dat een rangcorrelatie geschikt is voor de ordinale variabele.

De rangcorrelatie van Spearman,, ligt altijd tussen -1 en 1, waarbij een waarde dicht bij het uiteinde een sterke relatie aangeeft. Het wordt als volgt berekend:

met verklaarde de covarianties tussen rang en. De noemer berekent de standaarddeviaties.

In R kunnen we de functie cor () gebruiken. Er zijn drie argumenten nodig, en de methode.

cor(x, y, method)

Argumenten :

  • x: eerste vector
  • y: Tweede vector
  • methode: de formule die wordt gebruikt om de correlatie te berekenen. Drie stringwaarden:
    • "Pearson"
    • "kendall"
    • "speerman"

Een optioneel argument kan worden toegevoegd als de vectoren een ontbrekende waarde bevatten: use = "complete.obs"

We zullen de BudgetUK-dataset gebruiken. Deze dataset rapporteert de budgetverdeling van Britse huishoudens tussen 1980 en 1982. Er zijn 1519 observaties met tien kenmerken, waaronder:

  • wfood: deel uitgaven voor voedselaandelen
  • wfuel: deel brandstofuitgaven
  • wcloth: budgetaandeel voor kledinguitgaven
  • walc: deel alcoholuitgaven
  • wtrans: deel transportuitgaven
  • wother: aandeel overige bestedingen
  • totexp: totale gezinsuitgaven in pond
  • inkomen totaal netto huishoudinkomen
  • leeftijd: leeftijd van het huishouden
  • kinderen: aantal kinderen
Voorbeeld
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)

Code Verklaring

  • We importeren eerst de gegevens en kijken met de functie glimpse () uit de dplyr-bibliotheek.
  • Drie punten liggen boven de 500K, dus hebben we besloten ze uit te sluiten.
  • Het is gebruikelijk om een ​​monetaire variabele in een logboek om te zetten. Het helpt de impact van uitschieters te verminderen en vermindert de scheefheid in de dataset.

Uitgang:

## 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,… 

We kunnen de correlatiecoëfficiënt tussen inkomen en wfood-variabelen berekenen met de "pearson" en "spearman" -methoden.

cor(data$log_income, data$wfood, method = "pearson")

output:

## [1] -0.2466986
cor(data$log_income, data$wfood, method = "spearman")

Uitgang:

## [1] -0.2501252 

Correlatiematrix

De bivariate correlatie is een goed begin, maar we kunnen een breder beeld krijgen met multivariate analyse. Een correlatie met veel variabelen wordt weergegeven in een correlatiematrix . Een correlatiematrix is ​​een matrix die de paarcorrelatie van alle variabelen weergeeft.

De functie cor () retourneert een correlatiematrix. Het enige verschil met de bivariate correlatie is dat we niet hoeven te specificeren welke variabelen. R berekent standaard de correlatie tussen alle variabelen.

Merk op dat er geen correlatie kan worden berekend voor factorvariabele. We moeten ervoor zorgen dat we de categorische functie laten vallen voordat we het dataframe binnen cor () doorgeven.

Een correlatiematrix is ​​symmetrisch, wat betekent dat de waarden boven de diagonaal dezelfde waarden hebben als die eronder. Het is visueler om de helft van de matrix te laten zien.

We sluiten children_fac uit omdat het een variabele op factorniveau is. cor voert geen correlatie uit op een categorische variabele.

# 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

Code Verklaring

  • cor (data): Geef de correlatiematrix weer
  • round (data, 2): Rond de correlatiematrix af met twee decimalen
  • as.dist (): toont alleen de tweede helft

Uitgang:

## 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

Mate van belangrijkheid

Het significantieniveau is handig in sommige situaties wanneer we de Pearson- of Spearman-methode gebruiken. De functie rcorr () uit de bibliotheek Hmisc berekent voor ons de p-waarde. We kunnen de bibliotheek downloaden van conda en de code kopiëren om deze in de terminal te plakken:

conda install -c r r-hmisc 

De rcorr () vereist dat een dataframe wordt opgeslagen als een matrix. We kunnen onze gegevens eerder in een matrix converteren om de correlatiematrix met de p-waarde te berekenen.

library("Hmisc")data_rcorr <-as.matrix(data[, 1: 9])mat_2 <-rcorr(data_rcorr)# mat_2 <-rcorr(as.matrix(data)) returns the same output

Het lijstobject mat_2 bevat drie elementen:

  • r: Output van de correlatiematrix
  • n: aantal observaties
  • P: p-waarde

We zijn geïnteresseerd in het derde element, de p-waarde. Het is gebruikelijk om de correlatiematrix te tonen met de p-waarde in plaats van de correlatiecoëfficiënt.

p_value <-round(mat_2[["P"]], 3)p_value

Code Verklaring

  • mat_2 [["P"]]: De p-waarden worden opgeslagen in het element genaamd P
  • round (mat_2 [["P"]], 3): Rond de elementen af ​​met drie cijfers

Uitgang:

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

Visualiseer de correlatiematrix

Een heatmap is een andere manier om een ​​correlatiematrix te tonen. De GGally-bibliotheek is een uitbreiding van ggplot2. Momenteel is het niet beschikbaar in de condabibliotheek. We kunnen rechtstreeks in de console installeren.

install.packages("GGally")

De bibliotheek bevat verschillende functies om de samenvattende statistieken weer te geven, zoals de correlatie en distributie van alle variabelen in een matrix.

De functie ggcorr () heeft veel argumenten. We zullen alleen de argumenten introduceren die we in de tutorial zullen gebruiken:

De functie ggcorr

ggcorr(df, method = c("pairwise", "pearson"),nbreaks = NULL, digits = 2, low = "#3B9AB2",mid = "#EEEEEE", high = "#F21A00",geom = "tile", label = FALSE,label_alpha = FALSE)

Argumenten:

  • df : gebruikte gegevensset
  • methode : formule om de correlatie te berekenen. Standaard worden paarsgewijs en Pearson berekend
  • nbreaks : retourneert een categorisch bereik voor de kleuring van de coëfficiënten. Standaard is er geen onderbreking en is het kleurverloop continu
  • cijfers : Rond de correlatiecoëfficiënt af. Standaard ingesteld op 2
  • laag : regelt het lagere kleurniveau
  • mid : Bepaal het middelste niveau van de kleuring
  • hoog : controle over het hoge kleurniveau
  • geom : bepaal de vorm van het geometrische argument. Standaard "tegel"
  • label : Booleaanse waarde. Geef het label weer of niet. Standaard ingesteld op `FALSE`

Basis warmtekaart

De meest elementaire plot van het pakket is een heatmap. De legenda van de grafiek toont een kleurverloop van - 1 tot 1, waarbij warme kleuren een sterke positieve correlatie aangeven en koude kleuren een negatieve correlatie.

library(GGally)ggcorr(data)

Code Verklaring

  • ggcorr (data): Er is slechts één argument nodig, namelijk de naam van het dataframe. Variabelen op factorniveau zijn niet in de plot opgenomen.

Uitgang:

Voeg controle toe aan de hittekaart

We kunnen meer bedieningselementen aan de grafiek toevoegen.

ggcorr(data,nbreaks = 6,low = "steelblue",mid = "white",high = "darkred",geom = "circle")

Code Verklaring

  • nbreaks = 6: verbreek de legende met 6 rangen.
  • low = "steelblue": Gebruik lichtere kleuren voor een negatieve correlatie
  • mid = "white": gebruik witte kleuren voor correlaties tussen middenbereiken
  • high = "darkred": gebruik donkere kleuren voor een positieve correlatie
  • geom = "circle": Gebruik cirkel als de vorm van de vensters in de heatmap. De grootte van de cirkel is evenredig met de absolute waarde van de correlatie.

Uitgang:

Voeg een label toe aan de hittekaart

GGally stelt ons in staat om een ​​label aan de binnenkant van de vensters toe te voegen.

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

Code Verklaring

  • label = TRUE: Voeg de waarden van de correlatiecoëfficiënten toe binnen de heatmap.
  • color = "grey50": Kies de kleur, dwz grijs
  • label_size = 3: Stel de grootte van het label in op 3

Uitgang:

ggpairs

Ten slotte introduceren we een andere functie uit de GGaly-bibliotheek. Ggpair. Het produceert een grafiek in een matrixformaat. We kunnen drie soorten berekeningen in één grafiek weergeven. De matrix is ​​een dimensie, met gelijk aan het aantal waarnemingen. Het bovenste / onderste deel toont vensters en in de diagonaal. We kunnen bepalen welke informatie we in elk deel van de matrix willen weergeven. De formule voor ggpair is:

ggpair(df, columns = 1: ncol(df), title = NULL,upper = list(continuous = "cor"),lower = list(continuous = "smooth"),mapping = NULL)

Argumenten :

  • df : gebruikte gegevensset
  • kolommen : Selecteer de kolommen om de plot te tekenen
  • titel : voeg een titel toe
  • upper : Beheer de vakken boven de diagonaal van de plot. Moet het type berekeningen of grafiek opgeven dat moet worden geretourneerd. Als continu = "cor", vragen we R om de correlatie te berekenen. Merk op dat het argument een lijst moet zijn. Andere argumenten kunnen worden gebruikt, zie het [vignet] ("http://ggobi.github.io/ggally/#custom_functions") voor meer informatie.
  • Lager : controleer de vakken onder de diagonaal.
  • Mapping : geeft de esthetiek van de grafiek aan. We kunnen bijvoorbeeld de grafiek voor verschillende groepen berekenen.

Bivariate analyse met ggpair met groepering

In de volgende grafiek worden drie gegevens uitgezet:

  • De correlatiematrix tussen log_totexp, log_income, leeftijd en wtrans variabele gegroepeerd op of het huishouden een kind heeft of niet.
  • Teken de verdeling van elke variabele per groep
  • Geef het spreidingsdiagram met de trend per groep weer
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))

Code Verklaring

  • columns = c ("log_totexp", "log_income", "age", "wtrans"): Kies de variabelen die in de grafiek moeten worden weergegeven
  • title = "Bivariate analyse van inkomstenuitgaven door het Britse huishouden": Voeg een titel toe
  • upper = list (): Beheer het bovenste deel van de grafiek. Dat wil zeggen boven de diagonaal
  • continu = wrap ("cor", size = 3)): Bereken de correlatiecoëfficiënt. We wikkelen het argument continu in de functie wrap () om de esthetiek van de grafiek te controleren (dwz size = 3) -lower = list (): Controle van het onderste deel van de grafiek. Dat wil zeggen onder de diagonaal.
  • continu = wrap ("smooth", alpha = 0.3, size = 0.1): voeg een scatterplot toe met een lineaire trend. We wikkelen het argument continu in de functie wrap () om de esthetiek van de grafiek te controleren (dwz grootte = 0,1, alpha = 0,3)
  • mapping = aes (color = children_fac): we willen dat elk deel van de grafiek wordt gestapeld met de variabele children_fac, wat een categorische variabele is met de waarde 1 als het huishouden geen kinderen heeft en 2 anders

Uitgang:

Bivariate analyse met ggpair met gedeeltelijke groepering

De onderstaande grafiek is een beetje anders. We veranderen de positie van de afbeelding binnen het bovenste argument.

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

Code Verklaring

  • Exact dezelfde code als het vorige voorbeeld, behalve voor:
  • mapping = aes (color = children_fac): Verplaats de lijst in upper = list (). We willen alleen de berekening gestapeld per groep in het bovenste deel van de grafiek.

Uitgang:

Overzicht

We kunnen de functie samenvatten in de onderstaande tabel:

bibliotheek

Objectief

methode

code

Baseren

bivariate correlatie

Pearson

cor(dfx2, method = "pearson")

Baseren

bivariate correlatie

Spearman

cor(dfx2, method = "spearman")

Baseren

Multivariate correlatie

Pearson

cor(df, method = "pearson")

Baseren

Multivariate correlatie

Spearman

cor(df, method = "spearman")

Hmisc

P-waarde

rcorr(as.matrix(data[,1:9]))[["P"]]

Ggally

warmtekaart

ggcorr(df)

Multivariate plots

cf code below

Interessante artikelen...