Корреляция в R: матрица корреляции Пирсона и Спирмена
Двумерная корреляция в R
Двумерная связь описывает связь или корреляцию между двумя переменными в R. В этом уроке мы обсудим концепцию корреляции и покажем, как ее можно использовать для измерения взаимосвязи между любыми двумя переменными в R.
Корреляция в программировании на R
Существует два основных метода вычисления корреляции между двумя переменными в программировании на R:
- Pearson: Параметрическая корреляция
- копьеносец: Непараметрическая корреляция
Матрица корреляции Пирсона в R
Метод корреляции Пирсона обычно используется в качестве первичной проверки связи между двумя переменными.
Команда коэффициент корреляции, , является мерой силы линейный связь между двумя переменными и . Он рассчитывается следующим образом:
, т.е. стандартное отклонение
, т.е. стандартное отклонение
Корреляция находится в диапазоне от -1 до 1.
- Значение, близкое или равное 0, подразумевает небольшую или отсутствие линейной зависимости между и .
- Напротив, чем ближе к 1 или -1, тем сильнее линейная зависимость.
Мы можем вычислить t-критерий следующим образом и проверить таблицу распределения со степенью свободы, равной:
Ранговая корреляция Спирмена в R
Ранговая корреляция сортирует наблюдения по рангу и вычисляет уровень сходства между рангами. Преимущество ранговой корреляции состоит в том, что она устойчива к выбросам и не связана с распределением данных. Обратите внимание, что для порядковой переменной подходит ранговая корреляция.
Ранговая корреляция Спирмена всегда находится между -1 и 1, а значение, близкое к граничному значению, указывает на сильную взаимосвязь. Он рассчитывается следующим образом:
с указанием ковариаций между рангом и . Знаменатель вычисляет стандартные отклонения.
В R мы можем использовать функцию cor(). Он принимает три аргумента и метод.
cor(x, y, method)
аргументы:
- x: Первый вектор
- y: Второй вектор
- метод: формула, используемая для расчета корреляции. Три строковых значения:
- «груша»
- «Кендалл»
- «копейщик»
Можно добавить необязательный аргумент, если векторы содержат пропущенное значение: use = «complete.obs»
Мы будем использовать набор данных BudgetUK. В этом наборе данных показано распределение бюджетов британских домохозяйств в период с 1980 по 1982 год. Имеется 1519 наблюдений с десятью характеристиками, среди которых:
- еда: поделиться едой, поделиться расходами
- wтопливо: поделиться расходом топлива
- ткань: доля бюджета на расходы на одежду
- ходить: поделиться расходами на алкоголь
- втранс: разделить расходы на транспорт
- вопрос: доля расходов на другие товары
- тотэксп: общие расходы домохозяйства в фунтах
- доход: общий чистый доход домохозяйства
- возраст: возраст семьи
- дети: Число детей
Пример
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)
Код Пояснение
- Сначала мы импортируем данные и проверяем их с помощью функции проблеска() из библиотеки dplyr.
- Три точки выше 500К, поэтому мы решили их исключить.
- Обычной практикой является преобразование денежной переменной в логарифм. Это помогает уменьшить влияние выбросов и уменьшает асимметрию набора данных.
Вывод:
## 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, ...
Мы можем вычислить коэффициент корреляции между переменными дохода и питания с помощью методов «Пирсона» и «Спирмена».
cor(data$log_income, data$wfood, method = "pearson")
Вывод:
## [1] -0.2466986
cor(data$log_income, data$wfood, method = "spearman")
Вывод:
## [1] -0.2501252
Корреляционная матрица в 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
Код Пояснение
- кор (данные): Отображение корреляционной матрицы
- раунд(данные, 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
Код Пояснение
- 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: используемый набор данных
- метод: Формула для расчета корреляции. По умолчанию вычисляются попарно и по Пирсону.
- нбрейки: Возвращает категориальный диапазон окраски коэффициентов. По умолчанию разрывов нет, градиент цвета непрерывный.
- цифры: округлить коэффициент корреляции. По умолчанию установлено 2
- низкокачественными: Контролируйте нижний уровень окраски.
- в середине: Контролируйте средний уровень окраски.
- высокая: Контролируйте интенсивность цвета.
- геом: Управляйте формой геометрического аргумента. По умолчанию «плитка»
- этикетка: логическое значение. Отображать или нет метку. По умолчанию установлено значение FALSE.
Базовая тепловая карта
Самый основной график пакета — это тепловая карта. Легенда графика показывает градиентный цвет от – 1 до 1, причем горячий цвет указывает на сильную положительную корреляцию, а холодный цвет – на отрицательную корреляцию.
library(GGally) ggcorr(data)
Код Пояснение
- ggcorr(данные): необходим только один аргумент — имя фрейма данных. Переменные уровня фактора не включены в график.
Вывод:
Добавление контроля к тепловой карте
Мы можем добавить на график больше элементов управления:
ggcorr(data, nbreaks = 6, low = "steelblue", mid = "white", high = "darkred", geom = "circle")
Код Пояснение
- nbreaks=6: разбить легенду с 6 рангами.
- низкий = «стальной синий»: используйте более светлые цвета для отрицательной корреляции.
- середина = «белый»: Используйте белые цвета для корреляции средних диапазонов.
- высокий = «темно-красный»: используйте темные цвета для положительной корреляции.
- геом = «круг»: использовать круг в качестве формы окон на тепловой карте. Размер круга пропорционален абсолютному значению корреляции.
Вывод:
Добавление метки на тепловую карту
GGally позволяет нам добавлять метки внутри окон:
ggcorr(data, nbreaks = 6, label = TRUE, label_size = 3, color = "grey50")
Код Пояснение
- метка = ИСТИНА: добавьте значения коэффициентов корреляции внутри тепловой карты.
- цвет = «серый50»: выберите цвет, например серый.
- label_size = 3: Установите размер метки равным 3
Вывод:
Функция ggpairs
Наконец, мы представляем еще одну функцию из библиотеки GGaly. Ггпара. Он создает график в матричном формате. Мы можем отобразить три вида вычислений на одном графике. Матрица представляет собой размерность с равным количеством наблюдений. В верхней/нижней части отображаются окна и по диагонали. Мы можем контролировать, какую информацию мы хотим отображать в каждой части матрицы. Формула для ggpair:
ggpair(df, columns = 1: ncol(df), title = NULL, upper = list(continuous = "cor"), lower = list(continuous = "smooth"), mapping = NULL)
Аргументы:
- df: используемый набор данных
- столбцы: выберите столбцы для построения графика.
- название: Включить заголовок
- верхний: управляйте полями над диагональю графика. Необходимо указать тип вычислений или график для возврата. Если Continuous = «cor», мы просим R вычислить корреляцию. Обратите внимание, что аргумент должен быть списком. Можно использовать и другие аргументы, дополнительную информацию см. в [эпизоде](“http://ggobi.github.io/ggally/#custom_functions”).
- Опустите: Управляйте квадратами под диагональю.
- Карт: указывает на эстетику графика. Например, мы можем вычислить график для разных групп.
Двумерный анализ с помощью ggpair с группировкой
На следующем графике представлены три информации:
- Матрица корреляции между переменными log_totexp, log_income, age и 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», «возраст», «wtrans»): выберите переменные для отображения на графике.
- title = «Двумерный анализ доходов и расходов британской семьи»: Добавить заголовок
- верхний = список(): Управление верхней частью графика. Т.е. выше диагонали
- непрерывный = обертка («кор», размер = 3)): Вычислить коэффициент корреляции. Мы помещаем аргумент Continuous в функцию Wrap(), чтобы контролировать эстетику графика (т.е. размер = 3). -lower = list(): Управляет нижней частью графика. Т.е. ниже диагонали.
- непрерывный = перенос («гладкий», альфа = 0.3, размер = 0.1): добавить диаграмму рассеяния с линейным трендом. Мы обертываем аргумент Continuous внутри функции Wrap(), чтобы контролировать эстетику графика (т. е. размер = 0.1, альфа = 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): переместите список в верхний = list(). Нам нужно, чтобы вычисления были сгруппированы по группам в верхней части графика.
Вывод:
Резюме
- Двумерное отношение описывает взаимосвязь или корреляцию между двумя переменными в R.
- Существует два основных метода вычисления корреляции между двумя переменными в R Программирование: Пирсон и Спирмен.
- Метод корреляции Пирсона обычно используется в качестве первичной проверки связи между двумя переменными.
- Ранговая корреляция сортирует наблюдения по рангу и вычисляет уровень сходства между рангами.
- Ранговая корреляция Спирмена всегда находится между -1 и 1, а значение, близкое к граничному значению, указывает на сильную взаимосвязь.
- Корреляционная матрица — это матрица, которая представляет парную корреляцию всех переменных.
- Уровень значимости полезен в некоторых ситуациях, когда мы используем метод Пирсона или Спирмена.
Мы можем суммировать все корреляционные функции в R в таблице ниже:
Библиотека | Цель | Способ доставки | Code |
---|---|---|---|
Система исчисления | двумерная корреляция | Pearson |
cor(dfx2, method = "pearson") |
Система исчисления | двумерная корреляция | копьеносец |
cor(dfx2, method = "spearman") |
Система исчисления | Многомерная корреляция | Pearson |
cor(df, method = "pearson") |
Система исчисления | Многомерная корреляция | копьеносец |
cor(df, method = "spearman") |
Hразное | Значение P |
rcorr(as.matrix(data[,1:9]))[["P"]] |
|
Ггалли | тепловая карта |
ggcorr(df) |
|
Многомерные графики |
cf code below |