Playground 8:観察データ因果推論の実験室

計量経済学II(ブラウザ上でRが動きます)

作者

Kei Ikegami

重要このページの使い方
  • このページのRコードは、あなたのブラウザの中で動いている(WebAssembly + webR)。インストールは一切不要。
  • 初回だけ、ページ読み込みに30秒〜1分かかる(R本体とパッケージのダウンロード)。今回は固定効果回帰のために fixest も読み込むぶん、いつもより少しだけ長い。気長に待ってほしい。
  • 各セルのコードは自由に書き換えて「Run Code」で実行できる。何をどう壊しても誰にも迷惑はかからない。おかしくなったらページを再読み込みすれば元に戻る。
  • 元ネタは講義ノート(lecture8.html)。ここでは、観察データの識別戦略が「どんなときに、どれくらい壊れるか」を、数値をいじって体感することに集中する。

実験1:平行トレンド違反メーター — 見えない違反はどれだけ効くか

DiDの生命線は並行トレンド仮定だが、これは反実仮想についての仮定なので直接検証できない。この実験では神様の立場に立ち、処置群だけに乗る余分なトレンドの傾きを自分で決める。処置群ダミー \(D_i\)、処置後ダミー \(P_t\) として、DGPは次の形である。

\[ y_{it} = \mu_i + \lambda_t + \tau \cdot D_i P_t + s \cdot D_i t + \varepsilon_{it} \]

\(s\)(= trend_gap)がゼロなら並行トレンドが成立し、DiDは期待値で \(\tau\) を捉える。\(s \neq 0\) のとき、DiDの期待値は \(\tau + s \times (\bar{t}_{\mathrm{post}} - \bar{t}_{\mathrm{pre}})\) にズレる。下の設定は前半8期・後半8期なので、バイアスはちょうど \(s\) の8倍だ。図は処置群と対照群の平均の差を処置1期前で0に揃えたもので、素朴なevent studyに相当する。処置前の点が横一線に見えるか、目を凝らしてほしい。

ノートやってみよう
  • trend_gap <- 0.005 にしてみよう。図のプレトレンドはほぼ完全にフラットに見えるはずだ。それでも表の bias / true (%) は何%残るか。
  • trend_gap は0.02のまま、tau_true <- 0.1(もともと効果が小さい施策)に変えてみよう。バイアスは真値の何倍になるか。効果が小さい施策ほど、同じ違反が致命傷になる。
  • 「プレトレンドがフラットに見える=並行トレンド成立」と言えないのはなぜか。この装置で、違反が図では見えにくくても推定には無視できない偏りが残る例を作り、言葉で説明してみよう。

実験2:staggered adoptionと符号反転 — 静的TWFEが壊れる瞬間

講義ノートのRシミュ2を、いじれる形に組み直した。導入時期は県ごとにバラバラ(staggered)で、処置効果は導入からの経過期間 \(t - a_i\) とともに線形に成長する。

\[ \tau_{it} = \theta_i \cdot (t - a_i) \quad (t \ge a_i) \]

成長率 \(\theta_i\) はコホートで異なり、最も早く導入した県では growth_early、最も遅い県では growth_late(間は線形補間)とする。真のATTがはっきりプラスでも、静的TWFEは「すでに処置されて効果が成長し続けている県」を対照群に使う禁じられた比較のせいで、推定値が縮み、符号ごと裏返ることがある。表の3つの数字と、event studyの図を見比べよう。

ノートやってみよう
  • growth_late <- 0.15growth_early と同じ値)にして、コホート間の異質性を消してみよう。符号反転は消えるか。消えたとして、静的TWFEは真のATTまで戻るか、それともゼロ近くまで縮んだままか。
  • 次にtrue_effect <- tau_const * treatedと書き換え、効果をコホート間でも経過期間間でも一定にしてみよう。このとき静的TWFEは真値まで戻るか。
  • growth_early を0.05から0.30まで動かして、真のATTと静的TWFEの乖離がどう広がるか見てみよう。sunabの推定は各設定で真値にどの程度近いか。
  • Wald検定がp値の大きさだけで「並行トレンドが成り立つ」と証明できないのはなぜか。小さな違反への検出力を考えよう。
  • なぜ「すでに処置されて効果が成長し続けている県」を対照群に使うと、推定値が下に引っ張られるのか。event studyの図のどの部分が、その「動き続けている対照群」に当たるかを考えてみよう。

実験3:RDDのバンド幅トレードオフ — バイアスと分散の綱引き

会員ランクのような閾値をイメージして、走行変数 \(x\) を「閾値からの距離」に基準化したRDDを組む。真の関数は \(f(x) = 1 + 1.2 x + c x^3\)\(c\) = curvature)、閾値でのジャンプ(真の効果)は1.0である。バンド幅 \(h\) の窓の中だけでlocal linear回帰(lm)を走らせてジャンプを推定する。\(h\) が小さいと使えるデータが減ってSEが膨らみ、\(h\) が大きいと曲がった関数を直線で無理やり近似するためバイアスが乗る。1枚目の図は窓(薄い青)と当てはめ、2枚目の図は \(h\) を端から端まで動かしたときの推定値と95%信頼区間である。

ノートやってみよう
  • h <- 0.1h <- 1.0 で表の std. errorbias を見比べよう。h <- 1.0 のとき、推定値の符号はどうなっているか。
  • curvature <- 0(真の関数が直線)にすると、大きな h でもバイアスがほぼ消えることを確認しよう。最適なバンド幅が「真の関数の曲がり具合」に依存することがわかる。
  • 実務では真の関数形も真の効果も見えない。rdrobust のようなデータ駆動のバンド幅選択は、2枚目の図のどんな情報をデータから推定して \(h\) を決めようとしているのだろうか。

次に読むもの

  • 講義ノート本体:lecture8.html(activity bias、Goodman-Bacon分解、sunabの実装、bunchingの完全版)
  • coding課題:assignment8.qmd(今回の実験2の設計を店舗・エリアの文脈に置き換え、静的TWFEとsunabの違いをゼロから自分で実装する)