Les posteurs les plus actifs de la semaine
mvergnat
 
zezima
 
Florent Aubry
 
c@ssoulet
 
Eric Wajnberg
 
fmachou
 
adri6666
 
Nik
 
Aeelim
 
Kouakakou
 


GLMM pour détection de déclin de population (comptages)

Voir le sujet précédent Voir le sujet suivant Aller en bas

GLMM pour détection de déclin de population (comptages)

Message par MarlTarma le Mar 11 Avr 2017 - 15:29

Bonjour à tous,

Je travaille sur un jeu de données qui consiste en des captures de chauves-souris répétées sur 5 ans à raison de 4 "sessions de capture" par an, chaque session étant composé de 4 nuits de captures successives réalisées sur le même site. Les sessions ont eu lieu durant des mois différents chaque année, et la pression de capture par nuit (nombre de filets et durée d'ouverture) a varié légèrement en fonction des nuits pour des raisons logistiques. Les données se présentent donc sous la forme d'un nombre d'individus capturés par nuit pour chaque espèce. Je ne m'intéresse ici qu'à l'espèce la plus fréquente. Je cherche à savoir s'il est possible de détecter un déclin de population à partir de ces données, et comment m'y prendre. Il n'y a aucune raison de croire qu'un tel déclin a lieu actuellement, mais je cherche surtout à adopter la bonne démarche de construction du modèle afin que la démarche ou le modèle auquel j'aboutirai puissent être réutilisés par la suite dans cette étude.

Je dispose de 79 nuits de captures, avec une moyenne de 9,88 captures par nuit (écart-type = 7,28). La distribution du nombre de captures par nuit n'est clairement pas normale et semble suivre une distribution de poisson, ce qui est logique pour un comptage d'individus. Quelques premiers essais avec des glmm avec loi de poisson indiquent qu'il y a une forte surdispersion, j'utilise donc par la suite une régression de type négative binomiale. Je constitue donc mon modèle sous R avec la fonction glmer.nb {lme4}, et je mets comme variables explicatives à effets fixes l'année (sous la forme 1, 2, 3, 4, 5), le mois où a eu lieu la session de capture, la durée d'ouverture des filets et le nombre de filets ouverts (=2 paramètres déterminant l'effort de capture), et comme variable à effet aléatoire la session de capture (1 à 20). Mon idée est que si l'année a un effet significatif sur le nombre de capture et que son coefficient est négatif, on peut conclure qu'il y a un déclin de l'espèce étudiée.

Tout d'abord, cela vous semble-t-il cohérent? J'ai choisi de mettre la session de capture en effet aléatoire car à mon sens cela permet de prendre en compte la "variabilité temporelle" qui ne peut pas simplement être expliquée par le mois (variation saisonnière) ou l'année (variation inter-annuelle), et car les sessions de capture ont été placées à des moments différents de l'année sans raison autre qu'humaine, et donc il aurait pu y avoir beaucoup d'autres "configurations" de distribution des sessions dans l'année. J'aurai pu également mettre l'identifiant individuel de chaque nuit de capture en variable aléatoire, mais cela ne me semble pas logique car ce facteur a autant de modalités qu'il y a de valeurs dans la variable à expliquer. Faire cela serait à mon sens de sur-ajustement ("overfitting"). Suis-je dans le vrai ou au contraire cela permettrait-il de rendre compte que chaque nuit est un événement unique dans le temps?

J'en viens maintenant aux problèmes techniques. J'ajuste mon modèle avec la formule ci-dessous :

Code:
mod <- glmer.nb(nb_captures ~ mois + duree_ouverture_filets + Metrage_filets + annee + (1|SESSION), data=MyData)

Et R me renvoi de nombreux messages d'alerte :

Spoiler:

Code:
> mod <- glmer.nb(nb_captures ~ mois + duree_ouverture_filets + Metrage_filets + annee + (1|SESSION), data=MyData)
There were 26 warnings (use warnings() to see them)
> warnings()
Messages d'avis :
1: In checkConv(attr(opt, "derivs"), opt$par, ctrl = control$checkConv,  ... :
  Model failed to converge with max|grad| = 0.0350136 (tol = 0.001, component 1)
2: In checkConv(attr(opt, "derivs"), opt$par, ctrl = control$checkConv,  ... :
  Model is nearly unidentifiable: very large eigenvalue
 - Rescale variables?;Model is nearly unidentifiable: large eigenvalue ratio
 - Rescale variables?
3: In checkConv(attr(opt, "derivs"), opt$par, ctrl = control$checkConv,  ... :
  Model failed to converge with max|grad| = 0.00366087 (tol = 0.001, component 1)
4: In checkConv(attr(opt, "derivs"), opt$par, ctrl = control$checkConv,  ... :
  Model is nearly unidentifiable: very large eigenvalue
 - Rescale variables?;Model is nearly unidentifiable: large eigenvalue ratio
 - Rescale variables?
5: In checkConv(attr(opt, "derivs"), opt$par, ctrl = control$checkConv,  ... :
  Model failed to converge with max|grad| = 0.0625344 (tol = 0.001, component 1)
6: In checkConv(attr(opt, "derivs"), opt$par, ctrl = control$checkConv,  ... :
  Model is nearly unidentifiable: very large eigenvalue
 - Rescale variables?;Model is nearly unidentifiable: large eigenvalue ratio
 - Rescale variables?
7: In checkConv(attr(opt, "derivs"), opt$par, ctrl = control$checkConv,  ... :
  Model failed to converge with max|grad| = 0.1579 (tol = 0.001, component 1)
8: In checkConv(attr(opt, "derivs"), opt$par, ctrl = control$checkConv,  ... :
  Model is nearly unidentifiable: very large eigenvalue
 - Rescale variables?;Model is nearly unidentifiable: large eigenvalue ratio
 - Rescale variables?
9: In checkConv(attr(opt, "derivs"), opt$par, ctrl = control$checkConv,  ... :
  Model failed to converge with max|grad| = 0.181846 (tol = 0.001, component 1)
10: In checkConv(attr(opt, "derivs"), opt$par, ctrl = control$checkConv,  ... :
  Model is nearly unidentifiable: very large eigenvalue
 - Rescale variables?;Model is nearly unidentifiable: large eigenvalue ratio
 - Rescale variables?
11: In checkConv(attr(opt, "derivs"), opt$par, ctrl = control$checkConv,  ... :
  Model failed to converge with max|grad| = 0.0688913 (tol = 0.001, component 1)
12: In checkConv(attr(opt, "derivs"), opt$par, ctrl = control$checkConv,  ... :
  Model is nearly unidentifiable: very large eigenvalue
 - Rescale variables?;Model is nearly unidentifiable: large eigenvalue ratio
 - Rescale variables?
13: In checkConv(attr(opt, "derivs"), opt$par, ctrl = control$checkConv,  ... :
  Model failed to converge with max|grad| = 0.0143774 (tol = 0.001, component 1)
14: In checkConv(attr(opt, "derivs"), opt$par, ctrl = control$checkConv,  ... :
  Model is nearly unidentifiable: very large eigenvalue
 - Rescale variables?;Model is nearly unidentifiable: large eigenvalue ratio
 - Rescale variables?
15: In checkConv(attr(opt, "derivs"), opt$par, ctrl = control$checkConv,  ... :
  Model failed to converge with max|grad| = 0.0126729 (tol = 0.001, component 1)
16: In checkConv(attr(opt, "derivs"), opt$par, ctrl = control$checkConv,  ... :
  Model is nearly unidentifiable: very large eigenvalue
 - Rescale variables?;Model is nearly unidentifiable: large eigenvalue ratio
 - Rescale variables?
17: In checkConv(attr(opt, "derivs"), opt$par, ctrl = control$checkConv,  ... :
  Model failed to converge with max|grad| = 0.00345567 (tol = 0.001, component 1)
18: In checkConv(attr(opt, "derivs"), opt$par, ctrl = control$checkConv,  ... :
  Model is nearly unidentifiable: very large eigenvalue
 - Rescale variables?;Model is nearly unidentifiable: large eigenvalue ratio
 - Rescale variables?
19: In checkConv(attr(opt, "derivs"), opt$par, ctrl = control$checkConv,  ... :
  Model failed to converge with max|grad| = 0.00325834 (tol = 0.001, component 1)
20: In checkConv(attr(opt, "derivs"), opt$par, ctrl = control$checkConv,  ... :
  Model is nearly unidentifiable: very large eigenvalue
 - Rescale variables?;Model is nearly unidentifiable: large eigenvalue ratio
 - Rescale variables?
21: In checkConv(attr(opt, "derivs"), opt$par, ctrl = control$checkConv,  ... :
  Model failed to converge with max|grad| = 0.00340983 (tol = 0.001, component 1)
22: In checkConv(attr(opt, "derivs"), opt$par, ctrl = control$checkConv,  ... :
  Model is nearly unidentifiable: very large eigenvalue
 - Rescale variables?;Model is nearly unidentifiable: large eigenvalue ratio
 - Rescale variables?
23: In checkConv(attr(opt, "derivs"), opt$par, ctrl = control$checkConv,  ... :
  Model failed to converge with max|grad| = 0.00330308 (tol = 0.001, component 1)
24: In checkConv(attr(opt, "derivs"), opt$par, ctrl = control$checkConv,  ... :
  Model is nearly unidentifiable: very large eigenvalue
 - Rescale variables?;Model is nearly unidentifiable: large eigenvalue ratio
 - Rescale variables?
25: In checkConv(attr(opt, "derivs"), opt$par, ctrl = control$checkConv,  ... :
  Model failed to converge with max|grad| = 0.00332112 (tol = 0.001, component 1)
26: In checkConv(attr(opt, "derivs"), opt$par, ctrl = control$checkConv,  ... :
  Model is nearly unidentifiable: very large eigenvalue
 - Rescale variables?;Model is nearly unidentifiable: large eigenvalue ratio
 - Rescale variables?

Comment interpréter ces alertes et quel est leur origine? Mon modèle est-il quand même valable? Je vois bien que cela est lié au facteur aléatoire "session" puisque si je fais le même modèle en glm.nb sans la variable session, tout fonctionne sans problème. Cela peut-il être dû aux données elles-mêmes qui ne seraient tout simplement pas adaptées à ce type d'analyse (car trop variables par exemple) ?

Je vous remercie par avance pour vos réponses qui me permettront certainement de mieux comprendre les modèles. Je débute avec les modèles mixtes et il y a encore beaucoup d'aspects que je ne comprends pas !

Cordialement,
Marl

MarlTarma

Nombre de messages : 8
Date d'inscription : 02/02/2017

Voir le profil de l'utilisateur

Revenir en haut Aller en bas

Re: GLMM pour détection de déclin de population (comptages)

Message par cmoi le Mer 12 Avr 2017 - 6:46

Bonjour,

Je ne suis pas un expert dans les modèles mixtes, je ne pourrais donc pas te donner la solution, mais quelques pistes de réflexion.
1/ Je ne comprend pas bien la logique de mettre la session comme effet (qu'il soit fixe ou aléatoire). Si je comprend bien, la session de capture à lieu à différent moment de l'année, chaque année. Si oui, cet effet est pris en compte dans l'effet 'mois' et 'annee'.
2/ Comme ce sont les même sites qui sont échantillonnés plusieurs fois, je mettrais leur identifiant en effet aléatoire pour respecter l'appariement des données.
3/ Je rajouterai peut-être l'interaction mois*annee.
4/ Est-ce que pour traduire l'effort de capture, l'interaction duree*metrage n'est pas plus juste que leur effet fixe ?

HTH,
Bastien

cmoi

Nombre de messages : 13
Date d'inscription : 08/03/2012

Voir le profil de l'utilisateur

Revenir en haut Aller en bas

Re: GLMM pour détection de déclin de population (comptages)

Message par MarlTarma le Jeu 13 Avr 2017 - 9:45

Bonjour Bastien,

Merci beaucoup de ta réponse ! Tu as raison pour la session, c'était totalement redondant avec les variables mois et annee, donc j'ai enlevé la variable session et ajouté l'interaction mois:annee en effet aléatoire. Il n'y a qu'un seul site qui est échantillonné, donc je n'ai pas de variable site à ajouter. Et tu as également raison concernant l'interaction entre durée et métrage de filets. Mais j'ai abordé le problème d'une autre façon : j'ai retravaillé mes données en ne gardant que les captures des 4 premières heures de la nuit (95% de toutes les captures réalisées), donc j'enlève la variable durée d'ouverture du modèle. Puis je standardise mon nombre de capture par soirée par la surface de filet déployée par heure, pour obtenir un nombre de captures par 100m² de filet par heure (car j'utilise cette unité pour une autre question d'analyse afin de pouvoir comparer mes résultats avec ceux d'une autre étude). Pour faire cette standardisation des données, j'utilise l'argument "offset()" de la fonction glm (d'après cette page, cette page, et cette page), ce qui donne :

Code:
mod2 <- glmer.nb(nb_captures ~ mois + annee_num + offset(log((((Métrage.filets*2)/100)*4))) + (1|mois:annee), data=tab_eff_capt_liospu)

Dans cette formule, "annee_num" correspond au numéro de l'année (1, 2, 3, 4, 5), j'ai créé cette variable supplémentaire pour pouvoir avoir le coefficient du "déclin annuel" et sa significativité, et "annee" est une variable qualitative (2012, ..., 2016) qui sert à que l'interaction entre le mois et l'année puisse être pris en compte comme effet aléatoire. Quand je lance cette commande, je n'ai "plus que" 7 messages d'alerte. Voici mon output complet avec le test de significativité des variables explicatives et le summary du modèle :



Tout d'abord la démarche que j'ai adopté pour ce nouveau modèle vous semble-t-elle valable? Et que signifient les messages d'alerte qui restent? Si un expert en modèles mixtes passe par ici, ce serait un plaisir d'avoir son avis !

Merci d'avance pour vos réponses,
Marl

MarlTarma

Nombre de messages : 8
Date d'inscription : 02/02/2017

Voir le profil de l'utilisateur

Revenir en haut Aller en bas

Re: GLMM pour détection de déclin de population (comptages)

Message par Nik le Jeu 13 Avr 2017 - 9:57

Bonjour,

Je ne suis pas non plus expert mais si j'ai bien suivi, ton n global est de 79 valeurs (et encore tu en enlèves...)?
Tu as beaucoup de paramètres à estimer, notamment dans un modèle mixte, donc il est possible que l'algo d'optimisation ne parvienne pas à converger notamment si la variabilité est importante.

Nik

Nik

Nombre de messages : 1549
Date d'inscription : 23/05/2008

Voir le profil de l'utilisateur

Revenir en haut Aller en bas

Re: GLMM pour détection de déclin de population (comptages)

Message par MarlTarma le Jeu 13 Avr 2017 - 19:13

Bonjour Nik et merci de ta réponse,

Oui c'est exactement ça, j'avais 79 valeurs, mais suite à ton commentaire je me suis rendu compte que j'avais oublié d'éliminer les nuits qui ont duré moins de 4 heures. Une fois cela fait, je tombe à 69 valeurs. Et lançant le modèle, R me renvoi "plus que" 4 messages d'alerte. J'imagine que c'est probablement simplement car j'ai enlevé des données, et donc il y a moins de "points" avec lesquels le modèle doit converger?

J'avoue que je ne comprends pas bien comment fonctionne la fonction GLM pour ajuster le modèle aux données, alors ma question est peut-être idiote, mais est-ce qu'on peut interpréter un modèle dont algorithme d'optimisation n'a pas réussi à converger? Ou est-ce que pour mon cas, l'interprétation que je peux faire du modèle est simplement : le modèle ne converge pas, probablement car il y a trop peu de données, donc on ne peut pas conclure à propos d'un éventuel déclin de population pour l'instant, il faut attendre d'avoir plus de données.

Le nouveau modèle avec les bonnes données donne cela :



Comme vous pouvez le voir, il y a un effet significatif de l'année sur le nombre de captures d'après le test de Wald de la fonction summary. Ce qui m'étonne très fortement car il n'y a a priori pas de raison pour qu'un tel déclin existe (même si l'espèce dont il est question est très mal connue), et de plus d'après des simulations de puissance que j'ai faites (pour un modèle "classique" plus simple de détection de déclin), la puissance atteinte pour 5 années de suivi est relativement faible et ne permet de détecter qu'un déclin très fort avec une puissance de 0,90 (à partir de -19% d'abondance de la population par an). Je pense donc que je me suis planté quelque part. Ou alors Nik tu me diras peut-être que puisque le modèle ne converge pas, les coefficients obtenus ne sont tout simplement pas interprétables.

D'autre part, comment interpréter le coefficient (l'estimate quoi) de ma variable annee_num? Il est négatif et d'une valeur de -0,15. Si je comprends bien, cela signifie que lorsque l'on passe d'une année à la suivante, en moyenne le nombre de captures par soirée/100m² de filet par heure diminue de 0,15 ? Je pense que cette façon de penser est juste pour une régression linéaire classique, mais pour un glm ici je pense qu'il y a une transformation de ce coefficient à faire non? Et de plus puisque j'ai mis un log sur mon offset, cela signifie que chaque année mon nombre de captures par soirée/log(100m² de filet par heure) diminue de 0,15 ?

Je vous remercie par avance pour vos réponses qui m'ont déjà bien aidées.
Marl

MarlTarma

Nombre de messages : 8
Date d'inscription : 02/02/2017

Voir le profil de l'utilisateur

Revenir en haut Aller en bas

Re: GLMM pour détection de déclin de population (comptages)

Message par Nik le Ven 14 Avr 2017 - 7:10

Salut,

Pour aider à la convergence du modèle, tu peux gérer les paramètres tel que le nombre d'itération (àregarder dans les aides des fonctions correspondantes) ou jouer sur la tolérance.
Mais de toute façon, rien que pour estimer la matrice de variance/covariance des effets aléatoires, tu as seulement 69 valeurs pour 20 groupes. Tu as encor 12 paramètres pour les effets fixes.
il te faudrait un nombre bien plus important de mesures pour un tel modèle. il va falloir faire des choix et simplifier le modèle en regroupant les données pour limiter le nombre de modalités des facteurs explicatifs. Par exemple, au lieu d'avoir douze mois, tu pourrais avoir que 4 saisons.
Cela se justifie d'autant que chaque année les mois sont différents donc tu as surtout des mois qui ne sont pas représenté chaque année et donc ta matrice de variance/covariance des effets aléatoires ne peut pas être pleinement estimée.

Donc simplifie ce modèle qui n'est pas tenable avec tes données et qui en plus ne correspond pas à ta question de départ (je n'ai pas lu que tu t'intéressais à la variabilité intra-annuelle des captures).

Nik

Nik

Nombre de messages : 1549
Date d'inscription : 23/05/2008

Voir le profil de l'utilisateur

Revenir en haut Aller en bas

Re: GLMM pour détection de déclin de population (comptages)

Message par Contenu sponsorisé


Contenu sponsorisé


Revenir en haut Aller en bas

Voir le sujet précédent Voir le sujet suivant Revenir en haut

- Sujets similaires

 
Permission de ce forum:
Vous ne pouvez pas répondre aux sujets dans ce forum