Блестящие проблемы сходимости: как интерпретировать результаты allFit и сравнивать модели с различными оптимизаторами - PullRequest
0 голосов
/ 06 марта 2020

Я использую биномиальную логистику c с использованием lme4, которая построена следующим образом:

m2_DL <- glmer(Dest ~ Pb_on * Pb_type + Dest_tree + ZF_Dest + (1|Site), data = DF_DL_3, family = binomial(link = "logit"))

Все переменные являются коэффициентами, кроме ZF_Dest, который является числовым. Полная модель (m1) включает в себя одну дополнительную числовую переменную и работает нормально. Эта вторая модель, однако, не сходится с предупреждающим сообщением:

fixed-effect model matrix is rank deficient so dropping 6 columns / coefficients
Warning message:
In checkConv(attr(opt, "derivs"), opt$par, ctrl = control$checkConv,  :
  Model failed to converge with max|grad| = 0.00144561 (tol = 0.001, component 1)

В моем случае ожидается недостаток ранга и (я полагаю) не имеет отношения к проблеме здесь. Посмотрев онлайн, я обнаружил, что могу попытаться добавить следующий аргумент к своему блеску: control = glmerControl(optimizer = "bobyqa"), что действительно решает проблему.

Однако я хотел бы лучше понять, что делает эта функция, и если бы я все еще мог сравнивать свои модели, если только моя вторая модель имеет этот дополнительный аргумент. Это привело меня к этому вопросу на SO . В одном из комментариев к этому вопросу говорится: «Вы не использовали другой оптимизатор (по умолчанию для glmer используется bobyqa)». Но если это так, то почему добавление аргумента разрешило предупреждение, поскольку я не увеличивал количество итераций, как это иногда делается?

Из ответа на этот вопрос я понял, что если разность вероятностей обеих моделей близка, я указываю «ложный положительный результат» ошибки сходимости, что опять-таки имеет место для моих моделей. Я также прочитал help(converge) в соответствии с рекомендациями и использовал указанную там функцию allFit. Это выводит:

bobyqa : fixed-effect model matrix is rank deficient so dropping 6 columns / coefficients
[OK]
Nelder_Mead : fixed-effect model matrix is rank deficient so dropping 6 columns / coefficients
[OK]
nlminbwrap : fixed-effect model matrix is rank deficient so dropping 6 columns / coefficients
[OK]
nmkbw : fixed-effect model matrix is rank deficient so dropping 6 columns / coefficients
[OK]
optimx.L-BFGS-B : fixed-effect model matrix is rank deficient so dropping 6 columns / coefficients
[OK]
nloptwrap.NLOPT_LN_NELDERMEAD : fixed-effect model matrix is rank deficient so dropping 6 columns / coefficients
[OK]
nloptwrap.NLOPT_LN_BOBYQA : fixed-effect model matrix is rank deficient so dropping 6 columns / coefficients
[OK]
Warning messages:
1: In checkConv(attr(opt, "derivs"), opt$par, ctrl = control$checkConv,  :
  Model failed to converge with max|grad| = 0.0013785 (tol = 0.001, component 1)
2: In checkConv(attr(opt, "derivs"), opt$par, ctrl = control$checkConv,  :
  Model failed to converge with max|grad| = 0.00904036 (tol = 0.001, component 1)
3: In checkConv(attr(opt, "derivs"), opt$par, ctrl = control$checkConv,  :
  Model failed to converge with max|grad| = 0.00904036 (tol = 0.001, component 1)

, и объект, содержащий результаты allFit, содержит:

original model:
Dest ~ Pb_on * Pb_type + Dest_tree + ZF_Dest + (1 | Site) 
data:  DF_DL_3 
optimizers (7): bobyqa, Nelder_Mead, nlminbwrap, nmkbw, optimx.L-BFGS-B, nloptwrap.NLOPT_LN_N...
1 optimizer(s) failed
differences in negative log-likelihoods:
max= 6.65e-05 ; std dev= 3.41e-05 

Здесь вы видите, что 1 оптимизатор не прошел, и я получаю несколько предупреждений при использовании allFit. Теперь я понимаю, что не все оптимизаторы сделаны равными, и некоторые не будут работать для определенных данных. Проблема в том, что я не понимаю, как интерпретировать результат этой функции allFit, и я не уверен, какой оптимизатор дал сбой и стоит ли мне беспокоиться. Итак, в заключение, мои вопросы:

  1. Как оптимизатор BOBYQA мог решить проблему, если это действительно оптимизатор по умолчанию?

  2. Как мне интерпретировать результат allFit.

  3. Каков наилучший способ устранения предупреждения для второй модели. Является ли просто добавление control = glmerControl(optimizer = "bobyqa") подходящим?

  4. Если я добавлю этот аргумент к этой модели, могу ли я тогда еще честно сравнить эту модель с другими? (Примечание: я использую функцию anova для сравнения моделей).

Спасибо

РЕДАКТИРОВАТЬ 6-3-2020: В соответствии с запросом Роланда вот сводка объекта allFit:

$which.OK
                       bobyqa                   Nelder_Mead                    nlminbwrap                         nmkbw 
                         TRUE                          TRUE                          TRUE                          TRUE 
              optimx.L-BFGS-B nloptwrap.NLOPT_LN_NELDERMEAD     nloptwrap.NLOPT_LN_BOBYQA 
                        FALSE                          TRUE                          TRUE 

$msgs
$msgs$bobyqa
NULL

$msgs$Nelder_Mead
NULL

$msgs$nlminbwrap
NULL

$msgs$nmkbw
[1] "Model failed to converge with max|grad| = 0.0013785 (tol = 0.001, component 1)"

$msgs$nloptwrap.NLOPT_LN_NELDERMEAD
[1] "Model failed to converge with max|grad| = 0.00904036 (tol = 0.001, component 1)"

$msgs$nloptwrap.NLOPT_LN_BOBYQA
[1] "Model failed to converge with max|grad| = 0.00904036 (tol = 0.001, component 1)"


$fixef
                              (Intercept)    Pb_onL    Pb_onN     Pb_onS Pb_typeNG Pb_typeSong Dest_treeL    ZF_Dest
bobyqa                          0.4421569 0.5633434 0.1788602 -0.2046165 0.1777216  -0.1115736  0.5845617 0.01578428
Nelder_Mead                     0.4420709 0.5633071 0.1788488 -0.2046262 0.1777301  -0.1115980  0.5845859 0.01578563
nlminbwrap                      0.4421020 0.5633365 0.1788603 -0.2046102 0.1777225  -0.1115746  0.5845682 0.01578510
nmkbw                           0.4423417 0.5635447 0.1791150 -0.2045143 0.1781367  -0.1114576  0.5844313 0.01578639
nloptwrap.NLOPT_LN_NELDERMEAD   0.4434285 0.5612392 0.1765273 -0.2063090 0.1773619  -0.1140108  0.5852130 0.01579032
nloptwrap.NLOPT_LN_BOBYQA       0.4434285 0.5612392 0.1765273 -0.2063090 0.1773619  -0.1140108  0.5852130 0.01579032
                              Pb_onL:Pb_typeNG Pb_onN:Pb_typeNG Pb_onL:Pb_typeSong Pb_onN:Pb_typeSong
bobyqa                               -1.140386       -0.1635209         -0.5446501         -0.2497627
Nelder_Mead                          -1.140380       -0.1635345         -0.5445915         -0.2497404
nlminbwrap                           -1.140389       -0.1635264         -0.5446236         -0.2497616
nmkbw                                -1.140884       -0.1640907         -0.5448729         -0.2500731
nloptwrap.NLOPT_LN_NELDERMEAD        -1.138619       -0.1624441         -0.5413400         -0.2461967
nloptwrap.NLOPT_LN_BOBYQA            -1.138619       -0.1624441         -0.5413400         -0.2461967

$llik
                       bobyqa                   Nelder_Mead                    nlminbwrap                         nmkbw 
                    -826.3143                     -826.3143                     -826.3143                     -826.3143 
nloptwrap.NLOPT_LN_NELDERMEAD     nloptwrap.NLOPT_LN_BOBYQA 
                    -826.3143                     -826.3143 

$sdcor
                              Site.(Intercept)
bobyqa                                1.537530
Nelder_Mead                           1.537517
nlminbwrap                            1.537501
nmkbw                                 1.537453
nloptwrap.NLOPT_LN_NELDERMEAD         1.538042
nloptwrap.NLOPT_LN_BOBYQA             1.538042

$theta
                              Site.(Intercept)
bobyqa                                1.537530
Nelder_Mead                           1.537517
nlminbwrap                            1.537501
nmkbw                                 1.537453
nloptwrap.NLOPT_LN_NELDERMEAD         1.538042
nloptwrap.NLOPT_LN_BOBYQA             1.538042

$times
                              user.self sys.self elapsed user.child sys.child
bobyqa                             6.51        0    6.55         NA        NA
Nelder_Mead                        3.06        0    3.06         NA        NA
nlminbwrap                         2.22        0    2.22         NA        NA
nmkbw                              2.17        0    2.17         NA        NA
nloptwrap.NLOPT_LN_NELDERMEAD      0.94        0    0.94         NA        NA
nloptwrap.NLOPT_LN_BOBYQA          0.86        0    0.86         NA        NA

$feval
                       bobyqa                   Nelder_Mead                    nlminbwrap                         nmkbw 
                         3098                          1274                            NA                           672 
nloptwrap.NLOPT_LN_NELDERMEAD     nloptwrap.NLOPT_LN_BOBYQA 
                           97                            97 

attr(,"class")
[1] "summary.allFit"

Использование car::vif(full_model) для проверки коллинеарности приводит к:

> car::vif(m1_DD)
                   GVIF Df GVIF^(1/(2*Df))
Pb_on         17.606990  3        1.612925
Pb_type       20.180212  2        2.119490
ZF_Dest        1.015237  1        1.007589
ZF_Other       1.006738  1        1.003364
Pb_on:Pb_type 96.910527  4        1.771317

Поскольку я не уверен на 100%, как их интерпретировать, я использовал эту ссылку, которая подсказывает, что я не должен не слишком переживай. В одном ответе говорится: «Правило GVIF (1 / (2 × Df)) <2 применяется в некоторых публикациях, что равняется обычному VIF 4 для однофакторных переменных». Таким образом, Pb_type может создать проблему, но я часто видел, что VIF 10 считается «приемлемым», поэтому я думаю, что это нормально. </p>

РЕДАКТИРОВАТЬ 10-3-2020 После еще немного поиска (теперь, когда я знаю, что на самом деле делает bobyqa, благодаря meriops !), я наткнулся на эту тему . Читая ответ там, я считаю, что мои ответы теперь выглядят следующим образом:

  1. В соответствии с тем, что сказал meriops: «по умолчанию glmer использует двухэтапную оптимизацию с bobyqa для первой стадии. и Nelder-Mead для второго этапа. Поэтому, когда вы меняете оптимизатор на bobyqa, вы используете bobyqa для обоих этапов. "

  2. Основано на ответе Бена Болкера в этой теме , и мои собственные вероятности отличаются <0,1, это может означать, что предупреждение было ложно положительным с самого начала. На данный момент я все еще хочу настроить оптимизаторы. </p>

  3. Исходя из вышеупомянутой темы, я теперь полагаю, что это действительно хорошо.

  4. Аналогично, вышеупомянутая тема предлагает этого не делать быть проблемой в моем случае. Так как мои модели действительно вложенные.

Если кто-либо из вас sh разработает ваши комментарии или внесет их в полные ответы, сделайте это, тогда я приму их.

1 Ответ

0 голосов
/ 24 марта 2020

Похоже, что здесь вы ответили на многие ваши вопросы, но у меня есть несколько рекомендаций:
- Подгонка всех моделей с одинаковыми оптимизаторами
- Центрирование и масштабирование любых непрерывных предикторов в В вашем случае вы должны обернуть ZF_Dest в масштабе, как это scale(ZF_Dest), когда вы звоните своим моделям. Это может помочь с проблемами конвергенции.

Что-то, что мне очень помогло за последние годы, - страница часто задаваемых вопросов Бена Болкера для GLMM. Там много полезной информации о таких вопросах.

https://bbolker.github.io/mixedmodels-misc/glmmFAQ.html

...