Кореляція в R: Пірсон & Приклад Спірмена з матрицею

Двовимірний зв’язок описує зв’язок - або кореляцію - між двома змінними та. У цьому посібнику ми обговорюємо концепцію кореляції та показуємо, як її можна використовувати для вимірювання зв'язку між будь-якими двома змінними.

Існує два основних методи обчислення кореляції між двома змінними.

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

У цьому підручнику ви дізнаєтесь

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

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

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

Коефіцієнт кореляції , є показником міцності лінійної зв'язку між двома змінними і. Він обчислюється наступним чином:

з

  • , тобто стандартне відхилення
  • , тобто стандартне відхилення

Кореляція коливається від -1 до 1.

  • Значення, близьке до або рівне 0, означає мало або взагалі не має лінійних зв'язків між і.
  • На відміну від цього, чим ближче наближається до 1 або -1, тим сильніший лінійний зв’язок.

Ми можемо обчислити t-тест наступним чином і перевірити таблицю розподілу зі ступенем свободи, рівним:

Співвідношення рангу Спірмена

Кореляція рангу сортує спостереження за рангом та обчислює рівень подібності між рангами. Перевага рангової кореляції полягає в тому, що вона є надійною у порівнянні з випадаючими показниками і не пов’язана з розподілом даних. Зауважте, що для порядкової змінної підходить рангова кореляція.

Кореляція рангу Спірмена,, завжди знаходиться між -1 і 1 зі значенням, близьким до кінцівки, вказує на сильну взаємозв'язок. Він обчислюється наступним чином:

з констатованими ковар'язностями між чином і. Знаменник обчислює середньоквадратичні відхилення.

У R ми можемо використовувати функцію cor (). Потрібно три аргументи, і метод.

cor(x, y, method)

Аргументи :

  • x: перший вектор
  • y: Другий вектор
  • метод: Формула, що використовується для обчислення кореляції. Три рядкові значення:
    • "персик"
    • "Кендалл"
    • "списоносець"

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

Ми використовуватимемо набір даних BudgetUK. Цей набір даних повідомляє про розподіл бюджетів домогосподарств Великобританії між 1980 і 1982 рр. Є 1519 спостережень з десятьма ознаками, серед яких:

  • wfood: розділити витрати на їжу
  • wfuel: розділіть витрати на паливо
  • тканина: частка бюджету на витрати на одяг
  • walc: поділіться алкоголем
  • wtrans: розділити транспортні витрати
  • wother: частка інших витрат на товари
  • 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.
  • Три пункти перевищують 500 000, тому ми вирішили їх виключити.
  • Поширеною практикою є перетворення грошової змінної в журнал. Це допомагає зменшити вплив викидів та зменшує перекоси в наборі даних.

Вихід:

## 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 за допомогою методів "pearson" та "spearman".

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 (дані): Відображення матриці кореляції
  • раунд (дані, 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_value <-round(mat_2[["P"]], 3)p_value

Пояснення коду

  • mat_2 [["P"]]: Значення p зберігаються в елементі, який називається P
  • круглий (мат_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
  • низький : контролюйте нижчий рівень забарвлення
  • середина : контролюйте середній рівень забарвлення
  • високий : контролюйте високий рівень забарвлення
  • geom : керування формою геометричного аргументу. За замовчуванням "плитка"
  • мітка : логічне значення. Відображати чи ні ярлик. За замовчуванням встановіть значення "FALSE"

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

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

library(GGally)ggcorr(data)

Пояснення коду

  • ggcorr (дані): потрібен лише один аргумент, який є іменем кадру даних. Змінні рівня фактора не включаються в графік.

Вихід:

Додайте контроль до теплової карти

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

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

Пояснення коду

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

Вихід:

Додайте ярлик до теплової карти

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 : Додайте заголовок
  • верхній : керуйте полями над діагоналлю графіку. Потрібно вказати тип обчислень або графік для повернення. Якщо неперервна = "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))

Пояснення коду

  • колонки = c ("log_totexp", "log_income", "age", "wtrans"): Виберіть змінні, які відображатимуться на графіку
  • title = "Двовимірний аналіз витрат доходів британським домогосподарством": Додайте заголовок
  • upper = list (): Керування верхньою частиною графіку. Тобто Над діагоналлю
  • безперервний = обтікання ("cor", розмір = 3)): Обчислити коефіцієнт кореляції. Ми обертаємо аргумент безперервно всередині функції wrap (), щоб контролювати естетичність графіку (тобто розмір = 3) -lower = list (): Керуємо нижньою частиною графіку. Тобто нижче діагоналі.
  • безперервне = обтікання ("плавне", альфа = 0,3, розмір = 0,1): Додайте графік розсіювання з лінійним трендом. Ми обертаємо аргумент безперервно всередині функції wrap (), щоб контролювати естетичність графіку (тобто розмір = 0,1, альфа = 0,3)
  • mapping = aes (color = kids_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 = kids_fac): Перемістіть список у верхній = list (). Нам потрібне лише обчислення, складене групами у верхній частині графіку.

Вихід:

Резюме

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

бібліотека

Об’єктивна

метод

код

База

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

Пірсон

cor(dfx2, method = "pearson")

База

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

Копієносець

cor(dfx2, method = "spearman")

База

Багатовимірна кореляція

персон

cor(df, method = "pearson")

База

Багатовимірна кореляція

Копієносець

cor(df, method = "spearman")

Hmisc

Значення Р

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

Ггалі

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

ggcorr(df)

Багатоваріантні сюжети

cf code below

Цікаві статті...