Mam zmienną nominalną (różne tematy konwersacji, zakodowane jako topic0 = 0 itd.) I kilka zmiennych skalowych (DV), takich jak długość konwersacji.
Jak mogę ustalić korelacje między zmiennymi nominalnymi i skalowanymi?
Mam zmienną nominalną (różne tematy konwersacji, zakodowane jako topic0 = 0 itd.) I kilka zmiennych skalowych (DV), takich jak długość konwersacji.
Jak mogę ustalić korelacje między zmiennymi nominalnymi i skalowanymi?
Odpowiedzi:
Tytuł tego pytania sugeruje podstawowe nieporozumienie. Najbardziej podstawową ideą korelacji jest „w miarę wzrostu jednej zmiennej, czy druga zmienna rośnie (korelacja dodatnia), maleje (korelacja ujemna) lub pozostaje taka sama (brak korelacji)” w skali takiej, że idealna korelacja dodatnia wynosi +1, brak korelacji wynosi 0, a idealna korelacja ujemna wynosi -1. Znaczenie „idealna” zależy od zastosowanej miary korelacji: dla korelacji Pearsona oznacza to, że punkty na wykresie rozrzutu leżą dokładnie na linii prostej (nachylone w górę dla +1 i w dół dla -1), dla korelacji Spearmana, że szeregi dokładnie się zgadzają (lub dokładnie się nie zgadzają, więc pierwszy jest łączony z ostatnim, dla -1), a dla tau Kendallaże wszystkie pary obserwacji mają zgodne szeregi (lub niezgodne dla -1). Intuicyjność tego, jak to działa w praktyce, można uzyskać na podstawie korelacji Pearsona dla następujących wykresów rozrzutu ( uznanie obrazu ):
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")
Co daje:
> 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
Używając „Plotki” jako poziomu odniesienia dla „Tematu” i definiując binarne zmienne zmienne dla „Sportu” i „Pogody”, możemy wykonać regresję wielokrotną.
> 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
Zauważ, że 0,825 nie jest korelacją między czasem trwania a tematem - nie możemy skorelować tych dwóch zmiennych, ponieważ temat jest nominalny. To, co faktycznie reprezentuje, to korelacja między obserwowanymi czasami trwania a przewidywanymi (dopasowanymi) przez nasz model. Obie te zmienne są numeryczne, więc jesteśmy w stanie je skorelować. W rzeczywistości dopasowane wartości są tylko średnimi czasami trwania dla każdej grupy:
> 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
Aby to sprawdzić, korelacja Pearsona między wartościami zaobserwowanymi i dopasowanymi wynosi:
> cor(data.df$duration, model.lm$fitted)
[1] 0.825137
Możemy to sobie wyobrazić na wykresie punktowym:
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")
Siła tego związku jest wizualnie bardzo podobna do tych z wykresów Kwartetu Anscombe, co nie jest zaskakujące, ponieważ wszyscy mieli korelacje Pearsona około 0,82.
Możesz być zaskoczony, że z kategoryczną zmienną niezależną wybrałem regresję (wielokrotną) zamiast ANOVA jednokierunkowej . Ale w rzeczywistości okazuje się to równoważnym podejściem.
library(heplots) # for eta
model.aov <- aov(duration ~ topic, data = data.df)
summary(model.aov)
To daje podsumowanie z identyczną statystyką F i wartością 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
Ponownie, model ANOVA pasuje do średnich grupy, podobnie jak regresja:
> 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
eta do kwadratu. Ponieważ ta ANOVA była jednokierunkowa (istniał tylko jeden predyktor kategoryczny), częściowe eta do kwadratu jest takie samo jak eta do kwadratu, ale rzeczy zmieniają się w modelach z większą liczbą predyktorów.
> etasq(model.aov, partial = TRUE)
Partial eta^2
topic 0.6808511
Residuals NA
Jest jednak całkiem możliwe, że ani „korelacja”, ani „wyjaśniona proporcja wariancji” nie jest miarą wielkości efektu, której chcesz użyć. Na przykład możesz skupić się bardziej na tym, jak różnią się środki między grupami. To pytanie i odpowiedź zawierają więcej informacji na temat kwadratu eta, kwadratu częściowego eta i różnych alternatyw.