用于在Co中循环使用Cohen的kappa

时间:2015-10-28 17:38:50

标签: r loops

我有8组9名评价者。在每个小组中,9个评估者必须判断一个话语中连续声音的质量,如“坏”,“#34;可接受的","好"”。在每组中,判断出33个话语,但每个话语的每个样本都不同:第一组判断33个话语,第二个判断33个其他话语,等等......总共有264个话语。而且,每个话语都有不同数量的连续声音。每个话语中声音的顺序很重要。 我知道我可以使用Fleiss kappa或类内关联来了解多个评估者之间的协议。但我真正想知道的是,对于每个话语(每组33个),每对评估者(每组32个)加权科恩的kappa。实际上它意味着8448加权Cohen的kappa。这就是为什么我在寻找一种创建循环的方法。但对我来说似乎有点复杂。我正在使用irr包来计算不同的协议。我尝试了for(),但我首先无法生成科恩的kappa公式。我设法在for()中分散了话语,但为了完成所有需求(所有组中的所有对),对我来说有点太多了。我把一组桌子的一部分放在一张照片上。

enter image description here

在图片中,关于话语1的rater1和rater2之间的科恩kappa应该是:

     > kappa2(Dataset[,c(2,3)], "squared")
 Cohen's Kappa for 2 Raters (Weights: squared)

 Subjects = 8 
   Raters = 2 
    Kappa = -0.2 

        z = -0.617 
  p-value = 0.537

在rater2和rater3之间:

    > kappa2(Dataset[,c(3,4)], "squared")
 Cohen's Kappa for 2 Raters (Weights: squared)

 Subjects = 8 
   Raters = 2 
    Kappa = -0.5 

        z = -1.63 
  p-value = 0.102

为了将kappa自动化为一对,我尝试了这个:

    for(kappa in p$utterance) {kappa <- kappa2(p[,c(2,3)], "squared")}

但我从未有过结果。然而,我不知道如何自动化每组中的每一对。

sessionInfo就在这里,但我不知道它是否有用:

    > sessionInfo()
R version 3.1.2 (2014-10-31)
Platform: x86_64-w64-mingw32/x64 (64-bit)

locale:
1 LC_COLLATE=French_France.1252  LC_CTYPE=French_France.1252          LC_MONETARY=French_France.1252 LC_NUMERIC=C                       LC_TIME=French_France.1252    

attached base packages:
1 stats     graphics  grDevices utils     datasets  methods   base     

other attached packages:
1 irr_0.84       lpSolve_5.6.10

1 个答案:

答案 0 :(得分:0)

您可以使用 mapply

我复制了你的数据,用于话语1&amp; 2使用此代码。注意:我使用“data.table”包来创建数据表而不是数据帧。

Dataset<-data.table(utterance=c(rep(1,8), rep(2,6))
                    ,rater1=c(rep("bad",8), "good", rep("bad",5))
                    ,rater2=c("good", rep("bad",4), "good", rep("bad",6), rep("good",2))
                    ,rater3=c("bad", "good", rep("bad",3), "acceptable",rep("bad",2), "acceptable", "bad", rep("acceptable",2), rep("bad",2)))

此代码通过话语产生成对kappas。可能有一个更优雅的解决方案没有嵌套应用函数。

num_utterances <- 2
num_raters <- 3

mapply(function(u, r1, r2){
      kappa2(Dataset[, .SD[utterance==u], .SDcols=names(Dataset) %in% paste0("rater", c(r1, r2))]
    , "squared")
       }
     ,u=c(sapply(1:num_utterances, function(x) rep(x, choose(num_raters, 2)))) 
     ,r1=rep(do.call("c", mapply(function(x, y){rep(x, y)}, x=1:(num_raters-1), y=(num_raters-1):1)), num_utterances)  
     ,r2=rep(do.call("c", mapply(function(x, y){x:y}, x=2:num_raters, y=rep(num_raters, num_raters-1))), num_utterances)
     )

编辑:

如果它有帮助,这里是我放入u,r1和r2参数的三个向量。总共有六次迭代。例如,第一次迭代为评分者1和2计算话语1的kappa。最后一次迭代为评分者2和3计算话语2的kappa。

> c(sapply(1:num_utterances, function(x) rep(x, choose(num_raters, 2)))) 
[1] 1 1 1 2 2 2 

>  rep(do.call("c", mapply(function(x, y){rep(x, y)}, x=1:(num_raters-1), y=(num_raters-1):1)), num_utterances)  
[1] 1 1 2 1 1 2

>  rep(do.call("c", mapply(function(x, y){x:y}, x=2:num_raters, y=rep(num_raters, num_raters-1))), num_utterances)
[1] 2 3 3 2 3 3