最終更新:2017年6月1日

状態空間モデルとはいったい何で、どんな時に使うといいのか、使うとどんなご利益があるのかということについて書きます。

●状態空間モデル関連のページ
なぜ状態空間モデルを使うのか
状態空間モデル:状態空間モデルのことはじめ
dlmの使い方 :Rで正規線形状態空間モデルを当てはめる
ローカルレベルモデル:dlmパッケージを使ってローカルレベルモデルを当てはめる
季節とトレンド:dlmパッケージを使って季節成分とトレンドの入ったモデルを作る
dlmによる時変形数モデル:dlmによる「時間によって係数が変化する回帰モデル」の作成

Pythonによる状態空間モデル:R言語ではなくPythonを使いたい方はこちらをどうぞ

状態空間モデルに関しては、大枠を説明してから 少しずつ補足をしていくという流れを取りました。細かい部分は飛ばして全体を流し読みすると、状態空間モデルの雰囲気はわかるようになるのではないかなと 思います。
状態空間モデルは、ARIMAといった普通(?)の時系列モデルと違い、予測だけではなく「説明」にもかなり重きをおいた手法かなと思ったので、予測を出すだけではなく、このモデルそのものに関する解説をやや長く書いた次第です。



スポンサードリンク

 

目次

1.状態空間モデルのすごいところ
2.状態空間モデルとは
3.状態空間モデルの中身
4.動的線形モデル(DLM)

1.状態空間モデルのすごいところ

今回扱う状態空間モデルは主に時系列データに適用します(空間データ・地空間データへの適用は省略)。時系列データを扱う分析手法は時系列解析と呼ばれています。
時系列解析ってなんだか覚えていますか?全くわからない方は先にこちらをご覧ください。

時系列分析を一言でいうと、過去のデータから未来を予測するという手法です。
たとえば、昨日魚が良く釣れたら、今日も釣れるだろうとか、あるいはその逆に、昨日釣れたら今日は釣れないだとか、そういう関係性があるのかというところを調べて予測に活用します。

こういった手法が適用できない状況はすぐに思いつきますね。
そう、昨日から今日を予測する以上、昨日のデータがなければ予測のしようがないのです。

一年のうち360日分のデータがあったとしても、5日分、とびとびにデータが抜け落ちてしまっていたら、ふつうのARIMAモデルなどをそのまま適用することはできません。

あるいは、最近一週間分の売り上げデータがとれていなくて、今日からようやく売り上げデータをまた取ることができるようになったという時、明日の売り上げをどのように予測したらよいでしょう。
昨日の売り上げデータを活用するのはあきらめますか?
また1か月以上データが集まるまで待ち続けますか?
それとも、勘と経験、度胸で売り上げを予測しますか?

昨日のデータがないのにかかわらず、昨日と今日の関連性をモデルで表さなければいけない。
これをやってのけるのが、状態空間モデルです。

 

2.状態空間モデルとは

時系列解析 理論編では、ARモデル~ARIMAモデルを使って予測をする方法について書きました。こちらのほうがよりオーソドックスな時系列解析かもしれません。
今回扱う状態空間モデルはちょっと複雑なモデルになります。

状態空間モデルは、名前の通り「状態」というものを扱います。実際に「観測」された結果と対比してみるとわかりよいと思います。
ものすごく簡略化して、例を挙げて説明します。

たとえば、湖の中に魚がいて、その個体数を数えてみたとします。それを10年くらい続けました。そしたら、10年間分の魚の個体数データが手に入ったことになります。で、その個体数はきっと、毎年変化しているでしょう。
その個体数の変動は、いったい何が原因なのでしょうか。状態空間モデルでは、その原因を「水準の変化」と「観測誤差」という二つに分けて考えます。
やや紛らわしいのですが、「個体数変動の原因」っていうのは「水温が高くなったから魚が増えた」とかいうことを言っているわけではありません。もう ちょっと本質的な原因です。
すなわち
数えた値は毎年変わっているけれども、それは「本当に湖の魚の個体数の水準が変わったから」なのか、それとも、「水準そのものは変わっていないんだけれ ども、毎年多少のノイズが入っているから、そのノイズの分だけぶれている」のか、ということです。

状態空間モデルでは、状態方程式と観測方程式という二つの式を使います。湖の中にいる魚の実際の水準という「見えないモノ」を表すのが状態方程式 で、そこに、観測誤差なんかが加わって、実際に計測された魚の数がでてくると考えるんですね。
これが状態空間モデルです。

なぜこんなめんどくさいことをするんでしょうか。もちろんその意義はあります。

一つは、すごく柔軟にモデルを組むことができるようになった点。過去の知見をもとにして、その知見をモデルに組み込むということが割と簡単にできます。 一瞬ARIMAモデルの話をしましたが、状態空間モデルを使うことで、こういったモデルを表すことも可能です。これは実例を挙げてのちに説明します。
また、最初にも説明しましたが、データに欠損値があっても使えるという特徴もあります。一期前から次の年を予測する時系列モデルでは、欠損値があるとその「一期前」の値がなくなってしまうのでARIMAとかだとモデルが組めなくなってしまいます。でも状態空間モデルだと大丈夫です。なぜ大丈夫なのかはすぐ後で説明します。
あと、ちょっとコアな話になりますが、定常でない時系列データをそのまま扱うことができるというのも利点です。ARIMAだと差分を取ってから計算という流れを取っていましたが、差分を取るみたいなデータの変換を行わなくても計算ができるということです。

ざっくりまとめると、手持ちの時系列データをより柔軟に、そしてデータを選ばずに分析することができるようになったと、そういうことです。

 

3.状態空間モデルの中身

状態空間モデルの中身というか、考え方、計算の仕方について例を挙げて書きます。状態空間モデルは「状態」と「観測値」というように二つに分けて 考えているということを意識しながら読んでみてください。ここでの計算の流れは「カルマンフィルター」と呼ばれるものを日本語訳(かなり意訳ですが)したものです。
湖の中の魚の個体数が「状態」で、その湖で釣りをした結果が「観測値」だという例を使って話を進めていきます。

まず、状態空間モデルは状態を推定します。2000年における湖の中にいる魚個体数の水準を推定したと考えてください。
で、2000年における見えない水準の「状態」がわかったとします。
つぎは、2000年における状態から2001年における状態を推定します。一年前とはきっとよく似てるよね、という仮定を置くことが普通です。これは ARモデルの心と同じですね(あるいはそれ以外にもいろいろな要因を組み込むことができます)。2000年は魚の水準は高位状態だったから2001年も割 合高い値になるんじゃないのかなという予測結果が出ました。こういう予測のことは、カッコよく「イノベーション」とか呼ばれたりします。

2001年の「状態」が推定できました。
つぎは2001年の「観測値」を推定します。
観測値を推定するってなんか意味不明ですが、「観測データが得られなかったんだけれども、もしこの時に釣りをやっていたら何尾くらいとれたのかなぁ」と いうのを推定したと考えてください。
あるいは観測値を「予測した」ともみなせます。すなわち、まだ2001年はだれも釣りしてないんだけれども、解禁日になって釣りができるようになったら どれくらい釣れるのかな、という「観測値」を推定したわけです。これが状態空間モデルを用いた予測のやり方です。
湖の中の「状態」は、”魚多し”と出たわけですから、釣りしたらそれはもう爆釣に決まっているという予測結果が出されました。

で、実際に2001年に釣りをしたら全然つれません。予測が外れちゃったんですね。
しかし、即断は禁物です。釣り人の腕が悪かったということも考えられます。「観測誤差」です。ある程度のブレならば観測誤差とまとめてしまえます。でも、腕のいい釣り人が大挙して押し寄せても釣果0ということであれば予測された「水準」そのものが間違っていたのだろうとみなすところです。今回は予測さ れた水準の値が間違っていたのだということにしておきます。
大変喜ばしくないことですが、「本物の観測値」を手に入れることができたというのは儲けものです。その「本物の観測値」を使って、さっき予測した「水 準」が補正できるからです。これが俗にいうフィルタリングです。どれくらい補正しないといけないの? っていう補正の値を「カルマンゲインと呼びます。補 正の式は下のようになります。

補正後の状態 = 補正前の状態+カルマンゲイン×(本物の観測値-予測された観測値)

補正したって、外れた予測が当たるわけではありません。けれども、状態を補正することによって、来年の予測はより精度が良くなるでしょう。
で、補正された2001年の状態を使って、2002年の状態を推定して、それから2002年の観測値を推定して、そして2002年の状態を補正して…… というのをずっと続けて予測を出していくのが状態空間モデルです。

この流れが理解できれば「欠損値があってもOK」という理由がわかるのではないかと思います。
状態空間モデルでは目に見えない「状態」なるものを想定して、その「状態」は前期の値と関係している(もちろんこれ以外にもたくさんの要因がある)だろうということで予測を出していきました。目に見えない「状態」は、欠損値があってもなくても目に見えません。目に見えないところで脈々と連鎖していく「状態」から、観測をしてみたら10尾釣れたとかっていう「観測値」が得られると考えるわけです。だから欠損値があっても大丈夫。1年前のデータがなかったと しても「一年前のデータとその次の年のデータはよく似ている」などといった関係をモデルであらわすことができます。
また、欠損値の補間と、将来の予測は全く同じように「状態から観測値を推定する」という作業で表せられるので、両者は一緒だとみなすことができます。

4.動的線形モデル(DLM)

正規線形状態空間モデルのことを動的線形モデル(Dynamic Linear Model: DLM)といいます。
確率分布を「これ」と一つだけに絞って、さらに非線形(たとえば平滑化スプライン)なものも扱わない、やや単純にした状態空間モデルのことをこのように呼びます。制約を付けて扱える範囲を狭くして、その代わりに計算しやす くなった状態空間モデルですね。
パッケージdlmを使えば比較的簡単に推定できるうえ、参考書も豊富なので、次のページからはこれを主に扱います。

このページに書いてある内容がよくわからなくても、次のページからの実例を通してみると「雰囲気」くらいはつかめるようになるかもしれません。

毎度のことですが、このサイトに書いてある内容はあくまでも「雰囲気」をつかむためのものであり、私見によるかなり偏った解釈であることに留意してください。わかりやすさを優先したのでやや不 正確なところもあります。ご意見、ご指摘があれば掲示板やメールでご一報いただけると大変ありがたいです。誤りの指摘も大歓迎です。

 

参考文献


状態空間時系列分析入門

 
このサイトでいつも紹介している、状態空間モデルの入門書です。
状態空間モデルについて知りたければ、まずはこの本から始めるのが良いと思います。最も読みやすい状態空間モデルの入門書です。
これを読めば大体の雰囲気はつかめますよ。
 

カルマンフィルタの基礎

 
カルマンフィルタについて詳しく知りたい方はこちらをどうぞ。多々あるカルマンフィルタの本の中では最も読みやすいです。
 

予測にいかす統計モデリングの基本―ベイズ統計入門から応用まで (KS理工学専門書)

 
フィルタリングやスムージングに関してこれでもかというくらい丁寧に書かれた本です。最後のほうはやや難しくなってきますが、DLMの雰囲気をつかむだけなら最初だけでも十分です。
 


Dynamic Linear Models with R (Use R!)

 
私がdlm関連の記事を書くときは、いつもこの本を参考にしています。
dlmパッケージを使いこなしたい方はぜひどうぞ。
 


Rによるベイジアン動的線形モデル (統計ライブラリー)

 
Dynamic Linear Models with Rの日本語訳です。日本語版は読んだことないですが、日本語が良い方はこちらをどうぞ。
名前にはベイジアンってついてますが、MCMCでパラメタ推定するならdlmパッケージじゃなくってStanを使ったほうが良いような気がします。
dlmによるベイズ推定は遅いし使いにくいです。。。おまけにStanのほうが柔軟にモデル組めますしね。
Stanを使って状態空間モデルを推定した記事はこちらです。
 

 

書籍以外の参考文献

カルマンフィルタ入門 - 歴史に探る数理・物理法則の始まり
→このサイトも大変参考にさせていただきました。端的にまとまっていて分かり易かったです。
元ネタとなった資料はAn Introduction to the Kalman Filterのようです。
この資料もネットに落ちていたのでリンクを張っておきます(この資料はちゃんと読んだことないです)。
http://citeseerx.ist.psu.edu/viewdoc/download?doi=10.1.1.79.6578&rep=rep1&type=pdf

 

状態空間モデル関連のほかの記事はこちらから見ることができます



スポンサードリンク