如何表征突变?

机器算法验证 时间序列 趋势 变化点
2022-02-11 09:48:38

这个问题可能太基础了。对于数据的时间趋势,我想找出发生“突然”变化的点。例如,在下面显示的第一张图中,我想使用一些统计方法找出变化点。而且我想将这种方法应用于其他一些变化点不明显的数据(如第二张图)。那么有没有一种通用的方法呢?

在此处输入图像描述

在此处输入图像描述

4个回答

如果您的时间序列数据的观察结果与之前的观察结果相关,那么您可能会对Chen 和 Liu (1993)的论文感兴趣。它描述了一种在自回归移动平均时间序列模型框架中检测电平变化和临时变化的方法。[1]

[1]:Chen, C. 和 Liu, LM。(1993),
“时间序列中模型参数和异常值效应的联合估计”
,美国统计协会杂志88 :421, 284-297

Stats 中的这个问题被称为(单变量)时间事件检测。最简单的想法是使用移动平均线和标准差。任何“超出”3 个标准偏差(经验法则)的读数都被视为“事件”。当然,还有更高级的模型使用 HMM 或回归。这是该领域的介绍性概述

这个推理问题有很多名称,包括变化点、切换点、断点、折线回归、断棒回归、双线性回归、分段线性回归、局部线性回归、分段回归和不连续模型。

以下是带有优点/缺点和工作示例的变更点包的概述。如果您事先知道更改点的数量,请查看mcp包。首先,让我们模拟一下数据:

df = data.frame(x = seq(1, 12, by = 0.1))
df$y = c(rnorm(21, 0, 5), rnorm(80, 180, 5), rnorm(10, 20, 5))

对于您的第一个问题,它是三个仅拦截段:

model = list(
  y ~ 1,  # Intercept
  ~ 1,  # etc...
  ~ 1
)
library(mcp)
fit = mcp(model, df, par_x = "x")

我们可以绘制结果拟合:

plot(fit)

在此处输入图像描述

在这里,变化点非常明确(狭窄)。让我们总结一下它们的推断位置(cp_1cp_2):

summary(fit)

Family: gaussian(link = 'identity')
Iterations: 9000 from 3 chains.
Segments:
  1: y ~ 1
  2: y ~ 1 ~ 1
  3: y ~ 1 ~ 1

Population-level parameters:
    name   mean lower upper Rhat n.eff
    cp_1   3.05   3.0   3.1    1  6445
    cp_2  11.05  11.0  11.1    1  6401
   int_1   0.14  -1.9   2.1    1  5979
   int_2 179.86 178.8 180.9    1  6659
   int_3  22.76  19.8  25.5    1  5906
 sigma_1   4.68   4.1   5.3    1  5282

您可以使用 做更复杂的模型mcp,包括建模 N 阶自回归(对时间序列有用)等。 免责声明:我是mcp.

这是一种快速简便的方法。像这样创建一堆跳转函数: 对于候选截止点现在使用逐步回归来选择具有作为可能预测变量的最佳模型。在你的第一个例子中,假设你选择了两个预测变量,你会得到一个的正系数等于向上跳跃的大小,一个的负系数等于向下跳跃。您需要决定将候选跳跃时间划分的精细程度,

Ji={0x<xi1xxi
x1<x2<<xmJiJaprilJdecemberxi,例如,每月一次、每两周一次、每周一次、每天一次。

还有更优雅和精确的解决方案涉及非线性回归,您可以使用具有 J_1 和 J_2 的模型估计作为设置起来有点乱。J1J2x1x2