4

コーエンズのカッパ(合意のレベル)を計算したい分割表があります。私は3つの異なるパッケージを使用してみましたが、すべてある程度失敗しているようです。パッケージe1071には分割表専用の機能がありますが、それも失敗しているようです。以下は再現可能なコードです。concordパッケージ、、、e1071およびをインストールする必要がありますirr

# Recreate my contingency table, output with dput
conf.mat<-structure(c(810531L, 289024L, 164757L, 114316L), .Dim = c(2L, 
2L), .Dimnames = structure(list(landsat_2000_bin = c("0", "1"
), MOD12_2000_binForest = c("0", "1")), .Names = c("landsat_2000_bin", 
"MOD12_2000_binForest")), class = "table")

library(concord)
cohen.kappa(conf.mat)
library(e1071)
classAgreement(conf.mat, match.names=TRUE)
library(irr)
kappa2(conf.mat) 

これを実行して得られる出力は次のとおりです。

> cohen.kappa(conf.mat)
Kappa test for nominally classified data
4 categories - 2 methods
kappa (Cohen) = 0 , Z = NaN , p = NaN 
kappa (Siegel) = -0.333333 , Z = -0.816497 , p = 0.792892 
kappa (2*PA-1) = -1 

> classAgreement(conf.mat, match.names=TRUE)
    $diag
[1] 0.6708459
    $kappa
[1] NA
    $rand
[1] 0.5583764
    $crand
[1] 0.0594124
    Warning message:
In ni[lev] * nj[lev] : NAs produced by integer overflow

> kappa2(conf.mat) 
 Cohen's Kappa for 2 Raters (Weights: unweighted)
Subjects = 2 
Raters = 2 
Kappa = 0 
z = NaN 
p-value = NaN

これらが失敗する理由について誰かがアドバイスできますか?私は大きなデータセットを持っていますが、このテーブルは単純なので、それがそのような問題を引き起こす可能性があるとは思いませんでした。

4

2 に答える 2

3

最初の関数で、は、被験者と評価者のマトリックスcohen.kappaだけでなく、カウントデータを使用していることを指定する必要があります。n*mnm

# cohen.kappa(conf.mat,'count')
cohen.kappa(conf.mat,'count')

2番目の関数ははるかにトリッキーです。何らかの理由で、あなたmatrixはいっぱいでintegerあり、ではありませんnumericinteger本当に大きな数を保存することはできません。したがって、2つの大きな数を掛け合わせると、失敗します。例えば:

i=975288 
j=1099555
class(i)
# [1] "numeric"
i*j
# 1.072383e+12
as.integer(i)*as.integer(j)
# [1] NA
# Warning message:
# In as.integer(i) * as.integer(j) : NAs produced by integer overflow

したがって、行列を整数に変換する必要があります。

# classAgreement(conf.mat)
classAgreement(matrix(as.numeric(conf.mat),nrow=2))

最後に、のドキュメントを見てください?kappa2n*m上で説明したように、マトリックスが必要です。(効率的な)データ構造では機能しません。

于 2012-08-09T17:53:58.800 に答える
1

それらが失敗する理由を具体的に知る必要がありますか?これが統計を計算する関数です-急いでいるので、後でクリーンアップするかもしれません(kappa wiki)

kap <- function(x) {
  a <- (x[1,1] + x[2,2]) / sum(x)
  e <- (sum(x[1,]) / sum(x)) * (sum(x[,1]) / sum(x)) + (1 - (sum(x[1,]) / sum(x))) * (1 - (sum(x[,1]) / sum(x)))
  (a-e)/(1-e)
}

テスト/出力:

> (x = matrix(c(20,5,10,15), nrow=2, byrow=T))
     [,1] [,2]
[1,]   20    5
[2,]   10   15
> kap(x)
[1] 0.4
> (x = matrix(c(45,15,25,15), nrow=2, byrow=T))
     [,1] [,2]
[1,]   45   15
[2,]   25   15
> kap(x)
[1] 0.1304348
> (x = matrix(c(25,35,5,35), nrow=2, byrow=T))
     [,1] [,2]
[1,]   25   35
[2,]    5   35
> kap(x)
[1] 0.2592593
> kap(conf.mat)
[1] 0.1258621
于 2012-08-09T17:23:16.700 に答える