r - 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 值。
- 我如何一次获得所有教师段排列的值?(每组老师,段,有不同的观察者)?
- 如何以有意义的方式呈现这 6 种不同的 Kapa 值?我以前从未做过这样的事情;希望能从有经验的统计人员那里得到一些见解。
- 尽管此处未显示,但评分者同时具有序数和名义量表响应(1-4 分)和 [是,否]。我应该为这些不同类型的秤使用不同的 kappa 函数吗?来自“Psych”图书馆文档:“在使用名义分数时,可以使用 Cohen 的 kappa (Cohen, 1960) 和加权 kappa (Cohen, 1968) 来找到两个评估者的一致性。”
解决方案
这是我为你尝试的。您说要计算 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
推荐阅读
- firebase - React Native Firestore 无法访问 Cloud Firestore 后端。后端在 10 秒内没有响应
- c# - 迭代器何时应返回 IEnumerator 而不是 IEnumerable?
- r - 文本行包含无效字符
- python - 如何绘制熊猫数据框的多列
- javascript - Vue - 是否可以动态设置 html 元素的样式?
- python - 使用 xml.etree.ElementTree 解析 XML 1.1 控制字符
- mysql - 设置时间后如何更改mysql中的值
- reactjs - 需要在我的 reactJs 页面中有元刮板或链接预览
- javascript - 解析另一个对象角度中的字符串值
- python - 开放大学 (Open Learn) 学习编码以进行数据分析