Problème obtention du QAICc avec la fonction dredge

Postez ici vos questions, réponses, commentaires ou suggestions - Les sujets seront ultérieurement répartis dans les archives par les modérateurs

Modérateur : Groupe des modérateurs

Justine Royer
Messages : 3
Enregistré le : 24 Avr 2018, 07:11

Problème obtention du QAICc avec la fonction dredge

Messagepar Justine Royer » 04 Aoû 2019, 21:14

Bonjour à tous,

Je suis étudiante en Master 2 en Biologie et dans le cadre de mon stage je souhaite réaliser une sélection de modèle via la fonction dredge du package MuMin. Je travaille sur des données d'un long suivi de différentes espèces de Rhopalocères (20ans). Mon tableau de base, par espèce, comporte environ 300 lignes. Une ligne équivaut à une section qui est mon unité d'échantillonnage. Cependant, les sections se trouvent parfois dans une même parcelle. J'ai donc du effectuer un regroupement de lignes pour éviter une dépendence des données. Pour regrouper les nombres d'individus j'ai du les moyenner et non les sommer pour pondérer par le nombre de sections. (J'obtiens donc des nombres non entiers).
De plus, mes sections ont des longueurs très variables, j'ai donc calculé une densité au 100m² ((nb individus/surface section) x 100).

Pour mes modèles globaux j'ai donc utilisé une loi Poisson car ce sont des données issues d'un comptage. On m'a parlé de l'argument offset mais dans tous les cas je n'aurais pas des nombres entiers puisque je fais une moyenne de plusieurs comptage. J'ai également vérifié ma distribution et mes données suivent bien une loi Poisson.
Comme j'ai regroupé des lignes, je n'en ai plus qu'une 50aines. Je ne peux donc pas réaliser un modèle avec + de 3 variables explicatives. J'ai donc divisé mon modèle global de base en 3 principaux scénarios, le premier concernant les variables climatiques.

Je réalise donc mon premier modèle sur l'espèce Agreste du site Careil :

Careil_Agreste1a<-glm(Densité~Prec.mean+Tmoy.mean,data=Careil_Agreste,family="poisson")
#There were 17 warnings (use warnings() to see them)[color=#000000]ce sont mes lignes avec nombres non entiers
summary(Careil_Agreste[,c(1,6:7)])
# Densité Prec.mean Tmoy.mean
# Min. :0.00000 Min. :1.213 Min. :16.25
# 1st Qu.:0.00000 1st Qu.:1.213 1st Qu.:16.25
# Median :0.00000 Median :1.299 Median :17.08
# Mean :0.04652 Mean :1.615 Mean :16.80
# 3rd Qu.:0.02518 3rd Qu.:2.033 3rd Qu.:17.16
# Max. :0.57136 Max. :2.256 Max. :17.16
plotresid(Careil_Agreste1a) #Vérification linéarité du modèle

#Changement de fonction de lien pour améliorer la linéarité
Careil_Agreste1a<-glm(Densité~Prec.mean+Tmoy.mean,data=Careil_Agreste,family="poisson"(link="identity"))
plotresid(Careil_Agreste1a)
summary(Careil_Agreste1a)
# Null deviance: 8.4472 on 56 degrees of freedom
#Residual deviance: 7.8346 on 54 degrees of freedom
#AIC: Inf
#Number of Fisher Scoring iterations: 6

#Vérification de la relation entre µ et V
7.7861/54
#0.144187 -> sous-dispersion


Je suis en sous-dispersion, et malgré un changement en loi binomiale négative je reste en sous-dispersion. Je suis donc passée en loi quasi-Poisson où il me semble qu'on ne vérifie plus la dispersion car la loi s'ajuste à nos données :

Careil_Agreste1a_q<-glm(Densité~Prec.mean+Tmoy.mean,data=Careil_Agreste,family="quasipoisson")
plotresid(Careil_Agreste1a_q)
Careil_Agreste1a_q<-glm(Densité~Prec.mean+Tmoy.mean,data=Careil_Agreste,family="quasipoisson"(link="identity"))
plotresid(Careil_Agreste1a_q) #OK
vif(Careil_Agreste1a_q) # OK


Mon modèle est vérifié, je passe à la fonction dredge, où la, ça se complique :
#n = 57 et nb paramètre = 2
57/2
# < 40 -> critère = QAICc
library(MuMIn)
#définition du modèle poisson
Careil_Agreste1a_p<-glm(Densité~Prec.mean+Tmoy.mean,data=Careil_Agreste,family="poisson"(link="identity"),na.action ="na.pass")
dfun <- function(Careil_Agreste1a_p){with(Careil_Agreste1a_p,sum((weights * residuals^2)[weights > 0])/df.residual)}
x.quasipoisson <- function(...){
res <- quasipoisson(...)
res$aicc <- poisson(...)$aicc
res
}
#Création modèle quasi poisson
Careil_Agreste1a_q<- update(Careil_Agreste1a_p,family="x.quasipoisson",na.action=na.pass)
#Sélection modèle
essai1 <- dredge(Careil_Agreste1a_q,rank="QAICc", chat=dfun(Careil_Agreste1a_p))
essai1
#Global model call: glm(formula = Densité ~ Prec.mean + Tmoy.mean, family = "x.quasipoisson",
# data = Careil_Agreste, na.action = na.pass)
#---
#Model selection table
# (Int) Prc.men Tmy.men df
#1 -3.068 1
#2 -4.053 0.5901 2
#3 14.290 -1.038 2
#4 38.290 -1.4210 -2.331 3
#Models ranked by QAICc(x, chat = 0.182950237671649)


Avec cette façon je n'obtiens donc pas mon QAICc et je ne comprend pas pourquoi ?
J'ai donc cherché une autre façon avec la fonction qdredge qui s'applique apparemment pour les lois quasi :

install.packages("s245")
library(s245)
essai2<-qdredge(Careil_Agreste1a_p, family = "x.quasipoisson", na.action = na.pass,
rank = "QAICc", chat = dfun(Careil_Agreste1a_p))
#Fixed term is "(Intercept)"
#There were 50 or more warnings (use warnings() to see the first 50)
warnings()
#Messages d'avis :
#1: In dpois(y, mu, log = TRUE) : non-integer x = 0.075311
#....
#18: In .aic(list(object, ...), chat, k, REML, function(ll, ... :
# 'chat' given is < 1, increased to 1
essai2
#Global model call: glm(formula = Densité ~ Prec.mean + Tmoy.mean, family = family,
# data = Careil_Agreste, na.action = na.action)
#---
#Model selection table
# (Int) Prc.men Tmy.men df logLik rank
#1 -3.068 1 -Inf Inf
#2 -4.053 0.5901 2 -Inf Inf
#3 14.290 -1.038 2 -Inf Inf
#4 38.290 -1.4210 -2.331 3 -Inf Inf
#Models ranked by rank(x, chat = 0.182950237671649)

Et avec cette façon je n'obtiens pas de valeurs mais "Inf"... Je ne sais pas si cela vient de ma forte sous-dispersion mais je n'arrive pas à trouver d'autres alternatives.
Si vous pouviez m'expliquer pourquoi je n'arrive pas à obtenir de valeurs de QAICc et surtout si vous savez comment l'obtenir, ça m'aiderait beaucoup !

Merci d'avance.

Retourner vers « Questions en cours »

Qui est en ligne

Utilisateurs parcourant ce forum : Aucun utilisateur enregistré et 1 invité