【統計】時系列分析(状態空間モデル、KFAS)

KFAS(カルマンフィルタ&スムーザ)での状態空間モデルについてのメモ。
まとめておきたかったが、ずっと手を付けられず。。
分かっていない部分も多いのであくまで個人備忘録として。
個人的に野村先生の書籍が大変参考になった。

【目次】


ARIMA関連は以下の記事
【統計】時系列分析(AR、MA、ARMA、ARIMA、SARIMA、ARIMAXモデル) - こちにぃるの日記
【統計】時系列分析(ARIMA、SARIMA、SARIMAXをRで実行する) - こちにぃるの日記
【統計】時系列分析(ARIMA、SARIMA、SARIMAXをSASで実行する) - こちにぃるの日記


状態空間モデル(State Space Model)


時系列データを解析することができる統計手法。
時点間の相関をデザインすることができ、将来予測にも用いることができる。

状態空間モデルでは、実際に得られる観測値と本来の状態を、それぞれ『観測モデル(観測方程式)』と『状態モデル(状態方程式)』に分けてモデリングする。
以下概念図の通り、本来の状態から何かしらのノイズが加わって観測値が得られる。




なお、推定目的によって、以下の用語の使い分けがあるとのこと。
・フィルタ(filtering):現在の状態を推定する。
・平滑化(smoothing):過去の状態を推定する。欠損値も推定。
・予測(forecasting):将来の状態を推定する。


KFASでの実装


KFASでの実装は、Modeling ⇒ Fitting ⇒ Filtering&Smoothing の順で行い、それぞれ SSModelfitSSMKFS関数を使用する。
以下はローカルレベルモデルの実装例。SSMtrend関数でトレンド成分を設定する。

library(KFAS)
mod1 <- SSModel(ADS$Y ~ SSMtrend(1, Q=NA), H=NA))
fit1 <- fitSSM(mod1, inits=numeric(2), method="BFGS")
kfs1 <- KFS(fit1$model, smoothing=c("state","mean"))


季節成分や回帰成分(外生変数)を含める場合は、SSMseasonal関数と SSMregression関数で設定する。
また、AR成分もSSMarima関数で設定できるようだが、SSMarimaは使用したことはない。

library(KFAS)
mod1 <- SSModel(ADS$Y ~ SSMtrend(1, Q=NA)
                          + SSMseasonal(12, Q=NA)
                          + SSMregression(~ ADS$VAR1 + ADS$VAR2, Q=NA)
                          ,H=NA)
fit1 <- fitSSM(mod1, inits=numeric(4), method="BFGS")
kfs1 <- KFS(fit1$model, smoothing=c("state","mean"))


KFASの特徴は、ポアソン分布や二項分布などの正規分布(ガウシアン)以外も使用できることにある。
以下はポアソン分布を指定した例。シミュレーションが入るのでPCが弱々だと厳しい・・・

mod1p <- SSModel(ADTS$CNT ~ SSMtrend(1, Q=NA)
                 + SSMseasonal(12, Q=NA)
                 + SSMregression(~ ADTS$TEMP, Q=NA)
                 ,distribution="poisson"
                 ,u=1)
fit1p <- fitSSM(mod1p, inits=numeric(3), method="BFGS", nsim=1000)
kfs1p <- KFS(fit1p$model, nsim=1000)


状態空間モデルで扱われるトレンド成分モデル


■ ローカルレベルモデル

上記概念図で示した期待値がランダムウォークすると仮定したモデル。
「1時点前の期待値+ホワイトノイズ」。
 \quad y _{t}= \mu _{t} + \varepsilon _{t} \ , \ \varepsilon_{t}\sim 𝑁(0, H)
 \quad \mu _{t}=\mu _{t-1}+\eta _{t-1} \ , \ \eta _{t-1}\sim 𝑁(0, 𝑄)

mod1 <- SSModel(ADS$Y ~ SSMtrend(1, Q=NA), H=NA)
fit1 <- fitSSM(mod1, inits=numeric(2), method="BFGS")
kfs1 <- KFS(fit1$model, smoothing=c("state","mean"))



■ 平滑化トレンドモデル

傾きがランダムウォークすると仮定したモデル。
「1時点前と2時点前の階差系列+ホワイトノイズ」。
 \quad y _{t}= \mu _{t} + \varepsilon _{t} \ , \ \varepsilon_{t}\sim 𝑁(0, H)
 \quad \mu _{t}=\mu _{t-1} + (\Delta \mu _{t-1} + \eta _{t-1}) \ , \ \eta _{t-1}\sim 𝑁(0, 𝑄)
 \quad \Delta \mu _{t-1} = \mu _{t-1} - \mu _{t-2}

mod1 <- SSModel(ADS$Y ~ SSMtrend(2, Q=list(0,NA)), H=NA)
fit1 <- fitSSM(mod1, inits=numeric(2), method="BFGS")
kfs1 <- KFS(fit1$model, smoothing=c("state","mean"))



■ ローカル線形トレンドモデル

期待値と傾き両方がランダムウォークすると仮定したモデル。
 \quad y _{t}= \mu _{t} + \varepsilon _{t} \ , \ \varepsilon_{t}\sim 𝑁(0, H)
 \quad \mu _{t}=(\mu _{t-1} + \eta _{t-1,1}) + (\Delta \mu _{t-1} + \eta _{t-1,2}) \ , \ \eta _{t-1,1}\sim 𝑁(0, 𝑄1) \ , \ \eta _{t-1,2}\sim 𝑁(0, 𝑄2)
 \quad \Delta \mu _{t-1} = \mu _{t-1} - \mu _{t-2}

mod1 <- SSModel(ADS$Y ~ SSMtrend(2, Q=list(NA,NA)), H=NA)
fit1 <- fitSSM(mod1, inits=numeric(3), method="BFGS")
kfs1 <- KFS(fit1$model, smoothing=c("state","mean"))


参考


https://cran.r-project.org/web/packages/KFAS/KFAS.pdf
カルマンフィルタ Rを使った時系列予測と状態空間モデル(出版:共立出版), 野村俊一
https://www.actuaries.jp/lib/y_ronbun/pdf/2017.pdf
https://www.jstage.jst.go.jp/article/seitai/66/2/66_361/_pdf

本ブログは個人メモです。 本ブログの内容によって生じた損害等の一切の責任を負いかねますのでご了承ください。