library(tidyverse)
library(irr)
В зиловском диалекте андийского языка существует два класса для неодушевленных предметов. В 2017 году был проведен эксперимент, чтобы проверить, наличие вариативности в отнесению к тому или иному классу заимствованой и исконной лексики.
zilo_classes <- read_csv("https://goo.gl/miGq7Q")
head(zilo_classes)
s_id <int> | sex <chr> | age_2017 <int> | w_id <int> | stimulus <chr> | translation_en <chr> | translation_ru <chr> | stimulus_source <chr> | class <chr> |
---|---|---|---|---|---|---|---|---|
1 | f | 15 | 1 | milki | hous | дом | native | b |
1 | f | 15 | 2 | vaɡon | train wagon | вагон | loan | b |
1 | f | 15 | 3 | inɡur | window | окно | native | b |
1 | f | 15 | 4 | ʁats'a | grasshopper | кузнечик | native | b |
1 | f | 15 | 5 | iʃkapi | cabinet | шкаф | loan | b |
1 | f | 15 | 6 | haq'u | room | комната | native | r |
Переменные в датасете:
Данные взяты из исследования [Endresen, Janda 2015], посвященное исследованию маргинальных глаголов изменения состояния в русском языке. Испытуемые (70 школьников, 51 взрослый) оценивали по шкале Ликерта (1…5) приемлемость глаголов с приставками о- и у-:
marginal_verbs <- read_csv("https://goo.gl/6Phok3")
head(marginal_verbs)
Gender <chr> | Age <int> | AgeGroup <chr> | Education <chr> | City <chr> | SubjectCode <chr> | Score <chr> | GivenScore <int> | Stimulus <chr> | Prefix <chr> | |
---|---|---|---|---|---|---|---|---|---|---|
female | 16 | child | school | Izhevsk | AA | A | 5 | utochnit | u | |
female | 16 | child | school | Izhevsk | AA | A | 5 | ozhestochit | o | |
female | 16 | child | school | Izhevsk | AA | E | 1 | ovneshnit | o | |
female | 16 | child | school | Izhevsk | AA | E | 1 | oblusit | o | |
female | 16 | child | school | Izhevsk | AA | A | 5 | osvezhit | o | |
female | 16 | child | school | Izhevsk | AA | A | 5 | oschastlivit | o |
Переменные в датасете:
В данном датасете я собрал информацию о количестве слогов в переводах 57 сонета У. Шекспира и в самом сонете.
sonet <- read.csv("https://goo.gl/cqPDkq")
head(sonet)
line <int> | А.Велигжанин <int> | А.Кузнецов <int> | А.Финкель <int> | А.Шаракшанэ <int> | В.Брюсов <int> | В.Микушевича <int> | И.Фрадкин <int> | М.Чайковский <int> | ||
---|---|---|---|---|---|---|---|---|---|---|
1 | 1 | 10 | 9 | 9 | 10 | 10 | 11 | 10 | 10 | |
2 | 2 | 9 | 10 | 11 | 11 | 11 | 10 | 10 | 11 | |
3 | 3 | 10 | 9 | 10 | 10 | 10 | 9 | 9 | 10 | |
4 | 4 | 9 | 10 | 11 | 11 | 10 | 10 | 10 | 11 | |
5 | 5 | 10 | 10 | 9 | 10 | 10 | 10 | 10 | 10 | |
6 | 6 | 11 | 10 | 10 | 10 | 11 | 10 | 11 | 11 |
Все функции пакета 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)
stimulus <chr> | translation_ru <chr> | stimulus_source <chr> | 1 <chr> | 2 <chr> | 3 <chr> | 4 <chr> | 5 <chr> | 6 <chr> | 7 <chr> | |
---|---|---|---|---|---|---|---|---|---|---|
ala | крышка | native | r | r | r | r | r | r | r | |
ʁan | лепешка | native | b | b | b | b | b | b | b | |
antena | антенна | loan | r | b | r | r | r | b | r | |
anzi | снег | native | r | r | r | r | r | r | r | |
aptsʲeka | аптека | loan | b | b | b | b | b | b | b | |
arkom | ложка | native | b | b | b | b | b | b | b |
Процент полного согласия — это процент случаев, когда все оценщики идентичны в своих суждениях.
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 категориям.
κ=po−pe1−pe,
где po — доля полного согласия, а pe — вероятность случайного согласия.
Для случая s = 2, можно нарисовать следующую таблицу сопряженности:
s1 | s2 | |
---|---|---|
s1 | a | b |
s2 | 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] предложена следующая интерпретация каппы Коэна:
Каппа Коэна — не единственная мера согласия между двумя оценщиками. Существуют работы, в которых каппу Коэна ругают.
Существует несколько τ-мер (τ-a, τ-b, τ-c), это формула для τ-a:
τ=2×C−Dn×(n−1)
ranker_1 <int> | ranker_2 <dbl> | C <dbl> | D <dbl> | |
---|---|---|---|---|
1 | 2 | 10 | 1 | |
2 | 1 | 10 | 0 | |
3 | 4 | 8 | 1 | |
4 | 3 | 8 | 0 | |
5 | 6 | 6 | 1 | |
6 | 5 | 6 | 0 | |
7 | 8 | 4 | 1 | |
8 | 7 | 4 | 0 | |
9 | 10 | 2 | 1 | |
10 | 9 | 2 | 0 |
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"))
А.Велигжанин <dbl> | А.Кузнецов <dbl> | А.Финкель <dbl> | А.Шаракшанэ <dbl> | В.Брюсов <dbl> | В.Микушевича <dbl> | И.Фрадкин <dbl> | М.Чайковский <dbl> | ||
---|---|---|---|---|---|---|---|---|---|
А.Велигжанин | 1.00000000 | 0.06686508 | -0.01666898 | -0.27436474 | 0.11088319 | 0.0000000 | 0.46614748 | -0.07316393 | |
А.Кузнецов | 0.06686508 | 1.00000000 | 0.13597788 | -0.09947295 | 0.10050378 | 0.0000000 | 0.34126046 | 0.52223297 | |
А.Финкель | -0.01666898 | 0.13597788 | 1.00000000 | 0.44636198 | 0.33824071 | -0.2083023 | 0.30991160 | 0.27897624 | |
А.Шаракшанэ | -0.27436474 | -0.09947295 | 0.44636198 | 1.00000000 | 0.16495722 | 0.0000000 | -0.06001200 | -0.10204082 | |
В.Брюсов | 0.11088319 | 0.10050378 | 0.33824071 | 0.16495722 | 1.00000000 | 0.0000000 | 0.14147911 | 0.28867513 | |
В.Микушевича | 0.00000000 | 0.00000000 | -0.20830226 | 0.00000000 | 0.00000000 | 1.0000000 | 0.28005602 | 0.00000000 | |
И.Фрадкин | 0.46614748 | 0.34126046 | 0.30991160 | -0.06001200 | 0.14147911 | 0.2800560 | 1.00000000 | 0.34006802 | |
М.Чайковский | -0.07316393 | 0.52223297 | 0.27897624 | -0.10204082 | 0.28867513 | 0.0000000 | 0.34006802 | 1.00000000 | |
Н.Гербель | 0.37704918 | -0.17830688 | 0.40005557 | 0.14632786 | -0.07392213 | 0.0000000 | 0.46614748 | -0.10974590 | |
Р..Бадыгов | 0.26380827 | 0.19129124 | 0.71531289 | 0.29434407 | 0.45600466 | 0.0000000 | 0.50009248 | 0.56906519 |
Бывает еще ρ Спирмана (cor(..., method = "spearman")
), γ Гудмана и Крускала и, наверное, еще много других мер.
Не забывайте также про функцию cor.test()
.
Обощением каппы Коэна для оценщиков больше двух является каппа Фляйса. k оценщиков распеделяют n наблюдений по s категориям.
κ=ˉPo−ˉPe1−ˉPe,
где ˉPo — средняя доля пар согласных оценщиков из всех пар, а ˉPe — вероятность случайного согласия.
zilo_classes_short[,-c(1:3)]
1 <chr> | 2 <chr> | 3 <chr> | 4 <chr> | 5 <chr> | 6 <chr> | 7 <chr> | 8 <chr> | 9 <chr> | 10 <chr> | |
---|---|---|---|---|---|---|---|---|---|---|
r | r | r | r | r | r | r | r | r | r | |
b | b | b | b | b | b | b | b | b | b | |
r | b | r | r | r | b | r | b | r | r | |
r | r | r | r | r | r | r | r | r | r | |
b | b | b | b | b | b | b | b | b | b | |
b | b | b | b | b | b | b | b | b | b | |
b | b | b | b | b | b | b | b | b | b | |
r | r | r | r | r | r | r | r | r | r | |
b | b | b | b | b | b | b | b | b | b | |
b | b | b | b | b | b | b | b | b | b |
В нашем датасете 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))
w_id <int> | b <dbl> | r <dbl> | P_i <dbl> | |
---|---|---|---|---|
1 | 16 | 0 | 1.0000000 | |
2 | 9 | 7 | 0.4750000 | |
3 | 15 | 1 | 0.8750000 | |
4 | 16 | 0 | 1.0000000 | |
5 | 16 | 0 | 1.0000000 | |
6 | 0 | 16 | 1.0000000 | |
7 | 0 | 16 | 1.0000000 | |
8 | 16 | 0 | 1.0000000 | |
9 | 16 | 0 | 1.0000000 | |
10 | 16 | 0 | 1.0000000 |
Возьмем среднее этой меры:
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))
class <chr> | n <int> | freq <dbl> | ||
---|---|---|---|---|
b | 918 | 0.5412736 | ||
r | 778 | 0.4587264 |
Возведем их в квадрат и сложим:
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()
.