渋谷駅前で働くデータサイエンティストのブログ

元祖「六本木で働くデータサイエンティスト」です / 道玄坂→銀座→東京→六本木→渋谷駅前

『RとStanではじめるベイズ統計モデリングによるデータ分析入門』は「みどりぼん」に取って替わる次世代の統計モデリング+ベイジアン入門書

f:id:TJO:20190725154058p:plain

ここ2ヶ月ぐらいに渡って多くの方々からご著書をご恵贈たまわっているのですが、そのうちの一冊がこちら。かつて計量時系列分析を学んでいた頃に僕も大変お世話になった、Logics of Blueブログの馬場さんの手による『RとStanではじめるベイズ統計モデリングによるデータ分析入門』です。

以前はベイズ統計モデリングの入門書というと「みどりぼん」こと『データ解析のための統計モデリング入門――一般化線形モデル・階層ベイズモデル・MCMC (確率と情報の科学)』一択でしたが、皆さんもご存知のように既にメンテされていないWinBUGSを使っているなどout-of-dateな要素が多く、近年はこれに替わる良書はないものかといつも頭を悩ませていました。今回の馬場さんのご著書は、まさにこれに取って替わる現時点でベストの一冊ではないかと個人的には考えています。


ということで、いつも通り本書全体の構成を一通り紹介した上で注目ポイントを挙げていこうと思います。そしてこれまたいつもながらの話ですが、僕自身の知識不足などにより誤読している部分があるかもしれませんので、お気付きの方はどしどしご指摘くださいm(_ _)m

全体の構成


そもそも全体タイトルに「統計モデリングによるデータ分析入門」というフレーズが入っていることからも分かるように、本書は純粋に統計モデリングに基づくデータ分析の入門書としての側面もあります。その点を踏まえながらご紹介していきます。

1部 【理論編】ベイズ統計モデリングの基本

1 はじめよう! ベイズ統計モデリング
2 統計学の基本
3 確率の基本
4 確率分布の基本
5 統計モデルの基本
6 ベイズ推論の基本
7 MCMCの基本

ここでは最初の章ということで、ベイズというか統計モデリングそのものの基本について触れられています。出来るだけシンプルに説明するという方針に沿って、全ての基礎項目が極めてシンプルかつコンパクトにまとめられています。個人的にはベイズの定理の説明があくまでもベイズ更新のためのものとして書かれているところが好みだったりします。MCMCの説明も必要最低限かつ十分にまとめられていて、初学者でもある程度は読みやすいと思います。


またこれは他の教科書でも勿論同じように表記しているものもありますが、統計モデル自体の定義の仕方をStanの構文に合わせることをかなり意識しているようにも見えます。例えば線形単回帰モデルを
 \mu_i = \beta_0 + \beta_1 \cdot x_i
 Y_i = Normal (\mu_i, \sigma^2)
と書いていますが、Stanならmodelブロックで完全にこの通りにコーディングすることで線形単回帰モデルを表現することが出来ます。

model {
  for (i in 1:N) {
    // mu[i] = b0 + b1 * x[i]
    Y[i] ~ normal(b0 + b1 * x[i], sigma);
  }
}

これを例えばWikipedia日本語版の記事のような伝統的表記で書くと、直感的には分かりやすくなりますがStanコードで書く時どうするんだっけ?と初学者なら迷ってしまうかもしれません。そういうところまで考慮されているところに本書の特徴があると思います。

2部 【基礎編】RとStanによるデータ分析

1 Rの基本
2 データの要約
3 ggplot2によるデータの可視化
4 Stanの基本
5 MCMCの結果の評価
6 Stanコーディングの詳細

いよいよここからタイトルにある通り、RとStanの使い方に関する話題が展開されていきます。2.2節では記述統計量に関する説明が一通りなされていて、統計学の初学者でもある程度必要な概念を学ぶことが出来ます(ただしここは1部に回しても良かったかも)。2.4-6節では現代的なStanの使い方の初歩が網羅されていて分かりやすいです。ちなみに僕は{bayesplot}を全く使ったことがなかったので、本書を読んで大変参考になりました(汗)。ついでに{ggplot2}の使い方もサラリとながら書かれているので、部分的とはいえ現代的なRの使い方もここで相応に学べると思います。

3部 【実践編】一般化線形モデル

1 一般化線形モデルの基本
2 単回帰モデル
3 モデルを用いた予測
4 デザイン行列を用いた一般化線形モデルの推定
5 brmsの使い方
6 ダミー変数と分散分析モデル
7 正規線形モデル
8 ポアソン回帰モデル
9 ロジスティック回帰モデル
10 交互作用

概してベイジアンが活きるのはGLMよりさらに複雑化したモデルなのですが、その前段としてもGLMそのものについて学ぶのは重要です。ここではGLMというか線形回帰モデルから出発して、ポアソン回帰・ロジスティック回帰とステップを踏んで各種モデリングについての解説がなされています。


ちなみに長らくStanのアップデートに付いていけていなかった身としては、実は本書で初めて{brms}パッケージの存在を知りました。

simple_lm_brm_3 <- brm(
  formula = sales ~ temperature,
  family  = gaussian(),
  data = file_beer_sales_2,
  seed = 1,
  prior = c(set_prior("", class = "Intercept"),
                  set_prior("", class = "sigma"))
)

と書くだけで事前分布を指定した回帰モデルが計算できるとか、こんなに便利なものを何故今まで知らなかったんだろう&catch upしてこなくてごめんなさいごめんなさいごめんなさいという感じです(泣)。実は色々な都合があってStanをpre-compileしたローカルパッケージを作ったことは何度かあるんですが、これならその手間もかからなくて最高ですね。ちなみに本書では{brms}を使った場合でも後にStanでの実際の実装コード例が載せられており、初学者にも親切な説明になっていると思います。

4部 【応用編】一般化線形混合モデル

1 階層ベイズモデルと一般化線形混合モデルの基本
2 ランダム切片モデル
3 ランダム係数モデル

ベイジアンが最も活きるGLMM以降の話題がようやくここで出てきます。変量効果を含むモデルは一般に解析的に解こうとすると結構しんどいものが多く、得てしてどの言語でも特殊なソルバを使うケースがままあるのですが、これもベイジアンMCMCサンプリングすることで割と容易かつ柔軟にモデリングしてパラメータの推定値を得ることができます*1


ちなみにこれまた僕には驚きだったんですが、ただのGLMMであればこれまた{brms}で対応できるんですね。

glmm_pois_brms_keisu <- brm(
  formula = fish_num ~ temperature + (temperature || human),
  family = poisson(),
  data = fish_num_climate_4,
  seed = 1,
  iter = 6000,
  warmup = 5000,
  control = list(adapt_delta = 0.97, max_treedepth = 15)
)

というように{lme4}チックなformulaの書き方でGLMMを表現できるらしいので、その程度ならStanコードを書く必要はないようで、実際にこの章ではStanコードによる実装例は出てきません。が、個人的にはGLMMのStanコードも載せてもらえたら初学者には勉強にもなって良かったのではないかなと思いました*2

5部 【応用編】状態空間モデル

1 時系列分析と状態空間モデルの基本
2 ローカルレベルモデル
3 状態空間モデルによる予測と補間
4 時変係数モデル
5 トレンドの構造
6 周期性のモデル化
7 自己回帰モデルとその周辺
8 動的一般化線形モデル:二項分布を仮定した例
9 動的一般化線形モデル:ポアソン分布を仮定した例

そして最後の章は、馬場さんお得意の時系列と状態空間モデルの話題です。現実問題として、実務でベイジアンが最も活きるのは間違いなく非線形時系列データ分析なので、ここが手厚く取り上げられているのはある意味自然な流れだとも言えるでしょう。


僕は怠慢なのでベタッと動的線形モデルを書いてしまっておしまいにすることが多いのですが、状態空間モデルなのできちんと状態方程式と観測方程式に分けたmodelブロックの書き方が本書のこの章ではなされています。

model {
  // 状態方程式に従い、状態が遷移する
  for (i in 2:T) {
    mu[i] ~ normal(mu[i - 1], s_w);
  }
  // 観測方程式に従い、観測値が得られる
  for (i in 1:T) {
    y[i] ~ normal(mu[i], s_v);
  }
}

ごめんなさい、いつもこの2ループ書くのが面倒で状態空間モデルにしてませんorz ということで、そんな怠慢な僕にもゼロから状態空間モデルを教えてくれる素晴らしい章です。当然ながら上記のような単純なローカルレベルモデルだけではなく、時変係数モデル*3、平滑化(二階差分)トレンドモデル、ローカル線形トレンドモデル、季節調整、自己回帰モデル、さらには動的一般化線形モデルとして二項分布及びポアソン分布を仮定したものまで取り上げられています。個人的な感想としては、これだけあればもうお腹いっぱいという気もします。


ちなみに、馬場さんご自身の手による状態空間モデル+ベイジアンの本が既にあります。

時系列分析と状態空間モデルの基礎: RとStanで学ぶ理論と実装

時系列分析と状態空間モデルの基礎: RとStanで学ぶ理論と実装

  • 作者:馬場 真哉
  • 出版社/メーカー: プレアデス出版
  • 発売日: 2018/02/14
  • メディア: 単行本
この章の内容にしか興味がないという方は、むしろこちらの本を読まれた方が良いかもしれません。ARIMAやGARCHと言った「沖本本」でも取り上げられているモデルについても解説されているので、時系列だけ学びたいという場合はいきなりそちらから始めても良さそうです。


注目すべきポイント


これまたいつも通りですが、全体構成のところで紹介したポイントとは別に個人的に注目に値すると思ったポイントを個別に挙げていこうと思います。

「何を本書では扱わないか」が明記されている

これは1.6節「本書で説明しないこと」にも明記されていることですが、

  • 頻度論的な統計学の基礎事項の説明
  • 最尤法など頻度論に基づくモデリングの話題
  • 自然な共役事前分布を用いて解析的に解を導出する方法
  • 情報量規準によるモデル選択

については本書では触れられていません。その意図として「読者の混乱を招き説明のシンプルさを損なうため」という趣旨のことが書かれています。これには僕も大いに賛成です。概して、統計学に関するテキストブックの多くはともすると原理主義的で、特に実務家の実践の現場においては殆ど意識されない(不要だとは言っていない)事項について非常に仔細に記述しているものが多く、初学者泣かせだったりします。そういう混乱を避けてシンプルであることに徹するという姿勢に、僕は好感を持ちました。


1.6節の最後には、

既存の頻度主義的な分析手法を批判することなく、ベイズ統計モデリングを用いるべき理由を説明することは簡単です。ベイズ統計モデリングは、定型的でない、自由な分析を可能にしてくれたのですから。
(太字ママ)

と書かれており、本書全体に一貫するポリシーを感じさせます。その「自由さ」こそがベイズ統計モデリングの醍醐味であるということを踏まえた上で本書を読めば、より確かな学びがあるはずだと言えるでしょう。

可能な限りStanコーディングの敷居を下げる工夫がなされている

先述したように、従来のStan本各種とは異なって{brms}をかなり多用しているのが目新しい点です。確かに、C++ベースのStanコードを直接書けた方が何かと痒いところに手が届くのは事実なんですが、初学者であれば(そして決まった形のモデリングを繰り返す実務家であれば)ある程度簡単にポチポチするだけで出来た方が楽なのは言うまでもありません。


そういう意味では、モデリングのみならずgenerated quantitiesブロックを書かなくても予測までやってくれる{brms}を使いこなせた方が省力化にもなりますし、そもそも学習する上での敷居も下がるわけで、良い試みだなと思いました。一方できちんと{brms}での実行例だけでなくStanコードによる実装例も示しているところが教育的配慮に満ちていて、ここもプラスポイントです。個人的には{brms}でGLMMまで組めるというのは、素晴らしいの一語です。


個人的な感想など


ようやくR + Stanの統計モデリングに特化した入門書が現れたということで、これまで愛されてきた「みどりぼん」もついにお役御免かもしれません(久保先生ごめんなさい)。特に本書は非常に基礎的なパートまで含めて網羅的に書かれているので、純粋に統計分析「しか」しない*4アナリストのような立場の人にとっては、統計学そのものの教科書として用いても差し支えないくらい完成度の高い一冊だと思います。


ただし、言い方を変えると「全てをベイジアンで扱う」本なので初学者であればそこだけは気をつけた方が良いかもしれません。例えば、正規線形モデルは普通はOLSで一瞬で解いてしまうものであって、特に変量効果などを伴わない限りはMCMCベイズ的にやるものではありません。ある程度周辺の統計学の教科書の内容も踏まえつつ、その上である意味「現代統計学の申し子」とも言えるベイジアンに入門するための本、という位置付けで読む方が良いのかなと。


あとは、これは単純に個人的に気になったというだけのポイントなんですが、線形代数というか行列計算の導入をするポイントがGLMの話題に入った後ということで、ちょっと不自然かなと思いました。もっともOLSで線形回帰するという古典的な入り方が本書だと出来ない(そういう流れになっていないので)ので、これは致し方ないことかもしれません。


ともあれ、個人的にはこれで「みどりぼん」に代わって初学者にお薦めできる統計モデリングの良書が見つかったということで、今後はどんどん初学者の人たちに薦めていこうと思います。次回の推薦書籍リストには必ず本書を入れるつもりです。

*1:ただしソルバでバシッと一発でパラメータ推定できた方がStanコードゴリゴリ書くより楽なのは言うまでもない

*2:ただし物凄いゲテモノコードが出来上がるのであまりオススメできない(コンパイラが怒って大量のwarningsを吐きまくるので)

*3:これはベタ書きの動的線形モデルでも書ける

*4:機械学習は特にやらない