
【Rでベイズ統計モデリング#10】ランダム切片モデル1
記事の目的
GLMMであるランダム切片モデル(データごと)のベイズ推定を、RとStanを使用して実装していきます。データの作成から実装するので、コピペで再現することが可能です。
目次
0 前準備
0.1 今回のモデル
0.2 ワーキングディレクトリの設定
以下の画像のようにワーキングディレクトリを設定します。設定したディレクトリに、RファイルとStanファイルを保存します。
1 ライブラリ
x
9
1
# 1 ライブラリ
2
library(dplyr)
3
library(ggplot2)
4
library(rstan)
5
library(bayesplot)
6
7
set.seed(1)
8
rstan_options(auto_write=TRUE)
9
options(mc.cores=parallel::detectCores())
2 データ
2.1 コード
1
16
16
1
# 2 データ
2
気温 <- rnorm(100, 20,5) %>% round(1)
3
休日 <- rbinom(100, 1, 2/7)
4
r <- rnorm(100, 0, 0.6)
5
lambda <- exp(-2+0.2*気温+0.5*休日+r)
6
売り上げ個数 <- rpois(100, lambda)
7
data <- data.frame(気温, 休日, 売り上げ個数)
8
data %>% head()
9
10
plot <- ggplot() +
11
geom_point(aes(x=data$気温, y=data$売り上げ個数, color=factor(data$休日))) +
12
theme_classic(base_family = "HiraKakuPro-W3") +
13
theme(text=element_text(size=25))+
14
labs(x="気温", y="売り上げ個数", title="データ") +
15
scale_color_manual("休日",values=c("red","blue"))
16
plot
2.2 結果
8行目の結果 | 16行目の結果 |
![]() |
![]() |
3 Stanの利用
3.1 Stanファイル
1
36
36
1
data {
2
int N;
3
int y[N];
4
vector[N] x1;
5
vector[N] x2;
6
7
int N_hat;
8
vector[N_hat] x_hat;
9
}
10
11
parameters {
12
vector[3] b;
13
14
vector[N] r;
15
real<lower=0> sigma;
16
}
17
18
transformed parameters{
19
vector[N] lambda;
20
lambda = exp(b[1] + b[2]*x1 + b[3]*x2+r);
21
}
22
23
model{
24
r ~ normal(0, sigma);
25
y ~ poisson(lambda);
26
}
27
28
generated quantities{
29
vector[N_hat] lambda_hat1;
30
vector[N_hat] lambda_hat0;
31
32
for(n in 1:N_hat){
33
lambda_hat1[n] = exp(b[1] + b[2]*x_hat[n] + b[3]);
34
lambda_hat0[n] = exp(b[1] + b[2]*x_hat[n]);
35
}
36
}
3.2 Stanを利用するRのコード
1
15
15
1
# 3 stanの使用
2
x_hat <- seq(min(data$気温), max(data$気温))
3
data_list <- list(
4
N = nrow(data), y = data$売り上げ個数,
5
x1 = data$気温, x2 = data$休日,
6
7
N_hat = length(x_hat), x_hat = x_hat
8
)
9
10
mcmc_result <- stan(
11
file="9ランダム切片モデル1.stan",
12
data=data_list,
13
seed=10,
14
iter = 2000, warmup = 200, chains = 2, thin=1
15
)
4 分析結果
4.1 コード
1
24
24
1
# 4 分析結果
2
## 4.1 推定結果
3
print(mcmc_result, probs = c(0.025, 0.5, 0.975), pars=c("b","sigma"))
4
5
## 4.2 収束の確認
6
mcmc_sample <- rstan::extract(mcmc_result, permuted=FALSE)
7
mcmc_combo(mcmc_sample, pars=c("b[1]","b[2]","b[3]","sigma"))
8
9
## 4.3 λの確認
10
mcmc_sample <- rstan::extract(mcmc_result)
11
func <- function(x){
12
return (quantile(x, c(0.025, 0.5, 0.975)))
13
}
14
lambda_hat1 <- apply(mcmc_sample[["lambda_hat1"]], 2, func)
15
lambda_hat0 <- apply(mcmc_sample[["lambda_hat0"]], 2, func)
16
r <- quantile(mcmc_sample[["r"]], c(0.025, 0.5, 0.975))
17
18
plot_lambda<- plot +
19
labs(title="λの推定結果") +
20
geom_line(aes(x=x_hat, y=lambda_hat1[2,]*exp(r[2])), col="blue") +
21
geom_line(aes(x=x_hat, y=lambda_hat0[2,]*exp(r[2])), col="red") +
22
geom_ribbon(aes(x=x_hat, ymin=lambda_hat1[1,]*exp(r[1]),ymax=lambda_hat1[3,]*exp(r[3])), alpha=0.5, fill="gray", col="blue")+
23
geom_ribbon(aes(x=x_hat, ymin=lambda_hat0[1,]*exp(r[1]),ymax=lambda_hat0[3,]*exp(r[3])), alpha=0.5, fill="gray", col="red")
24
plot_lambda
4.2 結果
3行目の結果 | 7行目の結果 |
![]() |
![]() |
24行目の結果 |
![]() |