1. David’s Scoreの算出
1.1 David’s Scoreとは
David’s Score(以下、DS)は、個体間の相対的なdominanceの差の違いを考慮して順位を算出してくれる指標である。一般的には個体の順位を高い方から順に1位, 2位, 3位, …と等間隔に割り振っていくため、1位 vs 2位と2位 vs 3位の間のdominanceの差が同じとみなされる。一方で、DSはその値の差が大きい個体間ほど、dominanceに差があることを表すことができる。
例えば、A, B, Cという個体のDSがそれぞれ2, 4, 7とすると、AとBの間のdominanceの差はBとCの差よりも小さいことになる。なお、DSは値が高い個体ほど順位が高いことを表す。
1.2 DSの定義
個体\(i\)の個体\(j\)に対する勝率を\(P_{ij} = s_{ij}/n_{ij}\)、敗率を\(\; P_{ji} = 1-P_{ij}\)とするとき(ただし、\(n_{ij}\): 全敵対的交渉数, \(s_{ij}\): \(i\)が\(j\)に勝った回数)、個体\(i\)について\(w_i, w_{2i}, l_i, l_{2i}\)を以下のように定義する(\(N\)は個体数)。
\[ \begin{aligned} w_i &= \sum_{j=1}^{N} P_{ij} \;\; (j \neq i) \;\; \text{(個体}i\text{の勝率の合計)}\\ w_{2i} &= \sum_{j=1}^{N} w_jP_{ij} \;\; (j \neq i) \;\; \text{(個体}j\text{の}w_j\text{で重みづけした個体}i\text{の勝率の合計)}\\ l_i &= \sum_{j=1}^{N} P_{ji} \;\; (j \neq i) \;\; \text{(個体}i\text{の敗率の合計)}\\ l_{2i} &= \sum_{j=1}^{N} l_jP_{ji} \;\; (j \neq i) \;\; \text{(個体}j\text{の}l_j\text{で重みづけした個体}i\text{の敗率の合計)}\\ \end{aligned} \]
このとき、個体\(i\)のDS(\(DS_i\))は以下のように定義される。
\[ DS_i = w_i + w_{2i} - l_i - l_{2i} \]
なお、個体ごとの敵対的交渉(\(n_ij\))の試行数の違いを考慮するため、\(P_{ij}\)のかわりに以下の\(D_{ij}\)を、\(P_{ji}\)の代わりに\(D_{ji} = 1- D_{ij}\)用いてDSの算出を算出することもある。詳細は De Vries et al. (2006) を参照。 De Vries et al. (2006) では\(D_{ij}\)を使う方法が推奨されているようだが、十分に試行数がある場合には\(P_{ij}\)を使う方がいいと書いてある論文もあるようだ(Balasubramaniam et al. 2012)。
\[ D_ij = P_{ij} - \{(P_{ij}-0.5)/(n_{ij}+1)\} \]
1.3 Normalized David’s Scoreの定義
DSを算出する際には、steepness(後述)を算出する際にその値が0から1におさまるように標準化することが多い。これをNormalized David’s Score(以下、nDS)という(De Vries et al. 2006)。nDSは以下の式で計算される。これによって、nDSは0から\(N-1\)の間に収まる。
\[ nDS_i = \{DS_i + N(N-1)/2\}/N \]
1.4 Rでの算出方法
それではRでnDSの算出を行う。本稿では、 Vervaecke et al. (2007) に載っている馬の攻撃交渉の勝敗データを用いる。データはdata frameではなく、matrix(隣接行列)として読み込む必要があるので、csvファイルなどから読み込むときは必要に応じてas.matrix()
でmatrix化する必要がある。
Rで直接マトリックスを作成する場合
mat <- matrix(c(0,58,50,61,32,37,29,39,25,8,0,22,22,9,27,20,10,48,
3,3,0,19,29,12,13,19,8,5,8,9,0,33,38,35,32,57,
4,7,9,1,0,28,26,16,23,4,3,0,0,6,0,7,6,12,
2,0,4,1,4,4,0,5,3,0,2,1,1,5,8,3,0,10,3,1,3,0,0,4,1,2,0),
nrow=9,byrow=TRUE)
individuals <- c("V","VS","B","FJ","PR","VB","TOR","MU","ZV") %>%
as.character()
##列名と行名を追加
colnames(mat) <- individuals
rownames(mat) <- individuals
mat
## V VS B FJ PR VB TOR MU ZV
## V 0 58 50 61 32 37 29 39 25
## VS 8 0 22 22 9 27 20 10 48
## B 3 3 0 19 29 12 13 19 8
## FJ 5 8 9 0 33 38 35 32 57
## PR 4 7 9 1 0 28 26 16 23
## VB 4 3 0 0 6 0 7 6 12
## TOR 2 0 4 1 4 4 0 5 3
## MU 0 2 1 1 5 8 3 0 10
## ZV 3 1 3 0 0 4 1 2 0
csvファイルから読みこむ場合
それでは、算出する。EloRating
パッケージのDS
関数を用い、prop =
でPij
かDij
を指定する。
結果を確認すると、\(P_{ij}\)と\(D_{ij}\)を用いた場合で微妙に値が異なることが分かる。
\(P_{ij}\)を用いた場合
\(D_{ij}\)を用いた場合