2013-01-23 64 views
3

我正在使用函數nls.lm {package:minpack.lm}來優化水文模型的參數。該功能工作得很好,但我想用其他objective function (OF)。通常情況下,obective功能的「Fn」在nls.lm被定義爲在「R」中的nls.lm()中更改目標函數

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)) 

或其他。問題是nls.lm最小化表達式sum(x)^2,只有x是可修改的。我知道best fit NSE = 1。因此1 - NSE創建了一個真正的最小化問題。

順便說一句:從nls.lmhelp page的例1是一個很好的例子;有

observed - getPred(p,xx) 

被最小化,究竟意味着

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

nls.lm功能最小化,而getPred(p,xx)回報sim

任何建議都會有幫助。提前致謝。 Micha

回答

1

nls.lm(和相關函數nls和nlsLM)被設計成使殘差的平方和最小。對於你想解決的問題,我會嘗試應用一個通用的最小化器。如果問題'不太難'(也就是說,有一個單一的全局最小值,是平滑的),你可以試着對它應用'優化'(我會嘗試'Nelder-Mead'和'BFGS '選項首先),或包'minqa'中的'bobyqa'函數等功能。

如果問題需要全局優化器,那麼可以嘗試'GenSA'包中的'GenSA'函數,'rgenoud'包中的'genoud'函數或'DEoptim'包中的'DEoptim'函數,以及其他選項。 「統計軟件雜誌」即將對「全球優化R」進行回顧,並對適用功能進行更全面的概述。

+0

嗯,爲什麼downvote? (OP確實表示「任何建議都會有幫助」......) –