Playground 3:代替性と内生性の実験室

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

作者

Kei Ikegami

重要このページの使い方
  • このページのRコードは、あなたのブラウザの中で動いている(WebAssembly + webR)。インストールは一切不要。
  • 初回だけ、ページ読み込みに30秒〜1分かかる(R本体とパッケージのダウンロード)。2回目以降はキャッシュで速くなる。
  • 各セルのコードは自由に書き換えて「Run Code」で実行できる。何をどう壊しても誰にも迷惑はかからない。おかしくなったらページを再読み込みすれば元に戻る。
  • 元ネタは講義ノート(lecture3.html)。ここでは「数値をいじって挙動を体感する」ことに集中する。

実験1:ρをいじってIIAを壊す

logitモデルでは、ある財が値上げされたとき、流出した需要は残りの財へ「シェアの比率」だけで機械的に配分される(IIA)。似ているかどうかは一切関係ない。nested logitは財をネスト(グループ)に分け、ネスティング・パラメータ \(\rho\) を1つ足すだけで「似た財ほど強く競合する」を表現する。\(\lambda=1-\rho\) がdissimilarity parameterで、標準的な正規化では同一ネスト内の誤差相関は \(1-\lambda^2\)。したがって \(\rho\) は相関そのものではない。選択確率は「どのネストを選ぶか」と「ネスト内でどれを選ぶか」に分解できる。

\[ s_{jt} = \bar{s}_{j|g,t} \times s_{gt} \]

ここでは講義ノートと同じ4財市場(ネストA = 財1・2、ネストB = 財3・4)で、財3を20%値上げしたときの流出先をplain logitと見比べる。\(\rho\) を動かして、同ネストの財4への流出がどう変わるかを見よう。

ノートやってみよう
  • rho <- 0 にすると、2色の棒が4財すべてで完全に一致する。nested logitがplain logit(IIAの世界)に戻ることを確かめよう。
  • rho <- 0.9 にすると、流出先はほぼ財4に独占され、別ネストの財1・2の棒はほとんど消える。price_up <- 1.50 に上げても「流出量」は変わるが「行き先の偏り方」を決めているのは \(\rho\) だと確認しよう。
  • 考えてみよう:ネストの割り方を nests4 <- list(c(1, 3), c(2, 4)) に変えると(分析者がネストを間違えた世界)、どの財への代替が過大・過小に描かれるか。ネスト構造は推定される前に「分析者が置く仮定」だ、という点の怖さを考えよう。

実験2:Berry反転を目で見る

市場シェアが正確にわかっているなら、logitのシェア式は代数的に反転できて、平均効用 \(\delta\) がそのまま取り出せる。

\[ \ln s_{jt} - \ln s_{0t} = \delta_{jt} \]

ただし現実のシェアは「M人の購買を集計した割合」なので、Mが有限である限り測定ノイズが乗る。特にシェアの小さい財は、logの中に入るカウントが小さく、復元した \(\delta\) が大きく暴れる。市場サイズMを動かして、この不安定さを体感しよう(橙の点が真の \(\delta\)、箱が200回の観測から復元した \(\delta\) の分布)。

ノートやってみよう
  • M <- 100 にしてみよう。財4(シェア約1%)は「1人も買わない市場」が続出して \(\delta\) が計算不能(log 0)になり、箱も歪む。逆に M <- 100000 でどこまで箱が潰れるか見よう。
  • delta_true の4番目を -5 にする(シェア0.1%以下)。この財の \(\delta\) を安定して復元するにはMがどの桁まで必要か、感覚を掴もう。
  • 考えてみよう:財1と財4で箱の縦幅がまるで違うのはなぜか。カウントの相対誤差はおおよそ「1/√(期待カウント)」で決まる、という観点から説明してみよう。シェアの小さい財の扱いは、この先BLP系の実証で必ず悩まされる論点である。

実験3:価格内生性の強さとIVによる回収

Berry反転で得た回帰式の右辺には、観測されない需要ショック \(\xi_{jt}\) が残っている。

\[ \ln s_{jt} - \ln s_{0t} = \beta x_{jt} - \alpha p_{jt} + \xi_{jt} \]

企業は人気(高い \(\xi\))を知って強気の値付けをするので価格と \(\xi\) は正に相関し、OLSは \(\alpha\) を過小評価する。ここではコストシフター \(w\) を操作変数に、2SLSを lm() だけで手実装する(第1段階:lm(price ~ x + w)、第2段階:その予測値 price_hatlm(y ~ price_hat + x))。各反復で50市場×4財のデータを作り直し、真値 \(\alpha = 2\) の回収ぶりを比較する。1つ注意:手実装の第2段階が返すSEは第1段階の推定誤差を無視しているため正しくない。だからこの表ではSEではなく反復間のばらつき(sd)で精度を見る(実務では fixest などIV対応パッケージのSEを使うこと)。

ノートやってみよう
  • kappa <- 0(内生性ゼロ)にすると、OLSも2SLSも真値2.0を当てる。sdを見比べると2SLSの方がわずかに大きいはずだ(IVは価格変動のうち \(w\) で説明できる部分しか使わないため)。内生性がないのにIVを使う「損」を確認しよう。
  • gamma_w <- 0.05(弱い操作変数)にしてみよう。ここは除外IVが1本なので、wのfirst-stage t値の二乗がpartial Fになる。それが小さくなると2SLSのmeanもsdも盛大に暴れ出す。「F>10」は古典的な大まかな経験則にすぎないが、弱い関連性がなぜ危険かを体感できる。
  • 考えてみよう:kappa を3まで上げるとOLSのバイアスは深刻になるのに、2SLSはなぜ平気なのか。make_market_data の中で \(w\) がどう生成されているか(\(\xi\) と無関係に引かれている)に注目して説明してみよう。

実験4:弾力性への波及 — OLSかIVかで値上げの判断が変わる

\(\alpha\) の推定を誤ると、そこから計算する自己価格弾力性 \(\eta_{jj} = -\alpha p_j (1 - s_j)\) も全部歪む。収入は \(R = p \times s\) なので、小さな値上げ率に対する収入の変化率はおよそ「(1 + 弾力性) × 値上げ率」になる。つまり弾力性が \(-1\) より浅ければ「値上げで収入増」、\(-1\) より深ければ「値上げで収入減」と判断が割れる。ここではDGPの構造は実験3と同じまま、弾力性がちょうど \(-1\) をまたぐ帯に来るよう価格係数のスケールだけ小さくして、OLSとIVで意思決定がどう変わるかを1枚の表にする(弾力性は市場平均の価格・シェアで評価。SEを載せない理由は実験3で述べた通り)。

ノートやってみよう
  • kappa <- 0 にすると3行の弾力性はほぼ揃い、decisionも一致することを確認しよう。意思決定を割っていたのは内生性だとわかる。
  • alpha_true <- 0.15(もともと非弾力的な市場)にすると、バイアス自体は残るのにdecisionは3行とも「raise」で一致する。バイアスが意思決定に効くかどうかは、真の弾力性が \(-1\) にどれだけ近いか次第だ。
  • 考えてみよう:kappa を大きくしていくと、OLSの弾力性がプラス(値上げすると売れる?!)になることがある。第1回イントロのデモと同じ現象だ。人気(\(\xi\))と価格が同時に動くとき、価格とシェアの散布図の上で何が起きているのか説明してみよう。

次に読むもの

  • 講義ノート本体:lecture3.html(IIA・nested logit・Berry反転・2SLSの導出とシミュレーションの完全版)
  • coding課題:assignment3.qmd(炭酸飲料市場を題材に、nested logitの市場レベル需要推定と価格内生性への対処をゼロから自分で実装する)