Korzystam z glmer
funkcji z lme4
pakietu w R i używam bobyqa
optymalizatora (tj. Domyślnego w moim przypadku). Dostaję ostrzeżenie i jestem ciekaw, co to znaczy.
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
Szukałem „krok regionu zaufania nie zmniejszył q”. Znalazłem pewne informacje w pakiecie minqa , który powiedział „Skonsultuj się z Powellem w celu uzyskania wyjaśnień”. Zrobiłem (możesz też, jeśli chcesz! Zobacz odnośniki i linki do nich poniżej), ale nie rozumiem. W rzeczywistości nie udało mi się znaleźć niczego na temat zmniejszenia q.
MJD Powell (2007) „Opracowanie NEWUOA na rzecz nieograniczonej minimalizacji bez pochodnych”, Cambridge University, Department of Applied Mathematics and Theoretical Physics, Numerical Analysis Group, Raport NA2007 / 05, http://www.damtp.cam.ac.uk/ użytkownik / na / NA_papers / NA2007_05.pdf .
MJD Powell (2009), „Algorytm BOBYQA dla ograniczonej optymalizacji bez pochodnych”, raport nr DAMTP 2009 / NA06, Centre for Mathematical Sciences, University of Cambridge, UK. http://www.damtp.cam.ac.uk/user/na/NA_papers/NA2009_06.pdf .
Ps Wiem, że mogę zmienić optymalizator i zobaczę, czy mogę uzyskać dane wyjściowe bez ostrzeżeń i błędów. Sprawdzę również gradient i Hesję, jeśli mogę, zgodnie z komentarzem / odpowiedzią Bena Bolkera . Używam od glmer
wewnątrz i nie jestem pewien, czy odpowiedź Bena zadziała bez dodatkowego majsterkowania, ale popracuję nad tym, gdy mój komputer skończy to, co robi, zresztą dygresuję.dredge
MuMIn
Aktualizacja
Zgodnie z komentarzem dr Bolkera poniżej zacząłem przeglądać kod FORTRAN ( tutaj jest kod dla wszystkich zainteresowanych przeglądaniem, ale nie pobieraniem go ). „430” pojawia się w części kodu bobyqb.f. Po prostu wyszukaj „430” lub „zmniejsz Q”, aby znaleźć odpowiedni kod.
To jest moje pierwsze spotkanie z kodem FORTRAN, ale myślę, że kod mówi, że jeśli spełnione są następujące warunki, wygeneruj ostrzeżenie: NTRITS
> 0, VQUAD
> = 0, IPRINT
> 0. „Liczba całkowita NTRITS jest ustawiona na liczbę„ region zaufania ” iteracje, które miały miejsce od ostatniej „alternatywnej” iteracji. VQUAD
pojawia się kilka razy i nie jestem jeszcze pewien jego znaczenia, ponieważ jego wartość wydaje się zależeć od wielu innych zmiennych, których wartości czasami zależą od innych zmiennych. Od bobyqa.f: „Wartość IPRINT powinna wynosić ustawioną na 0, 1, 2 lub 3, która kontroluje ilość wydruków. W szczególności nie ma danych wyjściowych, jeśli IPRINT = 0, a wyniki są zwracane tylko wtedy, gdy IPRINT = 1. ”.
Wygląda więc na to, że zadaniem jest ustalenie znaczenia VQUAD
bycia> = 0 i być może zrozumienie, jak / kiedy IPRINT
stało się> 0. Będę musiał wrócić do gazety, aby się przyjrzeć, ale matematyki lub przynajmniej jego symboliczny wyraz, jest dla mnie trochę barierą. Chyba, że ktoś wie o algorytmie lub chce się o nim dowiedzieć, myślę, że będę musiał iteracyjnie zwiększyć moje zrozumienie ostrzeżenia, przechodząc w obie strony między dokumentami, kodem i Internetem, dopóki nie zrozumiem, co to jest znaczy.
src
katalogu cran.r-project.org/src/contrib/minqa_1. 2.3.tar.gz ) i dokładne widzenie, co się dzieje, gdy ten błąd (kod błędu 430 w kodzie) zostanie wyzwolony ...Odpowiedzi:
Aby zrozumieć wartość
VQUAD
, musimy najpierw zrozumieć kilka innych zmiennych. Na szczęście są dobre komentarze tuż pod deklaracjąSUBROUTINE BOBYQB
. Istotne zmienne to:GOPT
, gradient modeluHQ
, Hesjan modeluD
Począwszy od kilku linii powyżej 410, zobaczysz
DO 410 J=1,N
. To rozpoczyna pętlę for (i zagnieżdżoną pętlę for), która ocenia zmianę przewidywaną przez model w kroku próbnymD
. Gromadzi przewidywaną zmianę wVQUAD
. Pierwsza część pętli for ocenia warunki pierwszego rzędu, a zagnieżdżona pętla for ocenia warunki drugiego rzędu. Prawdopodobnie łatwiej byłoby odczytać, gdyby pętle były wcięte, jak poniżej:Po tym jest kolejna pętla for, która uwzględnia inne parametry w modelu. Muszę przyznać, że nie do końca to rozumiem - domyślam się, że jest to związane z tym, jak budują model.
Pod koniec tego wszystkiego
VQUAD
utrzymuje zmianę funkcji celu przewidywaną przez model. Więc jeśliVQUAD
nie jest ujemny, to źle. Teraz ten konkretny solver może wykorzystywać alternatywne obliczenia krokowe (prawdopodobnie wyszukiwanie liniowe), które właśnieNTRITS
wchodzą w grę. Logika przy 430 mówi: „Jeśli w ostatniej iteracji zastosowano alternatywne obliczenie kroku ORAZ model nie przewiduje spadku ORAZIPRINT
> 0, wydrukuj komunikat ostrzegawczy”. Zauważ, że solver zakończy działanie niezależnie od wartościIPRINT
.Mówiąc o
IPRINT
, ta wartość jest przekazywanaBOBYQA
przez funkcję wywołującą. W takim przypadku procedura R jest funkcją wywoływania. Jestverbose
parametr doglmer
- Byłbym groszem do dolarów, do których ta sama wartość jest przekazywanaBOBYQA
. Spróbuj ustawić wartośćverbose
0, a prawdopodobnie nie zobaczysz ostrzeżenia. Ale oczywiście nie zmieni tego, co dzieje się pod maską.źródło
?lme4::convergence
: bez wyczerpującej / szczegółowej oceny procedury optymalizacji, najlepiej jest porównać wyniki różnych optymalizatorów.