ある自治体が最低賃金を引き上げたとき、雇用にどのような影響があったのか。この問いに答えるために、引き上げの前後で雇用データを比較するだけでは不十分です。なぜなら、時間の経過に伴う景気変動や季節要因など、最低賃金引き上げ以外の要因がアウトカムに影響しているかもしれないからです。
差の差法(Difference-in-Differences, DID)は、この問題に対する巧みな解決策を提供します。処置を受けたグループと受けなかったグループの「処置前後の変化の差」を比較することで、時間の経過に伴う共通のトレンドを除去し、因果効果を推定します。
差の差法は以下のような政策評価の場面で広く使われています。
- 労働経済学: 最低賃金引き上げの雇用への影響(Card and Krueger, 1994の有名な研究)
- 公衆衛生: 喫煙規制の健康への影響
- 教育政策: 学校改革プログラムの学力への効果
- 都市経済学: 交通インフラ整備の経済効果
本記事では、DIDの理論を平行トレンド仮定から構築し、二元固定効果モデルとの関係を明らかにします。
本記事の内容
- DIDの基本的なアイデアと2×2設計
- 平行トレンド仮定の数理的定義
- DID推定量の導出と性質
- 二元固定効果モデルとの関係
- 平行トレンド仮定の検証方法
- Pythonによるシミュレーションと可視化
前提知識
- 因果推論入門 — 相関と因果の違い
- 平均処置効果(ATE) — ATEとATTの定義
DIDの基本的なアイデア
前後比較の限界
因果効果を推定する最も素朴な方法は、処置の前後でアウトカムを比較することです。
$$ \hat{\tau}_{\text{before-after}} = \bar{Y}_{\text{after}} – \bar{Y}_{\text{before}} $$
しかし、この前後比較は処置以外の時間変動(トレンド、季節性、景気変動など)と処置効果を区別できません。もし処置がなくてもアウトカムが上昇していたなら、前後の差は因果効果を過大に推定してしまいます。
群間比較の限界
もう一つの素朴な方法は、処置群と対照群のアウトカムを処置後に比較することです。
$$ \hat{\tau}_{\text{cross-section}} = \bar{Y}_{\text{treated, after}} – \bar{Y}_{\text{control, after}} $$
しかし、処置群と対照群がもともと異なる特性を持っている場合(選択バイアス)、この比較も因果効果を正しく反映しません。
DIDのアイデア: 差の差
DIDは、前後比較と群間比較の限界を同時に解決する方法です。処置群の「前後の差」から対照群の「前後の差」を引きます。
$$ \begin{equation} \hat{\tau}_{\text{DID}} = (\bar{Y}_{\text{treated, after}} – \bar{Y}_{\text{treated, before}}) – (\bar{Y}_{\text{control, after}} – \bar{Y}_{\text{control, before}}) \end{equation} $$
第1の差(各群内の前後差)は、各群のトレンドを含みます。第2の差(処置群の前後差 – 対照群の前後差)により、処置群と対照群に共通するトレンドが打ち消され、処置効果のみが残ります。
DIDの直感を2×2の表で整理すると分かりやすくなります。
| 処置前 | 処置後 | 差 | |
|---|---|---|---|
| 処置群 | $\bar{Y}_{1,\text{bef}}$ | $\bar{Y}_{1,\text{aft}}$ | $\Delta_1$ |
| 対照群 | $\bar{Y}_{0,\text{bef}}$ | $\bar{Y}_{0,\text{aft}}$ | $\Delta_0$ |
| DID = $\Delta_1 – \Delta_0$ |
この表から、DIDが「差の差」と呼ばれる理由が明確です。まず各群の時間的な差を取り(第1の差)、次にその差同士の差を取ります(第2の差)。
DIDのバイアス除去メカニズム
DIDがなぜ因果効果を正しく推定できるのか、バイアス除去のメカニズムを分解して理解しましょう。
アウトカムの分解を考えます。$Y_{gt}$ を群 $g$($g=1$: 処置群、$g=0$: 対照群)の時点 $t$($t=0$: 前、$t=1$: 後)のアウトカムとします。
$$ Y_{gt} = \underbrace{\mu_g}_{\text{群固有の水準}} + \underbrace{\lambda_t}_{\text{時間効果}} + \underbrace{\tau \cdot D_{gt}}_{\text{処置効果}} + \underbrace{\epsilon_{gt}}_{\text{誤差}} $$
ここで $D_{gt} = 1$ は群 $g=1$ かつ時点 $t=1$ のときのみ1です。
前後比較 $\bar{Y}_{1,\text{aft}} – \bar{Y}_{1,\text{bef}} = \lambda_1 – \lambda_0 + \tau$ には時間効果が混入しています。群間比較 $\bar{Y}_{1,\text{aft}} – \bar{Y}_{0,\text{aft}} = \mu_1 – \mu_0 + \tau$ には群間の水準差が混入しています。
DIDはこれらの「差の差」を取ることで、$\lambda$ と $\mu$ の両方を消去します。
$$ \text{DID} = (\bar{Y}_{1,\text{aft}} – \bar{Y}_{1,\text{bef}}) – (\bar{Y}_{0,\text{aft}} – \bar{Y}_{0,\text{bef}}) = (\lambda_1 – \lambda_0 + \tau) – (\lambda_1 – \lambda_0) = \tau $$
このバイアス除去メカニズムが機能するためには、時間効果 $\lambda_t$ が両群で同じであること——すなわち平行トレンド仮定——が必要です。もし時間効果が群によって異なれば(例: $\lambda_{1t} \neq \lambda_{0t}$)、DIDは $\tau + (\lambda_{11} – \lambda_{10}) – (\lambda_{01} – \lambda_{00})$ を推定してしまい、バイアスが残ります。
この「差の差」をとることが機能するための核心的な仮定が、次に述べる平行トレンド仮定です。
平行トレンド仮定
仮定の定義
平行トレンド仮定(parallel trends assumption)は、DIDの識別仮定であり、次のように述べられます。
$$ \begin{equation} E[Y(0)_{\text{after}} – Y(0)_{\text{before}} \mid D = 1] = E[Y(0)_{\text{after}} – Y(0)_{\text{before}} \mid D = 0] \end{equation} $$
ここで $D$ は群の指標($D=1$: 処置群、$D=0$: 対照群)、$Y(0)$ は処置を受けなかった場合の潜在結果です。
この仮定は「もし処置がなかったとしたら、処置群と対照群のアウトカムの時間変化は同じだっただろう」ということを言っています。レベル(水準)が同じであることは要求しません。初期時点で2群のアウトカムの平均が異なっていてもかまいませんが、その後の「変化の仕方」が同じであることを要求します。
直感的には、平行トレンド仮定は「処置群と対照群は同じ外部環境の影響を受ける」ことを意味します。景気変動や季節要因などのマクロなトレンドが両群に等しく影響するならば、この仮定は妥当です。
平行トレンド仮定がもっともらしい例を挙げましょう。隣接する2つの州の最低賃金政策を比較する場合、両州は同じマクロ経済環境にさらされているため、最低賃金以外の要因による雇用のトレンドは類似していると期待できます。一方、経済構造が大きく異なる州同士(例: 製造業州 vs サービス業州)を比較する場合、景気変動の影響が異なる可能性があり、平行トレンド仮定の妥当性は低くなります。
平行トレンド仮定と他のデザインとの比較
平行トレンド仮定がどのような位置づけにあるのかを理解するために、他の因果推定手法の識別仮定と比較しましょう。
傾向スコア法の無視可能性仮定($Y(0), Y(1) \perp\!\!\!\perp T \mid \bm{X}$)は、観測された共変量ですべての交絡が制御されることを要求します。これはレベル(水準)での比較可能性を要求する強い仮定です。
DIDの平行トレンド仮定は、レベルではなくトレンド(変化)の比較可能性のみを要求するため、無視可能性よりも弱い仮定です。処置群と対照群のアウトカムの水準が大きく異なっていても(例: 処置群の方が裕福な州であっても)、変化のパターンが同じであればDIDは有効です。
この点で、DIDは「レベルの差はあっても構わないが、トレンドの差は許さない」というデザインです。
DIDの識別
平行トレンド仮定のもとで、ATT(処置群に対する処置効果)が識別されることを示します。
処置群の処置後の期待アウトカムは次のように分解できます。
$$ E[Y_{\text{after}} \mid D=1] = E[Y(1)_{\text{after}} \mid D=1] $$
ATTは次のように定義されます。
$$ \text{ATT} = E[Y(1)_{\text{after}} \mid D=1] – E[Y(0)_{\text{after}} \mid D=1] $$
$E[Y(0)_{\text{after}} \mid D=1]$ は反事実(処置群が処置を受けなかった場合の処置後アウトカム)であり、直接観測できません。ここで平行トレンド仮定を使うと次のようになります。
$$ E[Y(0)_{\text{after}} \mid D=1] = E[Y(0)_{\text{before}} \mid D=1] + \underbrace{E[Y(0)_{\text{after}} – Y(0)_{\text{before}} \mid D=0]}_{\text{対照群の変化}} $$
すなわち、処置群の反事実は「処置群の処置前の水準 + 対照群の変化量」で推定されます。これを代入すると次のようになります。
$$ \text{ATT} = E[Y_{\text{after}} \mid D=1] – E[Y_{\text{before}} \mid D=1] – (E[Y_{\text{after}} \mid D=0] – E[Y_{\text{before}} \mid D=0]) $$
これは式(1)のDID推定量そのものです。
DIDが推定するもの: ATTとATEの違い
DIDが推定するのはATT(Average Treatment effect on the Treated、処置群に対する平均処置効果)であることに注意しましょう。ATTは処置群の反事実からのずれとして定義されます。
$$ \text{ATT} = E[Y(1) – Y(0) \mid D = 1] $$
これはATE(Average Treatment Effect)とは一般に異なります。ATEは母集団全体の平均処置効果です。
$$ \text{ATE} = E[Y(1) – Y(0)] $$
DIDがATTを推定する理由は、平行トレンド仮定が処置群の反事実に関する仮定であり、対照群のトレンドを処置群の反事実として使用するためです。処置効果に異質性がある場合(例えば、処置群と対照群で効果の大きさが異なる場合)、ATTとATEは異なる値になります。
ATEを推定したい場合は、追加の仮定が必要です。例えば、処置効果が均質(すべての個体で同じ)であるという仮定があれば、ATT = ATEが成り立ちます。あるいは、対照群に対する処置効果についても平行トレンド仮定の類似の条件を置くことで、ATEの識別が可能になります。
二元固定効果モデル
回帰による実装
DIDは以下の回帰モデルとして実装できます。
$$ \begin{equation} Y_{it} = \alpha + \beta D_i + \gamma \text{Post}_t + \tau (D_i \times \text{Post}_t) + \epsilon_{it} \end{equation} $$
ここで $D_i$ は群ダミー($D_i = 1$: 処置群)、$\text{Post}_t$ は処置後ダミー($\text{Post}_t = 1$: 処置後の期間)、$D_i \times \text{Post}_t$ は交互作用項です。
各係数の解釈は以下のとおりです。
- $\alpha$: 対照群の処置前の平均アウトカム
- $\beta$: 処置群と対照群の処置前のレベル差
- $\gamma$: 対照群の前後の変化(時間効果)
- $\tau$: DID推定量(ATT)
交互作用項の係数 $\tau$ がDID推定量であることを確認しましょう。
$$ \hat{\tau} = (\bar{Y}_{1,\text{after}} – \bar{Y}_{1,\text{before}}) – (\bar{Y}_{0,\text{after}} – \bar{Y}_{0,\text{before}}) $$
これは式(1)と一致しています。
パネルデータへの拡張
複数の時点を持つパネルデータの場合、二元固定効果モデル(two-way fixed effects model, TWFE)に拡張されます。
$$ \begin{equation} Y_{it} = \alpha_i + \gamma_t + \tau D_{it} + \epsilon_{it} \end{equation} $$
ここで $\alpha_i$ は個体固定効果(時間不変の個体特性)、$\gamma_t$ は時間固定効果(すべての個体に共通する時間変動)、$D_{it}$ は処置ダミー(個体 $i$ が時点 $t$ で処置を受けている場合に1)です。
個体固定効果 $\alpha_i$ は、観測可能であるかどうかにかかわらず、時間を通じて一定のすべての個体特性を吸収します。これにより、時間不変の未観測交絡が除去されます。時間固定効果 $\gamma_t$ は、すべての個体に共通する時間的なショックを吸収します。
TWFEの $\tau$ が2×2 DIDの推定量と等価であることを確認しましょう。個体固定効果は個体内の差分(within estimator)で除去されます。$\Delta Y_i = Y_{i,\text{after}} – Y_{i,\text{before}}$ とすると、
$$ \Delta Y_i = \Delta \gamma + \tau \Delta D_i + \Delta \epsilon_i $$
$\Delta D_i = 1$ は処置群かつ処置後の個体、$\Delta D_i = 0$ は対照群または処置前です。したがって $\hat{\tau} = \overline{\Delta Y}_{\text{treated}} – \overline{\Delta Y}_{\text{control}}$ となり、これは式(1)のDID推定量と一致します。
DIDの標準誤差
DID推定量の標準誤差の計算には注意が必要です。パネルデータでは、同一個体の複数時点の観測が相関しているため(系列相関)、通常のOLS標準誤差は過小推定されます。
Bertrand, Duflo, and Mullainathan(2004) は、DID研究における系列相関の深刻さを指摘し、以下の対処法を提案しました。
- クラスター標準誤差: 個体(またはグループ)レベルでクラスタリングしたロバスト標準誤差を使用する。これが現在最も標準的な方法
- ブロックブートストラップ: クラスター単位でブートストラップを行う方法。クラスター数が少ない場合に有効
- 集約(aggregation): 各グループの時系列を前期と後期に集約し、群×期間レベルでDIDを行う
クラスターの数が少ない場合(例: 50州のうち処置州が数州)、クラスター標準誤差の漸近近似が不正確になる問題があります。ワイルドクラスターブートストラップ(wild cluster bootstrap)がこの場合の対処法として推奨されています。
共変量の追加
DIDモデルに共変量 $\bm{X}_{it}$ を追加することで、推定の精度を向上させることができます。
$$ Y_{it} = \alpha_i + \gamma_t + \tau D_{it} + \bm{X}_{it}^\top \bm{\beta} + \epsilon_{it} $$
ただし、追加する共変量は処置の影響を受けない変数に限るべきです。処置後に変化する変数(「悪い制御変数」)を含めると、バイアスが生じます。安全なのは、処置前の値に固定した共変量(例: 処置前の年齢、性別、ベースラインのアウトカム)を使うことです。
DID推定量の分散と効率性
DID推定量の分散は、データの構造(反復横断データかパネルデータか)によって大きく異なります。
反復横断データ(repeated cross-section)の場合、各時点で異なる個体が観測されます。DID推定量の分散は、4つの群平均の分散の和として計算されます。
$$ \text{Var}(\hat{\tau}_{\text{DID}}) = \text{Var}(\bar{Y}_{1,\text{aft}}) + \text{Var}(\bar{Y}_{1,\text{bef}}) + \text{Var}(\bar{Y}_{0,\text{aft}}) + \text{Var}(\bar{Y}_{0,\text{bef}}) $$
パネルデータの場合、同一個体が複数時点で観測されるため、個体内の差分を取ることでデータの変動(個体間変動)を大幅に除去できます。個体の前後差 $\Delta Y_i = Y_{i,\text{aft}} – Y_{i,\text{bef}}$ を使うことで、個体固有の時間不変な特性が打ち消されるため、推定の効率が向上します。
この効率性の差は実務的に重要です。パネルデータが利用可能であれば、反復横断データよりも精度の高いDID推定が可能になります。
Pythonシミュレーション
シミュレーション1: DIDの基本
import numpy as np
import matplotlib.pyplot as plt
np.random.seed(42)
n_per_group = 200
# --- データ生成 ---
# 処置群のベースライン水準は対照群より高い(レベル差あり)
Y_control_before = np.random.normal(10, 2, n_per_group)
Y_treated_before = np.random.normal(12, 2, n_per_group)
# 共通トレンド(両群に同じ)
common_trend = 3.0
# 真の処置効果
true_ATT = 2.0
# 処置後
Y_control_after = Y_control_before + common_trend + np.random.normal(0, 1, n_per_group)
Y_treated_after = Y_treated_before + common_trend + true_ATT + np.random.normal(0, 1, n_per_group)
# --- DID推定 ---
did_estimate = (Y_treated_after.mean() - Y_treated_before.mean()) - \
(Y_control_after.mean() - Y_control_before.mean())
# 前後比較(バイアスあり?)
before_after = Y_treated_after.mean() - Y_treated_before.mean()
# 群間比較(バイアスあり)
cross_section = Y_treated_after.mean() - Y_control_after.mean()
print(f"真のATT: {true_ATT:.4f}")
print(f"DID推定値: {did_estimate:.4f}")
print(f"前後比較: {before_after:.4f} (共通トレンドを含む)")
print(f"群間比較: {cross_section:.4f} (レベル差を含む)")
# --- 可視化 ---
fig, ax = plt.subplots(figsize=(10, 6))
# 各群の平均の推移
times = [0, 1]
control_means = [Y_control_before.mean(), Y_control_after.mean()]
treated_means = [Y_treated_before.mean(), Y_treated_after.mean()]
# 対照群
ax.plot(times, control_means, "bo-", linewidth=2, markersize=10,
label="Control (observed)")
# 処置群
ax.plot(times, treated_means, "rs-", linewidth=2, markersize=10,
label="Treated (observed)")
# 反事実(処置群が処置を受けなかった場合)
counterfactual = [Y_treated_before.mean(),
Y_treated_before.mean() + (Y_control_after.mean() - Y_control_before.mean())]
ax.plot(times, counterfactual, "r--", linewidth=2, alpha=0.5,
label="Treated (counterfactual)")
# ATTの矢印
ax.annotate("", xy=(1.05, treated_means[1]),
xytext=(1.05, counterfactual[1]),
arrowprops=dict(arrowstyle="<->", color="green", lw=2))
ax.text(1.12, (treated_means[1] + counterfactual[1]) / 2,
f"ATT = {did_estimate:.2f}", fontsize=12, color="green",
verticalalignment="center")
ax.set_xticks([0, 1])
ax.set_xticklabels(["Before", "After"], fontsize=12)
ax.set_ylabel("Outcome Y", fontsize=12)
ax.set_title("Difference-in-Differences", fontsize=14)
ax.legend(fontsize=11, loc="upper left")
ax.grid(True, alpha=0.3)
ax.set_xlim(-0.2, 1.4)
plt.tight_layout()
plt.savefig("did_basic.png", dpi=150, bbox_inches="tight")
plt.show()
DIDの可視化から、以下の重要な構造が読み取れます。
-
処置群と対照群はベースラインで異なるレベルにありますが、これはDIDにとって問題になりません。DIDは変化の差を見るため、レベル差は打ち消されます
-
赤の破線(反事実)は、処置群が処置を受けなかった場合の推定値です。これは「処置群のベースライン + 対照群の変化量」として構成されています。平行トレンド仮定のもとでは、これが処置群の反事実を正確に反映します
-
緑の矢印(ATT)は、処置群の実際のアウトカムと反事実の差であり、DID推定量に等しくなっています。推定値は真のATT = 2.0 に近い値です
シミュレーション2: 平行トレンド仮定の違反
import numpy as np
import matplotlib.pyplot as plt
np.random.seed(42)
n = 200
# --- 平行トレンドが成り立つ場合 ---
fig, axes = plt.subplots(1, 2, figsize=(13, 5.5))
for idx, (title, trend_diff) in enumerate([
("Parallel trends (valid DID)", 0.0),
("Non-parallel trends (biased DID)", 2.0),
]):
ax = axes[idx]
# 複数期間のデータ
periods = np.arange(-3, 4) # -3 to 3, intervention at t=0
control_base = 10.0
treated_base = 12.0
common_trend_per_period = 1.0
true_effect = 3.0
control_means = control_base + common_trend_per_period * periods
treated_means_no_treatment = treated_base + (common_trend_per_period + trend_diff * (periods >= 0)) * periods
# 処置効果は t>=1 で発生
treated_means = treated_means_no_treatment.copy().astype(float)
treated_means[periods >= 1] += true_effect
ax.plot(periods, control_means, "bo-", linewidth=2, markersize=8,
label="Control")
ax.plot(periods, treated_means, "rs-", linewidth=2, markersize=8,
label="Treated")
ax.plot(periods[periods >= 1], treated_means_no_treatment[periods >= 1],
"r--", linewidth=1.5, alpha=0.5, label="Counterfactual")
ax.axvline(0.5, color="gray", linestyle=":", linewidth=1.5,
label="Intervention")
# DID推定
did = (treated_means[periods == 1][0] - treated_means[periods == 0][0]) - \
(control_means[periods == 1][0] - control_means[periods == 0][0])
ax.set_title(f"{title}\nDID estimate: {did:.1f} (true: {true_effect:.1f})",
fontsize=11)
ax.set_xlabel("Time period", fontsize=12)
ax.set_ylabel("Outcome", fontsize=12)
ax.legend(fontsize=9)
ax.grid(True, alpha=0.3)
plt.tight_layout()
plt.savefig("did_parallel_trends.png", dpi=150, bbox_inches="tight")
plt.show()
この比較から、平行トレンド仮定の重要性が明確になります。
-
左図(平行トレンドが成り立つ場合): 処置前の期間で両群のトレンドが平行であり、DID推定量は真の処置効果を正しく回復しています
-
右図(平行トレンドが成り立たない場合): 処置群が対照群よりも急速にアウトカムが上昇するトレンドを持つ場合、DID推定量にバイアスが生じます。DIDは「対照群のトレンド」を処置群の反事実として使いますが、処置群が独自のトレンドを持つとこの推定が不正確になります
平行トレンド仮定の検証
平行トレンド仮定は、処置後の反事実に関する仮定であるため、厳密には検証できません。しかし、処置前の期間のデータを使って間接的に検証することが一般的です。
処置前の複数期間で処置群と対照群のトレンドが平行であれば、処置後も平行であっただろうという推論を支持する証拠になります。具体的には以下の方法が使われます。
イベントスタディ分析(event study / dynamic DID): 処置前の各期間について、処置群と対照群のアウトカムの差を推定します。以下のモデルを推定します。
$$ Y_{it} = \alpha_i + \gamma_t + \sum_{k \neq -1} \delta_k \cdot D_i \cdot \mathbf{1}(t = k) + \epsilon_{it} $$
ここで $k$ は処置時点からの相対期間、$D_i$ は処置群ダミー、$k = -1$(処置直前期間)が基準です。
もし平行トレンド仮定が成り立つならば、処置前の各期間の推定値 $\hat{\delta}_k$($k < 0$)はすべてゼロに近いはずです。これをプレトレンド検定(pre-trends test)と呼びます。イベントスタディの結果はしばしば、$\hat{\delta}_k$ とその95%信頼区間を時間軸に沿ってプロットした「イベントスタディ・プロット」として報告されます。
ただし、プレトレンド検定には注意点があります。処置前に差がないことは、処置後の平行トレンドを保証するものではありません。特にサンプルサイズが小さい場合、処置前の差を検出する検出力が不足している可能性があります。Roth(2022)は、この問題をプレテスト・バイアス(pre-test bias)と呼び、処置前のトレンドの差がゼロでないことの非棄却を「平行トレンドの証拠」として過度に解釈することの危険性を指摘しました。プレトレンド検定はあくまで「仮定に矛盾する証拠がない」ことを確認するものであり、「仮定が正しい」ことの証明ではない点に注意が必要です。
プラセボ検定: 処置のなかった時点で「偽の処置」を設定し、DIDを推定します。偽の処置時点でDID推定量がゼロに近ければ、平行トレンド仮定を支持する証拠になります。
プラセボアウトカム検定: 処置の影響を受けないはずのアウトカム変数に対してDIDを推定し、効果がゼロに近いことを確認する方法もあります。例えば、最低賃金引き上げの影響を分析する際に、最低賃金と無関係な高所得者の雇用に対してDIDを行い、効果がゼロであることを確認します。もしプラセボアウトカムで有意な効果が検出されれば、平行トレンド仮定が疑わしいことを示唆します。
DIDの近年の発展
時差型DID(Staggered DID)の問題
多くの実証研究では、処置のタイミングが個体(またはグループ)によって異なる時差型DID(staggered DID)を扱います。例えば、米国の各州が異なるタイミングで最低賃金を引き上げた場合です。
従来、時差型DIDにもTWFEモデル式(4)が適用されてきました。しかし、Goodman-Bacon(2021) の分解により、TWFEの推定量 $\hat{\tau}$ は、異なる処置タイミングの群間のすべての2×2 DID推定量の加重平均であることが示されました。
問題は、この加重に「既に処置を受けた群」を対照群として使う比較が含まれることです。もし処置効果が時間とともに変化する(処置効果の異質性)場合、これらの比較は負の重みを持つことがあり、TWFEの推定量にバイアスが生じます。極端な場合、すべての個体に対する処置効果が正であるにもかかわらず、TWFE推定量が負になることさえあります。
新しいDID推定量
この問題に対処するため、近年多くの新しい推定量が提案されています。
Callaway and Sant’Anna(2021): 処置タイミングごとのグループと各時点の組み合わせで個別のATTを推定し、それらを適切に集約する方法。未処置の群のみを対照群として使用します。
Sun and Abraham(2021): コホート固有の処置効果を推定し、それらの加重平均としてATTを推定する方法。
de Chaisemartin and D’Haultfoeuille(2020): TWFEの負の重み問題を明示的に扱う推定量を提案。
これらの方法は、処置効果の異質性が存在する場合でもバイアスのない推定を提供します。時差型DIDを行う場合は、従来のTWFEに加えてこれらの新しい推定量も報告することが推奨されています。
Goodman-Bacon分解の直感
Goodman-Bacon(2021)の分解をもう少し直感的に理解しましょう。時差型DIDにおけるTWFE推定量は、すべての可能な2×2比較の加重平均です。これらの2×2比較には以下の3種類があります。
タイプ1: 処置群 vs 未処置群の比較: ある時点で処置を受けた群と、最後まで処置を受けない群の比較。これは問題のない「良い」比較です。
タイプ2: 早期処置群 vs 後期処置群の比較(処置前): 早期に処置を受ける群と後期に処置を受ける群を、後期群がまだ処置を受ける前に比較します。これも問題のない比較です。
タイプ3: 早期処置群 vs 後期処置群の比較(処置後): 問題が生じるのはこのタイプです。早期に処置を受けた群を「処置群」、後期処置群を「対照群」として使いますが、早期処置群は既に処置を受けています。もし処置効果が時間とともに変化する(例えば最初は大きく、徐々に減衰する)場合、この比較は「処置効果の時間変化」を「処置効果」と混同してしまいます。
このタイプ3の比較が負の重みを持つ場合があり、その結果としてTWFE推定量にバイアスが生じるのです。新しいDID推定量(Callaway and Sant’Anna等)は、タイプ3の比較を排除し、タイプ1とタイプ2の比較のみを使うことでこの問題を回避しています。
DIDの限界と対処法
平行トレンド仮定が疑わしい場合
平行トレンド仮定が成り立たない場合、DID推定量にはバイアスが生じます。以下のアプローチが代替として検討されます。
条件付き平行トレンド: 共変量 $\bm{X}$ で条件付けたうえでの平行トレンド仮定は、無条件の平行トレンド仮定よりも弱い(成り立ちやすい)です。
$$ E[Y(0)_{\text{after}} – Y(0)_{\text{before}} \mid D = 1, \bm{X}] = E[Y(0)_{\text{after}} – Y(0)_{\text{before}} \mid D = 0, \bm{X}] $$
DIDと傾向スコアの組み合わせ: 傾向スコア法をDIDと組み合わせ、処置群と類似した対照群を構成したうえでDIDを行う方法です。Abadie(2005)のセミパラメトリックDIDなどが提案されています。
合成コントロール法: 複数の対照群を重み付けして合成的な対照群を構成し、平行トレンド仮定を緩和する方法です。合成コントロール法で詳しく解説しています。
トレンドの差の感度分析: Rambachan and Roth(2023)は、処置後のトレンドの差が処置前のトレンドの差と「同程度」であると制約したもとでの推定を行う感度分析を提案しました。この方法により、平行トレンド仮定からの乖離がどの程度であれば結論が維持されるかを定量的に評価できます。
処置の波及効果(SUTVA違反)
DIDは安定的単位処置価値仮定(SUTVA: Stable Unit Treatment Value Assumption)を前提としています。SUTVAは「ある個体の潜在結果は、他の個体の処置状態に影響されない」という仮定です。
最低賃金の引き上げを例にすると、処置州の最低賃金引き上げが隣接する対照州の雇用にも影響する(例: 労働者が対照州から処置州に移動する)場合、SUTVAが違反されDID推定量にバイアスが生じます。
処置の予期効果(Anticipation)
処置の実施前に、処置が予期されて行動が変化する場合(例: 増税の発表を受けて事前に駆け込み消費が増える)、処置前のデータが「クリーンな」ベースラインとして使えなくなります。予期効果が疑われる場合は、分析期間の選択を慎重に行い、予期効果が生じうる期間をベースライン期間から除外するなどの対処が必要です。
非線形DID
標準的なDIDは加法的な構造($Y_{it} = \alpha_i + \gamma_t + \tau D_{it} + \epsilon_{it}$)を仮定しており、アウトカムがレベルで加法的であることを前提としています。しかし、アウトカムが計数データ(0以上の整数)や比率データである場合、この加法的構造は不適切なことがあります。
例えば、処置群のベースラインが対照群よりも大きい場合、同じ比率での変化は処置群の方がレベルでの変化が大きくなります。この場合、レベルでは平行トレンドが成り立たなくても、対数スケールや成長率では成り立つかもしれません。
Athey and Imbens(2006)は変化-イン-変化(Changes-in-Changes, CIC)推定量を提案しました。CICは加法的な構造に依存せず、アウトカムの分布全体に対する処置効果を推定できます。CICの識別仮定は「処置がなければ、処置群のアウトカムの分布が対照群の分布から同じ変換関数で得られる」というものであり、標準DIDの平行トレンド仮定の一般化と解釈できます。
まとめ
本記事では、差の差法(DID)の理論を解説しました。
- DIDは処置群と対照群の「変化の差」をとることで、時間不変の交絡と共通の時間トレンドを除去する
- 平行トレンド仮定はDIDの識別仮定であり、「処置がなければ両群のトレンドは同じだった」ことを要求する
- 二元固定効果モデルはDIDの回帰表現であり、個体固定効果と時間固定効果を含む
- 平行トレンド仮定はイベントスタディ分析を用いて処置前データで間接的に検証できる
- クラスター標準誤差を使用して系列相関に対処することが必須
- 時差型DIDではTWFEの負の重み問題に注意し、新しい推定量の使用を検討する
次のステップとして、以下の記事も参考にしてください。
補足: Card and Krueger(1994)の研究
DIDの最も有名な適用例であるCard and Krueger(1994)の研究を紹介しましょう。この研究は、ニュージャージー州が最低賃金を4.25ドルから5.05ドルに引き上げた際の雇用への影響を分析しました。
処置群はニュージャージー州のファストフードレストラン、対照群は隣接するペンシルベニア州の東部のファストフードレストランです。両州は地理的に隣接しており、経済環境が類似しているため、平行トレンド仮定がもっともらしいと考えられました。
驚くべきことに、分析の結果、最低賃金の引き上げ後にニュージャージー州の雇用は減少せず、むしろわずかに増加しました。これは新古典派経済学の予測(最低賃金引き上げは雇用を減少させる)と矛盾する結果であり、労働経済学に大きな議論を巻き起こしました。
この研究は、DIDが理論的に洗練されているだけでなく、現実の政策議論に重大な影響を与えうることを示す象徴的な例です。