複雑な式なしで、Rにブラッドリー–テリー–ルースモデルを適合させる方法は?


9

Bradley–Terry–Luce(BTL)モデルは、であると述べていますここで、はオブジェクトが「より良い」と判断される確率です。重い、など、オブジェクトよりも、、および、およびパラメータです。pj=logt1δjδpjjδδj

これは、家族=二項式のglm関数の候補のようです。ただし、式は「Success〜S1 + S2 + S3 + S4 + ...」のようになります。ここで、Snはダミー変数です。つまり、オブジェクトnが比較の最初のオブジェクトの場合は1、それが-1の場合です。 2番目、それ以外の場合は0。その場合、Snの係数は対応するます。delta

これは、少数のオブジェクトだけで管理するのはかなり簡単ですが、非常に長い式になり、オブジェクトごとにダミー変数を作成する必要が生じる可能性があります。もっと簡単な方法があるのか​​なと思います。比較される2つのオブジェクトの名前または数が変数(因子?)Object1およびObject2であり、オブジェクト1がより適切であると判断された場合、Successは1であり、オブジェクト2がそうである場合、0です。


3
Bradley-Terryモデル用のRパッケージがあります。Rseekを見てください。
枢機卿

また、関連する質問にいくつかのリンクを提供しました:stats.stackexchange.com/a/10741/930
chl

パッケージ@cardinalが言及されました、Btw:BradleyTerry2
共役前の

回答:


17

Rのペア比較(PC)データに最適なパッケージprefmodパッケージだと思います。これにより、Rの(線形対数)BTLモデルに合うようにデータを簡単に準備できます。ポアソンGLM(より​​正確には、ポアソンの多項ロジット)を使用します処方は、例えばこの議論を参照)。

良い点はprefmod::llbt.design、データを必要なフォーマットと必要な設計マトリックスに自動的に変換する機能があることです。

たとえば、6つすべてのオブジェクトをペアで比較するとします。その後

R> library(prefmod)
R> des<-llbt.design(data, nitems=6)

次のようなデータマトリックスから設計マトリックスを作成します。

P1  0  0 NA  2  2  2  0  0  1   0   0   0   1   0   1   1   2
P2  0  0 NA  0  2  2  0  2  2   2   0   2   2   0   2   1   1
P3  1  0 NA  0  0  2  0  0  1   0   0   0   1   0   1   1   2
P4  0  0 NA  0  2  0  0  0  0   0   0   0   0   0   2   1   1
P5  0  0 NA  2  2  2  2  2  2   0   0   0   0   0   2   2   2
P6  2  2 NA  0  0  0  2  2  2   2   0   0   0   0   2   1   2

人を表す行、比較を表す列、0は未定、1はオブジェクト1優先、2はオブジェクト2優先を意味します。欠損値は許可されます。編集:これはおそらく上記のデータから単純に推測するものではないので、ここで詳しく説明します。比較は次の順序で並べる必要があります((12)はオブジェクト1とオブジェクト2の比較を意味します)。

(12) (13) (23) (14) (24) (34) (15) (25) etc. 

gnm::gnm統計モデリングを行うことができるので、関数を使用してフィッティングを行うのが最も便利です。(編集:このprefmod::llbt.fit関数を使用することもできます。この関数は、カウントと計画行列のみを取るため、少し単純です。)

R> res<-gnm(y~o1+o2+o3+o4+o5+o6, eliminate=mu, family=poisson, data=des)
R> summary(res)
  Call:
gnm(formula = y ~ o1 + o2 + o3 + o4 + o5 + o6, eliminate = mu, 
    family = poisson, data = des)

Deviance Residuals: 
   Min      1Q  Median      3Q     Max  
-7.669  -4.484  -2.234   4.625  10.353  

Coefficients of interest:
   Estimate Std. Error z value Pr(>|z|)    
o1  1.05368    0.04665  22.586  < 2e-16 ***
o2  0.52833    0.04360  12.118  < 2e-16 ***
o3  0.13888    0.04297   3.232  0.00123 ** 
o4  0.24185    0.04238   5.707 1.15e-08 ***
o5  0.10699    0.04245   2.521  0.01171 *  
o6  0.00000         NA      NA       NA    
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1   1 

(Dispersion parameter for poisson family taken to be 1)

Std. Error is NA where coefficient has been constrained or is unidentified

Residual deviance: 2212.7 on 70 degrees of freedom
AIC: 2735.3

除外用語は、概要から迷惑パラメータを除外することに注意してください。次に、価値のあるパラメーター(デルタ)を次のように取得できます。

## calculating and plotting worth parameters
R> wmat<-llbt.worth(res)
        worth
o1 0.50518407
o2 0.17666128
o3 0.08107183
o4 0.09961109
o5 0.07606193
o6 0.06140979

そして、あなたはそれらをプロットすることができます

R> plotworth(wmat)

多くのオブジェクトがあり、数式オブジェクトをo1+o2+...+onすばやく書きたい場合は、

R> n<-30
R> objnam<-paste("o",1:n,sep="")
R> fmla<-as.formula(paste("y~",paste(objnam, collapse= "+")))
R> fmla
y ~ o1 + o2 + o3 + o4 + o5 + o6 + o7 + o8 + o9 + o10 + o11 + 
    o12 + o13 + o14 + o15 + o16 + o17 + o18 + o19 + o20 + o21 + 
    o22 + o23 + o24 + o25 + o26 + o27 + o28 + o29 + o30

の式を生成しgnmます(これは必要ありませんllbt.fit)。

JSSの記事があります。https://r-forge.r-project.org/projects/prefmod/およびを介したドキュメントも参照してください?llbt.design


1
それは非常に徹底した対応です。ありがとうございました。prefmodは、使用するのに適したパッケージのようです。ちなみに、このモデルを使用して、スポーツの試合結果を予測しようとしています。
Silverfish 2012

問題ありませんでした。あなたがどのように予測するのか正確にはわかりませんが、ライトナー等。これらのモデルを使用してスポーツイベントを予測しています。彼の論文epubdev.wu.ac.at/2925を参照してください。幸運を。
モモ

たぶんこのリンクの方が良いepubdev.wu.ac.at/view/creators/…–
モモ

このデータから個々のペア(o1とo2など)の差の有意性を計算することは可能ですか?または、式を並べ替えて、最後の要素としてo2を使用し、その場合はStd.error推定なしでライブする必要がありますか?
TNT

1
しばらくしてから、線形制限を便利に使用できるかどうか覚えていませんが、ケースでできることは、1つを基準レベルとして使用し、たとえばo1とし、もう一方のt値を使用して、たとえばo2とします。要約から-それは事実上、o1とo2の差がゼロかどうかのテストを構成します。
Momo
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.