พล็อตการวิเคราะห์สำหรับการนับถอยหลัง


88

แปลงวินิจฉัย (และการทดสอบอย่างเป็นทางการ) คุณพบว่าข้อมูลส่วนใหญ่สำหรับการถดถอยที่ผลเป็นตัวแปรนับ?

ฉันสนใจเป็นพิเศษใน Poisson และแบบจำลอง Binomial เชิงลบเช่นเดียวกับ counterparts ที่สูงเกินจริงและกีดขวางของแต่ละ แหล่งที่มาส่วนใหญ่ที่ฉันได้พบเพียงแค่พล็อตส่วนที่เหลือเทียบกับค่าติดตั้งโดยไม่ต้องพูดคุยเกี่ยวกับสิ่งที่แปลงเหล่านี้ "ควร" ดูเหมือน

ภูมิปัญญาและการอ้างอิงชื่นชมอย่างมาก เรื่องราวย้อนกลับไปในเหตุผลที่ผมถามนี้ถ้ามันมีความเกี่ยวข้องเป็นคำถามอื่น ๆ ของฉัน

การอภิปรายที่เกี่ยวข้อง:

คำตอบ:


101

นี่คือสิ่งที่ฉันมักจะชอบทำ (สำหรับภาพประกอบฉันใช้ข้อมูลเกินกำหนดและไม่ได้จำลองข้อมูลควินอย่างง่าย ๆ ในสมัยของนักเรียนที่ขาดเรียนMASS)

  1. ทดสอบและจัดทำกราฟข้อมูลนับต้นฉบับโดยการพล็อตความถี่ที่สังเกตได้และความถี่ที่พอดี (ดูบทที่ 2 เป็นมิตร ) ซึ่งได้รับการสนับสนุนโดยvcdแพ็คเกจในRชิ้นส่วนขนาดใหญ่ ตัวอย่างเช่นด้วยgoodfitและrootogram:

    library(MASS)
    library(vcd)
    data(quine) 
    fit <- goodfit(quine$Days) 
    summary(fit) 
    rootogram(fit)
    

    หรือพล็อต Ordซึ่งช่วยในการระบุตัวแบบข้อมูลนับที่เป็นพื้นฐาน (เช่นตรงนี้ความชันเป็นบวกและการสกัดกั้นเป็นบวกซึ่งพูดถึงการแจกแจงแบบทวินามลบ):

    Ord_plot(quine$Days)

    หรือพล็อต"XXXXXXness"ที่ XXXXX เป็นการกระจายตัวเลือกให้พูดพล็อต Poissoness (ซึ่งพูดกับปัวซองลองดูด้วยtype="nbinom"):

    distplot(quine$Days, type="poisson")
  2. ตรวจสอบการวัดความดีตามปกติ(เช่นสถิติอัตราส่วนความน่าจะเป็นเทียบกับโมเดลแบบโมฆะหรือคล้ายกัน):

    mod1 <- glm(Days~Age+Sex, data=quine, family="poisson")
    summary(mod1)
    anova(mod1, test="Chisq")
    
  3. ตรวจสอบเกิน / ต่ำกว่าโดยดูจากresidual deviance/dfสถิติทดสอบอย่างเป็นทางการ (เช่นดูคำตอบนี้ ) ที่นี่เรามีการทับซ้อนอย่างชัดเจน:

    library(AER)
    deviance(mod1)/mod1$df.residual
    dispersiontest(mod1)
    
  4. ตรวจสอบคะแนนที่มีอิทธิพลและงัดเช่นinfluencePlotในcarแพ็คเกจ แน่นอนว่าที่นี่มีหลายจุดที่มีอิทธิพลสูงเพราะปัวซองเป็นนางแบบที่ไม่ดี:

    library(car)
    influencePlot(mod1)
    
  5. ตรวจสอบอัตราเงินเฟ้อเป็นศูนย์โดยการปรับรูปแบบข้อมูลการนับและการเทียบเคียง zeroinflated / hurdle และเปรียบเทียบกับพวกมัน (ปกติกับ AIC) ที่นี่โมเดลพองเกินศูนย์จะพอดีกับปัวซองแบบง่าย ๆ (อาจเป็นเพราะ overdispersion):

    library(pscl)
    mod2 <- zeroinfl(Days~Age+Sex, data=quine, dist="poisson")
    AIC(mod1, mod2)
    
  6. พล็อตส่วนที่เหลือ (ดิบเบี่ยงเบนหรือปรับสัดส่วน) บนแกน y เทียบกับค่าที่ทำนาย (บันทึก) (หรือตัวทำนายเชิงเส้น) บนแกน x ที่นี่เราเห็นเศษเหลือใช้ที่มีขนาดใหญ่มากและการเบี่ยงเบนที่เหลืออยู่ของค่าเบี่ยงเบนจากค่าปกติ (พูดกับปัวซอง; แก้ไข: @ คำตอบของ FlorianHartig แสดงให้เห็นว่าไม่ต้องคาดหวังว่ากฎเกณฑ์ทั่วไปของสิ่งตกค้างเหล่านี้

    res <- residuals(mod1, type="deviance")
    plot(log(predict(mod1)), res)
    abline(h=0, lty=2)
    qqnorm(res)
    qqline(res)
    
  7. หากสนใจพล็อตครึ่งพล็อตน่าจะเป็นปกติของเศษโดยพล็อตที่สั่งซื้อเหลือแน่นอนเมื่อเทียบกับค่าปกติคาดว่าแอตกินสัน (1981) คุณสมบัติพิเศษคือการจำลอง 'เส้น' และซองจดหมายอ้างอิงที่มีช่วงความเชื่อมั่นแบบจำลอง / bootstrapped (ไม่แสดงแม้ว่า):

    library(faraway)
    halfnorm(residuals(mod1))
    
  8. แปลงการวินิจฉัยสำหรับโมเดลเชิงเส้นบันทึกสำหรับข้อมูลนับ (ดูบทที่ 7.2 และ 7.7 ในหนังสือของ Friendly) พล็อตที่คาดการณ์ไว้กับค่าที่สังเกตได้อาจจะมีการประมาณช่วงเวลา (ฉันแค่สำหรับกลุ่มอายุ - ที่นี่เราเห็นอีกครั้งว่าเราค่อนข้างห่างไกลจากการคาดการณ์ของเราเนื่องจากการกระจายตัวมากเกินไปบางทีในกลุ่ม F3 จุดสีชมพู การทำนายจุดข้อผิดพลาดมาตรฐานหนึ่งข้อ):±

    plot(Days~Age, data=quine) 
    prs  <- predict(mod1, type="response", se.fit=TRUE)
    pris <- data.frame("pest"=prs[[1]], "lwr"=prs[[1]]-prs[[2]], "upr"=prs[[1]]+prs[[2]])
    points(pris$pest ~ quine$Age, col="red")
    points(pris$lwr  ~ quine$Age, col="pink", pch=19)
    points(pris$upr  ~ quine$Age, col="pink", pch=19)
    

สิ่งนี้ควรให้ข้อมูลที่เป็นประโยชน์เกี่ยวกับการวิเคราะห์ของคุณและขั้นตอนส่วนใหญ่ทำงานให้กับการแจกแจงข้อมูลมาตรฐานทั้งหมด (เช่น Poisson, Negative Binomial, COM Poisson, Power Laws)


6
คำตอบที่ดีอย่างยิ่ง! การใช้การวินิจฉัยเหล่านี้กับข้อมูลที่จำลองโดยปัวซงก็ช่วยได้ด้วยเช่นกันเพื่อช่วยในการฝึกตาของฉันในสิ่งที่แปลงควรมีลักษณะอย่างไร
ครึ่ง

ฉันควรจะให้คำอธิบายเพิ่มเติมเกี่ยวกับสิ่งที่แปลงทำหรือไม่เป็นเช่นนั้น?
Momo

2
หมายเหตุด้านที่น่าสนใจ: ฉันพบว่าการกระจาย NB แทบจะไม่ปรากฏขึ้นเพื่อให้พอดีกับข้อมูล NB จำลองตามการทดสอบ GOF, rootogram, Ord plot และพล็อต NB-ness ข้อยกเว้นน่าจะเป็น "NB" เชื่องมากข้อมูลที่เกือบจะสมมาตร - mu สูง theta สูง
half-pass

1
หืมแน่ใจว่าคุณใช้ type = "nbinomial" เป็นอาร์กิวเมนต์? เช่น fm <- glm.nb (วัน ~., data = quine); dummy <- rnegbin (ติดตั้ง (fm), theta = 4.5) ทำงานได้ดี
Momo

@ โมโมขอบคุณ - ฉันทำบางอย่างเช่น x = rnegbin (n = 1,000, mu = 10, theta = 1); พอดี = goodfit (x, type = "nbinomial"); สรุป (พอดี) การตั้งค่า theta = 4.5 นั้นเป็นการปรับปรุงความพอดี แต่ก็ยังคงบ่อยครั้งที่ p <0.05 และรูปกราฟอาจดูไม่ดีนัก ดังนั้นฉันจึงเข้าใจความแตกต่างระหว่างแบบจำลองของเรา: ในตัวคุณค่าจำลองแต่ละตัวถูกจำลองจากพารามิเตอร์ค่าเฉลี่ยที่แตกต่างกัน (ค่าในการติดตั้ง (fm)) ใช่ไหม ในของฉันพวกเขาทั้งหมดมีค่าเฉลี่ย 10
ครึ่งผ่าน

14

สำหรับวิธีการใช้พล็อตการวินิจฉัยมาตรฐาน แต่ต้องการทราบว่าควรมีลักษณะอย่างไรฉันชอบกระดาษ:

 Buja, A., Cook, D. Hofmann, H., Lawrence, M. Lee, E.-K., Swayne,
 D.F and Wickham, H. (2009) Statistical Inference for exploratory
 data analysis and model diagnostics Phil. Trans. R. Soc. A 2009
 367, 4361-4383 doi: 10.1098/rsta.2009.0120

หนึ่งในวิธีการที่กล่าวถึงนั้นคือการสร้างชุดข้อมูลจำลองหลายชุดที่สมมติฐานของความสนใจเป็นจริงและสร้างแผนการวินิจฉัยสำหรับชุดข้อมูลจำลองเหล่านี้และสร้างพล็อตการวินิจฉัยสำหรับข้อมูลจริง วางแปลงทั้งหมดเหล่านี้บนหน้าจอในเวลาเดียวกัน (สุ่มวางบนพื้นฐานของข้อมูลจริง) ตอนนี้คุณมีการอ้างอิงแบบเห็นภาพของสิ่งที่แปลงควรมีลักษณะอย่างไรและหากสมมติฐานมีไว้สำหรับข้อมูลจริงดังนั้นพล็อตนั้นควรมีลักษณะเหมือนกับที่อื่น ๆ (ถ้าคุณไม่สามารถบอกได้ว่าข้อมูลใดเป็นของจริง มากพอที่จะเป็นจริง) แต่ถ้าพล็อตข้อมูลจริงมีลักษณะที่แตกต่างจากที่อื่นอย่างชัดเจนนั่นหมายความว่าสมมติฐานอย่างน้อยหนึ่งข้อไม่มีอยู่ vis.testฟังก์ชั่นในแพคเกจสำหรับ TeachingDemos R ช่วยดำเนินการนี้เป็นแบบทดสอบ


6
ตัวอย่างที่มีข้อมูลข้างต้นสำหรับบันทึก: mod1 <- glm (Days ~ Age + Sex, data = quine, family = "poisson"); if (interactive ()) {vis.test (ส่วนที่เหลือ (mod1, type = "response"), vt.qqnorm, nrow = 5, ncol = 5, npage = 3)}
half-pass

13

นี่เป็นคำถามเก่า แต่ฉันคิดว่ามันจะมีประโยชน์ที่จะเพิ่มว่าแพคเกจ DHARMa R ของฉัน (มีให้จาก CRAN ดูที่นี่ ) ตอนนี้ให้ส่วนที่เหลือมาตรฐานสำหรับ GLMs และ GLMM ตามวิธีการจำลองคล้ายกับที่ @GregSnow แนะนำ .

จากคำอธิบายแพคเกจ:

แพคเกจ DHARMa ใช้วิธีการจำลองที่ใช้ในการสร้างสเกลเศษที่สามารถตีความได้อย่างง่ายดายจากโมเดลเชิงเส้นผสมทั่วไป ปัจจุบันได้รับการสนับสนุนคือคลาส 'merMod' ทั้งหมดจาก 'lme4' ('lmerMod', 'glmerMod'), 'glm' (รวมถึง 'negbin' จาก 'MASS' แต่ไม่รวมถึงการกระจายแบบกึ่ง) และคลาสโมเดล 'lm' อีกวิธีหนึ่งคือการจำลองที่สร้างขึ้นจากภายนอกเช่นการจำลองการคาดการณ์หลังจากซอฟต์แวร์ Bayesian เช่น 'JAGS', 'STAN' หรือ 'BUGS' สามารถประมวลผลได้เช่นกัน ค่าผลลัพธ์ที่เหลือจะได้มาตรฐานตามค่าระหว่าง 0 ถึง 1 และสามารถตีความได้ว่าเป็นค่าส่วนที่เหลือจากการถดถอยเชิงเส้น แพคเกจนี้ยังมีพล็อตและฟังก์ชั่นการทดสอบจำนวนมากสำหรับปัญหาการระบุผิดพลาดของโมเดลทั่วไป

@Momo - คุณอาจต้องการอัปเดตคำแนะนำของคุณ 6 มันทำให้เข้าใจผิด เรื่องธรรมดาสามัญของความเบี่ยงเบนเหลืออยู่โดยทั่วไปไม่คาดหวังภายใต้ปัวซองตามที่อธิบายไว้ในบทความ DHARMaหรือที่นี่ ; และการมองหาค่าเบี่ยงเบนความเบี่ยงเบน (หรือค่ามาตรฐานอื่น ๆ ) ที่แตกต่างจากเส้นตรงในพล็อต qqnorm ดังนั้นโดยทั่วไปจึงไม่ต้องกังวลเลย แพ็กเกจ DHARMa จัดทำแผน qq ที่เชื่อถือได้สำหรับการวินิจฉัยความเบี่ยงเบนจาก Poisson หรือตระกูล GLM อื่น ๆ ผมได้สร้างตัวอย่างที่แสดงให้เห็นปัญหาที่เกิดขึ้นกับสิ่งตกค้างอันซ์ที่นี่


4

มีฟังก์ชั่นที่เรียกว่าglm.diag.plotsในแพ็คเกจbootเพื่อสร้างแผนการวินิจฉัยสำหรับ GLM มันทำอะไร:

จัดทำพล็อตของ jackknife deviance เทียบกับตัวทำนายแบบเชิงเส้น, พล็อตคะแนนปกติของส่วนเบี่ยงเบนมาตรฐาน, พล็อตของสถิติการทำอาหารโดยประมาณต่อเลเวอเรจ / (1-leverage) และพล็อตเรื่องสถิติของ Cook

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.