首页 > 解决方案 > Inter-Rater Reliabilty:同时运行多个 Cohen's Kappa(使用 R)

问题描述

我正在尝试为多个教师段排列计算科恩的 kapa 值。在此示例中,有六种独特的教师-细分组合。例如,teacher1-segment1 有两个不同的评分者,并且希望查看这两个评分者对于那个 teacher1-segment1(以及所有其他的teacher-segment 排列)的 ICC。

我有一个这样的数据集。

full.data <- read_table2('Rater teacher segment subject1    subject2    subject3
A   1   1   1   4   1
B   1   1   3   4   3
B   2   2   2   3   2
C   2   2   1   4   1
D   3   1   4   4   4
E   3   1   4   3   4
D   4   2   3   3   3
A   4   2   4   3   4
B   5   2   4   3   4
A   5   2   5   3   5
D   6   1   5   3   5
E   6   1   5   3   5')

我知道,如果我只想获得一个教师组的科恩卡帕,我会转换这样的数据,

one.permuation<- read_table2('Rater RaterA-teacher1-segment1    RaterB-teacher1-segment1
subject1    1   3
subject2    4   4
subject3    1   3')

and then run,
library(irr)
print(icc(myRatings, model=“twoway”, type=“consistency”, unit=“average”))

对于那个特定的教师部分,这只会给我一个 kapa 值。

  1. 我如何一次获得所有教师段排列的值?(每组老师,段,有不同的观察者)?
  2. 如何以有意义的方式呈现这 6 种不同的 Kapa 值?我以前从未做过这样的事情;希望能从有经验的统计人员那里得到一些见解。
  3. 尽管此处未显示,但评分者同时具有序数和名义量表响应(1-4 分)和 [是,否]。我应该为这些不同类型的秤使用不同的 kappa 函数吗?来自“Psych”图书馆文档:“在使用名义分数时,可以使用 Cohen 的 kappa (Cohen, 1960) 和加权 kappa (Cohen, 1968) 来找到两个评估者的一致性。”

标签: rdplyrstatisticscorrelation

解决方案


这是我为你尝试的。您说要计算 Cohen 的 Kappa 值。所以我决定cohen.kappa()在 psych 包中使用,而不是icc()我不熟悉的 . 我希望你不要介意。他们的关键是以一种可以cohen.kappa()一起运行的方式转换您的数据。看到您的one.permuation,我尝试创建一个数据框,其中包含教师、细分、主题和评估者(A、B、C、D 和 E)作为列。pivot_longer()pivot_wider()处理了这个。然后,我需要将数值移动到两列(按行值排序)。我使用了 Ananda Mahto 的SOfun包。(Ananda 是 splitstackshape 包的作者。)然后,我按教师和分段对数据进行分组并创建列表。对于包含数据框的每个列表,我将数据框转换为矩阵并应用cohen.kappa()并获得结果tidy()。最后,我曾经unnest()看到了结果。

library(tidyverse)
library(psych)
library(devtools)
install_github("mrdwab/SOfun")
library(SOfun)
library(broom)

pivot_longer(full.data, cols = subject1:subject3,
             names_to = "subject", values_to = "rating_score") %>% 
pivot_wider(id_cols = c("teacher", "segment", "subject"),
             names_from = "Rater", values_from = "rating_score") %>%
as.matrix %>% 
naLast(by = "row") %>% 
as_tibble %>% 
select(-c(subject, C:E)) %>% 
type_convert() %>% 
group_by(teacher, segment) %>%
nest() %>% 
mutate(result = map(.x = data,
                    .f = function(x) cohen.kappa(as.matrix(x)) %>% tidy())) %>% 
unnest(result)

#  teacher segment           data type       estimate conf.low conf.high
#     <dbl>   <dbl> <list<df[,2]>> <chr>         <dbl>    <dbl>     <dbl>
# 1       1       1        [3 x 2] unweighted    0.25   -0.0501     0.550
# 2       1       1        [3 x 2] weighted      0.571  -0.544      1    
# 3       2       2        [3 x 2] unweighted    0       0          0    
# 4       2       2        [3 x 2] weighted      0.571  -1          1    
# 5       3       1        [3 x 2] unweighted    0       0          0    
# 6       3       1        [3 x 2] weighted      0       0          0    
# 7       4       2        [3 x 2] unweighted    0       0          0    
# 8       4       2        [3 x 2] weighted      0       0          0    
# 9       5       2        [3 x 2] unweighted    0.25   -0.0501     0.550
#10       5       2        [3 x 2] weighted      0.571  -0.544      1    
#11       6       1        [3 x 2] unweighted    1       1          1    
#12       6       1        [3 x 2] weighted      1       1          1  

icc版本

数据转换基本相同。当您运行多个统计信息时,您需要多做一些工作。icc()返回icclist对象。您想从对象创建数据框。

library(irr)

pivot_longer(full.data, cols = subject1:subject3,
             names_to = "subject", values_to = "rating_score") %>% 
pivot_wider(id_cols = c("teacher", "segment", "subject"),
            names_from = "Rater", values_from = "rating_score") %>%
as.matrix %>% 
naLast(by = "row") %>% 
as_tibble %>% 
select(-c(subject, C:E)) %>% 
mutate_at(vars(A:B), .funs = list(~as.numeric(.))) %>% 
group_by(teacher, segment) %>%
nest() %>% 
mutate(result = map(.x = data,
                    .f = function(x) enframe(unlist(icc(x, 
                                                        model = "twoway",
                                                        type = "consistency", 
                                                        unit = "average"))) %>% 
                                     pivot_wider(names_from = "name",
                                                 values_from = "value"))) %>% 
unnest(result)


 teacher segment     data subjects raters model type  unit  icc.name value r0    Fvalue df1   df2   p.value conf.level lbound ubound
  <chr>   <chr>   <list<d> <chr>    <chr>  <chr> <chr> <chr> <chr>    <chr> <chr> <chr>  <chr> <chr> <chr>   <chr>      <chr>  <chr> 
1 1       1        [3 x 2] 3        2      twow~ cons~ aver~ ICC(C,2) 0.75  0     4      2     2     0.2     0.95       -8.74~ 0.993~
2 2       2        [3 x 2] 3        2      twow~ cons~ aver~ ICC(C,2) 0.75  0     4      2     2     0.2     0.95       -8.75  0.993~
3 3       1        [3 x 2] 3        2      twow~ cons~ aver~ ICC(C,2) 4.99~ 0     1      2     2     0.5     0.95       -38    0.974~
4 4       2        [3 x 2] 3        2      twow~ cons~ aver~ ICC(C,2) -8.3~ 0     0.999~ 2     2     0.5     0.95       -38    0.974~
5 5       2        [3 x 2] 3        2      twow~ cons~ aver~ ICC(C,2) 0.88~ 0     8.999~ 2     2     0.1     0.95       -3.33~ 0.997~
6 6       1        [3 x 2] 3        2      twow~ cons~ aver~ ICC(C,2) 1     0     Inf    2     2     0       0.95       1      1     

推荐阅读