我正在尝试以DLM形式编写一个VAR(1),并使用以下代码:
Y是一个200x3矩阵
build <- function(u) {dlm(m0=c(y[1,]),
C0=1*diag(3),
FF=diag(3),V=diag(c(1e-3,1e-3,1e-3)),
GG= matrix(c(u[1:9]), ncol=3),
W=matrix(c (exp(u[10]),u[11],u[12],u[11], exp(u[13]),u[14],u[12],u[14], exp(u[15]) ),ncol=3))}
init <- rep(0,15)
outMLE <- dlmMLE(y,init, build)R无法计算dlmMLE并报告:"W不是有效的方差矩阵“。
如果有任何建议,我将不胜感激。
发布于 2012-11-01 21:17:53
我偶然发现了你的问题,并没有很仔细地解析代码...所以如果我错过了重点请原谅我。
但是只要看看你的方差矩阵的构造,它可能不会受到适当的约束。例如,以下代码考虑W结构,但不能用作覆盖矩阵: matrix(c(1,2,2,2,1,2,2,2,1),3,3)。(尝试计算相关矩阵!)更标准的方法是通过Cholesky分解来参数化协方差矩阵。对于任何6个参数,例如a1-a6,让
W_ =矩阵(c(a1,a2,a3,0,a4,a5,0,0,a6),3,3) #任意下三角矩阵,然后…W= W_ %*% t(W_)
也许这会有所帮助。
德鲁
发布于 2012-01-13 18:59:35
我不能重现你的问题。这就是我所得到的。最佳,ft。
> library(dlm)
> set.seed(12345)
> p <- 3
> y <- matrix(rnorm(600),ncol=3)
> build <- function(u) {dlm(m0=c(y[1,]),
+ C0=1*diag(3),
+ FF=diag(3),V=diag(c(1e-3,1e-3,1e-3)),
+ GG= matrix(c(u[1:9]), ncol=3),
+ W=matrix(c (exp(u[10]),u[11],u[12],u[11], exp(u[13]),u[14],u[12],u[14], exp(u[15]) ),ncol=3))}
> init <- rep(0,15)
> outMLE <- dlmMLE(y,init, build)
> outMLE
$par
[1] 0.009390099 0.012975013 0.016513477 -0.086087006 -0.034091979
[6] 0.005505462 0.022439820 -0.042064248 0.111033064 0.134691617
[11] 0.048333708 0.055505701 -0.086836031 0.069454628 -0.035391634
$value
[1] 300.5475
$counts
function gradient
10 10
$convergence
[1] 0
$message
[1] "CONVERGENCE: REL_REDUCTION_OF_F <= FACTR*EPSMCH"发布于 2015-06-12 01:23:53
这里也有同样的问题:“不是有效的方差矩阵”。上面提供的解决方案,即写成任意的下三角形解决了我的问题。举个例子:
M = matrix(c(exp(x[(m+1)]),x[(m+4)],x[(m+5)],0,exp(x[(m+2)]),x[(m+6)],0,0,exp(x[(m+3)])),3,3)
W(model) = M %*% t(M)https://stackoverflow.com/questions/8852038
复制相似问题