【问题标题】:Time series prediction using R使用 R 进行时间序列预测
【发布时间】:2012-12-25 17:26:27
【问题描述】:

我有以下 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()

结果图是

但我对预测并不满意。有什么方法可以使预测看起来与之前的价值趋势相似(见图)?

【问题讨论】:

    标签: r time-series regression linear-regression forecasting


    【解决方案1】:

    当您将频率定义为 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 &lt;- runif(240)*sample(0:10, 240, replace = T) sensor2 &lt;- ts(sensor2, freq = 24) fit2 &lt;- auto.arima(sensor2) fcast2 &lt;- forecast(fit2) View(fcast2) plot(fcast2)
    • @AakashGupta 您的传感器数据是由 sample() 在 0 到 10 之间随机生成的。随机性没有季节性,因此可以合理地预期预测值在 5 左右. 在我看来,这很有道理。 (抱歉回复您的评论延迟)
    【解决方案2】:

    auto.arima() 根据 AIC、AICc 或 BIC 值返回最佳 ARIMA 模型。根据您的“价值”数据集,它可能选择了 ARMA(1,0) 或 AR(1) 模型,如您所见,它往往会很快恢复到平均值。从长远来看,AR(1) 模型总是会发生这种情况,因此如果您想预测超过几个步骤,它就不是很有用。

    您可以通过分析价值数据的 acf 和 pacf 来考虑拟合不同类型的模型。然后,您需要检查您的替代模型是否适合数据。

    【讨论】:

      【解决方案3】:

      您可能需要考虑使用Moving Average 来更准确地绘制预测图。

      【讨论】:

      • 我怀疑这个 auto.arima 模型与移动平均线非常相似......
      【解决方案4】:

      我建议查看https://code.google.com/p/ltp/的ltp包 您还可以查看 https://github.com/matteoredaelli/predictoR 的 Web 前端

      【讨论】:

      • Stack Overflow 强烈反对仅链接的答案。相反,it is preferable 在此处包含答案的基本部分,并提供链接以供参考。
      猜你喜欢
      • 2019-02-10
      • 2018-12-23
      • 2014-04-03
      • 2019-09-06
      • 2017-10-03
      • 2019-05-22
      • 1970-01-01
      • 2020-07-07
      相关资源
      最近更新 更多