тест Хи-квадрат

Олеся Волченко

30 сентября 2020

Что мы уже умеем?

Немного картинок: раз

Немного картинок: два

Тест хи-квадрат

Позволяет находить связи

Таблица сопряженности

Таблица сопряжённости — средство представления совместного распределения двух переменных, предназначенное для исследования связи между ними.

Например:

мужчины женщины всего:
предпочитают кошек 50 50 100
предпочитают собак 50 50 100
всего: 100 100 200

Ожидаемые и наблюдаемые значения

Предположим, мы собрали вот такие данные:

ходили на выборы не ходили на выборы всего:
любят лопать пузырчатую упаковку 80 20 100
не любят лопать пузырчатую упаковку 20 80 100
всего: 100 100 200

Но если бы распределение двух переменных было несвязано, то таблица выглядела бы так:

ходили на выборы не ходили на выборы всего:
любят лопать пузырчатую упаковку 50 50 100
не любят лопать пузырчатую упаковку 50 50 100
всего: 100 100 200

Как рассчитать ожидаемые значения?

выборы + выборы - всего:
пузырчатая упаковка + (A+B)(A+C)/(A+B+C+D) (A+B)(B+D)/(A+B+C+D) A + B
пузырчатая упаковка - (C+D)(A+C)/(A+B+C+D) (C+D)(B+D)/(A+B+C+D) C + D
всего: A + C B + D A+B+C+D

То есть, для каждой ячейки мы перемножаем маргинальные значения и делим это число на общее число наблюдений

Внимание! Тут возможно получить “полтора землекопа”

В нашем случае:

выборы + выборы -
пузырчатая упаковка + 100 * 100 / 200 = 50 100 * 100 / 200 = 50
пузырчатая упаковка - 100 * 100 / 200 = 50 100 * 100 / 200 = 50

Формула

\[\chi^2 = \sum_{i=1}^{n} \frac{ (O~i - E~i)^2}{E~i}\] O - observed. Те значения, которые мы видим в таблице сопряженности

Е - expected. Те значения, которые мы бы наблюдали, если бы 2 переменные были распределены независимо друг от друга.

Разница между наблюдаемыми и ожидаемыми значениями называется остатками (residuals).

В нашем случае:

(80 - 50)^2 / 50 + (80 - 50)^2 / 50 +  (20 - 50)^2 / 50  + (20 - 50)^2 / 50 
## [1] 72

Получили значение хи-квадрата. А дальше что?

Определяем число степеней свободы (r – 1) × (c – 1)

Сравниваем значение критерия χ2 с критическим значением при числе степеней свободы f (по таблице).

Анализ остатков

Если \(\chi^2\) превышает критическое значение (p-value меньше 0.05) нужно узнать, за счёт каких ячеек это происходит.

Для этого нужно посмотреть на стандартизованные остатки: если значение больше 2, то в этой ячейке наблюдений больше, чем ожидалось в случае, если две переменные не связаны между собой. Если значение стандартизованных остатков меньше -2, то в этой ячейке наблюдений меньше, чем ожидалось в случае, если две переменные не связаны между собой.

Хи квадрат: короткое обобщение

Допущения Хи квадрата

Рекомендации для таблицы 2х2 (Cochran (1952, 1954))

Работа с готовой таблицей

mytable <- matrix(c(1272, 797, 781, 693, 461, 894, 748, 731, 433, 392, 136, 169, 117, 169, 87, 176, 163, 146, 151, 126), ncol = 2)
row.names(mytable) <- c("Valeriy_Meladze", "Max_Korzh", "Bi_2", "Monetochka", "Skriptonit", "Little_Big", "Oxxxymiron", "Zemfira", "LSP", "Tima_Beloruskih")
colnames(mytable) <- c("student_votes", "liceist_votes")

chisq.test(mytable)
## 
##  Pearson's Chi-squared test
## 
## data:  mytable
## X-squared = 122.85, df = 9, p-value < 2.2e-16

Что внутри?

mychisq <- chisq.test(mytable)
str(mychisq)
## List of 9
##  $ statistic: Named num 123
##   ..- attr(*, "names")= chr "X-squared"
##  $ parameter: Named int 9
##   ..- attr(*, "names")= chr "df"
##  $ p.value  : num 3.49e-22
##  $ method   : chr "Pearson's Chi-squared test"
##  $ data.name: chr "mytable"
##  $ observed : num [1:10, 1:2] 1272 797 781 693 461 ...
##   ..- attr(*, "dimnames")=List of 2
##   .. ..$ : chr [1:10] "Valeriy_Meladze" "Max_Korzh" "Bi_2" "Monetochka" ...
##   .. ..$ : chr [1:2] "student_votes" "liceist_votes"
##  $ expected : num [1:10, 1:2] 1173 805 748 718 457 ...
##   ..- attr(*, "dimnames")=List of 2
##   .. ..$ : chr [1:10] "Valeriy_Meladze" "Max_Korzh" "Bi_2" "Monetochka" ...
##   .. ..$ : chr [1:2] "student_votes" "liceist_votes"
##  $ residuals: num [1:10, 1:2] 2.879 -0.283 1.193 -0.946 0.202 ...
##   ..- attr(*, "dimnames")=List of 2
##   .. ..$ : chr [1:10] "Valeriy_Meladze" "Max_Korzh" "Bi_2" "Monetochka" ...
##   .. ..$ : chr [1:2] "student_votes" "liceist_votes"
##  $ stdres   : num [1:10, 1:2] 7.708 -0.736 3.087 -2.444 0.511 ...
##   ..- attr(*, "dimnames")=List of 2
##   .. ..$ : chr [1:10] "Valeriy_Meladze" "Max_Korzh" "Bi_2" "Monetochka" ...
##   .. ..$ : chr [1:2] "student_votes" "liceist_votes"
##  - attr(*, "class")= chr "htest"

Что внутри?

mychisq$observed
##                 student_votes liceist_votes
## Valeriy_Meladze          1272           136
## Max_Korzh                 797           169
## Bi_2                      781           117
## Monetochka                693           169
## Skriptonit                461            87
## Little_Big                894           176
## Oxxxymiron                748           163
## Zemfira                   731           146
## LSP                       433           151
## Tima_Beloruskih           392           126
mychisq$expected
##                 student_votes liceist_votes
## Valeriy_Meladze     1173.3876     234.61236
## Max_Korzh            805.0373     160.96274
## Bi_2                 748.3680     149.63203
## Monetochka           718.3666     143.63342
## Skriptonit           456.6878      91.31220
## Little_Big           891.7079     178.29206
## Oxxxymiron           759.2018     151.79819
## Zemfira              730.8672     146.13284
## LSP                  486.6892      97.31081
## Tima_Beloruskih      431.6866      86.31335

Что внутри?

mychisq$residuals
##                 student_votes liceist_votes
## Valeriy_Meladze   2.878794007   -6.43807308
## Max_Korzh        -0.283269634    0.63349812
## Bi_2              1.192851801   -2.66766815
## Monetochka       -0.946430851    2.11657763
## Skriptonit        0.201784968   -0.45126757
## Little_Big        0.076756480   -0.17165654
## Oxxxymiron       -0.406545724    0.90919012
## Zemfira           0.004913697   -0.01098889
## LSP              -2.433666251    5.44259893
## Tima_Beloruskih  -1.910117558    4.27174588
mychisq$stdres
##                 student_votes liceist_votes
## Valeriy_Meladze    7.70822448   -7.70822448
## Max_Korzh         -0.73631823    0.73631823
## Bi_2               3.08700146   -3.08700146
## Monetochka        -2.44361120    2.44361120
## Skriptonit         0.51078746   -0.51078746
## Little_Big         0.20088280   -0.20088280
## Oxxxymiron        -1.05299080    1.05299080
## Zemfira            0.01269903   -0.01269903
## LSP               -6.17419588    6.17419588
## Tima_Beloruskih   -4.82623156    4.82623156

Работа с данными

library(foreign)
data <- read.spss("/Users/olesyavolchenko/Yandex.Disk.localized/datafiles/WV6_Data_spss_v_2016_01_01.sav", to.data.frame = TRUE)
data <- subset(data, subset=(V2=="Russia"))
dim(data)
## [1] 2500  430

Связаны ли пол и гендерные установки

Шаг 1. Проверяем, все ли хорошо с переменными V53.- On the whole, men make better business executives than women do

table(data$V53) 
## 
##    Agree strongly             Agree          Disagree Strongly disagree 
##               376               821               895               225
table(data$V240)
## 
##   Male Female 
##   1115   1385

Пол и гендерные установки

Шаг 2. Хи квадрат

chisq.test(data$V53, data$V240) 
## 
##  Pearson's Chi-squared test
## 
## data:  data$V53 and data$V240
## X-squared = 71.715, df = 3, p-value = 1.833e-15
table(data$V53, data$V240)
##                    
##                     Male Female
##   Agree strongly     217    159
##   Agree              409    412
##   Disagree           346    549
##   Strongly disagree   64    161

Пол и гендерные установки

Шаг 3. Значение остатков

mychisq <- chisq.test(data$V53, data$V240) 
mychisq$observed
##                    data$V240
## data$V53            Male Female
##   Agree strongly     217    159
##   Agree              409    412
##   Disagree           346    549
##   Strongly disagree   64    161
mychisq$expected
##                    data$V240
## data$V53                Male   Female
##   Agree strongly    168.1208 207.8792
##   Agree             367.0937 453.9063
##   Disagree          400.1813 494.8187
##   Strongly disagree 100.6042 124.3958

Пол и гендерные установки

Шаг 3. Значение остатков

mychisq$residuals
##                    data$V240
## data$V53                 Male    Female
##   Agree strongly     3.769753 -3.390145
##   Agree              2.187214 -1.966965
##   Disagree          -2.708450  2.435713
##   Strongly disagree -3.649414  3.281924
mychisq$stdres
##                    data$V240
## data$V53                 Male    Female
##   Agree strongly     5.539258 -5.539258
##   Agree              3.660808 -3.660808
##   Disagree          -4.649674  4.649674
##   Strongly disagree -5.165279  5.165279

Как представить результаты

Например, X2 (2, N = 170) = 14.14, p <.01

Визуализация: вариант 1

Показать разницу распределений в группах

library(sjPlot)
plot_xtab(data$V53, data$V240)

plot_xtab(data$V240, data$V53)

plot_xtab(data$V240, data$V53, show.total = FALSE) # Если хочется убрать total

Визуализация: вариант 2

Гистограмма с накоплением позволяет показать разницу раcпределений в группах

plot_xtab(data$V53, data$V240, bar.pos = "stack", show.total = FALSE)

plot(data$V240, data$V53)

Визуализация: вариант 3

Гистограмма с накоплением позволяет показать разницу раcпределений в группах

plot_xtab(data$V240, data$V53, 
         margin = "row",
         bar.pos = "stack")

plot_xtab(data$V53, data$V240, 
         margin = "row",
         bar.pos = "stack", show.total = FALSE)

mosaic plot. Если хочется чего-то более экзотичного

library(vcd)
mosaic(mytable)

mosaic plot

mosaic(mychisq$observed, shade=TRUE, legend=TRUE)

Визуализировать остатки

library(corrplot)
corrplot(mychisq$residuals, is.cor=FALSE)

Визуализировать остатки

corrplot(mychisq$residuals, is.cor=FALSE, method="square")

Дополнительное полезное чтение

https://r-analytics.blogspot.com/2012/08/blog-post.html#.W66bd2gzY2w