Корелационна матрица на Пиърсън и Спиърман в R с пример

⚡ Умно обобщение

Корелацията на Пиърсън и Спиърман в R измерва колко силно се движат две променливи заедно, използвайки cor() за една двойка и корелационна матрица за много. Това ръководство добавя тестване за значимост с Hmisc и визуализира резултата с топлинни карти на GGally.

  • 📐 Диапазон на коефициента: Всяка корелация е между -1 и 1, където 0 показва липса на линейна връзка, а която и да е от крайностите показва перфектна такава.
  • 📈 Метод на Пиърсън: Параметричен, измерва линейна асоциация и приема приблизително нормални непрекъснати променливи.
  • 🔢 Метод на Спиърман: Непараметричен, работи с рангове и е устойчив на отклонения и изкривени или ординални данни.
  • 🧮 Матричен изглед: cor(df) връща всеки по двойки коефициент, а as.dist() отпечатва само долния триъгълник.
  • 🔬 Значение: cor.test() за една двойка или rcorr() от Hmisc за пълна матрица от p-стойности.
  • 🎨 Визуализация: ggcorr() чертае топлинна карта, а ggpairs() изгражда пълна матрица от разпределения и точкови диаграми.

Корелационна матрица в R

Двумерна корелация в R

Двумерната връзка описва връзка - или корелация - между две променливи в R. В този урок ще обсъдим концепцията за корелация и ще покажем как тя може да се използва за измерване на връзката между две променливи в R.

Корелация в R програмирането

Има два основни метода за изчисляване на корелацията между две променливи в R програмирането:

  • Pearson: Параметрична корелация
  • копиеносец: Непараметрична корелация

Корелационна матрица на Pearson в R

Корелационният метод на Pearson обикновено се използва като основна проверка за връзката между две променливи.

- коефициент на корелация, обозначено като r, измерва силата на линеен връзка между две променливи x и y. Тя се изчислява, както следва:

Корелационна матрица на Pearson в R

с

  • Корелационна матрица на Pearson в R е стандартното отклонение на x
  • Корелационна матрица на Pearson в R е стандартното отклонение на y

Корелацията варира между -1 и 1.

  • Стойност на r близка или равна на 0 предполага малка или никаква линейна връзка между x и y.
  • Колкото по-близо е r до 1 или -1, толкова по-силна е линейната връзка.

Можете да проверите дали r е различно от нула с t-статистиката по-долу, като я сравните с разпределението на Стюдънт с n – 2 степени на свобода:

Корелационна матрица на Pearson в R

Рангова корелация на Спирман в R

Ранговата корелация сортира наблюденията по ранг и изчислява нивото на сходство между ранговете. Ранговата корелация има предимството, че е устойчива на отклонения и не е свързана с разпределението на данните. Ранговата корелация е правилният избор и за ординални променливи.

Ранговата корелация на Спиърман, обозначена като rho, също варира от -1 до 1, а стойностите, близки до двата екстремума, показват силна монотонна връзка. Тя се изчислява, както следва:

Рангова корелация на Спирман в R

Числителят е ковариацията между ранговете на x и y, а знаменателят е произведението на техните стандартни отклонения.

В R и двете се изчисляват с функцията cor(), която приема три аргумента: x, y и метод.

cor(x, y, method)

Аргументи:

  • x: Първи вектор
  • y: Втори вектор
  • метод: Формулата, използвана за изчисляване на корелацията. Три низови стойности:
    • „пиърсън“
    • "кендъл"
    • „копиеносец“

Може да се добави незадължителен аргумент, ако векторите съдържат липсваща стойност: use = “complete.obs”

Ще използваме набора от данни BudgetUK. Този набор от данни отчита бюджетното разпределение на британските домакинства между 1980 и 1982 г. Има 1519 наблюдения с десет характеристики, сред които:

  • wfood: споделяйте храна споделяйте харчете
  • wfuel: споделете разхода на гориво
  • тоалетна кърпа: бюджетен дял за разходи за облекло
  • ходене: споделете харченето на алкохол
  • wtrans: споделете разходите за транспорт
  • майка: дял от разходите за други стоки
  • totexp: общите разходи на домакинството в лири
  • доход: общ нетен доход на домакинството
  • възраст: възраст на домакинството
  • деца: брой деца

Пример

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 Обяснение

  • Първо импортираме данните и разглеждаме с функцията glimpse() от библиотеката dplyr.
  • Три домакинства отчитат доход от 500 или повече, така че филтър (доход < 500) ги премахва и броят на редовете намалява от 1,519 на 1,516.
  • Често срещана практика е парична променлива да се конвертира в log. Помага за намаляване на въздействието на отклоненията и намалява неравномерността в набора от данни.

Изход:

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

Можем да изчислим коефициента на корелация между променливите доход и wfood с методите „pearson“ и „spearman“.

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

Изход:

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

Изход:

## [1] -0.2501252

Преди да разширим това до всяка двойка променливи, си струва да определим как трябва да се чете един единствен коефициент.

Как да интерпретираме коефициент на корелация

Коефициентът е полезен само след като можете да кажете какво означава. Лентите по-долу са конвенционалното отчитане, а знакът се отчита отделно от силата.

Абсолютна стойност на r Сила на връзката
0.00 да 0.19 Много слаб или никакъв
0.20 да 0.39 Слаб
0.40 да 0.59 Умерена
0.60 да 0.79 Здрав
0.80 да 1.00 Много силен

Стойността от -0.2467, изчислена по-рано между log_income и wfood, следователно е слаба отрицателна връзка: по-богатите домакинства харчат малко по-малък дял от бюджета си за храна.

Три предупреждения важат за всеки коефициент.

  • Корелацията не е причинно-следствена връзка. Силно r показва, че двете променливи се движат заедно, а не че едната причинява другата. Трета, неизмерима променлива често движи и двете.
  • Пиърсън вижда само прави линии. Перфектната U-образна зависимост връща r близо до нула. Винаги начертайте данните, преди да се доверите на числото.
  • Размерът е по-важен от значимостта. При 1,516 наблюдения, коефициент от 0.06 може да бъде статистически значим и все още практически безсмислен.

Как да тестваме значимостта на корелацията с cor.test()

cor() връща коефициента и нищо друго. За една двойка, cor.test() сумира p-стойността и доверителния интервал с едно извикване.

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

Резултатът има четири части, които си струва да се прочетат.

  1. t и df: тестовата статистика и нейните степени на свобода, n – 2.
  2. р-стойноствероятността да се види толкова голям коефициент, ако истинската корелация беше нула.
  3. 95-процентов доверителен интервал: правдоподобният диапазон за истинската корелация. Ако изключва нула, връзката е значима на това ниво.
  4. примерна оценка: самият коефициент, идентичен с това, което връща cor().

Същата функция изпълнява тестовете, базирани на ранг, като променя един аргумент:

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

Кога да използвам кой. Използвайте cor.test(), когато изследвате една конкретна двойка, защото тя дава доверителния интервал, който rcorr() пропуска. Използвайте rcorr() от Hmisc, показан по-горе, когато имате нужда от p-стойности за цяла матрица наведнъж. Обърнете внимание, че тестването на много двойки завишава процента на фалшиво положителни резултати, така че коригирайте p-стойностите с p.adjust(p_value, method = “BH”), преди да правите заключения от голяма матрица.

Корелационна матрица в R

Двувариантната корелация е добро начало, но многовариантният поглед дава по-широката картина. корелационна матрица е квадратна таблица, съдържаща двойната корелация на всяка променлива спрямо всяка друга.

Функцията cor() връща корелационна матрица. Единствената разлика с двумерната корелация е, че не е необходимо да уточняваме кои променливи. По подразбиране R изчислява корелацията между всички променливи.

Корелацията не може да бъде изчислена за фактор, така че премахнете всяка категорична колона, преди да предадете рамката с данни на cor().

Корелационната матрица е симетрична, което означава, че стойностите над диагонала имат същите стойности като тази по-долу. По-визуално е да се покаже половината от матрицата.

children_fac е изключен, защото cor() не може да работи с фактор.

# 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 Обяснение

  • кор(данни[, 1:9])Изчислете корелационната матрица на деветте числови колони
  • кръгъл(…, 2)Закръглете всеки коефициент до втори знак за десетичната запетая
  • as.dist()Отпечатайте само долния триъгълник, тъй като матрицата е симетрична

Изход:

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

Ниво на значимост

Сам по себе си коефициентът не показва дали връзката е статистически надеждна. Функцията rcorr() от библиотеката на Hmisc връща p-стойността за всяка двойка. Можем да изтеглим библиотеката от Conda и копирайте кода, за да го поставите в терминала:

conda install -c r r-hmisc

Rcorr() изисква рамка от данни да бъде съхранена като матрица. Можем да преобразуваме нашите данни в матрица, преди да изчислим корелационната матрица с p-стойността.

library("Hmisc")
data_rcorr <-as.matrix(data[, 1: 9])

mat_2 <-rcorr(data_rcorr)
# mat_2 <-rcorr(as.matrix(data)) returns the same output

Списъчният обект mat_2 съдържа три елемента:

  • r: Изход на корелационната матрица
  • n: Брой наблюдение
  • P: p-стойност

Интересуваме се от третия елемент, p-стойността. Обичайно е корелационната матрица да се показва с p-стойността вместо с коефициента на корелация.

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

Code Обяснение

  • mat_2[[“P”]]: p-стойностите се съхраняват в елемента, наречен P
  • кръгъл (mat_2[[“P”]], 3): Закръглете елементите с три цифри

Изход:

           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

Визуализиране на корелационната матрица в R

Топлинната карта е друг начин за четене на корелационна матрица. Библиотеката GGally разширява ggplot2 и се инсталира от CRAN, а не от conda:

install.packages("GGally")

Визуализация на корелационната матрица

Библиотеката включва различни функции за показване на обобщената статистика, като например корелация и разпределение на всички променливи в матрица.

Функцията ggcorr() има много аргументи. Ще представим само аргументите, които ще използваме в урока:

Функцията ggcorr

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

аргументи:

  • df: Използван набор от данни
  • метод: Формула за изчисляване на корелацията. По подразбиране се изчисляват по двойки и Pearson
  • nbreaks: Връща категоричен диапазон за оцветяването на коефициентите. По подразбиране няма прекъсване и цветният градиент е непрекъснат
  • цифри: Закръглете коефициента на корелация. По подразбиране е зададено на 2
  • ниско: Контролирайте по-ниското ниво на оцветяването
  • среден: Контролирайте средното ниво на оцветяването
  • Високо: Контролирайте високото ниво на оцветяването
  • геом: Контролирайте формата на геометричния аргумент. По подразбиране „плочка“
  • етикет: булева стойност. Покажете или не етикета. По подразбиране е зададено на `FALSE`

Основна топлинна карта

Най-основният график на пакета е топлинна карта. Легендата на графиката показва градиентен цвят от – 1 до 1, като горещият цвят показва силна положителна корелация, а студеният цвят – отрицателна корелация.

library(GGally)
ggcorr(data)

Code Обяснение

  • ggcorr(данни): Необходим е само един аргумент, който е името на рамката с данни. Променливите на ниво фактор не са включени в графиката.

Изход:

Основна топлинна карта

Добавяне на контрол към топлинната карта

Можем да добавим още контроли към графиката:

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

Code Обяснение

  • nbreaks=6: разбийте легендата с 6 ранга.
  • ниско = „стоманеносиньо“: Използвайте по-светли цветове за отрицателна корелация
  • среден = „бял“: Използвайте бели цветове за корелация на средни диапазони
  • високо = „тъмно“: Използвайте тъмни цветове за положителна корелация
  • geom = „кръг“: Използвайте кръг като форма на прозорците в топлинната карта. Размерът на кръга е пропорционален на абсолютната стойност на корелацията.

Изход:

Добавяне на контрол към топлинната карта

Добавяне на етикет към топлинната карта

GGally ни позволява да добавим етикет вътре в прозорците:

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

Code Обяснение

  • етикет = TRUE: Добавете стойностите на коефициентите на корелация в топлинната карта.
  • цвят = "сив50": Изберете цвят, т.е. сиво
  • етикет_размер = 3: Задайте размера на етикета равен на 3

Изход:

Добавяне на етикет към топлинната карта

Функцията ggpairs

Библиотеката GGally предоставя и ggpairs(), която връща матрица от графики. За k избрани променливи резултатът е мрежа от ak x k: диагоналът показва разпределението на всяка променлива, докато панелите над и под диагонала могат да изпълняват различни изчисления. Синтаксисът е:

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

аргументи:

  • df: Използван набор от данни
  • колони: Изберете колоните, за да начертаете диаграмата
  • заглавие: Включете заглавие
  • горен: Контролирайте полетата над диагонала на графиката. Трябва да предоставите типа изчисления или графика, която да се върне. Ако continuous = „cor“, искаме от R да изчисли корелацията. Обърнете внимание, че аргументът трябва да е списък. Налични са и други аргументи; вижте Документация на GGally за повече информация.
  • понижаване на: Контролирайте полетата под диагонала.
  • картаping: Показва естетиката на графиката. Например, можем да изчислим графиката за различни групи.

Двувариатен анализ с ggpair с grouping

Следващата графика изобразява три информация:

  • Корелационната матрица между променливите log_totex, log_income, възраст и wtrans, групирани според това дали домакинството има дете или не.
  • Начертайте разпределението на всяка променлива по групи
  • Покажете диаграмата на разсейване с тенденцията по групи
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 Обяснение

  • колони = c(“log_totexp”, “log_income”, “age”, “wtrans”): Изберете променливите за показване в графиката
  • title = „Двумерен анализ на разходите за приходи от британското домакинство“: Добавете заглавие
  • горен = списък (): Контролирайте горната част на графиката. Т.е. над диагонала
  • непрекъснато = обвиване ("кор", размер = 3)): Изчислете коефициента на корелация. Обгръщаме аргумента непрекъснато във функцията wrap(), за да контролираме естетиката на графиката (т.е. размер = 3) -lower = list(): Контролираме долната част на графиката. Т.е. под диагонала.
  • непрекъснато = обвиване („гладко“, алфа = 0.3, размер = 0.1): Добавяне на точкова диаграма с линейна тенденция. Обгръщаме аргумента непрекъснато във функцията wrap(), за да контролираме естетиката на графиката (т.е. size=0.1, alpha=0.3)
  • картаping = aes(цвят = детски_факултет)Разделете всеки панел по children_fac, подреденият фактор, обозначен с „Не“ за домакинства без деца и „Да“ за домакинства с деца

Изход:

Двувариатен анализ с ggpair с Grouping

Двувариатен анализ с ggpair с частична групаping

Графиката по-долу е малко по-различна. Променяме позицията на картатаping вътре в горния аргумент.

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 Обяснение

  • Същият код като предишния пример, с изключение на:
  • картаping = aes(color = children_fac): Преместване на списъка в горната част на графиката = list(). Искаме изчислението да е подредено по групи само в горната част на графиката.

Изход:

Двувариатен анализ с ggpair с частична групаping

Корелация в R: Ключови изводи и справка за функциите

  • Двумерната връзка описва връзка - или корелация - между две променливи в R.
  • Има два основни метода за изчисляване на корелацията между две променливи R Програмиране: Pearson & Spearman.
  • Корелационният метод на Pearson обикновено се използва като основна проверка за връзката между две променливи.
  • Ранговата корелация сортира наблюденията по ранг и изчислява нивото на сходство между ранга.
  • Ранговата корелация на Спиърман варира от -1 до 1, а стойностите близо до двата екстремума показват силна монотонна връзка.
  • Корелационната матрица е квадратна таблица, съдържаща двойната корелация на всяка променлива.
  • P-стойността ви показва дали наблюдаваната корелация е статистически различима от нула.

Всяка корелационна функция, използвана в този урок, е изброена по-долу:

Библиотека Цел Начин на доставка Code
база Двувариантна корелация Pearson
cor(dfx2, method = "pearson")
база Двувариантна корелация копиеносец
cor(dfx2, method = "spearman")
база Многомерна корелация Pearson
cor(df, method = "pearson")
база Многомерна корелация копиеносец
cor(df, method = "spearman")
Hmisc P стойност -
rcorr(as.matrix(data[,1:9]))[["P"]]
ДжиГали Топлинна карта -
ggcorr(df)
ДжиГали Многовариантна графика матрица -
ggpairs(df, columns = c("x1", "x2"))

Въпроси и Отговори

Използвайте Spearman, когато връзката е монотонна, но не линейна, когато има отклонения или когато променливата е ординална. Pearson приема линейност и приблизително нормални непрекъснати данни.

Тау методът на Кендъл брои конкордантни и несъответстващи двойки, а не разлики в класирането. Той е по-стабилен от Spearman при малки извадки с много връзки, макар че е по-бавен за изчисляване при големи набори от данни.

Не. Корелацията измерва само съвместното движение. Объркваща променлива може да движи и двете серии и посоката на който и да е реален ефект не може да се установи само от коефициента.

Корелационните матрици разкриват излишни характеристики преди обучението, тъй като два силно корелирани предиктора добавят малко информация и дестабилизират линейните модели. Екипите с изкуствен интелект ги използват и за маркиране на изтичане на данни от целевата променлива.

Да. Асистентите с изкуствен интелект могат да обобщят кои двойки надвишават праг, да предложат коя излишна функция да се премахне и да обяснят цветовете на топлинната карта. Потвърдете всяко твърдение спрямо вашия собствен изход от cor.test(), преди да действате.

Обобщете тази публикация с: