Rには最適化関数がいくつかありますが、optimを使っている人も多いと思います。
optimの基本的な使い方他の記事を参照いただくとして、
(例えば)http://qiita.com/HirofumiYashima/items/c2e9ff4e3e9283ec1691
実際に使ってみると目的関数(fr)に最適化対象のパラメータ(par)以外の変数を渡す方法が分からず、手間取ったのでメモしておきます。
結論から書くと、optimの引数に渡したい変数を直接書けばよいです。
※実はoptimのマニュアルにも書いてありました。
... Further arguments to be passed to fn and gr.
マニュアルの例を参考に説明します。以下の最適化問題において、
fr <- function(x) { ## Rosenbrock Banana function
x1 <- x[1]
x2 <- x[2]
100 * (x2 - x1 * x1)^2 + (1 - x1)^2
}
目的関数(fr)の変数はxだけですので、
> optim(c(-1.2,1), fr)
$par
[1] 1.000260 1.000506
$value
[1] 8.825241e-08
で実行できます。
しかし、実際に何かの分析に使うときは目的関数を次のように一般的にして、
fr <- function(x, a, b) {
x1 <- x[1]
x2 <- x[2]
b * (x2 - x1 * x1)^2 + (a - x1)^2
}
データや要求に応じて適切なパラメータ(a,b)を与えて最適化したい場合もあります。
その場合、まず上記の目的関数fr(x,a,b)を定義して、optimの引数にparとなるx以外のa, bを明示的に渡します。(a, b)=(1, 100)とすると、
>optim(c(-1.2,1), fr, a=1, b=100)
$par
[1] 1.000260 1.000506
$value
[1] 8.825241e-08
となって、マニュアルの例と同じ結果になります。この例で用いられているRosenbrockのbanana functionの最適解は(解析的に)x1=a, x2=a^2になりますので、(a, b)=(10, 100)とすると、
> optim(c(-1.2,1), fr, a=10, b=100)
$par
[1] 9.999857 99.997107
$value
[1] 1.793687e-07
となります。他の最適化手法("BFGS"等)を選ぶ場合に、(必須ではありませんが)grも与えたい時はfrに合わせて定義式を書き換えます。