0

これが私のコードです:DEoptimアルゴリズムで最適化される関数。機能は実にシンプルです。

再現可能なコード:

library(DEoptim)
library(sm)

tau.0 <- c(58.54620, 61.60164, 64.65708, 71.19507, 82.39836, 101.28953, 119.68789)
rate <- c(0.04594674, 0.01679026, 0.02706263, 0.04182605, 0.03753949, 0.04740187, 0.05235710)
Du <- c(4.27157210, -0.07481174, -0.10551229, 0.51753843, 1.51075420, 6.51483315, 7.35631500)
Co <- c(0.2364985, -6.2947479, -7.5422644, -1.2745887, -42.6203118, 55.7663196, 70.9541141)

h <- h.select(x = tau.0, y = rate, method = 'cv')
sm <- sm.regression(x = tau.0, y = rate, h = h)
ya <- sm$estimate
xa <- sm$eval.points
y <- approx(x = xa, y = ya, xout = tau.0, rule = 2)$y

besty <- function(x) {

    dtau.0 <- x
    xout <- seq(1, max(tau.0), dtau.0)
    ratem <- approx(x = tau.0, y = rate / 1, xout = xout)$y
    ym <- approx(x = tau.0, y = y / 1, xout = xout)$y
    Dum <- approx(x = tau.0, y = Du, xout = xout)$y
    Com <- approx(x = tau.0, y = Co, xout = xout)$y
    dy <- NULL

    for(i in 1:length(ym)) {

        dy[i] <- ratem[i] - ym[i-1]

    }

    dy[is.na(dy)] <- na.omit(dy)[1]
    Dum[is.na(Dum)] <- na.omit(Dum)[1]
    Com[is.na(Com)] <- na.omit(Com)[1]
    dP <- Dum * dy - .5 * Com * dy ^ 2
    xout.m <- xout / 12
    dcurve <- cbind(dP * 100, xout.m)
    PVBP <- dcurve[which(dP == max(dP)),1]
    Maty <- dcurve[which(dP == max(dP)),2]

    return(- PVBP / x)

}

DEoptim(fn = besty, lower = 1, upper = 120)

私には最後のコマンドが返されます

ERROR: unsupported objective function return value

DEoptim最適化に成功しないコードの何が問題になっていますか?

最後の関数のコマンドラインを置き換えると

return(- PVBP / x)

return(as.numeric(- PVBP / x))

DEoptim数回の反復まではうまくいくようですが、それから...

> DEoptim(fn = besty, lower = 1, upper = 12)
Iteration: 1 bestvalit: -0.898391 bestmemit:    1.186242
Iteration: 2 bestvalit: -0.903304 bestmemit:    1.185117
Iteration: 3 bestvalit: -0.999273 bestmemit:    1.043355
Iteration: 4 bestvalit: -0.999273 bestmemit:    1.043355
Error in DEoptim(fn = besty, lower = 1, upper = 12) : 
  unsupported objective function return value

多分関数構文の何か?

みんなありがとう :)

4

2 に答える 2

3

あなたが何をしようとしているのかわからないので、正確な答えを出すことはできません。ただし、何が間違っているかを理解するための手順を次に示します。

  1. 関数を次のように変更します。

    besty <- function(x) {
        cat(x, "\n")
        dtau.0 <- x
        xout <- seq(1, max(tau.0), dtau.0)
       <snip>
    
  2. オプティマイザーを実行すると、次のようになります。

    set.seed(1)
    DEoptim(fn = besty, lower = 1, upper = 120)
    

    渡された値が出力されます。

    32.6 
    45.28 
    69.17
    .... 
    

    特に、値x = 8.353が渡されると壊れます。

  3. 次に、この特定の値を使用して関数をステップ実行します。つまり、

    x = 8.353
    dtau.0 <- x
    xout <- seq(1, max(tau.0), dtau.0)
    ratem <- approx(x = tau.0, y = rate / 1, xout = xout)$y
    ym <- approx(x = tau.0, y = y / 1, xout = xout)$y
    Dum <- approx(x = tau.0, y = Du, xout = xout)$y
    Com <- approx(x = tau.0, y = Co, xout = xout)$y
    ....
    

    あなたが何をしているのか正確にはわからないので、何が「間違っている」のかはわかりません。

于 2012-11-09T12:57:24.357 に答える
1

Aaron、Joshua Ulrich、および csgilespie のヒントにより解決しました。

コードが正しく機能するためには、次の 2 つの変更が必要です。

...
PVBP <- dcurve[which(dP == max(dP)),1]
Maty <- dcurve[which(dP == max(dP)),2]
...

に置き換える必要があります

...
PVBP <- dcurve[which(dP == max(dP)),1][1]
Maty <- dcurve[which(dP == max(dP)),2][1]
...

その間

...
return(- PVBP / x)
...

に置き換える必要があります

...
return(as.numeric(- PVBP / x))
...

NA目的関数で sを回避するには、境界を次のように設定する必要があります。

DEoptim(fn = besty, lower = 1, upper = max(tau.0) / 12)

私を助けてくれてありがとう!

于 2012-11-09T15:48:36.830 に答える