Корреляция в R: Pearson & Спирмен с примером матрицы

Двумерная связь описывает связь или корреляцию между двумя переменными, и. В этом руководстве мы обсудим концепцию корреляции и покажем, как ее можно использовать для измерения взаимосвязи между любыми двумя переменными.

Есть два основных метода вычисления корреляции между двумя переменными.

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

В этом руководстве вы узнаете

  • Корреляции Пирсона
  • Корреляция рангов Спирмена
  • Матрица корреляции
  • Визуализировать корреляционную матрицу

Корреляции Пирсона

Метод корреляции Пирсона обычно используется в качестве первичной проверки взаимосвязи между двумя переменными.

Коэффициент корреляции , является показателем прочности линейной связи между двумя переменными и. Он рассчитывается следующим образом:

с

  • , т. е. стандартное отклонение
  • , т. е. стандартное отклонение

Корреляция колеблется от -1 до 1.

  • Значение, близкое к 0 или равное 0, подразумевает небольшую линейную связь между и или ее отсутствие.
  • Напротив, чем ближе значение к 1 или -1, тем сильнее линейная зависимость.

Мы можем вычислить t-критерий следующим образом и проверить таблицу распределения со степенью свободы, равной:

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

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

Ранговая корреляция Спирмена всегда находится между -1 и 1, причем значение, близкое к крайнему, указывает на сильную взаимосвязь. Он рассчитывается следующим образом:

с заявленными ковариациями между рангом и. Знаменатель вычисляет стандартные отклонения.

В R мы можем использовать функцию cor (). Он принимает три аргумента, и метод.

cor(x, y, method)

Аргументы :

  • x: Первый вектор
  • y: Второй вектор
  • метод: формула, используемая для вычисления корреляции. Три строковых значения:
    • "Пирсон"
    • "Кендалл"
    • "копейщик"

Если векторы содержат пропущенное значение, можно добавить необязательный аргумент: use = "complete.obs"

Мы будем использовать набор данных BudgetUK. Этот набор данных сообщает о бюджетных ассигнованиях британских домохозяйств в период с 1980 по 1982 год. Имеется 1519 наблюдений с десятью характеристиками, среди которых:

  • wfood: разделить расходы на еду
  • wfuel: разделить расход топлива
  • wcloth: доля бюджета на расходы на одежду
  • walc: разделить расходы на алкоголь
  • wtrans: разделить расходы на транспорт
  • wother: доля расходов на другие товары
  • totexp: общие расходы домохозяйства в фунтах
  • доход общий чистый доход домохозяйства
  • age: возраст домохозяйства
  • children: количество детей
Пример
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.
  • Три точки выше 500К, поэтому мы решили их исключить.
  • Обычной практикой является преобразование денежной переменной в журнал. Это помогает уменьшить влияние выбросов и снижает асимметрию набора данных.

Выход:

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

Мы можем вычислить коэффициент корреляции между доходом и переменными wfood с помощью методов «пирсона» и «копейщика».

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

выход:

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

Выход:

## [1] -0.2501252 

Матрица корреляции

Двумерная корреляция - хорошее начало, но мы можем получить более широкую картину с помощью многомерного анализа. Корреляция со многими переменными изображена внутри корреляционной матрицы . Матрица корреляции - это матрица, которая представляет парную корреляцию всех переменных.

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

Обратите внимание, что корреляция не может быть вычислена для факторной переменной. Нам нужно убедиться, что мы отбрасываем категориальную функцию, прежде чем передавать фрейм данных внутри cor ().

Корреляционная матрица симметрична, что означает, что значения над диагональю имеют те же значения, что и значения ниже. Нагляднее показать половину матрицы.

Мы исключаем children_fac, потому что это переменная факторного уровня. cor не выполняет корреляцию по категориальной переменной.

# 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

Код Пояснение

  • cor (data): отображение корреляционной матрицы
  • round (data, 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
  • round (mat_2 [["P"]]], 3): округлить элементы тремя цифрами.

Выход:

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

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

Тепловая карта - это еще один способ показать корреляционную матрицу. Библиотека 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 : используемый набор данных
  • метод : Формула для вычисления корреляции. По умолчанию вычисляются попарно и Пирсон.
  • nbreaks : возвращает категориальный диапазон для окраски коэффициентов. По умолчанию без перерыва, а цветовой градиент сплошной
  • цифры : округлить коэффициент корреляции. По умолчанию установлено 2
  • low : контроль нижнего уровня окраски.
  • mid : управление средним уровнем окраски.
  • высокий : контроль высокого уровня окраски
  • geom : Управляйте формой геометрического аргумента. По умолчанию «плитка»
  • label : логическое значение. Отображать или нет этикетку. По умолчанию установлено значение FALSE.

Базовая тепловая карта

Самым основным сюжетом пакета является тепловая карта. Легенда графика показывает градиентный цвет от -1 до 1, причем горячий цвет указывает на сильную положительную корреляцию, а холодный цвет - на отрицательную корреляцию.

library(GGally)ggcorr(data)

Код Пояснение

  • ggcorr (data): необходим только один аргумент - имя фрейма данных. Переменные факторного уровня не включены в график.

Выход:

Добавить контроль на тепловую карту

Мы можем добавить дополнительные элементы управления на график.

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

Код Пояснение

  • nbreaks = 6: разбейте легенду 6 разрядами.
  • low = "steelblue": используйте более светлые цвета для отрицательной корреляции.
  • mid = "white": используйте белые цвета для корреляции средних диапазонов.
  • high = "darkred": используйте темные цвета для положительной корреляции.
  • geom = "circle": используйте круг в качестве формы окон на тепловой карте. Размер круга пропорционален абсолютному значению корреляции.

Выход:

Добавить метку к тепловой карте

GGally позволяет нам добавлять метки внутри окон.

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

Код Пояснение

  • label = TRUE: Добавьте значения коэффициентов корреляции внутри тепловой карты.
  • color = "grey50": выберите цвет, например серый.
  • label_size = 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 : используемый набор данных
  • столбцы : выберите столбцы, чтобы нарисовать график.
  • title : включить заголовок
  • верхний : управляйте полями над диагональю графика. Необходимо указать тип вычислений или график для возврата. Если continuous = "cor", мы просим R вычислить корреляцию. Обратите внимание, что аргумент должен быть списком. Можно использовать другие аргументы, см. [Виньетку] ("http://ggobi.github.io/ggally/#custom_functions") для получения дополнительной информации.
  • Нижний : контролируйте поля под диагональю.
  • Отображение : указывает эстетику графика. Например, мы можем вычислить график для разных групп.

Двумерный анализ с ggpair с группировкой

На следующем графике представлены три информации:

  • Корреляционная матрица между переменными log_totexp, 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))

Код Пояснение

  • columns = c ("log_totexp", "log_income", "age", "wtrans"): выберите переменные для отображения на графике.
  • title = "Двумерный анализ доходов британской семьи": Добавьте заголовок
  • upper = list (): управление верхней частью графика. Т.е. выше диагонали
  • continuous = wrap ("cor", size = 3)): вычислить коэффициент корреляции. Мы оборачиваем аргумент continuous внутри функции wrap (), чтобы контролировать эстетику графика (т.е. size = 3) -lower = list (): контролировать нижнюю часть графика. Т.е. ниже диагонали.
  • Continuous = wrap ("smooth", alpha = 0.3, size = 0.1): добавьте диаграмму рассеяния с линейным трендом. Мы оборачиваем аргумент непрерывным внутри функции wrap (), чтобы контролировать эстетику графика (т.е. размер = 0,1, альфа = 0,3).
  • mapping = aes (color = 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 (). Нам нужно только, чтобы вычисления складывались по группам в верхней части графика.

Выход:

Резюме

Мы можем резюмировать функцию в таблице ниже:

библиотека

Цель

метод

код

Основание

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

Пирсон

cor(dfx2, method = "pearson")

Основание

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

Копейщик

cor(dfx2, method = "spearman")

Основание

Многомерная корреляция

Пирсон

cor(df, method = "pearson")

Основание

Многомерная корреляция

Копейщик

cor(df, method = "spearman")

Hmisc

Значение P

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

Ggally

Тепловая карта

ggcorr(df)

Многовариантные графики

cf code below

Интересные статьи...