Estou usando a glmer
função do lme4
pacote em R e usando o bobyqa
otimizador (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 glmer
dentro dredge
deMuMIn
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".VQUAD
aparece 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 VQUAD
ser> = 0 e, talvez, entender como / quando IPRINT
se 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.
src
diretó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 ...Respostas:
Para entender o valor de
VQUAD
, primeiro precisamos entender algumas outras variáveis. Felizmente, existem bons comentários logo abaixo da declaração deSUBROUTINE BOBYQB
. As variáveis salientes são:GOPT
, o gradiente do modeloHQ
, o hessiano do modeloD
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 testeD
. Ele acumula a alteração prevista emVQUAD
. 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: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,
VQUAD
mantém a mudança na função objetivo prevista pelo modelo. Então, seVQUAD
não é negativo, isso é ruim. Agora, esse solucionador em particular pode usar uma computação de etapa alternativa (provavelmente uma pesquisa de linha), que é ondeNTRITS
entra 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 ANDIPRINT
> 0, imprima a mensagem de aviso". Observe que o solucionador será finalizado independentemente do valor deIPRINT
.Falando nisso
IPRINT
, esse valor é passadoBOBYQA
pela função de chamada. Nesse caso, sua rotina R é a função de chamada. Há umverbose
parâmetro paraglmer
- eu seria centavos em dólares aos quais o mesmo valor é passadoBOBYQA
. Tente definirverbose
como 0 e você provavelmente não verá o aviso. Mas não vai mudar o que está acontecendo sob o capô, é claro.fonte
?lme4::convergence
: além de uma avaliação exaustiva / detalhada do procedimento de otimização, o melhor é comparar resultados de diferentes otimizadores.