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