如何通过使用卡尔曼滤波器来查找VAR模型的时变系数

时间:2019-04-06 10:35:12

标签: dynamic kalman-filter estimation autoregressive-models

我正在尝试在R中编写一些代码,以重现我在此article中找到的模型。

其想法是将信号建模为VAR模型,但通过Kalman滤波器模型拟合系数。从本质上讲,这将使我能够创建一个健壮的时变VAR(p)模型,并在一定程度上分析非平稳数据。

跟踪系数的模型是:

X(t)= F(t)X(t-1)+ W(t)

Y(t)= H(t)X(t)+ E(t),

其中H(t)是我的时间序列 Y 中的滞后测量值和单位矢量之间的Kronecker乘积,而 X(t)充当回归的作用系数。 F(t)被视为一个单位矩阵,因为这应该意味着我们假设系数会随着随机游动而演化。

在本文中,从 W(T)中,首先在10 ^ -3处选择状态噪声协方差矩阵 Q(t),然后根据一些迭代方案。从 E(t)中,状态噪声协方差矩阵被 R(t)替换为模型无法解释的噪声项的协方差: Y(t)- H(t)Xhat(t)

我有一个估计误差的一个先验协方差矩阵(在本文中表示为Σ),写为 P (基于其他来源)以及 postiori 作为 Pmin ,因为如果有意义的话,它将在下一次递归中用作先验

到目前为止,我已经根据附录A 1.2的文章撰写了以下内容

Y <-                                  *my timeseries, for test purposes two channels of 3000 points*
F <- diag(8)                          # F is (m^2*p by m^2 *p) where m=2 dimensions and p =2 lags
H <- diag(2) %x% t(vec(Y[,1:2]))      #the Kronecker product of vectorized lags Y-1 and Y-2
Xhatminus <- matrix(1,8,1)            # an arbitrary *a priori* coefficient matrix
Q <- diag(8)%x%(10**-7)               #just a number a really low number diagonal matrix, found it used in some examples
R<- 1                                 #Didnt know what else to put here just yet
Pmin = diag(8)                        #*a priori* error estimate, just some 1-s...

现在应该开始递归了。为了测试,我只是对我的数据进行了一次试验的前3000分。

   Xhatstorage <- matrix(0,8,3000)

   for(j in 3:3000){
            H <- diag(2) %x% t(vec(Y[,(j-2):(j-1)]))
            K <- (Pmin %*% t(H)) %*% solve((H%*%Pmin%*%t(H) + R)) ##Solve gives inverse matrix ()^-1
            P <- Pmin - K%*% H %*% Pmin
            Xhatplus <- F%*%( Xhatminus + K%*%(Y[,j]-H%*%Xhatminus) )
            Pplus <- (F%*% P %*% F)  + Q
            Xhatminus <- Xhatplus
            Xhatstorage[,j] <- Xhatplus 
            Pmin <- Pplus
    }

我将 Xhatplus 值提取到存储矩阵中,并使用它们用它们来编写此原始VAR模型:

Yhat<-array(0,3000)
for(t in 3:3000){
Yhat[t]<- t(vec(Y[,(t-2)])) %*% Xhatstorage[c(1,3),t] + t(vec(Y[,(t-1)])) %*% Xhatstorage[c(2,4),t]
}

看起来像this

蓝线是具有卡尔曼滤波器找到的系数的VAR,黑线是原始数据。

我在理解如何更好地评估系数方面遇到问题?为什么这么不舒服?

我应该如何更好地选择先验 后验来开始递归?目前,我不能确定更多的VAR滞后问题是因为我不知道如何为Pmin和Xhatmin选择初始值。我从玩具模型中的任意0个假设开始就将这些地方拼凑在一起,但是在这种情况下,将任何一个所述矩阵选择为0只会折叠整个算法。

最后,此递归是否甚至是本文中描述的Oya et al 的正确实现?我知道我仍然缺少基于先前无法解释的错误(附录A 1.2中的V(t))的R评估,但总的来说呢?

0 个答案:

没有答案