การทดสอบอัตราส่วนความน่าจะเป็นใน R


25

สมมติว่าฉันจะทำการถดถอยแบบลอจิสติกที่ไม่มีตัวแปรในตัวแปรอิสระหลายตัวเช่นนี้

mod.a <- glm(x ~ a, data=z, family=binominal("logistic"))
mod.b <- glm(x ~ b, data=z, family=binominal("logistic"))

ฉันทำการเปรียบเทียบแบบจำลอง (การทดสอบอัตราส่วนความน่าจะเป็น) เพื่อดูว่าแบบจำลองนั้นดีกว่าตัวแบบโมฆะโดยคำสั่งนี้หรือไม่

1-pchisq(mod.a$null.deviance-mod.a$deviance, mod.a$df.null-mod.a$df.residual)

จากนั้นฉันสร้างโมเดลอื่นพร้อมตัวแปรทั้งหมดในนั้น

mod.c <- glm(x ~ a+b, data=z, family=binomial("logistic"))

เพื่อดูว่าตัวแปรมีนัยสำคัญทางสถิติในโมเดลหลายตัวแปรหรือไม่ฉันใช้lrtestคำสั่งจากepicalc

lrtest(mod.c,mod.a) ### see if variable b is statistically significant after adjustment of a
lrtest(mod.c,mod.b) ### see if variable a is statistically significant after adjustment of b

ฉันสงสัยว่าpchisqวิธีการและlrtestวิธีการนั้นเทียบเท่ากับการทำแบบทดสอบ loglikelihood หรือไม่? ในขณะที่ฉันไม่ทราบวิธีการใช้lrtestสำหรับปลดล็อคแบบจำลองโลจิสติก


@Gavin ขอบคุณที่เตือนฉันเมื่อเทียบกับ stackoverflow ฉันต้องใช้เวลามากขึ้นในการ "แยกย่อย" คำตอบก่อนตัดสินใจว่าคำตอบนั้นเหมาะสมหรือไม่ขอบคุณอีกครั้ง
lokheart

ฉันจะไม่แนะนำให้ใช้ waldtest จาก lmtest ใช้แพ็คเกจ aod สำหรับการทดสอบแบบจำลอง มันตรงไปตรงมามากขึ้น cran.r-project.org/web/packages/aod/aod.pdf
Mr. Nobody

epicalcถูกลบ ( แหล่งที่มา ) lmtestทางเลือกที่อาจจะ
Martin Thoma

คำตอบ:


21

โดยพื้นฐานแล้วใช่ให้คุณใช้ความแตกต่างที่ถูกต้องในบันทึกความเป็นไปได้:

> library(epicalc)
> model0 <- glm(case ~ induced + spontaneous, family=binomial, data=infert)
> model1 <- glm(case ~ induced, family=binomial, data=infert)
> lrtest (model0, model1)
Likelihood ratio test for MLE method 
Chi-squared 1 d.f. =  36.48675 , P value =  0 
> model1$deviance-model0$deviance
[1] 36.48675

และไม่ใช่ความเบี่ยงเบนของโมเดลแบบ nullซึ่งเหมือนกันในทั้งสองกรณี จำนวนของ df คือจำนวนของพารามิเตอร์ที่แตกต่างกันระหว่างสองรุ่นซ้อนกันที่นี่ df = 1 BTW คุณสามารถดูซอร์สโค้ดได้lrtest()โดยพิมพ์

> lrtest

ที่พรอมต์ R


ขอบคุณและฉันเพิ่งพบว่าฉันสามารถใช้ glm (output ~ NULL, data = z, family = binomial ("logistic")) สำหรับการสร้างแบบจำลอง NULL และฉันสามารถใช้ lrtest หลังจากนั้น FYI ขอบคุณอีกครั้ง
lokheart

2
@lokheart anova(model1, model0)ก็จะทำงานเช่นกัน
chl

5
@lokheart glm(output ~ 1, data=z, family=binomial("logistic"))จะเป็นรูปแบบโมฆะที่เป็นธรรมชาติมากขึ้นซึ่งบอกว่าoutputถูกอธิบายโดยคำศัพท์ที่คงที่ (การสกัดกั้น) / การสกัดกั้นนั้นมีความหมายโดยนัยในแบบจำลองทั้งหมดของคุณดังนั้นคุณกำลังทดสอบผลกระทบaหลังจากการบัญชีสำหรับการสกัดกั้น
Reinstate Monica - G. Simpson

หรือคุณสามารถทำได้ด้วยตนเอง "ด้วยตนเอง": p-value ของการทดสอบ LR = 1-pchisq (deviance, อานนท์)
Umka

22

อีกทางเลือกหนึ่งคือlmtestแพ็คเกจซึ่งมีlrtest()ฟังก์ชั่นที่ยอมรับรุ่นเดียว นี่คือตัวอย่างจาก?lrtestในlmtestแพ็คเกจซึ่งมีไว้สำหรับ LM แต่มีวิธีการที่ทำงานกับ GLM ได้:

> require(lmtest)
Loading required package: lmtest
Loading required package: zoo
> ## with data from Greene (1993):
> ## load data and compute lags
> data("USDistLag")
> usdl <- na.contiguous(cbind(USDistLag, lag(USDistLag, k = -1)))
> colnames(usdl) <- c("con", "gnp", "con1", "gnp1")
> fm1 <- lm(con ~ gnp + gnp1, data = usdl)
> fm2 <- lm(con ~ gnp + con1 + gnp1, data = usdl)
> ## various equivalent specifications of the LR test
>
> ## Compare two nested models
> lrtest(fm2, fm1)
Likelihood ratio test

Model 1: con ~ gnp + con1 + gnp1
Model 2: con ~ gnp + gnp1
  #Df  LogLik Df  Chisq Pr(>Chisq)    
1   5 -56.069                         
2   4 -65.871 -1 19.605  9.524e-06 ***
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1   1 
>
> ## with just one model provided, compare this model to a null one
> lrtest(fm2)
Likelihood ratio test

Model 1: con ~ gnp + con1 + gnp1
Model 2: con ~ 1
  #Df   LogLik Df  Chisq Pr(>Chisq)    
1   5  -56.069                         
2   2 -119.091 -3 126.04  < 2.2e-16 ***
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1   1 

+1 เป็นสิ่งที่ดีที่จะรู้ (และดูเหมือนว่าฉันลืมแพคเกจนั้น)
chl

2
@GavinSimpson นี่อาจดูไร้สาระ แต่คุณจะตีความผลลัพธ์ 'lrtest (fm2, fm1)' ได้อย่างไร รุ่น 2 แตกต่างจากรุ่น 1 อย่างมีนัยสำคัญดังนั้นการเพิ่มตัวแปร con1 มีประโยชน์หรือไม่ หรือ lrtest (fm2) กำลังบอกว่าโมเดล 2 นั้นแตกต่างจากโมเดล 1 อย่างมากหรือไม่? แต่รุ่นไหนดีกว่ากัน?
Kerry

5
@Kerry มีโอกาสเข้าสู่ระบบลดลงและด้วยเหตุนี้เป็นแบบที่ด้อยกว่าfm1 fm2LRT กำลังบอกเราว่าระดับที่เราทำfm1โมเดลด้อยกว่าfm2ขนาดใหญ่โดยไม่คาดคิดถ้าเงื่อนไขที่แตกต่างระหว่างโมเดลมีประโยชน์ (อธิบายการตอบสนอง) lrtest(fm2)ไม่ได้เมื่อเทียบกับfm1ในทุกรูปแบบจะถูกเมื่อเทียบกับในกรณีที่ว่าถ้าตามที่ระบุไว้ในการส่งออกนี้:fm2 con ~ 1ตัวแบบนั้นเป็นแบบโมฆะบอกว่าตัวทำนายที่ดีที่สุดconคือค่าเฉลี่ยตัวอย่างของcon(ค่าตัด / คงที่)
Reinstate Monica - G. Simpson
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.