差分の差分法(DID)をつかってみよう
はじめに
色々な分野でつかわれている「差分の差分法」。
以前仕事で使ったのですが、この記事では自分の中での整理も兼ねて、書籍を参考にしてまとめつつ実際に手を動かしながら見ていきます。
差分の差分法とは
差分の差分法(さぶんのさぶんほう、英: difference in differences)とは計量経済学や社会学における量的調査において用いられる、観測データによって実験的な研究を模倣するための統計手法である。'Difference-in-Differences'[1] や'DID'[2]、'DD'[3] と呼ばれることもある。差分の差分法は成果(つまり、反応変数や被説明変数)における処置(つまり、説明変数や独立変数)の効果を、処置群における成果変数の時間を通じた平均的な変化と対照群における時間を通じた変化と比較することで計算している。
後半がもろその説明になっていますね。実際に次から例で見ていきます。
例で考える
語学研修の効果を求めてみよう
ここから『計量経済学 New Liberal Arts Selection』に掲載されている内容を参考にしていきます。
具体的な例として「経済学部に所属している大学2年生が1年間"語学研修に参加”したとき、英語の成績にどのくらい影響を与えるか?」を検証したいときを考えてみましょう。
まず最初に頭に思い浮かぶのは、研修に参加している経済学部生の「1年生終了時の結果」と「2年生終了時の結果」を比較することです。
ここで
- 経済学部生 の1年生終了時の成績
- 経済学部生 の2年生終了時の成績
とすると、各学生のスコアの伸びは と表すことができます。
(※添え字のTは「treatment group」から取っている。"語学研修に参加"という「処置」を受けている「処置群」= 「treatment group」)
ここで、その期待値である は平均処置効果かどうか?(つまり、きちんと効果が求まっているのか?)を考えます。
これはNOであり、例えば
- 2年生の間に、大学受験で培った語学力が落ちてしまった
- 研修以外の通常の授業で語学力が鍛えられてしまった
など、別の要因によって1年生→2年生の段階で成績が上がったり下がったりすることがあると想像するとなんとなくイメージがつきます。
ではどうすればよいのかというと、「仮に研修が行われていなかったとするとどうなるのか?」を考えていく必要があります。
仮に研修が行われていなかったとすると…
さて、ここでさらに以下が分かっているとします。
- 語学研修に参加したのは「経済学部生」だけである
- よって「商学部生」は語学研修に参加していない
商学部生のスコアの伸びの期待値は、
をつかって と表すことができます。
(※添え字のCは対照群 = 「control group」から)
仮に経済学部生が語学研修に参加していなかった場合に、経済学部生と商学部生の1年生→2年生の語学力の変化が同じであると仮定すると、 「経済学部生の成績の伸び」 - 「商学部生の成績の伸び」を表す を計算することで、語学研修の効果を抽出することができます。
この手法で重要になってくるのが、「処置群と対照群で仮に処置がなかった場合の介入前後の変化が同じである」という、共通トレンドの仮定です。 のちにも出てきますが回帰分析によって差分の差分法を行うと、説明変数を増やすことでこの共通トレンドの仮定をより成立しやすいように定式化できます。
Rで手を動かしてみる
基本的な理論自体はそこまで複雑なものではないですね。 ここからはRで実際に手を動かしていきましょう。 『効果検証入門』という本の内容・掲載コードを参考にします。
詳細はこちらの本で解説していただいているので割愛しますが、 水源の変化とコレラの死者数に因果関係があるのかを調査した例が載っているので、これを上記の事例に置き換えて考えていくことにします。
さて、おもむろに私が適当に用意したサンプルデータを取り出してきます。 以下のように点数、経済学部生かどうか、いつの成績か(2020年 or 2021年)、が入っているデータです。12人分のデータを作成してみました。確かめたいのは、「2020年に経済学部生のみが受けた語学研修は、成績にどのくらい影響を与えるのか?」ということです。
語学研修の効果は、先程から見てきたとおり
で表すことができます。
差分の差分を求める
まずは、可視化してどのような結果になっているかを確認します。 ここで、gapは「2021年での点数の合算値」 - 「2020年での点数の合算値」を表しています。商学部生が42点、経済学部生が102点となっています。 また、gap_rateは、gapの結果が2020年の点数に対して何%かを示しています。上の表では商学部生が約4.0%に対し、経済学部生が約9.4%となっていることがわかります。
- (a)が平行トレンド仮定が満たされる場合の、「介入群にもし介入が行われていなかったときの」点数の変化
- (b)が介入による効果分の点数変化...108点
です。図示すると効果がわかりやすいですね!
回帰分析を利用したDID
ここで、回帰分析をもちいて検証を行っていきます。
- 目的変数:点数
- 経済学部かどうか(研修参加有無):
- いつのデータか(2021年のデータか):
とすると、回帰モデルは以下のように表すことができます。
まずはモデルをRで実行してみます。
> score_did # A tibble: 4 x 5 term estimate std.error statistic p.value <chr> <dbl> <dbl> <dbl> <dbl> 1 (Intercept) 1071 NaN NaN NaN 2 ecn 39.0 NaN NaN NaN 3 S21 78 NaN NaN NaN 4 ecn:S21 108 NaN NaN NaN
介入効果を表すは108となっており、先程の計算と同じ数値です。
次に、各生徒(student)をダミー変数として追加した回帰分析の結果を見てみます。
> score_did_student # A tibble: 4 x 5 term estimate std.error statistic p.value <chr> <dbl> <dbl> <dbl> <dbl> 1 (Intercept) 153. 7.82 19.6 0.00000000264 2 ecn 48.5 11.1 4.39 0.00136 3 S21 13. 5.91 2.20 0.0524 4 ecn:S21 18.0 8.35 2.15 0.0566
各生徒、18点程度成績上昇の効果が出ているということが分かります。
ここで、比率で考えるために対数変換をして回帰分析をします。
> score_did_student_log # A tibble: 4 x 5 term estimate std.error statistic p.value <chr> <dbl> <dbl> <dbl> <dbl> 1 (Intercept) 5.02 0.0485 104. 1.70e-16 2 ecn 0.275 0.0685 4.01 2.49e- 3 3 S21 0.0856 0.0366 2.34 4.15e- 2 4 ecn:S21 0.0725 0.0518 1.40 1.92e- 1
結果を見てみると、研修を受けた生徒は各生徒7%ほど点数が高くなっているということが分かります。
以上で一通り基本的な部分をおさらいできました。
以下のようなパッケージもあるみたいですね。
Getting Started with the did Package