まずは蝋の翼から。

学んだことを書きながら確認・整理するためのメモブログ。こういうことなのかな?といったことをふわっと書いたりしていますが、理解が浅いゆえに的はずれなことも多々あると思うのでツッコミ歓迎

forecastのtrain/test期間の結果をggplot2で描画できるようにする

やりたいこと

ARIMAなどをする際に予測をするためにforecast関数を用いる。 その際、forecast関数によって作成されたオブジェクトはautoplot関数でそのまま描画できる。

キレイでリッチなグラフ描画をおこないたいので、ggplotを使って描画をしたい。

問題点

forecast関数によって作成されたオオブジェクトの型はfarocastのため、ggplotに渡すことができない。
また、as.data.frame(forecastオブジェクト)でデータフレームに変換することはできる。しかし、その場合testで渡した期間の予測値と信頼区間部分のみデータフレーム化される。

autoplot関数の結果はtrain期間の予測値も描画されていることから、値そのものは存在するはずだが。。。

参考

こんな記事があった。

ggplot2でforecastインスタンスを描画する - StatsFragments

これで基本的にやりたいことはできそうだが、train期間の予測値とtest機関の予測値が別列として作成されている。個人的には一緒くたにしたいので少し書き換えた。

コード

all_forecast <- function(forecast.data, xts.test_original_value) {
  require(dplyr)
  
  # test期間部分
  forecasted <- as.tibble(forecast.data) %>% 
    mutate(time = time(forecast.data$mean)) %>% 
    #扱いやすい名前に変える
    rename(est_value = 'Point Forecast',
           low_95 = `Lo 95`,
           high_95 = `Hi 95`
           ) %>% 
    # ts含みになっているので変換
    mutate(original_value = as.double(xts.test_original_value), # test部分の実測値
           est_value = as.double(est_value), #test部分の推定値(予測値)
           low_95 = as.double(low_95), 
           high_95 = as.double(high_95)) %>% 
    # 並び替え
    select(time, original_value, est_value, low_95, high_95)
    
  # train期間部分
  fitted <- tibble(time = time(forecast.data$fitted)),
                   original_value = as.double(forecast.data$x), #train部分の実測値
                   est_value = as.double(forecast.data$fitted), #train部分の推定値(予測値)
                   low_95 = as.double(NA),
                   high_95 = as.double(NA))
  
  return(rbind(fitted, forecasted))
}
# => example(train is 1,2 rows. test is 3 row.)
#   time original_value est_value low_95 high_95
#   <int>          <dbl>     <dbl>  <dbl>   <dbl>
#    2019-10-01           35.9      37.8   NA      NA  
#    2019-10-02           37.8      35.2   NA    NA
#    2019-10-03           41.2      36.3   28.2    44.3

基本的にコメントを見ればいいが、as.doubleで一部変換している部分は、tsオブジェクトを含む場合rbindができなくなるので変換をしている。

r - Trouble rbinding ts objects – only replacement of elements is allowed? - Stack Overflow