Як підібрати модель Бредлі – Террі – Люсі в 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.