状態空間モデルとはいったい何で、どんな時に使うといいのか、使うとどんなご利益があるのかということについて書きます。:Rで正規線形状態空間モデルを当てはめるローカルレベルモデル:dlmパッケージを使ってローカルレベルモデルを当てはめる季節とトレンド:dlmパッケージを使って季節成分とトレンドの入ったモデルを作るdlmによる時変形数モデル:dlmによる「時間によって係数が変化する回帰モデル」の作成Pythonによる状態空間モデル:R言語ではなくPythonを使いたい方はこちらをどうぞ時系列分析と状態空間モデルの基礎:サポートページ:時系列分析と状態空間モデルの入門書を書きました。補足をしていくという流れを取りました。状態空間モデルは、ARIMAといった普通(?)の時系列モデルと違い、予測だけではなく「説明」にもかなり重きをおいた手法かなと思ったので、予測を出すだけではなく、このモデルそのものに関する解説をやや長く書いた次第です。スポンサードリンク目次1.状態空間モデルのすごいところ2.状態空間モデルとは3.状態空間モデルの中身4.動的線形モデル(DLM)1.状態空間モデルのすごいところ今回扱う状態空間モデルは主に時系列データに適用します(空間データ・地空間データへの適用は省略)。時系列データを扱う分析手法は時系列解析と呼ばれています。時系列解析ってなんだか覚えていますか?全くわからない方は先にこちらをご覧ください。時系列分析を一言でいうと、過去のデータから未来を予測するという手法です。昨日魚が良く釣れたら、今日も釣れるだろうとか、あるいはその逆に、昨日釣れたら今日は釣れないだとか、そういう関係性があるのかというところを調べて予測に活用します。いった手法が適用できない状況はすぐに思いつきますね。昨日から今日を予測する以上、昨日のデータがなければ予測のしようがないのです。一年のうち360日分のデータがあったとしても、5日分、とびとびにデータが抜け落ちてしまっていたら、ふつうのARIMAモデルなどをそのまま適用することはできません。最近一週間分の売り上げデータがとれていなくて、今日からようやく売り上げデータをまた取ることができるようになったという時、明日の売り上げをどのように予測したらよいでしょう。昨日の売り上げデータを活用するのはあきらめますか?また1か月以上データが集まるまで待ち続けますか?それとも、勘と経験、度胸で売り上げを予測しますか?昨日のデータがないのにかかわらず、昨日と今日の関連性をモデルで表さなければいけない。これをやってのけるのが、状態空間モデルです。理論編では、ARモデル~ARIMAモデルを使って予測をする方法について書きました。こちらのほうがよりオーソドックスな時系列解析かもしれません。今回扱う状態空間モデルはちょっと複雑なモデルになります。状態空間モデルは、名前の通り「状態」というものを扱います。実際に「観測」された結果と対比してみるとわかりよいと思います。ものすごく簡略化して、例を挙げて説明します。湖の中に魚がいて、その個体数を数えてみたとします。それを10年くらい続けました。したら、10年間分の魚の個体数データが手に入ったことになります。その個体数はきっと、毎年変化しているでしょう。その個体数の変動は、いったい何が原因なのでしょうか。状態空間モデルでは、その原因を「水準の変化」と「観測誤差」という二つに分けて考えます。紛らわしいのですが、「個体数変動の原因」っていうのは「水温が高くなったから魚が増えた」とかいうことを言っているわけではありません。毎年多少のノイズが入っているから、そのノイズの分だけぶれている」のか、ということです。状態空間モデルでは、状態方程式と観測方程式という二つの式を使います。そこに、観測誤差なんかが加わって、実際に計測された魚の数がでてくると考えるんですね。これが状態空間モデルです。こんなめんどくさいことをするんでしょうか。一つは、すごく柔軟にモデルを組むことができるようになった点。過去の知見をもとにして、その知見をモデルに組み込むということが割と簡単にできます。一瞬ARIMAモデルの話をしましたが、状態空間モデルを使うことで、こういったモデルを表すことも可能です。これは実例を挙げてのちに説明します。最初にも説明しましたが、データに欠損値があっても使えるという特徴もあります。一期前から次の年を予測する時系列モデルでは、欠損値があるとその「一期前」の値がなくなってしまうのでARIMAとかだとモデルが組めなくなってしまいます。状態空間モデルだと大丈夫です。大丈夫なのかはすぐ後で説明します。あと、ちょっとコアな話になりますが、定常でない時系列データをそのまま扱うことができるというのも利点です。ARIMAだと差分を取ってから計算という流れを取っていましたが、差分を取るみたいなデータの変換を行わなくても計算ができるということです。まとめると、手持ちの時系列データをより柔軟に、そしてデータを選ばずに分析することができるようになったと、そういうことです。状態空間モデルの中身というか、考え方、計算の仕方について例を挙げて書きます。考えているということを意識しながら読んでみてください。ここでの計算の流れは「カルマンフィルター」と呼ばれるものを日本語訳(かなり意訳ですが)したものです。湖の中の魚の個体数が「状態」で、その湖で釣りをした結果が「観測値」だという例を使って話を進めていきます。状態空間モデルは状態を推定します。2000年における湖の中にいる魚個体数の水準を推定したと考えてください。2000年における見えない水準の「状態」がわかったとします。つぎは、2000年における状態から2001年における状態を推定します。一年前とはきっとよく似てるよね、という仮定を置くことが普通です。ARモデルの心と同じですね(あるいはそれ以外にもいろいろな要因を組み込むことができます)。合高い値になるんじゃないのかなという予測結果が出ました。いう予測のことは、カッコよく「イノベーション」とか呼ばれたりします。2001年の「状態」が推定できました。つぎは2001年の「観測値」を推定します。いうのを推定したと考えてください。観測値を「予測した」ともみなせます。どれくらい釣れるのかな、という「観測値」を推定したわけです。これが状態空間モデルを用いた予測のやり方です。湖の中の「状態」は、”魚多し”と出たわけですから、釣りしたらそれはもう爆釣に決まっているという予測結果が出されました。実際に2001年に釣りをしたら全然つれません。予測が外れちゃったんですね。釣り人の腕が悪かったということも考えられます。ある程度のブレならば観測誤差とまとめてしまえます。腕のいい釣り人が大挙して押し寄せても釣果0ということであれば予測された「水準」そのものが間違っていたのだろうとみなすところです。水準の値が間違っていたのだということにしておきます。喜ばしくないことですが、「本物の観測値」を手に入れることができたというのは儲けものです。準」が補正できるからです。これが俗にいうフィルタリングです。いう補正の値を「カルマンゲインと呼びます。正の式は下のようになります。補正前の状態+カルマンゲイン×(本物の観測値-予測された観測値)補正したって、外れた予測が当たるわけではありません。状態を補正することによって、来年の予測はより精度が良くなるでしょう。いうのをずっと続けて予測を出していくのが状態空間モデルです。この流れが理解できれば「欠損値があってもOK」という理由がわかるのではないかと思います。状態空間モデルでは目に見えない「状態」なるものを想定して、その「状態」は前期の値と関係している(もちろんこれ以外にもたくさんの要因がある)だろうということで予測を出していきました。目に見えない「状態」は、欠損値があってもなくても目に見えません。目に見えないところで脈々と連鎖していく「状態」から、観測をしてみたら10尾釣れたとかっていう「観測値」が得られると考えるわけです。欠損値があっても大丈夫。しても「一年前のデータとその次の年のデータはよく似ている」などといった関係をモデルであらわすことができます。欠損値の補間と、将来の予測は全く同じように「状態から観測値を推定する」という作業で表せられるので、両者は一緒だとみなすことができます。確率分布を「これ」と一つだけに絞って、さらに非線形(たとえば平滑化スプライン)なものも扱わない、やや単純にした状態空間モデルのことをこのように呼びます。くなった状態空間モデルですね。パッケージdlmを使えば比較的簡単に推定できるうえ、参考書も豊富なので、次のページからはこれを主に扱います。このページに書いてある内容がよくわからなくても、次のページからの実例を通してみると「雰囲気」くらいはつかめるようになるかもしれません。毎度のことですが、このサイトに書いてある内容はあくまでも「雰囲気」をつかむためのものであり、私見によるかなり偏った解釈であることに留意してください。正確なところもあります。ご意見、ご指摘があれば掲示板やメールでご一報いただけると大変ありがたいです。このサイトでいつも紹介している、状態空間モデルの入門書です。状態空間モデルについて知りたければ、まずはこの本から始めるのが良いと思います。読みやすい状態空間モデルの入門書です。これを読めば大体の雰囲気はつかめますよ。カルマンフィルタの基礎カルマンフィルタについて詳しく知りたい方はこちらをどうぞ。あるカルマンフィルタの本の中では最も読みやすいです。(KS理工学専門書)フィルタリングやスムージングに関してこれでもかというくらい丁寧に書かれた本です。最後のほうはやや難しくなってきますが、DLMの雰囲気をつかむだけなら最初だけでも十分です。R!)私がdlm関連の記事を書くときは、いつもこの本を参考にしています。dlmパッケージを使いこなしたい方はぜひどうぞ。日本語版は読んだことないですが、日本語が良い方はこちらをどうぞ。名前にはベイジアンってついてますが、MCMCでパラメタ推定するならdlmパッケージじゃなくってStanを使ったほうが良いような気がします。dlmによるベイズ推定は遅いし使いにくいです。おまけにStanのほうが柔軟にモデル組めますしね。Stanを使って状態空間モデルを推定した記事はこちらです。歴史に探る数理・物理法則の始まり→このサイトも大変参考にさせていただきました。端的にまとまっていて分かり易かったです。Filterのようです。この資料もネットに落ちていたのでリンクを張っておきます(この資料はちゃんと読んだことないです)。PM初学者の学生です。状態空間モデルを一生懸命勉強していますが、いまいち良さが理解出来ていません。本ブログだと、欠損値について書いていますが、正直欠損値はどうにか処理できます。他の良さはどこにあるのでしょうか?もし教えていただけたら幸いです。PMhaoさん管理人の馬場です。コメントありがとうございます。コメントにて返信するにしてはちょっと量が多くなりすぎてしまったので、別途解説ページを作りました。こちらをご参照ください。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/よろしくお願いします。AM他の本やサイトでは得られないような考察でした。機械学習と状態空間モデルの比較はどの書籍にも記載がなく大変参考になりました。ご推奨も早速購入しました。PM本サイトは非常に直感的にわかりやすく、描かれてあり、非常に重宝しております。初学者にとっては、学習の入り口となるようなものであり、理解がだいぶ進んでおります。参考文献欄で書かれているベイズな状態空間についても、機会があれば、今後アップデートして頂きたいです。PMhaoさんコメントありがとうございます。本サイトが少しでもお役に立てたのであればうれしいです。いまは別の作業も入ってきており、サイト更新が少し難しくなってきました。そのため、少々時間はかかるかもしれませんが、年末年始くらいにはベイズ(StanやWinBUGS)による状態空間モデルに関してもアップしていけたらなと思います。今後ともよろしくお願いします。以前に状態空間モデルについて質問をさせていただいた者です。モデルを利用すれば、時系列分析で行われる定常性の確認は必要なくなるでしょうか。非定常時系列に対してもカルマンフィルタを適用できるというようなことが書かれています。2つを総合すると、時系列が定常かどうかを分析者は予め確認をして、モデルを時不変にするか、時変にするかを決める必要があるように思います。時不変と時変、定常と非定常の関係がいまいち分りません。「非定常であっても時不変モデルを使えるか」これがYESでとなれば「定常でない時系列データをそのまま扱うことができる」といえそうなのですが、もしNOであれば1定常性を確認→2定常であれば時不変モデル3非定常であれば時変モデルとなるように思います。条件が付く気がします。私の理解が浅く、見当違いなご質問でしたら申し訳ございません。お忙しいところ恐れ入りますが、ご教授いただきたくお願いいたします。PMTKさんお久しぶりです。コメントありがとうございます。回答が遅れてしまい、申し訳ありません。結論から言うと、状態空間モデルを使っていても、定常性の確認はしたほうがいいです。非定常なデータが相手であったとしても、データの変換を行う必要はなく、時系列データをそのまま対象として解析することが可能です。状態空間モデルは、様々なデータに対して適用することができる、便利なツールです。定常時系列データに適用するARMAモデルも、状態空間モデルの一種です。非定常なデータに適用できるローカルレベルモデルも状態空間モデルの一種です。定常か非定常かによってモデルの型(時変係数モデルかそうでないか、など)が異なってきます。そのため、定常かどうかの確認は行ったほうが良いでしょう。モデルを変える必要はありますが、データの変換はしていません。「時系列データをそのまま扱うことができる」ということには変わりないのかなと思っています。AM馬場様お世話にっなております。お返事ありがとうございました。定常・非定常とモデルの型、データの変換の必要性などの関係がよく分かりました。今、状態空間モデルを使ってみようと考えているデータがありまして今回のご回答でやるべきことが分かった気がします。お忙しいところ、丁寧に教えていださいましてありがとうございました。AM状態空間モデルについて勉強を始めたばかりの学生です。状態空間モデルを設計するためには制御工学の勉強が必要になるのでしょうか?無知な質問で申し訳ありません。PMG・ピーチ様コメントありがとうございます。制御工学と統計学としての状態空間モデルは目的が異なる面もあります。良いのではないかと思います。そのあとで、制御工学との関係等を学ばれてはいかがでしょうか。PM返信ありがとうございます。教授にもおなじような質問をしたところ同じような回答が返ってきました。統計学における状態空間モデルから学んでいきます。初学者で、馬場先生の『時系列分析と状態空間モデルの基礎』を拝読させていただいております。業務にてある部品の劣化具合の予測に状態空間モデルを用いようと検討しています。対象部品のデータには2次の曲線に近似し、トレンドの変化が見えるためローカル線形トレンドモデルの当てはめられると推察しています。ローカル線形トレンドモデルでの状態の推定のアルゴリズムを理解したいため、KFASを用いずに算出しようとしています。表すと、記載があります。予測された観測値)と記載があります。予測された観測値)とも理解できます。ここで1点確認させてください。過程誤差」を表しているのどちらでしょうか?なお私はまだ馬場先生の『時系列分析と状態空間モデルの基礎』しか拝読していません。北川本や野村本に記載済みであった場合は、ご容赦ください。PMYuji様コメントありがとうございます。当方の書籍はあくまでもローカルレベルモデルを対象としてカルマンフィルタの解説をしています。発展的なモデルになると、計算式は変わってきますね(解釈はあまり変わらないのですが、状態を得る計算式はそれなりに複雑になります)。「どちらになるのか」というご質問でしたが、前提条件をおそらく共有できていないものと思いますので、恐縮ですが「どちらでもない」というのが回答になるかと思います。ローカルレベルモデルからより複雑なモデルへジャンプする際には、いろいろと変わります。「補正前の状態」の解釈について説明します。『補正前の状態を1時点前の状態、補正後の状態を現時点の状態と捉えると』とありますが、これは誤りです。「補正前の状態」は「状態方程式を使って計算された、予測された状態」のことです。u_t|tと記載していますが、ここですね。ローカルレベルモデルだと、1時点前の状態と同じになるのですが、複雑な状態方程式をもつものだと、ここが一致しません。x_t-1により計算されるx_tが予測値となります。ローカル線形トレンドモデルでは、トレンド成分が含まれますので、x_tはスカラーではなく、2つの要素を持つベクトルになることにも注意が必要です。この時点で気づかれるかと思いますが、状態が2つある(水準μとトレンドδ)以上、もはやスカラー表現で示したのと同じ計算を行うことは困難です。この辺りが日本語の限界です。するかというと、行列表現を使います。この辺りは、野村本などに詳しいですね。足立(2012)『カルマンフィルタの基礎』などを参照いただければと思います。今後、当サイトでも補足できればと思います。回答ありがとうございました。(5-20)と(5-21)がP206からの日本語での説明と結びついていなかったため、理解を誤まらせていたことが分かりました。コメントをキャンセルメールアドレスが公開されることはありません。コメントデータの処理方法の詳細はこちらをご覧ください。technology.。