今までの分析ではすべてクロスセクション(横断面)データまたは時系列データを想定していた。
customer <- read.table("customer.txt", header = T)
head(customer)
## ID gender age freq DM ## 1 1 0 36 2 0 ## 2 2 1 31 5 1 ## 3 3 0 34 1 0 ## 4 4 1 26 4 1 ## 5 5 0 28 3 0 ## 6 6 0 25 1 0
sales <- read.table("sales.txt", header = T)
head(sales)
## date units price disp feat temp ## 1 1 27 130 0 A 24 ## 2 2 23 130 0 A 23 ## 3 3 41 120 1 A 27 ## 4 4 39 120 1 A 26 ## 5 5 18 130 0 A 21 ## 6 6 24 130 0 A 21
複数時点における, 同一の人々(企業、国々)の観測値からなるデータをパネル・データ(panel data)と呼ぶ。
life <- read.csv("life_xt.csv")
head(life)
## id t income life shock y2 shock_y2 ## 1 1 1 300 3 0 0 0 ## 2 1 2 300 1 0 1 0 ## 3 2 1 300 3 1 0 0 ## 4 2 2 300 4 1 1 1 ## 5 3 1 50 3 1 0 0 ## 6 3 2 300 2 1 1 1
いくつかあるデータセットを合わせて一つのデータセットにすることを、データを一括またはプールする(pool)と言う。
パネルデータの利点の一つは、データをプールすることにより標本数を大きくすることができることである。
ある政策が与える影響を計測することを考える。
一般的に、政策の影響の有無によって2つのグループを考える。
各個人がどちらのグループに入るかは無作為に決まっているとすると、政策の効果は、ただ単に政策実施前と後の(平均値の)変化を二つのグループ間で比較するだけでわかる。
例えば、1995年に補助金制度が導入され、その前後の平均所得が以下のように与えられているとする。
| 補助金あり | 補助金なし | |
|---|---|---|
| 1990年 | 600万円 | 700万円 |
| 2000年 | 550万円 | 600万円 |
しかし、一括されたクロスセクション・データを用いて両グループの所得の減少分を比較すると以下のようになる。
2つの時点を\(t=1,2\)とし、対照群をグループ\(A\)、処置群をグループ\(B\)とする。
\[ (Y_{2,B} - Y_{2,A}) - (Y_{1,B} - Y_{1,A}) = (Y_{2,B} - Y_{1,B}) - (Y_{2,A} - Y_{1,A}) \]
\[(550 - 600) - (600 - 700) = 50\]
各個人のより詳細な情報がある場合は、多重回帰モデルを用いてより精度の高い「差の差の推定」ができる。
\(T_{i}\):対照群であれば1、そうでなければ0となる政策ダミー変数
\(AFTER_{t}\):政策実施後(時点\(t=2\))であれば1、そうでなければ0となる時間ダミー変数
\(T_{i} \times AFTER_{t}\):上記2つのダミー変数の交差項
\[ Y_{it} = \beta_{0} + \beta_{1}T_{i} + \beta_{2}AFTER_{t} + \beta_{3}(T_{i} \times AFTER_{t}) + u_{it} \\ \hspace{10em} (i=1,2,\cdots,n, \quad t = 1,2) \]
各個人がどちらのグループに入るかが無作為には決まっていない場合も多い。
多重回帰モデルによる「差の差の推定」であれば、成果変数\(Y\)に効果を与えると考えられる外的条件をできるだけ制御しながら分析できる。
この点で、回帰分析に基づいた差の差の推定は、単なる平均値の比較に基づいた差の差の推定よりも優れている。
このような自己選択問題を解決するために、次のような方法が行われている。
簡単化のため、2時点分のパネル・データを用いて、次の多重回帰モデルを推定することを考える。 \[ Y_{it} = \beta_{0} + \beta_{1}X_{1it} + \cdots + \beta_{K}X_{Kit} + v_{i} + u_{it} \\ \qquad (i=1,2,\cdots,n, \quad t = 1,2) \]
\(v_{i}\)は観測できないので、実際に推定できるのは以下の多重回帰モデルである。 \[ Y_{it} = \beta_{0} + \beta_{1}X_{1it} + \cdots + \beta_{K}X_{Kit} + e_{it} \\ \qquad (i=1,2,\cdots,n, \quad t = 1,2) \]
パネル・データを使って個別効果\(v_{i}\)を制御する方法は、実は大変簡単である。
この1階の差分をとった回帰モデルには定数項\(\beta_{0}\)が含まれていないが、時点1と時点2で定数項が異なるモデルを推定することもできる。
自己選択があるときに差の差の推定法を使って政策効果を評価したいときには、観測できる外的条件をできるだけ制御することが望ましい。
3期間以上のパネル・データがある場合も、同様の方法により差の差の推定量を求めることができる。
病気やけがをすると生活の満足度は下がるのかを調べるために、次のような多重回帰モデルを考える。
\[ \begin{align*} life_{it} &= \beta_{0} + \beta_{1}shock_{i} + \beta_{2}D_{t} + \beta_{3}(shock_{i} \times D_{t}) \\ &\quad + \beta_{4}income_{it} + v_{i} + u_{it} \quad (i=1,2,\cdots,n, \ t = 1,2) \end{align*} \]
3020人分の2007年(\(t=1\))と2009年(\(t=2\))について、以下の変数が収録されているデータセットを用いる。
y2:2009年(\(t=2\))であれば1、そうでなければ0となるダミー変数shock_y2:\(shock\)とy2との交差項(2009年(\(t=2\))で、かつ2008年に病気やけがで仕事を休んだことがあれば1、そうでなければ0となるダミー変数)#データの読み込み
life <- read.csv("life_xt.csv", header = TRUE)
head(life)
## id t income life shock y2 shock_y2 ## 1 1 1 300 3 0 0 0 ## 2 1 2 300 1 0 1 0 ## 3 2 1 300 3 1 0 0 ## 4 2 2 300 4 1 1 1 ## 5 3 1 50 3 1 0 0 ## 6 3 2 300 2 1 1 1
2009年(\(t=2\))のデータを使って推定すると次のようになる。
#t=2期目(2009年)のデータを使って最小2乗法で回帰 reg1 <- lm(life ~ shock + income, data = subset(life, t==2)) summary(reg1)$coef #係数の部分を抽出
## Estimate Std. Error t value Pr(>|t|) ## (Intercept) 2.673655978 3.053003e-02 87.574622 0.000000e+00 ## shock -0.124873176 3.460058e-02 -3.608991 3.123859e-04 ## income 0.000282184 7.100621e-05 3.974075 7.230822e-05
個別効果を考慮するために2時点のデータを使って一階の差分をとった回帰モデル \[ \Delta life_{i} = \beta_{2} + \beta_{3}shock_{i} + \beta_{4} \Delta income_{i} + \Delta u_{i} \] を推定すると次のようになる。
#t=1のデータを抽出 life_s1 <- subset(life, t == 1) head(life_s1)
## id t income life shock y2 shock_y2 ## 1 1 1 300 3 0 0 0 ## 3 2 1 300 3 1 0 0 ## 5 3 1 50 3 1 0 0 ## 7 4 1 400 3 1 0 0 ## 9 5 1 200 3 0 0 0 ## 11 6 1 0 2 0 0 0
#t=2のデータを抽出 life_s2 <- subset(life, t == 2) head(life_s2)
## id t income life shock y2 shock_y2 ## 2 1 2 300.0 1 0 1 0 ## 4 2 2 300.0 4 1 1 1 ## 6 3 2 300.0 2 1 1 1 ## 8 4 2 400.0 3 1 1 1 ## 10 5 2 200.0 3 0 1 0 ## 12 6 2 12.5 2 0 1 0
#t=2とt=1の差分を取る life_ds <- life_s2 - life_s1 head(life_ds)
## id t income life shock y2 shock_y2 ## 2 0 1 0.0 -2 0 1 0 ## 4 0 1 0.0 1 0 1 1 ## 6 0 1 250.0 -1 0 1 1 ## 8 0 1 0.0 0 0 1 1 ## 10 0 1 0.0 0 0 1 0 ## 12 0 1 12.5 0 0 1 0
#差分を取ったデータを使って最小2乗法で回帰 reg2 <- lm(life ~ shock_y2 + income , data = life_ds) summary(reg2)$coef
## Estimate Std. Error t value Pr(>|t|) ## (Intercept) 0.215364628 0.0313549979 6.868590 7.842428e-12 ## shock_y2 -0.140117408 0.0484445201 -2.892327 3.851366e-03 ## income 0.000223286 0.0001614093 1.383353 1.666590e-01
shock_y2)の係数は有意に負となる。plm関数plmのオプションでmodel = "fd"と指定することで、1階差分法によって回帰モデルを推定することができる。
#パネル・データ分析用パッケージインストール
install.packages("plm")
## Installing package into '/cloud/lib/x86_64-pc-linux-gnu-library/4.3' ## (as 'lib' is unspecified)
#パネル・データ分析用パッケージ読み込み library(plm)
#plmパッケージを用いて,1階差分法(fd)による回帰
preg1 <- plm(life ~ shock_y2 + income, data = life,
effect ="individual", model = "fd", index = c("id", "t"))
summary(preg1)$coef
## Estimate Std. Error t-value Pr(>|t|) ## (Intercept) 0.215364628 0.0313549979 6.868590 7.842428e-12 ## shock_y2 -0.140117408 0.0484445201 -2.892327 3.851366e-03 ## income 0.000223286 0.0001614093 1.383353 1.666590e-01
時間を通じて変化しない個別効果を制御する別の推定方法として、平均差分法と呼ばれる方法がある。
先の応用例で推定した多重回帰モデルを、平均差分法で推定する。
y2と\(shock\)との交差項shock_y2も含まれている。plmのオプションでmodel = "within"と指定することで、平均差分法によって回帰モデルを推定することができる。#パネル・データ分析用パッケージ読み込み
library(plm)
#固定効果モデル(within)を用いた回帰
preg1 <- plm(life ~ shock + y2 + shock_y2 + income, data = life,
effect ="individual", model = "within", index = c("id", "t"))
summary(preg1)$coef
## Estimate Std. Error t-value Pr(>|t|) ## y2 0.215364628 0.0313549979 6.868590 7.842428e-12 ## shock_y2 -0.140117408 0.0484445201 -2.892327 3.851366e-03 ## income 0.000223286 0.0001614093 1.383353 1.666590e-01
y2の交差項shock_y2で、その係数の推定値は有意に負となっており、先ほどの1階差分法による係数と一致している。政策評価のための因果関係の見つけ方 ランダム化比較試験入門(日本評論社)
「原因と結果」の経済学 データから真実を見抜く思考法(ダイヤモンド社)