Problemi a trovare un buon modello adatto per contare i dati con effetti misti - ZINB o qualcos'altro?


12

Ho un set di dati molto piccolo sull'abbondanza di api solitarie che non riesco ad analizzare. Sono i dati di conteggio e quasi tutti i conteggi si trovano in un trattamento con la maggior parte degli zero nell'altro trattamento. Ci sono anche un paio di valori molto alti (uno ciascuno in due dei sei siti), quindi la distribuzione dei conteggi ha una coda estremamente lunga. Sto lavorando in R. Ho usato due diversi pacchetti: lme4 e glmmADMB.

I modelli misti di Poisson non si adattavano: i modelli erano molto sovradispersi quando non venivano montati effetti casuali (modello glm) e scarsamente distribuiti quando venivano montati effetti casuali (modello glmer). Non capisco perché questo sia. Il design sperimentale richiede effetti casuali nidificati, quindi devo includerli. Una distribuzione degli errori lognormale di Poisson non ha migliorato l'adattamento. Ho provato a distribuire un errore binomiale negativo usando glmer.nb e non sono riuscito a adattarlo - limite di iterazione raggiunto, anche quando ho cambiato la tolleranza usando glmerControl (tolPwrss = 1e-3).

Poiché molti degli zero saranno dovuti al fatto che semplicemente non ho visto le api (spesso sono piccole cose nere), ho successivamente provato un modello a zero inflazione. Lo ZIP non si adattava bene. Finora lo ZINB è stato il miglior modello, ma non sono ancora troppo contento del modello. Sono in perdita su cosa provare dopo. Ho provato un modello di ostacolo ma non sono riuscito ad adattare una distribuzione troncata ai risultati diversi da zero: penso perché molti degli zero sono nel trattamento di controllo (il messaggio di errore era "Errore in model.frame.default (formula = s.bee ~ tmt + lu +: le lunghezze variabili differiscono (trovato per "trattamento") ").

Inoltre, penso che l'interazione che ho incluso stia facendo qualcosa di strano nei miei dati, dato che i coefficienti sono irrealisticamente piccoli - sebbene il modello contenente l'interazione fosse il migliore quando ho confrontato i modelli usando AICctab nel pacchetto bbmle.

Sto includendo alcuni script R che riprodurranno praticamente il mio set di dati. Le variabili sono le seguenti:

d = data giuliana, df = data giuliana (come fattore), d.sq = df al quadrato (il numero di api aumenta e poi cade durante l'estate), st = site, s.bee = conteggio delle api, tmt = trattamento, lu = tipo di uso del suolo, hab = percentuale di habitat semi-naturale nel paesaggio circostante, ba = area di confine intorno ai campi.

Eventuali suggerimenti su come ottenere un buon adattamento del modello (distribuzioni di errori alternativi, diversi tipi di modello, ecc.) Sarebbero stati molto grati!

Grazie.

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
So che questo è un post molto vecchio e probabilmente super irrilevante ora, ma voglio sottolineare che sulla mia esperienza con un problema molto simile che ho avuto di recente, i residui di glmers non devono essere distribuiti normalmente. Pertanto, non è davvero necessario un controllo sulla normalità e un controllo dei residui installati rispetto ai residui. In generale, diagnosticare trame residue di glmers è incredibilmente difficile.
fsociety,

Risposte:


2

Questo post ha quattro anni, ma volevo seguire quello che ha detto fsociety in un commento. La diagnosi dei residui nei GLMM non è semplice, poiché i grafici dei residui standard possono mostrare non normalità, eteroscedasticità, ecc., Anche se il modello è specificato correttamente. Esiste un pacchetto R DHARMa, specifico per la diagnosi di questo tipo di modelli.

Il pacchetto si basa su un approccio di simulazione per generare residui scalati da modelli misti lineari generalizzati montati e genera diversi grafici diagnostici facilmente interpretabili. Ecco un piccolo esempio con i dati del post originale e il primo modello montato (m1):

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

Trama dei residui DHARMa

Il diagramma a sinistra mostra un diagramma QQ dei residui ridimensionati per rilevare le deviazioni dalla distribuzione prevista, e il diagramma a destra rappresenta i residui rispetto ai valori previsti mentre si esegue la regressione quantile per rilevare le deviazioni dall'uniformità (le linee rosse devono essere orizzontali e a 0,25 , 0,50 e 0,75).

Inoltre, il pacchetto ha anche funzioni specifiche per i test di sovra / sotto dispersione e zero inflazione, tra gli altri:

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
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.