ねこすたっと

ねこの気持ちと統計について悩む筆者の備忘録的ページ。

カッパ係数でカテゴリー変数の一致度をみる [R]

カッパ係数(Cohen's kappa statistic)とは

測定値の真の値が一定であると考えられる対象者に対して、異なる時点、あるいは異なる測定者(評価者)によって測定が行われた場合に、どれほど近い測定値が得られるか」を測定の信頼性(reliability)と呼びます。 測定データの変動は、真の個人差による変動と測定誤差による変動から成りますが、前者が占める割合(=測定誤差を除いた部分の割合)を信頼性の指標としています。

データがカテゴリー変数の場合、信頼性の指標としてカッパ係数(Cohen's kappa statistic)が用いられます。

定義

例として、2名の評価者が50人の対象者についてAかBかを独立に判定して、下の表のような結果になったとします。

両者の評価が一致している割合、つまり、(28+11)/50=0.78を指標としたいところですが、偶然一致する割合を差し引く必要があります。

例えば、評価者1が50人からランダムに選んだ35人に判定Aをつけ、評価者2も同様に50人中32人に判定Aをつけると、約22人(←(35/50)×(32/50)×50=22.4)は両評価者から判定Aをもらうことになります。判定Bについても同様で、適当に評価をつけても約5人(←(15/50)×(18/50)×50=5.4)は両者から判定Bをもらいます。 実際に評価して39人(=28+11)で一致したという結果は、前述の偶然の一致による分(=27.8人)を差し引いて評価しなければいけません。

観察された一致割合を  p_o、偶然の一致割合*1 p_c とすると、カッパ係数  \kappa は、

 
\begin{aligned}
\kappa &= \frac{p_o - p_c}{1 - p_c}
\end{aligned}

と定義されます。

ここで偶然の一致割合  p_c は、周辺確率の積から計算されます。例えば「判定Aで偶然一致する確率」は、評価者1がAと判定する確率と評価者2がAと判定する確率をかけたもの(←(35/50)×(32/50)=0.448)で、「判定Bで偶然一致する確率」についても同様です((15/50)×(18/50)=0.108)。この2つを足したもの(0.448+0.108=0.556)が  p_c になります。

先程の例ではカッパ係数は、

 
\begin{aligned}
\kappa &= \frac{0.78 - 0.556}{1 - 0.556} \\
&= \frac{0.224}{0.444} \\
&= 0.504
\end{aligned}

となります。

後で説明する重み付けカッパ係数の理解のため、次のように変形しておきます(*)。

 
\begin{aligned}
\kappa &= \frac{p_o - p_c}{1 - p_c} \\
&= \frac{1-p_c -(1 - p_o)}{1 - p_c} \\
&= 1 - \frac{1 - p_o}{1 - p_c} \\
\end{aligned}

解釈

カッパ係数は-1〜1の範囲の値を取りますが、<0の値は「偶然一致するよりも一致が悪い*2」ということなので、実際に意味がある範囲は0〜1です。数式からは分かりにくいですが、下の図を見れば、カッパ係数は「観察された偶然に依らない一致が、最大値に対してどれくらいなのか」を示していると考えられます。

「カッパ係数がどれくらいだったら一致度が高いと言えるのか」は多少恣意的ですが、以下のような目安が使われることが多いようです。

Landis and Kochの基準:

  • 〜 ≦0:poor(不一致)
  • 0 〜 ≦0.2:slight(わずかに一致)
  • 0.2 〜 ≦0.4:fair(少しは一致)
  • 0.4 〜 ≦0.6:moderate(まあまあ一致)
  • 0.6 〜 ≦0.8:substantial(かなり一致)
  • 0.8 〜 ≦1:almost perfect(ほぼ完全に一致)

重み付けカッパ係数(weighted kappa statistic)

評価のカテゴリーが3つ以上で、カテゴリーに順序がある場合を考えます。
例として、2名の評価者が50人の対象者について、「良い・普通・悪い」の3段階で評価して次のような結果になったとしましょう。

このとき、「良い-悪い」という不一致に比べて「良い-普通」という不一致はまだマシですよね。後者を「軽い不一致」、前者を「重い不一致」として区別したくなりますが、前述のカッパ係数では両者を同じ程度の不一致として扱うことになってしまいます。

そこで、不一致の距離に応じて重みづけをした重み付けカッパ係数(weighted kappa statistic)の出番です。

定義

集計表の各セルに与えられる重みを  w_{ij} として、以下のように定義されます。

 
\begin{aligned}
\kappa_w &= 1 - \frac{1 - \sum w_{ij} p_{o,ij}}{1 - \sum w_{ij} p_{c,ij}}
\end{aligned}

前述の(*)と比べてみると、対応関係がわかりやすいですね。

代表的な重みの付け方は、下に示すカテゴリーの距離の2乗に応じた重み付け(Fleiss-Cohen法)です。

 
\begin{aligned}
w_{ij} &= 1 - \left( \frac{i - j}{k-1} \right)^2
\end{aligned}

ここでkはカテゴリー数で、「良い・普通・悪い」の3段階ならk=3になります。(i-j)は2人の評定の差なので、一致していれば0, 最も離れている場合でk-1になります。つまり、評定が一致しているところはw=1(完全一致)、評定が最も離れているところはw=0(完全不一致)となるような重みです。

2次ではなく1次の重み付けの方法もあります。一致しているところはw=1、最も離れているところはw=0となる点は同じです。

 
\begin{aligned}
w_{ij} &= 1 -  \frac{| i - j |}{k-1} 
\end{aligned}

Rで計算してみる

サンプルデータを作成する

前述の2つの例をサンプルデータにします。

1つ目:カテゴリーが2つ(判定A, B)

rater1 <- c(rep("A",35),rep("B",15))
rater2 <- c(rep("A",28),rep("B",7),rep("A",4),rep("B",11))
data1 <- data.frame(rater1,rater2)
table_data1 <- table(data1)

2つ目:カテゴリーが3つで順序あり(1=良い, 2=普通, 3=悪い)

rater1 <- c(rep(1,10),rep(2,28),rep(3,12))
rater2 <- c(rep(1,8),rep(2,1),rep(3,1),
            rep(1,7),rep(2,16),rep(3,5),
            rep(1,0),rep(2,3),rep(3,9))
data2 <- data.frame(rater1,rater2)
table_data2 <- table(data2)

それぞれのデータについて、以下の2種類の形式を用意しておきます。

  • それぞれの患者に対する評価を1行に収めたデータ:data1,data2
> head(data1)
  rater1 rater2
1      A      A
2      A      A
3      A      A
4      A      A
5      A      A
6      A      A
  • 上記を表に集計したデータ:table_data1, table_data2
> table_data1
      rater2
rater1  A  B
     A 28  7
     B  4 11

方法1:irrパッケージを用いる

irrパッケージのkappas( )関数を使ってみます。 渡すデータは1患者1行タイプを使います(集計表タイプはダメ)。

通常のカッパ係数は、weight = "unweighted"とします(デフォルトなので指定不要)。

library(irr)
kappa2(data1, weight = "unweighted")
 Cohen's Kappa for 2 Raters (Weights: unweighted)

 Subjects = 50 
   Raters = 2 
    Kappa = 0.505 

        z = 3.6 
  p-value = 0.000318 

2次重み付けカッパ係数は、weight = "squared"と指定します(ちなみに1次重み付けはweight = "equal"です。)。

kappa2(data2, weight = "squared")
 Cohen's Kappa for 2 Raters (Weights: squared)

 Subjects = 50 
   Raters = 2 
    Kappa = 0.615 

        z = 4.41 
  p-value = 1.02e-05 

p-valueは帰無仮説: \kappa = 0 に対してのP値ですが、そもそもカッパ係数=0は臨床的に意味がないので、このP値は気にしなくていいと思います。

方法2:vcdパッケージを用いる

次にvcdパッケージのKappa( )関数を使ってみます。 こちらは集計表タイプのみ受け付けてくれるようです。

library(vcd)
Kappa(table_data1)
            value    ASE     z Pr(>|z|)
Unweighted 0.5045 0.1285 3.925 8.68e-05
Weighted   0.5045 0.1285 3.925 8.68e-05

何も指定しなくても重み付けカッパ係数も表示されるみたいですが、ここはカテゴリー数が2なので通常のカッパ係数と同じになります。

重み付けの方法を指定したい場合は、引数weightsで指定します。

  • "Equal-Spacing":1次
  • "Fleiss-Cohen":2次

結果を保存しておくと使用したweightを表示したり、

K_result <- Kappa(table_data2, weights = "Fleiss-Cohen")
> summary(K_result)
            value    ASE     z  Pr(>|z|)
Unweighted 0.4720 0.1029 4.590 4.443e-06
Weighted   0.6154 0.0993 6.198 5.736e-10

Weights:
     [,1] [,2] [,3]
[1,] 1.00 0.75 0.00
[2,] 0.75 1.00 0.75
[3,] 0.00 0.75 1.00

信頼区間を表示したりできます。

> confint(K_result, level=0.95)
            
Kappa              lwr       upr
  Unweighted 0.2704601 0.6736393
  Weighted   0.4207690 0.8100002

信頼区間が計算できるので、 \kappa=0 以外の帰無仮説に対して有意差があるかどうかも判断できます。

方法3:psychパッケージを用いる

最後にpsychパッケージのcohen.kappa( )関数を使ってみます。 データ形式は1対象者1行タイプでも集計表タイプでもOKです。

library(psych)
> cohen.kappa(data1)
Call: cohen.kappa1(x = x, w = w, n.obs = n.obs, alpha = alpha, levels = levels)

Cohen Kappa and Weighted Kappa correlation coefficients and confidence boundaries 
                 lower estimate upper
unweighted kappa  0.25      0.5  0.76
weighted kappa    0.25      0.5  0.76

 Number of subjects = 50 

重みはweightsに行列を与えて指定することができるみたいですが、デフォルトでは2次重み付けが使われているようです。

> cohen.kappa(data2)
Call: cohen.kappa1(x = x, w = w, n.obs = n.obs, alpha = alpha, levels = levels)

Cohen Kappa and Weighted Kappa correlation coefficients and confidence boundaries 
                 lower estimate upper
unweighted kappa  0.27     0.47  0.67
weighted kappa    0.38     0.62  0.85

 Number of subjects = 50 

信頼区間水準はalphaで指定します。デフォルトは0.05で、95%信頼区間が表示されます。

おわりに

  • Rで実行するならvcdパッケージが便利そうです。
  • カッパ係数は有病割合(例:両評価者ともAの割合と、両方ともBの割合の差)の影響を受けます。
  • カッパ係数は不一致の非対称(例:評価者1がAで評価者2がBの割合と、評価者1がBで評価者2がAの割合の差)
  • 毎日窓の外を眺めている猫を見てると、抱っこ紐で連れ出したくなります。

参考資料

*1:偶然でも一致が期待される割合

*2:例えば、一方の評価者がひねくれているとか、評価の仕方が逆になっているなど

*3:重み付けカッパ係数について記載したAppendixで分子のΣが抜けている誤植があるように思います。