Глава 5. Анализ связей: двумерные данные
5.4. Есть ли взаимосвязь, или Анализ корреляций
2 categories - 2 methods
kappa (Cohen) = 0.718855 , Z = 8.56608 , p = 0
kappa (Siegel) = 0.67419 , Z = 7.11279 , p = 5.68656e-13 kappa (2*PA-1) = 0.761658
(Мы загрузили пакет concord, потому что именно в нем находится нужная нам функция cohen.kappa().)
Каппа довольно близка к единице (0.718855), вероятность нулевой гипотезы — нулевая. Это значит, что результаты исследования можно считать согласными друг с другом.
Задача. В файле данныхprorostki.txtнаходятся результаты экс- перимента по проращиванию семян васильков, зараженных различны- ми грибами (колонкаCID, CID=0 — это контроль, то есть незараженные семена). Всего исследовали по 20 семян на каждый гриб, тестировали три гриба, итого с контролем — 80 семян. Отличается ли прорастание семян, зараженных грибами, от контроля? Ответ см. в конце главы.
5.4. Есть ли взаимосвязь, или Анализ
Очень слабо возбужденный человек (скажем, засыпающий) и очень сильно возбужденный (во время футбольного матча) будет решать за- дачи гораздо хуже, чем умеренно возбужденный человек. Поэтому, пе- ред тем как оценить взаимосвязь численно (вычислить коэффициент корреляции), нужно посмотреть на ее графическое выражение. Луч- ше всего здесь использовать диаграмму рассеяния, или коррелограмму (scatterplot) — именно она вызывается в R командой plot() с двумя аргументами-векторами.
Очень важно также, что всюду в этом разделе речь идет о наличии исиле взаимосвязи между переменными, а не охарактере этой взаимо- связи. Если мы нашли достоверную корреляцию между переменными А и Б, то это может значить, что:
• А зависит от Б;
• Б зависит от А;
• А и Б зависят друг от друга;
• А и Б зависят от какой-то третьей переменной В, а между собой не имеют ничего общего.
Например, хорошо известно, что объем продаж мороженого и чис- ло пожаров четко коррелируют. Странно было бы предположить, что поедание мороженого располагает людей к небрежному обращению с огнем или что созерцание пожаров возбуждает тягу к мороженому. Все гораздо проще — оба этих параметра зависят от температуры воздуха!
Для вычисления коэффициента корреляции вRиспользуется функ- цияcor():
> cor(5:15, 7:17) [1] 1
> cor(5:15, c(7:16, 23)) [1] 0.9375093
В простейшем случае ей передаются два аргумента (векторы одина- ковой длины). Кроме того, можно вызвать ее с одним аргументом, если это — матрица или таблица данных. В этом последнем случае функ- ция cor() вычисляет так называемую корреляционную матрицу, со- ставленную из коэффициентов корреляций между столбцами матрицы или набора данных, взятых попарно, например:
> cor(trees)
Girth Height Volume
Girth 1.0000000 0.5192801 0.9671194 Height 0.5192801 1.0000000 0.5982497 Volume 0.9671194 0.5982497 1.0000000
Если все данные присутствуют, то все просто, но что делать, когда есть пропущенные наблюдения? Для этого в команде cor есть пара- метр use. По умолчанию он равен all.obs, что при наличии хотя бы одного пропущенного наблюдения приводит к сообщению об ошибке.
Если use приравнять к значению complete.obs, то из данных авто- матически удаляются все наблюдения с пропусками. Может оказаться так, что пропуски раскиданы по исходному набору данных достаточно хаотично и их много, так что после построчного удаления от матрицы фактически ничего не остается. В таком случае поможет попарное уда- ление пропусков, то есть удаляются строчки с пропусками не из всей матрицы сразу, а только лишь из двух столбцов непосредственно перед вычислением коэффициента корреляции. Для этого опциюuseследует приравнять к значениюpairwise.complete.obs(надо иметь в виду, что в в этом коэффициенты корреляции вычисляются по разному количе- ству наблюдений и сравнивать их друг с другом может быть опасно).
Если данные непараметрические, нужно использовать ранговый ко- эффициент корреляции Спирмена (Spearman) ρ. Он менее подвержен влиянию случайных «выбросов» в данных, чем коэффициент Пирсона.
Для подсчета ρ достаточно приравнять параметр method к значению spearman:
> x <- rexp(50)
> cor(x, log(x), method="spearman") [1] 1
Если корреляционная матрица большая, то читать ее довольно труд- но. Поэтому существует несколько способов визуального представления таких матриц. Можно, например, использовать функциюsymnum(), ко- торая выведет матрицу в текстовом виде, но с заменой чисел на буквы в зависимости от того, какому диапазону принадлежало значение:
> symnum(cor(longley))
GNP. GNP U A P Y E GNP.deflator 1
GNP B 1
Unemployed , , 1
Armed.Forces . . 1 Population B B , . 1
Year B B , . B 1
Employed B B . . B B 1 attr(,"legend")
[1] 0 ‘ ’ 0.3 ‘.’ 0.6 ‘,’ 0.8 ‘+’ 0.9 ‘*’ 0.95 ‘B’ 1
Эта функция имеет большое количество разнообразных настроек, но по умолчанию они все выставлены в значения, оптимальные для отображения корреляционных матриц.
Второй способ — это графическое представление корреляционных коэффициентов. Идея проста: нужно разбить область от −1 до +1 на отдельные диапазоны, назначить каждому свой цвет, а затем все это отобразить. Для этого можно воспользоваться функциями image() и axis()(рис. 20):
> cor.l <- cor(longley)
> image(1:ncol(cor.l), 1:nrow(cor.l), cor.l,
+ col=heat.colors(22), axes=FALSE, xlab="", ylab="")
# Подписи к осям:
> axis(1, at=1:ncol(cor.l), labels=abbreviate(colnames(cor.l)))
> axis(2, at=1:nrow(cor.l), labels=abbreviate(rownames(cor.l)), + las = 2)
(Мы сократили здесь длинные названия строк и столбцов при по- мощи команды abbreviate().)
Полученный график часто называют «heatmap» («карта темпера- туры»).
Еще один интересный способ представления корреляционной мат- рицы предоставляется пакетомellipse. В этом случае значения коэф- фициентов корреляции рисуются в виде эллипсов. Чем ближе значение коэффициента корреляции к+1или−1— тем более вытянутым стано- вится эллипс. Наклон эллипса отражает знак. Для получения изобра- жения необходимо вызвать функциюplotcorr(рис. 21):
> library(ellipse)
> cor.l <- cor(longley)
> colnames(cor.l) <- abbreviate(colnames(cor.l))
> rownames(cor.l) <- abbreviate(rownames(cor.l))
> plotcorr(cor.l, type="lower", mar=c(0,0,0,0))
А как проверить статистическую значимость коэффициента корре- ляции? Это равносильно проверке статистической гипотезы о равенстве нулю коэффициента корреляции. Если гипотеза отвергается, то связь одного признака с другим считаетсязначимой. Для проверки такой ги- потезы используется функцияcor.test():
GNP. GNP Unmp Ar.F Pplt Year Empl GNP.
GNP Unmp Ar.F Pplt Year Empl
Рис. 20. Графическое представление корреляционной матрицы
> with(trees, cor.test(Girth, Height)) Pearson’s product-moment correlation data: Girth and Height
t = 3.2722, df = 29, p-value = 0.002758
alternative hypothesis: true correlation is not equal to 0 95 percent confidence interval:
0.2021327 0.7378538 sample estimates:
cor 0.5192801
Логика рассуждений здесь абсолютно такая же, как и в рассмотрен- ных выше тестах. В данном случае нам нужно принять альтернативную гипотезу о том, что корреляция действительно существует. Обратите внимание на доверительный интервал — тест показывает, что реальное значение корреляции может лежать в интервале 0.2–0.7.
GNP
Unmp
Ar.F
Pplt
Year
Empl
GNP. GNP Unmp Ar.F Pplt Year
Рис. 21. Коэффициенты корреляции в виде эллипсов