MARSS(R包)中的约束

MARSS(R包)中的约束,r,constraints,linear-regression,kalman-filter,mle,R,Constraints,Linear Regression,Kalman Filter,Mle,我想使用MARSS(或R中的另一个包)估计(MLE)此模型 其中第一条线是过渡方程,第二条线是观测方程。 我设法以MARSS(R-package)接受的形式编写,如下所示: [x1_t,x2_{t-1}]= [1,0;1,0][x1_{t-1},x2_{t-2}]+[w1_t,w2_t], with w1_t ~ N(0,q) and w2_t ~ N(0,0) y_t= D d_t+Z x_t , with v_t ~ N(0,6*q) where x_t=[x1_t,x2_{t-1}]

我想使用MARSS(或R中的另一个包)估计(MLE)此模型

其中第一条线是过渡方程,第二条线是观测方程。 我设法以MARSS(R-package)接受的形式编写,如下所示:

[x1_t,x2_{t-1}]= [1,0;1,0][x1_{t-1},x2_{t-2}]+[w1_t,w2_t], with w1_t ~ N(0,q) and w2_t ~ N(0,0)
y_t= D d_t+Z x_t ,  with v_t ~ N(0,6*q)
where 
x_t=[x1_t,x2_{t-1}]
D=[1,\alpha,\beta]
Z=[0,\beta]
d_t=[d1_t,d2_t, d3_t]

问题是我无法使约束正常工作。当我运行这个系统时,R会将Z矩阵中的β与D矩阵中的β分开考虑。我在网上看到的所有例子都显示了仅使用Z矩阵(或仅使用D)的线性限制。同样的情况也发生在我希望是倍数的方差中。 有人能帮我吗

以下是一个玩具数据:

B <- matrix(list(1,0,1,0),2,2,byrow=TRUE)
U <- matrix(0,2,1)
C <- matrix(0,2,1)
G <- matrix(list(1,0,0,0),2,2,byrow=TRUE)
Q <- matrix(list('d',0,0,0),2,2,byrow=TRUE)

Z <- matrix(list(0,'b'),1,2) 
A <- matrix(0)
D <- matrix(list(1,'a','b'),1,3)

H <- matrix(1)
R=matrix(list('6*d'))

dt<-matrix(rnorm(300),3,100)
y<-rnorm(100)

x0=matrix(list(0.094,0.094),2,1)
V0=matrix(list(0.001,0,0,0.001),2,2)

model.list = list(B=B, U=U, C=C, Q=Q, Z=Z, A=A, D=D, d=dt, H=H, R=R,x0=x0,V0=V0)
kemfit = MARSS(y, model=model.list, control=list(maxit=100,conv.test.slope.tol=0.1,abstol=0.1),method='kem')

BMARSS中的EM算法只允许相同矩阵中的约束(如设置值相等)。跨A&D或U&C设置约束很容易,但跨D&Z或R&Q需要以一种奇怪的方式重写模型,其中协变项(dt)显示为虚拟状态(x)。所以你不想这么做

您可以编写一个函数来返回状态空间模型的负对数可能性,然后使用
optim()
将其最小化。我将使用
SSCustom()
函数对KFAS包执行此操作,因为这将非常快。然而,下面是如何使用MARSS包来实现这一点,只是为了向您展示这个概念。作为MARSS的作者,我可以立即写下这一点,而对于KFAS包(我也使用它),我需要查看如何处理协变量

# Set up the parts that don't change
dt<-matrix(rnorm(300),3,100)
y<-rnorm(100)
x0=matrix(list(0.094,0.094),2,1)
V0=matrix(list(0.001,0,0,0.001),2,2)
B <- matrix(list(1,0,1,0),2,2,byrow=TRUE)
U <- A <- "zero"

# Put the parameters you will estimate into a vector
pars <- c(a=0.1624, b=-0.1, d=sqrt(0.2))

# Write a function to return the negative log-likelihood
negloglik <- function(pars){
Q <- matrix(list(pars["d"]^2,0,0,0),2,2,byrow=TRUE)
Z <- matrix(list(0, pars["b"]),1,2) 
D <- matrix(list(1, pars["a"], pars["b"]),1,3)
R <- matrix(6*pars["d"]^2)
model.list = list(B=B, U=U, Q=Q, Z=Z, A=A, D=D, d=dt, R=R, x0=x0, V0=V0)
-1*MARSS(y, model=model.list, control=list(maxit=100,conv.test.slope.tol=0.1,abstol=0.1),method='kem', silent=TRUE)$logLik
}

optim(pars, negloglik, method="BFGS")
然后

我会给你发日志的。但协变量如何进入KFAS模型有点不直观。它们以时变Z的形式出现在
kfas.model$Z
元素中。我确信kfas包具有一些辅助函数来构造具有协变量的模型。我总是从矩阵(无辅助函数)构造KFAS模型,所以我不熟悉这些,但我知道它们是存在的

# Set up the parts that don't change
dt<-matrix(rnorm(300),3,100)
y<-rnorm(100)
x0=matrix(list(0.094,0.094),2,1)
V0=matrix(list(0.001,0,0,0.001),2,2)
B <- matrix(list(1,0,1,0),2,2,byrow=TRUE)
U <- A <- "zero"

# Put the parameters you will estimate into a vector
pars <- c(a=0.1624, b=-0.1, d=sqrt(0.2))

# Write a function to return the negative log-likelihood
negloglik <- function(pars){
Q <- matrix(list(pars["d"]^2,0,0,0),2,2,byrow=TRUE)
Z <- matrix(list(0, pars["b"]),1,2) 
D <- matrix(list(1, pars["a"], pars["b"]),1,3)
R <- matrix(6*pars["d"]^2)
model.list = list(B=B, U=U, Q=Q, Z=Z, A=A, D=D, d=dt, R=R, x0=x0, V0=V0)
-1*MARSS(y, model=model.list, control=list(maxit=100,conv.test.slope.tol=0.1,abstol=0.1),method='kem', silent=TRUE)$logLik
}

optim(pars, negloglik, method="BFGS")
kfas.model <- MARSSkfas(kemfit, return.kfas.model=TRUE, return.lag.one=FALSE)$kfas.model
library(KFAS)
logLik(kfas.model)