1

選択した状態の数に応じて、状態空間モデルの配列を動的にパラメーター化したいと考えています。

私はループでこれをやっています -

Q <- function(params,states) {
qmat <- matrix(0,statespace,statespace)
for (i in 1:statespace)
  qmat[i,i] <- statshockvar(params[(i-1)*5+1], params[(i-1)*5+2], 
                            params[(i-1)*5+3],states[i])          
qmat            

}

プログラムのポイントはパラメータセットを最適化することであるため、この関数は何度も呼び出されます。ただし、この関数のセットアップは最適化フェーズを大幅に遅らせます。これは、この関数と同様の他の関数が呼び出され続け、配列を再定義し続けるためです。

上記のように関連するパラメーターを使用して、一度必要な配列を動的に定義し、最適化のために新しいパラメーターのセットを使用してマトリックス関数を呼び出すにはどうすればよいですか?

ありがとう!

編集 -

statespaceモデルで使用する状態の数を表す単なる整数です。たとえば、3/

statshockvar <- function(meanrev,longrun,sigma,sstate) {

longrun*sigma^2/(2*meanrev)*(1-exp(-longrun))^2+sigma^2/longrun*(exp(-longrun) - 
  exp(-2*longrun))*sstate

}

statshockvar- この特定の例では、項構造の CIR モデルの離散化された分散です。

編集 2 -

params は次のようになります。これらは任意の数値であることに注意してください

params = c(
0.3275,
0.07,
0.197,
0,
0.05,

0.01,
0.2,
0.3,
0,
0.05,

0.01,
0.1,
0.3,
0,
0.05)

州はこのようなものになります-

states = c(0.07,0.07,0.07)

繰り返しますが、これらの状態は任意です。

4

2 に答える 2

0

forループを見ると、

for (i in 1:statespace)
  qmat[i,i] <- statshockvar(params[(i-1)*5+1], params[(i-1)*5+2], 
                            params[(i-1)*5+3],states[i])

statshockvarがベクトル化されている場合は、簡単に書くことができます

diag(qmat) <- statshockvar(params[((1:statespace)-1)*5+1], params[((1:statespace)-1)*5+2], params[((1:statespace)-1)*5+3], states[1:statespace])

そうでない場合は、?Vectorizeそうするようにしてください

于 2013-01-24T14:04:31.183 に答える
0

解決策は次のとおりです。

Q <- function(params, states) {
  diag(mapply(function(y, z) statshockvar(y[1], y[2], y[3], z), 
              lapply(seq(statespace), function(x) params[(x-1)*5 + 1:3]), 
              states))
}

サンプル パラメータでテストします。

Q(params, states)

            [,1]       [,2]        [,3]
[1,] 0.002465305 0.00000000 0.000000000
[2,] 0.000000000 0.03424762 0.000000000
[3,] 0.000000000 0.00000000 0.009499883
于 2013-01-24T10:08:11.550 に答える