glmer中收敛警告的含义

机器算法验证 r 优化 lme4-nlme 收敛 咕噜咕噜
2022-01-17 23:16:04

我正在使用R 中的包中的glmer函数,并且正在使用优化器(即在我的情况下的默认值)。我收到一个警告,我很好奇这意味着什么。 lme4bobyqa

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

我搜索了“一个信任区域步骤未能减少 q”。在minqa 包中找到一些信息,上面写着“Consult Powell for explain”。我做到了(如果你愿意,你也可以!请参阅下面的参考资料和链接),但我不明白。事实上,我没有找到任何关于减少 q 的信息。

MJD Powell (2007) “无导数的无约束最小化 NEWUOA 的发展”,剑桥大学,应用数学和理论物理系,数值分析组,报告 NA2007/05,http: //www.damtp.cam.ac.uk/用户/na/NA_papers/NA2007_05.pdf

MJD Powell (2009),“无导数约束优化的 BOBYQA 算法”,报告编号 DAMTP 2009/NA06,英国剑桥大学数学科学中心。http://www.damtp.cam.ac.uk/user/na/NA_papers/NA2009_06.pdf

Ps 我知道我可以更改优化器,我会看看我是否可以在没有警告或错误的情况下获得输出。根据 Ben Bolker的评论/回答,如果可以的话,我还将检查梯度和 Hessian 我正在使用glmerwithin dredgefrom MuMIn,我不确定Ben的答案是否会在没有额外修改的情况下工作,但是一旦我的计算机完成它正在做的事情,我就会继续工作,无论如何,我离题了。

更新

根据下面博克博士的评论,我开始查看 FORTRAN 代码(这里是任何有兴趣但不下载它的人的代码)。“430”出现在代码的 bobyqb.f 部分。只需搜索“430”或“减少Q”即可找到相关代码。

这是我第一次遇到 FORTRAN 代码,但我认为代码说如果满足以下条件,则产生警告:NTRITS> 0,VQUAD> = 0,IPRINT> 0。“整数 NTRITS 设置为数字“信任区域”自上次“替代”迭代以来发生的迭代。” VQUAD出现了好几次,我还不清楚它的重要性,因为它的值似乎取决于各种其他变量,这些变量的值有时取决于其他变量。来自 bobyqa.f:“IPRINT 的值应该是设置为0、1、2或3,控制打印量。具体来说,如果IPRINT=0则不输出,如果IPRINT=1则仅在返回时输出。

所以,似乎任务是弄清楚VQUAD>= 0 的意义,也许,理解 / 何时IPRINT变成 > 0。我得回去看看论文,但是数学,或者至少它的象征性表达,对我来说有点障碍。除非有人知道该算法或有了解它的愿望,否则我认为我将不得不通过在论文、代码和互联网之间来回反复来增加我对警告的理解,直到我理解它是什么方法。

1个回答

在进入代码之前,让我给你一个关于信任区域方法的快速入门。成为您的目标函数,成为您当前的迭代。通用信任域方法的迭代看起来像这样:f(x)xkk

  • 选择一个最大步长,Δk
  • 处建立的模型;称之为f(x)x=xkQ(x)
  • 根据约束找到最小化的步骤skQk(xk+sk)||sk||Δk
  • 如果 “足够好”,让skxk+1=xk+sk
  • 否则,请优化您的模型并重试

确定是否“足够好”的方法之一是将模型预测的减少与目标函数的实际减少进行比较。这就是 430 之后的代码部分所做的。然而,在此之前,有一个快速的健全性检查,看看模型是否预测会减少。这就是 430 发生的事情。sk

要了解 的值VQUAD,我们首先必须了解其他一些变量。幸运的是,在声明的正下方有很好的评论SUBROUTINE BOBYQB显着变量是:

  • GOPT, 模型的梯度
  • HQ, 模型的 Hessian
  • D,试用步骤(我在上面调用了这个sk

从 410 以上几行开始,您会看到DO 410 J=1,N. 这将开始一个 for 循环(和一个嵌套的 for 循环),该循环使用试用 step 评估模型预测的变化D它累积 中的预测变化VQUADfor 循环的第一部分计算一阶项,嵌套的 for 循环计算二阶项。如果循环缩进可能会更容易阅读,如下所示:

    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

在此之后还有另一个 for 循环将其他参数合并到模型中。我不得不承认,我并不完全理解这一点——我最好的猜测是他们如何构建模型是特别的。

最后,VQUAD保留模型预测的目标函数的变化。所以如果VQUAD是非负的,那就不好了。现在,这个特定的求解器可以使用替代步骤计算(可能是线搜索),这就是NTRITS发挥作用的地方。所以 430 处的逻辑是说,“如果最后一次迭代使用了替代步骤计算并且模型没有预测下降 AND IPRINT> 0,则打印警告消息。” 请注意,无论 的值如何,求解器都会终止IPRINT

说到IPRINT,该值是BOBYQA由调用函数传递给的。在这种情况下,您的 R 例程是调用函数。有一个verbose参数glmer- 我会是一角钱,同样的价值被传递给BOBYQA. 尝试设置verbose为 0,您可能不会看到警告。但它当然不会改变幕后发生的事情。