統計モデリング概論 DSHC 2023

岩嵜 航 (Watal M. Iwasaki, PhD)
東北大学 生命科学研究科 進化ゲノミクス分野 特任助教
(Graduate School of Life Sciences, Tohoku University)
  1. 導入
  2. 直線回帰、確率分布、擬似乱数生成
  3. 尤度、最尤推定
  4. 一般化線形モデル(GLM)
  5. 個体差、一般化線形混合モデル(GLMM)
  6. ベイズの定理、事後分布、MCMC
  7. StanでGLM
  8. 階層ベイズモデル(HBM)
2023-08-30 東京海上 Data Science Hill Climb
https://heavywatal.github.io/slides/tokiomarine2023/

ちょっとずつ線形モデルを発展させていく

データ解析のための統計モデリング入門 久保拓弥 2012

久保先生の"緑本"こと
データ解析のための統計モデリング入門
をベースに回帰分析の概要を紹介。

線形モデル LM (単純な直線あてはめ)

    ↓ いろんな確率分布を扱いたい

一般化線形モデル GLM

    ↓ 個体差などの変量効果を扱いたい

一般化線形混合モデル GLMM

    ↓ もっと自由なモデリングを!

階層ベイズモデル HBM

GLMMで登場した個体差を階層ベイズモデルで

植物100個体から8個ずつ種子を取って植えたら全体で半分ちょい発芽。
親1個体あたりの生存数はn=8の二項分布になるはずだけど、
極端な値(全部死亡、全部生存)が多かった。個体差?

plot of chunk overdispersion

個体差をモデルに組み込みたい

各個体の生存率$p_i$が能力値$z_i$のシグモイド関数で決まると仮定。
その能力値は全個体共通の正規分布に従うと仮定: $z_i \sim \mathcal{N}(\hat z, \sigma)$

plot of chunk sigmoid

パラメータ2つで済む: 平均 $\hat z$, ばらつき $\sigma$ 。

個体能力のばらつき $\sigma$ が大きいと両端が増える

普通の二項分布は個体差無し $\sigma = 0$ を仮定してるのと同じ。

plot of chunk alter-sigma-z plot of chunk alter-sigma-z

階層ベイズモデルのイメージ図

事前分布のパラメータに、さらに事前分布を設定するので階層ベイズ

さっきの図をStan言語で記述すると

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 = samplesize)
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__  -455.85 -455.48 9.21 9.27 -471.57 -441.72 1.00      834     1563
    z_hat    0.25    0.25 0.31 0.29   -0.25    0.74 1.00      729     1431
    sigma    2.77    2.74 0.34 0.34    2.26    3.35 1.00     1182     2360
    r[1]    -0.24   -0.24 0.77 0.78   -1.47    1.02 1.00     2869     2766
    r[2]     1.76    1.66 1.07 1.06    0.16    3.67 1.00     4692     2672
    r[3]     1.77    1.69 1.09 1.03    0.17    3.75 1.00     4713     2417
    r[4]    -3.74   -3.55 1.57 1.53   -6.53   -1.45 1.00     4865     3015
    r[5]    -2.21   -2.11 1.07 1.03   -4.14   -0.65 1.00     4223     2252
    r[6]    -2.19   -2.11 1.03 0.99   -4.00   -0.60 1.00     4408     2463
    r[7]     0.93    0.88 0.89 0.88   -0.43    2.48 1.00     4135     3151

 # showing 10 of 403 rows (change via 'max_rows' argument or 'cmdstanr_max_rows' option)

抜粋して作図。悪くない。

データ生成の真のパラメータ値は $\hat z = 0.5,~\sigma = 3.0$ だった。

plot of chunk stan-glmm

🔰 階層ベイズモデルの練習問題: 種の数

8-hbm.ipynb をJupyterで開き、スライド説明に沿って実行していこう。

100個体の植物から8つずつ種を取り、発芽した数を観察。

plot of chunk overdispersion plot of chunk stan-glmm-ppc

🔰 階層ベイズモデルの練習問題: ビール注文数

samplesize = 300L
lambda = 3
overdisp = 4
.n = lambda / (overdisp - 1)
.p = 1 / overdisp
df_beer_od = tibble::tibble(
  X = rnbinom(samplesize, size = .n, prob = .p)
)
plot of chunk beer-overdispersion plot of chunk stan-beer-od-ppc

ベイズ推定まとめ

  • 条件付き確率 $\Pr(B \mid A)$ の理解が大事。
    • 事後分布 $\propto$ 尤度 ⨉ 事前分布
    • 確信度合いをデータで更新していく。
  • 推定結果は分布そのもの。
    • そこから点推定も区間推定も可能。
  • 解析的に解けない問題は計算機に乱数を振らせて解く。
    • MCMCサンプル $\sim$ 解きにくい事後分布
    • 理論・技術の進歩が目覚ましい。

回帰分析ふりかえり

より柔軟にモデルを記述できるようになった。計算方法も変化。

久保さん https://kuboweb.github.io/-kubo/ce/LinksGlm.html

全体まとめ

  • 統計とは、データをうまくまとめ、それに基づいて推論するための手法。
  • モデルには理解志向応用志向があり、統計モデルは前者寄り。
    • どちらも多少は分かった上で使い分けたい。
    • どっちにしろ真の正しい何かではない。
  • 確率分布とその背後にある確率過程の理解が重要。
    • 乱数生成→作図を繰り返してイメージを掴もう。
    • MCMCサンプリングも事後分布からの乱数生成。
  • 本講義で「統計モデリングを完全に理解した」とは言えない。
    • 理論も実践もほとんど説明していない。
    • 本を読む準備ができた、くらいの気持ち?

参考文献

目次に戻る