操作変数法#
概要#
観察データから結果変数
他の変数から独立して処置
操作変数法の推定方法#
2つの方法がある
の因果効果と の因果効果を割って推定する二段階最小二乗法
どちらのアプローチでも同じ推定結果を得ることができる。
データの生成#
Show code cell source
import numpy as np
import pandas as pd
gamma = 2
beta = 4
n = 500
np.random.seed(0)
u = np.random.uniform(low=0, high=1, size=n)
z = np.random.uniform(low=-1, high=1, size=n)
x = 10 + gamma * z + 5 * u + np.random.normal(size=n)
y = 5 + beta * x + 5 * u + np.random.normal(scale=2, size=n)
df = pd.DataFrame(dict(y=y, x=x, z=z, u=u))
df.round(1).head()
y | x | z | u | |
---|---|---|---|---|
0 | 52.1 | 11.9 | -0.4 | 0.5 |
1 | 65.4 | 13.1 | -0.3 | 0.7 |
2 | 65.0 | 15.0 | 0.0 | 0.6 |
3 | 65.6 | 13.5 | 0.5 | 0.5 |
4 | 46.7 | 11.0 | -0.3 | 0.4 |
Show code cell source
import matplotlib.pyplot as plt
import seaborn as sns
sns.pairplot(df)
plt.show()

そのまま推定した場合#
次のような単回帰モデルを考える
説明変数は
回帰係数
説明変数が外生変数であるとき
となる。
説明変数が内生変数である場合、
から
から、
となる
Show code cell source
import statsmodels.api as sm
import statsmodels.formula.api as smf
from stargazer.stargazer import Stargazer
models = [
smf.ols('y ~ x', data=df).fit(),
smf.ols('y ~ x + z', data=df).fit(),
smf.ols('y ~ x + u', data=df).fit(),
]
Stargazer(models)
Dependent variable: y | |||
(1) | (2) | (3) | |
Intercept | 2.660*** | -0.074 | 6.220*** |
(0.612) | (0.699) | (0.623) | |
u | 4.926*** | ||
(0.423) | |||
x | 4.386*** | 4.603*** | 3.906*** |
(0.048) | (0.055) | (0.059) | |
z | -1.407*** | ||
(0.198) | |||
Observations | 500 | 500 | 500 |
R2 | 0.943 | 0.948 | 0.955 |
Adjusted R2 | 0.943 | 0.948 | 0.955 |
Residual Std. Error | 2.237 (df=498) | 2.133 (df=497) | 1.984 (df=497) |
F Statistic | 8275.698*** (df=1; 498) | 4575.533*** (df=2; 497) | 5326.716*** (df=2; 497) |
Note: | *p<0.1; **p<0.05; ***p<0.01 |
方法1: の因果効果と の因果効果を割って推定する#
であるため、
そのため
で推定するということ。
第一段階:
誘導型:
from patsy import dmatrices
y, X = dmatrices("x ~ z", data=df, return_type="dataframe")
model1 = sm.OLS(y, X).fit()
model1.params
Intercept 12.537640
z 1.981999
dtype: float64
y, X = dmatrices("y ~ z", data=df, return_type="dataframe")
model2 = sm.OLS(y, X).fit()
model2.params
Intercept 57.638072
z 7.716850
dtype: float64
model2.params / model1.params
Intercept 4.597203
z 3.893468
dtype: float64
方法2:二段階最小二乗法#
第一段階#
第二段階#
この推定量は二段階最小二乗(two-stage least squares: TSLS)推定量と呼ばれる。
単回帰かつ操作変数が1つの場合のTSLS推定量は
となる。
OLSを用いてTSLSを行う#
IV系のパッケージを使わずに推定する方法。TSLS推定値は得られるが標準誤差の推定はできない。
y, X = dmatrices("x ~ z", data=df, return_type="dataframe")
model1 = sm.OLS(y, X).fit()
model1.params
Intercept 12.537640
z 1.981999
dtype: float64
x_hat = model1.predict(X)
y, X = dmatrices("y ~ x_hat", data=df.assign(x_hat=x_hat), return_type="dataframe")
model2 = sm.OLS(y, X).fit()
Stargazer([model2])
Dependent variable: y | |
(1) | |
Intercept | 8.823** |
(4.039) | |
x_hat | 3.893*** |
(0.321) | |
Observations | 500 |
R2 | 0.228 |
Adjusted R2 | 0.226 |
Residual Std. Error | 8.252 (df=498) |
F Statistic | 146.832*** (df=1; 498) |
Note: | *p<0.1; **p<0.05; ***p<0.01 |
TSLS#
専用のメソッドを用いる方法。標準誤差も適切に推定できるはずだが、statsmodelsのIV2SLSはバグってる様子
from statsmodels.sandbox.regression.gmm import IV2SLS
y, X = dmatrices("y ~ x", data=df, return_type="dataframe")
result = IV2SLS(y, X, instrument=df["z"]).fit()
result.summary()
/usr/local/lib/python3.10/site-packages/statsmodels/regression/linear_model.py:1884: RuntimeWarning: invalid value encountered in sqrt
return np.sqrt(np.diag(self.cov_params()))
Dep. Variable: | y | R-squared: | -14101.824 |
---|---|---|---|
Model: | IV2SLS | Adj. R-squared: | -14130.143 |
Method: | Two Stage | F-statistic: | -8.392e-17 |
Least Squares | Prob (F-statistic): | 1.00 | |
Date: | Fri, 04 Apr 2025 | ||
Time: | 10:54:08 | ||
No. Observations: | 500 | ||
Df Residuals: | 498 | ||
Df Model: | 1 |
coef | std err | t | P>|t| | [0.025 | 0.975] | |
---|---|---|---|---|---|---|
Intercept | -904.5164 | nan | nan | nan | nan | nan |
x | -12.0000 | nan | nan | nan | nan | nan |
Omnibus: | 8.687 | Durbin-Watson: | 0.002 |
---|---|---|---|
Prob(Omnibus): | 0.013 | Jarque-Bera (JB): | 5.330 |
Skew: | 0.050 | Prob(JB): | 0.0696 |
Kurtosis: | 2.504 | Cond. No. | 78.1 |
from linearmodels.iv import IV2SLS
model = IV2SLS.from_formula("y ~ [x ~ z]", df).fit()
model
Dep. Variable: | y | R-squared: | 0.9641 |
---|---|---|---|
Estimator: | IV-2SLS | Adj. R-squared: | 0.9640 |
No. Observations: | 500 | F-statistic: | 50.264 |
Date: | Fri, Apr 04 2025 | P-value (F-stat) | 0.0000 |
Time: | 10:54:09 | Distribution: | chi2(1) |
Cov. Estimator: | robust | ||
Parameter | Std. Err. | T-stat | P-value | Lower CI | Upper CI | |
---|---|---|---|---|---|---|
x | 3.7399 | 0.5275 | 7.0897 | 0.0000 | 2.7060 | 4.7738 |
Endogenous: x
Instruments: z
Robust Covariance (Heteroskedastic)
Debiased: False
id: 0x7fadc39a91b0
例#
学習効果#
方法
:最初のセメスターのGPA :1日あたりの平均勉強時間 :ルームメイトがビデオゲームを買ったら 、買わなかったらルームメイトはランダムに割り当てられる
対象は Berea College の大学1年生(2001年)
結果
IV(TSLS)推定量:
勉強時間が1時間減ったことによるGPAの減少幅は0.36ポイント
操作変数法の推定量の特性#
操作変数の妥当性の条件#
次の2つの条件を満たす操作変数
操作変数の関連性:
操作変数の外生性:
TSLS推定量の一致性#
関連性と外生性が満たされるとき、TSLS推定量は一致性をもつ。
単回帰モデルにおけるTSLS推定量
を例にとる。
推定モデル
したがって
標本による推定量
TSLS推定量の標準誤差#
二段階最小二乗法を行う場合、二段階目のOLS推定量の標準誤差は正しくない(第一段階で推定した予測値を用いていることの考慮がされていないため)
実際に使うときは手作業で二段階最小二乗法を行うのではなく、統計分析ソフトに任せるほうがよい(更にいうと不均一分散に対して頑健な標準誤差を使うのがよい)
漸近的に(大規模標本では)、TSLSを推定量の標本分布は正規分布
(S&W、App. 12.3)
ワルド推定量#
単回帰モデル
Xは内生変数
次の条件を満たす操作変数
ダミー変数である:
外生性を満たす:
関連性を満たす:
第一段階:
誘導形:
上記の方法による推定量をワルド推定量(Wald estimator)と呼ぶ。
LATE#
操作変数は母集団全体ではなく特定のサブグループの処置割り当てに影響を与える事が多い
→ IV推定量は「母集団全体の平均処置効果」ではなく、「操作変数の変動の影響を受けるサブグループの処置効果」を捉えている
このような推定量の解釈として、局所的平均処置効果(local average treatment effect: LATE)という概念がある
誰が操作変数の影響を受けるか?#
操作変数も処置変数も二値変数のケースでは、処置変数
Always-Taker:
がなんであれ必ずNever-Taker:
がなんであれ必ずComplier:
ならば を選択し、 ならば を選択Defier:
ならば を選択し、 ならば を選択
LATE#
独立性(independence):
除外制約(exclusion restriction):
から への影響は を通じてのみ存在関連性(relevance):
は に影響を与えうる:単調性(monotonicity):
(no defier)
上記の4つの仮定が成り立つとき、
となる
証明
Defierが居ないと仮定すると
同様に
なので、
LATEの意味#
IV推定量は、操作変数によって処置変数の状況が変わるグループ(complier)における平均処置効果を捉える
Complierか否かは観測不可能→LATEは観測不可能なグループについての因果効果
操作変数が異なればLATEも異なる
外的妥当性については常に留意が必要
ITTとLATE#
実験(RCT)において、処置をランダムに割り当てても、処置に従わない人たち(non-complier)もいる
intention-to-treat (ITT) effect:処置を割り当てられた人たちにおける「処置のオファー」の平均効果
処置に従った人たち(complier)における平均処置効果は
処置の無作為割り当て(オファー)が
defierもalways-takerもなしと仮定すると?