状态空间模型和卡尔曼滤波器用于时间序列建模的缺点是什么?

机器算法验证 时间序列 有马 卡尔曼滤波器 向量自回归
2022-02-13 05:35:25

鉴于状态空间模型和 KF 的所有良好特性,我想知道 -状态空间建模和使用卡尔曼滤波器(或 EKF、UKF 或粒子滤波器)进行估计的缺点是什么?让我们说一下传统方法,如 ARIMA、VAR 或 ad-hoc/启发式方法。

它们很难校准吗?它们是否复杂且难以看出模型结构的变化将如何影响预测?

或者,换一种说法——传统的 ARIMA、VAR 与状态空间模型相比有什么优势?

我只能想到状态空间模型的优点:

  1. 它可以轻松处理某些静态模型的结构中断、偏移、时变参数——只需使这些参数成为状态空间模型的动态状态,模型就会自动调整到参数的任何偏移;
  2. 它非常自然地处理丢失的数据,只做 KF 的转换步骤,不做更新步骤;
  3. 它允许更改状态空间模型本身的动态参数(噪声的协方差和转换/观察矩阵),因此如果您当前的观察来自与其他来源略有不同的来源 - 您可以轻松地将其纳入估计而无需做有什么特别的;
  4. 使用上述属性,它可以轻松处理不规则间隔的数据:要么根据观察之间的间隔每次更改模型,要么使用规则间隔并将没有观察的间隔视为缺失数据;
  5. 它允许在同一模型中同时使用来自不同来源的数据来估计一个基础数量;
  6. 它允许从几个可解释的不可观察的动态组件构建模型并对其进行估计;
  7. 任何 ARIMA 模型都可以用状态空间形式表示,但只有简单的状态空间模型才能准确地用 ARIMA 形式表示。
4个回答

这是我能够从您的评论中提取的一些初步缺点列表。非常欢迎批评和补充!

总体 - 与 ARIMA 相比,状态空间模型允许您对更复杂的过程进行建模,具有可解释的结构并轻松处理数据不规则性;但是为此,您付出的代价是模型的复杂性增加、校准难度增加、社区知识减少。

  1. ARIMA 是一个通用逼近器 - 您不关心数据背后的真实模型是什么,您可以使用通用 ARIMA 诊断和拟合工具来逼近该模型。它就像一个多项式曲线拟合——你不关心真正的函数是什么,你总是可以用某种程度的多项式来近似它。
  2. 状态空间模型自然要求您为您的流程写下一些合理的模型(这很好 - 您使用您对流程的先验知识来改进估计)。当然,如果你对你的过程一无所知,你也可以使用一些通用的状态空间模型——例如以状态空间形式表示 ARIMA。但是,原始形式的 ARIMA 具有更简洁的表述 - 没有引入不必要的隐藏状态。
  3. 因为有各种各样的状态空间模型公式(比 ARIMA 模型类丰富得多),所有这些潜在模型的行为都没有得到很好的研究,如果你制定的模型很复杂 - 很难说它会如何表现在不同的情况下。当然,如果您的状态空间模型很简单或由可解释的组件组成,则不存在这样的问题。但是 ARIMA 始终是经过充分研究的 ARIMA,因此即使您使用它来近似一些复杂的过程,也应该更容易预测它的行为。
  4. 因为状态空间允许您直接准确地建模复杂/非线性模型,所以对于这些复杂/非线性模型,您可能会遇到滤波/预测稳定性的问题(EKF/UKF 散度、粒子滤波器退化)。您可能还会在校准复杂模型的参数时遇到问题——这是一个计算困难的优化问题。ARIMA 很简单,参数更少(1 个噪声源而不是 2 个噪声源,没有隐藏变量),因此它的校准更简单。
  5. 对于状态空间,统计社区中的社区知识和软件比 ARIMA 少。

感谢@IrishStat 在评论中提出了几个非常好的问题,您的问题的答案太长而无法作为评论发布,所以我将其发布为答案(不幸的是,不是该主题的原始问题)。

问题是:“它是否清楚地识别时间趋势变化并报告趋势变化的时间点?它是否区分参数变化和误差方差变化并报告这一点?它是否检测并报告用户周围的特定领先和滞后效应_

  1. 识别趋势变化 - 是的,最自然的是,您可以将趋势斜率设为状态变量之一,KF 将不断估计当前斜率。然后,您可以决定什么斜率变化对您来说足够大。或者,如果您的状态空间模型中的斜率不是随时间变化的,您可以在过滤期间以标准方式测试残差,以查看模型何时出现中断。
  2. 区分参数变化和误差方差变化 - 是的,方差可以是参数(状态)之一,那么哪个参数最有可能发生变化取决于您的模型的可能性以及具体数据的变化情况。
  3. 检测领先/滞后关系 - 不确定这一点,您当然可以将任何滞后变量包含到状态空间模型中;对于滞后的选择,您可以测试包含不同滞后的模型的残差,或者在简单的情况下,在制定模型之前使用互相关图。
  4. 指定观察值的阈值数量来决定趋势变化 - 是的,如 1) 因为过滤是递归完成的,您不仅可以阈值对您来说足够大的斜率变化,还可以设置置信度的观察值。但更好 - KF 不仅生成斜率估计,而且还生成该估计的置信带,因此您可以确定斜率在其置信区间超过某个阈值时发生显着变化。
  5. 区分需要功率变换和需要更大的方差 - 不确定我理解是否正确,但我认为你可以在过滤期间测试残差,看看它们是否仍然正常,只有更大的方差,或者它们有一些偏差,所以你需要改变你的模型。更好 - 您可以将其设为模型的二进制切换状态,然后 KF 将根据可能性自动估计它。在这种情况下,模型将是非线性的,因此您将需要 UKF 进行过滤。

当状态动态和测量误差遵循所谓的线性高斯假设 ( http://wp.me/p491t5-PS ) 时,卡尔曼滤波器是最佳线性二次估计器。因此,只要您知道您的动力学和测量模型并且它们遵循线性高斯假设,那么在线性二次估计器类中没有更好的估计器。然而,卡尔曼滤波器应用程序“失败”的最常见原因是:

  1. 状态动力学和测量模型的不精确/不正确的知识。

  2. 滤波器初始化不准确(提供与真实系统状态不一致的初始状态估计和协方差)。使用加权最小二乘 (WLS) 初始化过程可以轻松克服这一问题。

  3. 结合系统动力学模型的统计“异常值”测量。这会导致卡尔曼增益有负元素,这会导致更新后的非正半定协方差矩阵。这可以通过使用“门控”算法(例如椭圆门控)在使用该测量值更新卡尔曼滤波器之前验证测量值来避免。

这些是我在使用卡尔曼滤波器时看到的一些最常见的错误/问题。否则,如果您的模型假设有效,则卡尔曼滤波器是最佳估计器。

我要补充一点,如果您直接使用状态空间函数,您可能必须了解构成模型的几个矩阵,以及它们如何交互和工作。它更像是定义一个程序而不是定义一个 ARIMA 模型。如果您使用动态状态空间模型,它会变得更加复杂。

如果您使用具有非常非常好的状态空间功能的软件包,您可能可以避免其中的一些,但是 R 包中的绝大多数此类功能需要您在某些时候跳入细节。

在我看来,它很像一般的贝叶斯统计,其机制比更频繁的函数需要更多的理解、关心和喂养。

在这两种情况下,额外的细节/知识都是值得的,但这可能是采用的障碍。