Bradley-Terry – Luce modelini karmaşık formül olmadan R'ye nasıl takabilirim?


9

Bradley – Terry – Luce (BTL) modeli, ; burada , j nesnesinin "daha iyi" olduğuna karar verme olasılığıdır , ağır, vs, nesneden daha ı ve \ delta_i ve \ delta_j parametrelerdir.pjben=lÖgbent-1(δj-δben)pbenjjbenδbenδj

Bu, glm fonksiyonu için bir aday gibi görünüyor, aile = binomial. Bununla birlikte, formül "Başarı ~ S1 + S2 + S3 + S4 + ..." gibi bir şey olacaktır, burada Sn kukla bir değişkendir, n nesnesinin karşılaştırmada ilk nesne olması durumunda 1, eğer öyleyse -1 ikincisi ve 0 ise. Sonra Sn katsayısı ilgili deltbirn .

Bu, yalnızca birkaç nesne ile yönetilmesi oldukça kolay olurdu, ancak çok uzun bir formüle ve her nesne için bir kukla değişken yaratma ihtiyacına yol açabilir. Sadece daha basit bir yöntem olup olmadığını merak ediyorum. Karşılaştırılan iki nesnenin adının veya sayısının değişkenler (faktörler?) Object1 ve Object2 olduğunu ve nesne 1 daha iyi değerlendirilirse Başarı 1, nesne 2 ise 0 olduğunu varsayalım.


3
Bradley-Terry modeli için bir R paketi var. Rseek'e bak.
kardinal

Ayrıca ilgili bir soruya bazı bağlantılar da sağladım
chl

@Cardinal adlı paket, btw: BradleyTerry2
conjugateprior

Yanıtlar:


17

R'deki Eşleştirilmiş Karşılaştırma (PC) verileri için en iyi paketin, R'deki (log lineer) BTL modellerine uyacak şekilde rahatça veri hazırlamasına izin veren prefmod paket olduğunu düşünüyorum. formülasyon bkz . bu tartışma ).

Güzel olan şey, prefmod::llbt.designverilerinizi otomatik olarak gerekli biçime ve gerekli tasarım matrisine dönüştüren bir işleve sahip olmasıdır.

Örneğin, karşılaştırmalı olarak 6 nesneniz olduğunu varsayalım. Sonra

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

tasarım matrisini şöyle görünen bir veri matrisinden oluşturur:

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

satırları insanları, sütunları karşılaştırmaları ve 0'ı kararsız 1, tercih edilen nesne 1 ve 2 tercih edilen nesne 2 belirtir. Eksik değerlere izin verilir. Düzenleme : Bu muhtemelen sadece yukarıdaki verilerden çıkarım bir şey olmadığından, ben burada heceleyerek. Karşılaştırmalar şu şekilde sıralanmalıdır ((12) nesne 2 ile ortalama karşılaştırma nesnesi 1):

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

Montaj, gnm::gnmistatistiksel modelleme yapmanıza izin verdiği için işlevle en uygun şekilde gerçekleştirilir . (Düzenle: prefmod::llbt.fitYalnızca sayıları ve tasarım matrisini aldığı için biraz daha basit olan işlevi de kullanabilirsiniz .)

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

Elimine edilen terimin, rahatsızlık parametrelerini özetten çıkaracağını lütfen unutmayın. Daha sonra değer parametrelerini (deltalarınızı)

## 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

Ve bunları

R> plotworth(wmat)

Çok sayıda nesneniz varsa ve bir formül nesnesini o1+o2+...+onhızlı bir şekilde yazmak istiyorsanız,

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

formülünü oluşturmak için gnm(ihtiyacınız olmayacak llbt.fit).

Bir JSS makalesi var , ayrıca https://r-forge.r-project.org/projects/prefmod/ ve üzerinden belgelere bakın ?llbt.design.


1
Bu çok kapsamlı bir yanıt. Teşekkür ederim. Prefmod kullanmak için iyi bir paket gibi görünüyor. Bu arada spor maçlarının sonuçlarını tahmin etmeye çalışmak için modeli kullanmak istiyorum.
Silverfish

Sorun değil, yardımcı olursa sevindim. Nasıl tahmin etmek istediğini tam olarak bilmiyorum, ama Leitner ve ark. bu modelleri spor etkinliklerini tahmin etmek için kullandılar. Tezine bakınız epubdev.wu.ac.at/2925 . İyi şanslar.
Momo

Belki bu bağlantı daha iyi epubdev.wu.ac.at/view/creators/…
Momo

Bu verilerden münferit çiftler arasındaki farkların (örneğin o1 ve o2) hesaplanması mümkün müdür? Veya formülü yeniden düzenlemek, son faktör olarak o2 kullanmak ve bu durumda Std. Hata tahmini olmadan yaşamak mı gerekiyor?
TNT

1
Bir süredir, bu yüzden doğrusal kısıtlamaları rahatça kullanıp kullanamayacağınızı hatırlamıyorum, ancak sizin durumunuzda yapabileceğiniz şey, referans seviyesi, o1 demek ve diğerinin t değerini kullanmak, yani o2, Özetle - o1 ve o2 arasındaki farkın sıfır olup olmadığını etkili bir şekilde test eder.
Momo
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.