Связь двух переменных

Часто перед исследователем стоит задача понять, связаны ли две переменные друг с другом. Переменные связаны, если они изменяются синхронно. Если необходимо понять, связаны ли две переменные, первое, что можно сделать - построить диаграмму рассеяния. На диаграмме рассеяния каждому наблюдению (или элементарной единице набора данных) соответствует точка, координаты которой (в декартовой системе координат) равны значениям двух каких-то параметров этого наблюдения. Если предполагается, что один из параметров зависит от другого, то обычно значения независимого параметра откладывается по горизонтальной оси, а значения зависимого — по вертикальной. Диаграммы рассеяния используются для демонстрации наличия или отсутствия корреляции между двумя переменными. Построим диаграмму рассеяния для роста и веса студентов вашего курса.

Установка пакетов и рабочей директории

Установим необходимые для занятия пакеты (это действие необходимо, только если пакеты ещё не установлены на ваш компьютер) (для установки выполните следующую строку без символа # вначале).

# install.packages(c('ggplot2', 'psych', 'car', 'corrgram', 'gplots', 'ggm'))

Подгружаем загруженные пакеты для их использования в текущей сессии работы R.

library(psych)
library(ggplot2)
library(car)
library(corrgram)
library(gplots)
library(ggm)
library(corrplot)

Устанавливаем рабочую директорию: через меню или командой

#setwd('...')  
#(вместо '...' укажите путь к папке, в которой хранится файл)

Открываем файл HeightWeight.csv

df <- read.csv("HeightWeight.csv")
str(df)
## 'data.frame':    200 obs. of  4 variables:
##  $ id    : int  1 2 3 4 5 6 7 8 9 10 ...
##  $ height: num  65.8 71.5 69.4 68.2 67.8 ...
##  $ weight: num  113 136 153 142 144 ...
##  $ group : int  2 1 1 2 2 1 1 2 2 1 ...

Диаграмму рассеяния (scatterplot)

Построим базовый вариант диаграммы рассеяния. Поскольку дальше ме хотим улучшить вид диаграммы, запишем её базовый вариант в переменную plot, чтобы каждый раз не писать эти две строчки.

plot <- ggplot(df, aes(df$height, df$weight)) + geom_point(aes())

Теперь наш рисунок хранится в переменной plot и может быть построен прямо из неё

plot

Улучшим внешний вид диаграммы (вместо первых двух строк используем переменную plot)

plot + 
    xlab('Рост') + # подписываем ось x
    ylab('Вес') + # подписываем ось y
    theme_bw() # выбирваем ч/б тему

Через множество точек можно провести линию, показывающую связь между этими переменными

plot +
    xlab('Рост') + # подписываем ось x
    ylab('Вес') + # подписываем ось y
    theme_bw() + # выбирваем ч/б тему
    geom_smooth(method=lm)

И не обязательно прямую линию (переменные не обязательно должны быть связаны линейно)

plot +
    xlab('Рост') + # подписываем ось x
    ylab('Вес') + # подписываем ось y
    theme_bw() + # выбирваем ч/б тему
    geom_smooth()

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

ggplot(df, aes(df$height, df$weight, colour=as.factor(group))) +  # оператор colour=habitation раскрашивает точки цветами
    geom_point(size = 5) + # size = 5 - делает точки побольше
    xlab('Рост') + # подписываем ось x
    ylab('Вес') + # подписываем ось y
    theme_bw() + # выбирваем ч/б тему
    geom_smooth(method=lm, se=FALSE) # se=FALSE - не показывать доверительный интервал

Множество дополнительных возможностей по редактированию диаграммы можно найти, например, здесь или здесь.

Корреляции

Коэффициент корреляции Пирсона

Линейный коэффициент корреляции Пирсона (Pearson product moment correlation) отражает степень линейной связи между двумя количественными переменными.

cor.test(df[,2], df[,3], method='pearson')
## 
##  Pearson's product-moment correlation
## 
## data:  df[, 2] and df[, 3]
## t = 9.4338, df = 198, p-value < 2.2e-16
## alternative hypothesis: true correlation is not equal to 0
## 95 percent confidence interval:
##  0.4531327 0.6457176
## sample estimates:
##       cor 
## 0.5568647

Коэффициент корреляции Пирсона r равен 0.5568647. Однако прежде, чем его интерпретировать, необходимо проверить статистическую гипотезу о том, отличается ли это значение от нуля. Стандартная нулевая гипотеза – отсутствие связи (то есть коэффициент корреляции для генеральной совокупности равен нулю). Результаты проверки статистической гипотезы показаkи, что t = 9.4338, а p-value = < 2.2e-16 (или 0.00000000000000022), т.е. если нулевая гипотеза (H0: коэффициент корреляции равен нулю) верна, то вероятность получить вычесленное значение критерия t (в данном случае t = 9.4338) равна 0.00000000000000022, что ниже конвенционального значения 0.05. Следовательно, мы должны отклонить нулевую гипотезу. Корреляция меджу ростом и весом равна 0.5568647.

Если бы вы писали курсовую или статью, то вам необходимо было бы написать следующее:

Рост и вес коррелируют друг с другом, коэффициент корреляции Пирсона r(198) = 0.56, p < 0.001.

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

Коэффициент ранговой корреляции Спирмана (Spearman’s Rank Order correlation) – мера связи между двумя ранжированными переменными.

cor.test(df[,2], df[,3], method='spearman')
## 
##  Spearman's rank correlation rho
## 
## data:  df[, 2] and df[, 3]
## S = 598970, p-value < 2.2e-16
## alternative hypothesis: true rho is not equal to 0
## sample estimates:
##       rho 
## 0.5507608

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

Тау Кэнделла (Kendall’s Tau) – также непараметрический показатель ранговой корреляции.

cor.test(df[,2], df[,3], method='kendall')
## 
##  Kendall's rank correlation tau
## 
## data:  df[, 2] and df[, 3]
## z = 8.1572, p-value = 3.43e-16
## alternative hypothesis: true tau is not equal to 0
## sample estimates:
##       tau 
## 0.3882896

Связь более двух переменных

В пакете psych есть функция corr.test(), которая позволяет вычислить коэффициенты корреляции Пирсона, Спирмена и Кэнделла между несколькими переменными и оценить их достоверность. Вычислим коэффициенты корреляции Пирсона между пунктами двух шкал опросника Big 5 (набор данных bfi из пакета psych).

corr.test(bfi[,c(1:10)], method='pearson')
## Call:corr.test(x = bfi[, c(1:10)], method = "pearson")
## Correlation matrix 
##       A1    A2    A3    A4    A5    C1    C2    C3    C4    C5
## A1  1.00 -0.34 -0.27 -0.15 -0.18  0.03  0.02 -0.02  0.13  0.05
## A2 -0.34  1.00  0.49  0.34  0.39  0.09  0.14  0.19 -0.15 -0.12
## A3 -0.27  0.49  1.00  0.36  0.50  0.10  0.14  0.13 -0.12 -0.16
## A4 -0.15  0.34  0.36  1.00  0.31  0.09  0.23  0.13 -0.15 -0.24
## A5 -0.18  0.39  0.50  0.31  1.00  0.12  0.11  0.13 -0.13 -0.17
## C1  0.03  0.09  0.10  0.09  0.12  1.00  0.43  0.31 -0.34 -0.25
## C2  0.02  0.14  0.14  0.23  0.11  0.43  1.00  0.36 -0.38 -0.30
## C3 -0.02  0.19  0.13  0.13  0.13  0.31  0.36  1.00 -0.34 -0.34
## C4  0.13 -0.15 -0.12 -0.15 -0.13 -0.34 -0.38 -0.34  1.00  0.48
## C5  0.05 -0.12 -0.16 -0.24 -0.17 -0.25 -0.30 -0.34  0.48  1.00
## Sample Size 
##      A1   A2   A3   A4   A5   C1   C2   C3   C4   C5
## A1 2784 2757 2759 2767 2769 2764 2761 2764 2759 2768
## A2 2757 2773 2751 2758 2757 2752 2752 2758 2752 2757
## A3 2759 2751 2774 2759 2758 2753 2754 2758 2753 2758
## A4 2767 2758 2759 2781 2765 2760 2763 2766 2762 2765
## A5 2769 2757 2758 2765 2784 2764 2760 2764 2758 2769
## C1 2764 2752 2753 2760 2764 2779 2755 2760 2753 2763
## C2 2761 2752 2754 2763 2760 2755 2776 2762 2756 2761
## C3 2764 2758 2758 2766 2764 2760 2762 2780 2758 2764
## C4 2759 2752 2753 2762 2758 2753 2756 2758 2774 2758
## C5 2768 2757 2758 2765 2769 2763 2761 2764 2758 2784
## Probability values (Entries above the diagonal are adjusted for multiple tests.) 
##      A1 A2 A3 A4 A5   C1   C2   C3 C4   C5
## A1 0.00  0  0  0  0 0.43 0.62 0.62  0 0.03
## A2 0.00  0  0  0  0 0.00 0.00 0.00  0 0.00
## A3 0.00  0  0  0  0 0.00 0.00 0.00  0 0.00
## A4 0.00  0  0  0  0 0.00 0.00 0.00  0 0.00
## A5 0.00  0  0  0  0 0.00 0.00 0.00  0 0.00
## C1 0.14  0  0  0  0 0.00 0.00 0.00  0 0.00
## C2 0.39  0  0  0  0 0.00 0.00 0.00  0 0.00
## C3 0.31  0  0  0  0 0.00 0.00 0.00  0 0.00
## C4 0.00  0  0  0  0 0.00 0.00 0.00  0 0.00
## C5 0.01  0  0  0  0 0.00 0.00 0.00  0 0.00
## 
##  To see confidence intervals of the correlations, print with the short=FALSE option

В таблице Correlation matrix представлены значения коэффициентов корреляции, в таблице Sample Size - количество наблюдений, по которым были рассчитаны конкретные коэффициенты (значения отличаются, т.к. по некоторым переменным есть пропуски), в таблице Probability values - значения p-value.

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

Коррелограмма

corrgram(bfi[,c(1:10)], order=TRUE, lower.panel=panel.shade, upper.panel=panel.pie, text.panel=panel.txt)

Также можно изобразить сразу несколько диаграмм рассеяния с помощью матрицы ###Матрица диаграмм рассеяния

scatterplotMatrix(~ A1+A2+A3+A4+A5, data=bfi, spread=FALSE, lty.smooth=2)

Больше визуализаций

corrplot(cor(mtcars[,c(1, 3, 4, 6)]), method="color", diag=FALSE)

corrplot(cor(mtcars[,c(1, 3, 4, 6)]), method="number", diag=FALSE)

Больше примеров

И здесь

Частные корреляции

Частная корреляция – это корреляция между двумя количественными переменными, зависящими, в свою очередь, от одной или более других количественных переменных. Для вычисления коэффициентов частной корреляции можно использовать функцию pcor() из пакета ggm.

pcor(c(1,5,2), cov(bfi[c(1:6)], use = "complete.obs"))
## [1] -0.05798187