ปัญหาในการหาแบบจำลองที่ดีเหมาะสำหรับการนับข้อมูลด้วยเอฟเฟกต์แบบผสม - ZINB หรืออย่างอื่นใช่ไหม


12

ฉันมีชุดข้อมูลขนาดเล็กมากที่มีผึ้งมากมายโดดเดี่ยวที่ฉันมีปัญหาในการวิเคราะห์ มันคือข้อมูลนับและจำนวนเกือบทั้งหมดอยู่ในการรักษาหนึ่งโดยมีศูนย์ส่วนใหญ่ในการรักษาอื่น นอกจากนี้ยังมีค่าสูงสองสามค่า (ค่าละหนึ่งในสองแห่งในหกแห่ง) ดังนั้นการแจกแจงค่าจะมีหางที่ยาวมาก ฉันทำงานในอาร์ฉันใช้แพ็คเกจที่แตกต่างกันสองแบบ: lme4 และ glmmADMB

รูปแบบผสมปัวซองไม่เหมาะสม: แบบจำลองมีการกระจายตัวมากเกินไปเมื่อเอฟเฟกต์แบบสุ่มไม่เหมาะสม (แบบจำลอง GLM) และแบบจำลองที่น้อยเกินไปเมื่อติดตั้งเอฟเฟกต์แบบสุ่ม (รุ่น glmer) ฉันไม่เข้าใจว่าทำไมถึงเป็นเช่นนี้ การออกแบบการทดลองเรียกร้องให้มีเอฟเฟกต์แบบซ้อนกันดังนั้นฉันจึงจำเป็นต้องรวมไว้ด้วย การกระจายข้อผิดพลาดของปัวซอง lognormal ไม่ได้ปรับปรุงให้พอดี ฉันลองใช้การแจกแจงข้อผิดพลาดแบบทวินามลบโดยใช้ glmer.nb และไม่สามารถทำให้พอดี - ถึงขีด จำกัด การวนซ้ำแม้ว่าจะเปลี่ยนความอดทนโดยใช้ glmerControl (tolPwrss = 1e-3)

เนื่องจากเลขศูนย์จำนวนมากจะเกิดจากความจริงที่ว่าฉันไม่เห็นผึ้ง (พวกมันมักจะเป็นสิ่งดำเล็ก ๆ ) ฉันจึงลองแบบจำลองที่ไม่มีการพอง ZIP ไม่พอดี ZINB เป็นแบบจำลองที่ดีที่สุดจนถึงตอนนี้ แต่ฉันก็ยังไม่ค่อยมีความสุขกับแบบจำลอง ฉันตกอยู่ในความสูญเสียว่าจะลองทำอะไรต่อไป ฉันลองใช้แบบจำลองอุปสรรค์ แต่ไม่สามารถกระจายการตัดทอนไปยังผลลัพธ์ที่ไม่เป็นศูนย์ได้ - ฉันคิดว่าเนื่องจากศูนย์จำนวนมากอยู่ในการควบคุมการรักษา (ข้อความแสดงข้อผิดพลาดคือ“ ข้อผิดพลาดใน model.frame.default” (สูตร = s.bee ~ tmt + lu +: ความยาวผันแปรต่างกัน (พบสำหรับ 'การรักษา')”)

นอกจากนี้ฉันคิดว่าการโต้ตอบที่ฉันได้รวมทำสิ่งที่แปลกกับข้อมูลของฉันเนื่องจากค่าสัมประสิทธิ์มีขนาดเล็กเกินจริง - แม้ว่าโมเดลที่มีการโต้ตอบนั้นดีที่สุดเมื่อฉันเปรียบเทียบรุ่นที่ใช้ AICctab ในแพ็คเกจ bbmle

ฉันกำลังรวมสคริปต์ R ที่จะทำซ้ำชุดข้อมูลของฉัน ตัวแปรมีดังนี้:

d = วันที่จูเลียน, df = วันที่จูเลียน (เป็นปัจจัย), d.sq = df กำลังสอง (จำนวนผึ้งเพิ่มขึ้นจากนั้นก็ตกลงไปตลอดฤดูร้อน), st = ไซต์, s.bee = จำนวนผึ้ง, tmt = การรักษา, l = ชนิดของการใช้ที่ดิน, hab = ร้อยละของที่อยู่อาศัยกึ่งธรรมชาติในภูมิทัศน์โดยรอบ, ba = พื้นที่เขตรอบเขตข้อมูล

ข้อเสนอแนะใด ๆ เกี่ยวกับวิธีที่ฉันจะได้รับแบบจำลองที่ดี (การกระจายข้อผิดพลาดทางเลือกชนิดอื่น ๆ ของแบบจำลอง) จะได้รับสุดซึ้งมาก!

ขอบคุณ.

d <- c(80,  80,  121, 121, 180, 180, 86,  86,  116, 116, 144, 144, 74,  74, 143, 143, 163, 163, 71, 71,106, 106, 135, 135, 162, 162, 185, 185, 83,  83,  111, 111, 133, 133, 175, 175, 85,  85,  112, 112,137, 137, 168, 168, 186, 186, 64,  64,  95,  95,  127, 127, 156, 156, 175, 175, 91,  91, 119, 119,120, 120, 148, 148, 56, 56)
df <- as.factor(d)
d.sq <- d^2
st <- factor(rep(c("A", "B", "C", "D", "E", "F"), c(6,12,18,10,14,6)))
s.bee <- c(1,0,0,0,0,0,0,0,1,0,0,0,1,0,0,0,4,0,0,0,0,1,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,3,0,0,0,0,5,0,0,2,0,50,0,10,0,4,0,47,3)
tmt <- factor(c("AF","C","C","AF","AF","C","AF","C","AF","C","C","AF","AF","C","AF","C","AF","C","AF","C",
"C","AF","AF","C","AF","C","C","AF","AF","C","AF","C","AF","C","AF","C","AF","C","AF","C",
"C","AF","AF","C","AF","C","AF","C","AF","C","C","AF","C","AF","C","AF","AF","C","AF","C",
"AF","C","AF","C","AF","C"))
lu <- factor(rep(c("p","a","p","a","p"), c(6,12,28,14,6)))
hab <- rep(c(13,14,13,14,3,4,3,4,3,4,3,4,3,4,15,35,37,35,37,35,37,35,37,0,2,1,2,1,2,1), 
        c(1,2,2,1,1,1,1,2,2,1,1,1,1,1,18,1,1,1,2,2,1,1,1,14,1,1,1,1,1,1))
ba <-  c(480,6520,6520,480,480,6520,855,1603,855,1603,1603,855,855,12526,855,5100,855,5100,2670,7679,7679,2670,
2670,7679,2670,7679,7679,2670,2670,7679,2670,7679,2670,7679,2670,7679,1595,3000,1595,3000,3000,1595,1595,3000,1595
,3000,4860,5460,4860,5460,5460,4860,5460,4860,5460,4860,4840,5460,4840,5460,3000,1410,3000,1410,3000,1410)
data <- data.frame(st,df,d.sq,tmt,lu,hab,ba,s.bee)
with(data, table(s.bee, tmt) )

# below is a much abbreviated summary of attempted models:

library(MASS)
library(lme4)
library(glmmADMB)
library(coefplot2)

###
### POISSON MIXED MODEL

    m1 <- glmer(s.bee ~ tmt + lu + hab + (1|st/df), family=poisson)
    summary(m1)

    resdev<-sum(resid(m1)^2)
    mdf<-length(fixef(m1)) 
    rdf<-nrow(data)-mdf
    resdev/rdf
# 0.2439303
# underdispersed. ???



###
### NEGATIVE BINOMIAL MIXED MODEL

    m2 <- glmer.nb(s.bee ~ tmt + lu + hab + d.sq + (1|st/df))
# iteration limit reached. Can't make a model work.



###
### ZERO-INFLATED POISSON MIXED MODEL

    fit_zipoiss <- glmmadmb(s.bee~tmt + lu + hab + ba + d.sq +
                    tmt:lu +
                    (1|st/df), data=data,
                    zeroInflation=TRUE,
                    family="poisson")
# has to have lots of variables to fit
# anyway Poisson is not a good fit



###
### ZERO-INFLATED NEGATIVE BINOMIAL MIXED MODELS

## BEST FITTING MODEL SO FAR:

    fit_zinb <- glmmadmb(s.bee~tmt + lu + hab +
                    tmt:lu +
                    (1|st/df),data=data,
                    zeroInflation=TRUE,
                    family="nbinom")
    summary(fit_zinb)
# coefficients are tiny, something odd going on with the interaction term
# but this was best model in AICctab comparison

# model check plots
    qqnorm(resid(fit_zinb))
    qqline(resid(fit_zinb))

    coefplot2(fit_zinb)

    resid_zinb <- resid(fit_zinb , type = "pearson")
    hist(resid_zinb)

    fitted_zinb <- fitted (fit_zinb)
    plot(resid_zinb ~ fitted_zinb)


## MODEL WITHOUT INTERACTION TERM - the coefficients are more realistic:

    fit_zinb2 <- glmmadmb(s.bee~tmt + lu + hab +
                    (1|st/df),data=data,
                    zeroInflation=TRUE,
                    family="nbinom")

# model check plots
    qqnorm(resid(fit_zinb2))
    qqline(resid(fit_zinb2))

    coefplot2(fit_zinb2)

    resid_zinb2 <- resid(fit_zinb2 , type = "pearson")
    hist(resid_zinb2)

    fitted_zinb2 <- fitted (fit_zinb2)
    plot(resid_zinb2 ~ fitted_zinb2)



# ZINB models are best so far
# but I'm not happy with the model check plots

2
ฉันรู้ว่านี่เป็นโพสต์เก่ามากและอาจไม่เกี่ยวข้องมากในขณะนี้ แต่ฉันต้องการเน้นว่าจากประสบการณ์ของฉันด้วยปัญหาที่คล้ายกันมากที่ฉันมีเมื่อเร็ว ๆ นี้ส่วนที่เหลือของ glmers ไม่จำเป็นต้องกระจายตามปกติ ดังนั้นการตรวจสอบความเป็นมาตรฐานรวมทั้งการตรวจสอบสิ่งติดตั้งกับสิ่งที่เหลืออยู่จึงไม่จำเป็น โดยทั่วไปการวินิจฉัยแปลงที่เหลือของ glmers เป็นเรื่องยากอย่างไม่น่าเชื่อ
fsociety

คำตอบ:


2

โพสต์นี้มีสี่ปี แต่ฉันต้องการติดตามสิ่งที่ fsociety พูดในความคิดเห็น การวินิจฉัยส่วนที่เหลือใน GLMM นั้นไม่ตรงไปตรงมาเนื่องจากพล็อตส่วนที่เหลือสามารถแสดงแบบไม่ปกติ, heteroscedasticity ฯลฯ แม้ว่าแบบจำลองจะระบุไว้อย่างถูกต้อง มีแพ็คเกจ R ซึ่งDHARMaเหมาะสำหรับการวินิจฉัยรุ่นเหล่านี้โดยเฉพาะ

แพคเกจจะขึ้นอยู่กับวิธีการจำลองในการสร้างส่วนตกค้างที่ปรับขนาดจากโมเดลเชิงเส้นเชิงเส้นทั่วไปที่ติดตั้งและสร้างแปลงวินิจฉัยที่แตกต่างกันได้อย่างง่ายดาย นี่คือตัวอย่างเล็ก ๆ กับข้อมูลจากโพสต์ต้นฉบับและรุ่นที่ติดตั้งครั้งแรก (m1):

library(DHARMa)
sim_residuals <- simulateResiduals(m1, 1000)
plotSimulatedResiduals(sim_residuals)

พล็อตของ DHARMa

พล็อตด้านซ้ายแสดงพล็อต QQ ของสเกลที่เหลือเพื่อตรวจจับความคลาดเคลื่อนจากการแจกแจงที่คาดไว้และพล็อตทางด้านขวาแสดงถึงค่าที่เหลือเทียบกับค่าที่คาดการณ์ไว้ในขณะที่ , 0.50 และ 0.75)

นอกจากนี้แพคเกจยังมีฟังก์ชั่นเฉพาะสำหรับการทดสอบการกระจายตัวสูง / ต่ำและไม่มีอัตราเงินเฟ้อเป็นศูนย์และอื่น ๆ :

testOverdispersionParametric(m1)

Chisq test for overdispersion in GLMMs

data:  poisson
dispersion = 0.18926, pearSS = 11.35600, rdf = 60.00000, p-value = 1
alternative hypothesis: true dispersion greater 1

testZeroInflation(sim_residuals)

DHARMa zero-inflation test via comparison to expected zeros with 
simulation under H0 = fitted model


data:  sim_residuals
ratioObsExp = 0.98894, p-value = 0.502
alternative hypothesis: more
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.