如何在沒有復雜公式的情況下在 R 中擬合 Bradley-Terry-Luce 模型?
Bradley-Terry-Luce(BTL) 模型指出, 在哪裡是對象的概率被判斷為比對象“更好”、更重等, 和, 和是參數。
這似乎是 glm 函數的候選者,family = binomial。但是,公式類似於“Success ~ S1 + S2 + S3 + S4 +…”,其中 Sn 是一個虛擬變量,如果對象 n 是比較中的第一個對象,則為 1,如果是,則為 -1第二個,否則為 0。那麼 Sn 的係數將是相應的.
只需幾個對象,這將相當容易管理,但可能導致公式很長,並且需要為每個對象創建一個虛擬變量。我只是想知道是否有更簡單的方法。假設被比較的兩個對象的名稱或編號是變量(因素?)Object1和Object2,如果判斷對象1更好,則Success為1,如果對象2更好,則為0。
我認為 R 中配對比較(PC)數據的最佳包是prefmod 包,它允許方便地準備數據以適應 R 中的(對數線性)BTL 模型。它使用泊松 GLM(更準確地說,泊松中的多項式 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
。