Significato di un avviso di convergenza in glmer


16

Sto usando la glmerfunzione dal lme4pacchetto in R, e sto usando l' bobyqaottimizzatore (cioè il valore predefinito nel mio caso). Ricevo un avviso e sono curioso di sapere cosa significhi.

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

Ho cercato "un passaggio dell'area di attendibilità non è riuscito a ridurre q". Trovate alcune informazioni nel pacchetto minqa , che diceva "Consulta Powell per una spiegazione". L'ho fatto (puoi farlo anche tu, se vuoi! Vedere i riferimenti e i collegamenti ad essi sotto), ma non riesco a capire. In effetti, non sono riuscito a trovare nulla sulla riduzione di q.

MJD Powell (2007) "Sviluppi di NEWUOA per la minimizzazione senza limiti senza derivati", Università di Cambridge, Dipartimento di Matematica applicata e Fisica teorica, Gruppo di analisi numerica, Rapporto NA2007 / 05, http://www.damtp.cam.ac.uk/ utente / na / NA_papers / NA2007_05.pdf .

MJD Powell (2009), "L'algoritmo BOBYQA per l'ottimizzazione vincolata limitata senza derivati", Rapporto n. DAMTP 2009 / NA06, Centre for Mathematical Sciences, Università di Cambridge, Regno Unito. http://www.damtp.cam.ac.uk/user/na/NA_papers/NA2009_06.pdf .

Ps So che posso cambiare l'ottimizzatore e vedrò se riesco a ottenere l'output senza avvisi o errori. Controllerò anche il gradiente e l'Assia se posso, come da un commento / risposta di Ben Bolker . Sto usando glmerall'interno dredgedi MuMIne non sono sicuro che la risposta di Ben funzionerà senza qualche aggiustamento aggiuntivo, ma ci lavorerò una volta che il mio computer avrà finito quello che sta facendo, comunque sto divagando.

Aggiornare

Secondo il commento del dottor Bolker di seguito, ho iniziato a cercare il codice FORTRAN ( ecco il codice per chiunque sia interessato a guardare ma non a scaricarlo ). "430" appare nella parte bobyqb.f del codice. Cerca semplicemente "430" o "riduci Q" per trovare il codice pertinente.

Questo è il mio primo incontro con il codice FORTRAN, ma penso che il codice affermi che se vengono soddisfatte le seguenti condizioni, genera l'avvertimento: NTRITS> 0, VQUAD> = 0, IPRINT> 0. "L'intero NTRITS è impostato sul numero" trust region " iterazioni che si sono verificate dall'ultima iterazione "alternativa". VQUADappare più volte e non sono ancora chiaro sul suo significato in quanto il suo valore sembra dipendere da una varietà di altre variabili, i cui valori a volte dipendono da altre variabili. Da bobyqa.f: "Il valore di IPRINT dovrebbe essere impostato su 0, 1, 2 o 3, che controlla la quantità di stampa. In particolare, non viene prodotto alcun output se IPRINT = 0 e viene prodotto solo al ritorno se IPRINT = 1. ".

Quindi, sembra che il compito sia capire il significato di VQUADessere> = 0 e, forse, capire come / quando è IPRINTdiventato> 0. Dovrò tornare al foglio per dare un'occhiata, ma la matematica, o a almeno la sua espressione simbolica, è un po 'una barriera per me. A meno che qualcuno non conosca l'algoritmo o abbia il desiderio di conoscerlo, penso che dovrò aumentare iterativamente la mia comprensione dell'avvertimento andando avanti e indietro tra i documenti, il codice e Internet fino a quando non capisco cosa si intende.


3
Penso che questa domanda possa essere in argomento per CV b / c sembra riguardare la comprensione delle idee piuttosto che aiutare w / R in sé.
gung - Ripristina Monica

Non sono sicuro di avere molto da suggerire in questo caso oltre ad andare passo dopo passo attraverso i documenti e il codice FORTRAN (che è incluso nella srcdirectory di cran.r-project.org/src/contrib/minqa_1. 2.3.tar.gz ) e vedere esattamente cosa sta succedendo quando questo errore (codice di errore 430 nel codice) viene attivato ...
Ben Bolker

1
Scorrendo rapidamente la carta penso che l'avvertimento indichi che l'ottimizzatore non riesce a trovare una direzione in cui l'approssimazione quadratica, Q, rispetto alla funzione che si desidera minimizzare, F, diminuisce. Cioè, l'ottimizzatore è in un punto che molto probabilmente non è ottimale ma non sa quale strada andare per migliorare l'obiettivo. Quindi, è bloccato.
Sven

1
quale dei due documenti hai sfogliato e approssimativamente dove hai trovato queste informazioni? (Anche io ho scremato ma non sono riuscito a fare la corrispondenza tra carta e codice così facilmente ...)
Ben Bolker

Ho letto il documento di BOBYQA. Ho analizzato la prima metà in circa 5 minuti per farmi un'idea di cosa stanno andando e di cosa sia la Q. Non riesco davvero a puntare a una pagina specifica.
Sven

Risposte:


13

f(x)xkk

  • Δk
  • f(x)x=xkQ(x)
  • skQk(xk+sk)||sk||Δk
  • skxk+1=xk+sk
  • Altrimenti, perfeziona il tuo modello e riprova

sk

Per capire il valore di VQUAD, dobbiamo prima capire alcune altre variabili. Fortunatamente, ci sono buoni commenti proprio sotto la dichiarazione di SUBROUTINE BOBYQB. Le variabili salienti sono:

  • GOPT, il gradiente del modello
  • HQ, l'Assia del modello
  • Dsk

A partire da alcune righe sopra 410, vedrai DO 410 J=1,N. Ciò avvia un ciclo continuo (e un ciclo annidato) che valuta il cambiamento previsto dal modello usando il passaggio di prova D. Accumula il cambiamento previsto in VQUAD. La prima parte del ciclo for valuta i termini del primo ordine e il ciclo nidificato valuta i termini del secondo ordine. Probabilmente sarebbe più facile leggere se i loop fossero rientrati, in questo modo:

    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

C'è un altro for-loop dopo questo per incorporare altri parametri nel modello. Devo ammetterlo, non lo capisco perfettamente - la mia ipotesi migliore è che sia particolare di come costruiscono il modello.

Alla fine di tutto ciò, VQUADtiene conto del cambiamento nella funzione obiettiva previsto dal modello. Quindi, se VQUADnon è negativo, è un male. Ora questo risolutore particolare può usare un calcolo di passi alternativo (probabilmente una ricerca di riga), che è dove NTRITSentra in gioco. Quindi la logica a 430 dice: "Se l'ultima iterazione ha utilizzato il calcolo del passaggio alternativo E il modello non prevede una riduzione E IPRINT> 0, stampa il messaggio di avviso". Si noti che il risolutore sta per terminare indipendentemente dal valore di IPRINT.

A proposito IPRINT, quel valore viene passato BOBYQAdalla funzione chiamante. In questo caso, la routine R è la funzione chiamante. C'è un verboseparametro per glmer- Vorrei essere fiocchi in dollari a cui viene passato lo stesso valore BOBYQA. Prova a impostare verbosesu 0 e probabilmente non vedrai l'avviso. Ma non cambierà quello che sta succedendo sotto il cofano, ovviamente.


1
questo è molto utile; Non credo che farò meglio, assegnando la taglia ...
Ben Bolker,

@BenBolker. Quindi dovrei essere preoccupato per quello che sta succedendo qui, o è davvero solo un fastidio nel codice? (In altre parole, questo avviso significa che i miei risultati non sono validi ??)
theforestecologist

1
il consiglio generale in questo caso è quanto affermato in ?lme4::convergence: a meno di una valutazione esaustiva / dettagliata della procedura di ottimizzazione, la cosa migliore da fare è confrontare i risultati di diversi ottimizzatori.
Ben Bolker,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.