ブラッドリー・テリーのモデル     Last modified: Aug 19, 2009

目的

ブラッドリー・テリーのモデル(Bladley-Terry's model)の解を求める。
準対称性の検定を行う(htest クラスのオブジェクトを返す。結果は print.htest による)。
BradleyTerry パッケージに,これに関する BTm という関数がある。
同じ関数名になってしまっていたので,BTM に改名する。

使用法

BTM(x, constant=1, max.rotation=500, epsilon=1e-10, xlab="Score", main="Bradley-Terry model (Paired Comparison)", file="")

引数

x             正方行列(対角成分は何でも良い)
constant      解の制約条件(解の合計値)
max.rotation  収束計算を行う上限回数
epsilon       収束判定値

obj           BTM 関数が返すオブジェクト。クラス名は "htest" と "BTM"
digits        表示桁数

xlab          軸の名称(デフォルトでは Score)
main          グラフのタイトル(デフォルトでは Bradley-Terry model (Paired Comparison))
file          結果の画像を出力するファイル名(デフォルトでは空文字列で,ファイル出力しない)

ソース

インストールは,以下の 1 行をコピーし,R コンソールにペーストする
source("http://aoki2.si.gunma-u.ac.jp/R/src/BTM.R", encoding="euc-jp")

# ブラッドリー・テリーのモデル
# 東京大学教養学部統計学教室編「基礎統計学III 自然科学の統計学」東京大学出版会
# によったが,他のところにあるのとは答えが違う
BTM <- function(x,                                           # 一対比較の結果を表す正方行列
                constant=1,                                     # 解の制約条件(解の合計値)
                max.rotation=500,                               # 収束計算を行う上限回数
                epsilon=1e-10)                                  # 収束判定値
{
        data.name <- deparse(substitute(x))
        method <- "ブラッドリー・テリーのモデル"
        nc <- ncol(x)                                                # 項目数
        stopifnot(nc == nrow(x))                                # 正方行列でないと分析中止
        if (is.null(dimnames(x))) {                             # 項目名がないときは補完する
                labels <- LETTERS[1:nc]
        }
        else if(is.null(colnames(x))) {
                labels <- rownames(x)
        }
        else {
                labels <- colnames(x)
        }
        diag(x) <- 0
        r <- x+t(x)
        yi. <- rowSums(x)
        theta <- rep(constant/nc, nc)
        names(theta) <- labels
        for (i in 1:max.rotation) {
                theta <- yi./colSums(r/outer(theta, theta, "+"))
                theta.new <- theta*(constant/sum(theta))
                converge <- all(abs(theta.new-theta) < epsilon)
                theta <- theta.new
                if (converge) {
                        break
                }
        }
        if (!converge) {
                warning("収束しませんでした。max.rotation を大きくして再実行してみてください")
        }
        s <- !diag(nc)
        expected <- (r*theta/outer(theta, theta, "+"))
        w <- expected[s]
        chi2 <- sum((x[s]-w)^2/w)
        df <- choose(nc-1, 2)
        P <- pchisq(chi2, df, lower.tail=FALSE)
        names(chi2) <- "X-squared"
        names(df) <- "df"
        return(structure(list(statistic=chi2, parameter=df, 
                p.value=P, method=method, data.name=data.name, observed=x, 
                expected=expected, theta=theta), class=c("htest", "BTM")))
}
# summary メソッド
summary.BTM <- function(obj,                                         # BTM オブジェクト
                        digits=5)                                       # 表示する桁数
{
        cat("\nスコア\n\n")
        print(round(obj$theta, digits=digits))
        cat("\nソートされたスコア\n\n")
        print(round(sort(obj$theta), digits=digits))
        cat("\n観察値\n\n")
        print(round(obj$observed, digits=digits))
        cat("\n期待値\n\n")
        print(round(obj$expected, digits=digits))
}
# plot メソッド
plot.BTM <- function(        obj,                                            # BTM オブジェクト
                        xlab="Score",                                   # 結果グラフの横軸名
                        main="Bradley-Terry model (Paired Comparison)", # 結果グラフの表題
                        file="")                                        # 結果グラフをファイル出力するときにファイル名
{
        theta <- obj$theta
        if (file != "") pdf(file, width=540/72, height=160/72, onefile=FALSE)
        plot(theta, rep(0, length(theta)), pch=19, xlab=xlab, main=main, xaxt="n",
                xlim=range(pretty(theta)), ylab="", yaxt="n", ylim=c(0,0.2),
                bty="n", xpd=TRUE)
        text(theta, 0.0, names(theta), pos=3)
        axis(1, pos=0)
        if (file != "") dev.off()
}


使用例

x <- matrix(c(
	0, 14, 7, 13, 16, 18,
	12, 0, 15, 8, 16, 17,
	16, 9, 0, 12, 14, 12,
	12, 17, 12, 0, 13, 7,
	10, 10, 11, 12, 0, 11,
	4, 8, 12, 16, 13, 0
	), byrow=TRUE, nc=6)
rownames(x) <- colnames(x) <- c("Fi", "Br", "Li", "Or", "Ha", "Bu")
(a <- BTM(x))  # 付値しなくてもこれと同じ内容を表示する
summary(a)     # summary メソッドで,追加の情報を表示する
plot(a)        # plot メソッドで,図を描く


出力結果例

> (a <- BTM(x))  # 付値しなくてもこれと同じ内容を表示する

	ブラッドリー・テリーのモデル

data:  x 
X-squared = 22.3877, df = 10, p-value = 0.0132

> summary(a)     # summary メソッドで,追加の情報を表示する

スコア

     Fi      Br      Li      Or      Ha      Bu 
0.19994 0.18805 0.17856 0.16498 0.12984 0.13863 

ソートされたスコア

     Ha      Bu      Or      Li      Br      Fi 
0.12984 0.13863 0.16498 0.17856 0.18805 0.19994 

観察値

   Fi Br Li Or Ha Bu
Fi  0 14  7 13 16 18
Br 12  0 15  8 16 17
Li 16  9  0 12 14 12
Or 12 17 12  0 13  7
Ha 10 10 11 12  0 11
Bu  4  8 12 16 13  0

期待値

         Fi       Br       Li       Or       Ha       Bu
Fi  0.00000 13.39835 12.14938 13.69726 15.76300 12.99201
Br 12.60165  0.00000 12.31045 13.31663 15.38015 14.39112
Li 10.85062 11.68955  0.00000 12.47432 14.47458 13.51094
Or 11.30274 11.68337 11.52568  0.00000 13.98980 12.49840
Ha 10.23700 10.61985 10.52542 11.01020  0.00000 11.60754
Bu  9.00799 10.60888 10.48906 10.50160 12.39246  0.00000

> plot(a)        # plot メソッドで,図を描く

fig


・ 参考文献   東京大学教養学部統計学教室編「基礎統計学III 自然科学の統計学」東京大学出版会


・ 直前のページへ戻る  ・ E-mail to Shigenobu AOKI ( @si.gunma-u.ac.jp )

Made with Macintosh