0

假设我有二进制向量并且需要将它们与Kappa函数进行类似的比较。

library(asbio)
A <- c(0,1,1,1,1,1,0)
B <- c(0,0,1,0,1,0,1)
C <- c(1,0,0,1,1,0,0)
D <- c(1,1,0,0,0,1,1)
E <- c(1,0,0,1,1,0,1)

在此处输入图像描述

Kappa(A,B)$ttl_agreement    # 42%

如何循环Kappa函数以获取所有可能的比较表?

我想得到这样的东西:

    A   B   C   D   E
A 100  42   -   -   -
B  42 100   -   -   -
C   -   - 100   -   -
D   -   -   - 100   -
E   -   -   -   - 100
4

1 回答 1

2

你可以使用outer函数

library(asbio)

A <- c(0,1,1,1,1,1,0)
B <- c(0,0,1,0,1,0,1)
C <- c(1,0,0,1,1,0,0)
D <- c(1,1,0,0,0,1,1)
E <- c(1,0,0,1,1,0,1)


M <- rbind(A,B,C,D,E)

res <- outer(1:nrow(M),
             1:nrow(M),
             FUN=function(i,j){
               # i and j are 2 vectors of same length containing 
               # the combinations of the row indexes. 
               # e.g. (i[1] = 1, j[1] = 1) (i[2] = 1, j[2] = 2)) etc...
               sapply(1:length(i),
                      FUN=function(x) Kappa(M[i[x],],M[j[x],])$ttl_agreement )
             })
row.names(res) <- c('A','B','C','D','E')
colnames(res) <- c('A','B','C','D','E')

#> res
          A         B         C         D         E
# A 100.00000  42.85714  42.85714  28.57143  28.57143
# B  42.85714 100.00000  42.85714  28.57143  57.14286
# C  42.85714  42.85714 100.00000  28.57143  85.71429
# D  28.57143  28.57143  28.57143 100.00000  42.85714
# E  28.57143  57.14286  85.71429  42.85714 100.00000

编辑 :

如果您更喜欢 for 循环(我建议运行一些测试以查看哪种方法更快),您可以使用expand.grid来生成组合,然后遍历它们以填充矩阵

M <- rbind(A,B,C,D,E)

res <- matrix(NA,nrow=5,ncol=5) # pre-allocate the matrix
combs <- expand.grid(1:nrow(M),1:nrow(M))
for(i in 1:nrow(combs)){
  r <- combs[i,1]
  c <- combs[i,2]
  res[r,c] <- Kappa(M[r,],M[c,])$ttl_agreement
}
row.names(res) <- c('A','B','C','D','E')
colnames(res) <- c('A','B','C','D','E')
于 2014-07-02T15:12:18.463 回答