tidy時系列データにおける予測 fasster
時系列データもTidydataとして扱う流れが加速しているようです。
xts
などで頑張っていた時代からアップデートしていきます。
時系列データをTidy化するtsibble
パッケージに関連して、モデリングに対応するfasster
パッケージも絶賛開発されています。
今回はfasster
を使って時系列データのモデリングから予測までを行い、その使い心地を試してみます。
バージョン確認
gitのDevelopment cycleにも書かれている通り、早いペースで開発が進められており、今後も大幅な仕様変更も想定されます。 ここではバージョン0.1.0.9000を試しており、ほぼ出たばかりの開発途上のテストバージョンとなっています。 数ヶ月後にはここに書かれていることそのままでは動かない可能性もあり、注意が必要です。
パッケージ読み込み
パッケージはgitからインストールします。
# install.packages("devtools") devtools::install_github("tidyverts/fasster")
gitのREADMEも暫定的な書き方のようなので、READMEをなぞる場合には、tidyverse
と合わせて、tsibble
関連のパッケージをまとめて読み込んでおいた方が全てスムーズに実行できます。
library(tidyverse) library(tsibble) library(fable) library(fasster) library(tsibbledata)
Tidyデータへの変換
時系列データとしてよく用いられるUKgas
をもとに見ていきます。
ts
クラスをtbl_ts
クラスとして扱うにはas_tsibble
を使うだけです。
UKgas %>% as_tsibble #> # A tsibble: 108 x 2 [1QUARTER] #> index value #> <qtr> <dbl> #> 1 1960 Q1 160. #> 2 1960 Q2 130. #> 3 1960 Q3 84.8 #> 4 1960 Q4 120. #> 5 1961 Q1 160. #> 6 1961 Q2 125. #> 7 1961 Q3 84.8 #> 8 1961 Q4 117. #> 9 1962 Q1 170. #> 10 1962 Q2 141. #> # ... with 98 more rows
1QUARTERとなっているように、4半期ごとに観測されたデータになっています。
モデリング
Local Level + 季節性の単純なものでモデルを当てはめてみます。
fit <- UKgas %>% as_tsibble %>% FASSTER(value ~ poly(1) + seas(4)) fit %>% summary #> FASSTER Model: #> value ~ poly(1) + seas(4) #> #> Estimated variances: #> State noise variances (W): #> poly(1) #> 3.0239e+01 #> seas(4) #> 1.2268e+02 1.2366e-17 2.9014e-19 #> #> Observation noise variance (V): #> 1.0449e+02
formulaに状態空間モデルとして取り入れる項を書くだけで、簡単に観測ノイズと状態ノイズの分散を推定してくれます。
さらに、各要素の値も確認しておきます。
fit %>% components #> # A tsibble: 108 x 3 [1QUARTER] #> index `poly(1)` `seas(4)` #> <qtr> <dbl> <dbl> #> 1 1960 Q1 123. 38.6 #> 2 1960 Q2 123. 6.84 #> 3 1960 Q3 123. -40.0 #> 4 1960 Q4 123. -5.61 #> 5 1961 Q1 124. 37.1 #> 6 1961 Q2 124. 6.65 #> 7 1961 Q3 122. -37.7 #> 8 1961 Q4 122. -3.71 #> 9 1962 Q1 122. 38.2 #> 10 1962 Q2 124. 1.04 #> # ... with 98 more rows
これらの各要素の時系列推移の結果もすぐに可視化できます。
fit %>% autoplot
予測
上記のモデルをもとに、5年先まで予測します。
fit %>% forecast(h = 20) %>% autoplot
まとめ
fasster
でTidy化された時系列データに対してモデリングから予測まで行えました。
実際には、dlmModPoly
やdlmFilter
といったdlm
パッケージのお馴染みの関数が中で動いています。
dlm
自体は使い慣れないと書きにくい部分もあるので、Tidy化した時系列データに対しては圧倒的に使い心地は良いことがわかりました。
dlm
を直接いじることが過去になる日も近そうです。