如何使用 DLM 和卡尔曼滤波进行预测

机器算法验证 r 时间序列 预测
2022-02-03 01:28:53

有人可以告诉我一个关于如何在 R 中对时间序列使用 DLM 卡尔曼滤波的例子。假设我有这些值(具有年度季节性的季度值);您将如何使用 DLM 预测下一个值?顺便说一句,我是否有足够的历史数据(最低限度是多少)?

89  2009Q1  
82  2009Q2  
89  2009Q3  
131 2009Q4  
97  2010Q1  
94  2010Q2  
101 2010Q3  
151 2010Q4  
100 2011Q1  
?   2011Q2

我正在寻找 R 代码食谱式的逐步操作方法类型的答案。预测的准确性不是我的主要目标,我只想学习为我提供 2011Q2 数字的代码序列,即使我没有足够的数据。

3个回答

JSS 39-02上的论文比较了 5 个不同的卡尔曼滤波 R 包并给出了示例代码。

DLM 很酷,但它们不像 ARIMA 或其他方法那么简单。在其他方法中,您插入数据,然后调整算法的一些参数,可能会参考各种诊断来指导您的设置。

使用 DLM,您正在创建一个状态空间机,它由几个矩阵组成,这些矩阵基本上实现了隐马尔可夫模型之类的东西。一些包(sspir我认为,除其他外)期望你理解这个概念和矩阵的作用。我强烈建议您从dlm包装开始,并按照@RockScience 的建议,浏览小插图。

dlm你将基本上采取几个步骤

  1. 什么样的组件描述了我的系列?趋势?季节性?外生变量?您将使用dlm类似dlmModPoly实现这些组件的工具,使用+运算符将​​它们连接到一个模型中。

  2. 创建一个 R 子例程,该子例程采用该模型所需的许多参数,使用这些参数创建组件,然后将它们相加并返回结果模型。

  3. 用于dlmMLE进行搜索/优化以找到适当的参数(使用 MLE,这基本上是优化,优化中可能出现的陷阱)。dlmMLE使用候选参数重复调用您的 R 子例程以创建模型,然后对其进行测试。

  4. 使用您创建的 R 子例程以及您在步骤 3 中找到的参数创建您的最终模型。

  5. 用 过滤您的数据dlmFilter,然后用 进行平滑处理dlmSmooth

  6. 如果您使用dlmModReg或执行任何导致模型具有时变参数的操作,则无法用于dlmForecast预测您的序列。如果你最终得到了一个时变模型,你会想要用 NA 填写你的输入数据,并让dlmFilter你填写 NA(穷人的预测),因为dlmForecast它不适用于时变参数。

  7. 如果您想单独检查组件(例如趋势,与季节性分开),您需要了解矩阵以及每列中的内容,以及了解如何dlm将它们组合在一起(顺序很重要!)。

还有另一个包,我不知道它的名字,它试图创建一个可以使用其中几个包的前端(包括dlm作为后端)。不幸的是,我从来没有让它很好地工作,但那可能只是我。

我真的建议你买一本关于 DLM 的书。我得到了其中的几个并且玩了很多dlm才到达我现在的位置,而且我无论如何都不是专家。

我建议您阅读 dlm vignette http://cran.r-project.org/web/packages/dlm/vignettes/dlm.pdf尤其是第 3.3 章