Pearson & Spearman korrelasjonsmatrise i R med eksempel

⚡ Smart oppsummering

Pearson og Spearman-korrelasjon i R måler hvor sterkt to variabler beveger seg sammen, ved å bruke cor() for et enkelt par og en korrelasjonsmatrise for mange. Denne gjennomgangen legger til signifikanstesting med Hmisc og visualiserer resultatet med GGally-varmekart.

  • 📐 Koeffisientområde: Enhver korrelasjon ligger mellom -1 og 1, hvor 0 signaliserer ingen lineær sammenheng og begge ekstreme verdier signaliserer en perfekt sammenheng.
  • 📈 Pearson-metoden: Parametrisk, måler lineær assosiasjon og antar omtrent normale kontinuerlige variabler.
  • 🔢 Spearman-metoden: Ikke-parametrisk, fungerer på rangeringer og er robust mot avvikere og skjeve eller ordinale data.
  • 🧮 Matrisevisning: cor(df) returnerer hver parvise koeffisient, og as.dist() skriver bare ut den nedre trekanten.
  • 🔬 Betydning: cor.test() for ett par, eller rcorr() fra Hmisc for en full matrise av p-verdier.
  • 🎨 Visualisering: ggcorr() tegner et varmekart og ggpairs() bygger en full matrise av fordelinger og spredningsplott.

Korrelasjonsmatrise i R

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.

Ocuco korrelasjonskoeffisient, skrevet r, måler styrken til lineær forholdet mellom to variabler x og y. Det beregnes som følger:

Pearson Correlation Matrix i R

med

  • Pearson Correlation Matrix i R er standardavviket til x
  • Pearson Correlation Matrix i R er standardavviket til y

Korrelasjonen varierer mellom -1 og 1.

  • En verdi på r nær eller lik 0 innebærer liten eller ingen lineær sammenheng mellom x og y.
  • Jo nærmere r kommer 1 eller -1, desto sterkere er den lineære sammenhengen.

Du kan teste om r avviker fra null med t-statistikken nedenfor, og sammenligne den med Student-fordelingen med n – 2 frihetsgrader:

Pearson Correlation Matrix i R

Spearman Rank Correlation i R

En rangkorrelasjon sorterer observasjonene etter rang og beregner likhetsnivået mellom rangeringene. En rangkorrelasjon har fordelen av å være robust overfor uteliggere og er ikke knyttet til datafordelingen. En rangkorrelasjon er også det riktige valget for ordinale variabler.

Spearmans rangkorrelasjon, skrevet rho, går også fra -1 til 1, og verdier nær begge ytterpunktene indikerer en sterk monoton sammenheng. Den beregnes som følger:

Spearman Rank Correlation i R

Telleren er kovariansen mellom rekkene av x og y, og nevneren er produktet av standardavvikene deres.

I R beregnes begge med cor()-funksjonen, som tar tre argumenter: x, y og method.

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)

Code Forklaring

  • Vi importerer først dataene og tar en titt med glimpse()-funksjonen fra dplyr-biblioteket.
  • Tre husholdninger rapporterer en inntekt på 500 eller mer, så filteret (inntekt < 500) fjerner dem, og radantallet faller fra 1,519 til 1,516.
  • 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

Før dette utvides til hvert par av variabler, er det verdt å fastslå hvordan en enkelt koeffisient skal leses.

Hvordan tolke en korrelasjonskoeffisient

En koeffisient er bare nyttig når du kan si hva den betyr. Båndene nedenfor er den konvensjonelle avlesningen, og fortegnet leses separat fra styrken.

Absolutt verdi av r Styrken i forholdet
0.00 til 0.19 Svært svak eller ingen
0.20 til 0.39 Svak
0.40 til 0.59 Moderat
0.60 til 0.79 Sterk
0.80 til 1.00 Veldig sterk

Verdien på -0.2467 som ble beregnet tidligere mellom log_inntekt og wfood er derfor en svak negativ sammenheng: rikere husholdninger bruker en litt mindre andel av budsjettet sitt på mat.

Tre forholdsregler gjelder for hver koeffisient.

  • Korrelasjon er ikke årsakssammenheng. En sterk r sier at de to variablene beveger seg sammen, aldri at den ene forårsaker den andre. En tredje, umålt variabel driver ofte begge.
  • Pearson ser bare rette linjer. En perfekt U-formet relasjon returnerer en r nær null. Plott alltid dataene før du stoler på tallet.
  • Størrelse teller mer enn betydning. Med 1,516 observasjoner kan en koeffisient på 0.06 være statistisk signifikant og fortsatt praktisk talt meningsløs.

Slik tester du korrelasjonssignifikans med cor.test()

cor() returnerer koeffisienten og ingenting annet. For et enkelt par legger cor.test() p-verdien og et konfidensintervall sammen i ett kall.

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

Resultatet har fire deler som er verdt å lese.

  1. t og df: teststatistikken og dens frihetsgrader, n – 2.
  2. p-verdiensannsynligheten for å se en så stor koeffisient hvis den sanne korrelasjonen var null.
  3. 95 prosent konfidensintervall: det plausible området for den sanne korrelasjonen. Hvis den ekskluderer null, er forholdet signifikant på det nivået.
  4. eksempelestimatselve koeffisienten, identisk med det cor() returnerer.

Den samme funksjonen kjører de rangbaserte testene ved å endre ett argument:

# Spearman rank correlation with a p-value
cor.test(data$log_income, data$wfood, method = "spearman")

# One-sided test: is the correlation greater than zero?
cor.test(data$log_income, data$wfood, alternative = "greater")

Når man skal bruke hvilken. Bruk cor.test() når du undersøker ett spesifikt par, fordi det gir konfidensintervallet som rcorr() utelater. Bruk rcorr() fra Hmisc, vist ovenfor, når du trenger p-verdier for en hel matrise samtidig. Merk at testing av mange par blåser opp den falske positive raten, så juster p-verdiene med p.adjust(p_value, method = “BH”) før du trekker konklusjoner fra en stor matrise.

Korrelasjonsmatrise i R

En bivariat korrelasjon er en god start, men et multivariat perspektiv gir et bredere bilde. korrelasjonsmatrise er en firkantet tabell som holder den parvise korrelasjonen av hver variabel mot hverandre.

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.

En korrelasjon kan ikke beregnes for en faktor, så fjern alle kategoriske kolonner før du sender datarammen til 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.

children_fac er ekskludert fordi cor() ikke kan operere på en faktor.

# 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

Code Forklaring

  • kor(data[, 1:9])Beregn korrelasjonsmatrisen på de ni numeriske kolonnene
  • runde(…, 2)Rund av hver koeffisient til to desimaler
  • as.dist()Skriv bare ut den nedre trekanten, siden matrisen er symmetrisk

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å

En koeffisient i seg selv sier ikke om forholdet er statistisk pålitelig. rcorr()-funksjonen fra Hmisc-biblioteket returnerer p-verdien for hvert par. 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

Code 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 å lese en korrelasjonsmatrise på. GGally-biblioteket utvider ggplot2 og installeres fra CRAN i stedet for conda:

install.packages("GGally")

Visualisering av korrelasjonsmatrise

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)

Code Forklaring

  • ggcorr(data): Bare ett argument er nødvendig, som er datarammenavnet. Faktornivåvariabler er ikke inkludert i plottet.

Utgang:

Grunnleggende varmekart

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

Code 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 kontroll til varmekartet

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

Code 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:

Legge til etikett på varmekartet

ggpairs-funksjonen

GGally-biblioteket tilbyr også ggpairs(), som returnerer en matrise av plott. For k valgte variabler er resultatet ak ganger k rutenett: diagonalen viser fordelingen av hver variabel, mens panelene over og under diagonalen kan ha en annen beregning. Syntaksen er:

ggpairs(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
  • øversteKontroller boksene over diagonalen i plottet. Må oppgi typen beregninger eller graf som skal returneres. Hvis kontinuerlig = «kor», ber vi R om å beregne korrelasjonen. Merk at argumentet må være en liste. Andre argumenter er tilgjengelige; se GGally-dokumentasjon for mer informasjon.
  • lavere: Kontroller boksene under diagonalen.
  • kartping: Indikerer grafens estetikk. For eksempel kan vi beregne grafen for forskjellige grupper.

Bivariat analyse med ggpair med grouping

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

Code 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)
  • kartping = aes(farge = barnefjes)Del hvert panel etter children_fac, den ordnede faktoren merket «Nei» for husholdninger uten barn og «Ja» for husholdninger med barn

Utgang:

Bivariat analyse med ggpair med Grouping

Bivariat analyse med ggpair med delvis grouping

Grafen nedenfor er litt annerledes. Vi endrer kartets posisjonping 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))
)

Code Forklaring

  • Nøyaktig samme kode som forrige eksempel bortsett fra:
  • kartping = aes(color = children_fac): Flytter listen i upper = list(). Vi ønsker bare at beregningen skal være stablet gruppevis i den øvre delen av grafen.

Utgang:

Bivariat analyse med ggpair med partiell gruppeping

Korrelasjon i R: Viktige konklusjoner og funksjonsreferanse

  • 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 går fra -1 til 1, og verdier nær begge ytterpunktene indikerer en sterk monoton sammenheng.
  • En korrelasjonsmatrise er en kvadratisk tabell som inneholder den parvise korrelasjonen til hver variabel.
  • En p-verdi forteller deg om en observert korrelasjon er statistisk skillebar fra null.

Hver korrelasjonsfunksjon som brukes i denne veiledningen er listet opp nedenfor:

Bibliotek Målet Metode Code
Base Bivariat korrelasjon Pearson
cor(dfx2, method = "pearson")
Base Bivariat 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)
GGally Multivariat plottmatrise -
ggpairs(df, columns = c("x1", "x2"))

Spørsmål og svar

Bruk Spearman når forholdet er monotont, men ikke lineært, når det finnes uteliggere, eller når en variabel er ordinal. Pearson antar linearitet og omtrent normale kontinuerlige data.

Kendall tau teller konkordante og diskordante par i stedet for rangeringsforskjeller. Den er mer robust enn Spearman på små utvalg med mange likheter, men tregere å beregne på store datasett.

Nei. Korrelasjon måler kun sambevegelse. En forstyrrende variabel kan drive begge seriene, og retningen på en reell effekt kan ikke fastslås bare ut fra koeffisienten.

Korrelasjonsmatriser eksponerer overflødige funksjoner før trening, siden to sterkt korrelerte prediktorer legger til lite informasjon og destabiliserer lineære modeller. AI-team bruker dem også til å flagge datalekkasje fra målvariabelen.

Ja. AI-assistenter kan oppsummere hvilke par som overstiger en terskel, foreslå hvilken redundant funksjon som skal fjernes og forklare fargene på varmekartet. Bekreft hvert krav mot din egen cor.test()-utdata før du handler.

Oppsummer dette innlegget med: