Mais conteúdo relacionado Semelhante a 状態空間モデルの実行方法と実行環境の比較 (20) 状態空間モデルの実行方法と実行環境の比較8. dlmの記法
✓0 ⇠ N(m0, C0)
✓t = Gt✓t 1 + wt, wt ⇠ N(0, Wt)
t = 1, ... , n
データモデル
プロセスモデル
yt = Ft✓t + vt, vt ⇠ N(0, Vt)
10. dlmによるLocal Level Model
Petris and Petrone (2011)より
## build functionの定義!
BuildLLM <- function(theta) {!
dlmModPoly(order = 1,!
dV = theta[1],!
dW = theta[2])!
}
このような関数を定義しておく。
11. dlmによるLocal Level Model
## パラメーターの最尤推定!
fit.llm <- dlmMLE(Nile, parm = c(100, 2),!
build = BuildLLM,!
lower = rep(1e-4, 2))!
!
## 推定したパラメーターをbuild functionで使用!
model.llm <- BuildLLM(fit.llm$par)!
!
## 平滑化!
smooth.llm <- dlmSmooth(Nile, model.llm)
15. dlmによる回帰モデル
## モデル定義!
model.reg <- dlmModReg(x, dW = c(1, 0))!
BuildReg <- function(theta) {!
V(model.reg) <- exp(theta[1])!
diag(W(model.reg))[1] <- exp(theta[2])!
return(model.reg)!
}
16. dlmによる回帰モデル
## 最尤推定!
fit.reg <- dlmMLE(Nile,!
parm = rep(0, 2),!
build = BuildReg)!
model.reg <- BuildReg(fit.reg$par)!
smooth.reg <- dlmSmooth(Nile,!
mod = model.reg)
18. dlmの文献
• Petris G, Petrone S, Campagnoli (2009)
Dynamic Linear Models with R Springer
• 和合肇(監訳)・萩原淳一郎(訳)(2013)「R
によるベイジアン動的線形モデル」朝倉書店
• Petris G (2010) An R package for dynamic
linear models. Journal of Statistical
Software 36(12)
20. KFAS
• Kalman Filter and Smoother for Exponential
Family State Space Models
• 正規分布以外の分布(ポアソン分布など)を扱
える
• 最尤推定
21. KFASの記法
t = 1, ..., n
↵1 ⇠ N(a1, P1)
プロセスモデル
データモデル
yt = Zt↵t + ✏t, ✏t ⇠ N(0, Ht)
↵t+1 = Tt↵t + Rt⌘t, ⌘t ⇠ N(0, Qt)
32. BUGSモデル
model {!
## データモデル!
for (t in 1:N) {!
y[t] ~ dbin(p, y_hat[t]);!
y_hat[t] <- trunc(exp(lambda[t]));!
}!
## プロセスモデル!
for (t in 2:N) {!
lambda[t] ~ dnorm(lambda[t - 1], tau);!
}!
## 事前分布!
lambda[1] ~ dnorm(0, 1.0E-4);!
p ~ dbeta(2, 2);!
sigma ~ dunif(0, 100);!
tau <- 1 / (sigma * sigma);!
}
33. JAGSによる実行
inits <- list()!
inits[[1]] <- list(p = 0.9, sigma = 1,!
lambda = rep(log(max(N.obs) + 1), n.t))!
inits[[2]] <- list(p = 0.7, sigma = 3,!
lambda = rep(log(max(N.obs) + 1), n.t))!
inits[[3]] <- list(p = 0.8, sigma = 5,!
lambda = rep(log(max(N.obs) + 1), n.t))!
!
model <- jags.model("ks51.bug.txt",!
data = list(N = n.t, y = N.obs),!
inits = inits, n.chains = 3,!
n.adapt = 100000)!
samp <- coda.samples(model,!
variable.names = c("y_hat", “sigma",!
"p"),!
n.iter = 3000000, thin = 3000)!
40. StanによるDLM
data {!
int<lower=0> N;!
matrix[1, N] y;!
}!
transformed data {!
matrix[1, 1] F;!
matrix[1, 1] G;!
vector[1] m0;!
cov_matrix[1] C0;!
!
F[1, 1] <- 1;!
G[1, 1] <- 1;!
m0[1] <- 0;!
C0[1, 1] <- 1.0e+6;!
}
データ
dlmと同様の
データを用意
45. StanによるDLM
> print(fit)!
Inference for Stan model: kalman.!
3 chains, each with iter=1500; warmup=500; thin=1; !
post-warmup draws per chain=1000, total post-warmup draws=3000.!
!
mean se_mean sd 2.5% 25% 50% 75% 97.5% n_eff Rhat!
sigma[1] 121.2 0.5 13.8 92.6 112.7 121.5 130.3 148.4 889 1!
sigma[2] 45.5 0.6 17.6 18.3 32.7 43.2 55.7 85.2 833 1!
lp__ -541.6 0.0 1.1 -544.6 -542.0 -541.3 -540.9 -540.6 904 1!
!
Samples were drawn using NUTS(diag_e) at Sun Feb 9 06:06:42 2014.!
For each parameter, n_eff is a crude measure of effective sample size,!
and Rhat is the potential scale reduction factor on split chains (at !
convergence, Rhat=1).!
46. StanによるDLM
sigma <- apply(extract(fit, "sigma")$sigma, 2, mean)!
!
library(dlm)!
!
buildNile <- function(theta) {!
dlmModPoly(order = 1, dV = theta[1], dW = theta[2])!
}!
modNile <- buildNile(sigma^2)!
smoothNile <- dlmSmooth(Nile, modNile)
ベイズ推定されたパラメータをdlmで使用
50. Stanによる状態空間モデルの解析
model {!
// データモデル!
for (t in 1:N) {!
y[t] ~ normal(theta[t], sigma[1]);!
}!
!
// プロセスモデル!
for (t in 2:N) {!
theta[t] ~ normal(theta[t - 1], sigma[2]);!
}!
!
// 事前分布!
theta[1] ~ normal(0, 1.0e+4);!
sigma ~ uniform(0, 1.0e+6);!
}