ทำอย่างไรจึงจะพอดีกับแบรดลีย์ - เทอร์รี่ - ลูซใน R โดยไม่มีสูตรที่ซับซ้อน?


9

แบรดลีย์ - เทอร์รี่ – ลูซ (BTL) โมเดลกล่าวว่าโดยที่คือความน่าจะเป็นที่วัตถุถูกตัดสินให้เป็น "ดีกว่า", ที่หนักกว่า ฯลฯ กว่า objectและและเป็นพารามิเตอร์พีJผม=ล.โอก.ผมเสื้อ-1(δJ-δผม)พีผมJJผมδผมδJ

ดูเหมือนว่าจะเป็นตัวเลือกสำหรับฟังก์ชัน glm โดยมี family = binomial อย่างไรก็ตามสูตรจะคล้ายกับ "ความสำเร็จ ~ S1 + S2 + S3 + S4 + ... " โดยที่ Sn เป็นตัวแปรจำลองนั่นคือ 1 ถ้าวัตถุ n เป็นวัตถุแรกในการเปรียบเทียบ -1 ถ้าเป็น วินาทีและ 0 เป็นอย่างอื่น แล้วค่าสัมประสิทธิ์ของ Sn จะเป็นที่สอดคล้องdelta_ndอีล.เสื้อan

นี่จะค่อนข้างง่ายในการจัดการกับวัตถุเพียงไม่กี่ตัว แต่อาจนำไปสู่สูตรที่ยาวมากและจำเป็นต้องสร้างตัวแปรจำลองสำหรับแต่ละวัตถุ ฉันแค่สงสัยว่ามีวิธีที่ง่ายกว่านี้หรือไม่ สมมติว่าชื่อหรือหมายเลขของวัตถุทั้งสองที่เปรียบเทียบเป็นตัวแปร (ปัจจัย?) Object1 และ Object2 และความสำเร็จคือ 1 หากวัตถุ 1 ได้รับการตัดสินที่ดีขึ้นและ 0 ถ้าวัตถุ 2 คือ


3
มีแพ็คเกจ R สำหรับรุ่น Bradley-Terry ดู Rseek
พระคาร์ดินัล

ฉันยังให้ลิงก์ในคำถามที่เกี่ยวข้องด้วย: stats.stackexchange.com/a/10741/930
chl

แพคเกจ @ cardinal กล่าวถึง btw: BradleyTerry2
conjugateprior

คำตอบ:


17

ฉันคิดว่าแพคเกจที่ดีที่สุดสำหรับการเปรียบเทียบข้อมูลคู่ (PC) ใน R คือแพ็คเกจ prefmodซึ่งช่วยให้การเตรียมข้อมูลให้พอดี (รุ่นบันทึกเชิงเส้น) BTL ใน R สะดวกใช้ Poisson GLM (แม่นยำมากขึ้นเป็น log multinomial ใน Poisson สูตรดูเช่นการสนทนานี้ )

สิ่งที่ดีคือมันมีฟังก์ชั่น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

โปรดทราบว่าคำว่ากำจัดจะตัดพารามิเตอร์รำคาญออกจากบทสรุป จากนั้นคุณจะได้รับพารามิเตอร์ที่คุ้มค่า (delta ของคุณ) เป็น

## 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 จะเป็นแพ็คเกจที่ใช้งานได้ดี ฉันสนใจที่จะใช้แบบจำลองเพื่อพยายามทำนายผลลัพธ์ของการแข่งขันกีฬาตามวิธี
Silverfish

ไม่มีปัญหาดีใจถ้ามันช่วย ฉันไม่รู้แน่ชัดว่าคุณหมายถึงอะไร แต่ Leitner และคณะ ใช้โมเดลเหล่านี้เพื่อทำนายเหตุการณ์กีฬา ดูวิทยานิพนธ์ของเขาepubdev.wu.ac.at/2925 โชคดี.
Momo

บางทีลิงค์นี้น่าจะดีกว่าepubdev.wu.ac.at/view/creators/…
Momo

เป็นไปได้หรือไม่ที่จะคำนวณความสำคัญสำหรับความแตกต่างระหว่างคู่แต่ละคู่ (เช่น o1 และ o2) จากข้อมูลนี้? หรือคุณต้องจัดเรียงสูตรใหม่ให้ใช้ o2 เป็นปัจจัยสุดท้ายและใช้ชีวิตโดยไม่มีการประมาณ Std.error ในกรณีนั้นหรือไม่?
TNT

1
ฉันไม่จำได้ว่าคุณสามารถใช้การ จำกัด เชิงเส้นได้อย่างสะดวกหรือไม่ แต่สิ่งที่คุณทำได้ในกรณีของคุณคือใช้ระดับอ้างอิงอ้างอิงพูด o1 และใช้ค่า t ของอีกตัวพูด o2 จากบทสรุป - มันถือเป็นการทดสอบอย่างมีประสิทธิภาพว่าความแตกต่างระหว่าง o1 และ o2 เป็นศูนย์หรือไม่
Momo
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.