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


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


如果您的时间序列数据的观察结果与之前的观察结果相关,那么您可能会对Chen 和 Liu (1993)的论文感兴趣。它描述了一种在自回归移动平均时间序列模型框架中检测电平变化和临时变化的方法。
[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_1和cp_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.
这是一种快速简便的方法。像这样创建一堆跳转函数: 对于候选截止点。现在使用逐步回归来选择具有作为可能预测变量的最佳模型。在你的第一个例子中,假设你选择了两个预测变量,你会得到一个的正系数等于向上跳跃的大小,一个的负系数等于向下跳跃。您需要决定将候选跳跃时间划分的精细程度,
还有更优雅和精确的解决方案涉及非线性回归,您可以使用具有 J_1 和 J_2 的模型估计和作为。设置起来有点乱。