糞糞糞ネット弁慶

読んだ論文についてメモを書きます.趣味の話は http://repose.hatenablog.com

握手会が延期になったので「効果検証入門」を読んで Python で (ほぼ) 実装した

ゴールデンウィークの握手会が延期になり気力が完全に尽きてしまい(そもそも2020年のほとんどのイベントが延期または中止になっているわけですが),同じく握手会が延期になった友人と「アイドルとシロクマのことを考えないでください状態になっていてつらい」「何か没頭できる事は無いの」という話になった結果,「効果検証入門」を読んだ.

「どうせ読むのならば短期集中で」ということで,一日目午後に1章と2章,二日目午前に3章,午後に4章,三日目午前に5章のペースで Zoom で交互に節単位を音読しながら進めた.2020年,30歳を過ぎて音読.

感想

数学力が低い自分でわかった気分になれる,非常に参考になった.明日からでも試したい.随所に「実際のビジネスの現場ではこんな滅茶苦茶なことが行われている」という記述が出てくるので考えさせられてしまう.「正しい効果を知るインセンティブとは何か?」に最後の章で触れていたのも良かった.耳が痛い.

脱落変数バイアスの概念はとても面白かったし,Difference-in-Differences はシンプルながら (その分平行トレンド仮定が強力ですが) 試したいと思えた.反対に causalimpact についてはそこまでモチベーションが湧かなかった.十分に学習された予測器にもとづいて何かをする,というのがどうにも受け入れにくい.回帰不連続デザインは話としては面白そうに見えたものの,「単に回帰をする」という話になっていて肩透かしを感じた.

そもそもが本書で紹介されているテクニックはどれも比較的シンプルでありながら多くの仮定のもとに成り立っており, AUC や Prec/Recall のようになんらかの定量的な「確からしさ」が出るわけでなく,セレクションバイアスは正負どちらにも発生するため,非常に扱いが難しいように思う.「今回の施策による効果量は『〜〜〜』という仮定が成立すると考えて計算していますが,『〜〜〜』というバイアスが排除しきれていない事は念頭に置かねばなりません.ですが,何も考えずに推定するよりは確からしいと考えられます」といったように,多くの留保にもとづいて説明するのが因果推論を用いた分析において取るべき態度なのでしょう.

いくつかのトピック,たとえば Conditional Independence Assumption や Post treatment bias や Bayesian Structual Time Series Model や合成コントロールについてはより詳しく知りたくなりました.また,因果ダイヤグラムやバックドア基準という単語も本文には登場しなかったので次はそのあたりを知っていきたい.

次は星野崇宏「調査観察データの統計科学」Pearl「入門 統計的因果推論」岩波データサイエンス Vol.3宮川雅巳「統計的因果推論」を読むべきなのでしょうが全部会社に置いたままです.

Python による実装

ybenjo/cibook_by_python にアップロードしました.注意点を書きます.

  • タイトルに「ほぼ」と入れたのは以下の実装を行っていないため
    • 各種図表の描画
    • 4章の causalimpact を用いた実験
    • 5章の Nonparametric RDD の実験
  • セレクションバイアスを発生させたメールデータの値が本文と一致せず,かつ,乱数の seed によっては本来の値とは逆のセレクションバイアスが発生してしまう
  • RData の読み込みは ofajardo/pyreadr が良かった
  • 3.4.4 の傾向スコアの推定において本文では re74re75 の二乗を共変量に追加しているが,実験したところ傾向スコアが著しく悪化したために除外した
  • 傾向スコアマッチングは greedy にやってしまった
  • pandas の使い方が全く分からなくて途中で挫折した. groupby() して sum() した結果の加工が本当に分かっていない
  • R と違って欠損のある行を明示的に除外している

誤植・不明点

他の人も指摘しているかも知れないけれどネタバレが怖くて他人のエントリを読んでいない.自分の勘違いも多く含んでいると思う.

  • 著者の実装は R を用いているわけですが,目的変数または説明変数に NA を含んだ場合,その行を除外して推定を行うのがデフォルトの挙動だと思うが,欠損値のある行を消してしまうのは新たなバイアスを産むのではないか
  • p31 recencyが3より小さい場合6より小さい場合 の誤り
  • p55 \beta_1 - \alpha_1 = \gamma_1 \beta_1\alpha_1 - \beta_1 = \gamma_1 \beta_1 の誤り
    • 関連して p57 の \beta_1 - \alpha_1 はすべて \alpha_1 - \beta_1
  • p87 相関が強いと分子は0に近づき相関が強いと分母は0に近づき の誤り
  • p108 共変量のバランス における 平均の差をその標準偏差で割ったその がよくわからない.検索したところこの値は Cohen の d と呼ばれているらしい
    • 自分の実装では一部の共変量がバランスしないままだった.そういうこともあると思いたい
  • p141 よって,この分析の結果による効果量はそれらの差分をとって-1,554若しくは-43%ということになり は何に対して -43% なのか,分母は何なのかが明示されていないために分からない
  • p142 1853年の〜 という記述は全て 1854年
  • p151 Cigar データセットの導入が面倒だったので github の著者レポジトリで配布して欲しいと思いましたがライセンスが GPL2 だから無理なのでしょうか
    • なぜか自分が構築したさまざまな R の環境では Ecdat パッケージのインストールに失敗し続けた
    • 最終的に RStudio Cloud 上でデータを抽出
  • p156 著者実装 ch4_did.Rcausalimpactselectdplyr::名前空間を指定しないとエラーが出る
  • p176 nonparametric RDD の説明がされておらず,このモデルは一体何を行っているのかが全くわからない
  • p180 5.4.1
    • 二つの施策を行う状況はそもそも RDD と関係無いのでは
    • では施策以外で非連続になる状況は何か