Корелация в R: корелационна матрица на Pearson & Spearman
Двумерна корелация в R
Двумерната връзка описва връзка - или корелация - между две променливи в R. В този урок ще обсъдим концепцията за корелация и ще покажем как тя може да се използва за измерване на връзката между две променливи в R.
Корелация в R програмирането
Има два основни метода за изчисляване на корелацията между две променливи в R програмирането:
- Pearson: Параметрична корелация
- копиеносец: Непараметрична корелация
Корелационна матрица на Pearson в R
Корелационният метод на Pearson обикновено се използва като основна проверка за връзката между две променливи.
- коефициент на корелация, , е мярка за силата на линеен връзката между две променливи и . Изчислява се както следва:
с
, т.е. стандартно отклонение на
, т.е. стандартно отклонение на
Корелацията варира между -1 и 1.
- Стойност, близка или равна на 0, предполага малка или никаква линейна връзка между и.
- За разлика от това, колкото по-близо е до 1 или -1, толкова по-силна е линейната връзка.
Можем да изчислим t-теста, както следва, и да проверим таблицата на разпределението със степен на свобода, равна на:
Рангова корелация на Спирман в R
Ранговата корелация сортира наблюденията по ранг и изчислява нивото на сходство между ранга. Ранговата корелация има предимството да е стабилна спрямо отклоненията и не е свързана с разпределението на данните. Имайте предвид, че ранговата корелация е подходяща за ординалната променлива.
Ранговата корелация на Spearman, , винаги е между -1 и 1 със стойност, близка до крайната точка, показва силна връзка. Изчислява се както следва:
с посочените ковариации между ранг и . Знаменателят изчислява стандартните отклонения.
В R можем да използваме функцията cor(). Необходими са три аргумента, и методът.
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)
Обяснение на кода
- Първо импортираме данните и разглеждаме с функцията glimpse() от библиотеката dplyr.
- Три точки са над 500K, затова решихме да ги изключим.
- Често срещана практика е парична променлива да се конвертира в 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
Двумерната корелация е добро начало, но можем да получим по-широка картина с многовариантен анализ. Корелация с много променливи е изобразена вътре в a корелационна матрица. Корелационната матрица е матрица, която представлява двойната корелация на всички променливи.
Функцията 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
Обяснение на кода
- кор(данни): Показване на корелационната матрица
- кръг (данни, 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
Ниво на значимост
Нивото на значимост е полезно в някои ситуации, когато използваме метода на Pearson или Spearman. Функцията 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
Обяснение на кода
- 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. В момента не е наличен в библиотеката на 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)
Обяснение на кода
- ggcorr(данни): Необходим е само един аргумент, който е името на рамката с данни. Променливите на ниво фактор не са включени в графиката.
Изход:
Добавяне на контрол към топлинната карта
Можем да добавим още контроли към графиката:
ggcorr(data, nbreaks = 6, low = "steelblue", mid = "white", high = "darkred", geom = "circle")
Обяснение на кода
- nbreaks=6: разбийте легендата с 6 ранга.
- ниско = „стоманеносиньо“: Използвайте по-светли цветове за отрицателна корелация
- среден = „бял“: Използвайте бели цветове за корелация на средни диапазони
- високо = „тъмно“: Използвайте тъмни цветове за положителна корелация
- geom = „кръг“: Използвайте кръг като форма на прозорците в топлинната карта. Размерът на кръга е пропорционален на абсолютната стойност на корелацията.
Изход:
Добавяне на етикет към топлинната карта
GGally ни позволява да добавим етикет вътре в прозорците:
ggcorr(data, nbreaks = 6, label = TRUE, label_size = 3, color = "grey50")
Обяснение на кода
- етикет = TRUE: Добавете стойностите на коефициентите на корелация в топлинната карта.
- цвят = "сив50": Изберете цвят, т.е. сиво
- етикет_размер = 3: Задайте размера на етикета равен на 3
Изход:
Функцията ggpairs
И накрая, представяме още една функция от библиотеката GGaly. Ggpair. Той създава графика в матричен формат. Можем да покажем три вида изчисления в една графика. Матрицата е измерение, което е равно на броя на наблюденията. Горната/долната част показва прозорци и по диагонал. Можем да контролираме каква информация искаме да покажем във всяка част от матрицата. Формулата за ggpair е:
ggpair(df, columns = 1: ncol(df), title = NULL, upper = list(continuous = "cor"), lower = list(continuous = "smooth"), mapping = NULL)
аргументи:
- df: Използван набор от данни
- колони: Изберете колоните, за да начертаете диаграмата
- заглавие: Включете заглавие
- горен: Контролирайте полетата над диагонала на графиката. Необходимо е да предоставите вида на изчисленията или графиката, които да върнете. Ако непрекъснато = „cor“, молим R да изчисли корелацията. Имайте предвид, че аргументът трябва да бъде списък. Могат да се използват и други аргументи, вижте [vignette](„http://ggobi.github.io/ggally/#custom_functions“) за повече информация.
- Спуснете: Контролирайте полетата под диагонала.
- Mapping: Показва естетиката на графиката. Например, можем да изчислим графиката за различни групи.
Двумерен анализ с ggpair с групиране
Следващата графика изобразява три информация:
- Корелационната матрица между променливите 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))
Обяснение на кода
- колони = c(“log_totexp”, “log_income”, “age”, “wtrans”): Изберете променливите за показване в графиката
- title = „Двумерен анализ на разходите за приходи от британското домакинство“: Добавете заглавие
- горен = списък (): Контролирайте горната част на графиката. Т.е. над диагонала
- непрекъснато = обвиване ("кор", размер = 3)): Изчислете коефициента на корелация. Обгръщаме аргумента непрекъснато във функцията wrap(), за да контролираме естетиката на графиката (т.е. размер = 3) -lower = list(): Контролираме долната част на графиката. Т.е. под диагонала.
- непрекъснато = обвиване („гладко“, алфа = 0.3, размер = 0.1): Добавяне на точкова диаграма с линейна тенденция. Обгръщаме аргумента непрекъснато във функцията wrap(), за да контролираме естетиката на графиката (т.е. size=0.1, alpha=0.3)
- картографиране = aes (цвят = children_fac): Искаме всяка част от графиката да бъде подредена от променливата children_fac, която е категорична променлива, приемаща стойност 1, ако домакинството няма деца, и 2 в противен случай
Изход:
Двумерен анализ с ggpair с частично групиране
Графиката по-долу е малко по-различна. Променяме позицията на картографирането вътре в горния аргумент.
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)) )
Обяснение на кода
- Същият код като предишния пример, с изключение на:
- mapping = aes(color = children_fac): Преместете списъка в upper = list(). Искаме само изчислението, подредено по групи в горната част на графиката.
Изход:
Oбобщение
- Двумерната връзка описва връзка - или корелация - между две променливи в R.
- Има два основни метода за изчисляване на корелацията между две променливи R Програмиране: Pearson & Spearman.
- Корелационният метод на Pearson обикновено се използва като основна проверка за връзката между две променливи.
- Ранговата корелация сортира наблюденията по ранг и изчислява нивото на сходство между ранга.
- Ранговата корелация на Spearman, , винаги е между -1 и 1 със стойност, близка до крайната точка, показва силна връзка.
- Корелационната матрица е матрица, която представлява двойната корелация на всички променливи.
- Нивото на значимост е полезно в някои ситуации, когато използваме метода на Pearson или Spearman.
Можем да обобщим всички корелационни функции в R в таблицата по-долу:
Библиотека | Цел | Начин на доставка | код |
---|---|---|---|
база | двумерна корелация | 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"]] |
|
Ggally | топлина карта |
ggcorr(df) |
|
Многовариантни сюжети |
cf code below |