この連載について
因果推論を「本を読んだ」で終わらせず、自分の言葉で説明でき、コードで再現できる状態まで落とす30日連載です。直前のDay 16では、回帰が因果推論の主力である理由をFWL定理まで降ろし、Cardの close_college データ(教育年数→賃金)で統制変数付きのOLSを組みました。ただし回帰で調整できるのは測れた交絡だけで、能力のような観測できない交絡は式の中に残ったままでした。今日は同じデータのまま、その残った交絡に正面から向き合います。
TL;DR(3行)
- 能力のような観測できない交絡があると、回帰は内生性で歪みます。 逃げ道は、交絡と無関係な外生の「てこ」=操作変数。Card (1995) の close_college では、大学への近さをてこにすると教育の収益率がOLSの 0.075 から2SLSの 0.134 へ1.8倍動きます。
- 操作変数の3条件(関連・外生性・除外制約)のうち、データで確認できるのは関連だけ(第1段階の部分F 16.5)。除外制約は「矢印が無いこと」の仮定で、Day 6 の非交絡性と同じく検証できません。
- てこは強さが命。 第1段階Fが小さいと2SLSはOLS側へ引き戻されます。シミュレーションでは F≈2 のとき中央値 1.56(真値1.0、OLSは2.0)。F≧10 の経験則はこの崖の話です。
今日の問い
教育年数が1年延びると賃金はいくら上がるのか。能力が高い人ほど長く学び、能力が高い人ほど稼ぐ。この「能力」はどの調査票にも載っていない。
測れない交絡が居座っているのに、それでも因果効果を推定できるか?
Day 6 と Day 16 の答えは「測れない交絡は調整では消えない」でした。今日はその手詰まりを、調整とはまったく別の原理で破ります。交絡に触らず、交絡と無関係な外からの力で処置だけを動かし、その動いた分だけを見る。操作変数法(IV)です。まず3条件を言葉にし、次に2SLSを2回の回帰で手組みして、最後に linearmodels で標準誤差と第1段階F値まで出します。
概念① 内生性と操作変数、外から処置だけを揺らす変数
回帰 $lwage = \tau , educ + X\beta + \varepsilon$ の $\varepsilon$ には、測れなかった要因が全部詰まっています。能力はその代表で、教育年数にもエラー項にも効くので $educ$ と $\varepsilon$ が相関します。この状態を内生性と呼び、OLSの係数は $\tau$ に一致しなくなります。Day 6 の言葉なら非交絡性の崩壊、Day 11 の言葉なら塞げないバックドアパスです。
ここで登場するのが操作変数(instrumental variable)$Z$ です。Card (1995) が使ったのは「育った郡に4年制大学があったか」( nearc4 )でした。大学が近いと進学のコストが下がり教育年数が延びる。一方で、家の近くに大学があったかどうかが本人の能力を変えるとは考えにくい。この $Z$ に求められる条件は3つです。
- 関連(relevance):$Z$ は処置 $X$ を実際に動かす。$Z \to X$ の矢印が存在します。これはデータで確認でき、後で第1段階のF値として測ります。
- 外生性(exogeneity):$Z$ は交絡 $U$ と無関係。$U \to Z$ の矢印が無いことを仮定します。
- 除外制約(exclusion restriction):$Z$ は $X$ を通してしか $Y$ に効かない。$Z \to Y$ の直接の矢印が無いことを仮定します。
DAGに描くと、後ろ2つの条件が「矢印が無いこと」だと分かります。存在しない矢印はデータに痕跡を残さないので、この2つは検証できません。
概念② 2SLS、てこはなぜ交絡を外すのか
$educ$ の変動を2種類に分けて考えます。大学が近かったから延びたきれいな変動と、能力が高いから延びた汚れた変動です。OLSは両方を混ぜて使うので、汚れた変動づたいに能力の効果が係数へ紛れ込みます。ならば、きれいな変動だけを使えばいい。これが2SLS(2段階最小二乗法)の発想で、文字どおり2回の回帰で実装できます。
1回目(第1段階)は $educ$ を $Z$ と外生の統制変数で回帰し、予測値 $\widehat{educ}$ を作ります。この予測値は $Z$ と統制変数の関数でしかないので、外生性が成り立つ限り能力 $U$ は乗っていません。2回目(第2段階)は $lwage$ をその $\widehat{educ}$ で回帰します。使うのはきれいな変動だけなので、係数から交絡の紛れ込みが消えます。てこの比喩で言えば、処置という重い岩を手で押す(自己選択)のをやめ、外から差し込んだてこ($Z$)で揺らし、てこが動かした分の岩の動きと、それに応じたアウトカムの動きの比を取るわけです。
もうひとつの見方が比の式です。除外制約により $Z$ が $Y$ に与える影響はすべて $X$ 経由なので、$Z$ を1単位動かしたときの $Y$ の変化(誘導形)は「$Z$ が動かした $X$ の量 × $\tau$」に等しくなります。だから
$$
\hat{\tau}_{IV} = \frac{Z \to Y \text{ の効果(誘導形)}}{Z \to X \text{ の効果(第1段階)}}
$$
分母が小さい、つまりてこが処置をほとんど動かせないと、この割り算が暴れます。これが後半の弱操作変数の話です。
手を動かす①:OLS、交絡込みの答え
データは close_college(Card 1995、 causaldata 収載)です。1976年の米国の若年男性3,010人について、教育年数( educ )、対数賃金( lwage )、育った郡の4年制大学の有無( nearc4 )が入っています。統制変数は職業経験とその2乗、人種、南部、都市部の5本です。まずは普通のOLSから。
import statsmodels.formula.api as smf
from causaldata import close_college
d = close_college.load_pandas().data
controls = "exper + I(exper**2) + black + south + smsa"
ols = smf.ols(f"lwage ~ educ + {controls}", data=d).fit()
print("N = %d" % len(d))
print("OLS: educ の係数 = %.4f (SE %.4f)" % (ols.params["educ"], ols.bse["educ"]))
print("大学が近い群の educ 平均 = %.2f 年 / 遠い群 = %.2f 年"
% (d.loc[d.nearc4 == 1, "educ"].mean(), d.loc[d.nearc4 == 0, "educ"].mean()))
N = 3010
OLS: educ の係数 = 0.0746 (SE 0.0035)
大学が近い群の educ 平均 = 13.53 年 / 遠い群 = 12.70 年
OLSの答えは 0.0746、教育1年で賃金が約7.5%増という読みです。ただしこの数字には能力の効果が混ざっている疑いが拭えません。そして3行目が今日の希望です。大学が近い群は遠い群より教育年数が 0.83年 長い。てこは実際に処置を動かしています。
手を動かす②:2SLSを2回の回帰で手組みする
概念②をそのままコードにします。第1段階で $\widehat{educ}$ を作り、第2段階で $educ$ をそれに差し替えるだけです。
# 第1段階: 内生変数 educ を、操作変数 nearc4 と外生の統制変数だけで説明する
st1 = smf.ols(f"educ ~ nearc4 + {controls}", data=d).fit()
print("第1段階: nearc4 の係数 = %.4f (t = %.2f)"
% (st1.params["nearc4"], st1.tvalues["nearc4"]))
# 第2段階: educ を予測値(Zが動かしたきれいな変動だけ)に差し替えて回帰する
d2 = d.assign(educ_hat=st1.fittedvalues)
st2 = smf.ols(f"lwage ~ educ_hat + {controls}", data=d2).fit()
print("第2段階: educ_hat の係数 = %.4f" % st2.params["educ_hat"])
# 検算: 誘導形(Z→Y)を第1段階(Z→X)で割っても同じ答えになる
rf = smf.ols(f"lwage ~ nearc4 + {controls}", data=d).fit()
print("誘導形 %.4f / 第1段階 %.4f = %.4f"
% (rf.params["nearc4"], st1.params["nearc4"],
rf.params["nearc4"] / st1.params["nearc4"]))
第1段階: nearc4 の係数 = 0.3342 (t = 4.06)
第2段階: educ_hat の係数 = 0.1338
誘導形 0.0447 / 第1段階 0.3342 = 0.1338
2SLSの答えは 0.1338、OLSの1.8倍です。検算行が概念②の比の式で、大学の近さが賃金を0.0447動かし、教育年数を0.3342動かすので、教育1年あたりに直すと 0.0447 / 0.3342 = 0.1338。2段階の回帰と割り算が同じ答えになることを確認できました。ひとつ注意があります。この手組みの第2段階が出す標準誤差は使えません。残差の計算が本物の $educ$ ではなく $\widehat{educ}$ 基準になっていて、不確かさを正しく測れないからです。点推定の仕組みを見るのが手組みの役目で、報告に使う標準誤差は次の専用実装に任せます。
手を動かす③:linearmodels で標準誤差と第1段階F値
from linearmodels.iv import IV2SLS
iv = IV2SLS.from_formula(
f"lwage ~ 1 + {controls} + [educ ~ nearc4]", data=d
).fit(cov_type="unadjusted")
b, se = iv.params["educ"], iv.std_errors["educ"]
print("2SLS: educ の係数 = %.4f (SE %.4f, 95%%CI [%.3f, %.3f])"
% (b, se, b - 1.96 * se, b + 1.96 * se))
print("第1段階の部分F = %.1f" % iv.first_stage.diagnostics["f.stat"].iloc[0])
2SLS: educ の係数 = 0.1338 (SE 0.0500, 95%CI [0.036, 0.232])
第1段階の部分F = 16.5
点推定は手組みと同じ 0.1338、正しい標準誤差は 0.0500 です。OLSのSE 0.0035 と比べると14倍。きれいな変動だけを使うということは、情報の大部分を捨てるということでもあり、95%CIは [0.036, 0.232] と幅広です。交絡を外す代わりに精度を差し出す、これがてこの代償です。信頼区間の下端3.6%と上端23.2%では、政策の場で言えることがまるで違います。私はこの幅を見て、交絡を外せた達成感より、この数字で何かを主張していいのかという居心地の悪さが先に来ました。なお Card の原論文は、より多くの統制変数を入れた仕様で OLS 0.073・2SLS 0.132 前後を報告しており、今日の簡略版とほぼ同じ水準です。
最後の行の第1段階の部分F = 16.5 が、てこの強さの計器です。操作変数が1本なら第1段階の $t$ 値の2乗(4.06² ≒ 16.5)に一致します。なぜこの数字を必ず見るのか。てこが弱いと、概念②の比の式の分母がゼロ近くを漂い、2SLSは不安定になるだけでなく、OLSの答えの側へ系統的に引き戻されます。真値1.0・OLSの答え2.0になる合成データで、てこの強さだけを変えて4,000回ずつ繰り返した結果が下の図です。F≈2 では2SLSの中央値は 1.56 と交絡バイアスの半分以上を残し、四分位範囲は [0.52, 2.57] と使い物になりません。F≈10 で中央値 1.01 と真値に乗りますが、四分位範囲はまだ [0.60, 1.32] あります。弱い操作変数の2SLSは「バイアスが戻ってきたのに、信頼区間だけ狭く見える」最悪の組み合わせになりえます。F≧10 という有名な経験則(Staiger & Stock)は、この崖から離れるための目安です。今日の16.5は目安を超えていますが、余裕綽々でもありません。
つまづき・誤解しやすい点
- 「操作変数の妥当性を検定しました」は原理的に言えません。 検証できるのは関連(第1段階F)だけで、除外制約と外生性は「矢印が無いこと」の仮定です。Day 6 の非交絡性とまったく同型の告白で、だからIVは交絡の問題を消したのではなく、検証できない仮定を非交絡性から除外制約へ置き換えたのです。大学の近さなら「都市部の労働市場が賃金に直接効くのでは」という疑いに対し、Card は都市部・南部を統制して矢印を細らせていますが、これは証明ではなく議論です。
- 第1段階が有意ならOKではありません。 t = 2 で有意でも F = 4 で、Fig 3 の崖の中です。弱いてこは推定値をOLS側へ引き戻したうえ、見かけの標準誤差を信用できなくします。第1段階のF値(操作変数が複数なら部分F)を必ず報告し、10を下回ったら結論を出す前に設計へ戻ります。
- 2SLSがOLSより大きいのは変ではないのか、は良い違和感です。 能力バイアスならOLSは過大のはずで、向きが逆に見えます。定番の説明は、教育年数の測定誤差がOLSを下向きに薄めること、そして2SLSが推定しているのが全員の平均ではなくてこで動いた人たち(大学が近ければ進学した層)の効果だということです。この「動いた人の効果」=LATEの正体は、Day 21 で非遵守のRCTを舞台にまとめて掘ります。
GISデータ実務での使い方
- 操作変数は探すものです。 自治体の施策効果を測りたいのに導入は自己選択、という場面で、導入意欲とは無関係に導入を左右した制度のギザギザが使えることがあります。補助金採択の当落、国のモデル事業指定、法改正で生じた適用条件の線引きなどです。てこの条件は今日の3つ、施策を実際に動かし、自治体の意欲と無関係で、施策を通してしか成果に効かないこと。
- 距離は手軽なてこに見えて、除外制約が壊れやすい変数です。 空間データでは「先行事例からの距離」「データセンターへの近さ」のような距離IVをすぐ思いつきますが、距離は都市化・地形・財政力と結びついていて、アウトカムへの直接経路を残しがちです。Card が都市部ダミーを統制した理由がそのまま教訓になります。空間的に相関する交絡の扱いは Day 28 で本格的に掘ります。
- 第1段階Fの報告をルーチンにします。 IVを使う分析レビューでは、点推定より先に第1段階の強さと除外制約の議論を見ます。F値1つで Fig 3 のどの箱にいるかが分かり、弱いてこの「狭く見える信頼区間」に騙されなくなります。
参考(本棚)
- Imbens & Rubin『Causal Inference for Statistics, Social, and Biomedical Sciences』第23〜25章。操作変数分析を潜在的結果の言葉で再構成した部。Day 21 のLATEの下敷きでもある
- Matheus Facure『Causal Inference in Python』第11章。非遵守と操作変数。2SLSの実装視点で今日のもう1枚の下敷き
- Wooldridge『Introductory Econometrics』IV・2SLSの章。内生性・弱操作変数・標準誤差の標準的な教科書
- Card (1995) "Using Geographic Variation in College Proximity to Estimate the Return to Schooling"。データの本家。統制変数を増やした仕様で OLS 0.073・2SLS 0.132 前後を報告
- データ: close_college(
causaldataパッケージ経由、MITライセンス、取得日2026-08-15)。Card (1995) が使った NLS Young Men 1976年断面の抽出データ
次回予告(Day 18)
今日のてこは、うまい操作変数が見つかったときの武器でした。でも多くの現場には、てこ役の変数がそう都合よく転がっていません。代わりに手元へよく転がっているのが時間です。施策の前と後、導入した群としていない群。前後差を2回引くことで「時代の波」ごと交絡を消すのが、次回Day 18 の**差分の差分法(DID)**です。カリフォルニア州の臓器提供制度変更の実データで、2×2の手計算から固定効果回帰、平行トレンドの検査まで組みます。


