Estoy usando la glmer
función del lme4
paquete en R, y estoy usando el bobyqa
optimizador (es decir, el predeterminado en mi caso). Recibo una advertencia y tengo curiosidad por saber qué significa.
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
Busqué "un paso de región de confianza no pudo reducir q". Encontré información en el paquete minqa , que decía "Consulte a Powell para obtener una explicación". Lo hice (¡tú también puedes, si quieres! Ver las referencias y enlaces a ellos a continuación), pero no lo entiendo. De hecho, no pude encontrar nada sobre la reducción de q.
MJD Powell (2007) "Desarrollos de NEWUOA para la minimización sin restricciones sin derivados", Universidad de Cambridge, Departamento de Matemática Aplicada y Física Teórica, Grupo de Análisis Numérico, Informe NA2007 / 05, http://www.damtp.cam.ac.uk/ usuario / na / NA_papers / NA2007_05.pdf .
MJD Powell (2009), "El algoritmo BOBYQA para la optimización restringida limitada sin derivados", Informe No. DAMTP 2009 / NA06, Centro de Ciencias Matemáticas, Universidad de Cambridge, Reino Unido. http://www.damtp.cam.ac.uk/user/na/NA_papers/NA2009_06.pdf .
PD: Sé que puedo cambiar el optimizador, y veré si puedo obtener resultados sin advertencias o errores. También puedo comprobar el gradiente y el Hessian si puedo, según un comentario / respuesta de Ben Bolker . Lo estoy usando desde glmer
adentro y no estoy seguro de si la respuesta de Ben funcionará sin algunos ajustes adicionales, pero trabajaré en ello una vez que mi computadora termine lo que está haciendo, de todos modos, estoy divagando.dredge
MuMIn
Actualizar
Según el comentario del Dr. Bolker a continuación, comencé a buscar el código FORTRAN ( Aquí está el código para cualquier persona interesada en buscarlo pero no descargarlo ). "430" aparece en la parte bobyqb.f del código. Simplemente busque "430" o "reduzca Q" para encontrar el código relevante.
Este es mi primer encuentro con el código FORTRAN, pero creo que el código dice que si se cumplen las siguientes condiciones, produzca la advertencia: NTRITS
> 0, VQUAD
> = 0, IPRINT
> 0. "El NTRITS entero se establece en el número" región de confianza " iteraciones que han ocurrido desde la última iteración "alternativa". VQUAD
aparece varias veces, y aún no tengo claro su importancia, ya que su valor parece depender de una variedad de otras variables, cuyos valores a veces dependen de otras variables. De bobyqa.f: "El valor de IPRINT debería ser establecido en 0, 1, 2 o 3, que controla la cantidad de impresión. Específicamente, no hay salida si IPRINT = 0 y solo se muestra en la devolución si IPRINT = 1 ".
Entonces, parece que la tarea es descubrir la importancia de VQUAD
ser> = 0 y, tal vez, entender cómo / cuándo se IPRINT
convirtió en> 0. Tendré que volver al papel para echar un vistazo, pero las matemáticas o menos su expresión simbólica, es un poco una barrera para mí. A menos que alguien conozca el algoritmo o tenga el deseo de aprender sobre él, creo que tendré que aumentar de manera iterativa mi comprensión de la advertencia yendo y viniendo entre los documentos, el código e Internet hasta que entienda qué es. medio.
src
directorio de cran.r-project.org/src/contrib/minqa_1. 2.3.tar.gz ) y ver exactamente lo que sucede cuando se activa este error (código de error 430 en el código) ...Respuestas:
Para entender el valor de
VQUAD
, primero tenemos que entender algunas otras variables. Afortunadamente, hay buenos comentarios justo debajo de la declaración deSUBROUTINE BOBYQB
. Las variables más destacadas son:GOPT
, el gradiente del modeloHQ
, la arpillera de la modeloD
Comenzando unas pocas líneas por encima de 410, verás
DO 410 J=1,N
. Esto comienza un ciclo for (y un ciclo for anidado) que evalúa el cambio predicho por el modelo utilizando el paso de pruebaD
. Se acumula el cambio previsto enVQUAD
. La primera parte del ciclo for evalúa los términos de primer orden y el ciclo for anidado evalúa los términos de segundo orden. Probablemente sería más fácil de leer si los bucles estuvieran sangrados, como este:Hay otro ciclo for después de esto para incorporar otros parámetros al modelo. Tengo que admitir que no entiendo completamente esto; mi mejor suposición es que es particular de cómo construyen el modelo.
Al final de todo esto, se
VQUAD
mantiene el cambio en la función objetivo predicho por el modelo. Entonces, siVQUAD
no es negativo, eso es malo. Ahora este solucionador particular puede usar un cálculo alternativo de pasos (probablemente una búsqueda de línea), que es dondeNTRITS
entra en juego. Entonces, la lógica en 430 dice: "Si la última iteración usó el cálculo alternativo de pasos Y el modelo no predice una disminución YIPRINT
> 0, imprima el mensaje de advertencia". Tenga en cuenta que el solucionador terminará independientemente del valor deIPRINT
.Hablando de
IPRINT
eso,BOBYQA
la función de llamada pasa ese valor . En este caso, su rutina R es la función de llamada. Hay unverbose
parámetro paraglmer
: sería diez centavos en dólares a los que se pasa el mismo valorBOBYQA
. Intente configurarverbose
a 0 y probablemente no verá la advertencia. Pero no cambiará lo que sucede debajo del capó, por supuesto.fuente
?lme4::convergence
: antes de una evaluación exhaustiva / detallada del procedimiento de optimización, lo mejor es comparar los resultados de diferentes optimizadores.