今週も特にありません

進捗どうですか?

tidy時系列データにおける予測 fasster

時系列データもTidydataとして扱う流れが加速しているようです。 xtsなどで頑張っていた時代からアップデートしていきます。

時系列データをTidy化するtsibbleパッケージに関連して、モデリングに対応するfassterパッケージも絶賛開発されています。 今回はfassterを使って時系列データのモデリングから予測までを行い、その使い心地を試してみます。

バージョン確認

gitのDevelopment cycleにも書かれている通り、早いペースで開発が進められており、今後も大幅な仕様変更も想定されます。 ここではバージョン0.1.0.9000を試しており、ほぼ出たばかりの開発途上のテストバージョンとなっています。 数ヶ月後にはここに書かれていることそのままでは動かない可能性もあり、注意が必要です。

github.com

パッケージ読み込み

パッケージは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

f:id:masaqol:20180716122118j:plain

予測

上記のモデルをもとに、5年先まで予測します。

fit %>% 
  forecast(h = 20) %>%
  autoplot

f:id:masaqol:20180716122600j:plain

まとめ

fassterでTidy化された時系列データに対してモデリングから予測まで行えました。

実際には、dlmModPolydlmFilterといったdlmパッケージのお馴染みの関数が中で動いています。 dlm自体は使い慣れないと書きにくい部分もあるので、Tidy化した時系列データに対しては圧倒的に使い心地は良いことがわかりました。

dlmを直接いじることが過去になる日も近そうです。