Processing math: 100%
  • 1. Введение
    • 1.1 Библиотеки
    • 1.2 Данные: зиловский эксперимент
    • 1.3 Данные: исследование маргинальных русских глаголов
    • 1.4 Данные: переводы 57 сонета У. Шекспира
  • 2. Преобразования данных
  • 3. Процент полного согласия
  • 4. Каппа Коэна
  • 5. Ранговые корреляции: тау Кендалл
  • 6. Каппа Фляйса
  • 7. Intra-class correlation coefficient (ICC)
  • Домашнее задание 2 (до 20.02.2018)
    • 1.1
    • 1.2
    • 1.3
    • 1.4
    • 1.5
    • 2.1
    • 2.2
    • 2.3
    • 2.4
    • 2.5
    • 2.6

1. Введение

  • ваши данные представляют собой много наблюдений одного и того же полученные разным способом
    • несколько докторов ставит диагноз нескольким пациентам
    • несколько информантов оценили род в некотором списке слов
    • несколько информантов оценили приемлимость высказываний на школе от 1 до 5
    • разметчики независимо разметили какие-то явления на одном и том же материале
  • Насколько суждения разных оценщиков (raters) относительно субъектов оценки (subjects) согласуются между собой?
  • Почему не эти методы?
    • коэфициенты корреляции
    • парный t-test
    • χ², тест Фишера

1.1 Библиотеки

library(tidyverse)
library(irr)

1.2 Данные: зиловский эксперимент

В зиловском диалекте андийского языка существует два класса для неодушевленных предметов. В 2017 году был проведен эксперимент, чтобы проверить, наличие вариативности в отнесению к тому или иному классу заимствованой и исконной лексики.

zilo_classes <- read_csv("https://goo.gl/miGq7Q")
head(zilo_classes)
ABCDEFGHIJ0123456789
s_id
<int>
sex
<chr>
age_2017
<int>
w_id
<int>
stimulus
<chr>
translation_en
<chr>
translation_ru
<chr>
stimulus_source
<chr>
class
<chr>
1f151milkihousдомnativeb
1f152vaɡontrain wagonвагонloanb
1f153inɡurwindowокноnativeb
1f154ʁats'agrasshopperкузнечикnativeb
1f155iʃkapicabinetшкафloanb
1f156haq'uroomкомнатаnativer

Переменные в датасете:

  • s_id — код испытуемого
  • age_2017 — возраст на 2017 год
  • w_id — код стимула
  • stimulus
  • translation_en
  • translation_ru
  • stimulus_source — тип слова: исконное или заимствованное
  • class — класс слова, к которому испытуемый отнес слово

1.3 Данные: исследование маргинальных русских глаголов

Данные взяты из исследования [Endresen, Janda 2015], посвященное исследованию маргинальных глаголов изменения состояния в русском языке. Испытуемые (70 школьников, 51 взрослый) оценивали по шкале Ликерта (1…5) приемлемость глаголов с приставками о- и у-:

  • широко используемуе в СРЛЯ (освежить, уточнить)
  • встретившие всего несколько раз в корпусе (оржавить, увкуснить)
  • искусственные слова (ономить, укампить)
marginal_verbs <- read_csv("https://goo.gl/6Phok3")
head(marginal_verbs)
ABCDEFGHIJ0123456789
Gender
<chr>
Age
<int>
AgeGroup
<chr>
Education
<chr>
City
<chr>
SubjectCode
<chr>
Score
<chr>
GivenScore
<int>
Stimulus
<chr>
Prefix
<chr>
female16childschoolIzhevskAAA5utochnitu
female16childschoolIzhevskAAA5ozhestochito
female16childschoolIzhevskAAE1ovneshnito
female16childschoolIzhevskAAE1oblusito
female16childschoolIzhevskAAA5osvezhito
female16childschoolIzhevskAAA5oschastlivito

Переменные в датасете:

  • Gender
  • Age
  • AgeGroup — взрослые или школьники
  • Education
  • City
  • SubjectCode — код испытуемого
  • Score — оценка, поставленная испытуемым (A — самая высокая, E — самая низкая)
  • GivenScore — оценка, поставленная испытуемым (5 — самая высокая, 1 — самая низкая)
  • Stimulus
  • Prefix
  • WordType — тип слова: частотное, редкое, искусственное
  • CorpusFrequency — частотность в корпусе

1.4 Данные: переводы 57 сонета У. Шекспира

В данном датасете я собрал информацию о количестве слогов в переводах 57 сонета У. Шекспира и в самом сонете.

sonet <- read.csv("https://goo.gl/cqPDkq")
head(sonet)
ABCDEFGHIJ0123456789
 
 
line
<int>
А.Велигжанин
<int>
А.Кузнецов
<int>
А.Финкель
<int>
А.Шаракшанэ
<int>
В.Брюсов
<int>
В.Микушевича
<int>
И.Фрадкин
<int>
М.Чайковский
<int>
1110991010111010
22910111111101011
331091010109910
44910111110101011
55101091010101010
661110101011101111
  • line — номер строки
  • остальные переменные — количество слогов в переводах

2. Преобразования данных

Все функции пакета 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)
ABCDEFGHIJ0123456789
stimulus
<chr>
translation_ru
<chr>
stimulus_source
<chr>
1
<chr>
2
<chr>
3
<chr>
4
<chr>
5
<chr>
6
<chr>
7
<chr>
alaкрышкаnativerrrrrrr
ʁanлепешкаnativebbbbbbb
antenaантеннаloanrbrrrbr
anziснегnativerrrrrrr
aptsʲekaаптекаloanbbbbbbb
arkomложкаnativebbbbbbb

3. Процент полного согласия

Процент полного согласия — это процент случаев, когда все оценщики идентичны в своих суждениях.

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

Эту меру иногда ошибочно приводят как меру согласия оценщиков, однако она не учитывает возможность случайного совпадения / расхождения суждений.

4. Каппа Коэна

Каппа Коэна мера согласованности между двумя категориальными переменными. Обычно говорят о двух оценщиках, которые распеделяют n наблюдений по s категориям.

κ=pope1pe,

где po — доля полного согласия, а pe — вероятность случайного согласия.

Для случая s = 2, можно нарисовать следующую таблицу сопряженности:

s1 s2
s1 a b
s2 c d

В таком случае:

  • po=a+da+b+c+d
  • pe=(a+b)×(a+c)+(d+b)×(d+c)(a+b+c+d)2

Выберем двух спикиров из наших данных:

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] предложена следующая интерпретация каппы Коэна:

  • κ < 0 poor agreement
  • 0–0.20 slight agreement
  • 0.21–0.40 fair agreement
  • 0.41–0.60 moderate agreement
  • 0.61–0.80 substantial agreement
  • 0.81–1 almost perfect agreement

Каппа Коэна — не единственная мера согласия между двумя оценщиками. Существуют работы, в которых каппу Коэна ругают.

5. Ранговые корреляции: тау Кендалл

Существует несколько τ-мер (τ-a, τ-b, τ-c), это формула для τ-a:

τ=2×CDn×(n1)

  • С — concordant pairs
  • D — discordant pairs
  • n — количество наблюдений
ABCDEFGHIJ0123456789
ranker_1
<int>
ranker_2
<dbl>
C
<dbl>
D
<dbl>
12101
21100
3481
4380
5661
6560
7841
8740
91021
10920
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"))
ABCDEFGHIJ0123456789
 
 
А.Велигжанин
<dbl>
А.Кузнецов
<dbl>
А.Финкель
<dbl>
А.Шаракшанэ
<dbl>
В.Брюсов
<dbl>
В.Микушевича
<dbl>
И.Фрадкин
<dbl>
М.Чайковский
<dbl>
А.Велигжанин1.000000000.06686508-0.01666898-0.274364740.110883190.00000000.46614748-0.07316393
А.Кузнецов0.066865081.000000000.13597788-0.099472950.100503780.00000000.341260460.52223297
А.Финкель-0.016668980.135977881.000000000.446361980.33824071-0.20830230.309911600.27897624
А.Шаракшанэ-0.27436474-0.099472950.446361981.000000000.164957220.0000000-0.06001200-0.10204082
В.Брюсов0.110883190.100503780.338240710.164957221.000000000.00000000.141479110.28867513
В.Микушевича0.000000000.00000000-0.208302260.000000000.000000001.00000000.280056020.00000000
И.Фрадкин0.466147480.341260460.30991160-0.060012000.141479110.28005601.000000000.34006802
М.Чайковский-0.073163930.522232970.27897624-0.102040820.288675130.00000000.340068021.00000000
Н.Гербель0.37704918-0.178306880.400055570.14632786-0.073922130.00000000.46614748-0.10974590
Р..Бадыгов0.263808270.191291240.715312890.294344070.456004660.00000000.500092480.56906519

Бывает еще ρ Спирмана (cor(..., method = "spearman")), γ Гудмана и Крускала и, наверное, еще много других мер.

Не забывайте также про функцию cor.test().

6. Каппа Фляйса

Обощением каппы Коэна для оценщиков больше двух является каппа Фляйса. k оценщиков распеделяют n наблюдений по s категориям.

κ=ˉPoˉPe1ˉPe,

где ˉPo — средняя доля пар согласных оценщиков из всех пар, а ˉPe — вероятность случайного согласия.

zilo_classes_short[,-c(1:3)]
ABCDEFGHIJ0123456789
1
<chr>
2
<chr>
3
<chr>
4
<chr>
5
<chr>
6
<chr>
7
<chr>
8
<chr>
9
<chr>
10
<chr>
rrrrrrrrrr
bbbbbbbbbb
rbrrrbrbrr
rrrrrrrrrr
bbbbbbbbbb
bbbbbbbbbb
bbbbbbbbbb
rrrrrrrrrr
bbbbbbbbbb
bbbbbbbbbb

В нашем датасете 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))
ABCDEFGHIJ0123456789
w_id
<int>
b
<dbl>
r
<dbl>
P_i
<dbl>
11601.0000000
2970.4750000
31510.8750000
41601.0000000
51601.0000000
60161.0000000
70161.0000000
81601.0000000
91601.0000000
101601.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))
ABCDEFGHIJ0123456789
class
<chr>
n
<int>
freq
<dbl>
b9180.5412736
r7780.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

7. Intra-class correlation coefficient (ICC)

В работе (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

Домашнее задание 2 (до 20.02.2018)

Домашнее задание нужно выполнять в отдельном rmarkdown файле, скачав данные из своей папки в репозитории курса. Получившиеся файлы следует помещать в соответствующую папку в своем репозитории на гитхабе. Более подробные инструкции см. на этой странице.

1.1

Скачайте датасет hw1_1_zilo_class.csv (см. описание выше). Получите тиббл содержащий два столбца: stimulus_source и количество уникальных слов в датасете (n).

1.2

Преобразуйте датасет hw1_1_zilo_class.csv. Посчитайте процент полного согласия всех спикеров.

1.3

Из преобразованным датасета hw1_1_zilo_class.csv выберите спикеров с номером 7 и 11 и посчитайте для них каппу Коэна.

1.4

Посчитайте каппу Фляйса для всех спикеров преобразованного датасета hw1_1_zilo_class.csv.

1.5

Представим, что Вы пишите статью, напишите короткий абзац, который бы обобщал результаты, полученные в предыдущих заданиях.

2.1

Скачайте датасет hw1_2_verbs.csv (см. описание выше). Посчитайте количество участников в датасете (в ответ выведите тибл с переменной n).

2.2

Посчитайте среднюю оценку глаголов разного типа для каждого пола в датасете (в ответ выведите тибл с переменными WordType, Gender и mean).

2.3

Преобразуйте датасет в короткий формат и удалите строки, в которых есть пропущенные значения (у меня вышел тибл 59 x 124). Посчитайте процент полного согласия.

2.4

Посчитайте каппу Фляйса для преобразованного датасета.

2.5

Посчитайте ICC для преобразованного датасета.

2.6

Создайте тибл, содержащий минимальное (min) и максимальное (max) значение попарной корреляции Кендала ответов всех участников эксперимента со словами (т. е. корреляция ответов АА и AB, AA и AC и т. д.). В преобразовании матрицы, пораждаемой функцией cor() мне очень помогла функция as.table().




© Г. Мороз 2018 с помощью RMarkdown. Исходный код на GitHub