时间序列模型可以应用于合成数据吗

机器算法验证 时间序列 模拟
2022-03-25 05:12:14

我想知道时间序列是否必须包含真实(测量)数据,或者它是否也包含合成数据(例如来自模拟)。将时间序列模型(如 MA 或 ARIMA)应用于合成数据是否有意义?

如果你介意回答我的问题,我会很高兴。

2个回答

将时间序列技术应用于模拟数据非常普遍,而且确实很有启发性。

例如:选择一个具有良好参数的合理顺序的 ARIMA 模型,对其进行模拟并将某种自动 ARIMA 拟合器应用于模拟序列(如forecast::auto.arima()在 R 中)。原始模型多久恢复一次?答案:出乎意料地很少。像这样的模拟,你知道基本事实,可以教会你很多谦逊。

再说一遍,老实说,如果一篇论文将其新方法应用于模拟数据,而不是实时序列,我往往会失去兴趣。以支持您的宠物理论的方式调整模拟非常容易。有了真实数据,就没有那么多了。(是的,我们可以选择数据集并过拟合保留数据。)

所以:将方法应用于模拟数据应该是每个时间序列分析师工具箱的一部分。其他工具中。


让我们看一个小例子。我们将模拟n=200来自 ARIMA(1,1,1) 过程的数据点,其 AR(1) 系数为ϕ1=0.5,一个 MA(1) 系数θ1=0.3和默认的噪音ϵN(0,1). 然后我们应用auto.arima()到模拟序列并询问是否auto.arima()至少得到了顺序(1,1,1) 正确。我们将整个过程执行 1,000 次:

require(forecast)
n_sims <- 1e3
n_obs <- 200
model_true <- list(ar=0.5,ma=-0.3,order=c(1,1,1))

correct <- rep(FALSE,n_sims)
pb <- winProgressBar(max=n_sims)
for ( ii in 1:n_sims ) {
    setWinProgressBar(pb,ii,paste(ii,"of",n_sims))
    set.seed(ii) # for reproducibility
    sim <- arima.sim(model=model_true,n=n_obs)
    model <- auto.arima(sim)
    correct[ii] <- isTRUE(all.equal(model$arma,c(1,1,0,0,1,1,0)))   
    # this corresponds to ARIMA(1,1,1), see ?arima
}
close(pb)
summary(correct)

事实证明,仅在 105 个案例中,我们甚至得到了正确的顺序。我认为这教会了我们一些关于识别正确 ARIMA 顺序的内在困难。

当然,如果我们增加参数值,减少噪声或增加序列的长度,我们会更经常是对的。

下一步不会像我在这里所做的那样凭空提取参数值。相反,我们可以为我们心目中的应用程序采用“典型”的时间序列。对其拟合一个 ARIMA 模型,然后使用拟合的阶数、参数和残差作为该模拟的输入,即将拟合的 ARIMA 模型视为真实的数据生成过程。您仍然会惊讶于这样的(“现实的”!)DGP 会被auto.arima(). (这是 ARIMA 模型拟合的黄金标准,我赶紧说。)当然,您可以使用指数平滑和/或其他时间序列方法进行类似的练习。

这就是模拟序列在时间序列分析中占有一席之地的原因。

根据我的经验,使用合成数据测试方法是很常见的。我认为这样做可以让人们真正关注模型的优点和缺点。然后是另一个问题,这些测试和合成数据是否足以很好地反映现实世界的场景以使该方法真正有用。但它肯定已经完成了。

作为参考,我可以提供 Philip Hans Franses 的“A note on the Mean Absolute Scaled Error”(链接),但我相信有很多类似的论文。