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