【问题标题】:How do I plot multiple data subset forecast predictions onto a single plot如何将多个数据子集预测预测绘制到单个图上
【发布时间】:2013-08-10 19:27:53
【问题描述】:

我是 R 新手,发现这个网站非常有帮助,所以这是我发布的第一个问题。感谢您的帮助并感谢本网站的智慧。

背景:从 5 年的每周销售数据开始,根据具有非常强烈的年度季节性的每周销售来制定未来生产预测。确定起点:

auto.fit <- auto.arima(arima.ts, stepwise=FALSE, parallel=TRUE, num.cores=6, trace=TRUE )
> ARIMA(2,1,2)(0,0,1)[52] with drift.  

现在我希望通过将多个“窗口”可视化绘制到数据中并与实际值进行比较来证明准确性。 (这包括记录 AIC 值。)换句话说,该函数以编程的时间间隔循环遍历数据,将预测重新计算/绘制到同一个图上。当我的窗口从数据的开头开始时,它绘制正确。现在我正在查看一个移动的 104 周窗口,结果从第 104 次观察开始全部叠加。

require(forecast)   ##[EDITED for simplified clarity]

data <- rep(cos(1:52*(3.1416/26)),5)*100+1000+c(1:26,25:0)

# Create the current fit on data and predict one year out
plot(data, type="l", xlab="weeks", ylab="counts",main="Overlay forecasts & actuals",
     sub="green=FIT(1-105,by 16) wks back & PREDICT(26) wks, blue=52 wks")
result <- tryCatch({
  arima.fit <- auto.arima(tail(data,156)) 
  arima.pred <- predict(arima.fit, n.ahead=52)
  lines(arima.pred$pred, col="blue")
  lines(arima.pred$pred+2*arima.pred$se, col="red")
  lines(arima.pred$pred-2*arima.pred$se, col="red")
}, error = function(e) {return(e$message)} )  ## Trap error

# Loop and perform comparison plotting of forecast to actuals
for (j in seq(1,105,by=16)) { 
  result <- tryCatch({
    ############## This plotted correctly as "Arima(head(data,-j),..."
    arima1.fit <- auto.arima(head(tail(data,-j),156))
    arima1.pred <- predict(arima1.fit, n.ahead=52)
    lines(arima1.pred$pred, col="green", lty=(numtests %% 6) + 1 )
  }, error = function(e) {return(e$message)}) ## Trap errors
}      

当所有预测都包括文件头时,绘图是准确的,但是,由于样本量不断缩小,预测窗口之间的 AIC 不具有可比性。

问题:如何显示完整的 5 年销售数据和按程序间隔(从 3 年滚动窗口(156 个观察值)计算得出的叠加预测)?

使用滚动窗口方法记录的 AIC 值具有可比性,但所有预测都从观测值 157 开始叠加。我尝试将数据制作成时间序列,发现初始数据正确绘制在时间轴上,但预测结果为不是时间序列,所以它们没有显示。

【问题讨论】:

  • 通常的答案是?lines,但我承认R中的时间序列函数可能有点奇怪。
  • @DWin 'lines()' 不提供绘图定位的偏移量。 (我也在尝试将其作为 ts 对象,但这篇文章是为了了解如何将数字数据偏移到绘图)你知道我可以在哪里了解预测数据中的“引擎盖下的内容”吗?它如何知道从超过拟合数据长度的 1 个观测值开始绘制预测数据?如果我知道这一点,那么我可以进行干预并将其绘制在应有的位置。

标签: r plot forecasting


【解决方案1】:

这在另一个帖子Is there an easy way to revert a forecast back into a time series for plotting?中得到了回答

这最初是作为两个独特的问题发布的,但它们的答案相同。

正在解决的核心问题是“如何将原始时间戳恢复到预测数据”。我通过反复试验学到的是通过应用以下步骤“配置,然后永远不要丢失时间序列属性”:

1:创建时间序列使用 ts() 命令并创建时间序列。
2:子集时间序列使用 'window()'在“for()”循环中创建时间序列的子集。在数据上使用“start()”和“end()”来显示时间轴位置。
3:预测时间序列使用“forecast()”或“predict()”对时间序列进行操作。
4:绘制时间序列 绘制时间序列时,时间轴将使用 lines() 命令正确对齐以获取其他数据。 {绘图选项是用户偏好。}

预测将在正确的时间轴位置绘制历史数据。

代码在这里:Is there an easy way to revert a forecast back into a time series for plotting?

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-06-15
    • 1970-01-01
    • 1970-01-01
    • 2019-02-26
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多