library(tidyverse)
library(irr)В зиловском диалекте андийского языка существует два класса для неодушевленных предметов. В 2017 году был проведен эксперимент, чтобы проверить, наличие вариативности в отнесению к тому или иному классу заимствованой и исконной лексики.
zilo_classes <- read_csv("https://goo.gl/miGq7Q")
head(zilo_classes)Переменные в датасете:
Данные взяты из исследования [Endresen, Janda 2015], посвященное исследованию маргинальных глаголов изменения состояния в русском языке. Испытуемые (70 школьников, 51 взрослый) оценивали по шкале Ликерта (1…5) приемлемость глаголов с приставками о- и у-:
marginal_verbs <- read_csv("https://goo.gl/6Phok3")
head(marginal_verbs)Переменные в датасете:
В данном датасете я собрал информацию о количестве слогов в переводах 57 сонета У. Шекспира и в самом сонете.
sonet <- read.csv("https://goo.gl/cqPDkq")
head(sonet)Все функции пакета irr не настроены на формат tidy data, и требует следующего формата:
zilo_classes %>%
select(s_id, stimulus, translation_ru, stimulus_source, class) %>%
spread(key = s_id, value = class) ->
zilo_classes_short
head(zilo_classes_short)Процент полного согласия — это процент случаев, когда все оценщики идентичны в своих суждениях.
agree(zilo_classes_short[,-c(1:3)])## Percentage agreement (Tolerance=0)
##
## Subjects = 106
## Raters = 16
## %-agree = 74.5
round(74.5*106/100) # количество случаев полного согласия## [1] 79
Эту меру иногда ошибочно приводят как меру согласия оценщиков, однако она не учитывает возможность случайного совпадения / расхождения суждений.
Каппа Коэна мера согласованности между двумя категориальными переменными. Обычно говорят о двух оценщиках, которые распеделяют \(n\) наблюдений по \(s\) категориям.
\(\kappa = \frac{p_o-p_e}{1-p_e},\)
где \(p_o\) — доля полного согласия, а \(p_e\) — вероятность случайного согласия.
Для случая \(s\) = 2, можно нарисовать следующую таблицу сопряженности:
| \(s_1\) | \(s_2\) | |
|---|---|---|
| \(s_1\) | a | b |
| \(s_2\) | c | d |
В таком случае:
Выберем двух спикиров из наших данных:
zilo_classes_2s <- zilo_classes_short[,c(4, 14)]
agree(zilo_classes_2s)## Percentage agreement (Tolerance=0)
##
## Subjects = 106
## Raters = 2
## %-agree = 87.7
table(zilo_classes_2s)## 11
## 1 b r
## b 47 9
## r 4 46
p_o <- (47+46)/(47+46+4+9)
p_o## [1] 0.8773585
p_e <- ((47+9)*(47+4)+(46+9)*(46+4))/(47+9+4+46)^2
p_e## [1] 0.498932
coehns_kappa <- (p_o - p_e)/(1 - p_e)
coehns_kappa## [1] 0.7552398
kappa2(zilo_classes_2s)## Cohen's Kappa for 2 Raters (Weights: unweighted)
##
## Subjects = 106
## Raters = 2
## Kappa = 0.755
##
## z = 7.81
## p-value = 5.77e-15
Функция kappa2 из пакета irr также приводит p-value, которое высчитывается для нулевой гипотезы, что каппа Коэна равна нулю.
Если вы хотите, чтобы ваши оценщики не оценивались как равноценные, вы можете использовать взвешенную каппу Коэна.
В [Landis, Koch 1977] предложена следующая интерпретация каппы Коэна:
Каппа Коэна — не единственная мера согласия между двумя оценщиками. Существуют работы, в которых каппу Коэна ругают.
Существует несколько \(\tau\)-мер (\(\tau\)-a, \(\tau\)-b, \(\tau\)-c), это формула для \(\tau\)-a:
\[\tau = 2\times \frac{C-D}{n\times(n-1)}\]
C <- c(10, 10, 8, 8, 6, 6, 4, 4, 2, 2, 0, 0)
D <- c(1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0)
n <- 12
2*sum(C-D)/(n*(n-1))## [1] 0.8181818
ranker_1 = 1:12
ranker_2 = c(2, 1, 4, 3, 6, 5, 8, 7, 10, 9, 12, 11)
cor(ranker_1, ranker_2, method = "kendall")## [1] 0.8181818
data.frame(cor(sonet[, -1], method = "kendall"))Бывает еще \(\rho\) Спирмана (cor(..., method = "spearman")), \(\gamma\) Гудмана и Крускала и, наверное, еще много других мер.
Не забывайте также про функцию cor.test().
Обощением каппы Коэна для оценщиков больше двух является каппа Фляйса. \(k\) оценщиков распеделяют \(n\) наблюдений по \(s\) категориям.
\(\kappa = \frac{\bar{P}_o-\bar{P}_e}{1-\bar{P}_e},\)
где \(\bar{P}_o\) — средняя доля пар согласных оценщиков из всех пар, а \(\bar{P}_e\) — вероятность случайного согласия.
zilo_classes_short[,-c(1:3)]В нашем датасете \(k\) = 16, \(n\) = 106, \(s\) = 2.
Посчитаем, насколько оценщики согласны относительно третьего слова (3 b, 13 r). Для этого посчитаем долю пар оценщиков, которые согласны, среди всех возможных пар:
P_3 <- (choose(13, 2) + choose(3, 2))/ choose(16, 2)Посчитаем это значение для каждого слова:
zilo_classes %>%
count(w_id, class) %>%
spread(key = class, value = n, fill = 0) %>%
mutate(P_i = (choose(b, 2) + choose(r, 2))/ choose(16, 2))Возьмем среднее этой меры:
zilo_classes %>%
count(w_id, class) %>%
spread(key = class, value = n, fill = 0) %>%
mutate(P_i = (choose(b, 2) + choose(r, 2))/ choose(16, 2)) %>%
summarise(P_o = mean(P_i)) %>%
unlist ->
P_o
P_o## P_o
## 0.925
Для того, чтобы посчитать вероятность случайного согласия, найдем доли:
zilo_classes %>%
group_by(class) %>%
summarise(n = n()) %>%
mutate(freq = n / sum(n))Возведем их в квадрат и сложим:
zilo_classes %>%
group_by(class) %>%
summarise(n = n()) %>%
mutate(freq_2 = (n / sum(n))^2) %>%
summarise(P_e = sum(freq_2)) %>%
unlist ->
P_e
P_e## P_e
## 0.503407
Fleiss_kappa <- (P_o-P_e)/(1-P_e)
Fleiss_kappa <- unname(Fleiss_kappa)
Fleiss_kappa## [1] 0.8489709
kappam.fleiss(zilo_classes_short[,-c(1:3)])## Fleiss' Kappa for m Raters
##
## Subjects = 106
## Raters = 16
## Kappa = 0.849
##
## z = 95.7
## p-value = 0
В работе (Shrout, Fleiss, 1979) различают три ситуации:
- One-way random effects model — each target is rated by a different set of \(k\) judges, randomly selected froma a larger population of judges.
- Two-way random effects model — a random sample of \(k\) judges is selected from a larger population, and each judge rated each target that is, each judge rates \(n\) targets alltogether.
- Two-way mixed model — each target is rated by each of the same \(k\) judges, who are the only judges of interest.
icc(sonet[,-1], model = "twoway", type = "agreement")## Single Score Intraclass Correlation
##
## Model: twoway
## Type : agreement
##
## Subjects = 14
## Raters = 14
## ICC(A,1) = 0.0866
##
## F-Test, H0: r0 = 0 ; H1: r0 > 0
## F(13,74.1) = 3.62 , p = 0.000204
##
## 95%-Confidence Interval for ICC Population Values:
## 0.026 < ICC < 0.241
Домашнее задание нужно выполнять в отдельном rmarkdown файле, скачав данные из своей папки в репозитории курса. Получившиеся файлы следует помещать в соответствующую папку в своем репозитории на гитхабе. Более подробные инструкции см. на этой странице.
Скачайте датасет hw1_1_zilo_class.csv (см. описание выше). Получите тиббл содержащий два столбца: stimulus_source и количество уникальных слов в датасете (n).
Преобразуйте датасет hw1_1_zilo_class.csv. Посчитайте процент полного согласия всех спикеров.
Из преобразованным датасета hw1_1_zilo_class.csv выберите спикеров с номером 7 и 11 и посчитайте для них каппу Коэна.
Посчитайте каппу Фляйса для всех спикеров преобразованного датасета hw1_1_zilo_class.csv.
Представим, что Вы пишите статью, напишите короткий абзац, который бы обобщал результаты, полученные в предыдущих заданиях.
Скачайте датасет hw1_2_verbs.csv (см. описание выше). Посчитайте количество участников в датасете (в ответ выведите тибл с переменной n).
Посчитайте среднюю оценку глаголов разного типа для каждого пола в датасете (в ответ выведите тибл с переменными WordType, Gender и mean).
Преобразуйте датасет в короткий формат и удалите строки, в которых есть пропущенные значения (у меня вышел тибл 59 x 124). Посчитайте процент полного согласия.
Посчитайте каппу Фляйса для преобразованного датасета.
Посчитайте ICC для преобразованного датасета.
Создайте тибл, содержащий минимальное (min) и максимальное (max) значение попарной корреляции Кендала ответов всех участников эксперимента со словами (т. е. корреляция ответов АА и AB, AA и AC и т. д.). В преобразовании матрицы, пораждаемой функцией cor() мне очень помогла функция as.table().
