我已经读过了
和
不幸的是,这些都没有给出任何明确的答案,如何使用差分方法(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 的建议并使用实际系列中的数据作为参考会怎样。这给了我负数。你能想象负销售吗?为了澄清我的原始数字没有任何负数,也没有任何退货或取消数据!