ページ

2016年3月10日木曜日

【R】分割表の自動カテゴリー統合プログラム : optrecod (その7)

前回までのあらすじ:自動カテゴリー統合を試みたが、単純にやってみた結果は駄目だった。クラスター分析でよくあるチェーン現象が生じた。

今回は、作戦を練り直す。具体的には、次の2点を基本方針にする。

  1. 統合のターゲットとなる行、または列は、現状で最も問題のありそうなものを選ぶ。
  2. 統合の結果は、AICの水準ではなく、独立モデルとのAICの差によって評価する。



方針の説明

方針の1は具体的には次のようにする。まず次のような和を、行または列について定義する。

\[
\sum_{i} n_{i} \log n_{i}
\]

この値が最も小さいものが「問題が一番大きい」行もしくは列ということになる。これを解消するように統合を進めるということだ。

方針の2は、今までdmcat関数で評価していたものを-catdap(mcat)による評価に改める、ということだ。

統合のターゲットとなる行・列の探索

ソースコードは次のようになる。

# -----------------------------
# findmin:ターゲット行・列の探索
# -----------------------------
findmin <- function(x){

 # ゼロ度数対応する
 x[x==0] <- exp(-1)

 # 尺度
 z <- x * log(x)

 rs <- rowSums(z) # 行和
 cs <- colSums(z) # 列和

 # 最小値検索
 rs.min <- which.min(rs)
 cs.min <- which.min(cs)
 t <- which.min(c(rs[rs.min],cs[cs.min]))
 if(t == 1) {
  t.min <- rs[rs.min]
  t.index <- rs.min
 } else {
  t.min <- cs[cs.min]
  t.index <- cs.min
 }

 # 整形
 t.index <- as.numeric(t.index)
 t <- as.numeric(t)
 t.min <- as.numeric(t.min)

 return(list(t=t,t.min=t.min,t.index=t.index))
}
動作結果は次のとおり。
> t11_14D
   
      1   2   3   4   5   6   7   8   9
  1 119 299  31  35   9   1   7  15   7
  2  23  96   2   0   2   1   2   2   2
  3  17  76   2   6   2   0   2   4   0
  4   3  20   2   0   1   0   0   1   2
  5   9  31   8   3   1   0   1   4   2
  6   1   0   0   0   0   1   0   0   0
> findmin(t11_14D)
$t
[1] 1

$t.min
[1] -2.575156

$t.index
[1] 6

$tは行の方がターゲットになることを示している(列の場合には2が返される)。また、$t.minは6行目の-2.575156が最小値であることを示している。0度数が7個あるので、不要と判断されている。ちなみに列で最小は6列目で、ゼロ度数が3つある。

次回の予告

次は、行または列について、-catdap(mcat)を評価する関数を定義して動作確認する。