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 = 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

这是一个解决方案:

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 回答
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 回答