R経由で学ぶPythonの状態空間時系列モデリング#0: 状態空間モデルの概要
はじめに
内容
- 状態空間時系列モデルの概要
- 状態空間モデルとは何か?
- 典型的なモデルの紹介
- 今後の記事の執筆方針
- 本記事あわせて全5本で構想中
背景
- 状態空間モデルは時系列分析でよく用いられる手法の一つ
- Pythonユーザーにとっては情報が少なくややとっつきにくい
- Rと比べて書籍が圧倒的に少ない
- ライブラリもRほど充実していない
- ネットの情報も少ない
- 理論の紹介 → Rでの実装例 → Pythonへの翻訳のステップを踏むことで、Pythonでも理論を理解したうえで状態空間モデリングを行えるようにしたい。
- そのためにまずは、そもそも状態空間モデルとはどのようなもので、どのような実装方法があるかの全体像を把握する。
TL;DR
- 状態空間モデルでは、現象の背後に状態を仮定し、観測値から状態の推定・予測を行う。
- 状態空間時系列モデルは、トレンドや季節性といった構造を取り入れられ、解釈もしやすい。
- 代表的なモデルとして、以下の3種類を挙げる
- ローカルレベルモデル
- 2次のトレンドモデル
- ローカルレベル+季節成分モデル
- 今後執筆予定の記事では、上記の3モデルの計算例とともに、下記の軸に沿って解説を行う
状態空間モデリングとは?
概要
状態空間モデルでは、観測され系列データの背後に状態を仮定し、何かしらのルールで変化するを観察した結果がである、と考えます。
このとき、観測と状態変化は、マルコフ過程として描けるものと考えます:
このようにある構造をもったデータ生成過程を仮定したうえで、観測データをもとに状態の推定・未来の予測を行うのが状態空間時系列モデリングです。
具体的には、以下のような量を計算します:
- 全観測値に基づく状態の推定値(平滑化状態):
- 未来の観測値や状態の予測値
- 観測予測値:
- 状態予測値:
はが与えられたもとでの条件付き期待値です。
また、状態推定の方法はカルマンフィルタとMCMCの2種類が代表的です。
線型ガウス状態空間モデルの例
状態空間モデルの中でも比較的計算が容易でよく用いられるのが、以下の形で書ける線型ガウス状態空間モデルと呼ばれる種類のものです:
は期待値が, 共分散行列がの正規分布を表します。 観測値と状態はともにベクトルで表現しており、はいずれも行列です。
同じ内容を、表現を変えて書くと以下のようになります:
以下に3種類の線型ガウス状態空間モデルの代表的な例を、データへの適用例とともに紹介します。
なお、以下グラフでは、太い黒線は観測値を、細い灰色線は状態推定値・予測値を表しています。 推定値の周りの帯は、状態推定値の分散をもとに算出した25~75%, 10~90%の区間です。
1. ローカルレベルモデル
ローカルレベルモデルは、状態空間モデルの中でも最もシンプルなモデルです。
ブラウン運動する状態に、観測ノイズが乗る、と解釈ができます。
サンプルとして、以下のような架空の売り上げデータ(馬場2019)に適用しました:
2. 2次のトレンドモデル
前述のローカルレベルモデルで状態の式を
のように書き直すと、変化の期待値が常に0、つまり平均的なトレンドのない系列、として解釈できます。
これに対して、時系列が明確なトレンドを持つと仮定する場合は、以下のようなモデルを考えます:
線型ガウスモデルの一般式(\ref{eq:dlm})とは、とおくと対応します。
今度は
と書き換えられますので、トレンドがブラウン運動にしたがって少しずつ変化している、と解釈することができます。
先ほどと同じデータについて、このモデルにしたがって状態推定・予測を行うと次のようになります:
ローカルレベルモデルと比べて滑らかな状態推定値が得られ、また予測値も直前までの傾きを外挿するように伸びています。
3. ローカルレベル+季節成分モデル
実世界のデータはトレンドに加えて、日・週・月・年といった何かしらの周期性を持っていることがよくあります。
そのような場合は、時系列を以下のようにトレンド成分・季節成分・ノイズの和に分解して表現します:
季節成分は以下のように1周期分の和が平均的に0になるダミー変数として扱います1:
上記では周期をとしています。
以下に示すのは、ローカルレベルモデルに4半期周期成分を加えたモデルです:
こちらもとおくと線型ガウスモデルの一般式(\ref{eq:dlm})と対応します。
こちらをもとに、松浦2015のデータで状態推定・予測を行った結果がこちらです:
予測値も4半期に合わせて変動していることがわかります。
また、成分ごとに見てみると、トレンド成分推定値から時系列の「上昇具合」が見て取れます。
まとめと今後の執筆方針
今回の記事では状態空間時系列モデルの概要と代表的な例を紹介しました。
状態空間時系列モデリングでは、モデルの構造に周期性などの仮定を入れやすく、柔軟かつ解釈のしやすいモデルを作ることができます。
特に、トレンド・季節性の分離は利用するシーンが多いのではないかと思います。
今後の記事では状態推定方法とライブラリを用いた実行方法を焦点に掘り下げていき、最終的にはPythonでモデリングできるようになることを目指します。
現段階での記事構想
調べてみるとすぐにわかるのですが、Pythonを用いた時系列モデリングは、本2・ライブラリ3・Web記事4ともに情報がかなり少ないです。
一方で、Rについては参考になる本も多く、ライブラリもカルマンフィルタならKFAS5かdlm6、ベイズ推定ならRStan7が定番として挙げられます。
したがって、まずはRを動かしながら理論の適用方法を理解し、Pythonに翻訳して使えるようになる、という進め方をするのが良いように思います。
具体的には、前章で紹介した3種類のモデルを共通の例に、R -> Python, カルマンフィルタ VS MCMCの軸で一つずつ紹介していきます。
- カルマンフィルタによる状態推定とRによる実装方法の紹介(KFAS)
- Pythonを用いたカルマンフィルタによる状態推定(statsmodels)
- MCMCによる状態推定とRによる実装方法の紹介(RStan)
- Pythonを用いてMCMCで状態推定(PyMC3)
今回の一連の記事では扱わないこと
状態空間時系列モデリングに関連する話のうち、以下については今回は触れない予定です。
ARIMAモデル
古典的な時系列モデルである自己回帰(AR)モデルや移動平均(MA)モデルは、状態空間モデルに含まれるのでそのうち別で扱うかもしれません。
PyStan
RStanと使い方はほぼ一緒なので、特別触れません。
もし知りたい場合、公式ドキュメントか以下のUdemyの動画を参照してください。
細かい式の導出
カルマンフィルタについてはそのうち別枠で導出を行うかもしれません。とりあえず現時点では、参考文献の野村2016といった書籍か、こちらの記事を参照してください。
おっと、こんなところに良さげな本がkindle unlimitedで...(ステマ)
- 作者:LiberalArts,yoichi_t,TatamiYA
- 発売日: 2020/11/22
- メディア: Kindle版
非線形や非ガウスの状態空間モデル
粒子フィルタ、非線形カルマンフィルタなどなどといった計算手法はありますが、今回は範囲外とします。
ただし、観測値がイベント回数などの場合に使える一般化動的線型モデルについては、KFASでも実行できるので、ベイズとの比較も含めて今後解説するかもしれません。
また、カルマンフィルタの導出で触れた以下のブログでも、粒子フィルタの実装が紹介されています:
learning-with-machine.hatenablog.com
参考資料
データの出典
ローカルレベルモデル、2次のトレンドモデル
ローカルレベル+季節成分モデル
書籍
- 野村2016: 野村俊一、カルマンフィルタ ―Rを使った時系列予測と状態空間モデル― (統計学One Point 2)、共立出版(2016)
- 松浦2015: 松浦健太郎, Stan入門 ― 次世代のベイジアンモデリングツール in 岩波データサイエンス Vol.1、岩波書店(2015)
- 伊東2017: 伊東宏樹、Rによる状態空間モデリング in 岩波データサイエンス Vol.6、岩波書店(2017)
- 馬場2019: 馬場真哉、実践Data Scienceシリーズ RとStanではじめる ベイズ統計モデリングによるデータ分析入門 (KS情報科学専門書)、講談社(2019)
- 萩原et al.2018: 萩原 淳一郎ほか、基礎からわかる時系列分析 ―Rで実践するカルマンフィルタ・MCMC・粒子フィルター、技術評論社(2018)
-
ダミー変数を使う他に、三角関数で周期成分を表現することもありますが、今回は割愛します。野村2016を参照してください。↩
-
著者はこれくらいしか知りません:島田直希、時系列解析: 自己回帰型モデル・状態空間モデル・異常検知 (Advanced Python)、共立出版(2019)↩
-
代表的なものとしてstatsmodelsがあるものの、使い勝手が良いとは言い難く、ドキュメントも読みにくいです。↩
-
馬場2019の著者のブログにある程度まとまった情報が載っています:https://logics-of-blue.com/↩
-
KFAS:https://cran.r-project.org/web/packages/KFAS/index.html↩