在R中使用`nls.lm`时如何处理边界约束

Zhe*_*lei 24 r mathematical-optimization nls

我刚才问了这个问题.我不确定是否应将此作为答案或新问题发布.我没有答案但是我通过nls.lm在R中应用Levenberg-Marquardt算法"解决"了这个问题,当解决方案在边界时,我运行信任区域反射算法(TRR,在R中实现)来执行远离它.现在我有了新的问题.

根据我的经验,以这种方式,程序达到最佳状态,并且对起始值不那么敏感.但这只是一种实用的方法,可以解决我遇到的问题nls.lm以及R中的其他优化函数.我想知道为什么nls.lm这种方式对于边界约束的优化问题以及如何nls.lm在实践中使用时处理边界约束.

下面我举例说明使用的两个问题nls.lm.

  1. 它对起始值很敏感.
  2. 当某个参数到达边界时停止.

可重复的示例:焦点数据集D.

library(devtools)
install_github("KineticEval","zhenglei-gao")
library(KineticEval)
data(FOCUS2006D)
km <- mkinmod.full(parent=list(type="SFO",M0 = list(ini   = 0.1,fixed = 0,lower = 0.0,upper =Inf),to="m1"),m1=list(type="SFO"),data=FOCUS2006D)
system.time(Fit.TRR <- KinEval(km,evalMethod = 'NLLS',optimMethod = 'TRR'))
system.time(Fit.LM <- KinEval(km,evalMethod = 'NLLS',optimMethod = 'LM',ctr=kingui.control(runTRR=FALSE)))
compare_multi_kinmod(km,rbind(Fit.TRR$par,Fit.LM$par))
dev.print(jpeg,"LMvsTRR.jpeg",width=480)
Run Code Online (Sandbox Code Playgroud)

LM适合vs TRR适合

描述模型/系统的微分方程是:

"d_parent = - k_parent * parent"                                                 
"d_m1 = - k_m1 * m1 + k_parent * f_parent_to_m1 * parent" 
Run Code Online (Sandbox Code Playgroud)

在左边的图中是带有初始值的模型,中间是使用"TRR"的拟合模型(类似于Matlab lsqnonlin函数中的算法),右边是使用"LM"的拟合模型nls.lm.查看拟合参数(Fit.LM$par),您会发现一个拟合参数(f_parent_to_m1)位于边界处1.如果我将一个参数的起始值M0_parent从0.1更改为100,那么我使用nls.lm和得到相同的结果lsqnonlin.我有很多这样的情况.

newpars <- rbind(Fit.TRR$par,Fit.LM$par)
rownames(newpars)<- c("TRR(lsqnonlin)","LM(nls.lm)")
newpars

                   M0_parent   k_parent        k_m1 f_parent_to_m1
TRR(lsqnonlin)  99.59848 0.09869773 0.005260654       0.514476
LM(nls.lm)      84.79150 0.06352110 0.014783294       1.000000
Run Code Online (Sandbox Code Playgroud)

除了上述问题之外,经常发生的返回的Hessian nls.lm是不可逆的(特别是当一些参数在边界上时),所以我无法得到协方差矩阵的估计.在另一方面中,"TRR"算法(在Matlab)几乎总是通过在溶液点计算雅可比得到的估计.我认为这很有用,但我也确定R优化算法(我试过的算法)没有这样做是有原因的.我想知道我是否错了利用计算的协方差矩阵来获得标准误差参数估计值的Matlab的方式.

最后一点,我在之前的帖子中声称Matlab lsqnonlin几乎在所有情况下都优于R的优化功能.我错了.如上所示,如果在R中实现,Matlab中使用的"Trust-Region-Reflective"算法实际上更慢(有时慢得多).然而,它仍然比R的基本优化算法更稳定并且达到了更好的解决方案.

小智 1

首先,我不是 Matlab 和优化方面的专家,也从未使用过 R。

\n\n

我不确定我明白你的实际问题是什么,但也许我可以解释你的困惑:

\n\n

LM 是稍微增强的 Gau\xc3\x9f-Newton 方法 - 对于具有多个局部最小值的问题,它对初始状态非常敏感。包含边界通常会产生更多的最小值。

\n\n

TRR 类似于 LM,但更稳健。它具有更好的“跳出”不良局部最小值的能力。它很可能会比 LM 表现更好,但表现更差。实际上解释原因非常困难。您需要详细研究算法并了解它们在这种情况下的行为方式。

\n\n

我无法解释 Matlab 和 R 实现之间的区别,但 TRR 的一些扩展可能是 Matlab 使用的,而 R 没有。\n你交替使用 LM 和 TRR 的方法是否比单独使用 TRR 收敛得更好?

\n