使用 MARSS 包和 Q 和 R 之间的共享参数估计 R 中的状态空间模型

机器算法验证 r 时间序列 卡尔曼滤波器 状态空间模型
2022-04-12 13:03:25

我正在尝试使用 MARSS 包估计以下未观察到的组件模型

yt=μt+εt

μt=μt1+βt1

βt=βt1+ζt

对误差方差的限制:对于给定的是观察到的序列,是状态。熟悉这些模型的人会认为这是 Hodrick-Prescott 滤波器。σζ2=1λσε2λytμtβt

MARSS 以这种形式处理模型

yt=Zxt+vt,vtMVN(A,R)

xt=Bxt1+wt,wtMVN(U,Q)

x0MVN(x0,V0)

所以我尝试了这个

lambda=1600
B1 = matrix(c(1,0,1,1),2,2)
U1 = matrix(0,2,1)
Q1= matrix(list(),2,2)
Q1[1,1]=0
Q1[1,2]=0
Q1[2,1]=0
Q1[2,2]="q11*1/lambda"
Z1 = matrix(c(1,0),1,2)
A1 = as.matrix(0)
R1 = as.matrix("q11")
pi1 = matrix(0,2,1)
V1 = diag(1,2)
model.list = list(B = B1, U = U1, Q = Q1, Z = Z1, A = A1, R = R1, x0 = pi1, V0 = V1)
fit = MARSS(data, model = model.list, control = list(kf.x0 = "x00"))

但是 Q[2,2] 的规范是错误的,MARSS 将其读取为一个新的参数来估计。我知道我可以将 Q 矩阵和 R 矩阵中的参数限制为相同,但我不知道如何施加影响两个矩阵参数的方差限制。有谁知道解决这个问题的方法?也许使用替代()?

我知道有一些包可以实现 HP 滤波器以及其他状态空间估计包,但我想使用 MARSS,因为它使用 EM 算法来估计参数,我想将此模型扩展到其他难以实现收敛的模型。

谢谢你。

2个回答

正如您在模型中指定的那样,您不能在 Q 和 R 之间共享参数。请参阅http://journal.r-project.org/archive/2012-1/RJournal_2012-1_Holmes~et~al.pdf第 13 页“具有相同字符名称的元素被限制为相等(不跨参数矩阵共享,仅内)。”

我不知道这是否有很大帮助,因为您已经发现它对您不起作用,但至少您知道这种类型的参数共享没有官方支持。我不知道解决方案,或者是否有解决方案,但您可以尝试询问包的作者。我发现他们对他们的时间和专业知识非常亲切。

我认为有办法解决这个问题。编写一个带有 MARSS 的函数,其中 sigma_epsilon 给出(而不是估计),然后使用限制确定 sigma_nu。(要获得此运行的初始值,开始时对方差项没有限制;或者使用进行 HP 过滤的过滤器包)。然后,您可以优化 sigma_epsilon 值以最小化 AIC。这可以通过使用网格搜索方法或优化包之一来完成。

要获得置信区间,您可以编写一个简单的函数来切开置信区间。