Come montare il modello Bradley – Terry – Luce in R, senza formula complicata?


9

Il modello Bradley – Terry – Luce (BTL) afferma che , dove è la probabilità che l'oggetto sia giudicato "migliore", più pesanti, ecc., dell'oggetto , e e sono parametri.p i j j i δ i δ jpji=logit1(δjδi)pijjiδiδj

Questo sembra essere un candidato per la funzione glm, con family = binomial. Tuttavia, la formula sarebbe simile a "Successo ~ S1 + S2 + S3 + S4 + ...", dove Sn è una variabile fittizia, ovvero 1 se l'oggetto n è il primo oggetto nel confronto, -1 se lo è il secondo e 0 altrimenti. Quindi il coefficiente di Sn sarebbe il corrispondente .deltan

Questo sarebbe abbastanza facile da gestire con solo pochi oggetti, ma potrebbe portare a una formula molto lunga e alla necessità di creare una variabile fittizia per ogni oggetto. Mi chiedo solo se esiste un metodo più semplice. Supponiamo che il nome o il numero dei due oggetti da confrontare siano variabili (fattori?) Object1, Object2 e Success sia 1 se l'oggetto 1 viene giudicato meglio e 0 se l'oggetto 2 lo è.


3
Esiste un pacchetto R per il modello Bradley-Terry. Guarda su Rseek.
cardinale il

Ho anche fornito alcuni link su una domanda correlata: stats.stackexchange.com/a/10741/930
chl

Il pacchetto menzionato da @cardinal, a proposito: BradleyTerry2
conjugateprior,

Risposte:


17

Penso che il pacchetto migliore per i dati di confronto accoppiato (PC) in R sia il pacchetto prefmod , che consente di preparare comodamente i dati per adattarli (log linear) modelli BTL in R. Usa un Poisson GLM (più precisamente, un log multinomiale in Poisson formulazione vedi ad esempio questa discussione ).

La cosa bella è che ha una funzione prefmod::llbt.designche converte automaticamente i tuoi dati nel formato necessario e nella matrice di progettazione necessaria.

Ad esempio, supponiamo di avere 6 oggetti tutti confrontati a coppie. Poi

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

costruirà la matrice di progettazione da una matrice di dati simile a questa:

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

con righe che indicano persone, colonne che indicano confronti e 0 significa indecisa 1 significa oggetto 1 preferito e 2 significa oggetto 2 preferito. Sono ammessi valori mancanti. Modifica : poiché questo probabilmente non è qualcosa da dedurre semplicemente dai dati sopra, lo scrivo qui. I confronti devono essere ordinati nel modo seguente ((12) significa confronto oggetto 1 con oggetto 2):

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

L'adattamento viene eseguito nel modo più conveniente con la gnm::gnmfunzione, in quanto consente di eseguire modelli statistici. (Modifica: puoi anche usare la prefmod::llbt.fitfunzione, che è un po 'più semplice in quanto richiede solo i conteggi e la matrice del design.)

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

Si noti che il termine di eliminazione ometterà i parametri di disturbo dal riepilogo. È quindi possibile ottenere i parametri del valore (i tuoi delta) come

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

E puoi complottarli

R> plotworth(wmat)

Se hai molti oggetti e vuoi scrivere o1+o2+...+onvelocemente un oggetto formula , puoi usarlo

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

per generare la formula per gnm(di cui non avresti bisogno llbt.fit).

C'è un articolo JSS , vedere anche https://r-forge.r-project.org/projects/prefmod/ e la documentazione tramite ?llbt.design.


1
Questa è una risposta molto approfondita. Grazie. Sembra che prefmod sarebbe un buon pacchetto da usare. Sono interessato a utilizzare il modello per cercare di prevedere i risultati delle partite sportive, tra l'altro.
Silverfish

Nessun problema, felice se mi ha aiutato. Non so esattamente come intendi prevedere, ma Leitner et al. hanno usato questi modelli per prevedere eventi sportivi. Vedi la sua tesi epubdev.wu.ac.at/2925 . In bocca al lupo.
Momo,

Forse questo link è meglio epubdev.wu.ac.at/view/creators/…
Momo

È possibile calcolare i significati per le differenze tra le singole coppie (es. O1 e o2) da questi dati? Oppure devi riorganizzare la formula, utilizzare o2 come ultimo fattore e vivere senza una stima Std.error in quel caso?
TNT,

1
È passato un po 'di tempo, quindi non ricordo se puoi usare convenientemente le restrizioni lineari, ma ciò che puoi fare nel tuo caso è usare uno come livello di riferimento, diciamo o1, e usa il valore t dell'altro, diciamo o2, dal riassunto - costituisce effettivamente un test se la differenza tra o1 e o2 è zero.
Momo,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.