ใช้ glm () แทนการทดสอบไคสแควร์อย่างง่าย


15

ฉันสนใจที่จะเปลี่ยนสมมติฐานว่างที่ใช้glm()ใน R

ตัวอย่างเช่น:

x = rbinom(100, 1, .7)  
summary(glm(x ~ 1, family = "binomial"))

การทดสอบสมมติฐานที่ว่า0.5 ถ้าฉันต้องการเปลี่ยนค่า null เป็น = ค่าที่กำหนดเองภายในจะทำอย่างไร p=0.5pglm()

ฉันรู้ว่าสิ่งนี้สามารถทำได้ด้วยprop.test()และchisq.test()แต่ฉันต้องการสำรวจความคิดของการใช้glm()เพื่อทดสอบสมมติฐานทั้งหมดที่เกี่ยวข้องกับข้อมูลเด็ดขาด


7
+1 เห็นได้ชัดว่าหมายถึงพารามิเตอร์ Binomial แสดงเป็นความน่าจะเป็น ตั้งแต่การเชื่อมโยงธรรมชาติ (และหนึ่งที่ใช้โดยค่าเริ่มต้น) เป็น logit เพื่อหลีกเลี่ยงความสับสนมันเป็นสิ่งสำคัญที่จะแยกแยะPจาก logit ซึ่งเป็นบันทึกอัตราต่อรองเข้าสู่ระบบ( P / ( 1 - P ) ) pglmplog(p/(1p))
whuber

คำตอบ:


19

คุณสามารถใช้อ็อฟเซ็ต : glmด้วยfamily="binomial"พารามิเตอร์การประมาณค่าในอัตราการเข้าสู่ระบบหรือระดับการบันทึกดังนั้นสอดคล้องกับอัตราการเข้าสู่ระบบที่ 0 หรือความน่าจะเป็น 0.5 หากคุณต้องการที่จะเปรียบเทียบกับความน่าจะเป็นของPคุณต้องการให้ค่าพื้นฐานที่จะเป็นQ = logit ( P ) = บันทึก( P / ( 1 - P ) ) แบบจำลองทางสถิติอยู่ในขณะนี้β0=0pq=logit(p)=log(p/(1p))

Y~Binom(μ)μ=1/(1+ประสบการณ์(-η))η=β0+Q

ที่มีการเปลี่ยนแปลงเฉพาะบรรทัดสุดท้ายจากการตั้งค่ามาตรฐาน ในรหัส R:

  • ใช้offset(q)ในสูตร
  • ฟังก์ชัน logit / log-odds คือ qlogis(p)
  • น่ารำคาญเล็กน้อยคุณต้องให้ค่าออฟเซ็ตสำหรับแต่ละองค์ประกอบในตัวแปรตอบกลับ - R จะไม่จำลองค่าคงที่ให้คุณโดยอัตโนมัติ ซึ่งจะดำเนินการดังต่อไปนี้โดยการตั้งค่ากรอบข้อมูล rep(q,100)แต่คุณก็สามารถใช้
x = rbinom(100, 1, .7)
dd <- data.frame(x, q = qlogis(0.7)) 
summary(glm(x ~ 1 + offset(q), data=dd, family = "binomial"))

2
(+1) สิ่งนี้จะให้การทดสอบ Wald กับคุณ LRT สามารถปรับให้เหมาะกับรุ่นที่ไม่มีค่าglm(y ~ offset(q)-1, family=binomial, data=dd)และใช้lrtestจากlmtestแพ็คเกจได้ การทดสอบไคสแควร์ของเพียร์สันคือการทดสอบคะแนนสำหรับโมเดล GLM Wald / LRT / Score เป็นการทดสอบที่สอดคล้องกันและควรให้ข้อสรุปที่เท่าเทียมกันในขนาดตัวอย่างที่มีขนาดใหญ่พอสมควร
AdamO

1
ฉันคิดว่าคุณสามารถใช้anova()จาก base R บน glm เพื่อรับการทดสอบ LR
Ben Bolker

ที่น่าสนใจฉันเสียนิสัยในการใช้ ANOVA อย่างไรก็ตามฉันสังเกตว่า anova ปฏิเสธที่จะพิมพ์ค่าสำหรับการทดสอบในขณะที่lrtestทำ
AdamO

2
อาจจะanova(.,test="Chisq")?
Ben Bolker

6

ดูช่วงความมั่นใจสำหรับพารามิเตอร์ของ GLM ของคุณ:

> set.seed(1)
> x = rbinom(100, 1, .7)
> model<-glm(x ~ 1, family = "binomial")
> confint(model)
Waiting for profiling to be done...
    2.5 %    97.5 % 
0.3426412 1.1862042 

นี่เป็นช่วงความเชื่อมั่นสำหรับอัตราต่อรอง

พี=0.5เข้าสู่ระบบ(โอdds)=เข้าสู่ระบบพี1-พี=เข้าสู่ระบบ1=0พี=0.5

พี


1
พี<0.05

2
confintพี<0,05

2

มันไม่ถูกต้อง / ถูกต้อง (ทั้งหมด) ที่จะใช้ค่า p ตามค่า z- / t-values ​​ในฟังก์ชัน glm.s บทสรุปเป็นการทดสอบสมมติฐาน

  1. มันเป็นภาษาที่สับสน ค่าที่รายงานมีชื่อว่า z-values แต่ในกรณีนี้พวกเขาใช้ข้อผิดพลาดมาตรฐานโดยประมาณแทนที่ส่วนเบี่ยงเบนจริง ดังนั้นในความเป็นจริงพวกเขามีความใกล้ชิดกับเสื้อค่า เปรียบเทียบเอาต์พุตสามรายการต่อไปนี้:
    1) summary.glm
    2) t-test
    3) z-test

    > set.seed(1)
    > x = rbinom(100, 1, .7)
    
    > coef1 <- summary(glm(x ~ 1, offset=rep(qlogis(0.7),length(x)), family = "binomial"))$coefficients
    > coef2 <- summary(glm(x ~ 1, family = "binomial"))$coefficients
    
    > coef1[4]  # output from summary.glm
    [1] 0.6626359
    > 2*pt(-abs((qlogis(0.7)-coef2[1])/coef2[2]),99,ncp=0) # manual t-test
    [1] 0.6635858
    > 2*pnorm(-abs((qlogis(0.7)-coef2[1])/coef2[2]),0,1) # manual z-test
    [1] 0.6626359
  2. พวกเขาไม่ใช่ค่า p ที่แน่นอน การคำนวณที่แน่นอนของค่า p โดยใช้การแจกแจงแบบทวินามจะทำงานได้ดีขึ้น (ด้วยพลังการคำนวณในทุกวันนี้นี่ไม่ใช่ปัญหา) การแจกแจงแบบ t โดยสมมติว่าการแจกแจงแบบเกาส์ของข้อผิดพลาดนั้นไม่ถูกต้อง (มันประเมินค่า p เกินกว่าระดับอัลฟาเกิดขึ้นน้อยกว่าใน "ความจริง") ดูการเปรียบเทียบต่อไปนี้:

    # trying all 100 possible outcomes if the true value is p=0.7
    px <- dbinom(0:100,100,0.7)
    p_model = rep(0,101)
    for (i in 0:100) {
      xi = c(rep(1,i),rep(0,100-i))
      model = glm(xi ~ 1, offset=rep(qlogis(0.7),100), family="binomial")
      p_model[i+1] = 1-summary(model)$coefficients[4]
    }
    
    
    # plotting cumulative distribution of outcomes
    outcomes <- p_model[order(p_model)]
    cdf <- cumsum(px[order(p_model)])
    plot(1-outcomes,1-cdf, 
         ylab="cumulative probability", 
         xlab= "calculated glm p-value",
         xlim=c(10^-4,1),ylim=c(10^-4,1),col=2,cex=0.5,log="xy")
    lines(c(0.00001,1),c(0.00001,1))
    for (i in 1:100) {
      lines(1-c(outcomes[i],outcomes[i+1]),1-c(cdf[i+1],cdf[i+1]),col=2)
    #  lines(1-c(outcomes[i],outcomes[i]),1-c(cdf[i],cdf[i+1]),col=2)
    }
    
    title("probability for rejection as function of set alpha level")

    CDF ของการปฏิเสธโดยอัลฟา

    เส้นโค้งสีดำแสดงถึงความเท่าเทียมกัน เส้นโค้งสีแดงอยู่ด้านล่าง นั่นหมายความว่าสำหรับค่า p ที่คำนวณได้ที่กำหนดโดยฟังก์ชันสรุป glm เราพบว่าสถานการณ์นี้ (หรือความแตกต่างที่ใหญ่กว่า) มักจะน้อยกว่าความเป็นจริงที่ p-value ระบุ


อืม .. ฉันอาจสับสนเกี่ยวกับเหตุผลในการใช้การแจกแจงแบบ T สำหรับ GLM คุณช่วยถามคำถามที่เกี่ยวข้องที่ฉันเพิ่งถามที่นี่ได้ไหม
AdamO

2
คำตอบนี้น่าสนใจ แต่มีปัญหา (1) OP ไม่ได้ถามเกี่ยวกับความแตกต่างระหว่างคะแนน, ไค - สแควร์, "แน่นอน" หรือวิธีการที่อิง GLM เพื่อทดสอบสมมติฐานเกี่ยวกับการตอบสนองแบบทวินาม (พวกเขาอาจรู้สิ่งนี้ทั้งหมดแล้ว) ดังนั้นนี่ไม่ใช่ ' ไม่ตอบคำถามที่ถาม (2) การประมาณค่าความแปรปรวนที่เหลือ ฯลฯ มีชุดของสมมติฐานที่แตกต่างกันและการสุ่มตัวอย่างแบบกระจายจากแบบจำลองเชิงเส้น (เช่นใน @ คำถามของ AdamO) ดังนั้นการใช้การทดสอบ t-debatable ...
Ben Bolker

2
(3) 'มั่นใจ' ช่วงความเชื่อมั่นสำหรับการตอบสนองแบบทวินามนั้นเป็นเรื่องยาก (ช่วงเวลา 'แน่นอน' [Clopper-Wilson] ค่อนข้างอนุรักษ์นิยมการทดสอบคะแนนอาจทำได้ดีกว่าในบางช่วง
Ben Bolker

@Ben คุณถูกต้องที่ z-test si จริงกว่า t-test กราฟที่แสดงในคำตอบสำหรับการทดสอบ z มันใช้เอาต์พุตของฟังก์ชัน GLM บรรทัดล่างของคำตอบของฉันคือ "p-value" เป็นสิ่งที่ยุ่งยาก ดังนั้นฉันคิดว่ามันจะดีกว่าที่จะคำนวณอย่างชัดเจนเช่นการใช้การแจกแจงแบบปกติแทนที่จะแยก p-value จากฟังก์ชั่น glm ซึ่งได้รับการเลื่อนอย่างสะดวกมากด้วย offset แต่ซ่อนต้นกำเนิดของการคำนวณสำหรับค่า p .
Sextus Empiricus

1
@BenBolker ฉันเชื่อว่าการทดสอบที่แน่นอนนั้นเป็นแบบอนุรักษ์นิยม แต่ ... เพราะในความเป็นจริงเราไม่ได้สุ่มตัวอย่างจากการแจกแจงทวินามที่สมบูรณ์แบบ การทดสอบซีทางเลือกนั้นดีกว่าจากมุมมองเชิงประจักษ์เท่านั้น มันคือว่า "ข้อผิดพลาด" สองตัวยกเลิกซึ่งกันและกัน 1) การแจกแจงทวินามไม่ใช่การกระจายตัวที่แท้จริงในสถานการณ์จริง 2) การแจกแจงแบบ z ไม่ใช่การแสดงออกที่แน่นอนสำหรับการแจกแจงทวินาม เป็นที่น่าสงสัยว่าเราควรจะชอบการแจกแจงที่ไม่ถูกต้องสำหรับแบบจำลองที่ผิดหรือเปล่าเพราะในทางปฏิบัติมันกลับกลายเป็น 'ตกลง'
Sextus Empiricus
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.