我正在尝试在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评估,但总的来说呢?