2013-01-24 68 views
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看起來是這樣的 - 請注意,這些只是AR bitrary數

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) 

又把這些狀態是任意的。

+0

該函數將被調用多次說,1500 *的優化拍攝次數。這是每次調用重新分配矩陣結構的主要瓶頸。所以我想這個運行一次,然後只更新參數值,這將導致預定義的矩陣結構中有一組新值...' – RonRich

+0

讓函數抓取數據('statespace')不是個好主意,來自全球的環境。你應該把它作爲一個參數來傳遞。 –

回答

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 
+0

嗨Sven,我提供了一個例子。 – RonRich

+0

@ user2006864查看更新。 –

+0

Sven,如果狀態是由上面提到的狀態空間變量決定的,這個工作是否會起作用?即這是決定狀態向量的長度...... – RonRich

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做出這等