如何使用R中的DSE包来模拟卡尔曼滤波器的后验滤波估计

时间:2017-09-18 18:36:32

标签: r kalman-filter estimation state-space

如何使用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)

从输出中,哪些是我的过滤估算值?

1 个答案:

答案 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)

以上图表绘制了所有实际数据,模型估计值和平滑估计值。