データマイニングのための備忘録

データマイニングのための備忘録

また調べそうなことをめもん

Amebaでブログを始めよう!
◆NileデータにDLM
====== dlm.stan =====
data {
  int<lower=0>  N;
  real          y[N];
}
parameters {
  real          theta[N];
  real<lower=0> sigma[2];
}
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]);
  }
}
=====

===== dlm_stan.R =====
library(rstan)
data(Nile)
fit <- stan("dlm.stan",
            data = list(y = as.vector(Nile),
                        N = length(Nile)),
            pars = c("sigma", "theta"),
            chains = 3,
            iter = 1500,
            warmup = 500,
            thin = 1)

tmp <- apply(as.matrix(fit), 2, mean)
theta <- tmp[grep(pattern = "theta", x = names(tmp))]
s <- start(Nile)[1]
e <- end(Nile)[1]
plot(Nile, type="o")
lines(s:e, theta, col="red", lwd=2)
=====

◆状態の初期値を考慮する
===== dlm_m0.stan =====
data {
  int<lower=0>  N;
  real          y[N];
}
parameters {
  real          theta[N];
  real<lower=0> sigma[2];
  real          m0;
}
model {
  //観測モデル
  for (t in 1:N) {
    y[t] ~ normal(theta[t], sigma[1]);
  }
  //状態モデル
  theta[1] ~ normal(m0, sigma[2]);
  for (t in 2:N) {
    theta[t] ~ normal(theta[t - 1], sigma[2]);
  }
}
=====

===== dlm_m0_stan.R =====
library(rstan)
data(Nile)
fit <- stan("dlm_m0.stan",
            data = list(y = as.vector(Nile),
                        N = length(Nile)),
            pars = c("sigma", "theta", "m0"),
            chains = 3,
            iter = 1500,
            warmup = 500,
            thin = 1)

tmp <- apply(as.matrix(fit), 2, mean)
theta <- tmp[grep(pattern = "theta", x = names(tmp))]
s <- start(Nile)[1]
e <- end(Nile)[1]
plot(Nile, type="o")
lines(s:e, theta, col="red", lwd=2)
=====

◆ダム建設を考慮する
===== dlm_dam.stan =====
data {
  int<lower=0>  N;
  real          y[N];
  int<lower=0, upper=1> x[N];
}
parameters {
  real          theta[N];
  real<lower=0> sigma[2];
  real          lambda;
  real          m0;
}
model {
  //観測モデル
  for (t in 1:N) {
    y[t] ~ normal(theta[t] + lambda * x[t], sigma[1]);
  }
  //状態モデル
  theta[1] ~ normal(m0, sigma[2]);
  for (t in 2:N) {
    theta[t] ~ normal(theta[t - 1], sigma[2]);
  }
}
=====
 
===== dlm_dam_stan.R =====
library(rstan)
data(Nile)

dat <- list(y = as.vector(Nile),
            N = length(Nile),
            x = as.vector(c(rep(0, 27), rep(1, length(Nile)-27))))

fit <- stan("dlm_dam.stan",
            data = dat,
            pars = c("sigma", "theta", "lambda", "m0"),
            chains = 3,
            iter = 1500,
            warmup = 500,
            thin = 1)

tmp <- apply(as.matrix(fit), 2, mean)
theta <- tmp[grep(pattern = "theta", x = names(tmp))]
lambda <- tmp[grep(pattern = "lambda", x = names(tmp))]

s <- start(Nile)[1]
e <- end(Nile)[1]

plot(Nile, type="o")
lines(s:e, theta+lambda*dat$x, col="red", lwd=2)
=====