证明两个时间序列的相似性

机器算法验证 r 时间序列 有马 格兰杰因果关系 统计模型
2022-03-10 14:01:24

让我们假设一个分析模型预测随时间的流行趋势,即随时间的感染数量。我们也有一个计算机模拟结果随着时间的推移来验证模型的性能。目的是证明分析模型(都是时间序列)的模拟结果和预测值在统计上接近或相似。通过相似性,我的意思是模型预测的值接近模拟提供的值。

背景:围绕这个主题进行研究,我遇到了以下帖子:

  1. https://stackoverflow.com/questions/13835924/similarity-of-trends-in-time-series-analysis

  2. 如何统计比较两个时间序列?

两次讨论都提出了三种方法,我基本上对其中两种方法感兴趣:

(1)。使用 ARIMA;(2)。格兰杰检验的使用

对于第一个建议的解决方案,这是关于 ARIMA 的内容,在 (1) 中:

在两个数据集上运行 ARIMA。(这里的基本思想是查看同一组参数(构成 ARIMA 模型)是否可以描述您的临时时间序列。如果您在预测 (R) 中运行 auto.arima(),那么它将选择参数p,d,q 为你的数据,极大的方便。

我在模拟值上运行了 auto.arima,然后运行了预测,结果如下:

ARIMA(2,0,0) with zero mean     

Coefficients:
         ar1      ar2
      1.4848  -0.5619
s.e.  0.1876   0.1873

sigma^2 estimated as 121434:  log likelihood=-110.64
AIC=227.27   AICc=229.46   BIC=229.4

我在预测的模型值上运行 auto.arima,然后进行预测。这是预测模型的结果:

ARIMA(2,0,0) with non-zero mean 

Coefficients:
         ar1      ar2  intercept
      1.5170  -0.7996  1478.8843
s.e.  0.1329   0.1412   290.4144

sigma^2 estimated as 85627:  log likelihood=-108.11
AIC=224.21   AICc=228.21   BIC=227.05

问题 1需要比较哪些值来证明这两个系列是相似的,尤其是随时间变化的趋势?

关于第二个建议的选项,我已经阅读并发现格兰杰检验通常用于查看时间 t 的系列 A 的值是否可以预测时间t+1 的系列B

问题 2基本上,就我而言,我想同时比较时间序列 A 和 B 的值,那么这与我的情况有什么关系?

问题 3是否有任何可用的方法可以证明两个时间序列随时间变化的趋势相似?

供参考。我看到了另一种使用 Pearson Correlation Coefficient 的方法,我可以在那里进行推理。此外,通过模拟验证分析模型已在文献中得到广泛应用。看:

  1. 网络建模中恶意软件传播的时空建模
  2. 互联网电子邮件蠕虫传播与防御的建模与仿真研究
1个回答

这是我理解的情况。你有一个模型,你称之为模拟,你有信心生成一组数据,准确地代表流行病中实际发生的情况。出于某种原因(可能是因为它的构建和运行成本高昂或速度慢,或者对产生与复杂模型相似的结果的简单方程具有理论上的兴趣),您有一个替代模型(您称为模型的模型)也可以生成一组数据,您想检查此模型生成的版本是否接近已知良好模型生成的版本。

我还假设每次任何一个模型生成数据时,它都会生成与其他时间相似且非常规律的趋势。否则(例如,如果有一个随机的“起飞”时刻,系列突然中断)还有另一个大的并发症。

首先,比较来自自动拟合 ARIMA 的参数的方法是一个糟糕的方法(我猜你链接到的答案幸存下来的原因是它在堆栈溢出而不是交叉验证,统计问题本来是可能捡到了)。原因是相同的时间序列可以很好地拟合自回归和移动平均值的完全不同的组合。没有明显的方法可以查看两个不同 ARIMA 的“相似性”——看起来非常不同的那些实际上可能是相似的。正如@IrishStat 在他对您链接到的第二个问题的回答中所说,您可以为两个模型构建一组通用参数的 F 检验,但这需要比auto.arima(). 即使这样,您也可能会发现它们没有共同的参数,但提供了您真正感兴趣的趋势的类似预测,而不是 ARMA 过程的细节,后者在趋势周围产生了一些随机噪声.

那么我会推荐什么呢?听起来您并不担心小幅波动,而只担心整体趋势。我会比较每个数据集趋势的平滑版本,并从进行视觉比较开始。如果你有,这表明它们绝对不是同一个时间序列;其中一个在 1478 附近徘徊,另一个在零附近徘徊,这对我来说已经足够了。但是如果有一些歧义,我可能会将两个平滑序列之间差异的平方或绝对值相加,并确定这是否足够接近,对于一些任意选择的“足够接近”的含义,最终将不得不依赖在您的域上,以及错误的成本。我肯定会从图形开始。

如果您想要一个更客观的基准,我会尝试多次运行这两个模拟,并查看同一模拟的不同实例之间有多少差异(平方和或绝对差异),并将其与模拟间差异进行比较。如果它们相同,则表明您无法分辨哪个模型产生了模拟。如果它们不同,您仍然需要判断差异有多大,但您会有一些数字可以帮助您。

在此处输入图像描述

虽然拟合 ARIMA 模型对于识别趋势中的相似性不是一个好主意,但它是让我生成一些数据的好方法,所以下面粘贴了我是如何做到的。我猜测数据有问题 - 也许您将 ARIMA 模型拟合到数据的转换或差异版本,在这种情况下,您可能希望下一步量化这两种趋势之间的差异。

library(forecast)
library(ggplot2)
library(tidyr)
library(dplyr)

# generate some data
good_model <- arima.sim(model = list(ar = c(1.4848, -0.5619)), n = 1000)
test_model <- arima.sim(model = list(ar = c(1.5170, -0.7996)), n = 1000) + 1478


combined <- data.frame(good = good_model, test = test_model, time = 1:1000)  %>%
 gather(variable, value, -time) %>%
 mutate(value = as.numeric(value))

 ggplot(combined, aes(x = time, colour = variable, y = value)) +
    geom_line(alpha = 0.5) +
    geom_smooth(se = FALSE, size = 2) +
    theme_minimal()

编辑

我在http://ellisp.github.io/blog/2015/09/20/timeseries-differences上写了一篇博客,基本上只是探索如何使用模拟蛮力来确定两个模型是否相似。但是,我得出的结论是,您仍然需要(可能)对成本函数做出主观决定-显然,您的两种方法会有所不同,但是您准备忍受的差异有多大?