3

私の目的関数:

helper.post<-function(monthly.mean.return,
                  start.capital,  #initial nest egg
                  target.legacy,
                  monthly.inflation.post,
                  monthly.withdrawals,
                  n.obs){ 

  req = matrix(start.capital, n.obs+1, 1) #matrix for storing target weight

  for (a in 1:n.obs) {
    #cat("a: ",a,"\n")
    req[a + 1, ] = req[a, ] * (1 + monthly.mean.return - monthly.inflation.post) -     monthly.withdrawals[a,]
  }
  ending.value=req[nrow(req),]
  #ending.value
  value=target.legacy - ending.value

  return(abs(value))
}

次の最適化構造では、2 つの値の間で n.obs を変更すると、同じ出力が得られます。

つまり、n.obs = 288 または n.obs = 336 の場合、同じ値が得られます。

optimize(f=helper.post,
     start.capital = 1000000,
     target.legacy = 1000000,
     monthly.inflation.post=0.002083333,
     monthly.withdrawals = matrix(rep(10000,n.obs)),
     n.obs = n.obs, 
     lower = 0,
     upper = 1,
     tol = 0.00000000000000000000000000000000001)$minimum

値は正しいですが、正しい値とは対照的に推定値のようです。私が間違って何をしている可能性がありますか?このような正確な最適化作業には、別の最適化ツールの方がうまく機能するでしょうか? uni-root を試してみましたが、エンドポイントが反対の符号ではないため、うまくいかないようです..

uniroot( helper.post, 
     c(0, 1),
     start.capital = start.capital,
     target.legacy = target.legacy,
     monthly.inflation.post=monthly.inflation.post,
     monthly.withdrawals = monthly.withdrawals,
     n.obs = n.obs)$root
4

1 に答える 1

6

コードを少し書き直すことから始めましょう。1 列の行列をベクトルに置き換えました。エラー自体またはその絶対値を返すオプションも追加しました。でエラーを最小化しようとするときは絶対値を使用し、 でoptimルートを見つけようとするときは値自体が必要ですuniroot

helper.post <- function(monthly.mean.return,
                        start.capital,
                        target.legacy,
                        monthly.inflation.post,
                        monthly.withdrawals,
                        n.obs,
                        return.abs = TRUE) { 

  req <- numeric(n.obs + 1)
  req[1] <- start.capital

  for (month in 1:n.obs) {
    req[month + 1] <- req[month] *
                      (1 + monthly.mean.return - monthly.inflation.post) -
                      monthly.withdrawals[month]
  }
  ending.value <- req[n.obs + 1]
  error <- target.legacy - ending.value

  return(ifelse(return.abs, abs(error), error))
}

それでは、最適化しましょう。

n.obs <- 288

optimize(f = helper.post,
         start.capital = 1000000,
         target.legacy = 1000000,
         monthly.inflation.post = 0.002083333,
         monthly.withdrawals = matrix(rep(10000,n.obs)),
         n.obs = n.obs, 
         lower = 0,
         upper = 1,
         tol = 1e-20)$minimum
# [1] 0.01208333

そして、次の方法で解決策を確認しましょうuni.root

uniroot(helper.post, 
        c(0, 1),
        start.capital = 1000000,
        target.legacy = 1000000,
        monthly.inflation.post = 0.002083333,
        monthly.withdrawals = matrix(rep(10000,n.obs)),
        n.obs = n.obs,
        return.abs = FALSE,
        tol = 1e-20)$root
# [1] 0.01208333

それらは一致します。どちらのツールでも問題はありません...

に別の値を指定して再度実行するとn.obs、まったく同じ結果が得られます。なんで?一定の引き出しを選択し、開始資本と目標資本に等しい値を選択したため、得られる出力は、合計月数に関係なく、ある月から次の月までそのバランスを一定に維持するために必要なレートです。

実際、これは単体テストに入れたい種類のものです。それは予想され、簡単に解釈できる結果だからです。頭に浮かぶもう1つのことは、どこでも引き出しをゼロにした場合です。次に、答えがインフレ率と一致することを期待します。試してみて、実際にそうなることを確認してください。

于 2013-07-07T20:58:19.277 に答える