我正在使用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产生了一个真正的最小化问题。

顺便说一句:nls.lm help page中的示例1是一个很好的例子;那里

observed - getPred(p,xx)


被最小化,实际上意味着

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


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

任何建议都会有所帮助。提前致谢。
cha茶

最佳答案

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

如果问题不是“太难”(也就是说,有一个全局最小值,则很平滑),则可以尝试对其应用“优化”(我会先尝试使用“ Nelder-Mead”和“ BFGS”选项) ,或软件包“ minqa”中的“ bobyqa”功能,以及其他功能。

如果问题需要全局优化程序,则可以尝试使用软件包“ GenSA”中的“ GenSA”功能,软件包“ rgenoud”中的“ genoud”功能或软件包“ DEoptim”中的“ DEoptim”功能。 《统计软件》杂志上即将对“ R中的全局优化”进行综述,这将提供适用功能的更完整概述。

关于r - 在“R”中的nls.lm()中更改目标函数,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/14482220/

10-12 21:56