Vous avez du mal à trouver un bon modèle adapté aux données de comptage avec des effets mixtes - ZINB ou autre chose?


12

J'ai un très petit ensemble de données sur l'abondance des abeilles solitaires que j'ai du mal à analyser. Ce sont des données de comptage, et presque tous les comptages sont dans un traitement avec la plupart des zéros dans l'autre traitement. Il existe également quelques valeurs très élevées (une sur deux des six sites), de sorte que la distribution des dénombrements a une queue extrêmement longue. Je travaille dans R. J'ai utilisé deux packages différents: lme4 et glmmADMB.

Les modèles mixtes de Poisson ne correspondaient pas: les modèles étaient très sur-dispersés lorsque les effets aléatoires n'étaient pas ajustés (modèle glm), et sous-dispersés lorsque les effets aléatoires étaient ajustés (modèle glmer). Je ne comprends pas pourquoi c'est. La conception expérimentale nécessite des effets aléatoires imbriqués, je dois donc les inclure. Une distribution d'erreur lognormale de Poisson n'a pas amélioré l'ajustement. J'ai essayé la distribution d'erreur binomiale négative en utilisant glmer.nb et je n'ai pas réussi à l'adapter - la limite d'itération a été atteinte, même lorsque j'ai modifié la tolérance en utilisant glmerControl (tolPwrss = 1e-3).

Parce que beaucoup de zéros seront dus au fait que je n'ai tout simplement pas vu les abeilles (ce sont souvent de minuscules choses noires), j'ai ensuite essayé un modèle gonflé à zéro. Le ZIP ne convenait pas bien. Le ZINB était le meilleur modèle à ce jour, mais je ne suis toujours pas trop satisfait du modèle. Je ne sais pas quoi essayer ensuite. J'ai essayé un modèle d'obstacle mais je n'ai pas pu ajuster une distribution tronquée aux résultats non nuls - je pense parce que beaucoup de zéros sont dans le traitement de contrôle (le message d'erreur était «Erreur dans model.frame.default (formule = s.bee ~ tmt + lu +: les longueurs variables diffèrent (trouvées pour «traitement») »).

De plus, je pense que l'interaction que j'ai incluse fait quelque chose d'étrange pour mes données car les coefficients sont irréalistes - bien que le modèle contenant l'interaction était meilleur lorsque j'ai comparé des modèles utilisant AICctab dans le paquet bbmle.

J'inclus un script R qui reproduira à peu près mon ensemble de données. Les variables sont les suivantes:

d = date julienne, df = date julienne (comme facteur), d.sq = df au carré (le nombre d'abeilles augmente puis diminue tout au long de l'été), st = site, s.bee = nombre d'abeilles, tmt = traitement, lu = type d'utilisation des terres, hab = pourcentage d'habitat semi-naturel dans le paysage environnant, ba = zone périphérique autour des champs.

Toutes les suggestions sur la façon d'obtenir un bon ajustement du modèle (distributions d'erreur alternatives, différents types de modèle, etc.) seraient très appréciées!

Je vous remercie.

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
Je sais que c'est un article très ancien et probablement super hors de propos maintenant, mais je tiens à souligner que d'après mon expérience avec un problème très similaire que j'ai eu récemment, les résidus de glmers n'ont pas besoin d'être distribués normalement. Ainsi, un contrôle de la normalité ainsi qu'un contrôle de l'ajustement par rapport aux résidus n'est vraiment pas nécessaire. Généralement, le diagnostic des parcelles résiduelles de glmers est incroyablement difficile.
fsociety

Réponses:


2

Ce poste a quatre ans, mais je voulais suivre ce que la société a dit dans un commentaire. Le diagnostic des résidus dans les GLMM n'est pas simple, car les graphiques résiduels standard peuvent montrer la non-normalité, l'hétéroscédasticité, etc., même si le modèle est correctement spécifié. Il existe un package R DHARMa, spécialement adapté au diagnostic de ce type de modèles.

Le package est basé sur une approche de simulation pour générer des résidus à l'échelle à partir de modèles mixtes linéaires généralisés ajustés et génère différents graphiques de diagnostic facilement interprétables. Voici un petit exemple avec les données du poste d'origine et le premier modèle ajusté (m1):

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

Graphique des résidus DHARMa

Le graphique de gauche montre un graphique QQ des résidus mis à l'échelle pour détecter les écarts par rapport à la distribution attendue, et le graphique de droite représente les résidus par rapport aux valeurs prédites tout en effectuant une régression quantile pour détecter les écarts par rapport à l'uniformité (les lignes rouges doivent être horizontales et à 0,25 , 0,50 et 0,75).

En outre, le package a également des fonctions spécifiques pour tester la dispersion sur / sous et l'inflation zéro, entre autres:

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
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.