¿Problemas para encontrar un buen modelo adecuado para los datos de conteo con efectos mixtos: ZINB o algo más?


12

Tengo un conjunto de datos muy pequeño sobre la abundancia de abejas solitarias que estoy teniendo problemas para analizar. Son datos de recuento, y casi todos los recuentos están en un tratamiento con la mayoría de los ceros en el otro tratamiento. También hay un par de valores muy altos (uno en cada uno de los seis sitios), por lo que la distribución de los recuentos tiene una cola extremadamente larga. Estoy trabajando en R. He usado dos paquetes diferentes: lme4 y glmmADMB.

Los modelos mixtos de Poisson no se ajustaban: los modelos se dispersaban demasiado cuando no se ajustaban los efectos aleatorios (modelo glm) y se dispersaban poco cuando se ajustaban los efectos aleatorios (modelo glmer). No entiendo por qué es esto. El diseño experimental requiere efectos aleatorios anidados, así que necesito incluirlos. Una distribución de error lognormal de Poisson no mejoró el ajuste. Intenté la distribución de error binomial negativa usando glmer.nb y no pude ajustarla: se alcanzó el límite de iteración, incluso cuando cambié la tolerancia usando glmerControl (tolPwrss = 1e-3).

Debido a que muchos de los ceros se deben al hecho de que simplemente no vi las abejas (a menudo son pequeñas cosas negras), luego probé un modelo inflado a cero. El ZIP no encajaba bien. El ZINB fue el mejor ajuste del modelo hasta ahora, pero todavía no estoy muy contento con el ajuste del modelo. No sé qué probar a continuación. Intenté un modelo de obstáculo, pero no pude ajustar una distribución truncada a los resultados distintos de cero. Creo que porque muchos de los ceros están en el tratamiento de control (el mensaje de error fue "Error en model.frame.default (fórmula = s.bee ~ tmt + lu +: las longitudes variables difieren (se encuentran para 'tratamiento') ”).

Además, creo que la interacción que he incluido está haciendo algo extraño para mis datos, ya que los coeficientes son poco realistas, aunque el modelo que contiene la interacción fue mejor cuando comparé modelos que usan AICctab en el paquete bbmle.

Incluyo un script R que reproducirá prácticamente mi conjunto de datos. Las variables son las siguientes:

d = fecha juliana, df = fecha juliana (como factor), d.sq = df al cuadrado (el número de abejas aumenta y luego cae durante el verano), st = sitio, s.bee = conteo de abejas, tmt = tratamiento, lu = tipo de uso del suelo, hab = porcentaje de hábitat seminatural en el paisaje circundante, ba = área límite alrededor de los campos.

Cualquier sugerencia sobre cómo puedo obtener un buen ajuste del modelo (distribuciones de error alternativas, diferentes tipos de modelo, etc.) sería muy agradecida.

Gracias.

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
Sé que esta es una publicación muy antigua y probablemente súper irrelevante ahora, pero quiero enfatizar que, en mi experiencia con un problema muy similar que he tenido recientemente, los residuos de glmers no necesitan distribuirse normalmente. Por lo tanto, no es necesario un control de la normalidad, así como un control de los residuos ajustados frente a los residuales. En general, diagnosticar parcelas residuales de glmers es increíblemente difícil.
fsociety

Respuestas:


2

Esta publicación tiene cuatro años, pero quería seguir lo que dijo la sociedad en un comentario. El diagnóstico de los residuos en GLMM no es sencillo, ya que los gráficos de residuos estándar pueden mostrar falta de normalidad, heterocedasticidad, etc., incluso si el modelo se ha especificado correctamente. Existe un paquete R DHARMa, especialmente adecuado para diagnosticar este tipo de modelos.

El paquete se basa en un enfoque de simulación para generar residuos escalados a partir de modelos mixtos lineales generalizados ajustados y genera diferentes diagramas de diagnóstico fácilmente interpretables. Aquí hay un pequeño ejemplo con los datos de la publicación original y el primer modelo ajustado (m1):

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

Gráfico de residuos de DHARMa

El gráfico de la izquierda muestra un gráfico QQ de los residuos escalados para detectar desviaciones de la distribución esperada, y el gráfico de la derecha representa los residuos frente a los valores pronosticados mientras realiza una regresión cuantil para detectar desviaciones de la uniformidad (las líneas rojas deben ser horizontales y a 0.25 , 0,50 y 0,75).

Además, el paquete también tiene funciones específicas para probar la dispersión excesiva / insuficiente y la inflación cero, entre otras:

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
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.