R:在所有可能的变量组合之间执行Cohen的Kappa测试

时间:2019-11-22 20:29:59

标签: r

我有以下数据框:

structure(list(test1 = c(0, 1, 1, 1, 0, 0, 0, 0, 1, 1, 1, 1), 
    test2 = c(0, 0, 1, 1, 0, 1, 1, 1, 0, 1, 0, 1), test3 = c(0, 
    0, 0, 0, 0, 1, 1, 0, 1, 1, 1, 1), test4 = c(1, 0, 1, 1, 1, 
    1, 0, 1, 0, 1, 0, 1), test5 = c(0, 0, 1, 1, 0, 1, 1, 1, 0, 
    1, 0, 1), test6 = c(0, 0, 0, 0, 0, 1, 1, 0, 1, 1, 1, 1)), row.names = c(NA, 
-12L), class = c("tbl_df", "tbl", "data.frame"))

每个变量/列对应一个测试(test1,test2,test3,test4 ...),并具有每个观察结果的测试结果(1或0)。

我想为所有可能的变量对计算Kappa统计量,并将这些组合的结果存储在数据框中,如

structure(list(...1 = c("test1-test2", "test1-test3", "test1-test4", 
"test2-test1"), `z-score` = c(NA, NA, NA, NA), kappa = c(NA, 
NA, NA, NA), `p-value` = c(NA, NA, NA, NA)), row.names = c(NA, 
-4L), class = c("tbl_df", "tbl", "data.frame"))
> 

有人可以帮我吗?

谢谢!

2 个答案:

答案 0 :(得分:1)

您将需要安装irr软件包(尽管您可以将其替换为测试的任何其他版本)。我将原始数据集命名为dfr1,并将结果数据集命名为dfr2。这将遍历所有列名,并从每个测试中检索结果:

dfr2 <- data.frame(pair = as.character(), z_score = as.numeric(), kappa = as.numeric(), p_value = as.numeric())
for(i in 1:ncol(dfr1)){
  for(j in 1:ncol(dfr1)){
   if(i != j){
     tst <- irr::kappa2(dfr1[,c(i,j)])
     dfr2 <- rbind(dfr2, data.frame(pair = paste0(names(dfr1[,c(i,j)]), collapse = "-"),
                                    z_score = tst$statistic,
                                    kappa = tst$value,
                                    p_value = tst$p.value))
   } 
  }
}

答案 1 :(得分:1)

您的数据:

test <- structure(list(test1 = c(0, 1, 1, 1, 0, 0, 0, 0, 1, 1, 1, 1), 
    test2 = c(0, 0, 1, 1, 0, 1, 1, 1, 0, 1, 0, 1), test3 = c(0, 
    0, 0, 0, 0, 1, 1, 0, 1, 1, 1, 1), test4 = c(1, 0, 1, 1, 1, 
    1, 0, 1, 0, 1, 0, 1), test5 = c(0, 0, 1, 1, 0, 1, 1, 1, 0, 
    1, 0, 1), test6 = c(0, 0, 0, 0, 0, 1, 1, 0, 1, 1, 1, 1)), row.names = c(NA, 
-12L), class = c("tbl_df", "tbl", "data.frame"))

使用combn获得所有可能的比较:

PAIRS = combn(names(test),2)

使用irr并遍历以下组合:

library(irr)
all_results = apply(PAIRS,2,function(i){
result = kappa2(test[,i], "unweighted")
data.frame(
'comparison'=paste(i,collapse="-"),
'z-score'=result$statistic,
'kappa'=result$value,
'p-value'=result$p.value
)
})

结果在一个列表中,我们将它们组合成一个data.frame

all_results =  do.call(rbind,all_results)

    comparison     z.score       kappa      p.value
1  test1-test2 -0.09897433 -0.02857143 0.9211586502
2  test1-test3  0.58554004  0.16666667 0.5581846494
3  test1-test4 -0.82807867 -0.23529412 0.4076259477
4  test1-test5 -0.09897433 -0.02857143 0.9211586502
5  test1-test6  0.58554004  0.16666667 0.5581846494
6  test2-test3  0.58554004  0.16666667 0.5581846494
7  test2-test4  1.65615734  0.47058824 0.0976899593
8  test2-test5  3.46410162  1.00000000 0.0005320055
9  test2-test6  0.58554004  0.16666667 0.5581846494
10 test3-test4 -1.22474487 -0.33333333 0.2206713619
11 test3-test5  0.58554004  0.16666667 0.5581846494
12 test3-test6  3.46410162  1.00000000 0.0005320055
13 test4-test5  1.65615734  0.47058824 0.0976899593
14 test4-test6 -1.22474487 -0.33333333 0.2206713619
15 test5-test6  0.58554004  0.16666667 0.5581846494