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 の順で行い、それぞれ SSModel
,fitSSM
,KFS
関数を使用する。
以下はローカルレベルモデルの実装例。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)
状態空間モデルで扱われるトレンド成分モデル
■ ローカルレベルモデル
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"))
■ 平滑化トレンドモデル
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"))
■ ローカル線形トレンドモデル
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