Open5
KFAS による状態空間時系列モデリングの snippet 集
この Scrap は?
KFAS を用いた状態空間時系列モデルのモデル種類別のモデリング方法を解説する。
状態空間時系列モデル(線形ガウス)の理論
以下を参照
状態空間時系列モデル(線形ガウス)の一般形
サンプルデータの準備
set.seed(13)
x1 <- 100 + arima.sim(model=list(ar=0.999), n=100)
s <- 2.5 * sin(seq(0, 99, length.out=100) * 2 * pi / 4)
y <- 1.2 * x1 + s + rnorm(100)
y[71:100] <- y[71:100] + 10
time.points <- seq.Date(as.Date("2014-01-01"), by=1, length.out=100)
datetime_cp <- time.points[71]
data <- data.frame(day=time.points, y=y, x1=x1) %>%
mutate(flg_interfere = case_when(day>=datetime_cp~1, .default = 0))
p1 <- ggplot(data=data) +
geom_line(aes(x=day, y=y))
p2 <- ggplot(data=data) +
geom_line(aes(x=day, y=x1))
grid.arrange(p1, p2)
実行コード
ローカルレベルモデル
KFAS によるモデリング
model_ll <- SSModel(y ~ SSMtrend(degree = 1, Q = NA),
data=data, H=NA)
fit_ll <- fitSSM(model_ll, numeric(2), method="BFGS")
全成分
pred_all <- predict(fit_ll$model, states="all", interval="prediction", level=0.95)
トレンド成分
pred_trend <- predict(fit_ll$model, states="trend", interval="confidence", level=0.95)
平滑化トレンドモデル
もしくは、
モデリング
model_st <- SSModel(y ~ SSMtrend(degree = 2, Q = c(list(0), list(NA))),
data=data, H=NA)
fit_st <- fitSSM(model_st, numeric(2), method="BFGS")
モデルパラメータ
model_st$Z
## , , 1
##
## level slope
## [1,] 1 0
model_st$T
## , , 1
##
## level slope
## level 1 1
## slope 0 1
model_st$R
## , , 1
##
## [,1] [,2]
## level 1 0
## slope 0 1
推定パラメータ
fit_st$model$H
## , , 1
##
## [,1]
## [1,] 6.471462
fit_st$model$Q
## , , 1
##
## [,1] [,2]
## [1,] 0 0.00000000
## [2,] 0 0.09705671
結果
全成分
pred_all <- predict(fit_st$model, states="all", interval="prediction", level=0.95)
トレンド成分
pred_slope <- predict(fit_st$model, states="trend", interval="confidence", level=0.95)
傾き成分
pred_trend <- predict(fit_st$model, states="slope", interval="confidence", level=0.95)
ローカル線形トレンドモデル
モデリング
model_lt <- SSModel(y ~ SSMtrend(degree = 2, Q = c(list(NA), list(NA))),
data=data, H=NA)
fit_lt <- fitSSM(model_lt, numeric(3), method="BFGS")
モデルパラメータ
model_lt$Z
## , , 1
##
## level slope
## [1,] 1 0
model_lt$T
## , , 1
##
## level slope
## level 1 1
## slope 0 1
model_lt$R
## , , 1
##
## [,1] [,2]
## level 1 0
## slope 0 1
推定パラメータ
fit_lt$model$H
## , , 1
##
## [,1]
## [1,] 4.15144
fit_lt$model$Q
## , , 1
##
## [,1] [,2]
## [1,] 2.58792 0.000000e+00
## [2,] 0.00000 9.878334e-06
結果
全成分
pred_all <- predict(fit_lt$model, states="all", interval="prediction", level=0.95)
トレンド成分
pred_trend <- predict(fit_lt$model, states="trend", interval="confidence", level=0.95)
傾き成分
pred_slope <- predict(fit_lt$model, states="slope", interval="confidence", level=0.95)
季節成分 + ローカルレベルモデル
または、
モデリング
model_s_ll <- SSModel(y ~ SSMtrend(degree = 1, Q = NA)
+ SSMseasonal(period=4, sea.type="dummy", Q=NA),
data=data, H=NA)
fit_s_ll <- fitSSM(model_s_ll, numeric(3), method="BFGS")
モデルパラメータ
model_s_ll$Z
## , , 1
##
## level sea_dummy1 sea_dummy2 sea_dummy3
## [1,] 1 1 0 0
model_s_ll$T
## , , 1
##
## level sea_dummy1 sea_dummy2 sea_dummy3
## level 1 0 0 0
## sea_dummy1 0 -1 -1 -1
## sea_dummy2 0 1 0 0
## sea_dummy3 0 0 1 0
model_s_ll$R
## , , 1
##
## [,1] [,2]
## level 1 0
## sea_dummy1 0 1
## sea_dummy2 0 0
## sea_dummy3 0 0
推定パラメータ
fit_s_ll$model$H
## , , 1
##
## [,1]
## [1,] 0.0006470018
fit_s_ll$model$Q
## , , 1
##
## [,1] [,2]
## [1,] 3.606111 0.000000e+00
## [2,] 0.000000 6.535295e-07
結果
全成分
pred_all <- predict(fit_s_ll$model, states="all", interval="prediction", level=0.95)
トレンド成分
pred_all <- predict(fit_s_ll$model, states="trend", interval="confidence", level=0.95)
季節成分
pred_all <- predict(fit_s_ll$model, states="seasonal", interval="confidence", level=0.95)