Як підібрати модель Бредлі – Террі – Люсі в R, без складної формули?


9

Модель Бредлі – Террі – Люсі (BTL) зазначає, що , де - ймовірність того, що об'єкт вважається "кращим", важчі тощо, ніж об'єкт , і , і - параметри.pji=логiт-1(δj-δi)pijjiδiδj

Це, здається, є кандидатом на функцію glm, з сімейством = двочлен. Однак формула буде чимось на кшталт "Успіх ~ S1 + S2 + S3 + S4 + ...", де Sn - фіктивна змінна, тобто 1, якщо об'єкт n є першим об'єктом порівняння, -1 якщо це другий, а 0 в іншому випадку. Тоді коефіцієнт Sn був би відповідним .гелтан

Це було б досить просто в управлінні лише кількома об'єктами, але це може призвести до дуже тривалої формули та необхідності створення фіктивної змінної для кожного об'єкта. Мені просто цікаво, чи є простіший метод. Припустимо, що ім'я або кількість двох об'єктів, що порівнюються, є змінними (коефіцієнтами?) Object1, і Object2, і Успіх - 1, якщо об'єкт 1 оцінюється краще, і 0, якщо об'єкт 2 - це.


3
Існує пакет R для моделі Бредлі-Террі. Подивіться на Rseek.
кардинал

Я також представив деякі посилання на пов'язаний з цим питання: stats.stackexchange.com/a/10741/930
CHL

Пакет @cardinal згаданий, btw: BradleyTerry2
кон'югатпріор

Відповіді:


17

Я думаю, що найкращим пакетом даних для парного порівняння (ПК) в R є пакет prefmod , який дозволяє зручно підготувати дані для підгонки (лінійних журналів) BTL-моделей у Р. Він використовує Poisson 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 був би хорошим пакетом для використання. Мені цікаво використовувати модель, щоб спробувати передбачити результати спортивних матчів.
Срібна рибка

Без проблем, радий, якщо це допомогло. Я точно не знаю, як ви маєте намір передбачити, але Leitner та ін. використовували ці моделі для прогнозування спортивних подій. Дивіться його дисертацію epubdev.wu.ac.at/2925 . Удачі.
Момо

Можливо, це посилання краще epubdev.wu.ac.at/view/creators/…
Momo

Чи можна обчислити значущість для відмінностей між окремими парами (наприклад, o1 і o2) від цих даних? Або вам доведеться переставляти формулу, використовувати o2 як останній фактор і жити без оцінки Std.error у такому випадку?
ТНТ

1
Минув деякий час, тому я не пригадую, чи можна зручно використовувати лінійні обмеження, але те, що ви можете зробити у вашому випадку, - це використовувати один як базовий рівень, скажімо, o1, а також використовувати значення t іншого, скажімо, o2, з резюме - це фактично є тестом, чи різниця між o1 і o2 дорівнює нулю.
Момо
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.