2016-08-28 17 views
0

以下の関数があります。最適化で最適化されたプロファイリング関数

funk <- function(x,b) { 10^b * exp(-x/10) } 

lambda <- function(y,k) { exp(-k*y) } 

funk1 <- function(y,x,xb,b,k) { 
funk(x-xb-y,b) *exp(- integrate(lambda, lower=0, upper = y, k=k)$value) } 

funk2 <-function(x,xb,b,k) { 
integrate(funk1, lower= 0, upper=x-xb, x=x,xb=xb, b=b,k=k)$value } 

funk2_vc <- Vectorize(funk2) 

optim_funk2 <- function(param) { 
b <-param[1] 
k <- param[2]    
R1 <- sum((y - funk2_vc(xx,xb,b,k))^2) 
-log(R1) } 

fit <- optim(par=c(5, 0.05), fn=optim_funk2) 

xx <- seq(0,500,5) 
xb <- seq(0,100,1) 
y <- seq(1000,0,-10) 

私はoptimは、パラメータ値を推定するために取られたと機能は、ローカルまたはグローバル極小のためoptimiziedされている場合、パスを把握するための機能funk2をプロファイルしたいです。

私はRの初心者ですが、どのように手がかりを持っているのでしょうか。すべての提案は大歓迎です。

答えて

1

ここでは、パラメータのパスを追跡する簡単な方法があります。私は線形回帰を例として使用します。我々のデータはそう

x <- 1:10 
y <- -3 + 2 * x + rnorm(length(x)) 
plot(x, y) 

yであると言うことはxプラスいくつかのノイズの線形関数です。我々の目標は、平方誤差の合計がsum((y - (a + b * x))^2)が最小になるようなパラメータaおよびbを見つけることである。 (もちろん、この缶は、代数的に解くことが、説明のために、我々はoptim()でそれを解決します。)

は、ここでの最適化を行い、パラメータを追跡するためのコードです:

par.path <- matrix(nrow=0, ncol=2, dimnames=list(NULL, c("a","b"))) 

funk <- function(par) { 
    a <- par[1]; b <- par[2] 
    par.path <<- rbind(par.path, par) 
    sum((y - (a + b * x))^2) 
} 

optim(par=c(0,0), fn=funk) 

最初の行が作成されますパラメータパスを格納するためにpar.pathと呼ばれる0行の行列。目的関数funk内で、現在の値parpar.pathに追加します。 ではなく、をfunkの範囲外に置いているため、<-ではなく<<-を使用する必要があります。 (<-を使用した場合、funkpar.pathとも呼ばれる新しいローカル変数を作成し、関数外のpar.pathは更新されません)。optimfunkを繰り返し呼び出しますので、par.pathは徐々に長くなります。

行列をプロットする方法はさまざまです。par.path。この場合には2つのパラメータのみがあるので、私たちはお互いに対してそれらをプロットすることができます

plot(par.path, type='l') 
points(par.path[c(1,nrow(par.path)),], col=c("green","red"), cex=2, pch=16) 

2行目は、パスの開始と停止を示すために、緑と赤のドットを追加します。より柔軟に、我々はoptimの反復数に対してpar.pathのすべての列をプロットすることができます:ここで

matplot(par.path, type='l', col=c("black","red"), lty=1) 
legend("bottomleft", c("a","b"), col=c("black","red"), lty=1) 

は、これら2つのプロットです。 paramter path plots

+0

本当に分かりやすく解答してくれてありがとう。私は何か他のものを探していましたが、まったく同じロジックを使って答えを見つけました。ありがとう、トン! – VitalSigns

関連する問題