Significado de um aviso de convergência no glmer

16

Estou usando a glmerfunção do lme4pacote em R e usando o bobyqaotimizador (ou seja, o padrão no meu caso). Estou recebendo um aviso e estou curioso para saber o que isso 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

Eu procurei "uma etapa da região de confiança falhou ao reduzir q". Encontrei algumas informações no pacote minqa , que dizia "Consulte Powell para obter explicações". Eu fiz (você também pode, se quiser! Veja as referências e os links abaixo), mas não entendo. Na verdade, não consegui encontrar nada sobre como reduzir o q.

MJD Powell (2007) "Desenvolvimentos do NEWUOA para minimização irrestrita sem derivadas", Universidade de Cambridge, Departamento de Matemática Aplicada e Física Teórica, Grupo de Análise Numérica, Relatório NA2007 / 05, http://www.damtp.cam.ac.uk/ usuário / na / NA_papers / NA2007_05.pdf .

MJD Powell (2009), "O algoritmo BOBYQA para otimização com restrição limitada sem derivadas", Relatório No. DAMTP 2009 / NA06, Centro de Ciências Matemáticas, Universidade de Cambridge, Reino Unido. http://www.damtp.cam.ac.uk/user/na/NA_papers/NA2009_06.pdf .

Ps Eu sei que posso mudar o otimizador, e vou ver se consigo obter saída sem avisos ou erros. Também irei verificar o gradiente e o Hessian, se puder, conforme comentário / resposta de Ben Bolker . Eu estou usando glmerdentro dredgedeMuMIn e eu não tenho certeza se a resposta de Ben vai trabalhar sem alguns ajustes adicionais, mas vou trabalhar com ele uma vez meu computador acabamentos o que está fazendo, de qualquer maneira, eu discordo.

Atualizar

Conforme o comentário do Dr. Bolker abaixo, comecei a pesquisar o código FORTRAN ( aqui está o código para qualquer pessoa interessada em procurar, mas não baixá-lo ). "430" aparece na parte bobyqb.f do código. Basta procurar "430" ou "reduzir Q" para encontrar o código relevante.

Este é o meu primeiro encontro com o código FORTRAN, mas acho que o código diz que, se as seguintes condições forem atendidas, gere o aviso: NTRITS> 0, VQUAD> = 0, IPRINT> 0. "O número inteiro NTRITS é definido como o número" região confiável " iterações que ocorreram desde a última iteração "alternativa".VQUADaparece várias vezes e ainda não estou claro quanto ao seu significado, pois seu valor parece depender de uma variedade de outras variáveis, cujos valores às vezes dependem de outras variáveis. De bobyqa.f: "O valor do IPRINT deve ser definido como 0, 1, 2 ou 3., que controla a quantidade de impressões. Especificamente, não há saída se IPRINT = 0 e somente saída no retorno se IPRINT = 1. ".

Então, parece que a tarefa é descobrir o significado de VQUADser> = 0 e, talvez, entender como / quando IPRINTse tornou> 0. Vou ter que voltar ao trabalho para dar uma olhada, mas a matemática ou menos sua expressão simbólica, é um pouco de barreira para mim. A menos que alguém conheça o algoritmo ou deseje aprender sobre ele, acho que terei que aumentar iterativamente minha compreensão do aviso, indo e voltando entre os documentos, o código e a Internet até entender o que ele é. significa.

Jota
fonte
3
Eu acho que essa pergunta pode estar no tópico do CV b / c, parece ser sobre a compreensão das idéias, em vez de ajudar com a correção por si só.
gung - Reintegrar Monica
Não tenho muita certeza de que tenho muito o que sugerir nesse caso, além de ir aos poucos pelos documentos e pelo código FORTRAN (incluído no srcdiretório cran.r-project.org/src/contrib/minqa_1. 2.3.tar.gz ) e ver exatamente o que está acontecendo quando este erro (código de erro 430 no código) é acionado ...
Ben Bolker
1
Percorrendo rapidamente o papel, acho que o aviso indica que o otimizador não consegue encontrar uma direção na qual a aproximação quadrática, Q, da função que você deseja minimizar, F diminui. Ou seja, o otimizador está em um ponto que provavelmente não é o ideal, mas não sabe como ir para melhorar o objetivo. Por isso, está preso.
Sven
1
qual dos dois documentos você examinou e aproximadamente onde encontrou essa informação? (Eu desnatado também, mas não foi capaz de fazer a correspondência entre o papel e código que facilmente ...)
Ben Bolker
Eu li o jornal BOBYQA. Passei a primeira metade em cerca de 5 minutos para ter uma idéia geral do que eles estão fazendo e do que Q é. Não é possível apontar para uma página específica.
Sven

Respostas:

13

f(x)xkk

  • Δk
  • f(x)x=xkQ(x)
  • Encontre o passo, skQk(xk+sk)||sk||Δk
  • skxk+1=xk+sk
  • Caso contrário, refine seu modelo e tente novamente

sk

Para entender o valor de VQUAD, primeiro precisamos entender algumas outras variáveis. Felizmente, existem bons comentários logo abaixo da declaração de SUBROUTINE BOBYQB. As variáveis ​​salientes são:

  • GOPT, o gradiente do modelo
  • HQ, o hessiano do modelo
  • Dsk

Começando algumas linhas acima de 410, você verá DO 410 J=1,N. Isso inicia um loop for (e um loop for aninhado) que avalia a alteração prevista pelo modelo usando a etapa de teste D. Ele acumula a alteração prevista em VQUAD. A primeira parte do loop for avalia os termos de primeira ordem e o loop for aninhado avalia os termos de segunda ordem. Provavelmente seria mais fácil ler se os loops fossem recuados, assim:

    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

Há outro loop for depois disso para incorporar outros parâmetros no modelo. Eu tenho que admitir, eu não entendo isso completamente - meu melhor palpite é que é particular a forma como eles constroem o modelo.

No final de tudo isso, VQUADmantém a mudança na função objetivo prevista pelo modelo. Então, se VQUADnão é negativo, isso é ruim. Agora, esse solucionador em particular pode usar uma computação de etapa alternativa (provavelmente uma pesquisa de linha), que é onde NTRITSentra em cena. Portanto, a lógica em 430 está dizendo: "Se a última iteração usou a computação de etapa alternativa E o modelo não prevê uma diminuição AND IPRINT> 0, imprima a mensagem de aviso". Observe que o solucionador será finalizado independentemente do valor de IPRINT.

Falando nisso IPRINT, esse valor é passado BOBYQApela função de chamada. Nesse caso, sua rotina R é a função de chamada. Há um verboseparâmetro para glmer- eu seria centavos em dólares aos quais o mesmo valor é passado BOBYQA. Tente definir verbosecomo 0 e você provavelmente não verá o aviso. Mas não vai mudar o que está acontecendo sob o capô, é claro.

Bill Woessner
fonte
1
isso é muito útil; Eu não acho que eu vou fazer melhor, concedendo recompensas ...
Ben Bolker
@BenBolker. Então , eu deveria me preocupar com o que está acontecendo aqui, ou isso é realmente apenas um incômodo no código? (Em outras palavras, o significado deste aviso meus resultados não são válidos ??)
theforestecologist
1
o conselho geral nesse caso é o que é indicado em ?lme4::convergence: além de uma avaliação exaustiva / detalhada do procedimento de otimização, o melhor é comparar resultados de diferentes otimizadores.
Ben Bolker 27/05