https://github.com/ymattu/TokyoR70
$$
\begin{aligned}
p(\alpha \mid x) &= \frac{p(x \mid \alpha) \times p(\alpha)}{p(x)}
\end{aligned}
$$
細かいことは抜きにして:
ある状態 xt から xt + 1 に移るとき、次の式が成り立つ
p(xt)q(xt + 1 ∣ xt)=p(xt + 1)q(xt ∣ xt + 1)
この q(x ∣ y) は提案分布と呼ばれ、現在の状態 xt から次の状態 xt + 1 を得るために用いる確率分布
p(xtt)q(xt + 1 ∣ xt)w(xt + 1 ∣ xt)=p(xtt)q(xt + 1 ∣ xt)
$$
a(x^{t+1} \mid x^t) = \min \left[1, \frac{p(x^t)q(x^{t+1} \mid x^t)}{p(x^{t+1})q(x^t \mid x^{t+1})}\right]
$$
$$
q(x \mid x^t) = \begin{cases} p(x_i \mid x_{-i}^t) \; &x_{-i} = x_{-i}^t \\
0 \; &otherwise \end{cases}
$$
install.packages("rstan")
stanmodel <- rstan::stan_model("sample.stan")
datlist <- list(...)
fit <- rstan::sampling(stanmodel, datlist, iter=10000, ...)
n <- 400
b0 <- 2
b1 <- 5
b2 <- -3
sigma <- 2
set.seed(71)
xx1 <- rnorm(n, 0, 1)
xx2 <- rnorm(n, 2, 2)
bx <- b0 + b1*xx1 + b2*xx2
yy <- rnorm(n, bx, sigma)
df <- data.frame(y = yy, x1 = xx1, x2 = xx2)
y | x1 | x2 |
---|---|---|
14.4201782 | -0.4318422 | -3.4241758 |
-21.6955991 | -0.4471872 | 6.5855335 |
-5.3511933 | -0.4785726 | 0.1395514 |
0.7327234 | 0.4171454 | 0.3261460 |
-5.7041057 | -0.4179006 | 1.1598209 |
-7.6903685 | -1.1871639 | 1.6534544 |
-7.8104954 | -1.0722855 | 2.5685698 |
4.6245938 | 1.0032838 | 1.1200353 |
-6.3806865 | -1.1084783 | 0.6905064 |
6.4814420 | 1.2634307 | 0.1718988 |
注: 順番はこの順でなければならない
これを sample.stan
として保存
data {
int N ; // num of obs
real x1[N] ; // independent variable 1
real x2[N] ; // independent variable 2
real y[N] ; // dependent variable
}
parameters {
real b0 ;
real b1 ;
real b2 ;
real<lower=0> sigma ;
}
model {
for (i in 1:N) {
y[i] ~ normal(b0 + b1 * x1[i] + b2 * x2[i], sigma) ;
}
}
library(rstan)
# コンパイル
stanmodel <- stan_model("sample.stan")
datlist <- list(y = df$y,
x1 = df$x1,
x2 = df$y,
N = nrow(df))
fit <- sampling(stanmodel, datlist)
トレースプロットを見る
traceplot(fit)
summary(fit)$summary
mean se_mean sd 2.5% 25%
b0 2.025081 0.0028269389 0.14803756 1.740184 1.923768
b1 4.834611 0.0016919143 0.10700606 4.628631 4.760272
b2 -2.933941 0.0009892484 0.05203129 -3.036034 -2.968873
sigma 2.046228 0.0011815352 0.07382550 1.906331 1.995531
lp__ -484.974192 0.0321805712 1.39814965 -488.418567 -485.714889
50% 75% 97.5% n_eff Rhat
b0 2.025092 2.123802 2.321898 2742.275 0.9999702
b1 4.835004 4.906985 5.048263 4000.000 0.9999912
b2 -2.933319 -2.898268 -2.835307 2766.422 0.9996749
sigma 2.044362 2.096117 2.199582 3904.086 1.0002324
lp__ -484.645567 -483.942269 -483.207848 1887.643 1.0013678
for (i in 1:N) {
y[i] ~ normal(b0 + b1 * x1[i] + b2 * x2[i], sigma) ;
}
↓
data {
int N ; // num of obs
real x1[N] ; // independent variable 1
real x2[N] ; // independent variable 2
real y[N] ; // dependent variable
}
parameters {
real b0 ;
real b1 ;
real b2 ;
real<lower=0> sigma ;
}
transformed parameters {
real mu[N] ;
for (i in 1:N) {
mu[N] = b0 + b1 * x1[i] + b2 * x2[i]
}
}
model {
for (i in 1:N) {
y[i] ~ normal(mu[i], sigma) ;
}
}
data {
int N ;
int M ; \\ num of independent variables
vector[N] y ; \\ dependent variable
matrix[N, M] x ; \\ independent variable matrix
}
parameters {
vector[M] b ; \\ parameter vector
real<lower=0> sigma ;
}
model {
y ~ normal(x*b, sigma) ;
}
datlist2 <- list(N = nrow(df),
y = df$y,
x = cbind(1, df$x1, df$x2),
M = ncol(x))
y ~ normal(x*b, sigma) ;
beta ~ normal(0, 100) ;
sigma ~ cauchy(0, 5) ;
y ~ normal(mu, sigma)
は他の書き方もできるtarget += normal_lpdf(y | mu, sigma)
***lpdf
は対数確率を足し上げる作業
~
のほうが簡略表記※正直なところ、30-40分では「ちゃんと」は理解できないと思ってます