効果検証入門 4章DID(とCausal impact) 俺俺メモ
効果検証入門を買った。因果推論系はあまりちゃんと手を動かしていないので、気になったところのみ自分なりにまとめる。

- 作者:安井 翔太
- 発売日: 2020/01/18
- メディア: 単行本(ソフトカバー)
4章 DID
DIDと回帰・傾向スコアの比較
回帰および傾向スコアでは、介入・非介入群でどちらともに同質の特徴を持つサンプルが含まれている状況について考えていた。しかし、介入・非介入群で同質のサンプルがない場合も往々にしてある。
そのような場合、比較対象を自身の介入前と介入後で比較する。ただし、介入前と後で完全に同質になっているかがわからない。例えば、毎月売上が100万ずつ上昇するトレンドがある店舗において、単純に前後(3ヶ月差)の売上差を取ると「施策の効果+3*100万円」が売上差となり施策効果が過剰に見積もられる。
そのため、「介入群での前後差」「非介入群での前後差」を取って、それらの差を取る「DID(差の差)」をおこなうことで施策の効果がわかる。言い換えると、「介入群での前後差」=「施策の効果+トレンド」、「非介入群での前後差」=「トレンド」となるので、「介入群での前後差」 - 「非介入群での前後差」= 「施策の効果+トレンド」- 「トレンド」= 「施策の効果」となっている。
ただし、このとき介入群と非介入群における「トレンド」が同一のものという前提(並行トレンド仮定)が必要となることに注意。
詳細は過去記事。
DIDの欠点
①データに関して、介入群の施策前と後、非介入群の施策の前と後の計4パターンのデータが必要になる
②並行トレンド仮定が本当に満たされているかどうかを定量的に評価できない
という欠点がある。
②について、定量的ではないが、トレンドが同一になるようなサンプルを自動検出する合成コントロール(Synthetic Control)や、トレンドの乖離を共変量によって抑えるという対策がある。
Causall Impact
DIDでは非介入群での施策前後の差分からトレンドを抜き取っていたが、 Causall Impactでは非介入データから時系列予測モデルを作成し、そのモデルを介入群に適応することで介入群の施策を受けなかった状態を推定している 。 ← (追記1) 図4.4でそのようなことを書いてるように読んでしまったし、それならDIDでよくね?というかそもそも(サンプルコードで)非介入データ大量に入れてね?とかで色々ともやもやしていたが、共変量として非介入群と同じ意味のデータを使っているだけで、必ずしも使わないでも良さそう。
つまり、非介入群データがなくとも介入群が介入がなかった場合のYを予測できるデータであれば何でも利用することができる(※ ただし、施策やY自体の影響を受けるような特徴量(共変量)を追加した場合は予測結果も施策の影響を受けるのでモデルには入れないように注意する)。その際に、非介入データがあるならば都合も良いし使おう的なモチベーションっぽい(そうなると図4.4での記載が謎ではあるけど)。
というか、内部的にbsts
で状態空間モデル(+α)をしているだけなので共変量=状態空間モデルの外因性として認識したらよさそう。
https://rtokei.hatenablog.jp/entry/stan/2049/rtokei.hatenablog.jp
追記1で書いたようなことは、ここで話されてたっぽい。
以下の記事が、追記1のような疑問も含めて根本からちゃんとわかりやすく説明してたのでめっちゃ良かった。
以下では、目的変数をカルフォルニア州の各年のタバコの売上、共変量として他の州(非介入群)の各年のタバコの売上を使用している(州毎に1特徴量)。
# (11) CausalImpactを利用した分析 library(CausalImpact) ## CigarデータをCausalImpact用に整形 ### 目的変数としてカリフォルニア州の売上 だけ抜き出す Y <- Cigar %>% filter(state == 5) %>% pull(sales) ### 共変量として他の州の売上を抜き出し整形 X_sales <- Cigar %>% filter(state != 5) %>% dplyr::select(state, sales, year) %>% spread(state,sales) ### 介入が行われるデータを示す pre_period <- c(1:NROW(X_sales))[X_sales$year < 88] post_period <- c(1:NROW(X_sales))[X_sales$year >= 88] ### 目的変数と共変量をバインドする CI_data <- cbind(Y,X_sales) %>% dplyr::select(-year) ## CausalImpactによる分析 impact <- CausalImpact::CausalImpact(CI_data, pre.period = c(min(pre_period), max(pre_period)), post.period = c(min(post_period), max(post_period))) ## 結果のplot plot(impact)
図の1つ目が実測と、予測値(介入後は非介入のときの予測値、2つ目が介入効果(1つ目の予実差)、3つ目が介入効果の累積となる。
>Causall Impactでは非介入群から時系列予測モデルを作成 ←(追記2) 追記1部分で自己解決。ただ、ちゃんと元論文 or ドキュメント読んどこうと思った。
と書いたがCausalImpact::CausalImpact
へのデータの渡し方を見ると直感的にはYに対する予測モデルを特徴量=共変量(非介入群の売上など)で作成している(≠非介入群の売上モデルをYに適応)ではない気がするがどうなんだろ。。。
https://projecteuclid.org/download/pdfview_1/euclid.aoas/1430226092
https://rtokei.hatenablog.jp/entry/stan/2049/rtokei.hatenablog.jp