如何在R中拟合Bradley–Terry–Luce模型,而无需复杂的公式?


9

Bradley-Terry-Luce(BTL)模型指出,其中是对象被判定为“更好” 的概率,参数比对象,而和是参数。pĴ一世=ØG一世Ť-1个δĴ-δ一世p一世ĴĴ一世δ一世δĴ

这似乎是glm函数的候选者,family =二项式。但是,公式将类似于“成功〜S1 + S2 + S3 + S4 + ...”,其中Sn是虚拟变量,如果对象n是比较中的第一个对象,则为1,如果为n,则为-1。第二个,否则为0。那么Sn的系数将是对应的。dËŤ一个ñ

仅使用几个对象,这将相当容易管理,但可能导致公式很长,并且需要为每个对象创建一个虚拟变量。我只是想知道是否有更简单的方法。假设要比较的两个对象的名称或数量是变量(因数),对象1和对象2,如果判断对象1更好,则成功为1,如果对象2为更好,则成功为0。


3
Bradley-Terry模型有一个R包。看Rseek。
主教2012年

我还提供了有关一个相关问题的一些链接:stats.stackexchange.com/a/10741/930
chl

提到@cardinal的软件包,顺便说一句:BradleyTerry2
conjugateprior

Answers:


17

我认为R中用于配对比较(PC)数据的最佳软件包是prefmod软件包,它可以方便地准备数据以适合R中的(对数线性)BTL模型。它使用Poisson GLM(更准确地说,是Poisson中的多项式logit公式请参见本讨论)。

令人高兴的是,它具有一个功能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年

没问题,很高兴能帮上忙。我不完全知道您如何预测,但Leitner等人。已经使用这些模型来预测体育赛事。参见他的论文epubdev.wu.ac.at/2925。祝好运。
Momo 2012年


是否可以根据此数据计算各个对(例如o1和o2)之间差异的显着性?还是您必须重新排列公式,使用o2作为最后一个因素,并且在这种情况下没有标准误差估计而生存?
TNT

1
已经有一段时间了,所以我不记得您是否可以方便地使用线性限制,但是在您的情况下,您可以做的是使用一个作为参考水平,例如o1,并使用另一个的t值,例如o2,从摘要开始-它有效地构成了检验o1和o2之差是否为零。
Momo
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.