在“R”中更改nls.lm()中的目标函数

时间:2013-01-23 14:37:08

标签: r nonlinear-functions nonlinear-optimization

我正在使用函数nls.lm {package:minpack.lm}来优化水文模型的参数。该功能运行良好,但我想使用其他objective function (OF)。通常,nls.lm中的对象函数“fn”定义为

A function that returns a vector of residuals, the sum square of which 
is to be minimized. The first argument of fn must be par.

现在我想使用Nash-Sutcliff-Efficiency,它被定义为

NSE <- 1 - (sum((obs - sim)^2) / sum((obs - mean(obs))^2))

或其他OF。问题是nls.lm最小化了表达式sum(x)^2,只有x是可修改的。我知道best fit NSE = 1。因此1 - NSE会产生真正的最小化问题。

BTW:来自nls.lm help page的示例1就是一个很好的例子;那里

observed - getPred(p,xx)

被最小化,实际上意味着什么

sum ( observed - getPred(p,xx) )^2

nls.lm函数最小化,而getPred(p,xx)返回sim

任何建议都会有所帮助。提前致谢。 米莎

1 个答案:

答案 0 :(得分:1)

nls.lm(以及相关函数nls和nlsLM)旨在最小化残差的总和平方。对于你想要解决的问题,我会尝试应用通用的最小化器。

如果问题“不太难”(也就是说,只有一个全局最小值,顺利),你可以尝试对它应用'optim'(我会尝试'Nelder-Mead'和'BFGS'选项第一),或'minqa'包中的'bobyqa'功能,以及其他功能。

如果问题需要全局优化器,您可以尝试“GenSA”包中的“GenSA”功能,“rgenoud”包中的“genoud”功能,或“DEOPtim”包中的“DEOPtim”功能,其他选择。 “统计软件期刊”即将对“全局优化R”进行评论,这将对适用的功能进行更全面的概述。