如何使用DSE包从R中的卡尔曼滤波器模拟中调用后验(精细)状态估计值?
我在下面添加了一个例子。假设我创建了一个简单的随机游走状态空间,错误是标准的正态分布。使用SS函数创建模型,初始化状态和协方差估计为零。理论模型形式如下: 对于状态演变,X(t)= X(t-1)+ e(t)~N(0,1) Y(t)= X(t)+ w(t)~N(0,1)
我们现在按照“统计软件期刊”中“卡尔曼过滤R”一文的第6页和第7页的说明在R中实现这一点。首先,我们使用SS()函数创建状态空间模型,并将其存储在名为kalman.filter的变量中:
kalman.filter=dse::SS(F = matrix(1,1,1),
Q = matrix(1,1,1),
H = matrix(1,1,1),
R = matrix(1,1,1),
z0 = matrix(0,1,1),
P0 = matrix(0,1,1)
)
然后我们使用simulate()从模型表单模拟100个观察值,并将它们放在一个名为simulate.kalman.filter的变量中:
simulate.kalman.filter=simulate(kalman.filter, start = 1, freq = 1, sampleT = 100)
然后我们使用l()对测量值运行kalman过滤器并将其存储在名为test的变量下:
test=l(kalman.filter, simulate.kalman.filter)
从输出中,哪些是我的过滤估算值?
答案 0 :(得分:0)
我找到了这个问题的答案。
首先,l()函数中没有给出模型的过滤估计值。此功能仅提供一步预测。我的问题的上述框架编码为:
kalman.filter=dse::SS(F = matrix(1,1,1),
Q = matrix(1,1,1),
H = matrix(1,1,1),
R = matrix(1,1,1),
z0 = matrix(0,1,1),
P0 = matrix(0,1,1)
)
simulate.kalman.filter=simulate(kalman.filter, start = 1, freq = 1, sampleT = 100)
test=l(kalman.filter, simulate.kalman.filter)
提前一步预测由:
predictions = test$estimates$pred
通过以下方式给出了一个可视化的快速方法:
tfplot(test)
这使您可以根据实际数据快速绘制一步预测。要获得过滤后的估算值,您需要在同一个dse包中使用smoother()函数。它输入状态模型以及数据,在这种情况下,它分别是kalman.filter和simulate.kalman.filter。输出是所有时间点的平滑估计值。但请注意,它在考虑完整数据集后执行此操作,因此每次观察都不会执行此操作。请参阅下面的代码。代码的第一行为您提供平滑的估计值,以下行绘制示例:
smooth = smoother(test, simulate.kalman.filter)
plot(test$estimates$pred, ylim=c(max(test$estimates$pred,smooth$filter$track,simulate.kalman.filter$outpu), min(test$estimates$pred,smooth$filter$track,simulate.kalman.filter$output)))
points(smooth$smooth$state, col = 3)
points(simulate.kalman.filter$output, col = 4)
以上图表绘制了所有实际数据,模型估计值和平滑估计值。