将双差预测转换为实际值

机器算法验证 r 时间序列 预测 有马 平稳性
2022-04-13 13:04:02

我已经读过了

时间序列预测:将差异预测转换回差异水平之前

如何“取消差异”时间序列变量

不幸的是,这些都没有给出任何明确的答案,如何使用差分方法(diff())将 ARIMA 中的预测转换为固定序列。

代码示例。

## read data and start from 1 jan 2014
dat<-read.csv("rev forecast 2014-23 dec 2015.csv")
val.ts <- ts(dat$Actual,start=c(2014,1,1),freq=365)
##Check how we can get stationary series
plot((diff(val.ts)))
plot(diff(diff(val.ts)))
plot(log(val.ts))
plot(log(diff(val.ts)))
plot(sqrt(val.ts))
plot(sqrt(diff(val.ts)))
##I found that double differencing. i.e.diff(diff(val.ts)) gives stationary series.

#I ran below code to get value of 3 parameters for ARIMA from auto.arima
ARIMAfit <- auto.arima(diff(diff(val.ts)), approximation=FALSE,trace=FALSE, xreg=diff(diff(xreg)))
#Finally ran ARIMA
fit <- Arima(diff(diff(val.ts)),order=c(5,0,2),xreg = diff(diff(xreg)))

#plot original to see fit
plot(diff(diff(val.ts)),col="orange")
#plot fitted
lines(fitted(fit),col="blue")

这给了我一个完美契合的时间序列。但是,我如何将拟合值从现在的当前形式重新转换为其原始度量?我的意思是从双差到实际数字?对于日志,我知道我们可以为平方根做 10^fitted(fit) 有类似的解决方案,但是如何进行差分,这太双重差分了?

请在R中对此有任何帮助吗?经过几天的严格锻炼,我被困在了这一点上。

编辑:让我粘贴我运行的 3 次迭代中的图像,以测试差异是否对 auto.arima 函数的模型拟合有任何影响,并发现它确实如此。因此 auto.arima 无法处理非平稳序列,并且需要部分分析师付出一些努力才能将序列转换为平稳序列。

首先, auto.arima 没有任何区别。橙色是实际值,蓝色是合适的。

ARIMAfit <- auto.arima(val.ts, approximation=FALSE,trace=FALSE, xreg=xreg)
plot(val.ts,col="orange")
lines(fitted(ARIMAfit),col="blue")

在此处输入图像描述

其次,我尝试了差异化

ARIMAfit <- auto.arima(diff(val.ts), approximation=FALSE,trace=FALSE, xreg=diff(xreg))
plot(diff(val.ts),col="orange")
lines(fitted(ARIMAfit),col="blue")

在此处输入图像描述

第三,我做了两次差分。

ARIMAfit <- auto.arima(diff(diff(val.ts)), approximation=FALSE,trace=FALSE, 
xreg=diff(diff(xreg)))
plot(diff(diff(val.ts)),col="orange")
lines(fitted(ARIMAfit),col="blue")

在此处输入图像描述

目视检查可以表明第三张图更准确。这是我知道的。挑战在于如何将这个双差分形式的拟合值重新转换为实际度量!

Edit2:为什么它不是那么简单。让我通过下面的例子来解释。

具有单差和双差的实际数据。 在此处输入图像描述

让我们通过使用差异和先前序列的第一个值回到实际数据。

在此处输入图像描述

如果我在 auto.arima 中使用 diff(diff(val.ts)) 作为输入数据,我会得到低于拟合值。但是,我没有拟合值的一阶差分的第一个值,也没有原始度量格式的拟合值的第一个数据点!这就是我震惊的地方!

在此处输入图像描述

如果我使用 Richard Hardy 的建议并使用实际系列中的数据作为参考会怎样。这给了我负数。你能想象负销售吗?为了澄清我的原始数字没有任何负数,也没有任何退货或取消数据!

在此处输入图像描述

1个回答

我在stackoverflow中找到了答案。总结而不是做

ARIMAfit <- auto.arima(diff(diff(val.ts)), approximation=FALSE,trace=FALSE, xreg=diff(diff(xreg)))

我们应该改为

ARIMAfit <- auto.arima(val.ts, d=2, approximation=FALSE,trace=FALSE, xreg=xreg)

这个 d=2 将确保未来的预测值也在相同的指标中。

因此,如果我进行预测(ARIMAfit,h=300,xreg=testxreg),我将能够获得未来的 300 个值。