J'utilise la glmer
fonction du lme4
package dans R, et j'utilise l' bobyqa
optimiseur (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 glmer
dedans dredge
de MuMIn
et 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". " VQUAD
apparaî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 IPRINT
est 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.
src
ré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 ...Réponses:
L'une des façons de déterminer sisk est "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 deSUBROUTINE BOBYQB
. Les variables saillantes sont:GOPT
, le gradient du modèleHQ
, la Hesse du modèleD
, l'étape d'essai (j'ai appelé celaÀ 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'essaiD
. Il accumule le changement prévu dansVQUAD
. 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: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,
VQUAD
tient le changement de fonction objectif prévu par le modèle. Donc, si ceVQUAD
n'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àNTRITS
qu'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 ETIPRINT
> 0, imprimez le message d'avertissement." Notez que le solveur va se terminer quelle que soit la valeur deIPRINT
.En parlant de
IPRINT
, cette valeur est passéeBOBYQA
par la fonction appelante. Dans ce cas, votre routine R est la fonction appelante. Il y a unverbose
paramètre pourglmer
- je serais des dimes en dollars pour lesquels la même valeur est transmiseBOBYQA
. Essayez de réglerverbose
sur 0 et vous ne verrez probablement pas l'avertissement. Mais cela ne changera pas ce qui se passe sous le capot, bien sûr.la source
?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.