我想使用optim()函数在R中创建协方差矩阵。特别地,协方差矩阵如下所示:
[ (sigma_a)^2 rho*sigma_a*sigma_b 0 ]
[ rho*sigma_a*sigma_b (sigma_b)^2 0 ]
[ 0 0 0 ]
其中(sigma_a)^2
和(sigma_b)^2
是方差,rho*sigma_a*sigma_b
是协方差部分(rho
是相关性)。
我在下面添加了我的代码,特别是我在R中使用KFAS
包,因此大多数代码与我的问题无关-这是updatefn
部分,其中包含协方差矩阵Q
,我不确定有人对此进行检查,因为我不确定那一部分:
# This section sets up everything
library('KFAS')
set.seed(1)
xx <- rnorm(1000)
Zt <- matrix(c(1,1,0),1,3)
Ht <- matrix(0)
Tt <- matrix(c(1,0,0,0,NA,NA,0,1,0),3,3,byrow=TRUE)
Rt <- matrix(c(1,0,0,0,1,0,0,0,0),3,3,byrow=TRUE)
Qt <- matrix(c(NA,NA,0,NA,NA,0,0,0,0),3,3,byrow=TRUE)
a1 <- matrix(c(0, 0, 0), 3, 1)
P1 <- matrix(0, 3, 3)
P1inf <- matrix(c(1,0,0,0,1,0,0,0,1),3,3,byrow=TRUE)
model_gaussian <- SSModel(xx ~ -1 + SSMcustom(Z = Zt, T = Tt, R = Rt, Q = Qt, a1 = a1, P1 = P1, P1inf = P1inf), H = Ht)
##############################
# RELEVANT PART OF CODE BELOW
#############################
updatefn <- function(pars, model) {
model$T[is.na(model$T)] <- pars[1:2]
model$Q[is.na(model$Q)] <- pars[3:6] # Matrix Q is the Covariance matrix
model["Q", etas = "custom"] <- crossprod(model$Q) # Creates covariance matrix from estimated parameters
model
}
fitSSM(model_gaussian, c(0,0, 0.1,0.1,0.1,0.1), updatefn, method = "L-BFGS-B", lower = c(-0.8, -0.8, 0, -Inf, -Inf,0), upper = c(0.8, 0.8, Inf, Inf, Inf, Inf))
代码的最后一行(即fitSSM()
)基本上是optim()函数的输入,它的输出参数如下:
$optim.out
$optim.out$par
[1] -0.2063339 -0.1199854 0.3001893 0.3001893 0.3001893 0.3001893
(值-0.2063339 -0.1199854
用于T
矩阵,与我的问题无关)
从optim()函数获得的用于协方差矩阵的参数以0.3001893 0.3001893 0.3001893 0.3001893
的形式给出。
我还尝试过通过以下方式修改我的功能:
updatefn <- function(pars, model) {
model$T[is.na(model$T)] <- pars[1:2]
Q <- matrix(c(NA,NA,0,NA,NA,0,0,0,0),3,3,byrow=TRUE)
Q[1,1] <- pars[3]
Q[2,2] <- pars[6]
Q[1,2] <- pars[4]
Q[2,1] <- pars[5]
Q <- crossprod(Q)
model$Q[is.na(model$Q)] <- c(Q[1,1],Q[1,2],Q[2,1],Q[2,2])
model
}
但是此方法仍然无法解决-值Q [1,2]和Q [2,1]应该相等,而且Q [1,2]除以(sqrt(Q [1,1] )* sqrt(Q [2,2]))应该给出相关性,该值是介于-1和1之间的值(不幸的是我没有得到。因此,如果有人可以帮助我,我会很感激,谢谢!