У меня есть номинальная переменная (разные темы разговора, закодированные как topic0 = 0 и т. Д.) И ряд масштабных переменных (DV), таких как продолжительность разговора.
Как я могу получить корреляции между номинальными и масштабными переменными?
У меня есть номинальная переменная (разные темы разговора, закодированные как topic0 = 0 и т. Д.) И ряд масштабных переменных (DV), таких как продолжительность разговора.
Как я могу получить корреляции между номинальными и масштабными переменными?
Ответы:
Название этого вопроса предполагает фундаментальное недоразумение. Самая основная идея корреляции заключается в том, что «когда одна переменная увеличивается, увеличивается ли другая переменная (положительная корреляция), уменьшается (отрицательная корреляция) или остается такой же (без корреляции)» с такой шкалой, что идеальная положительная корреляция равна +1, нет корреляции 0, а идеальная отрицательная корреляция равна -1. Значение «идеально» зависит от того, какая мера корреляции используется: для корреляции Пирсона это означает, что точки на графике рассеяния лежат прямо на прямой линии (наклон вверх для +1 и вниз для -1), для корреляции Спирмена, что ранги точно совпадают (или совершенно не согласны, поэтому сначала в паре с последним, для -1), и для тау Кендаллачто все пары наблюдений имеют согласованные ранги (или дискордантные для -1). Интуицию о том, как это работает на практике, можно почерпнуть из корреляций Пирсона для следующих диаграмм рассеяния ( изображение предоставлено ):
data.df <- data.frame(
topic = c(rep(c("Gossip", "Sports", "Weather"), each = 4)),
duration = c(6:9, 2:5, 4:7)
)
print(data.df)
boxplot(duration ~ topic, data = data.df, ylab = "Duration of conversation")
Который дает:
> print(data.df)
topic duration
1 Gossip 6
2 Gossip 7
3 Gossip 8
4 Gossip 9
5 Sports 2
6 Sports 3
7 Sports 4
8 Sports 5
9 Weather 4
10 Weather 5
11 Weather 6
12 Weather 7
Используя «Сплетни» в качестве контрольного уровня для «Темы» и определяя двоичные фиктивные переменные для «Спорт» и «Погода», мы можем выполнить множественную регрессию.
> model.lm <- lm(duration ~ topic, data = data.df)
> summary(model.lm)
Call:
lm(formula = duration ~ topic, data = data.df)
Residuals:
Min 1Q Median 3Q Max
-1.50 -0.75 0.00 0.75 1.50
Coefficients:
Estimate Std. Error t value Pr(>|t|)
(Intercept) 7.5000 0.6455 11.619 1.01e-06 ***
topicSports -4.0000 0.9129 -4.382 0.00177 **
topicWeather -2.0000 0.9129 -2.191 0.05617 .
---
Signif. codes: 0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1
Residual standard error: 1.291 on 9 degrees of freedom
Multiple R-squared: 0.6809, Adjusted R-squared: 0.6099
F-statistic: 9.6 on 2 and 9 DF, p-value: 0.005861
> rsq <- summary(model.lm)$r.squared
> rsq
[1] 0.6808511
> sqrt(rsq)
[1] 0.825137
Обратите внимание, что 0.825 не является корреляцией между Длительностью и Темой - мы не можем соотнести эти две переменные, потому что Тема является номинальной. То, что он фактически представляет, является корреляцией между наблюдаемыми длительностями и теми, которые предсказаны (установлены) нашей моделью. Обе эти переменные являются числовыми, поэтому мы можем соотнести их. Фактически подобранные значения - это просто средние значения продолжительности для каждой группы:
> print(model.lm$fitted)
1 2 3 4 5 6 7 8 9 10 11 12
7.5 7.5 7.5 7.5 3.5 3.5 3.5 3.5 5.5 5.5 5.5 5.5
Просто чтобы проверить, корреляция Пирсона между наблюдаемыми и подобранными значениями:
> cor(data.df$duration, model.lm$fitted)
[1] 0.825137
Мы можем представить это на графике рассеяния:
plot(x = model.lm$fitted, y = data.df$duration,
xlab = "Fitted duration", ylab = "Observed duration")
abline(lm(data.df$duration ~ model.lm$fitted), col="red")
Сила этих отношений визуально очень похожа на те, что были на сюжетах Квартета Анскомба, что неудивительно, поскольку все они имели корреляции Пирсона около 0,82.
Вы можете быть удивлены тем, что с категориальной независимой переменной я решил сделать (множественную) регрессию, а не одностороннюю ANOVA . Но на самом деле это оказывается эквивалентным подходом.
library(heplots) # for eta
model.aov <- aov(duration ~ topic, data = data.df)
summary(model.aov)
Это дает сводку с идентичными F-статистикой и p- значением:
Df Sum Sq Mean Sq F value Pr(>F)
topic 2 32 16.000 9.6 0.00586 **
Residuals 9 15 1.667
---
Signif. codes: 0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1
Опять же, модель ANOVA соответствует групповым средствам, как регрессия:
> print(model.aov$fitted)
1 2 3 4 5 6 7 8 9 10 11 12
7.5 7.5 7.5 7.5 3.5 3.5 3.5 3.5 5.5 5.5 5.5 5.5
> etasq(model.aov, partial = FALSE)
eta^2
topic 0.6808511
Residuals NA
Эта квадрат. Поскольку этот ANOVA был односторонним (был только один категориальный предиктор), частичный квадрат Eta такой же, как Eta Square, но в моделях с большим количеством предикторов все меняется.
> etasq(model.aov, partial = TRUE)
Partial eta^2
topic 0.6808511
Residuals NA
Однако вполне возможно, что ни «корреляция», ни «объясненная пропорция дисперсии» не является мерой величины эффекта, которую вы хотите использовать. Например, вы можете сосредоточиться больше на том, как средства отличаются между группами. Этот вопрос и ответ содержат больше информации о квадрате Ета, частичном квадрате Ета и различных альтернативах.