なぜ状態空間モデルを使うのか
最終更新:2016年1月24日
このサイトでは統計学や統計モデルの紹介を多くしています。
その中でも、状態空間モデルは、力を入れている分野の一つです。
ところで、なぜ状態空間モデルを使う必要があるのでしょうか。
そもそもにおいて、統計モデルを使う必要性はどこにあるのでしょうか。
今回は個々の手法の説明ではなく「なぜそれを使うのか」という理由を解説します。
スポンサードリンク
目次
1.なぜモデルを使うのか
2.なぜ統計モデルを使うのか
3.なぜ状態空間モデルを使うのか
4.なぜたくさんのモデルを統一的に表せると便利なのか
5.状態空間モデルを使う注意点
6.状態空間モデルの御利益
7.おまけ:統計モデルと機械学習の違い
1.なぜモデルを使うのか
モデルとは、「見やすくなるように簡略化したもの」です。
モデルを作る行為、すなわちモデル化とは、「見やすくなるように簡略化すること」です。
例えば、魚が増えたり減ったりする原因を調べたいと思ったとしましょう。
その時に「水温が高くなって、塩分濃度が低くなって、波が弱くなって、天敵が少なくなって、台風がたくさん来て、そして人が漁獲した量が少なければ魚は増える」というこの世界の法則があったとします。
これは、神様が決めたことであって、「水温が高くなって、塩分濃度が低くなって、波が弱くなって、天敵が少なくなって、台風がたくさん来て、そして人が漁獲した量が少なければ魚は増える」という法則は絶対に正しいと仮定します。
しかし、こういった「絶対法則」がすぐにわかることは極めてまれです。
実は全然関係ない「海藻の量」なんてものをうっかり入れてしまったり、逆にとても重要な要素を抜かしてしまったり、ということもよくあります。
それに、水温に塩分に波の高さに天敵の量、台風の軌道、人間の漁獲量……とたくさんの要因を全部考えていくと、私たちの頭がパンクしてしまいますね。
要するに、たくさんの要因があると「わかりにくい」ということです。
わかりやすくするためには、簡略化することが一番です。
「人間がたくさん魚を獲ると、魚が減るか」を調べたいのであれば、波の大きさとか細かいことは無視したほうがわかりやすくなります。
例えば、
『来年の魚の数=今年の魚の数 + 1000トン - 人間がとった魚の量』
といったように、魚の数の変動を数式で表すことができれば、「人が魚を獲ったら、魚の数が減る」という関係性がすごくわかりやすくなります。
こんな感じで、実現象を「見やすくなるように簡略化すること」がモデル化です。
理解が難しいこの世界を簡単にすることができれば便利ですね。なのでモデル化という技法はよくつかわれるということでした。
2.なぜ統計モデルを使うのか
モデルを「えいや」と決めるのは簡単です。
さっきのお魚方程式は、私がYouTubeを見つつ、紅茶を飲みながら片手間に考えました。びっくりするくらいテキトーなモデルです。
人間が獲らなければ、魚は毎年1000トンずつ必ず増えていくって、まぁありえないことです。
実現象をわかりやすく簡略化したつもりが、現実世界とまったく違うものが出来上がってしまう。これでは困ります。
そこで、データを使ってモデルを作るようにします。
データへの当てはまりがよくなるようにモデルを作るので、ちょっと客観的になり、そして変な結果になりにくくなります。
統計データを使って作られるモデルのことを統計モデルと呼びます。
少し客観的にモデルを作るという目的において、統計モデルは便利だということです。
3.なぜ状態空間モデルを使うのか
状態空間モデルとは、統計モデルの一種です。
一般化線形モデルといった基本的なモデルより、ちょっと計算が難しいですが、大変有用です。
状態空間モデルを使う理由は「色々なことができるから」です。
あるいは「色々なデータに当てはめることができるから」と言い換えても構いません。
分散分析も、回帰分析も、正規線形モデルも、一般化線形モデル(GLM)も、一般化線形混合モデル(GLMM)も、自己回帰和分移動平均モデル(ARIMA)も、一般化自己回帰条件付き分散不均一モデル(GARCH)も確率的分散変動モデル(SV)も、みんなみんな状態空間モデルというたった一つのモデルで表すことができます。
状態空間モデルとは、「たくさんの統計モデルを統一的に表すことができる統計モデル」なのです。
だから状態空間モデルが注目を浴びてきているのです。
4.なぜたくさんのモデルを統一的に表せると便利なのか
今までの統計モデルは、ちょっと単純すぎるきらいがありました。
オーダーメイドと、レディメイドという言葉があります。
例えば、魚の個体数なら魚のための数理モデルが、経済に対してなら専門の経済モデルが研究されています。
そういった「特定のデータに対して適用するモデル」をオーダーメイドのモデルと呼ぶことにしましょう。
一方、一般化線形モデルといった統計モデルは「経済データにしか使えない」ということはありません。
ビールの売り上げ予測にも使えるし、ウェブサイトのログの解析にだって使えるでしょう。もちろん魚の数を予測するのにも使えます。
こんな風に「いろいろな対象に対して同じモデルを使うことができる」のは大変便利です。
こういうのをレディメイドのモデルと便宜上呼ぶことにします。
レディメイドの既製品を使うと大変簡便なのですが、既製品では応用性に欠けます。
例えば、
1月には「ビールの売り上げ = 4 + 気温×3」だが
3月には「ビールの売り上げ = 2 + 気温×4」に変わる。
といったように、係数や切片の値がころころ変わる状況を表そうと思うと、なかなか大変です。
あるいは
1月にはデータが期待値から遠く離れた値に出にくいが、
3月にはデータが期待値から遠く離れた値にもよくなる(分散が大きくなる)
といったことを一般化線形モデルで表そうとするのは、相当に困難です。
じゃあ、こういった分散の不均一性を表すために条件付き分散不均一なモデル(GARCHなど)を使うか、ということになります。
モデルそのものはたくさん用意されていますが、どれを使えばよいのか選ぶ作業が面倒ですね。
ビールのデータでも、魚のデータでも、経済データでも構わないけれども、表現の幅が狭くなる(分散不均一を表せないとか)という欠点が、個々の統計モデルにおいてはどうしてもあります。もちろんさっき出てきたGARCHも万能でありません。既製品ですから、手持ちのデータにぴったり合うモデルを選ぶのはなかなかに大変なのですね。
そこで状態空間モデルの出番です。
状態空間モデルは、型の決まった既製品のモデルですが、何せ「たくさんの統計モデルを統一的に表すことができるモデル」です。
一般化線形モデルとGARCHモデルの特徴を併せ持つようなモデルを組むことも可能です。
もちろん万能ではありませんが、それでも、適用できるデータの種類が飛躍的に増えたことは間違いありません。
状態空間モデルは、通常のクロスセクションデータに適用することもできますし、パネルデータにも、時系列データにも、空間データにも、そして時空間データに対しても適用することができます。
というわけで、「いろいろなデータに適用しやすい」状態空間モデルはとても便利なのだよという話でした。
5.状態空間モデルを使う注意点
状態空間モデルを使うことによって、少し複雑な状況やデータにも対応できるようになりました。
しかし、モデル化とは「見やすくするために簡略化すること」だということは忘れてはなりません。
状態空間モデルを使って、やたらめったら複雑なモデルを作り、人間には理解不能な謎の因果律が出来上がりました、というのは笑えないジョークなので、ぜひ気を付けてください。
それと、状態空間モデルは、推定するのが面倒です。
少なくとも一般化線形モデルと比べると天と地ほどの差があります。
ですので、一般化線形モデルで解決できることであれば、積極的にこちらを使うべきでしょう。楽なので。
そういう意味合いにおいても、一般化線形モデルをしっかり学んでおくことの意義は大きいと思います。
すごいぞ、便利だぞとさんざん宣伝しておきながらこのようなことを申し上げるのは大変恐縮なのですが、コストパフォーマンスを十分に考えたうえで実行に移されるのがよいかと思います。
6.状態空間モデルの御利益
状態空間モデルは統計モデルの一種です。
なので、統計モデルを作った際に得られる御利益は得ることができると考えてもらって結構です。
御利益の一つは、現象の「見える化」です。
モデルとは「見やすくなるように簡略化すること」なのですから、うまく組めば、現象に対する理解が深まります。
また、予測にも力を発揮します。
時系列データであれば、将来の値を予測できます。また欠損値を補完することもできます。
空間データであれば、場所と場所の間を補完することができます。
時空間データであったとしても、時間と空間の情報を使いつつ、「将来のこの地点にはこういうデータが来る」と予測できます。
適用できるデータの種類が増えた統計モデルとは、それだけで十分に役立つものです。
おまけ:統計モデルと機械学習の違い
ここで統計モデルの良さと、機械学習との違いについて(主観のこもった)解説をします。
ちなみにこの文章を書いた管理人の修論は、機械学習の一種である「ランダムフォレスト」を使った云々という論文でした。ですので、別に機械学習が嫌いなわけではないです。大変便利な手法だと思います。
ただ、統計モデルに日が当たらないのはさみしいです。機械学習と統計モデルの使い分けができるようにという願いも込めて、この文章を書きました。
機械学習の目的は「まだ手に入れていないデータを予測すること」です。
統計モデルの目的は「データが手に入るプロセスを推定すること」です。
よく似ているのですが、順番が違うことに気を付けてください。
機械学習は、プロセスがどうであれ、「とにかく予測が当たればよい」ということを目的としています。
機械学習では「汎化誤差」という言葉がよく出てきます。これは「未知のデータを予測したときの誤差」と思ってもらえれば(正確ではありませんが)よいかと思います。
この汎化誤差をいかにして小さくするかということを目的に最適化をしていくんですね。
一方の統計モデルは「データが手に入るプロセス」を推定します。
データが手に入るプロセスがわかっていれば、そのプロセスを順に流していくことにより、次出てくるデータが予測できるね、という考え方で予測します。
プロセスの推定が1番で、予測はその次です。
データが得られるプロセスとは例えば「1/6の確率で3の目が出てくる」というものであったりします。
あるいは、「この湖で釣れる魚の大きさは、期待値10㎝、分散3㎝の正規分布に従う」というものであったりします。
統計モデルとは何かと聞かれたら、「実現象を簡略化した~~」と答えるのが常ですが、これは統計モデルの存在意義であって、定義そのものではありませんね。
統計モデルの定義はとても簡潔です。
統計モデルとは「確率分布の候補の集合」です。
統計モデルとは、確率分布なのです。
例えば、大きな箱の中に、赤玉と白玉が1000個ずつ、均等にばらまかれていたとします。
そこから目をつむって玉を一つ取り出すという行為を考えます。
その時、データが得られるプロセスは「赤玉1000個、白玉1000個入った箱から無作為に玉を取り出す」となります。
これは、「赤玉が1/2の確率で、白玉が1/2の確率で手に入る」というプロセスだとみなしても差し支えありません。
なので、統計モデルとは確率分布であり、確率分布を推定することが「データが手に入るプロセスを推定する」こととなるのです。
統計モデルを使うと、「データが手に入るプロセス」を直接推定することができます。
そのため実現象の「見える化」という点においては、機械学習とは比較にならないほどの優位性があります。
ただし、機械学習のほうが、予測精度が高くなることはよくあります(すべてではありません。あくまでもデータによります)。
機械学習は、予測精度はよくなることが多いけど、それ以外に応用を利かすのはちょっと難しいものだと思えばいいのかなと思います(これも例外はありそうですが)。
最後に、状態空間モデルの話に戻ります。
状態空間モデルは、とても柔軟な統計モデルでして、色々な統計モデルの組み合わせのようなものを作り上げることも可能です。
そのため、複雑な「データが得られるプロセス」であったとしても、「私たち人間が直感的に理解することのできるプロセスに翻訳する」ことが比較的容易にできます。
すべて回帰分析にお任せ、というのだと、データを整形したりなんだりと大変手間がかかるうえに、直感から外れたモデルを作らざる負えなくなることもあります。特に●●検定という単一の検定手法に落とし込もうとした場合、この傾向は顕著になります。
しかし、状態空間モデルを使うと、モデルを組む際の制約が少ないので、自由にモデルを組めます。
私たちが実現象を理解するのにあたって、状態空間モデルはとても便利なのだよというお話でした。
状態空間モデル関連のほかの記事はこちらから見ることができます
おまけのおまけ
状態空間モデルの解説は載っていませんが、別の統計モデルである「一般化線形モデル」に関する本を書きました。
統計モデルの基礎や、統計モデルと確率分布の関係については、この本の4~5部にもっと細かい説明が載っています。
もしよければ、こちらも合わせてご参照ください。
スポンサードリンク
『平均・分散から始める一般化線形モデル』読みました。まだ、勉強を始めたばかりですが、将来、状態空間モデルの本も同じように平易な解説で出していただけるよう期待&お願いいたします!
TKさん
こんばんは。
管理人の馬場です。
書籍を読んでいただき、ありがとうございます。
少しでも面白いと感じるところがあればうれしいです。
続編ですが、現状はまだ白紙の状態です。
しかし、個人的には書きたいなと思っています。タイトルは「回帰分析から始める一般化状態空間モデル入門」あたりになるでしょうか。
まだ何も決まっていませんが、続編が書けるように頑張ります。
本ではないですが、ベイズ+状態空間モデルの記事を今月か来月あたりに公開する予定です。こちらも読んでいただけるとありがたいです。
今後とも、よろしくお願いします。
馬場様
こんにちは。
コメントの返信ありがとうございます。
こちらからのお返事が遅くなりまして申し訳ございません。
続編とても楽しみにしています。
ベイズ+状態空間モデルの記事もお待ちしています!
唐突な質問で恐縮なのですが、時系列分析をする時の
期間はどのくらいあった方がよいという大よその目安はあるのでしょうか?
例えば、年単位で時系列分析をしようと思ったとき、最低20年分くらいないと…
というようなことです。
実は、状態空間モデルに興味を持ったので、実際のデータを使って
勉強してみたいと思っているのですが、5年間分のデータしかありません。
今後貯めていく予定ですが、この程度のデータでも始めることはできるでしょうか。
TK様
こんにちは。
管理人の馬場です。
コメントありがとうございます。
また、状態空間モデルに興味を持っていただけたようで、とてもありがたいです。
> 唐突な質問で恐縮なのですが、時系列分析をする時の
> 期間はどのくらいあった方がよいという大よその目安はあるのでしょうか?
これはなかなか難しい問題でして、はっきりと「20年」とか決めることはできません。
多ければ多いほどよいというわけではなく、例えば定常を仮定しているARIMAモデルのようなものを組む際に、大きな状態の変化があるとうまくモデル化できなくなります。ARIMAを使う際は、あえて手持ちのデータをすべては使わず、近年のデータだけを使うこともあります。
ちなみに、「モデルを推定するだけ」であれば、推定するパラメタよりも多くのデータがあれば、一応推定だけは可能です。頑健でないモデルが出来上がってしまうでしょうが。
あいまいな返答にはなりますが「自分の興味の対象に合わせて変える」しかないかと思います。
例えば、一日毎のデータがあり、曜日による変動を確認したいということであれば、5年ものデータがあれば十分でしょう。
でも、最後の1年に大きな構造的変化が起こった(極端な例ですが、週休2日が始まったとか)いうことであれば、もう少し長くデータを準備したほうがよいことになります。
年の中でも季節などによって周期的に変化するというのであれば、季節変化を見るためにもう少し長くデータがあったほうがよいですし、2~3年の周期変動がありそうという場合では、5年は短すぎます。
「自分の興味の対象の変化をとらえることができている期間」のデータがあればベストです。
参考になれば幸いです。
馬場様
お返事ありがとうございます。
データの期間の問題、なかなか難しい問題なのですね。
まずは、自分が分析しようと思っているデータの過去からの
変化をグラフなどで概観して、どのくらいの長さから始めるか、
あるいは最低必要な長さを考えてみたいと思います。
分析者の試行錯誤の中で考えていく問題だと思いますので、
まずはトライして今後データをためていきつつ、改良していく
というふうにやってみたいと思います。
丁寧な説明で大変助かりました。
ありがとうございました。m(_ _)m
データの観測時点間の長さについて少し疑問がありご質問させていただきました。
データの観測時点間の長さが不均一の場合でもそのまま状態空間を適用しようと思うのですが、何か問題がありますでしょうか。例えば、あるイベントが起こったときのみ観測されているようなデータに状態空間を適用しようと思っています。個人的にはt-1 -> t -> t+1という時間遷移を仮定する中で時点間が等しいという仮定を見たことがないので、あまり問題はなさそうかなという印象なのですか。
お忙しいなか申し訳ないのですが、もしお分かりでしたら教えていただけると幸いです。
mmmさま
こんにちは。
管理人の馬場です。
返信が遅れて申し訳ありません。
コメントありがとうございます。
時系列解析はデータの観測点の長さが均一であることが求められます。
この仮定は「必須」と思っていただいて結構です。
時系列解析は、例えば「昨日と今日がどれだけ似ているか」という様子をモデル化します。
このとき、1日単位でデータをとるのではなく、ある日は1日おき、ある日は3日おきと「とびとび」となっていた場合「前期とどれだけ似ているか」という前期との相関(自己相関)が正しく計算できなくなります。
「昨日と今日はよく似ている」としても「3日前と今日はあまり似ていない」かもしれないわけですね。
状態空間モデルは欠損値があっても問題ないという特徴があるため、これを応用して、不均一な長さのデータに対応します。
具体的には、1日おき、3日おきとバラバラの間隔でデータがとられていたとしても、最小単位の長さ(この場合は1日おき)でデータを取得していると考えて計算します。
3日おきにデータをとっているときには、間の2日間は「欠損値」とみなします。
このように、間隔が不均一の場合は、最小単位の間隔に合わせてモデル化し、足りない分は「欠損値」扱いとして計算するのがセオリーです。
馬場さん、
こんにちは。はじめまして。
予測モデルの構築の研究をしてるのですが
状態空間モデルをつかって複数の測定値(変化要因)から
ある一つの状態を予測したいとき
1期先のそれらの測定値が揃っているときに
そのモデルから状態の変化を予測する場合
どのように実装コードを書けばいいのですか?
もし参考になるサイト、書籍等ございましたら
教えていただければ幸いです。
y_s様
コメントありがとうございます。
管理人の馬場です。
状況を完全に理解できたわけではないですが、
外生変数を使うのを検討されればよいかと思います。
1時点先の外生変数がわかっている状況で、
1時点先の状態を予測するのは、KFASでもStanでも可能です。
参考になる文研といわれると難しいですが、
外生変数の取り扱いが載っている文献ならばよいかと思います。
KFASにおいて、外生変数があるときのpredict関数の使い方は、
以下のリンクから参照できます。
https://rdrr.io/cran/KFAS/man/predict.SSModel.html