SSブログ

状態空間モデルをためす [統計]

状態空間モデルの勉強。やはり自分でコードを書いてみないと。

まずはPetris and Petrone (2011)にあった例から。

data(Nile)

## dlm
##
## Petris G., Petrone, S. (2011) State Space Models in R
## Journal of Statistical Software 41(4)
## http://www.jstatsoft.org/v41/i04
##

library(dlm)

buildNile <- function(theta) {
  dlmModPoly(order = 1, dV = theta[1], dW = theta[2])
}
fit <- dlmMLE(Nile, parm = c(100, 2), buildNile, lower = rep(1e-4, 2))
modNile <- buildNile(fit$par)
smoothNile <- dlmSmooth(Nile, modNile)

plot(Nile, type ='o', las = 1)
lines(dropFirst(smoothNile$s), col = "red")

Rplot1.png

つぎにベイズモデリングでやってみる。自作JAGS呼び出し関数をつかう。このモデルでAR(1)ということになるだろうか。


## MCMC
source("JAGS_R.R")

model.file <- "model.bug"

mod <- "
var
  n, x[n], y[n],
  y1,
  tau.x, sigma.x,
  tau.y, sigma.y;

model {
  x[1] ~ dnorm(y1, tau.x);
  y[1] ~ dnorm(x[1], tau.y);

  for (i in 2:length(y)) {
    x[i] ~ dnorm(x[i - 1], tau.x);
    y[i] ~ dnorm(x[i], tau.y);
  }

  tau.x ~ dgamma(1.0E-3, 1.0E-3);
  tau.y ~ dgamma(1.0E-3, 1.0E-3);
  sigma.x <- 1 / sqrt(tau.x);
  sigma.y <- 1 / sqrt(tau.y);
}
"

write(mod, file = model.file)

n.chains <- 3
data <- list(y = as.vector(Nile), n = length(Nile),
             y1 = Nile[1])
init1 <- list(.RNG.name = "base::Mersenne-Twister",
              .RNG.seed = 314,
              tau.x = 1, tau.y = 100)
init2 <- list(.RNG.name = "base::Mersenne-Twister",
              .RNG.seed = 3141,
              tau.x = 100, tau.y = 0.01)
init3 <- list(.RNG.name = "base::Mersenne-Twister",
              .RNG.seed = 31415,
              tau.x = 0.01, tau.y = 1)
inits <- list(init1, init2, init3)
var = c("x", "sigma.x", "sigma.y")

post <- jags.run(data = data, inits = inits,
                 parameters.to.save = var,
                 model.file = model.file,
                 n.chains = n.chains,
                 n.iter = 35000, n.burnin = 15000,
                 n.thin = 10)

gelman.diag(post)

summary(post[, (length(Nile) + 1):(length(Nile) + 2)])

y.mean <- apply(rbind(post[[1]][, 1:length(Nile)],
                      post[[2]][, 1:length(Nile)],
                      post[[3]][, 1:length(Nile)]), 2, mean)

グラフを重ねてみる。

## plot
s <- start(Nile)[1]
e <- end(Nile)[1]
plot(Nile, type ='o', las = 1)
lines(dropFirst(smoothNile$s), col = "red")
lines(s:e, y.mean, col = "blue")

Rplot2.png


タグ:MCMC R jags dlm
nice!(0)  コメント(0)  トラックバック(1) 
共通テーマ:パソコン・インターネット

nice! 0

コメント 0

コメントを書く

お名前:
URL:
コメント:
画像認証:
下の画像に表示されている文字を入力してください。

Facebook コメント

トラックバック 1