Open4

Staggered DID の実装について

hanatahanata

Rでの実装

did というパッケージが使いやすそう。
https://bcallaway11.github.io/did/

att_gt では、介入開始が同じ値のグループごとに、介入前後の係数が推定される。

library(did)

data(mpdta)

out1 <- att_gt(yname="lemp",
               tname="year",
               idname="countyreal",
               gname="first.treat",
               xformla=NULL,
               data=mpdta)
summary(out1)

群 x 時間のパネルデータを用意する必要がある。
gnameに渡すカラムの形式に注意。

  • y_name: 被説明変数
  • tname: 時間を表す変数
  • idname: 個体を表す変数。数値に変換する必要あり。
  • gname: 介入開始の時間が格納された変数。
    • 介入群の場合、全ての時間tについて介入開始の時間が格納される。
    • 介入がない群の場合、全ての時間tについて0が格納される。
  • xformla: 説明変数

ggdid というメソッドを使えば、係数の時系列推移(event studyでよく見るやつ)をplotしてくれる。

ggdid(out1)

unbalancedなパネルデータを使う場合、引数の panel=FALSE とする。
データ数が多いと実行に時間がかかる模様。

hanatahanata

どういう時にStaggered DIDが使えるか

以下の時に利用できる。

  • 異なるグループが異なる時点で介入/処置を受ける
  • 介入は開始してから継続する
  • それぞれの介入効果に異質性がある

また、処置効果に異質性がある場合、TWFE/Event Studyだと常にバイアスが生じる。
この時にStaggered DIDが使える。
一方で、効果が同質的 or 処置が異質性と無相関であれば、TWFEでも問題ないらしい。

hanatahanata

Rで固定効果モデルを回す際に大活躍の fixest にもStaggered DIDが実装されている。
こちらは、Sun and Abraham (2020) をもとに実装されたもの。

回帰の式の中に sunab(介入開始時間を表すカラム, 時間のカラム) を加えて上げることで、推定が実行される。

library(fixest)

data(base_did)

res_sa20 = feols(y ~ x1 + sunab(year_treated, year) | id + year, base_stagg)

summaryiplot に推定結果を渡すことで、係数が算出される。こちらは didatt_gt とは異なり、各コホート x 時間で算出された係数が時間ごとに集計されたものが表示される。
didatt_gt と同じように、各コホート(介入開始時間が同一の群)ごとに係数を確認したい場合は、agg=FALSE を指定すると良い。

# 時間ごとに係数が表示される
summary(res_sa20)

# 各コホート(介入開始時間が同一の群) x 時間 ごとに係数が表示される
summary(res_sa20, agg=FALSE)