我想动态地参数化一个状态空间模型的数组,这取决于我选择了多少个状态。
我是用循环来做的-
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)同样,这些状态也是武断的。
发布于 2013-01-24 10:08:11
这里有一个解决方案:
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-24 14:04:31
看着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以使之成为
https://stackoverflow.com/questions/14497791
复制相似问题