Lecture 3:代替性と価格内生性
計量経済学II
- logitモデルには IIA(Independence of Irrelevant Alternatives)という強い制約があり、代替のパターンが不自然になることがある。
- nested logit を使うと、財を「似ているもの同士」でグループ化(ネスト)することで、代替性をより柔軟に表現できる。
- 個票があっても価格内生性は残る。Berry (1994) の反転で選択確率から平均効用を取り出すと、未観測の需要ショックに対してIVの条件を使える式になる。
- 価格は未観測の需要ショック(未観測の品質・広告など)と相関しやすい。本講義で扱う典型例のように、他の説明変数を条件づけても両者の共分散が正なら、これを無視した OLS は価格反応を過小評価する(共分散が負ならバイアスの向きも逆になる)。
- コストシフターや競合属性を操作変数として使う 2SLS で、価格内生性に対処できる。
前回とのつながり・今回のゴール
前回は、消費者の効用に Type I 極値分布のショックを加えることで、multinomial logit モデルを導出した。選択確率の閉じた式が書け、最尤法で推定でき、価格弾力性まで計算できる——logit は驚くほど扱いやすい道具だった。ただし前回の最後で少し匂わせたように、この扱いやすさは「誤差項が財を超えて iid である」という強い仮定の代償として得られている。
今回は、その代償の中身を直視するところから始める。具体的には2つの問題を扱う。
1つ目は IIA(Independence of Irrelevant Alternatives) の問題である。logitモデルでは、ある財の価格が変化したときに他の財へ流出する需要が、他の財の「シェアの比率」だけで機械的に決まってしまう。これは「似た財ほど競合として強く反応するはず」という直感と食い違うことが多い。この問題への対処として nested logit を導入し、財をグループ(ネスト)にまとめることで、グループ内の代替をグループ外の代替より強く表現できるようにする。
2つ目は、価格の内生性の問題である。前回までは、価格を含む説明変数はすべて「外生」として扱ってきた。しかし現実の価格は、企業が需要側の情報(消費者に人気がある、広告で話題になっている、といった要因)を知った上でつけている。この情報が分析者には見えない「未観測の需要ショック」だとすると、価格とこの未観測ショックは相関し、OLSによる価格反応の推定はバイアスを持つ。これはまさに第1回のイントロで見せたデモ——「値上げすると売上が増える」——の正体である。今回はこれを操作変数法(2SLS)で解決する。
次回(第4回)は、商品属性への評価や価格感応度そのものを消費者ごとに変える拡張(random coefficient logit)を扱い、そこから合併分析へ進む。今回学ぶ「代替性をどう捉えるか」という問題意識は、次回さらに柔軟な形で引き継がれる。
IIAを直視する:赤バス・青バス問題の現代版
思考実験:バスの色を分けただけで、車から客が移るのか
古典的な「赤バス・青バス問題」は、よく似た選択肢を追加したとき、logitがどこから需要を奪うと予測するかを考える例である(Train (2009), 第3章、p.46)。ここでは、バスのサービスは一切変えず、色だけを分ける思考実験にして、何が不自然なのかをはっきりさせよう。
変更前:車と青バスが50%ずつ
通勤手段は「車」と「青バス」の2つだけで、全員がどちらかを使うとする。この例では「通勤しない」などのoutside optionは別に設けない。車を\(C\)、青バスを\(B\)と書き、それぞれのシェアが50%だとしよう。300人に換算すれば、車が150人、青バスが150人である。
前回のlogit式では、共通の効用部分を\(\delta_C,\delta_B\)とすると、
\[ s_C=\frac{e^{\delta_C}}{e^{\delta_C}+e^{\delta_B}}, \qquad s_B=\frac{e^{\delta_B}}{e^{\delta_C}+e^{\delta_B}}. \]
両者のシェアが等しいので、\(\delta_C=\delta_B\)である。効用の共通定数は選択を変えないため、両方を0に正規化できる。すると、
\[ s_C=s_B=\frac{e^0}{e^0+e^0}=\frac{1}{2}=50\% \]
と、元のシェアを再現できる。
色分け後の直感:バス利用者の中で半分ずつに分かれる
ここで、既存のバスの半分を赤く塗る。運賃・経路・所要時間・総便数・時刻表・輸送力は変えない。利用者は色を気にせず、先に来たバスに乗るものとし、青・赤の便に当たる確率はそれぞれ半分とする。したがって、バス全体の待ち時間や便利さも変わらない。単に、これまで「青バス」と数えていた利用者を、青と赤に分けて数える状況である。
この設定なら、車を使っていた人がバスへ乗り換える理由はない。車のシェアは\(1/2\)、バス全体のシェアも\(1/2\)のままで、バス利用者だけが色ごとに半分ずつに分かれる。赤バスを\(R\)と書くと、
\[ \begin{aligned} s_C&=\frac12=50\%,\\ s_B&=\underbrace{\Pr(\text{バスを利用})}_{1/2} \times\underbrace{\Pr(\text{青}\mid\text{バスを利用})}_{1/2} =\frac14=25\%,\\ s_R&=\Pr(\text{バスを利用})\times\Pr(\text{赤}\mid\text{バスを利用}) =\frac12\times\frac12=\frac14=25\%. \end{aligned} \]
300人に換算すると、車150人、青バス75人、赤バス75人になる。赤バスの75人は、全員が元の青バス利用者である。青バスのシェアは25パーセントポイント減るが、車のシェアは変わらない。
基本logitの予測:3つの選択肢に3分の1ずつ
ところが、青と赤を別々の選択肢として基本logitに入れると、異なる予測が出てくる。色以外の属性が同じで色も効用に影響しないなら、赤バスの共通効用は青バスと同じ\(\delta_R=\delta_B=0\)である。車と青バスの共通効用も元のままとして、3つの選択肢にlogit式を適用すると、
\[ s_C^{\mathrm{logit}}=s_B^{\mathrm{logit}}=s_R^{\mathrm{logit}} =\frac{e^0}{e^0+e^0+e^0}=\frac13\approx33.3\%. \]
バスの名前を2つに分けたことで、分母のバスに対応する項が1つから2つに増えた。バス全体のシェアは、
\[ s_B^{\mathrm{logit}}+s_R^{\mathrm{logit}} =\frac13+\frac13=\frac23\approx66.7\% \]
に増え、車のシェアは50%から約33.3%へ減ってしまう。変更前からのシェア変化を\(\Delta s\)と書けば、
\[ \Delta s_C=\Delta s_B=\frac13-\frac12=-\frac16, \qquad \Delta s_R=\frac13-0=\frac13. \]
つまり、車と青バスがそれぞれ約16.7パーセントポイント減り、赤バスが約33.3パーセントポイント増える。300人に換算すると、車と青バスから50人ずつが赤バスへ移り、車100人、青バス100人、赤バス100人になる。
3つの配分をツリー図で見比べよう。枝の数字は、その分岐における割合を表す。中央の図では、「バス全体の\(1/2\)」に「青・赤それぞれの\(1/2\)」を掛けるので、各色のシェアが\(1/4\)になる。人数はシェアを300人に換算した値である。
この予測が不自然なのは、車と比べたバスの便利さが何も変わっていないのに、色の分類を増やしただけで車からバスへ需要が移ることである。実際に増便して待ち時間が短くなったなら、車からバスへ移る人がいても不思議ではない。しかし、この思考実験ではそのような改善を一切していない。
IIAは「何が変わらない」という制約なのか
この食い違いは、車と青バスのシェアの比を見るとさらに明確になる。logitでは分母が消えるので、赤バスがあってもなくても、
\[ \frac{s_C}{s_B} =\frac{e^{\delta_C}}{e^{\delta_B}} =e^{\delta_C-\delta_B}=1 \]
である。赤バスを追加しても、車と青バスの共通効用が変わらない限り、この比は変わらない。これがIIAである。各選択肢のシェアが変わらないという意味ではなく、2つの選択肢のシェア比が、他の選択肢の追加に左右されないという意味である。
一方、直感的な配分では、車はそのままで青バスだけが赤バスに利用者を分けるため、
\[ \frac{s_C}{s_B}:\quad \underbrace{\frac{1/2}{1/2}}_{\text{色分け前}}=1 \quad\longrightarrow\quad \underbrace{\frac{1/2}{1/4}}_{\text{色分け後}}=2 \]
となる。この比の変化を、基本logitのIIAは許さない。
なぜモデルはそのような予測をするのだろうか。効用を\(u_{ij}=\delta_j+\varepsilon_{ij}\)と書くと、基本logitは青と赤に独立な効用ショック\(\varepsilon_{iB},\varepsilon_{iR}\)を与える。同じ\(\delta\)を設定しても、同じ人にとって青と赤の効用が同じになるわけではない。バスを2種類に分けると、どちらかのショックが大きくなって車の効用を上回る機会が増えるのである。
しかし、色だけが違う完全な代替物なら、同じ人のバスへの好みは青にも赤にも共通するはずである。この極端な例では\(\varepsilon_{iB}=\varepsilon_{iR}\)と考えれば、青と赤の最大効用は元のバスの効用と変わらず、車とバスの選択も変わらない。平均的な属性が同じというだけでは、「同じ人にとって似ている」という関係を基本logitに組み込めないことが問題なのである。後で学ぶnested logitは、似た財のショックに共通性を持たせることで、この制約を緩和する。
缶コーヒー市場に置き換える
これを現代のビジネスの文脈に置き換えてみる。次のような3つの選択肢を考える。
- 財1:コンビニのプライベートブランド缶コーヒーA
- 財2:ほぼ同じ処方・同じ価格帯のプライベートブランド缶コーヒーB(Aとほとんど区別がつかない)
- 財3:全く方向性の違う高級ブランドのスペシャルティコーヒー(価格は財1・2の2倍以上)
財1と財2は消費者から見てほぼ同じもの、財3は全く違う商品カテゴリに近い。ここで財3が値上げされたとき、財1と財2へほぼ均等に客が流れること自体は自然である。この例で確かめたいのは、logitではその配分比が、財1と財2の元のシェア比だけで決まることである。逆に財1が値上げされた場合にも、財2へ特に多く流れる仕組みはなく、財2・財3・outside optionの元のシェア比で配分される。IIAの問題は、値上げされた財と乗り換え先の財がどれだけ似ているかを、シェア比とは別に代替パターンへ反映できないことである。
Rシミュ1:3財logitでのIIAの確認
「元のシェアに比例する」とは、元のシェアが2倍の財は、値上げ後に獲得する需要も2倍になるという意味である。これを、元のシェアが同じ場合と異なる場合を比べて確かめよう。市場規模は固定し、財3の価格以外は値上げ前後で変えない。
例A:財1・財2の元のシェアが30%ずつの場合
まず、財1・2・3とoutside option(何も買わない)のシェアが、それぞれ30%、30%、20%、20%になるようにパラメータを設定する。財1と財2は品質・価格ともに同じとし、財3は品質も価格も高い「高級ブランド」とする。計算を見やすくするための仮想的な数値例であり、実際の市場の推定値ではない。
alpha <- 1.0
beta_j <- c(3 + log(1.5), 3 + log(1.5), 8) # 品質・ブランド評価(x'betaに相当)
price_j <- c(3.0, 3.0, 8.0) # 財1,2は同価格帯、財3は高級ブランドで高価格
logit_shares <- function(beta_j, alpha, price_j) {
delta <- beta_j - alpha * price_j
ev <- exp(delta)
denom <- 1 + sum(ev)
s <- ev / denom
s0 <- 1 / denom
list(s = s, s0 = s0)
}
base <- logit_shares(beta_j, alpha, price_j)この設定では、\(e^{\delta_1}=e^{\delta_2}=1.5\)、\(e^{\delta_3}=1\)であり、outside optionの重みも1なので、分母は\(1+1.5+1.5+1=5\)になる。例えば財1のシェアは\(1.5/5=0.30\)である。
ここで財3の価格だけを10%引き上げ、8から8.8にする。
price_shock <- price_j
price_shock[3] <- price_shock[3] * 1.10
shocked <- logit_shares(beta_j, alpha, price_shock)
share_change <- shocked$s - base$s| 選択肢 | 値上げ前(%) | 値上げ後(%) | 増減幅(ポイント) |
|---|---|---|---|
| 財1(PB-A) | 30 | 33.713 | 3.713 |
| 財2(PB-B) | 30 | 33.713 | 3.713 |
| 財3(高級) | 20 | 10.099 | -9.901 |
| 何も買わない | 20 | 22.475 | 2.475 |
財3から約9.901ポイントの需要が失われ、財1・財2はそれぞれ約3.713ポイント、outside optionは約2.475ポイント増える。財1と財2については、元のシェアの比も、獲得した需要の比も1対1である。
\[ \frac{\text{財1の増加幅}}{\text{財2の増加幅}} =\frac{3.713}{3.713}=1, \qquad \frac{\text{財1の元のシェア}}{\text{財2の元のシェア}} =\frac{30}{30}=1. \]
この例だけでは「同じ商品だから同じだけ増えただけではないか」と思うかもしれない。そこで、元のシェアを変えてみよう。
例B:財1・財2の元のシェアが40%と20%の場合
今度は、財1・財2は味や価格が似ていても、知名度などを含む共通のブランド評価が財1の方で高い場合を考える。例Aから品質・ブランド評価のパラメータを設定し直し、元のシェアを財1が40%、財2が20%にする。財3とoutside optionは20%ずつのままである。この別の市場でも、同じく財3の価格だけを8から8.8に上げる。
beta_unequal <- c(3 + log(2), 3, 8)
base_unequal <- logit_shares(beta_unequal, alpha, price_j)
shocked_unequal <- logit_shares(beta_unequal, alpha, price_shock)
share_change_unequal <- shocked_unequal$s - base_unequal$s| 選択肢 | 値上げ前(%) | 値上げ後(%) | 増減幅(ポイント) |
|---|---|---|---|
| 財1(PB-A) | 40 | 44.951 | 4.951 |
| 財2(PB-B) | 20 | 22.475 | 2.475 |
| 財3(高級) | 20 | 10.099 | -9.901 |
| 何も買わない | 20 | 22.475 | 2.475 |
財1は約4.951ポイント、財2は約2.475ポイント増える。丸める前の数値で比を取ると、元のシェアが2倍の財1は、獲得する需要も正確に2倍である。
gain_ratio <- share_change_unequal[1] / share_change_unequal[2]
baseline_ratio <- base_unequal$s[1] / base_unequal$s[2]
cat("財1/財2の需要獲得比:", round(gain_ratio, 6), "\n")財1/財2の需要獲得比: 2
cat("財1/財2の元のシェア比:", round(baseline_ratio, 6), "\n")財1/財2の元のシェア比: 2
ここでは、増加幅(何ポイント増えたか)と増加率(元のシェアの何%増えたか)を区別することが大切である。増加幅は2倍違うが、増加率は、
\[ \begin{aligned} \text{財1の増加率} &=\frac{44.9506-40}{40}\times100\approx12.3765\%,\\ \text{財2の増加率} &=\frac{22.4753-20}{20}\times100\approx12.3765\% \end{aligned} \]
と同じになる。両方が同じ割合で成長するので、元が2倍なら増える量も2倍になる、というのが「元のシェアに比例する」の意味である。
財3が失った約9.901ポイントのうち、財1が半分、財2とoutside optionが4分の1ずつを獲得している。これは、乗り換え先の元のシェア\(40:20:20=2:1:1\)に沿った配分である。この比は、財3と各乗り換え先がどれだけ似ているかによって変わらない。
なぜ元のシェアに比例するのか:一般式での確認
バスでは新しい選択肢が加わり、缶コーヒーでは既存の財が値上げされた。どちらも、効用が変わらない選択肢のシェアは、logit式の分母だけを通じて変わる。この共通点から、先ほどの結果を導こう。
分母が変わると、すべて同じ割合で増減する
変化前の選択肢集合を\(\mathcal J\)とし、シェア式の分母を\(D\)と書く。缶コーヒーの例ではoutside optionも\(\mathcal J\)に含め、\(\delta_0=0\)とする。バスの例では車と青バスだけを含める。
\[ D=\sum_{\ell\in\mathcal J}e^{\delta_\ell}, \qquad s_j=\frac{e^{\delta_j}}{D}. \]
価格変更や新財の追加が起きた後の分母を\(D'\)、シェアを\(s'_j\)と書こう。自身の効用\(\delta_j\)が変わらない既存の選択肢\(j\)については、分子が同じなので、
\[ s'_j=\frac{e^{\delta_j}}{D'} =\frac{D}{D'}s_j \]
となる。\(\Delta s_j=s'_j-s_j\)と定義して両辺から\(s_j\)を引けば、
\[ \boxed{\Delta s_j=\left(\frac{D}{D'}-1\right)s_j}, \qquad \frac{\Delta s_j}{s_j}=\frac{D}{D'}-1. \]
右辺の係数\(D/D'-1\)は、効用が変わらないどの財にも共通である。したがって、増減率は同じになり、増減幅は元のシェアに比例する。この条件を満たす2財\(j,\ell\)について、分母が実際に変化していれば、
\[ \frac{\Delta s_j}{\Delta s_\ell} =\frac{s_j}{s_\ell}. \]
同時に、変化後も\(s'_j/s'_\ell=s_j/s_\ell=e^{\delta_j-\delta_\ell}\)であり、元のシェア比そのものも変わらない。これがIIAである。この導出は微分による近似ではなく、有限の価格変更や選択肢の追加についても成り立つ。
缶コーヒー:値上げで失われた需要はどこへ行くか
財\(k\)の価格だけが\(\Delta p_k>0\)だけ上がると、\(\delta'_k=\delta_k-\alpha\Delta p_k\)となる(\(\alpha>0\))。そのため、
\[ D'=D-e^{\delta_k}+e^{\delta_k-\alpha\Delta p_k}<D. \]
よって、他の財\(j\ne k\)には\(D/D'-1>0\)が共通してかかり、元のシェアに比例して需要が増える。outside optionを含む全選択肢のシェアは合計1なので、これらの増加分の合計は、財\(k\)の減少分\(-\Delta s_k\)に等しい。したがって、
\[ -\Delta s_k =\sum_{j\ne k}\Delta s_j =\left(\frac{D}{D'}-1\right)(1-s_k), \]
\[ \boxed{\frac{\Delta s_j}{-\Delta s_k} =\frac{s_j}{1-s_k}}\qquad(j\ne k). \]
左辺は「財\(k\)が失った需要のうち、財\(j\)が獲得する割合」である。右辺は「財\(k\)以外の選択肢の中での、財\(j\)の元のシェア」にすぎない。例Bなら、財1の獲得割合は\(0.40/(1-0.20)=1/2\)、財2とoutside optionはそれぞれ\(0.20/(1-0.20)=1/4\)となる。
赤バス・青バス:新しい選択肢はどこから需要を奪うか
既存の選択肢の効用を固定して新財\(r\)を追加すると、\(D'=D+e^{\delta_r}\)である。新財のシェアは\(s'_r=e^{\delta_r}/D'\)なので、
\[ \frac{D}{D'}=1-s'_r, \qquad \boxed{\Delta s_j=-s'_r s_j}\qquad(j\in\mathcal J). \]
今度は各既存財の元のシェアに比例して需要が奪われる。赤バスの例では\(s_C=s_B=1/2\)、\(s'_R=1/3\)なので、
\[ \Delta s_C=\Delta s_B =-\frac13\times\frac12=-\frac16, \qquad s'_C=s'_B=\frac12-\frac16=\frac13. \]
車からも青バスからも同じ\(1/6\)だけシェアを奪う、という先ほどの予測が得られた。基本logitは、値上げ後の需要獲得も、新財による需要減少も、既存のシェア比に沿って配分する。新財がどれほど青バスに似ていても、その類似性だけを理由に青バスから多く奪うことはできない。
交差弾力性行列でも確認する
今の結果を、微小な価格変化に対する反応として表したものが交差価格弾力性である。\(j\ne k\)では、\(\partial D/\partial p_k=-\alpha e^{\delta_k}\)を使うと、
\[ \frac{\partial s_j}{\partial p_k} =\alpha\frac{e^{\delta_j}e^{\delta_k}}{D^2} =\alpha s_j s_k, \qquad \eta_{jk}=\frac{\partial s_j}{\partial p_k}\frac{p_k}{s_j} =\alpha p_k s_k. \]
シェアの増加幅を表す微分には\(s_j\)がかかっているが、増加率に直すと\(s_j\)は消える。つまり、共通の価格係数\(\alpha\)のもとでは、財\(k\)の小さな値上げに対する他の財の需要の増加率は、どの財\(j\)でも同じになる。これは先ほどの一般式の、微小な変化における表現である。元のシェアが異なる例Bについて、弾力性行列も計算してみよう。
cross_elasticity <- function(beta_j, alpha, price_j) {
sh <- logit_shares(beta_j, alpha, price_j)$s
J <- length(price_j)
E <- matrix(NA, J, J)
for (j in 1:J) {
for (k in 1:J) {
if (j == k) {
E[j, k] <- -alpha * price_j[j] * (1 - sh[j])
} else {
E[j, k] <- alpha * price_j[k] * sh[k]
}
}
}
E
}
E_iia <- cross_elasticity(beta_unequal, alpha, price_j)
rownames(E_iia) <- colnames(E_iia) <- c("財1", "財2", "財3")
round(E_iia, 4) 財1 財2 財3
財1 -1.8 0.6 1.6
財2 1.2 -2.4 1.6
財3 1.2 0.6 -6.4
3列目を見ると、財1が財3の値上げに反応する弾力性(1行3列目)と、財2が財3の値上げに反応する弾力性(2行3列目)が完全に一致している。財1と財2がどれだけ似ているかに関係なく、この値は同じになる。
どちらも弾力性は1.6なので、財3の価格が1%上がれば、それぞれの需要は約1.6%増える。ただし、これは微分に基づく局所的な近似である。10%という大きな値上げに単純に掛けた16%は近似値であり、先ほどの表で厳密に計算した増加率は約12.3765%だったことに注意しよう。
「BMWが値上げしたら、シェアの比率に応じて軽トラの需要も増える」——これがlogitモデルの機械的な帰結である。もちろん現実には、BMWの値上げで乗り換える先は同じ高級車セグメント(ベンツやアウディ)に偏るはずで、軽トラに乗り換える人はほとんどいないだろう。しかしlogitモデルは、この「BMWと軽トラは全然違うカテゴリだ」という情報を一切使わずに、シェアの大きさだけで機械的に配分してしまう。
原因は、各消費者の効用ショック \(\varepsilon_{ijt}\) が財を超えてiid(独立同一分布)だと仮定していることにある。観測できる属性や価格が効用に与える部分を説明した後にも、「ある消費者は財1も財2も特に好む」という傾向が残るなら、\(\varepsilon_{i1t}\) と \(\varepsilon_{i2t}\) に正の相関を許すことが役立つ。製品が似ているだけで必ず誤差が相関するという意味ではなく、モデルで説明しきれなかった好みの共通部分の話である。基本logitはこの相関を許さず、IIAという代替パターンの制約を持つ。次に扱う nested logit は、この相関を部分的に許すことで制約を緩和するモデルである。
nested logit:財をグループにまとめる
アイデア
基本logitでは、観測効用を所与として、財同士に共通する未観測の好みを効用ショックの相関として表現できなかった。nested logitは、財をあらかじめいくつかのネスト(グループ)に分け、同じネストに属する財同士には効用ショックの相関を許し、異なるネストの財同士は相関しない、という構造を与える。
具体例として、缶コーヒー市場を考える。
「まったり系」ネストに属するブランドA・Bは互いによく似ているので、片方が値上げされたらもう片方に流出しやすい。「すっきり系」ネストに属するブランドC・Dも同様である。しかしまったり系とすっきり系は方向性が違うので、ネストをまたぐ代替は相対的に起きにくい、という構造をモデルに与える。
選択確率の分解
nested logitの選択確率は、「どのネストが選ばれるか」と「そのネストの中でどの財が選ばれるか」の確率の積に分解できる。これは条件付き確率による分解であり、消費者が実際にその順番で意思決定するという仮定ではない。財\(j\)がネスト\(g\)に属するとして、
\[ s_{jt} = \bar{s}_{j|g,t} \times s_{gt} \]
と書く。\(\bar{s}_{j|g,t}\) は「ネスト\(g\)を選んだという条件のもとでの財\(j\)の選択確率」(within-nest share)、\(s_{gt}\) は「ネスト\(g\)が選ばれる確率」(between-nest share)である。平均効用を\(\delta_{jt}=x_{jt}'\beta-\alpha p_{jt}+\xi_{jt}\)とすると、それぞれ次の式で与えられる。outside optionは平均効用を0とする単独のネストとして扱い、\(g'\)の和には購入する財のネストだけを含める。
\[ \bar{s}_{j|g,t} = \frac{\exp(\delta_{jt} / (1-\rho))}{\sum_{k \in g} \exp(\delta_{kt} / (1-\rho))}, \qquad s_{gt} = \frac{\left[\sum_{k \in g} \exp(\delta_{kt}/(1-\rho))\right]^{1-\rho}}{1 + \sum_{g'} \left[\sum_{k \in g'} \exp(\delta_{kt}/(1-\rho))\right]^{1-\rho}} \]
ここで \(\lambda = 1-\rho\) を dissimilarity parameter(非類似度パラメータ)と呼ぶ。ランダム効用モデルと整合的な通常の範囲は \(0<\lambda\leq 1\)、すなわち \(0\leq\rho<1\) である。\(\rho\) は相関そのものではなく、ネストの結びつきの強さを表すネスティング・パラメータである。標準的な正規化では、同一ネスト内の誤差相関は
\[ \operatorname{Corr}(\varepsilon_{ij},\varepsilon_{ik}) =1-\lambda^2=1-(1-\rho)^2 \qquad (j\neq k, j,k\in g) \]
となる。したがって \(\rho\) が大きいほど相関も強いが、両者の数値は同じではない。\(\rho=0\)(\(\lambda=1\))ならplain logitに一致し、\(\rho\to1\)(\(\lambda\to0\))ではネスト内の代替が極端に強くなる。
nested logitは、効用ショック \(\varepsilon_{ijt}\) が iid Gumbel ではなく、generalized extreme value (GEV) 分布という、より一般的な同時分布に従うと仮定することで導かれる。GEV分布は、各財の周辺分布をGumbelに保ちながら、同じネストのショックに正の依存を持たせる。
この構成のもとで選択確率を計算すると、上の分解式が得られる。この講義では導出の詳細(GEV生成関数の形など)には立ち入らない。興味があれば Train (2009) Discrete Choice Methods with Simulation 第4章を参照してほしい。実務上重要なのは、(1) 選択確率がwithin/betweenに分解できること、(2) \(\rho\) は誤差相関を単調に動かすが相関そのものではないこと、(3) \(\rho=0\) でplain logitに一致すること、の3点である。なお、\(\zeta_g\rho+(1-\rho)\varepsilon_j\) のように独立なGumbelを足すだけでは、一般にこのGEV同時分布は作れない。シミュレーションでは上のシェア写像をDGPとして使う。
Rシミュ2:nested logitの選択確率とシェア計算
先ほどの4財(まったり系2財、すっきり系2財)の例で、nested logitのシェアを計算する関数を作る。
nested_logit_shares <- function(delta, nests, rho) {
# delta: 長さJのベクトル(平均効用)
# nests: リスト。各要素が同じネストに属する財のインデックス(1-indexed)
# rho: ネスティング・パラメータ(共通)。相関そのものではない
lambda <- 1 - rho
J <- length(delta)
n_nests <- length(nests)
IV <- numeric(n_nests) # ネスト内の指数和(log(IV)がinclusive value)
for (g in seq_len(n_nests)) {
idx <- nests[[g]]
IV[g] <- sum(exp(delta[idx] / lambda))
}
denom <- 1 + sum(IV^lambda)
s0 <- 1 / denom
s_g <- (IV^lambda) / denom
s <- numeric(J)
s_within <- numeric(J)
for (g in seq_len(n_nests)) {
idx <- nests[[g]]
for (j in idx) {
s_within[j] <- exp(delta[j] / lambda) / IV[g]
s[j] <- s_within[j] * s_g[g]
}
}
list(s = s, s0 = s0, s_g = s_g, s_within = s_within)
}これを使って、まったり系(財1・2)・すっきり系(財3・4)という4財市場のシェアを計算してみる。
alpha_n <- 1.0
beta_n <- c(2.2, 2.0, 2.3, 2.1)
price_n <- c(3.0, 3.2, 3.5, 3.3)
delta_n <- beta_n - alpha_n * price_n
nests4 <- list(c(1, 2), c(3, 4)) # ネスト1={財1,財2}, ネスト2={財3,財4}
rho_n <- 0.5
nl <- nested_logit_shares(delta_n, nests4, rho_n)
nl$s[1] 0.18975819 0.08526385 0.10828074 0.10828074
nl$s0[1] 0.5084165
\(\rho = 0\) にすると、plain logitのシェアと一致することを確認しておこう(式の検算)。
plain_logit_shares <- function(delta) {
ev <- exp(delta)
denom <- 1 + sum(ev)
list(s = ev / denom, s0 = 1 / denom)
}
nl_rho0 <- nested_logit_shares(delta_n, nests4, rho = 0)
pl <- plain_logit_shares(delta_n)
data.frame(
good = c("財1", "財2", "財3", "財4", "outside"),
nested_rho_0 = c(nl_rho0$s, nl_rho0$s0),
plain_logit = c(pl$s, pl$s0)
) good nested_rho_0 plain_logit
1 財1 0.1909672 0.1909672
2 財2 0.1280091 0.1280091
3 財3 0.1280091 0.1280091
4 財4 0.1280091 0.1280091
5 outside 0.4250053 0.4250053
数値計算の精度の範囲で一致している。\(\rho=0\)では、ネストによる分類がシェアに影響しなくなる。
Rシミュ2続き:財3の値上げで代替がネスト内に集中するか
いよいよ今回の見せ場である。すっきり系ネストの財3を20%値上げしたとき、plain logitとnested logitで代替パターンがどう変わるかを比較する。
price_shock_n <- price_n
price_shock_n[3] <- price_shock_n[3] * 1.20
delta_shock_n <- beta_n - alpha_n * price_shock_n
pl_before <- plain_logit_shares(delta_n)
pl_after <- plain_logit_shares(delta_shock_n)
nl_before <- nested_logit_shares(delta_n, nests4, rho_n)
nl_after <- nested_logit_shares(delta_shock_n, nests4, rho_n)
d_plain <- c(pl_after$s - pl_before$s, pl_after$s0 - pl_before$s0)
d_nested <- c(nl_after$s - nl_before$s, nl_after$s0 - nl_before$s0)
df_compare <- data.frame(
good = rep(c("財1(まったり)", "財2(まったり)", "財3(すっきり,値上げ)", "財4(すっきり)", "outside(買わない)"), 2),
model = rep(c("plain logit", "nested logit"), each = 5),
share_change = c(d_plain, d_nested)
)
df_compare good model share_change
1 財1(まったり) plain logit 0.013153909
2 財2(まったり) plain logit 0.008817329
3 財3(すっきり,値上げ) plain logit -0.060063131
4 財4(すっきり) plain logit 0.008817329
5 outside(買わない) plain logit 0.029274563
6 財1(まったり) nested logit 0.009063862
7 財2(まったり) nested logit 0.004072656
8 財3(すっきり,値上げ) nested logit -0.072843908
9 財4(すっきり) nested logit 0.035422714
10 outside(買わない) nested logit 0.024284677
図で見比べる。
df_compare$good <- factor(df_compare$good, levels = c("財1(まったり)", "財2(まったり)", "財3(すっきり,値上げ)", "財4(すっきり)", "outside(買わない)"))
df_compare$model <- factor(df_compare$model, levels = c("plain logit", "nested logit"))
ggplot(df_compare, aes(x = good, y = share_change, fill = model)) +
geom_col(position = position_dodge(width = 0.7), width = 0.6) +
geom_hline(yintercept = 0, linewidth = 0.3) +
labs(x = NULL, y = "シェアの変化", fill = NULL,
title = "財3の値上げに対する需要の移動") +
theme(axis.text.x = element_text(angle = 15, hjust = 1))plain logitでは、財3から流出した需要は財1・財2・財4とoutside optionに、元のシェア比に応じて配分される。この設定では約49%が「何も買わない」へ移る。ところがnested logitでは、同じ「すっきり系」ネストに属する財4への流出が、異なるネストの財1・財2への流出より明確に大きくなる。これは、財3と財4が同じネストにいることで効用ショックが正に相関しており、「財3の値上げで乗り換える消費者は、似た系統の財4に流れやすい」という代替パターンが再現されているためである。nested logitでも約33%はoutside optionへ移る。なお、この比較では平均効用を同じにしているため、値上げ前のシェア自体も両モデルで異なる。
弾力性行列でも同じことを確認できる。
elasticity_numeric <- function(share_fn, delta, price, alpha, ...) {
J <- length(price)
E <- matrix(NA, J, J)
eps <- 1e-6
s_base <- share_fn(delta, ...)$s
for (k in 1:J) {
delta_eps <- delta
delta_eps[k] <- delta_eps[k] - alpha * eps
s_eps <- share_fn(delta_eps, ...)$s
for (j in 1:J) {
E[j, k] <- (s_eps[j] - s_base[j]) / eps * price[k] / s_base[j]
}
}
E
}
E_plain <- elasticity_numeric(function(d, ...) plain_logit_shares(d), delta_n, price_n, alpha_n)
E_nested <- elasticity_numeric(function(d, nests, rho) nested_logit_shares(d, nests, rho),
delta_n, price_n, alpha_n, nests = nests4, rho = rho_n)
rownames(E_plain) <- colnames(E_plain) <- c("財1", "財2", "財3", "財4")
rownames(E_nested) <- colnames(E_nested) <- c("財1", "財2", "財3", "財4")
cat("plain logitの弾力性行列:\n")plain logitの弾力性行列:
round(E_plain, 3) 財1 財2 財3 財4
財1 -2.427 0.41 0.448 0.422
財2 0.573 -2.79 0.448 0.422
財3 0.573 0.41 -3.052 0.422
財4 0.573 0.41 0.448 -2.878
cat("\nnested logitの弾力性行列:\n")
nested logitの弾力性行列:
round(E_nested, 3) 財1 財2 財3 財4
財1 -3.361 1.265 0.379 0.357
財2 2.639 -5.135 0.379 0.357
財3 0.569 0.273 -4.871 2.007
財4 0.569 0.273 2.129 -4.593
nested logitの行列では、同じネスト内の交差弾力性(1行2列目・2行1列目、3行4列目・4行3列目)が、ネストをまたぐ交差弾力性(1行3列目など)よりもはっきり大きくなっている。plain logitではこの区別が一切ない。
nested logitは「似た財ほど強く競合する」という、多くの実務家にとって自然な直感を、\(\rho\) というたった1つの追加パラメータでモデルに組み込む。\(\rho \to 0\) でplain logitに戻るので、nested logitはplain logitを特殊ケースとして含む一般化になっている。次に、この\(\rho\)を価格係数と一緒にデータから推定してみよう。
ただし、同じネスト内の2財の選択確率の比にはIIAが残る。その比は\(\exp\{(\delta_j-\delta_k)/(1-\rho)\}\)で、他の財の属性には依存しない。nested logitは、あらかじめ決めたネスト構造に沿ってIIAを緩和するモデルである。
Rシミュ2続き:ネストの強さもデータから推定する
ここまでは\(\rho=0.5\)と手で与えていたが、\(\rho\)も価格係数と同じく、消費者の選択データから推定できる。第2回で学んだ最尤法を使い、選択確率の式をlogitからnested logitに置き換えればよい。小さな例で、真値をどこまで回収できるか確かめよう。
何を観測して、何を推定するか
先ほどと同じ4商品A・B・C・Dと「買わない」を使う。A・Bがまったり系、C・Dがすっきり系であり、ネストの分け方は既知とする。独立した2,000人に、それぞれ少し異なる価格を提示し、1つだけ選んでもらう仮想的な選択実験を考える。観測するのは、選んだ商品と、選ばなかった商品も含めた全選択肢の提示価格である。
消費者\(i\)に提示する商品\(j\)の価格を\(p_{ij}\)、ブランドごとの平均的な魅力を\(a_j\)とし、共通効用を
\[ \delta_{ij}=a_j-\alpha p_{ij},\qquad \delta_{i0}=0 \]
と置く。\(a_j\)は先ほどのコードのbeta_nに対応する商品別の定数項である。データを作る際の真値は、\(a=(2.2,2.0,2.3,2.1)\)、\(\alpha=1\)、\(\rho=0.5\)とする。
先ほどのシェア式から選択確率\(P_{ij}(a,\alpha,\rho)\)が計算できる。\(d_{ij}\)を「\(i\)が\(j\)を選んだら1、それ以外は0」とすると、対数尤度は
\[ \ell(a,\alpha,\rho) =\sum_{i=1}^{N}\sum_{j=0}^{4} d_{ij}\log P_{ij}(a,\alpha,\rho). \]
この式を最大化して\(a_1,\ldots,a_4,\alpha,\rho\)を同時に推定する。
選択データを作る
価格は、先ほどの基準価格から\(-0.8\)〜\(+0.8\)の範囲で独立に動かす。nested logitの確率を計算し、その確率に従って1人につき1つの選択を抽出する。
set.seed(2026301)
N_nest <- 2000
alt_nest <- c("outside", "A", "B", "C", "D")
price_mle <- matrix(runif(N_nest * 4, -0.8, 0.8), nrow = N_nest, ncol = 4)
price_mle <- sweep(price_mle, 2, price_n, "+")
choice_nest <- integer(N_nest)
for (i in seq_len(N_nest)) {
prob_i <- nested_logit_shares(
delta = beta_n - alpha_n * price_mle[i, ], nests = nests4, rho = rho_n
)
# 1=outside、2=A、3=B、4=C、5=D
choice_nest[i] <- sample.int(5, size = 1, prob = c(prob_i$s0, prob_i$s))
}
# 1人につき5行。選ばなかった選択肢の行も残す。
choice_df <- data.frame(
id = rep(seq_len(N_nest), each = 5),
alt = rep(alt_nest, times = N_nest),
chosen = rep(choice_nest, each = 5) == rep(seq_len(5), times = N_nest),
price = as.vector(t(cbind(0, price_mle)))
)最初の1人のデータを見てみよう。chosenがTRUEなのは、その人が選んだ1行だけである。outsideの価格は0とし、その共通効用も0に正規化する。
| 消費者id | 選択肢 | chosen | 価格 |
|---|---|---|---|
| 1 | outside | TRUE | 0.000 |
| 1 | A | FALSE | 3.376 |
| 1 | B | FALSE | 3.449 |
| 1 | C | FALSE | 3.403 |
| 1 | D | FALSE | 3.999 |
mlogitで推定し、講義のrhoに変換する
第2回でも紹介したmlogitパッケージを使う。mlogit.data()で同じidの5行を1つの選択集合として指定し、nestsで商品の所属を伝える。chosen ~ price | 1の| 1は商品別の定数項を入れる指定であり、reflevel = "outside"でoutsideの定数項を0にする。
choice_data <- mlogit::mlogit.data(
choice_df, choice = "chosen", shape = "long", alt.var = "alt", chid.var = "id"
)
nested_fit <- mlogit::mlogit(
chosen ~ price | 1, data = choice_data, reflevel = "outside",
nests = list(mellow = c("A", "B"), clear = c("C", "D"), outside = "outside"),
un.nest.el = TRUE, unscaled = FALSE
)un.nest.el = TRUEは、ネストのパラメータを共通にする指定である。unscaled = FALSEは、この講義で使った選択確率の式に合わせる指定である。この設定で出力されるivという係数は\(\lambda=1-\rho\)なので、そのまま\(\rho\)として読んではいけない。ivはinclusive valueに由来する名前で、後で登場する操作変数(IV)とは別である。パッケージの仕様は公式解説を参照。
価格の係数も\(-\alpha\)なので、符号を反転して読む。したがって、
\[ \widehat\alpha=-\widehat b_{\mathrm{price}}, \qquad \widehat\rho=1-\widehat\lambda. \]
標準誤差は、符号を反転したり定数から引いたりしても変わらない。商品別定数も同時に推定しているが、ここでは関心のある\(\alpha\)と\(\rho\)を取り出し、真値・標準誤差・95%信頼区間と並べる。
coef_nest <- coef(nested_fit)
se_nest <- sqrt(diag(vcov(nested_fit)))
lambda_hat <- unname(coef_nest["iv"])
alpha_hat_nest <- -unname(coef_nest["price"])
rho_hat_nest <- 1 - lambda_hat
results_nest <- data.frame(
parameter = c("alpha", "rho"),
truth = c(alpha_n, rho_n),
estimate = c(alpha_hat_nest, rho_hat_nest),
std_error = unname(se_nest[c("price", "iv")])
)
results_nest$ci95 <- with(results_nest,
sprintf("[%.3f, %.3f]", estimate - 1.96 * std_error, estimate + 1.96 * std_error)
)| パラメータ | 真値 | 推定値 | 標準誤差 | 95%信頼区間 |
|---|---|---|---|---|
| alpha | 1.0 | 1.135 | 0.111 | [0.919, 1.352] |
| rho | 0.5 | 0.469 | 0.063 | [0.346, 0.593] |
この標本では、\(\widehat\alpha\approx1.135\)、\(\widehat\rho\approx0.469\)となり、真値の1と0.5はいずれも95%信頼区間に含まれる。\(\widehat\lambda\approx0.531\)も、モデルと整合的な範囲\(0<\lambda\leq1\)に入っている。先ほど手で与えていたネストの強さを、今度は選択データから推定できた。有限の標本なので、推定値が真値にぴったり一致するわけではない。
できる。共通の\(\rho\)は、説明を簡単にするための制約である。 まったり系とすっきり系に別々の\(\rho_g\)(\(0\leq\rho_g<1\))を置き、価格係数\(\alpha\)と同時に推定してもよい。ただし、各パラメータを区別できるデータの変動が必要になる。
同じネスト\(g\)の2商品\(j,k\)について、選択確率の比は
\[ \log\frac{P_{ij}}{P_{ik}} =\frac{\delta_{ij}-\delta_{ik}}{1-\rho_g} =\frac{a_j-a_k-\alpha(p_{ij}-p_{ik})}{1-\rho_g}. \]
この比の相対価格への反応だけでは、\(\alpha/(1-\rho_g)\)までしかわからない。ネスト内での乗り換えと、ネストをまたぐ乗り換えの両方を使うことで、価格への感応度\(\alpha\)と各ネストの結びつき\(\rho_g\)を区別する。この例のように各商品の価格を独立に、外生的に動かす設計は、その情報を得る一つの方法である。
mlogitでは、上の指定をun.nest.el = FALSEに変えるとネスト別に推定できる。ただし、選択肢が一つしかないoutsideの\(\rho_g\)は確率式から消えるため識別できず、constPar = c("iv:outside" = 1)を追加して\(\lambda_{\mathrm{outside}}=1\)に固定する。出力のiv:mellowとiv:clearはそれぞれ\(\lambda_g=1-\rho_g\)なので、1から引いて読む。
今回データから推定したのは、あらかじめ指定したネストの中で、代替がどれほど強いかである。ネストの分け方自体を自動で発見したわけではない。また、価格は外生的に動かしているという点にも注意が必要である。つまり価格についての実験が行われ、顧客個別の選択結果のデータが手元にある、という状況ならできる推定をやった。次は、個票は引き続き手元にあるが、価格は企業が需要を見ながら決める場合を考える。
研究の問い:CTスキャナー(医療用画像診断機器)の新製品や性能改善は、どれだけの厚生利得をもたらしたか。
データ:米国のCTスキャナー市場における機種別の価格・性能・購入に関するデータ。購入者には病院や診療所が含まれる。
識別戦略・モデル:Trajtenberg (1989, Journal of Political Economy) は、製品属性と購入選択を結びつけるnested logitの需要モデルを推定し、新製品や性能改善の価値を評価した。頭部用と全身用を区別したネスト構造を検討しており、すべての機種を一括して同じ代替関係に置くモデルではない。公刊版の要旨と著者のワーキングペーパーを参照。
なぜこの講義のトピックと繋がるのか:新製品の価値は、それが既存製品でどの程度代用できるかに依存する。この研究は、nested logitによる代替関係のモデル化を、技術革新の厚生評価に用いた実証例である。
価格内生性に対処する:Berry (1994) の反転とIV
記号とデータ:個票はあるが、価格は企業が決める
ここから考えるのは、価格は企業が需要を見ながら決めているという状況である。先ほどの選択実験では、価格を人ごとにランダムに提示した。今度は店舗×週を一つの市場とし、その市場の消費者は同じ品揃えと価格に直面するとする。
思い出しがてら、この章で使う添字は以下の通りである。
| 記号 | 意味 |
|---|---|
| \(t=1,\ldots,T\) | 市場。例えば「ある店舗のある週」 |
| \(j=1,\ldots,J\) | 市場で販売される商品。\(j=0\)は「買わない」というoutside option |
| \(i=1,\ldots,N_t\) | 市場\(t\)の消費者。\(N_t\)には買わなかった人も含む |
一人は一つだけ選ぶ。\(n_{jt}\)で、その市場\(t\)において財\(j\)を購入した消費者の数とすると、\(\sum_{j=0}^J n_{jt}=N_t\)がその市場における消費者の総数である。以下では、まずplain logitで価格内生性への対処を学び、最後にnested logitへ戻る。
効用は
\[ u_{ijt}=\delta_{jt}+\varepsilon_{ijt} =x_{jt}'\beta-\alpha p_{jt}+\xi_{jt}+\varepsilon_{ijt}, \qquad u_{i0t}=\varepsilon_{i0t} \]
とする。 平均効用(mean utility)の\(\delta_{jt}\)が初出である。これは消費者\(i\)に依存してないことに注意である。消費者全体に平均して入ってる効用だから平均効用と呼ぶ。この平均効用が属性\(x_{jt}\)や価格\(p_{jt}\)、そして\(\xi_{jt}\)に対してlinearにモデル化されている。ここで\(\xi_{jt}\)のことをunobserved mean utilityと呼ぶことにする。その名が示す通り、こいつは研究者には見えない(unobserved)である。しかし、この市場で価格付けをする企業や購入する消費者には見えている、そんな効用の部分を表す記号である。例えば、財の「質」や「評判」がこの部分にこめられるのが一般的である。後述するようにこいつの存在が価格の内生性(price endogeneity)を産む原因である。
outsideの平均効用は\(\delta_{0t}=0\)に正規化する。 \(\varepsilon_{ijt}\)は市場の価格・属性・\(\xi\)を条件づけたもとで、消費者・選択肢間で独立なType I極値分布に従うとする。個人ごとの属性や係数の違いはこの例には入れないので、同じ市場の全員が同じ選択確率を持つ。
価格内生性(price endogeneity)とは何か
共通の需要要因\(\xi_{jt}\)と個人の好み\(\varepsilon_{ijt}\)は、別の役割を持つ。例えば、ある週に商品Aの評判が高まり、多くの消費者がAを魅力的に感じるなら、Aの\(\xi_{jt}\)が高い。一方、「今日はたまたまAを飲みたい」という個人の事情は\(\varepsilon_{ijt}\)に入る。消費者を増やして個人の偶然を平均しても、その週の評判は残る。
企業はその評判を知り、「多少高くても売れる」と考えて価格を上げるかもしれない。このとき、評判が研究者のデータに含まれていなければ、価格が高いときに(本当は評判の効果で)よく売れるので、価格が高いと需要が高まるという推定結果を得てしまうかもしれない。
具体的に、同じ店舗で売られる商品Aについて、週ごとの価格と購入率を並べた仮想データを見よう。図 4 の1点は1週の市場であり、左右には同じデータを描いている。左は研究者が観測する価格と購入率だけを示し、右は通常は見えない商品の評判\(\xi_{jt}\)を、説明のために色分けしている。
左だけを見ると、「値上げするとよく売れる」と読んでしまいそうになる。しかし右を見ると、評判が低い週には安くてもあまり売れず、評判が高い週には高くてもよく売れている。異なる評判の週を混ぜたために、右上がりの相関が現れているのである。 同じ評判を固定した曲線は、どれも右下がりである。例えば、この図の「中程度」の評判のもとでは、価格だけを150円から160円に上げると、購入確率は50%から約45%へ下がる。
この仮想例では、企業が評判に反応して価格を上げるようにデータを作っている。実際のデータで価格と購入率が正に相関していることだけから、価格の効果や内生性の有無を判断できるわけではない。
商品Aを買うかoutsideを選ぶかの二択とし、平均効用を\(\delta_{jt}=3-0.02p_{jt}+\xi_{jt}\)とした。価格\(p_{jt}\)の単位は円である。評判\(\xi_{jt}\)が\(-1,0,1\)の週を45週ずつ作り、価格は\(p_{jt}=150+30\xi_{jt}+v_{jt}\)とした。\(v_{jt}\)は評判から独立な\(-10\)円から10円までの一様乱数であり、同じ評判の週の間にも価格の違いを作っている。この価格式は仕組みを示すための仮定であり、企業の最適価格を解いたものではない。
各週5,000人が、確率\(\Lambda(\delta_{jt})\)で商品Aを選ぶ。その選択人数を5,000で割ったものが、点の購入率である。右の曲線は\(100\Lambda(3-0.02p+\xi_{jt})\)を描いている。ここで\(\Lambda(a)=e^a/(1+e^a)\)である。
この状況で\(\xi_{jt}\)の存在を無視して今まで学習してきたlogitの最尤法でモデルを推定すると、商品属性と価格だけで選択を説明しようとしてしまう。価格とともに動く商品の魅力まで価格の効果に含めるため、価格反応を正しく捉えられるとは限らない。具体的に上の例では価格にくっついている係数がpositiveになってしまう。
内生性には操作変数(IV)だ!!しかし、「どう使えばいいか」は自明ではない。
線形モデルだったらこういう内生性に対しては操作変数(IV)でがんばる。需要量を\(q_{jt}\)と書き、仮に
\[ q_{jt}=x_{jt}'\beta-\alpha p_{jt}+\xi_{jt} \]
という線形の関係が成り立つとする。価格と\(\xi_{jt}\)が相関していても、操作変数\(z_{jt}\)について\(E[z_{jt}\xi_{jt}]=0\)が成り立ち、\(x_{jt}\)を条件づけたうえで価格を動かす十分な変動があれば、IVとして使え、あとは2SLSでもGMMでもやれば良い。
すなわち、ここでは\(x_{jt}\)も外生で、\(E[x_{jt}\xi_{jt}]=0\)を満たすとすると、係数の候補\((\beta,\alpha)\)を与えるたびに、観測値から
\[ q_{jt}-x_{jt}'\beta+\alpha p_{jt} \]
という残差を作れる。真の係数なら、この残差が\(\xi_{jt}\)に一致する。そこで
\[ E\left[z_{jt}\{q_{jt}-x_{jt}'\beta+\alpha p_{jt}\}\right]=0 \]
という条件を推定に使う。操作変数と無相関だと仮定した残差を、観測データと係数から計算できることが、この手順を支えている。
ところが、logitでは、同じような引き算をするだけでは\(\xi_{jt}\)を取り出せない。話を簡単にするためいったん「商品\(j\)を買う/買わない」の二択に絞る。ロジスティック関数を\(\Lambda(v)=e^v/(1+e^v)\)と書くと、個人\(i\)の選択確率は
\[ P_{ijt}=\Lambda(x_{jt}'\beta-\alpha p_{jt}+\xi_{jt}) \]
である。\(\xi_{jt}\)を入れずに計算した確率を引いても、その差は
\[ \Lambda(x_{jt}'\beta-\alpha p_{jt}+\xi_{jt}) -\Lambda(x_{jt}'\beta-\alpha p_{jt}) \]
となり、一般には\(\xi_{jt}\)に一致しない。\(E[z_{jt}\xi_{jt}]=0\)というIVの条件だけでは、この確率の差と\(z_{jt}\)が無相関になるとは保証できない。これでは先ほどの線形モデルの時のようなモーメント条件が作れない。。。
では、観測データをうまく変換し、係数の候補を与えれば\(\xi_{jt}\)だけを取り出せる形にできないだろうか。 それができれば、線形モデルと同じように、取り出した誤差と操作変数が無相関になる条件を使って推定できる。
Berry はこの「うまい変換」を見つけた。それこそBerry inversionと呼ばれるテクニックである。
Berry inversion: 個人の選択確率を変形すると、線形の式が得られる
変換の手がかりは、logitが選択確率を平均効用の関数として表していることである。その関数を逆にたどれば、選択確率から平均効用へ戻れそうである。まず、選択確率について成り立つ式だけを変形してみよう。
二択logitでは、個人\(i\)の購入確率と非購入確率は、
\[ P_{ijt}=\frac{e^{\delta_{jt}}}{1+e^{\delta_{jt}}}, \qquad P_{i0t}=\frac{1}{1+e^{\delta_{jt}}}. \]
二つの分母が共通なので、比を取ると指数関数の部分だけが残る。さらに対数を取れば、
\[ \frac{P_{ijt}}{P_{i0t}}=e^{\delta_{jt}} \quad\Longrightarrow\quad \log P_{ijt}-\log P_{i0t} =\delta_{jt}=x_{jt}'\beta-\alpha p_{jt}+\xi_{jt}. \]
これで、非線形な確率の式の内側に入っていた\(\xi_{jt}\)が、足し算の誤差として現れた。右辺は\(\beta,\alpha\)について線形である。もし左辺をデータから計算できれば、探していた「通常のIVを使える形」になっている。
同じ変換は、多項logitでも使える。缶コーヒー4商品とoutsideの設定に戻ろう。個人\(i\)が商品\(j\)とoutsideを選ぶ確率は、
\[ P_{ijt}=\frac{e^{\delta_{jt}}}{1+\sum_{k=1}^{J}e^{\delta_{kt}}}, \qquad P_{i0t}=\frac{1}{1+\sum_{k=1}^{J}e^{\delta_{kt}}}. \]
ここでも分母が共通なので、
\[ \frac{P_{ijt}}{P_{i0t}}=e^{\delta_{jt}} \quad\Longrightarrow\quad \boxed{\log P_{ijt}-\log P_{i0t} =\delta_{jt}=x_{jt}'\beta-\alpha p_{jt}+\xi_{jt}}. \]
となる。商品数が増えても、outsideとの確率の比を取るだけで、同じ線形の式が得られる。
ただし、このままでは推定に使えない。個票で観測するのは「選んだ/選ばなかった」という結果\(d_{ijt}\)であり、左辺の確率\(P_{ijt}\)そのものではない。 一人が商品Aを選んだという記録から、その人がAを選ぶ確率が0.4だったのか0.8だったのかは分からない。0か1の選択結果を、そのまま対数に入れることもできない。では、この見えない左辺を、どうやってデータから計算すればよいだろうか。
見えない選択確率を、観測シェアから把握する
ここで使うのが、同じ市場の全員が共通の選択確率を持つ、というモデルの仮定である。個人の属性や係数の違いを入れていないため、\(P_{ijt}=s_{jt}\)がすべての\(i\)について成り立つ。そこで、同じ市場にいる人の選択を数え、購入割合を計算する。
\[ n_{jt}=\sum_{i=1}^{N_t}d_{ijt}, \qquad \widehat s_{jt}=\frac{n_{jt}}{N_t}. \]
例えば、ある市場の1,000人のうち、商品\(j\)を買った人が400人なら、実測シェアは\(\widehat s_{jt}=0.4\)である。これは一人の選択からその人の確率を読み取る操作ではない。共通の確率で選ぶ人を多数観測し、その選択頻度から確率を把握する操作である。
実測シェアとモデルの選択確率には、有限人数の選択によるずれがある。市場の価格・属性・\(\xi_{jt}\)を固定したもとで選択が独立なら、
\[ E[\widehat s_{jt}\mid\text{市場条件}]=s_{jt}, \qquad \operatorname{Var}(\widehat s_{jt}\mid\text{市場条件}) =\frac{s_{jt}(1-s_{jt})}{N_t}. \]
人数\(N_t\)が十分に多ければ、このずれは小さくなる。ここからはシェアのsampling errorを無視し、実測シェアを選択確率と同一視する。これがno sampling errorの仮定である。すなわち、\(\widehat s_{jt}=s_{jt}=P_{ijt}\)とする(Berry (1994), p.247, 脚注4)。
すると、先ほど見えなかった左辺を、観測シェアから計算できる。
\[ \underbrace{\log\widehat s_{jt}-\log\widehat s_{0t}}_{\text{データから計算できる}} =\log P_{ijt}-\log P_{i0t} =\delta_{jt}. \]
選択確率の式を反転し、その確率をシェアから把握することで、平均効用が観測できるようになった。 この手順がBerry inversionである。以降はシェアの標本誤差を無視して、反転式を
\[ \boxed{\log s_{jt}-\log s_{0t} =\delta_{jt}=x_{jt}'\beta-\alpha p_{jt}+\xi_{jt}} \]
と書く。例えば二択で、購入シェアが0.4、非購入シェアが0.6なら、平均効用は\(\log(0.4/0.6)\approx-0.405\)と計算できる。
注意点としては、この計算にはoutsideを含む市場規模と正のシェアが必要であるということが挙げられる。購入された商品の構成比だけでは\(s_{0t}\)は分からず、売上ゼロの選択肢では対数を取れない。以下の数値例は、全選択肢に十分な選択人数がいる設定にする。
反転した式にIVを使う
平均効用が分かれば、データと係数の候補から残差を計算できる。真の係数なら、次の残差が需要ショックに一致する。
\[ \xi_{jt} =\log s_{jt}-\log s_{0t}-x_{jt}'\beta+\alpha p_{jt}. \]
したがって、操作変数の条件\(E[z_{jt}\xi_{jt}]=0\)は、
\[ E\left[z_{jt}\left\{ \log s_{jt}-\log s_{0t}-x_{jt}'\beta+\alpha p_{jt} \right\}\right]=0 \]
と書ける。今度は、シェアと説明変数から計算した残差に、IVの条件をそのまま課せる。外生な\(x_{jt}\)についての条件と合わせ、シェアの対数比を被説明変数とする2SLSを行えばよい。Berry反転は需要ショックを取り出す形を作り、IVはその需要ショックと価格の相関に対処する。 この二つがそろって、価格効果を推定する手順になる(Berry (1994), pp.248–249)。
操作変数には、例えば原材料の仕入れ費用を動かす変数を使う。仕入れ費用が高くなれば販売価格も変わるが、その変数自体は消費者の評判や商品の未観測品質とは無相関、という仮定である。価格への関連性と、この外生性の両方が必要になる。以下の数値例では、この条件を満たすコストシフターを\(w_{jt}\)と呼び、\(z_{jt}=w_{jt}\)として使う。
反転した式をOLSで推定するだけでは、価格内生性は解消しない。なぜなら、価格\(p_{jt}\)と誤差\(\xi_{jt}\)の相関はそのまま残っているからである。商品の評判が高いときに価格も高ければ、OLSは評判による売上の増加の一部まで価格の効果として拾い、価格の負の効果を弱く見積もりうる。
観測属性\(x_{jt}\)を価格から線形に取り除いた残差を\(\widetilde p_{jt}\)と書く。シェアの標本誤差を無視できるとき、価格の係数\(b_p=-\alpha\)のOLS推定量は、通常の大標本条件のもとで
\[ \operatorname{plim}\widehat b_p =-\alpha+ \frac{\operatorname{Cov}(\widetilde p_{jt},\xi_{jt})} {\operatorname{Var}(\widetilde p_{jt})} \]
となる。したがって、ここで考えるように共分散が正なら、価格の係数は上方にずれ、\(\alpha\)を過小評価する。共分散が負なら方向は逆であり、すべての有限標本で同じ不等号が成り立つわけでもない。
さらに、 \[ E\left[z_{jt}\left\{ \log s_{jt}-\log s_{0t}-x_{jt}'\beta+\alpha p_{jt} \right\}\right]=0 \] この式をよく見ると、消費者の添字\(i\)がどこにもいないことがわかる。つまり、この条件を使った2SLSによる推定は消費者個別の選択についてのデータを必要としない。市場ごとのシェアというaggregateされたデータと関連する変数、そして市場レベルのIVがあればこのモデルで本当に知りたい価格のパラメータ\(\alpha\)を識別、推定することができる。
これは今までの話と大きな違いである。今までは消費者個別の選択の結果がデータとして得られていて、その結果を使って尤度を構成し、それを最大にするパラメータを計算することで推定していた。
ところが、このBerry inversionに基づく識別、推定ではそんな個票データはいらないのである。
Rシミュ3:同じ個票データでMLE・OLS・IVを比較する
ここでは、企業が需要を見て価格を決める市場を作り、各人の選択を発生させる。同じ個票から、(i) \(\xi_{jt}\)を無視したlogitの最尤推定、(ii) シェアを反転した後のOLS、(iii) 反転した式の2SLSを行う。個票を持つこと、反転すること、IVを使うことが、それぞれ何をしているかを数値で確かめよう。
市場の価格を決め、個人の選択を発生させる
\(T=500\)市場、\(J=4\)商品とoutsideを考え、各市場に\(N_t=10{,}000\)人いるとする。観測属性は一つに絞り、平均効用を
\[ \delta_{jt}=\beta_0+\beta_1x_{jt}-\alpha p_{jt}+\xi_{jt}, \qquad (\beta_0,\beta_1,\alpha)=(2,1.5,2) \]
とする。これは、先ほどの\(x_{jt}'\beta\)を「定数項+一つの属性」で具体化したものである。\(x_{jt}\)、コストシフター\(w_{jt}\)、需要ショック\(\xi_{jt}\)を互いに独立に生成する。\(w_{jt}\)は需要の効用式には入らず、価格だけを動かす。
価格は、限界費用とマークアップの和として作る。
\[ mc_{jt}=1+0.4w_{jt}+\nu_{jt}, \qquad \text{markup}_{jt}=1+\kappa\xi_{jt}, \qquad p_{jt}=mc_{jt}+\text{markup}_{jt}. \]
ここで\(\nu_{jt}\)は他の変数から独立な費用の変動で、\(\kappa=0.8\)とする。人気を表す\(\xi_{jt}\)が高ければ価格も高くなる一方、\(w_{jt}\)による価格変動は\(\xi_{jt}\)とは無相関である。この価格式は、その関係を作るための単純なルールであり、企業の利潤最大化から均衡価格を解いたものではない。
set.seed(2026302)
T_mkt <- 500L
J_mkt <- 4L
N_per_market <- 10000L
alpha_true <- 2
beta_true <- 1.5
intercept_true <- 2
kappa <- 0.8
x_mkt <- matrix(runif(T_mkt * J_mkt, 0.5, 1.5), T_mkt, J_mkt)
w_mkt <- matrix(runif(T_mkt * J_mkt, -1, 1), T_mkt, J_mkt)
xi_mkt <- matrix(runif(T_mkt * J_mkt, -0.7, 0.7), T_mkt, J_mkt)
mc_mkt <- 1 + 0.4 * w_mkt +
matrix(runif(T_mkt * J_mkt, -0.15, 0.15), T_mkt, J_mkt)
markup_mkt <- 1 + kappa * xi_mkt
price_mkt <- mc_mkt + markup_mkt
cat("corr(price, xi):",
round(cor(as.vector(price_mkt), as.vector(xi_mkt)), 3), "\n")corr(price, xi): 0.792
次に、logitの選択確率を計算し、そこから一人につき一つの選択を抽出する。個票のchosenが0ならoutside、1〜4なら購入した商品の番号である。市場内では価格・属性が共通なので、それらは市場番号を使って個票と対応づけられる。
delta_true <- intercept_true + beta_true * x_mkt -
alpha_true * price_mkt + xi_mkt
exp_delta <- exp(delta_true)
prob_true <- cbind(outside = 1, exp_delta) / (1 + rowSums(exp_delta))
micro_df <- data.frame(
market = rep(seq_len(T_mkt), each = N_per_market),
person = rep(seq_len(N_per_market), times = T_mkt),
chosen = integer(T_mkt * N_per_market)
)
for (t in seq_len(T_mkt)) {
rows <- ((t - 1L) * N_per_market + 1L):(t * N_per_market)
micro_df$chosen[rows] <- sample.int(
J_mkt + 1L, N_per_market, replace = TRUE, prob = prob_true[t, ]
) - 1L
}
head(micro_df) market person chosen
1 1 1 4
2 1 2 4
3 1 3 1
4 1 4 4
5 1 5 4
6 1 6 1
ここから推定に渡すのは、個票の選択結果と、観測変数\(x,p,w\)である。データ生成に使った\(\xi\)とprob_trueは推定には渡さない。
個票を集計し、実測シェアを作る
同じ市場の消費者がどの商品を選んだかを数え、outsideを含む人数で割る。table()で作る表は行が市場、列が選択肢0〜4に対応する。
counts <- table(micro_df$market,
factor(micro_df$chosen, levels = 0:J_mkt))
share_observed <- counts / rowSums(counts)
stopifnot(all(rowSums(counts) == N_per_market), all(counts > 0))
cat("最も少ない選択人数:", min(counts), "\n")最も少ない選択人数: 184
cat("実測シェアと選択確率の最大の差:",
round(max(abs(share_observed - prob_true)), 4), "\n")実測シェアと選択確率の最大の差: 0.0157
この標本では、すべての市場・選択肢に正の人数があり、最小でも184人が選択している。実測シェアとモデルの選択確率は完全には一致せず、最大で約1.57パーセントポイントの差がある。以下では、この個票から作った実測シェアを使う。
真の選択確率なら\(\log s_{jt}-\log s_{0t}=\delta_{jt}\)だが、実測シェアで計算すると、
\[ \log\widehat s_{jt}-\log\widehat s_{0t} =\delta_{jt}+r_{jt}, \qquad r_{jt}= \log\frac{\widehat s_{jt}}{s_{jt}} -\log\frac{\widehat s_{0t}}{s_{0t}} \]
という誤差が加わる。\(r_{jt}\)は実測シェアを反転したことによる誤差であり、共通の需要要因\(\xi_{jt}\)とは別である。対数は非線形なので、実測シェアが不偏でも\(r_{jt}\)の平均がゼロになるとは限らない。ここでは各市場の人数を多くしてこの誤差を小さくする。ロバスト標準誤差やクラスタ標準誤差を使うだけで、この誤差によるバイアスが消えるわけではない。
(i) 共通の需要ショックを無視したlogitを最尤法で推定する
最初は、価格内生性を考慮せず、\(\xi_{jt}\)を無視したlogitを推定する。係数の候補を\(\theta=(b_0,b_x,b_p)\)と書き、このモデルの予測確率を\(P_{jt}(\theta)\)とする。価格係数は\(b_p=-\alpha\)である。
市場内では全員の予測確率が同じなので、個票の対数尤度は、
\[ \ell(\theta) =\sum_t\sum_i\sum_{j=0}^J d_{ijt}\log P_{jt}(\theta) =\sum_t\sum_{j=0}^J n_{jt}\log P_{jt}(\theta) \]
と書き直せる。同じ対数確率を何度も足す代わりに、人数を掛けているだけである。コードでは右端の形を使うが、最適化しているのは個票から作ったものと同じ尤度である。
個票と同じ尤度を、選択人数でまとめて最大化する
choice_probability <- function(theta) {
v <- theta[1] + theta[2] * x_mkt + theta[3] * price_mkt
# outsideも含む最大値を引き、指数計算を安定させる。
shift <- pmax(0, apply(v, 1, max))
ev <- exp(v - shift)
denominator <- exp(-shift) + rowSums(ev)
cbind(exp(-shift), ev) / denominator
}
neg_loglik <- function(theta) {
-sum(counts * log(choice_probability(theta))) / sum(counts)
}
grad_loglik <- function(theta) {
predicted <- choice_probability(theta)[, -1, drop = FALSE]
residual <- counts[, -1, drop = FALSE] - rowSums(counts) * predicted
-c(sum(residual), sum(residual * x_mkt),
sum(residual * price_mkt)) / sum(counts)
}
naive_fit <- optim(
c(0, 0, 0), neg_loglik, gr = grad_loglik, method = "BFGS",
control = list(reltol = 1e-12, maxit = 1000)
)
stopifnot(naive_fit$convergence == 0)
alpha_naive <- -naive_fit$par[3]
cat("alpha_hat(MLE, xi omitted) =", round(alpha_naive, 3), "\n")alpha_hat(MLE, xi omitted) = 1.207
真値\(\alpha=2\)に対して、推定値は約1.207である。個票があっても、共通の需要要因を省いたモデルでは価格効果を誤って捉えている。これは、最尤法そのものの欠点ではなく、推定するモデルが価格とともに動く\(\xi_{jt}\)を扱っていないためである。
(ii) 実測シェアを反転し、OLSで推定する
次に、同じ個票から作ったシェアを反転する。市場×商品ごとに1行の表を作り、被説明変数をy_berryに入れる。
market_df <- data.frame(
market = rep(seq_len(T_mkt), times = J_mkt),
product = rep(seq_len(J_mkt), each = T_mkt),
x = as.vector(x_mkt),
w = as.vector(w_mkt),
price = as.vector(price_mkt),
share = as.vector(share_observed[, -1]),
share0 = rep(share_observed[, 1], times = J_mkt)
) %>%
mutate(y_berry = log(share) - log(share0))
head(market_df) market product x w price share share0 y_berry
1 1 1 0.8007591 -0.73215240 1.758625 0.1904 0.2144 -0.1187163
2 2 1 0.7800989 -0.04570525 1.917039 0.0704 0.1873 -0.9785183
3 3 1 0.6549053 -0.58597094 1.295371 0.1875 0.2652 -0.3467054
4 4 1 1.0155853 0.46047790 2.656236 0.0471 0.1818 -1.3506342
5 5 1 0.7895399 -0.35678287 1.799439 0.1153 0.1832 -0.4630410
6 6 1 0.8299017 0.26901231 2.060841 0.1485 0.3701 -0.9131883
ols_fit <- feols(y_berry ~ price + x, data = market_df, vcov = ~ market)
alpha_ols <- -unname(coef(ols_fit)["price"])
cat("alpha_hat(OLS) =", round(alpha_ols, 3), "\n")alpha_hat(OLS) = 1.212
反転しても、OLSの推定値は約1.212にとどまる。平均効用に戻すことはできても、価格と需要ショックの相関を処理していないためである。反転した式にOLSを当てるだけでは、価格内生性への対処は終わらない。
vcov = ~ marketは、市場内で誤差が相関することを許すクラスタ標準誤差を指定している。同じ市場の商品シェアは同じ消費者の選択から計算され、outsideのシェアも共通なので、市場をひとまとまりとして推論する。以下の2SLSとfirst-stageにも同じ指定を使う。
(iii) コストシフターを使って2SLSで推定する
このDGPでは、\(w_{jt}\)は限界費用を通じて価格を動かし、\(\xi_{jt}\)とは独立に作られている。そこで\(w_{jt}\)を価格の操作変数にする。fixestの構文y ~ x | price ~ wは、\(x\)を外生変数、priceを内生変数、wを除外された操作変数として2SLSを実行する。
iv_fit <- feols(y_berry ~ x | price ~ w, data = market_df, vcov = ~ market)
coeftable(iv_fit) Estimate Std. Error t value Pr(>|t|)
(Intercept) 1.944525 0.07916677 24.56239 6.368712e-88
fit_price -1.964417 0.03566058 -55.08650 3.046522e-214
x 1.487193 0.03184928 46.69472 3.006450e-184
attr(,"type")
[1] "Clustered (market)"
価格の係数は\(-\alpha\)なので、符号を反転して価格反応の強さを取り出す。IVの価格係数の名前はパッケージのバージョンによって接頭辞が付く場合があるため、名前にpriceを含む係数を選ぶ。
iv_price_name <- names(coef(iv_fit))[
grepl("price", names(coef(iv_fit)), fixed = TRUE)
]
alpha_iv <- -unname(coef(iv_fit)[iv_price_name])
alpha_iv_ci <- -rev(unlist(confint(iv_fit, parm = iv_price_name),
use.names = FALSE))| 推定方法 | alpha |
|---|---|
| 真値 | 2.000 |
| xiを省いたlogit MLE | 1.207 |
| Berry反転+OLS | 1.212 |
| Berry反転+2SLS | 1.964 |
2SLSの推定値は約1.964で、真値2に近づいた。この標本での95%信頼区間は[1.894, 2.034]であり、真値を含む。個票の有無を変えずに推定を比べることで、改善をもたらしたのは、反転した式に妥当なIVを使ったことだと確認できる。有限個の市場と消費者からの推定なので、真値とぴったり一致するわけではない。
操作変数が価格を動かしているか確認する
IVの条件の一つは、含まれる外生変数\(x\)を条件づけたうえで、\(w\)が価格を十分に説明することである。価格を\(x,w\)に回帰し、除外された操作変数\(w\)の係数がゼロかを検定する。ここでは除外IVが1本なので、クラスタ標準誤差によるt統計量の二乗が、1本の係数に対するWald Fになる。
first_stage <- feols(price ~ x + w, data = market_df, vcov = ~ market)
t_w <- coeftable(first_stage)["w", "t value"]
partial_F_w <- unname(t_w^2)
cat("excluded-IV partial F (w | x):", round(partial_F_w, 1), "\n")excluded-IV partial F (w | x): 1087.2
この数値例ではpartial Fが約1087.2であり、価格への関連性が極端に弱いという兆候はない。ただし、first-stageが強くても、\(w\)と需要ショックが無相関だという条件は保証されない。ここではDGPで独立に生成したためその条件が成り立つ。実データでは、原材料費の変動が品質や需要も動かしていないか、別途考える必要がある。
「Fが10以上」という基準は、古典的な分散仮定などを念頭に置いた大まかな経験則であり、ここで計算したクラスタWald Fの合否基準ではない。弱IVが疑われる実証では、誤差構造や内生変数の数に合った診断・推論が必要になる。
価格反応の違いを、弾力性の違いとして読む
価格反応\(\alpha\)が小さく推定されると、値上げによる需要の減少も小さく見えてしまう。logitの自己価格弾力性と交差価格弾力性は、
\[ \eta_{jj}=-\alpha p_j(1-s_j), \qquad \eta_{jk}=\alpha p_k s_k\quad(j\ne k) \]
である。同じ価格・シェアで評価したとき、OLSとIVで弾力性がどれだけ違うかを確認しよう。ここでは価格と実測シェアを市場間で平均した値に代入する。この計算は、市場ごとに弾力性を計算して平均することとは異なる。
同じ価格・シェアで弾力性行列を比較する
mean_share <- market_df %>%
group_by(product) %>%
summarize(share = mean(share), price = mean(price), .groups = "drop")
build_elasticity <- function(alpha_hat, mean_share) {
J <- nrow(mean_share)
E <- matrix(NA_real_, J, J)
for (j in seq_len(J)) {
for (k in seq_len(J)) {
E[j, k] <- if (j == k) {
-alpha_hat * mean_share$price[j] * (1 - mean_share$share[j])
} else {
alpha_hat * mean_share$price[k] * mean_share$share[k]
}
}
}
E
}
E_true <- build_elasticity(alpha_true, mean_share)
E_ols <- build_elasticity(alpha_ols, mean_share)
E_iv <- build_elasticity(alpha_iv, mean_share)
elasticities <- list(
"真のalphaで計算した弾力性" = E_true,
"OLSのalpha推定値で計算した弾力性" = E_ols,
"IVのalpha推定値で計算した弾力性" = E_iv
)
for (label in names(elasticities)) {
cat(label, "\n", sep = "")
print(round(elasticities[[label]], 3))
cat("\n")
}真のalphaで計算した弾力性
[,1] [,2] [,3] [,4]
[1,] -3.235 0.743 0.733 0.731
[2,] 0.744 -3.285 0.733 0.731
[3,] 0.744 0.743 -3.255 0.731
[4,] 0.744 0.743 0.733 -3.327
OLSのalpha推定値で計算した弾力性
[,1] [,2] [,3] [,4]
[1,] -1.961 0.450 0.444 0.443
[2,] 0.451 -1.991 0.444 0.443
[3,] 0.451 0.450 -1.973 0.443
[4,] 0.451 0.450 0.444 -2.017
IVのalpha推定値で計算した弾力性
[,1] [,2] [,3] [,4]
[1,] -3.177 0.730 0.720 0.718
[2,] 0.731 -3.226 0.720 0.718
[3,] 0.731 0.730 -3.197 0.718
[4,] 0.731 0.730 0.720 -3.268
各行が需要の変化を見る商品、各列が価格を変える商品である。OLSの行列は、真値の行列に比べ、対角成分である自己価格弾力性の絶対値が小さい。IVの行列は真値に近い。企業がOLSの結果だけを見れば、「値上げしても客はあまり離れない」と判断してしまう。この誤認は、値付けだけでなく、次回学ぶ合併後の価格上昇の予測にも影響する。
nested logitへの拡張と、集計データへの適用
nested logitでも、需要ショックを取り出せる
ここまでplain logitで説明した反転は、nested logitにも拡張できる。商品\(j\)が属するネストを\(g\)とし、そのネスト内の選択確率を\(\bar s_{j|g,t}=s_{jt}/\sum_{k\in g}s_{kt}\)と書く。先ほどのnested logitの式から、
\[ \log s_{jt}-\log s_{0t} =x_{jt}'\beta-\alpha p_{jt} +\rho\log\bar s_{j|g,t}+\xi_{jt} \]
が得られる。plain logitの反転式に、within-nest shareの対数が加わった形である。\(\rho=0\)ならplain logitに戻る。
ネスト\(g\)の指数和を\(D_{gt}=\sum_{k\in g}\exp(\delta_{kt}/(1-\rho))\)とする。outsideを平均効用0の単独ネストとすると、
\[ \frac{s_{jt}}{s_{0t}} =\exp\left(\frac{\delta_{jt}}{1-\rho}\right)D_{gt}^{-\rho}, \qquad \log\bar s_{j|g,t} =\frac{\delta_{jt}}{1-\rho}-\log D_{gt}. \]
したがって、
\[ \log s_{jt}-\log s_{0t} =\frac{\delta_{jt}}{1-\rho}-\rho\log D_{gt} =\delta_{jt}+\rho\log\bar s_{j|g,t} \]
となる。\(\delta_{jt}=x_{jt}'\beta-\alpha p_{jt}+\xi_{jt}\)を代入すれば本文の式を得る。
この式でも、\(\xi_{jt}\)を取り出してIVの条件を使える。ただし、\(\log\bar s_{j|g,t}\)も\(\xi_{jt}\)に反応するので、通常は内生変数である。価格とwithin-nest shareの両方を内生変数として扱う場合、少なくとも2本の除外された操作変数と、両者を区別して動かす十分な変動が必要になる。IVの本数だけでなく、この関連性の条件も確認しなければならない。
IVとして使える変数
価格内生性への対処で残る重要な判断は、何を操作変数として使い、その外生性をどのように説明するかである。次は、実務・研究で使われる操作変数の候補を見ていこう。
先ほどのシミュレーションでは「コストシフター\(w\)」を操作変数として使った。実務・研究でよく使われる操作変数には、大きく3種類ある。それぞれの識別の仮定と、危ない場面を整理しておく。
コストシフター(cost shifter)
原材料費、賃金、為替レート、税制変更など、企業の限界費用を動かすが消費者の需要ショック\(\xi\)には直接影響しない変数。先ほどのシミュレーションで使ったのがこれである。
- 識別の仮定:コストシフターは価格には影響するが、\(\xi_{jt}\)(未観測の需要側の要因)とは無相関。
- 危ない場面:原材料費の高騰が、同時に商品の品質改善(例えばオーガニック素材への切り替え)を伴う場合、\(\xi\)も動いてしまい、除外制約が壊れる。
- 例:工場から販売地域までの距離は、輸送費を動かす候補になる。Miller and Weinberg (2017), p.1775 は、米国ビール市場の需要推定で、国内ブランドの最寄りの醸造所から販売地域までの道路距離に、ディーゼル燃料価格指数を掛けた変数を価格のIVとして使っている。同じ燃料価格の上昇でも、遠い市場ほど輸送費が増えるという変動を利用する。ただし、需要側の未観測要因とは無相関だという仮定が必要である。
Hausman型IV(他市場の同一製品の価格)
同じブランド製品が複数の地域市場で売られているとき、「他の地域市場における同じ製品の価格」を操作変数として使う。Hausman (1996) のシリアル需要の分析で使われた方法である。
- 識別の仮定:全国共通のコスト構造(原材料費、全国的な仕入れ交渉力)が地域を横断して価格に反映される一方、地域ごとの需要ショック\(\xi_{jt}\)は市場をまたいで独立。
- 危ない場面:全国的な広告キャンペーンやテレビCMのように、需要ショックが全国共通に動く場合、この仮定は崩れる。全国的な人気の高まりが、たまたま同じタイミングで複数の地域市場の\(\xi\)を同時に押し上げてしまうと、他市場の価格と自市場の\(\xi\)が相関し、操作変数として機能しなくなる。この点は後述のBresnahanによる批判で指摘されている。
BLP型IV(自社他製品・競合製品の属性)
Berry, Levinsohn and Pakes (1995) の標準的な構成では、自財の外生属性 \(x_j\) に加え、同じ企業が持つ他製品の属性和と他企業が持つ製品の属性和を別々に作る。前者は多製品企業のカニバリゼーション、後者は競争環境を通じてマークアップと価格を動かす。これらの除外された属性和を、一般にBLP型IVと呼ぶ。
- 識別の仮定:観測属性を条件づけたとき、他製品の属性は自財の未観測需要ショック \(\xi_{jt}\) と無相関であり、製品集合はそのショックに反応して選ばれていない。
- 直感:自社ラインナップや競合の位置が変わると、最適マークアップが変わって自財価格が動く。
- 危ない場面:企業が市場の未観測な成長性を見て参入・退出や属性を選ぶ場合、他製品属性と自財の \(\xi\) が相関し、除外制約が壊れる。
BLPについては次回詳しく見る。
Gandhi and Houde (2019, NBER WP 26375) は、競合属性の単純な和を使う操作変数では、ランダム係数など代替パターンを表すパラメータの識別が弱くなる場合があることを示した。differentiation instruments(差別化IV)は、属性の差の二乗和や、属性が近い製品の数などを使い、製品がどれだけ近い競合に囲まれているかを捉える。同論文はシミュレーションと自動車需要の分析で、推定精度や数値計算の改善を示している。ただし、属性の外生性や操作変数の強さは引き続き必要で、どの市場でも従来のIVより優れるという保証ではない。次回のrandom coefficient logitのような柔軟な需要モデルを推定する際の、有力な選択肢である。
研究の問い:新しいシリアル商品Apple-Cinnamon Cheeriosの導入は、消費者余剰をどれだけ増やしたか。その評価に必要な需要を、価格内生性に対処しながらどう推定するか。
データ:米国の都市別・ブランド別の週次販売データ。対象の新商品は1989年に発売された。
識別戦略・モデル:Hausman (1996) は、他都市の同一ブランドの価格を操作変数として需要を推定した。地域共通の費用変動が各都市の価格を動かす一方、他都市の価格は自都市の需要ショックと無相関である、という仮定に基づく。
主要な論点:Hausmanは推定した需要から新商品の厚生利得を評価した。同書所収のBresnahanのコメントは、全国的な需要ショック(広告や流行など)が他都市の価格にも反映されれば、操作変数は自都市の\(\xi\)と相関し、無効になりうると指摘している。この論争は、操作変数の妥当性が、具体的な価格設定や需要ショックの構造に依存することを示している。Hausman本文のpp.216–219とBresnahanのコメントのpp.240–242を参照。
研究の問い:スーパーマーケットのブランド選択データでも、価格内生性は無視できない大きさで効いているのか。
データ:ヨーグルトとケチャップの家庭レベルのスキャナーパネルデータ。各カテゴリについて、1店舗・3ブランドの購入を分析している。
識別戦略・モデル:Villas-Boas and Winer (1999, Management Science) は、消費者に共通する未観測の需要ショックを含むブランド選択モデルと価格設定式を組み合わせ、需要ショックと価格設定式の誤差の相関を許して同時推定した。そのうえで、内生性を考慮した場合と無視した場合の推定結果を比較している。
主要な発見:例えばDannonの自己価格弾力性は、従来モデルの\(-6.94\)に対し、内生性を考慮したモデルでは\(-10.50\)と、絶対値が大きくなった(原論文のTable 2、p.1331)。これは内生性の扱いで価格反応の推定が大きく変わる実例である。推定方法は今回のOLS・2SLSとは異なり、バイアスの方向が常に同じだと保証する結果でもない。
なぜこの講義のトピックと繋がるのか:Berry (1994) の市場レベルデータだけでなく、個票のブランド選択データでも価格内生性は無視できない問題として現れることを示した点で重要である。「個票データさえあれば内生性を気にしなくていい」というわけではないことを教えてくれる。
研究の問い:logitの特殊な関数形を離れても、シェアから平均効用を一意に取り出せるのか。
対象:具体的なデータセットに基づく実証論文ではなく、需要システムの反転可能性を扱う理論論文である。
モデル・条件:Berry, Gandhi and Haile (2013), “Connected Substitutes and Invertibility of Demand” は、connected substitutesという代替関係の条件を導入した。この講義の需要モデルに即していうと、一つの商品の魅力を高めても他の選択肢の需要は増えないという弱い代替性と、需要が実際に移る代替関係をたどると各商品からoutsideにつながるという条件である。すべての商品同士が直接強く代替する必要はない。
主要な結果:これらと定義域についての条件のもとで、需要システムが一対一になることを示した。この講義の記号では、outsideの正規化と他の需要要因を固定すれば、異なる平均効用のベクトルが同じシェアのベクトルを生まない、という意味である。したがって、モデルが生成しうるシェアから平均効用を一意に回収できる。この結果はlogitの関数形や需要関数の微分可能性を必要としない(原論文のTheorem 1・Corollary 1, p.2100)。
なぜこの講義のトピックと繋がるのか:今回の「シェアの対数差」という簡単な反転式はlogit特有だが、シェアから平均効用へ戻るという考え方は、もっと一般的な需要モデルでも使えることを支える。ただし、反転の一意性だけで価格効果が識別されるわけではない。取り出した需要ショックと価格の相関に対処するには、妥当なIVなどの追加条件が必要である。
ビジネスの現場で
自社ECサイトで、ある商品Aを値下げしたキャンペーン中に、商品Bの売上が落ちたとする。マーケティング担当者は「商品Bの客が商品Aに流れた」と結論づけ、商品Bのプロモーションを強化しようとするかもしれない。しかしこの分析には少なくとも2つの罠がある。
1つ目は、同時に起きた売上変化を、値下げの因果効果とみなしてしまうことである。競合サイトのセールや季節的な需要変化でも、商品Bの売上は動く。さらに、自社が分析者には見えない需要動向に反応して商品Aの価格を変えていれば、価格と需要ショックが相関する内生性も生じる。別のセールと一度たまたま重なったことだけで、価格が内生的だと分かるわけではない。
2つ目は、代替先の配分をモデルが強く制約することである。plain logitで予測すると、商品Aの値下げによる需要の流入元は、他商品の元のシェア比で決まる。商品Bより商品Cの方がAに似ているとしても、その近さを別に反映できない。こちらがIIAの問題である。価格内生性への対処には外生的な価格変動や妥当なIVが必要で、代替パターンへの対処にはnested logitなどの拡張が必要になる。片方を直せばもう片方も解決する、という関係ではない。
ビール類のブランドを、価格帯や飲用シーンの近さでグループ化する例を考えよう。例えば、プレミアムビール同士は、発泡酒・新ジャンルとの間より代替しやすい、という仮説をネストで表す。どのブランドを同じネストに置くかは分析者の仮定なので、分類の妥当性も確認する必要がある。店舗×週×ブランドのPOSデータに、outside optionを含む市場規模、商品属性、価格とwithin-nest shareのための妥当なIVを組み合わせれば、Berry反転+nested logitによる推定を検討できる。こうした分析は、合併審査や新製品の価格設定において、どのブランドとの競合が強いかを考える基礎になる。
多くの企業では、売上予測に機械学習モデル(勾配ブースティング木、ニューラルネットなど)を使っている。過去と同様の価格設定や市場環境のもとで「来週の売上が何個になるか」を予測することと、「価格を10%引き上げたら売上がどう変わるか」という反実仮想の問いに答えることは、異なる課題である。通常の予測モデルを観測された価格と売上に当てはめるだけでは、価格内生性は解消されない。一方、構造モデルという名前を付けたり、Berry反転で式を書き換えたりするだけでも解消しない。価格の効果を識別するには、実験による外生的な価格変動や妥当なIVなどが必要である。その条件のもとで、需要モデルは価格・商品設計の反実仮想を計算する道具になる。機械学習をそうした識別や推定の一部に使うこともできるため、両者は排他的な選択肢ではない。
まとめ
- logitモデルはIIAという強い制約を持ち、ある財の値上げに対する代替が「シェアの比率」だけで機械的に決まってしまう。似た財ほど強く競合するという直感的なパターンを表現できない。
- nested logitは財をネスト(グループ)に分け、ネスティング・パラメータ\(\rho\)を導入してこの問題を緩和する。\(\rho\)は相関そのものではないが相関を単調に動かし、\(\rho=0\)でplain logitに一致する。
- 個票があっても、価格が共通の未観測需要要因に反応して決まる問題は残る。Berry (1994) の反転は、選択確率から平均効用を取り出し、需要ショックに対するIVの条件を使える形にする。反転だけでは価格内生性は解消しない。
- 価格は未観測の需要ショック\(\xi\)と相関しやすい。企業が高い\(\xi\)を見て高価格をつける典型例、すなわち他の説明変数を条件づけても\(\operatorname{Cov}(p,\xi)>0\)となる場合、これを無視したOLS推定は価格反応\(\alpha\)を過小評価する。需要を実際より非弾力的だと誤認し、値付けや合併審査で誤った意思決定につながる危険がある。共分散が負ならバイアスの向きも逆であり、「内生性なら常に過小」とは限らない。
- コストシフター、Hausman型IV、BLP型IVといった操作変数を使った2SLSで、この内生性に対処できる。ただしどの操作変数も「除外制約」という仮定に依存しており、無条件に信頼できるわけではない。
宿題
- ブラウザ実験室(playground3.html)で、今回の内容に関連する実験の数値を自分でいじって遊んでみよう。インストール不要、ブラウザだけでRが動く(初回ロードのみ30秒〜1分かかる)。
- 今回のRシミュ3で、
kappaを0、0.4、0.8、1と変え、OLSと2SLSのalpha推定値を比較しよう。市場の乱数と個人選択の乱数を同じseedで作り直し、価格と需要ショックの相関が変わると結果がどう変わるか説明する。さらにN_per_marketを増やした場合と市場数T_mktを増やした場合を比べ、どの不確実性が小さくなるか考えよう。 - ChatGPTなどの対話AIに「nested logitのwithin-nest shareが内生変数になるのはなぜか」と質問し、返ってきた説明が今回学んだ内容と整合的かどうか検討してみよう。
- coding課題は
assignment3.qmdを参照。
次回予告
次回(第4回)は、今回のnested logitでは捉えきれない、より柔軟な代替性のパターンを扱う。nested logitは「あらかじめ決めたネスト構造」に沿ってしか代替性を表現できないという限界がある。これまでも効用ショックを通じて個人の好みの違いを表してきたが、次回学ぶrandom coefficient logit(BLPモデル)では、商品属性への評価や価格感応度そのものを消費者ごとに変える。垂直的・水平的差別化の数値例を手がかりに、ネストをあらかじめ決めずに代替パターンを表す考え方を学ぶ。この考え方は、合併によって競合企業の商品が同じ企業の傘下に入ったときに何が起きるか(合併後の価格上昇の予測)を分析する、合併分析(merger analysis)の土台になる。
参考文献
- 上武康亮・遠山祐太・若森直樹・渡辺安虎『実証ビジネス・エコノミクス』日本評論社、2025年、第3章。
- Berry, Steven T. (1994) “Estimating Discrete-Choice Models of Product Differentiation,” RAND Journal of Economics, 25(2), 242-262.
- Berry, Steven T., James Levinsohn, and Ariel Pakes (1995) “Automobile Prices in Market Equilibrium,” Econometrica, 63(4), 841-890.
- Berry, Steven T., Amit Gandhi, and Philip A. Haile (2013) “Connected Substitutes and Invertibility of Demand,” Econometrica, 81(5), 2087-2111.
- Bresnahan, Timothy F. (1996) “Comment” on Hausman, “Valuation of New Goods under Perfect and Imperfect Competition,” in The Economics of New Goods, University of Chicago Press, 237-247.
- Gandhi, Amit and Jean-Francois Houde (2019) “Measuring Substitution Patterns in Differentiated-Products Industries,” NBER Working Paper No. 26375.
- Hausman, Jerry A. (1996) “Valuation of New Goods under Perfect and Imperfect Competition,” in The Economics of New Goods, University of Chicago Press.
- McFadden, Daniel (1974) “Conditional Logit Analysis of Qualitative Choice Behavior,” in Frontiers in Econometrics, Academic Press.
- Miller, Nathan H. and Matthew C. Weinberg (2017) “Understanding the Price Effects of the MillerCoors Joint Venture,” Econometrica, 85(6), 1763-1791.
- Train, Kenneth E. (2009) Discrete Choice Methods with Simulation, 2nd ed., Cambridge University Press, Chapters 3–4.
- Trajtenberg, Manuel (1989) “The Welfare Analysis of Product Innovations, with an Application to Computed Tomography Scanners,” Journal of Political Economy, 97(2), 444-479.
- Villas-Boas, J. Miguel and Russell S. Winer (1999) “Endogeneity in Brand Choice Models,” Management Science, 45(10), 1324-1338.