使用R进行时间序列预测

7
我有以下的R代码。
library(forecast)
value <- c(1.2, 1.7, 1.6, 1.2, 1.6, 1.3, 1.5, 1.9, 5.4, 4.2, 5.5, 6, 5.6, 
6.2, 6.8, 7.1, 7.1, 5.8, 0, 5.2, 4.6, 3.6, 3, 3.8, 3.1, 3.4, 
2, 3.1, 3.2, 1.6, 0.6, 3.3, 4.9, 6.5, 5.3, 3.5, 5.3, 7.2, 7.4, 
7.3, 7.2, 4, 6.1, 4.3, 4, 2.4, 0.4, 2.4)

sensor<-ts(value,frequency=24)
fit <- auto.arima(sensor)
LH.pred<-predict(fit,n.ahead=24)
plot(sensor,ylim=c(0,10),xlim=c(0,5),type="o", lwd="1")
lines(LH.pred$pred,col="red",type="o",lwd="1")
grid()

生成的图形是 prediction 但我对预测结果不满意。是否有办法使预测结果看起来与其前面的趋势相似(请参见图表)?
4个回答

20

因为您将频率定义为24,我假设您是在每个周期内使用24小时(每日)工作,因此您的历史数据集中大约有2个周期。总的来说,这是有限的样本数据,难以进行时间序列预测。我建议您获取更多数据,然后再次进行预测模型。您拥有的数据越多,它就能更好地捕捉季节性,并因此预测未来的值。由于自动算法有限,例如auto.arima通常会默认选择类似移动平均值的方法。您的数据集值得比移动平均值更好的方法,因为该周期中存在一些季节性。有许多预测算法可以帮助您更好地塑造前瞻曲线;例如Holt-Winters或其他指数平滑方法可能会有所帮助。但是,auto.arima也是一个相当不错的选择(我首先尝试看看我可以用它做什么)。

获取更多数据并执行相同的流程将改善您的图表。个人而言,我更喜欢使用forecast而不是predict;数据似乎更好,因为它显示了您的置信区间。在代码中,我还通过复制两个周期来扩展数据集,因此我们有了四个周期。请参见下面的结果:

library(forecast)
value <- c(1.2,1.7,1.6, 1.2, 1.6, 1.3, 1.5, 1.9, 5.4, 4.2, 5.5, 6.0, 5.6, 6.2, 6.8, 7.1, 7.1, 5.8, 0.0, 5.2, 4.6, 3.6, 3.0, 3.8, 3.1, 3.4, 2.0, 3.1, 3.2, 1.6, 0.6, 3.3, 4.9, 6.5, 5.3, 3.5, 5.3, 7.2, 7.4, 7.3, 7.2, 4.0, 6.1, 4.3, 4.0, 2.4, 0.4, 2.4, 1.2,1.7,1.6, 1.2, 1.6, 1.3, 1.5, 1.9, 5.4, 4.2, 5.5, 6.0, 5.6, 6.2, 6.8, 7.1, 7.1, 5.8, 0.0, 5.2, 4.6, 3.6, 3.0, 3.8, 3.1, 3.4, 2.0, 3.1, 3.2, 1.6, 0.6, 3.3, 4.9, 6.5, 5.3, 3.5, 5.3, 7.2, 7.4, 7.3, 7.2, 4.0, 6.1, 4.3, 4.0, 2.4, 0.4, 2.4)
sensor <- ts(value,frequency=24) # consider adding a start so you get nicer labelling on your chart. 
fit <- auto.arima(sensor)
fcast <- forecast(fit)
plot(fcast)
grid()
fcast
         Point Forecast     Lo 80    Hi 80      Lo 95    Hi 95
3.000000       2.867879 0.8348814 4.900877 -0.2413226 5.977081
3.041667       3.179447 0.7369338 5.621961 -0.5560547 6.914950
3.083333       3.386926 0.7833486 5.990503 -0.5949021 7.368754
3.125000       3.525089 0.8531946 6.196984 -0.5612211 7.611400
3.166667       3.617095 0.9154577 6.318732 -0.5147025 7.748892

四周期图表


Jochem,这个问题已经很久了,你回答的时候可能已经有一些包发生了变化。但是当我尝试你的代码时,预测结果仍然是一个简单移动平均值。你图表中的波浪线在我的输出中并不存在。我增加了一些周期,但似乎只是让图表更加平滑。code sensor2 <- runif(240)*sample(0:10, 240, replace = T) sensor2 <- ts(sensor2, freq = 24) fit2 <- auto.arima(sensor2) fcast2 <- forecast(fit2) View(fcast2) plot(fcast2) - Aakash Gupta
@AakashGupta,您的传感器数据是由sample()在0到10之间的范围内随机生成的。该随机性没有季节性,因此可以合理地预期预测值大约在5左右。在我看来,这是很有道理的。(很抱歉回复您的评论有所延迟) - Jochem

2

auto.arima()函数会根据AIC、AICc或BIC值返回最佳的ARIMA模型。基于您的"value"数据集,它可能选择了一个ARMA(1,0)或AR(1)模型,可以看出这些模型很快就会回归到均值。长期来看,AR(1)模型总是会发生这种情况,因此如果您想预测超过几步,它就不是很有用。

您可以通过分析"value"数据的自相关图和偏自相关图来考虑拟合其他类型的模型。然后,您需要检查您的备选模型是否适合该数据。


0

您可以考虑使用移动平均来更准确地绘制预测。


1
我怀疑这个auto.arima模型与移动平均模型非常相似... - Jochem

-3

1
在Stack Overflow上,强烈反对仅提供链接的答案。相反,最好在此处包含答案的基本部分,并提供参考链接。参考链接 - drs

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接