状態空間モデル

最終更新: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

 

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



スポンサードリンク


 

状態空間モデル” に対して14件のコメントがあります。

  1. hao より:

    初学者の学生です。状態空間モデルを一生懸命勉強していますが、いまいち良さが理解出来ていません。本ブログだと、欠損値について書いていますが、正直欠損値はどうにか処理できます。他の良さはどこにあるのでしょうか?もし教えていただけたら幸いです。

    1. 馬場真哉 より:

      haoさん

      管理人の馬場です。コメントありがとうございます。
      コメントにて返信するにしてはちょっと量が多くなりすぎてしまったので、別途解説ページを作りました。
      こちらをご参照ください。
      http://logics-of-blue.com/%E3%81%AA%E3%81%9C%E7%8A%B6%E6%85%8B%E7%A9%BA%E9%96%93%E3%83%A2%E3%83%87%E3%83%AB%E3%82%92%E4%BD%BF%E3%81%86%E3%81%AE%E3%81%8B/

      よろしくお願いします。

      1. 馬場さん より:

        他の本やサイトでは得られないような考察でした。特に、機械学習と状態空間モデルの比較はどの書籍にも記載がなく大変参考になりました。ご推奨も早速購入しました。

  2. hao より:

    本サイトは非常に直感的にわかりやすく、描かれてあり、非常に重宝しております。特に初学者にとっては、学習の入り口となるようなものであり、理解がだいぶ進んでおります。参考文献欄で書かれているベイズな状態空間についても、機会があれば、今後アップデートして頂きたいです。

    1. 馬場真哉 より:

      haoさん

      コメントありがとうございます。本サイトが少しでもお役に立てたのであればうれしいです。
      いまは別の作業も入ってきており、サイト更新が少し難しくなってきました。
      そのため、少々時間はかかるかもしれませんが、年末年始くらいにはベイズ(StanやWinBUGS)による状態空間モデルに関してもアップしていけたらなと思います。
      今後ともよろしくお願いします。

  3. TK より:

    馬場様

    以前に状態空間モデルについて質問をさせていただいた者です。
    こちらのページを改めて拝見して状態空間モデルの利点として挙げられている
    「定常でない時系列データをそのまま扱うことができる」という点について教えていただきたく
    ご質問させていただきます。

    【質問】
    状態空間モデルを利用すれば、時系列分析で行われる定常性の確認は必要なくなるでしょうか。
    以下の参考文献の内容を見ると、やはりモデルを作る前に定常性を確認しなくてはいけないのかと迷っています。

    【参考文献】
    『カルマンフィルタの基礎』(足立・丸田 2012)

    p.96
    x(k+1)=Ax(k)+bv(k) ・・・ 状態方程式
    y(k)=c’x(k)+w(k) ・・・ 観測方程式
    (Aはn×nの行列、bとcはn次元ベクトル、kは時点)

    このときA, b, cが時間によらず一定とすると、
    その結果得られる時系列yは定常確率過程となる

    p.128
    A(k), b(k), c(k)に時点kを入れ時変モデルに拡張するとことで、
    非定常時系列に対してもカルマンフィルタを適用できる

    というようなことが書かれています。

    2つを総合すると、時系列が定常かどうかを分析者は予め確認をして、
    モデルを時不変にするか、時変にするかを決める必要があるように思います。
    時不変と時変、定常と非定常の関係がいまいち分りません。

    「非定常であっても時不変モデルを使えるか」
    これがYESでとなれば「定常でない時系列データをそのまま扱うことができる」
    といえそうなのですが、

    もしNOであれば
    ①定常性を確認→②定常であれば時不変モデル③非定常であれば時変モデル
    となるように思います。
    つまり「時系列データをそのまま扱うことができる」ということに、
    条件が付く気がします。

    私の理解が浅く、見当違いなご質問でしたら申し訳ございません。
    お忙しいところ恐れ入りますが、ご教授いただきたくお願いいたします。

    1. 馬場真哉 より:

      TKさん

      お久しぶりです。
      管理人の馬場です。

      コメントありがとうございます。また、回答が遅れてしまい、申し訳ありません。

      結論から言うと、状態空間モデルを使っていても、定常性の確認はしたほうがいいです。
      ただし、非定常なデータが相手であったとしても、データの変換を行う必要はなく、時系列データをそのまま対象として解析することが可能です。

      状態空間モデルは、様々なデータに対して適用することができる、便利なツールです。
      例えば、定常時系列データに適用するARMAモデルも、状態空間モデルの一種です。
      また、非定常なデータに適用できるローカルレベルモデルも状態空間モデルの一種です。

      定常か非定常かによってモデルの型(時変係数モデルかそうでないか、など)が異なってきます。
      そのため、定常かどうかの確認は行ったほうが良いでしょう。

      でも、モデルを変える必要はありますが、データの変換はしていません。
      なので「時系列データをそのまま扱うことができる」ということには変わりないのかなと思っています。

  4. TK より:

    馬場様

    お世話にっなております。
    TKです。

    お返事ありがとうございました。
    定常・非定常とモデルの型、データの変換の
    必要性などの関係がよく分かりました。

    今、状態空間モデルを使ってみようと考えているデータがありまして
    今回のご回答でやるべきことが分かった気がします。

    お忙しいところ、丁寧に教えていださいまして
    ありがとうございました。m(_ _)m

  5. G・ピーチ より:

    状態空間モデルについて勉強を始めたばかりの学生です。
    状態空間モデルを設計するためには制御工学の勉強が必要になるのでしょうか?
    無知な質問で申し訳ありません。

    1. 馬場真哉 より:

      G・ピーチ様

      コメントありがとうございます。

      もちろん制御工学について知っておくと便利でしょうが、
      制御工学と統計学としての状態空間モデルは目的が異なる面もあります。

      まずは、統計学における状態空間モデルから学んでいくと、
      良いのではないかと思います。
      そのあとで、制御工学との関係等を学ばれてはいかがでしょうか。

      1. G・ピーチ より:

        返信ありがとうございます。
        教授にもおなじような質問をしたところ同じような回答が返ってきました。
        統計学における状態空間モデルから学んでいきます。

  6. Yuji より:

    馬場先生

    時系列分析の初学者で、馬場先生の『時系列分析と状態空間モデルの基礎』を拝読させていただいております。
    業務にてある部品の劣化具合の予測に状態空間モデルを用いようと検討しています。
    対象部品のデータには2次の曲線に近似し、トレンドの変化が見えるためローカル線形トレンドモデルの当てはめられると推察しています。
    ローカル線形トレンドモデルでの状態の推定のアルゴリズムを理解したいため、KFASを用いずに算出しようとしています。

    P196・197にてローカル線形トレンドモデルでは
    現時点のトレンド = 1時点前のトレンド + トレンドの変化 で表し
    現時点の状態 = 1時点の状態 + 1時点前のトレンド + 過程誤差 で表すと、記載があります。

    またP204には補正後の状態 = 補正前の状態 + カルマンゲイン × (実際の観測値 – 予測された観測値)と記載があります。

    これらの文面から補正前の状態を1時点前の状態、補正後の状態を現時点の状態と捉えると、
    1時点のトレンド + 過程誤差 = カルマンゲイン × (実際の観測値 – 予測された観測値)とも理解できます。

    ここで1点確認させてください。
    カルマンゲイン × (実際の観測値 – 予測された観測値)とは、「過程誤差のみ」を表しているのか、「1時点のトレンド + 過程誤差」を表しているのどちらでしょうか?

    なお私はまだ馬場先生の『時系列分析と状態空間モデルの基礎』しか拝読していません。
    北川本や野村本に記載済みであった場合は、ご容赦ください。

    1. 馬場真哉 より:

      Yuji様

      コメントありがとうございます。
      管理人の馬場です。

      当方の書籍はあくまでもローカルレベルモデルを対象としてカルマンフィルタの解説をしています。
      より発展的なモデルになると、計算式は変わってきますね(解釈はあまり変わらないのですが、状態を得る計算式はそれなりに複雑になります)。
      「どちらになるのか」というご質問でしたが、前提条件をおそらく共有できていないものと思いますので、恐縮ですが「どちらでもない」というのが回答になるかと思います。

      ローカルレベルモデルからより複雑なモデルへジャンプする際には、いろいろと変わります。

      まず「補正前の状態」の解釈について説明します。
      『補正前の状態を1時点前の状態、補正後の状態を現時点の状態と捉えると』とありますが、これは誤りです。
      「補正前の状態」は「状態方程式を使って計算された、予測された状態」のことです。
      ローカルレベルモデルだとp208の式(5-20)の1行目に、u_t = u_t|tと記載していますが、ここですね。
      ローカルレベルモデルだと、1時点前の状態と同じになるのですが、複雑な状態方程式をもつものだと、ここが一致しません。
      ローカル線形トレンドモデルでは、p187の式(5-1)の記号を使うと、
      x_t = T_t * x_t-1
      により計算されるx_tが予測値となります。

      ローカル線形トレンドモデルでは、トレンド成分が含まれますので、x_tはスカラーではなく、2つの要素を持つベクトルになることにも注意が必要です。
      この時点で気づかれるかと思いますが、状態が2つある(水準μとトレンドδ)以上、もはやスカラー表現で示したのと同じ計算を行うことは困難です。この辺りが日本語の限界です。

      じゃあどうするかというと、行列表現を使います。この辺りは、野村本などに詳しいですね。
      あるいは足立(2012)『カルマンフィルタの基礎』などを参照いただければと思います。
      今後、当サイトでも補足できればと思います。

      1. Yuji より:

        馬場先生
        回答ありがとうございました。
        P208 の(5-20)と(5-21)がP206からの日本語での説明と結びついていなかったため、理解を誤まらせていたことが分かりました。

        紹介していただいた足立(2012)『カルマンフィルタの基礎を読んで、勉強していきたいと思います

G・ピーチ へ返信する コメントをキャンセル

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です

このサイトはスパムを低減するために Akismet を使っています。コメントデータの処理方法の詳細はこちらをご覧ください

前の記事

VARモデル

次の記事

dlmの使い方