【问题标题】:Plotting `forecast` prediction using `dygraphs`使用“dygraphs”绘制“预测”预测
【发布时间】:2017-04-26 03:44:05
【问题描述】:

我想使用dygraphs 绘制forecast 包时间序列模型的预测。 documentation 建议使用以下方法进行实际预测:

hw <- HoltWinters(ldeaths)
p <- predict(hw, n.ahead = 36, prediction.interval = TRUE)
all <- cbind(ldeaths, p)

dygraph(all, "Deaths from Lung Disease (UK)") %>%
  dySeries("ldeaths", label = "Actual") %>%
  dySeries(c("p.lwr", "p.fit", "p.upr"), label = "Predicted")

导致:

关于绘图对象all 的有趣之处在于它的类:

> class(all) [1] "mts" "ts" "matrix"

> is.mts(all)
[1] TRUE
> is.ts(all)
[1] TRUE
> is.matrix(all)
[1] TRUE

str 提供了关于对象all 的更多信息:

> str(all)
 Time-Series [1:108, 1:4] from 1974 to 1983: 3035 2552 2704 2554 2014 ...
 - attr(*, "dimnames")=List of 2
  ..$ : NULL
  ..$ : chr [1:4] "ldeaths" "p.fit" "p.upr" "p.lwr"

更多检查显示all是一个数组:

> tail(all)
         ldeaths     p.fit    p.upr     p.lwr
Jul 1982      NA 1128.3744 1656.127  600.6217
Aug 1982      NA  948.6089 1478.090  419.1282
Sep 1982      NA  960.1201 1491.429  428.8112
Oct 1982      NA 1326.5626 1859.802  793.3235
Nov 1982      NA 1479.0320 2014.306  943.7583
Dec 1982      NA 1929.8349 2467.249 1392.4206
> dim(all)
[1] 108   4
> is.array(all)
[1] TRUE

我无法使用 forecast 包中的预测来创建此类对象

使用我的forecast 模型unemp.mod 我创建预测:

> f <- forecast(unemp.mod)
> f
         Point Forecast    Lo 80    Hi 80    Lo 95    Hi 95
Apr 2017       4.528274 4.287324 4.769224 4.159773 4.896775
May 2017       4.515263 4.174337 4.856189 3.993861 5.036664
Jun 2017       4.493887 4.055472 4.932303 3.823389 5.164386
Jul 2017       4.479992 3.936385 5.023599 3.648617 5.311367
Aug 2017       4.463073 3.807275 5.118871 3.460116 5.466030

虽然它看起来类似于示例中的数组,但它是一个完全不同的对象:

> class(f)
[1] "forecast"
> str(f)
List of 10 <truncated>

如果我尝试使用基本 R 的 predict 生成预测,就像示例中一样,我也会得到一个列表对象:

> predict(unemp.mod, n.ahead = 5, prediction.interval = TRUE)
$pred
          Apr      May      Jun      Jul      Aug
2017 4.528274 4.515263 4.493887 4.479992 4.463073

$se
           Apr       May       Jun       Jul       Aug
2017 0.1880140 0.2660260 0.3420974 0.4241788 0.5117221

是否有人对如何根据forecast 模型预测创建正确的对象以使用dygraphs 进行绘图有任何建议?

【问题讨论】:

    标签: r forecasting dygraphs


    【解决方案1】:

    在进一步调查forecast(model) 生成的列表后,我注意到实际值和点预测以ts 对象的形式给出,并且上限和下限与dygraphs HoltWinters 示例的数组格式相同。我创建了一个函数,该函数创建了绘制假设forecast_obj &lt;- forecast(model) 所需的数组。

    gen_array <- function(forecast_obj){
    
      actuals <- forecast_obj$x
      lower <- forecast_obj$lower[,2]
      upper <- forecast_obj$upper[,2]
      point_forecast <- forecast_obj$mean
    
      cbind(actuals, lower, upper, point_forecast)
    }
    

    请注意,下限和上限是二维数组。由于dygraphs 不支持多个预测区间,我只选择一对(95%)。

    然后我使用类似这样的方法绘制结果数组:

    dygraph(ts_array, main = graph_title) %>% 
          dyRangeSelector() %>% 
          dyRangeSelector(height = 40,
                          dateWindow = c("2011-04-01", "2019-4-01")) %>%
          dySeries(name = "actuals", label = "actual") %>%
          dySeries(c("lower","point_forecast","upper"), label = "Predicted") %>%
          dyLegend(show = "always", hideOnMouseOut = FALSE) %>%
          dyHighlight(highlightCircleSize = 5,
                      highlightSeriesOpts = list(strokeWidth = 2)) %>%
          dyOptions(axisLineColor = "navy", gridLineColor = "grey")
    

    得到这张图:

    【讨论】:

      【解决方案2】:

      ?dygraphs::dygraph 中,data 参数必须是

      时间序列数据或数值数据。对于时间序列,这必须是 xts 对象或可转换为 xts 的对象。对于数字 数据,这必须是一个命名列表或数据框,其中第一个 element/column 提供 x 轴值和所有后续 元素/列提供一个或多个系列的 y 值。

      因此,您需要使用summary 从预测类中提取数据。将其转换为xts 类,然后使用dygraph

      library(forecast)
      f <- forecast(ldeaths)
      
      #use summary to get the model fit by forecast package
      df <- summary(f)
      
      #convert into a Time-Series class
      dfTs <- xts(df, as.Date(paste("01", rownames(df)), "%d %b %Y"))
      
      #plot
      dygraph(dfTs)
      

      【讨论】:

      • 感谢您的回答。我实际上想出了一个适合我的解决方案。我要发布它。
      猜你喜欢
      • 2018-11-08
      • 2021-10-17
      • 2021-06-15
      • 2020-11-13
      • 1970-01-01
      • 1970-01-01
      • 2023-03-30
      • 2020-11-13
      • 1970-01-01
      相关资源
      最近更新 更多