r - 有没有一种简单的方法可以将预测恢复为时间序列以进行绘图?

标签 r plot forecasting

我是 R 的新手,发现这个网站非常有帮助,所以这涵盖了我问题的后半部分(每篇文章一个问题)。提前感谢您的帮助。

背景:我正在绘制历史数据,并叠加多个预测以进行视觉准确性检查。当显示在“观察”的 x 轴上时,这很有效。但是,当在 x 轴上绘制日期时,数据更易于理解,因此我使用 ts() 将其设为时间序列,并按预期绘制时间序列数据。但是,(A)它没有在时间尺度上绘制预测数据,因为它们不是时间序列; (B) 我不确定如何强制 x 轴加上 1 年以允许显示预测。

问题: (A) 如何将原始时间戳恢复到预测数据中?我知道我可以手动重新创建时间序列,但这在预测的每次迭代中都是必需的。我曾考虑使用 predict() 而不是 predict(),但额外的预测迭代仍然存在相同的问题,即不是时间序列。 有没有一种简单的方法可以将原始时间戳恢复到预测数据中?

  require(forecast)  [EDITED for clarity]

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

  arima.ts <- ts(data,start=c(2009,1),frequency=52) #not plotted as time series

  # Create the current fit on data and predict one year out
  plot(arima.ts, 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")
  ############## This plotted correctly as "Arima(data),..."
  arima.fit <- auto.arima(tail(arima.ts,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")

  # Loop back 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(arima.ts,-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
  }

最佳答案

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

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

这会导致预测绘制在正确时间轴位置的历史数据上。

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

  data <- rep(cos(1:52*(3.1416/26)),5)*100+1000
  a.ts <- ts(data,start=c(2009,1),frequency=52)

  ## Predict from previous '3' years then one year out & generate the plot
  a.win  <- window(a.ts,start=c(end(a.ts)[1]-3,end(a.ts)[2]),frequency=52)
  a.fit  <- auto.arima(a.win)  
  a.pred <- forecast(a.fit, h=52)
  plot(a.pred, 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")

  for (j in seq(1, 90, by=8)) {   ## Loop to overlay early forecasts 
    result1 <- tryCatch({
      b.end   <- c(end(a.ts)[1],end(a.ts)[2]-j) ## Window the time series  
      b.start <- c(b.end[1]-3,b.end[2])
      b.window <- window(a.ts, start=b.start, end=b.end, frequency=52)

      b.fit  <-auto.arima(b.window) 
      b.pred <- forecast(b.fit, h=26)
      lines(b.pred$mean, col="green", lty="dashed" )
    }, error = function(e) {return(e$message)} ) ## Skip Errors
  }

关于r - 有没有一种简单的方法可以将预测恢复为时间序列以进行绘图?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18137745/

相关文章:

java - JFreechart(Java) - 如何绘制部分虚线和部分实线的线条?

r - 交叉验证季节性线性模型

r - 在 R 数据表中,max 对有序因子起作用并且在分组时失败

r - 防止 kableExtra 横向表中的分页

r - R可以用于GIS吗?

r - 软件包安装错误 : compilation failed

r - 在 R 中使用 solnp 函数时出现收敛问题

r - 将字符列转换为因子是否可以节省内存?

java - 缩放数据以适应像素空间

r - 如何将两个 sjp.likert (来自 sjPlot 包)生成的图合并到一个图中?