Signification d'un avertissement de convergence dans Glmer

16

J'utilise la glmerfonction du lme4package dans R, et j'utilise l' bobyqaoptimiseur (c'est-à-dire la valeur par défaut dans mon cas). Je reçois un avertissement et je suis curieux de savoir ce que cela signifie.

Warning message:
In optwrap(optimizer, devfun, start, rho$lower, control = control,  :
  convergence code 3 from bobyqa: bobyqa -- a trust region step failed to reduce q

J'ai recherché «une étape de région de confiance n'a pas réussi à réduire q». J'ai trouvé des informations dans le paquetage minqa , qui disait "Consulter Powell pour des explications". Je l'ai fait (vous pouvez aussi, si vous voulez! Voir les références et les liens ci-dessous), mais je n'arrive pas à comprendre. En fait, je n'ai rien trouvé sur la réduction de q.

MJD Powell (2007) "Developments of NEWUOA for uncontrained minimisation without filters", Université de Cambridge, Département de mathématiques appliquées et de physique théorique, Numerical Analysis Group, rapport NA2007 / 05, http://www.damtp.cam.ac.uk/ user / na / NA_papers / NA2007_05.pdf .

MJD Powell (2009), «L'algorithme BOBYQA pour l'optimisation contrainte contrainte sans dérivés», rapport n ° DAMTP 2009 / NA06, Center for Mathematical Sciences, Université de Cambridge, Royaume-Uni. http://www.damtp.cam.ac.uk/user/na/NA_papers/NA2009_06.pdf .

Ps Je sais que je peux changer l'optimiseur et je vais voir si je peux obtenir une sortie sans avertissement ni erreur. Je vérifierai également le gradient et la Hesse si je peux, selon un commentaire / réponse de Ben Bolker . J'utilise glmerdedans dredgede MuMInet je ne sais pas si la réponse de Ben fonctionnera sans bricolage supplémentaire, mais je vais y travailler une fois que mon ordinateur aura terminé ce qu'il fait, de toute façon, je m'éloigne du sujet.

Mise à jour

Selon le commentaire du Dr Bolker ci-dessous, j'ai commencé à parcourir le code FORTRAN ( voici le code pour toute personne intéressée à le chercher mais pas à le télécharger ). "430" apparaît dans la partie bobyqb.f du code. Recherchez simplement "430" ou "réduire Q" pour trouver le code correspondant.

Ceci est ma première rencontre avec le code FORTRAN, mais je pense que le code dit que si les conditions suivantes sont remplies, produisez l'avertissement: NTRITS> 0, VQUAD> = 0, IPRINT> 0. "Le nombre entier NTRITS est défini sur le nombre" région de confiance " itérations qui se sont produites depuis la dernière itération "alternative". " VQUADapparaît plusieurs fois, et je ne suis pas encore clair sur sa signification car sa valeur semble dépendre d'une variété d'autres variables, dont les valeurs dépendent parfois d'autres variables. De bobyqa.f: "La valeur d'IPRINT devrait être défini sur 0, 1, 2 ou 3, qui contrôle la quantité d'impression. Plus précisément, il n'y a pas de sortie si IPRINT = 0 et il n'y a de sortie qu'au retour si IPRINT = 1. ".

Donc, il semble que la tâche consiste à comprendre la signification d' VQUADêtre> = 0 et, peut-être, de comprendre comment / quand IPRINTest devenu> 0. Je vais devoir revenir sur le papier pour y jeter un œil, mais les mathématiques, ou moins son expression symbolique, est un peu une barrière pour moi. À moins que quelqu'un ne connaisse l'algorithme ou ait le désir de l'apprendre, je pense que je devrai augmenter itérativement ma compréhension de l'avertissement en faisant des allers-retours entre les documents, le code et Internet jusqu'à ce que je comprenne ce qu'il veux dire.

Jota
la source
3
Je pense que cette question peut être sur le sujet pour CV b / c, il semble être de comprendre les idées plutôt que d'aider w / R en soi.
gung - Réintégrer Monica
Je ne suis pas sûr d'avoir beaucoup à suggérer dans ce cas au-delà du passage en revue les articles et le code FORTRAN (qui est inclus dans le srcrépertoire de cran.r-project.org/src/contrib/minqa_1). 2.3.tar.gz ) et voir précisément ce qui se passe lorsque cette erreur (code d'erreur 430 dans le code) se déclenche ...
Ben Bolker
1
Je pense que l'avertissement indique que l'optimiseur ne peut pas trouver une direction dans laquelle l'approximation quadratique, Q, à la fonction que vous voulez minimiser, F, diminue. Autrement dit, l'optimiseur est à un point qui n'est probablement pas optimal, mais il ne sait pas comment aller pour améliorer l'objectif. Par conséquent, il est bloqué.
Sven
1
lequel des deux documents avez-vous parcouru et approximativement où avez-vous trouvé cette information? (J'ai aussi survolé, mais je n'ai pas pu faire la correspondance entre papier et code aussi facilement ...)
Ben Bolker
J'ai lu le papier BOBYQA. J'ai parcouru la première moitié en environ 5 minutes pour avoir une idée générale de ce qu'ils vont faire et de ce qu'est Q. Je ne peux pas vraiment pointer vers une page spécifique.
Sven

Réponses:

13

f(x)xkk

  • Δk
  • f(x)x=xkQ(x)
  • skQk(Xk+sk)||sk||Δk
  • sk est "assez bon", Xk+1=Xk+sk
  • Sinon, affinez votre modèle et réessayez

L'une des façons de déterminer si skest "assez bon" est en comparant la diminution prédite par le modèle à la diminution réelle de la fonction objectif. C'est ce que fait la partie du code après 430. Cependant, avant cela, il y a une vérification de santé mentale rapide pour voir si le modèle prédit une diminution du tout. Et c'est ce qui se passe à 430.

Pour comprendre la valeur de VQUAD, nous devons d'abord comprendre quelques autres variables. Heureusement, il y a de bons commentaires juste en dessous de la déclaration de SUBROUTINE BOBYQB. Les variables saillantes sont:

  • GOPT, le gradient du modèle
  • HQ, la Hesse du modèle
  • D, l'étape d'essai (j'ai appelé cela sk au dessus)

À partir de quelques lignes au-dessus de 410, vous verrez DO 410 J=1,N. Cela commence une boucle for (et une boucle for imbriquée) qui évalue le changement prédit par le modèle en utilisant l'étape d'essai D. Il accumule le changement prévu dans VQUAD. La première partie de la boucle for évalue les termes du premier ordre et la boucle for imbriquée évalue les termes du second ordre. Il serait probablement plus facile à lire si les boucles étaient en retrait, comme ceci:

    DO 410 J=1,N
        VQUAD=VQUAD+D(J)*GOPT(J)
        DO 410 I=1,J
            IH=IH+1
            TEMP=D(I)*D(J)
            IF (I .EQ. J) TEMP=HALF*TEMP
410         VQUAD=VQUAD+HQ(IH)*TEMP

Il y a une autre boucle for après cela pour incorporer d'autres paramètres dans le modèle. Je dois admettre que je ne comprends pas bien cela - ma meilleure supposition est que c'est particulier à la façon dont ils construisent le modèle.

À la fin de tout cela, VQUADtient le changement de fonction objectif prévu par le modèle. Donc, si ce VQUADn'est pas négatif, c'est mauvais. Maintenant, ce solveur particulier peut utiliser un calcul d'étape alternatif (probablement une recherche de ligne), c'est là NTRITSqu'intervient pour jouer. Ainsi, la logique en 430 dit: "Si la dernière itération a utilisé le calcul de l'étape alternative ET que le modèle ne prévoit pas une diminution ET IPRINT> 0, imprimez le message d'avertissement." Notez que le solveur va se terminer quelle que soit la valeur de IPRINT.

En parlant de IPRINT, cette valeur est passée BOBYQApar la fonction appelante. Dans ce cas, votre routine R est la fonction appelante. Il y a un verboseparamètre pour glmer- je serais des dimes en dollars pour lesquels la même valeur est transmise BOBYQA. Essayez de régler verbosesur 0 et vous ne verrez probablement pas l'avertissement. Mais cela ne changera pas ce qui se passe sous le capot, bien sûr.

Bill Woessner
la source
1
c'est très utile; Je ne pense pas que je vais faire mieux, en accordant des primes ...
Ben Bolker
@BenBolker. Alors, dois- je m'inquiéter de ce qui se passe ici, ou est-ce vraiment juste une nuisance dans le code? (En d'autres termes, cet avertissement signifie-t-il que mes résultats ne sont pas valides ??)
theforestecologist
1
dans ce cas, les conseils généraux sont ceux qui sont énoncés ?lme4::convergence: à moins d'une évaluation exhaustive / détaillée de la procédure d'optimisation, le mieux est de comparer les résultats de différents optimiseurs.
Ben Bolker