久保先生の緑本に沿ってちょっとずつ線形モデルを発展させていく。
線形モデル LM (単純な直線あてはめ)
↓ いろんな確率分布を扱いたい
一般化線形モデル GLM
↓ 個体差などの変量効果を扱いたい
一般化線形混合モデル GLMM
↓ もっと自由なモデリングを!
階層ベイズモデル HBM
最小二乗法
最尤推定法
MCMC
植物100個体から8個ずつ種子を取って植えたら全体で半分ちょい発芽。
親1個体あたりの生存数はn=8の二項分布になるはずだけど、
極端な値(全部死亡、全部生存)が多かった。個体差?
各個体の生存率$p_i$が能力値$z_i$のシグモイド関数で決まると仮定。
その能力値は全個体共通の正規分布に従うと仮定:
$z_i \sim \mathcal{N}(\hat z, \sigma)$
パラメータ2つで済む: 平均 $\hat z$, ばらつき $\sigma$ 。
普通の二項分布は個体差無し $\sigma = 0$ を仮定してるのと同じ。
事前分布のパラメータに、さらに事前分布を設定するので階層ベイズ
10 とか 3 とか、エイヤっと決めてるやつが超パラメータ。
data {
int<lower=0> N;
array[N] int<lower=0> y;
}
parameters {
real z_hat; // mean ability
real<lower=0> sigma; // sd of r
vector[N] r; // individual difference
}
transformed parameters {
vector[N] z = z_hat + r;
vector[N] p = inv_logit(z);
}
model {
y ~ binomial(8, p);
z_hat ~ normal(0, 10);
r ~ normal(0, sigma);
sigma ~ student_t(3, 0, 1);
}
generated quantities {
array[N] int yrep = binomial_rng(8, p);
}
seeds_data = list(y = df_seeds_od$y, N = sample_size)
model = cmdstanr::cmdstan_model("stan/glmm.stan")
fit = model$sample(data = seeds_data, seed = 19937L, step_size = 0.1, refresh = 0)
draws = fit$draws(c("z_hat", "sigma", "r[1]", "r[2]"))
variable mean median sd mad q5 q95 rhat ess_bulk ess_tail
lp__ -456.18 -455.74 9.50 9.62 -472.27 -441.55 1.00 827 1617
z_hat 0.27 0.26 0.32 0.32 -0.26 0.81 1.00 687 1131
sigma 2.79 2.77 0.34 0.34 2.28 3.36 1.00 1312 2168
r[1] -0.27 -0.26 0.80 0.78 -1.60 1.00 1.00 3188 2064
r[2] 1.74 1.66 1.05 1.03 0.13 3.55 1.00 3842 2785
r[3] 1.73 1.66 1.05 0.99 0.13 3.62 1.00 4225 2642
r[4] -3.77 -3.59 1.58 1.48 -6.73 -1.52 1.00 4372 2149
r[5] -2.23 -2.14 1.09 1.05 -4.16 -0.62 1.00 4485 2484
r[6] -2.22 -2.11 1.12 1.06 -4.22 -0.54 1.00 4849 2515
r[7] 0.88 0.84 0.88 0.87 -0.47 2.40 1.00 3849 2457
# showing 10 of 403 rows (change via 'max_rows' argument or 'cmdstanr_max_rows' option)
データ生成の真のパラメータ値は $\hat z = 0.5,~\sigma = 3.0$ だった。

100個体の植物から8つずつ種を取った、のデータでやってみよう。
sample_size = 300L
lambda = 3
overdisp = 4
.n = lambda / (overdisp - 1)
.p = 1 / overdisp
df_beer_od = tibble::tibble(
X = rnbinom(sample_size, size = .n, prob = .p)
)
より柔軟にモデルを記述できるようになった。計算方法も変化。