Blog

続・Synthetic Difference in Differenceの紹介


こんにちは、経済学チームの安井(@housecat442)です。

丁度去年の今頃にSynthetic Difference in Difference(SDID)という手法の簡単な紹介をこのブログで行ったのですが、先日Susan Athey大先生のtwitterで「Working PaperをMajor Revisionしたよ」っていう話が書かれていました。

丁度DID的な設定での効果の分析を行う必要がある状況だったので、updateされた論文を読み直して使ってみました。

今回は使ってみた感想をいくつか書いてみようと思います。

1. SDIDの利点をおさらいする

SDIDとは結局のところ、Difference in Difference(DID)を行う際に、サンプルに重みをつける方法です。

$$(\hat{\tau}^{SDID}, \hat{\mu}, \hat{\alpha}, \hat{\beta}) = arg min \left( \sum_{i=1}^N \sum_{t=1}^T \left( Y_{it} – \mu – \alpha_i – \beta_t – W_{it} \tau \right)^2 \hat{\omega}^{SDID}_i \hat{\lambda}^{SDID}_t  \right)$$

\( \hat{\omega}^{SDID}_i \hat{\lambda}^{SDID}_t \)はサンプル\(i,t\)の重みを表しています。もし、\(\hat{\omega}^{SDID}_i \hat{\lambda}^{SDID}_t  \)が全ての\(i, t\)に対して1であれば、これはDIDと同じ損失最小化を行っていることになります。

ちなみに、そもそもDIDとは・・・?といった方は拙著の効果検証入門を参照していただけると良いかと思います。

 

\(\hat{\omega}^{SDID}_i \hat{\lambda}^{SDID}_t  \)は見ての通り、二種類の重みの掛け合わせになっています。

1つはユーザーや店舗などの個体間につける重み\(\hat{\omega}^{SDID}_i\)です。こちらは介入が行われる前のデータにおいて、非介入群から介入群をうまく近似できるように正則化付きの誤差最小化問題を解いて重みが算出されます。つまり、介入群の介入されていない時期をうまく予測できる重みを学習していることになります。これは例えば、ある店舗 i は介入群の予測にはあまり寄与しないため非常に小さな重みがつく一方で、別の店舗 j は予測で有用であるために大きな値の重みがつくといった状態です。

もう1つは、時間軸につける重み\(\hat{\lambda}^{SDID}_t\)です。こちらは非介入群において、介入前のデータから介入後のデータをうまく近似できるように、誤差最小化問題を解くことで算出されます。つまり、非介入群において、介入後をうまく予測する重みを学習していることになります。これは例えば、ある時期 t は介入後を予測するためには重要ではないけれども、t + 1は重要なので大きな重みがつくといった状態です。

これら2つの重みを掛け合わせたものが、DIDの回帰分析においてサンプルの重みとして使われます。これら2つの重みは直感的には、

・介入群の反実仮想を予測する上で有用でない個体 i の重みを小さくし、有用な個体の重みは大きくする。

・介入群の介入時の反実仮想を予測する上で有用でない時期 t の重みを小さくし、有用な時期の重みは大きくする。

といったものになります。

このような重みをうまく利用する事で、普通のDIDに対してSDIDでは信頼区間がかなり小さくなることが、論文内では実験的に示されています。これは重みをつけたことでモデルのフィットが良くなったことに起因するとされています。論文内での実験ではSynthetic Controlもほぼ同様の恩恵がありますが、これはおそらく実験に利用された喫煙データにおいて時間間の重みを考慮するメリットがあまり無いことに依存しているのでは無いかなと思います。

Synthetic Control(SC)やCausal Impact(CI)は、同じような状況での利用が想定されている手法です。どちらの手法も基本的には個体間の重みのみを考慮した方法です。SCは最適化問題を解くことで重みを得ており、CIは正則化と状態空間モデルを利用する事で個体間の重要度を調整しています。

 

2. 使ってみた感想

とりあえず使ってみた感想をここに書いてみたいと思います。

 

微妙に周期がブレる周期的なイベントの対応

普段CausalImpactを使っている身からすると、個体間の重みに該当するものはすでに考慮していることが多いので、SDIDの大きな特徴は時系列の重みが追加されている部分にあります。

自分がよく扱うデータには、介入群の値が定期的もしくは不定期に0になるような状況が存在します。

これは例えば何かしらの問題でデータが記録されなかったり、ある期間ではある商品が品切れしていて売り上げが発生しなかったりとさまざまな理由が存在しています。

完全に周期的な現象であればseasonalityを入れることでCausal Impactでも十分に対応できますが、多少のズレが存在するような場合(例えば商品の入荷が火曜日か水曜日だったり)には対処がかなり難しいなーと思っていました。

SDIDでは一度重みの算出を通すことでこの辺りの対応を勝手にやってくれていたので、非常に良かったです。

 

どのタイミングのデータを使うか問題

企業でDID系の分析をする場合、大体どの時期のデータから使うかで悩むことになります。

観測可能な期間自体は長いものの、昔のデータは実際あてにならない可能性が高く、どこから使えば良いのかよくわかりません。

という問題に対しても、一旦思考停止して放り込んでみて、関係なさそうな期間は重みで削られることに期待するということが可能になるのは、割と嬉しいのでは無いでしょうか?

 

データのスケールに依存して結果が変わる

これはDID系のデータは大体そうだと思いますが、重みの算出に正則化を入れることでデータのスケールに対してかなり影響を受けている気がしています。

重み算出時の正則化の値は\(Y_{it} – Y_{i(t-1)}\)の分散を用います。

データのスケールが変数間で大きく異なる場合、スケールの小さい変数の係数は大きめになるため、スケールの小さい変数に対してはかなり強くパラメーターの値が押さえ込まれることになります。この結果、スケールの小さい変数はほぼ考慮されないという状態になってしまいます。

よって、特に何もnormalizeなどをしてなければ、変数の追加や対数を取っただけでもかなり結果が変わってしまいました。

これは一般的なDIDで想定しているような、州ごとやユーザーごとに同一の変数を観測して分析するような場合には、大きな問題とはならないはずです。

しかし、ウェブ企業で用いるような、検索トレンドのデータを\(Y_it\)として扱うような場合には気をつけなければならない問題だと思われます。

 

どの変数を使えば良いのか?

上の問題も相まって、変数を追加すると結構結果が変わってしまいます。

ただその結果の変化が、追加した変数が介入のタイミングで何らかの効果を受けてしまっているからなのか、それとも正則化とかを通じて何か別の変数が考慮されなくなってしまっているかとかが実際よくわかりません。

論文内では介入が行われていなく効果が0になることがわかっている期間を利用してRMSEを測って、DIDやSCとの比較を行っています。このやり方を真似すれば、変数を入れ替えしてRMSEを比較することは可能な気がしています。

しかし、実際にやってみると結構適当な変数を入れるだけでほぼフィットせずに効果の推定値は0になったりするので、この結果を全て信頼するのも少し違う気がしています。

 

3. 使うことがおすすめできる方法か?

とりあえず現状はまだやめておいた方が良い気がしました。

ただ、時系列で色々問題があるデータを扱うような場合には、既存の手法ではうまく対応できないけれども、SDIDでは対応できるという可能性が十分にあると思います。

なので、困ったら使ってみるのが良いのでは無いでしょうか?

ちなみにSDIDのgithubページはこちらにあります。

Author

アバター
yasui