Playground 6:コンジョイント分析の実験室
計量経済学II(ブラウザ上でRが動きます)
- このページのRコードは、あなたのブラウザの中で動いている(WebAssembly + webR)。インストールは一切不要。
- 初回だけ、ページ読み込みに30秒〜1分かかる(R本体とパッケージのダウンロード)。2回目以降はキャッシュで速くなる。
- 各セルのコードは自由に書き換えて「Run Code」で実行できる。何をどう壊しても誰にも迷惑はかからない。おかしくなったらページを再読み込みすれば元に戻る。
- 元ネタは講義ノート(
lecture6.html)。ここでは「数値をいじって挙動を体感する」ことに集中する。 - 講義ノートとの違いが1つある。ブラウザ版では
fixestが使えないので、AMCEの回帰はlm()で書き、表示されるのは通常のSEである。正しくは回答者クラスターSEを使うべきで(ノート参照)、そのズレがどれくらい危険かは実験1で自分の目で確かめる。
実験1:調査設計と精度 — 回答者を増やすか、タスクを増やすか
回答者を1人増やすのも、1人あたりのタスクを1問増やすのも、調査コストがかかる。同じ予算ならどちらに使うべきか。道具箱には講義ノートと同じワイヤレスイヤホンCBC(価格8/12/16千円、バッテリー、ノイキャン、ブランド)のシミュレータが入っていて、効用は第4回流のmixed logitである。
\[ u_{ijt} = \beta_{1i}\,\mathrm{battery}_{jt} + \beta_{2i}\,\mathrm{nc}_{jt} + \beta_{3i}\,\mathrm{brand}_{jt} - \alpha_i\,\mathrm{price}_{jt} + \varepsilon_{ijt} \]
同じ人は全タスクで同じ係数 \((\beta_{1i}, \beta_{2i}, \beta_{3i}, \alpha_i)\) を使う。これが回答者内の相関(クラスター構造)の源になる。下のセルは (1) 1回分の調査からAMCEをlm()で推定して真のAMCE(TRUE_AMCE6、道具箱で数値積分して用意済み)と比べ、(2) 同じ設計の調査をn_mc回やり直して、noise_cancelのAMCE推定値の本当のばらつきを測る。講義ノートと同じく「どちらも買わない」のタスクも落とさず、outsideならA・B両方の結果を0として残す。
2つ目の表の読み方。empirical_sdが推定値の本当のばらつき、mean_se_olsが通常SEの平均である。通常SEが本当のばらつきより小さければ、95%信頼区間が真値を含む割合(coverage_95ci)は0.95を割り込む。同じ人がn_tasks回答える分の「情報の重複」を、通常SEは無視しているからだ。
n_resp <- 200; n_tasks <- 8とn_resp <- 800; n_tasks <- 2を試そう。総観測数は同じ1,600タスクだが、empirical_sdはどちらが小さいか(n_mc <- 200にすると差が安定して見える)。n_tasks <- 1にしてみよう。回答者をまたぐ繰り返し依存は消えるが、同じタスクのA・Bという2行はなお相互依存する。したがって通常SEが完全に正しくなるとは限らない点も確認しよう。- 問い:通常SE(
mean_se_ols)は設計を入れ替えてもほとんど動かないのに、本当のばらつき(empirical_sd)は動く。独立な情報の単位は「タスク」か、それとも「回答者」か。
実験2:ランダム化が内生性を消す
第3回で苦労した内生性の正体はこうだった。観測されない魅力(人気、評判)が高い商品ほど企業は高い価格をつけるので、素朴なOLSは価格反応を過小評価する。このセルでは、回答者には見えるがデータには記録されない「人気度」popを効用に入れた上で、価格の付け方だけが違う2つの世界を比べる。randomized(conjointの設計:価格はコンピュータの乱数)と correlated(市場風:人気度が高いプロファイルほど高価格)である。分析者が走らせる回帰はどちらも同じで、popは入れられない(観測できないのだから)。見やすさのため、ここでは価格を千円単位の連続変数として係数1本にまとめる。
cor_price_popを見ると、randomizedでは価格と人気度の相関がほぼ0、correlatedでははっきり正になっている。回帰は同じなのに、randomizedの推定値だけが真の傾き(破線)を捉え、correlatedはゼロ方向(設定によってはプラス側)に大きくずれる。「値上げしても選ばれ方は変わらない」という危険な結論が出てしまうわけだ。なお、観測されている属性同士が相関するだけなら、その属性を回帰に入れている限り推定は歪まない(効率が落ちるだけ)。歪みは「観測されない」×「効用に効く」×「価格と相関」の3つが揃ったときに生まれる。conjointの強さは、価格を乱数で振ることでこの相関を設計段階で断ち切る点にある。
gamma_pop <- 0にしてみよう。価格と人気度の相関は残っているのに、歪みが消える。内生性は「相関」だけでは起きず、その変数が効用に効いて初めて起きることを確かめよう。k_corr <- 2にすると、価格がほぼ人気度で決まる世界になる。価格係数の符号が逆転して「高いほど選ばれる」ように見えるまで歪むか、確かめよう。- 問い:第3回の市場データでは、この歪みを消すのに操作変数(2SLS)という手間のかかる道具が必要だった。conjointでは何がその役割を果たしているか。
実験3:WTPは分母が壊れると暴れる
WTP(支払意思額)は効用スケールの係数の比である。
\[ \mathrm{WTP}_{\mathrm{nc}} = \frac{\beta_{\mathrm{nc}}}{\alpha} \]
分母の価格係数 \(\alpha\) がゼロに近いと、これは分母が壊れかけの割り算になる。下のセルでは、この実験だけ係数異質性を0にして同質logitを正しく指定し、真のWTPを6(千円)に固定したまま(分子 \(\beta_{\mathrm{nc}}\) も比例して縮めて)、\(\alpha\) の真値だけを0に近づける。したがって、どの世界でも真実は「6,000円」で、Hessianとdelta法を使う基準ケースとして解釈できる。表のt_alphaは価格係数のt値である。
\(\alpha\) が大きい(価格がよく効く)世界ではCIは真値のまわりに素直に収まるが、\(\alpha\) が小さくなるにつれてCIは爆発し、点推定も6からかけ離れた値(符号が逆になることさえある)を出すようになる。分母がゼロに近い比を計算しているのだから当然で、delta法のSEに含まれる \(1/\alpha^2\) の項がそれを正直に教えてくれている。講義ノートの「実務での対処法」も読み返しておこう。
alpha_grid <- c(0.20, 0.15, 0.10, 0.07, 0.05, 0.03, 0.02, 0.01)と細かくして、CIがどのあたりから壊れ始めるかを特定しよう。n_resp <- 1600にしてみよう。データを4倍にするとt_alphaはおよそ2倍になるはずだが、それで「使えるCI」が戻ってくるのはどのalpha_trueまでか。- 問い:表の
t_alphaがいくつを超えたあたりなら、WTPを会議で報告してよさそうか。自分なりの経験則を作ろう(第3回の弱い操作変数の「F > 10」という経験則と、よく似た形をしていないだろうか)。
次に読むもの
- 講義ノート本体:
lecture6.html(AMCEの定義、回答者クラスターSE、delta法の導出の完全版) - coding課題:
assignment6.qmd(フードデリバリーのサブスクプランを題材に、CBC設計からAMCE・WTPまでを自分で実装する)