rパッケージ“kfas”を使った時系列データの解析方法
TRANSCRIPT
Rパッケージ“KFAS”を使った 時系列データの解析方法
森林総合研究所 伊東宏樹
2015-09-15 JaLTER公開シンポジウム2015 生物・生態系情報の統合と時系列データの解析 ~生物や生態系の変化を読み解く~
• 時系列データを、何も考えずに扱うのがよくないのはわかった……
• 時系列データを、何も考えずに扱うのがよくないのはわかった……
• とはいえ、BUGSやStanはまだ敷居が高い……
• 時系列データを、何も考えずに扱うのがよくないのはわかった……
• とはいえ、BUGSやStanはまだ敷居が高い……
• Rパッケージで扱うには……
時系列データを扱う Rパッケージ
• CRAN Task View: Time Series Analysis https://cran.r-project.org/view=TimeSeries
• 状態空間モデル (state space model) • dlm, KFAS など
状態空間モデル
yt-1
αt-1
yt
αt
yt+1
αt+1状態
観測値
ノイズノイズ ノイズ
ノイズ ノイズ ノイズ
できること• 観測ノイズの除去
• 過去:平滑化
• 現在:フィルタ
• 将来の予測
• システムの推測
KFAS
• Kalman Filter and Smoother for Exponential Family State Space Models
• ポアソン分布、二項分布など、正規分布以外の分布を扱える。
• dlmパッケージとくらべると、参考文献は少ない。
実際のデータを解析
Kéry & Schaub “Bayesian Population Analysis Using WinBUGS” 第3章のハヤブサのデータ(falcons.txt)を使用
• http://www.vogelwarte.ch/de/projekte/publikationen/bpa/complete-code-and-data-files-of-the-book.html
フランス・ジュラ山脈におけるハヤブサのつがい数
ここですること
• 平滑化(観測ノイズの除去)
• 予測
とりあえず 正規分布を使用したモデリング観測モデル
システムモデル
観測ノイズ
システムノイズ
yt = ↵t + ✏t, ✏t ⇠ Normal(0,�2✏ )
↵t = ↵t�1 + ⌘t, ⌘t ⇠ Normal(0,�2⌘)
KFASでモデリング
> mdl0 <- SSModel(Pairs ~ SSMtrend(degree = 1,
+ Q = list(matrix(NA, 1, 1))),
+ data = falcons, H = matrix(NA, 1, 1),
+ distribution = "gaussian")
> fit0 <- fitSSM(mdl0, inits = c(10,10), method = “BFGS")
推定するパラメーターをNAとしておく。
システムノイズ
観測ノイズ
初期値
平滑化> out0 <- KFS(fit0$model, smoothing = c("state", "mean")) > coef(out0) Time Series: Start = 1 End = 40 Frequency = 1 [1] 34.00869 44.98658 39.00235 35.98974 20.01106 18.00396 20.99684 [8] 19.99842 17.00474 20.00000 23.00079 26.99843 29.00632 38.99526 [15] 43.00000 47.00473 56.99132 56.00631 63.00001 70.00395 81.99684 [22] 89.99763 95.00553 106.99605 114.00000 121.00315 131.99290 134.00552 [29] 142.99842 149.99764 154.01104 171.97868 163.00788 163.99683 160.98343 [36] 137.03474 156.98109 153.03315 190.97158 192.99840
状態の値を表示平滑化
平滑化された値> fitted(out0) Time Series: Start = 1 End = 40 Frequency = 1 [1] 34.00869 44.98658 39.00235 35.98974 20.01106 18.00396 20.99684 [8] 19.99842 17.00474 20.00000 23.00079 26.99843 29.00632 38.99526 [15] 43.00000 47.00473 56.99132 56.00631 63.00001 70.00395 81.99684 [22] 89.99763 95.00553 106.99605 114.00000 121.00315 131.99290 134.00552 [29] 142.99842 149.99764 154.01104 171.97868 163.00788 163.99683 160.98343 [36] 137.03474 156.98109 153.03315 190.97158 192.99840
この場合、状態の値と平滑化された値は同じ。
平滑化されていない……😭
ノイズの分散をみると……> print(fit0$model$Q) , , 1
[,1] [1,] 113.038
> print(fit0$model$H) , , 1
[,1] [1,] 0.08911987
観測ノイズの値が小さい
←観測ノイズ
←システムノイズ
カウントデータなので
観測モデルをポアソン分布に
↵t = ↵t�1 + ⌘t, ⌘t ⇠ Normal(0,�2⌘)
yt = Poisson(exp(↵t))
観測モデル
システムモデル
モデリング
> mdl1 <- SSModel(Pairs ~ SSMtrend(degree = 1,
+ Q = list(matrix(NA, 1, 1))),
+ data = falcons, distribution = "poisson")
> fit1 <- fitSSM(mdl1, inits = c(1), method = “BFGS")
ポアソン分布なので、観測ノイズの分散(H)は指定しない。
ポアソン分布
状態と平滑化された値> out2 <- KFS(fit2$model, smoothing = c("state", “mean")) > coef(out1) Time Series: Start = 1 End = 40 Frequency = 1 [1] 3.600436 3.646996 3.575282 3.444877 3.231464 3.112745 3.073864 3.046119 3.036783 [10] 3.095805 3.192318 3.312783 3.441466 3.609914 3.742080 3.859742 3.985474 4.054406 [19] 4.152740 4.261904 4.387899 4.486665 4.564497 4.660396 4.732748 4.798104 4.868454 [28] 4.905312 4.960069 5.007768 5.047816 5.117825 5.098279 5.091911 5.062397 4.978895 [37] 5.043466 5.072529 5.218736 5.252747 > fitted(out1) Time Series: Start = 1 End = 40 Frequency = 1 [1] 36.61420 38.35927 35.70468 31.33942 25.31670 22.48267 21.62529 21.03356 [9] 20.83810 22.10502 24.34479 27.46143 31.23270 36.96287 42.18565 47.45311 [17] 53.81081 57.65089 63.60806 70.94497 80.47118 88.82469 96.01433 105.67792 [25] 113.60727 121.28031 130.11957 135.00500 142.60367 149.57048 155.68215 166.97180 [33] 163.73988 162.70046 157.96874 145.31379 155.00634 159.57731 184.70053 191.09040
赤色の線が平滑化された値
傾きを組み込んだモデル観測モデル
システムモデル
yt = Poisson(exp(↵1t))
↵1t = ↵1t�1 + ↵2t�1 + ⌘1t, ⌘1t ⇠ Normal(0,�2⌘1)
↵2t = ↵2t�1 + ⌘2t, ⌘2t ⇠ Normal(0,�2⌘2)傾き
モデリング
> mdl2 <- SSModel(Pairs ~ SSMtrend(degree = 2,
+ Q = list(matrix(NA, 1, 1),
+ matrix(NA, 1, 1))),
+ data = falcons, distribution = "poisson")
> fit2 <- fitSSM(mdl2, inits = c(1, 1), method = "BFGS")
2次のトレンドモデル
状態> out2 <- KFS(fit2$model, smoothing = c("state", "mean")) > coef(out2) Time Series: Start = 1 End = 40 Frequency = 1 level slope 1 3.722354 -0.101679163 2 3.620679 -0.115350974 3 3.505328 -0.128485351 4 3.376839 -0.130461354 5 3.246370 -0.108773871 6 3.137591 -0.074006144 7 3.063584 -0.035537613 8 3.028045 0.005883994 9 3.033929 0.049039924 10 3.082971 0.086906959 (中略)
39 5.181215 0.078153433 40 5.259369 0.078153433
赤色の線が平滑化された値
状態
予測> n.prediction <- 5
> prd <- predict(fit2$model, n.ahead = n.prediction,
+ type = "response",
+ level = 0.95,
+ interval = "confidence",
+ nsim = 1000)
5年先まで予測
95%信頼区間を計算
シミュレーションの回数
応答変数のスケール
予測値と95%信頼区間
KFASのモデリング関数• SSMarima: ARIMA(自己回帰和分移動平均)モデル
• SSMcustom: 状態空間モデルの一般式によるモデル
• SSMcycle: 周期モデル
• SSMregression: 回帰モデル
• SSMseasonal: 季節調整モデル
• SSMtrend: トレンドモデル
参考文献
状態空間モデルについては• 北川源四郎 (2005) 時系列解析入門. 岩波書店
• Commandeur, J.F. and Koopman, S.J. (2007) An introduction to state space time series analysis. Oxford University Press(和合肇訳 『状態空間時系列分析入門』 シーエーピー出版, 2008年)
• Petris, G., Petrone S., and Campagnoli P. (2009) Dynamic linear models with R. Springer(和合肇監訳 萩原淳一郎訳 『Rによるベイジアン動的線形モデル』 朝倉書店, 2013年)
• 馬場真哉「状態空間モデル」http://logics-of-blue.com/category/統計・r/状態空間モデル/
KFAS関連
• Helske J. “KFAS: Exponential family state space models in R” https://cran.r-project.org/web/packages/KFAS/vignettes/KFAS.pdf
• 小野滋「Commandeur & Koopman『状態空間時系列分析入門』をRで再現する」http://elsur.jpn.org/ck/