R packages
library(broom)
library(devtools)
library(lmtest)
library(margins)
library(MatchIt)
library(sandwich)
library(tidyverse)
library(patchwork)
library(stargazer)
\[e_i(X_i) = Pr(D_i = 1|X_i)\] ただし \[(0≦e_i(X_i)≦1)\]
傾向スコアとは、\(X\) で条件付けられた処置 \(D\) が 1 になる確率
傾向スコアは確率 → 0 から 1 の間の値をとる (Rosenbaum and Rubin, 1983)
極端に小さい値(0.1 など)や極端に大きな値(0.9 など)は使いにくいので、分析のためには望ましくない
同じ個体に関して「処置を行い」かつ「処置を行わない」ことはできない
実験研究では、複数の個体を用意し、それらの個体を無作為に「処置群」と「統制群」に割り付けて比較可能な集団を作り、平均処置効果
(ATE) を推定できる
しかし観察研究では、処置の割り付けが無作為ではない
「処置群」と「統制群」をそのまま比較しても因果効果を適切に推定できない
そこで、処置を受ける確率(= 傾向スコア)が同じ個体同士をペアで比較すればいいのではないかと考える
傾向スコアで条件付けしてマッチングし、観測される共変量が同じ個体をペアにして、異なる個体同士を同じ個体として取り扱う
→ セレクションバイアスを除外して因果効果を推定できる
ランダム化比較試験 (RCT
) などの実験研究
では因果推論ができるのに、調査・観察データではできない理由
→ 調査・観察データでは「処置群」と「統制群」が交換できないが、ランダム化比較試験
(RCT
) では「処置群」と「統制群」が交換できるから
分析方法 | 処置を受けることを決める人 | 「処置群」と「統制群」交換可能性 | 因果推論の可否 |
ランダム化比較試験 (RCT) | 分析者 | 可能 → セレクションバイアスなし | 因果推論ができる |
調査・観察データの単純比較 | 被験者 | 不可能 → セレクションバイアスあり | 因果推論ができない |
→ 男女比にばらつきが出る → 性別による差が生じてしまう
→ この状況は交換可能ではない(=グループを入れ替えられない)
→ 平均因果効果 (ATE
) を推定できない
ランダム化比較試験 (RCT)
では被験者が分析を受けるかどうかを決めるのは分析を実施する「研究者」
→ 「処置群」と「統制群」が「均等」である
→ 「処置群」と「統制群」が交換可能である
→ 共変量の分布が確率的に同じになる → 交絡を除去できる
→ セレクションバイアスがない
→ 「処置群」と「統制群」の結果変数の平均値を群間比較する
→ 因果推論ができる
調査・観察データでは分析を受けるかどうかを決めるのは「被験者」(=
セルフセレクション)
→ 「処置群」と「統制群」が「均等」でない
→ 「処置群」と「統制群」が交換できない
→ 共変量の分布が確率的に異なる → 交絡を除去できない
→ セレクションバイアスがある
→ 因果推論はできない
調査・観察データを使って因果推論を可能にするための方法
→ 「処置群」と「統制群」が交換可能になるように調整する
→ 具体的には、重回帰分析でコントロール変数(=
制御変数)をモデルに投入する
分析の種類 | 英語表記 | 説明変数の種類 | 説明変数の数 |
単回帰分析 | simple regression analysis |
連続変数 | 1つ |
分散分析 | ANOVA: analysis of variance |
ダミー変数 | 1つ |
重回帰分析 (1) | multiple-regression analysis |
連続変数 | 2つ以上 |
重回帰分析 (2) | multiple-regression analysis |
連続変数 + ダミー変数 | 2つ以上 |
共分散分析 | ANCOVA: analysis of covariance |
連続変数 + ダミー変数 | 2つ以上 |
ATE
は推定できるが
「処置群の平均処置効果 (ATT
) 」は推定できない\[E[Y_i(1)|D_i=1, X_i = x] - E[Y_i(0)|D_i = 0, X_i = x]\\ = E[Y_i(1) |X_i = x] - E[Y_i(0)|X_i = x]\\ =E[Y_i(1) - Y_i(0)|X_i = x]\]
\[E[[E[Y_i(1) - Y_i(0)|X_i = x]] = E[Y_i(1) - E[Y_i(0)] = ATE\]
\(ATE\) を計算するためにはセレクションの原因となる共変量全てをコントロールする必要がある
共変量 \(X\) の数が多い場合:
共変量の数が増えても、セレクションの原因となる共変量全ての値に条件付けをすれば、重回帰分析によって平均処置効果 (\(ATE\)) を求めることができる
観測された共変量 \(X\)
のみがセレクションの原因なら
(=強い意味での無視可能性が成り立つなら)
→ 処置群と統制群で共変量 \(X\)
の値が同じ個体を 2 群間で比較
→ 共変量 \(X\)
が特定の値をとる場合(= 共変量 \(X\)
に条件づけられた場合)の処置効果 (\(ATE\)) が推定できる
\[E[Y_i(1)|D_i=1, X_{1j}, X_{2j},...,X_{kj}] - E[Y_i(0)|D_i = 0, X_{1j}, X_{2j},...,X_{kj}]\\ =E[Y_i(1) - Y_i(0)|X_{1j}, X_{2j},...., X_{3j}]\]
\[E[[E[Y_i(1) - Y_i(0)|X_{1j}, X_{2j},...,X_{kj}]] = E[Y_i(1) - E[Y_i(0)] = ATE\]
・例: 共変量が 5 個のモデルを考える => \(X_1, X_2, X_3, X_4, X_5\)
・例: 共変量が 5 個のモデルを考える => \(X_1, X_2, X_3, X_4, X_5\)
N
が十分大きい場合(2009年総選挙データ)voteshare
)」を「候補者が現職か否か
(inc
)」で回帰してみるinc
)」以外に、次の 4 つの共変量をモデルに含めてみる変数名 | 変数の役割 | 説明 |
---|---|---|
voteshare |
結果変数 | 候補者が得た得票率 (%) |
inc |
処置変数 | 候補者が現職(小選挙区当選者)なら 1、そうでなければ 0 |
more_exp |
共変数 | 候補者が費やす選挙費用が平均以上なら 1, 平均以下なら 0 |
male |
共変量 | 候補者が男性なら 1、女性なら 0 |
ldp |
共変量 | 候補者が自民党所属なら 1、それ以外なら 0 |
seshu_dummy |
共変量 | 候補者が世襲なら 1、それ以外なら 0 |
衆議院議員総選挙の得票データ hr96-21.csv
をダウンロード
1996年から2017年までの総選挙データ(hr96-21.csv
)
を読み込む
<- read_csv("data/hr96-21.csv", na = ".") df
names(df)
[1] "year" "pref" "ku" "kun"
[5] "wl" "rank" "nocand" "seito"
[9] "j_name" "gender" "name" "previous"
[13] "age" "exp" "status" "vote"
[17] "voteshare" "eligible" "turnout" "seshu_dummy"
[21] "jiban_seshu" "nojiban_seshu"
<- df %>%
df mutate(male = ifelse(gender == "male", 1, 0), # 男性なら 1、女性なら 0 の変数 male
inc = ifelse(status == 1, 1, 0), # 現職なら 1、それ以外なら 0 の変数 inc
ldp = ifelse(seito == "自民", 1, 0), # 自民なら 1、それ以外なら 0 の変数 ldp
more_exp = ifelse(exp > 7551393, 1, 0))# 選挙費用が平均以上なら 1、平均以下なら 0 の変数 more_exp
<- df %>%
df1 ::filter(year == 2009) %>% # 2009年総選挙データだけを抜き出す
dplyr::select(voteshare, inc, more_exp, male, ldp, seshu_dummy) # 必要な変数を指定 dplyr
<- lm(voteshare ~ inc + more_exp + male + ldp + seshu_dummy, data = df1,
model_1 family = binomial(link = "logit"))
stargazer(model_1, type = "html")
Dependent variable: | |
voteshare | |
inc | 21.506*** |
(1.496) | |
more_exp | 16.836*** |
(1.363) | |
male | 4.734*** |
(1.347) | |
ldp | -8.642*** |
(1.537) | |
seshu_dummy | 4.920*** |
(1.693) | |
Constant | 10.923*** |
(1.244) | |
Observations | 1,124 |
R2 | 0.471 |
Adjusted R2 | 0.469 |
Residual Std. Error | 16.174 (df = 1118) |
F Statistic | 199.450*** (df = 5; 1118) |
Note: | p<0.1; p<0.05; p<0.01 |
theme_set(theme_bw(base_family = "HiraKakuProN-W3"))
<- sjPlot::plot_model(model_1,
coef_sjplot1 show.values = T, #推定値の係数を表示する
show.p = T, #統計的有意性を*で表示する
vline.color = "black", #推定値=0の縦線の色を黒に指定
axis.title = "推定値", title = "N = 1124 (2009年総選挙)",
digits = 1) # 推定値の表示を小数点1桁に指定
coef_sjplot1
inc
)
を含め、全ての共変量が得票率に影響を与えており、統計的に有意だと推定N
が小さい場合(2009年総選挙データ)model_1
で使ったサンプル数は N = 1124
N = 1124
から無作為に 60
だけ抽出して小さいサンプルサイズで重回帰分析を行ってみようset.seed(5) # 何度シミュレーションしても同一の結果を得るためにシードを指定
N = 1124
から無作為に 60 だけ抽出して d60
と名前を付ける<- sample_n(df1, 60) df60
dim(df60)
[1] 60 6
<- lm(voteshare ~ inc + more_exp + male + ldp + seshu_dummy, data = df60,
model_2 family = binomial(link = "logit"))
stargazer(model_2, type = "html")
Dependent variable: | |
voteshare | |
inc | 24.365*** |
(6.410) | |
more_exp | 21.554*** |
(4.942) | |
male | 2.744 |
(4.872) | |
ldp | -6.650 |
(7.040) | |
seshu_dummy | 1.309 |
(7.138) | |
Constant | 7.623* |
(4.484) | |
Observations | 60 |
R2 | 0.626 |
Adjusted R2 | 0.591 |
Residual Std. Error | 14.382 (df = 54) |
F Statistic | 18.042*** (df = 5; 54) |
Note: | p<0.1; p<0.05; p<0.01 |
theme_set(theme_bw(base_family = "HiraKakuProN-W3"))
<- sjPlot::plot_model(model_2,
coef_sjplot2 show.values = T, #推定値の係数を表示する
show.p = T, #統計的有意性を*で表示する
vline.color = "black", #推定値=0の縦線の色を黒に指定
axis.title = "推定値", title = "N = 60 (2009年総選挙)",
digits = 1) # 推定値の表示を小数点1桁に指定
coef_sjplot2
model_1
と比較すると、サンプル数が 60 の model_2
の分析結果は大きく異なることがわかる+ coef_sjplot2 coef_sjplot1
model_1 では処置変数である現職 (inc
) は得票率を
21.5%ポイント上げるという結果
model_2 では現職だと得票率を 24.4
%ポイント上げると過大推定
model_1 ではより選挙費用を使っている候補者
(more_exp
)は得票率を 16.8%ポイント上げるという結果
model_2 ではより選挙費用を使っている候補者
(more_exp
)は得票率を
21.6%ポイント上げると過大推定
model_1 では男性候補者 (male
) は得票率を
4.7%ポイント上げるという結果
model_2
では性別は得票率と無関係という結果(統計的に有意ではない)
model_1 では自民党候補者 (ldp
) は得票率を
8.6%ポイント下げるという結果
model_2
では自民党候補者は得票率と無関係という結果(統計的に有意ではない)
model_1 では世襲候補者 (seshu_dummy
) は得票率を
4.9%ポイント上げるという結果
model_2 では世襲候補者と得票率は無関係という結果(統計的に有意ではない)
この結果はほんの一例
set.seed(5)
と設定せずにシミュレーションすると、実行する度に大きく異なる結果がでる
→ 結果が安定しない
→ 共変量が多く、サンプル数が少ないと重回帰分析による正しい推定ができない
RCT
の場合・・・処置を受ける確率は実験する人が決める
→ その確率に基づいてランダムに「処置群」と「統制群」を決める
→ セレクションバイアスが生じない
→ 因果効果を推定できる
調査・観察データの場合・・・処置を受けるかどうかは被験者が決める
→ 処置を受ける確率が、共変量の値に依存して決まる
→ 共変量の値によって、処置を受けやすい個体と、処置を受けにくい個体が発生してしまう
→ 処置を受けやすい個体のグループと、処置を受けにくい個体のグループが「交換不可能」
→ セレクションバイアスが生じる
→ 因果効果を推定できない
・例:「通院(病院に行ったこと)」と「健康状態」の関係を調査・観察データを使って調べる
3.21 < 3.93
)self-selection
)結論・ 調査・観察データを使って分析すると「病院に行くと不健康になる」という誤った推論をしてしまう可能性がある
比較対象 | 内容 |
---|---|
健康と健康 | : 健康な女性同士の比較 |
健康と健康 | : 健康な男性同士の比較 |
不健康と不健康 | : 不健康な女性同士の比較 |
不健康と不健康 | : 不健康な男性同士の比較 |
事例①:処置群の右上の枠にいる健康(健康な男性)は、もともとの健康状態の値が健康なのだから、確率的に考えると本来なら統制群(通院しない)に多くいるタイプ
→ しかし、たまたま処置群に割り振られた
→ この健康(健康な男性)は統制群にいる他の個体と似ているはず
→ この健康(健康な男性)は統制群の比較対象として(統制群の代表として)上手く使えるのではないか、と考える
事例②:統制群の左下の枠にいる不健康(不健康な女性)は、もともとの健康状態の値が悪いのだから、確率的に考えると本来なら処置群(通院する)に多くいるタイプ
→ たまたま統制群に割り振られた
→ この不健康(不健康な女性)は処置群にいる他の個体と似ているはず
→ この不健康(不健康な女性)は処置群の比較対象として(処置群の代表として)上手く使えるのではないか、と考える
変量の値をセルごとに全て揃えなくても、処置を受ける確率が同じもの同士を比較すればいいのではないかという発想を利用するのが傾向スコア
Chapter 10
の内容が最新で解説が大変わかりやすいChapter 10
で使われているデータを使い、同書に沿って「傾向スコア」について解説するpropensity score
) とはblancing score
)
と呼ばれる関数の一種傾向スコア \(e_i(X_i)\) は次の式で表すことができる
\[e_i(X_i) = Pr(D_i = 1|X_i)\] ただし \[(0≦e_i(X_i)≦1)\]
傾向スコアは確率 → 0 から 1 の間の値をとる
極端に小さい値(0.1 など)や極端に大きな値(0.9 など)は使いにくいので、分析のためには望ましくない
処置を受けやすい個体同士、あるいは処置を受けにくい個体同士を比較する
→傾向スコアが同じ(=近い)もの同士を処置群と統制群として比較
→平均処置効果 (ATE
)
が推定できる
y0t |
潜在的結果変数: \(Y_i(0)\) | 観察不可能(理論上の変数) |
y1t |
潜在的結果変数:\(Y_i(1)\) | 観察不可能(理論上の変数) |
t1 |
「t1 = 1 : 処置あり」,
「t1 = 0 : 処置なし」 |
観察可能 |
y |
結果変数 | 観察可能 |
x1 |
共変量 | 観察可能 |
ここでは、高橋将宣著『統計的因果推論の理論と実装』(2022) のサポートページで公開されている「本書で使用するデータ(zip)」をダウンロードし
data10a.csv
を使う
データを読み取る
<- read_csv("data/takahashi/data10a.csv") # パスは皆さんのパソコン環境に応じて変更して下さい df10a
::datatable(df10a) DT
y0t
と
y1t
という2
つの観察不可能な変数が観察できると想定ATE
)」
と「処置群の平均処置効果 (ATT
)
の真値」を計算できるATE
) の真値<- mean(df10a$y1t) - mean(df10a$y0t)
ATE ATE
[1] 9.95
ATT
) の真値<- mean(df10a$y1t[df10a$t1 == 1]) - mean(df10a$y0t[df10a$t1 == 1])
ATT
ATT
[1] 9.090909
人工的に設定したATT
と
ATE
の真値 (data.10a.csv
) ・ATE
の真値 = 9.95
・ATT
の真値 =
9.09
t1, y, x1
<- mean(df10a$y[df10a$t1 == 1]) # 観察できる y3 (処置を受けた人 t = 1)の平均値
tre1 tre1
[1] 83.72727
<- mean(df10a$y[df10a$t1 == 0]) # 観察できる y3 (処置を受けない人 t = 0)の平均値
con1 con1
[1] 66.33333
<- tre1 - con1
naive naive
[1] 17.39394
ATE = 9.95
) をかなり過大評価している%>%
df10a ggplot(aes(x1, y)) +
geom_point(aes(color = as.factor(t1))) +
geom_hline(yintercept = con1, color = "red", linetype = 2) +
geom_hline(yintercept = tre1, color = "blue", linetype = 2) +
annotate("label",
label = "ナイーブな推定値\n= 17.4",
x = 69, y = 75,
size = 3,
colour = "purple",
family = "HiraginoSans-W3")
t = 1
) と統制群 (t = 0
) での
x1
の分布 $t1 <- as.factor(df10a$t1) df10a
|> ggplot(aes(x = t1, y = x1)) +
df10a geom_jitter(aes(color = t1),
position = position_jitterdodge(jitter.width = 0.2,
jitter.height = 0),
show.legend = FALSE) +
geom_boxplot(aes(fill = t1),
alpha = 0.5) +
labs(x = "0:統制群、1:処置群", y = "y", fill = "",
caption = "") +
theme_bw(base_family = "HiraKakuProN-W3")
summary(df10a$x1[df10a$t1==0])
Min. 1st Qu. Median Mean 3rd Qu. Max.
66.00 70.00 74.00 74.67 78.00 88.00
summary(df10a$x1[df10a$t1==1])
Min. 1st Qu. Median Mean 3rd Qu. Max.
73.0 77.5 83.0 83.0 89.0 92.0
t = 1
) と統制群 (t = 0
) における
x1
の分布はかなり異なることがわかるb(X)
を使って、共変量
x1
の分布が処置群と統制群で同じになるように調整してみるb(X)
は共変量
x1
x1
の値が小さい順に並べ替えてバランスをとるx1 = 70
が同じt1
がどちらも 0
なので群間比較できないx1 = 73
が同じt1 = 1
(処置群)、被験者 5 は
t1 = 0
(統制群)なので群間比較できるx1 = 78
が同じt1 = 1
(処置群)、被験者 12 は
t1 = 0
(統制群)なので群間比較できるt1 = 1
) における共変量 x1
の平均値t1 = 1
) における比較可能な共変量
x1
は 73 と 78 なのでその平均値を求める73 + 78)/2 (
[1] 75.5
t1 = 0
) における共変量 x1
の平均値t1 = 0
) における比較可能な共変量
x1
は 73 と 78 なのでその平均値を求める73 + 78)/2 (
[1] 75.5
x1
の分布が同じという意味ATE
) の推定値を計算してみるt1 = 1
) における結果 y
の平均値77 + 81)/2 (
[1] 79
t1 = 0
) における結果 y
の平均値73 + 65)/2 (
[1] 69
79-69
[1] 10
人工的に設定したATT
と
ATE
の真値 (data10a.csv
) ・ATE
の真値 = 9.95
・ATT
の真値 =
9.1
・ナイーブな推定値 =
17.4
・ATE
の推定値 =
10
ATE
の真値 (9.95) や ATT
の真値 (9.1)
にかなり近い値 (10) を推定できているy0t |
潜在的結果変数: \(Y_i(0)\) | 観察不可能(理論上の変数) |
y1t |
潜在的結果変数:\(Y_i(1)\) | 観察不可能(理論上の変数) |
t1 |
「t1 = 1 : 処置あり」,
「t1 = 0 : 処置なし」 |
観察可能 |
y |
結果変数 | 観察可能 |
x1 |
共変量 | 観察可能 |
x2 |
共変量 | 観察可能 |
x3 |
共変量 | 観察可能 |
ps1 |
傾向スコア | 観察可能 |
x1
に x2
と x3
という 2
つの新たな共変量が追加され、共変量が 3 つになった
共変量が x1
だけであれば、バランシングが達成できた
共変量が 3 つになると単純なバランシングが難しい
どうするか?
解決策 → 傾向スコア
ps1
を使う
次に、傾向スコアを作成する
ここでは、高橋将宣著『統計的因果推論の理論と実装』(2022) のサポートページで公開されている「本書で使用するデータ(zip)」をダウンロードし
data10b.csv
を使う
data10b.csv
を読み取る
<- read_csv("data/takahashi/data10b.csv") df_10b
::datatable(df_10b) DT
t = 1
) と統制群 (t = 0
) における
\(x1, x2, x3\)
の分布を可視化してみるy
を処置群と統制群で比較できないblancing score
)
と呼ばれる関数の一種\[e_i(X_i) = Pr(D_i = 1|X_i)\] ただし \[(0≦e_i(X_i)≦1)\]
傾向スコアは確率 → 0 から 1 の間の値をとる
処置を受けやすい個体同士、あるいは処置を受けにくい個体同士を比較する
→ 傾向スコアが同じ(=近い)もの同士を処置群と統制群として比較
→平均処置効果 (ATE)
が推定できる
ここでは傾向スコアは ps1
(計算方法は後で解説)
ps1
の値が小さい順に並べ替えている
ps1 = 0.26
が同じt1 = 1
(処置群)、被験者 11 は
t1 = 0
(統制群)なので群間比較できるps1 = 0.26
、被験者 5 の
ps1 = 0.35
t1
がどちらも 0
なので群間比較できない13 & 11
,
6 & 4
, 10 & 9
,
15 & 17
t1 = 1
) における結果 y
の平均値73 + 77 + 77 + 85)/4 (
[1] 78
t1 = 0
) における結果 y
の平均値65 + 66 + 72 + 75)/4 (
[1] 69.5
ATE
は両群の平均値の差だから78-69.5
[1] 8.5
人工的に設定したATT
と
ATE
の真値 (data10b.csv
) ・ATE
の真値 = 9.95
・ATT
の真値 =
9.1
・ナイーブな推定値 =
17.4
・ATE
の推定値 =
8.5
ATE
の真値 (9.95) や ATT
の真値 (9.1)
にかなり近い値 (8.5) を推定できているt = 1
) と統制群 (t = 0
) における
x1, x2, x3
の分布を可視化してみるt = 1
) と統制群
(t = 0
) における x1, x2, x3
の分布はほぼ同じになった\[X ⊥ T|e(X)\]
\[{Y(1), Y(0)} ⊥ T|e(X) \]
「強い意味での無視可能な割り付けのための条件」
\[{Y(1), Y(0)} ⊥ T|e(X)\]
傾向スコアの利点
・観察研究では、この条件を満たすためにできるだけ多くの変数をモデルに取り込む必要がある
・その際、モデルに含めるべき「交絡因子」や含めてはいけない「中間変数」に注意する必要あり
・傾向スコア(単変量)の値が同じであれば、\(X\)(多変量)の値自体は異なっていてもかまわない
\[0 < Pr(T_i=1|X) < 1\]
傾向スコアのモデリングと実験研究の違い
・傾向スコアのモデリングでは処置の割り付けに影響を与えるのは観測された共変量
\(X\) のみと規定
・観測されない共変量 \(u\)
のバランシングは保証しない
・実験研究では観測されない共変量 \(u\)
のバランシングも保証する
傾向スコア
を使った因果推論RDD
や IV
を使った因果推論logistic regression model
) でモデル化できるx1
の結果を見て、生徒自身が補講を受けるかどうか決める70点 → 4/5 = 0.8
75点 → 3/5 = 0.6
85点 → 2/5 = 0.4
90点 → 1/5 = 0.2
x1
は同じ 70 点x1
は同じ 75 点x1
は同じ 85
点x1
は同じ 90
点無視可能な割付け
・共変量の値 \(x1\)
が同じ個体同士では、処置の割付 \(t1\)
確率が同じであることを「無視可能な割付け」という
・共変量の値 \(x1\)
に条件付けたとき、局所的に無作為割付が実現されている
→ 前期試験点数 \(x1\)
の点数が同じ個体なら、その点数内で割付けられる確率(=傾向スコア)は等しい
→ 処置群と統制群で共変量 \(x1\)
の値が同じ個体を 2 群間で比較
→ 共変量 \(x1\) が特定の値をとる場合(= 共変量 \(x1\) に条件づけられた場合)の処置効果
(ATE
) が推定できる
例)\(x1\) = 90 の時の処置効果
(ATE
) = 91 - (81 + 82 + 82 + 82)/4 = 9.25
x1 |
割当変数(前期試験の点数) | 観察可能 |
y |
結果変数(期末試験の点数) | 観察可能 |
t1 |
処置変数(補講に参加 t1 = 1 、参加せず
t1 = 0 ) |
観察可能 |
ここでは、高橋将宣著『統計的因果推論の理論と実装』(2022) のサポートページで公開されている「本書で使用するデータ(zip)」をダウンロードし
data03.csv
を使う
データを読み取る
<- read_csv("data/takahashi/data03.csv")
df3 <- df3 |>
df3 select(x1, y3, t1) # 分析に使う変数だけに絞る
::datatable(df3) DT
stargazer(as.data.frame(df3), type = "html")
Statistic | N | Mean | St. Dev. | Min | Max |
x1 | 20 | 80.000 | 8.111 | 70 | 90 |
y3 | 20 | 77.250 | 7.025 | 63 | 91 |
t1 | 20 | 0.500 | 0.513 | 0 | 1 |
x1
を条件とした時の処置 t1
の割り付け確率を求める<- glm(t1 ~ x1,
psmodel family = binomial(link = "logit"),
data = df3)
x1
を条件とした時の処置 t1
の割り付け確率の推定値を可視化してみる<- data_frame(x1 = seq(70, max(df3$x1), length.out = 20))
pred_ps $fit <- predict(psmodel, type = "response", newdata = pred_ps)
pred_ps
ggplot(df3, aes(x = x1)) +
geom_hline(yintercept = c(0, 1), color = "gray") +
geom_jitter(aes(y = t1), pch = 16, size = 1, width = 0.05, height = 0.05) +
geom_line(data = pred_ps, aes(y = fit), color = "red") +
labs(x = "x1", y = "t1", title = "共変量 x1 を条件とした時の処置 t1 の割り付け確率")
x1
が高い人ほど処置 t1
を受けない(=補講を受けない)ことがわかるps3
と名前を付ける<- round(psmodel$fitted.values, 3) # 表示桁数を指定 ps3
ps_true
を作る<- c(rep(0.8, 5), rep(0.6, 5), rep(0.4, 5), rep(0.2, 5)) ps_true
df4
に ps3
と
ps_true
を加えて中身を表示させる<- df3 |>
df4 mutate(ps3 = ps3,
ps_true = ps_true)
df4
# A tibble: 20 × 5
x1 y3 t1 ps3 ps_true
<dbl> <dbl> <dbl> <dbl> <dbl>
1 70 74 1 0.775 0.8
2 70 63 0 0.775 0.8
3 70 73 1 0.775 0.8
4 70 71 1 0.775 0.8
5 70 74 1 0.775 0.8
6 75 67 0 0.65 0.6
7 75 77 1 0.65 0.6
8 75 68 0 0.65 0.6
9 75 77 1 0.65 0.6
10 75 78 1 0.65 0.6
11 85 88 1 0.35 0.4
12 85 77 0 0.35 0.4
13 85 76 0 0.35 0.4
14 85 86 1 0.35 0.4
15 85 78 0 0.35 0.4
16 90 81 0 0.225 0.2
17 90 91 1 0.225 0.2
18 90 82 0 0.225 0.2
19 90 82 0 0.225 0.2
20 90 82 0 0.225 0.2
ps3
・・・モデルから推定した傾向スコアps_true
・・・傾向スコアの真値MatchIt パッケージ
)library(MatchIt)
x1
を条件とした時の処置 t1
の割り付け確率を求める<- matchit(t1 ~ x1, data = df3) matchit
fitted.values
) を抜き出し
ps_mi
と名前を付ける<- matchit$model$fitted.values ps_mi
ps_true
と 2 つの推定値
ps3
, ps_mi
を一つのデータフレームにまとめて表示させる<- df4 |>
df5 mutate(ps_mi = ps_mi)
df5
# A tibble: 20 × 6
x1 y3 t1 ps3 ps_true ps_mi
<dbl> <dbl> <dbl> <dbl> <dbl> <dbl>
1 70 74 1 0.775 0.8 0.775
2 70 63 0 0.775 0.8 0.775
3 70 73 1 0.775 0.8 0.775
4 70 71 1 0.775 0.8 0.775
5 70 74 1 0.775 0.8 0.775
6 75 67 0 0.65 0.6 0.650
7 75 77 1 0.65 0.6 0.650
8 75 68 0 0.65 0.6 0.650
9 75 77 1 0.65 0.6 0.650
10 75 78 1 0.65 0.6 0.650
11 85 88 1 0.35 0.4 0.350
12 85 77 0 0.35 0.4 0.350
13 85 76 0 0.35 0.4 0.350
14 85 86 1 0.35 0.4 0.350
15 85 78 0 0.35 0.4 0.350
16 90 81 0 0.225 0.2 0.225
17 90 91 1 0.225 0.2 0.225
18 90 82 0 0.225 0.2 0.225
19 90 82 0 0.225 0.2 0.225
20 90 82 0 0.225 0.2 0.225
ps_mi
が傾向スコアの真値 ps_true
を正しく推定していることがわかるMatchIt
パッケージを使って推定した傾向スコア
ps_mi
と 手計算による傾向スコアの推定値 ps3
が全く同一だとわかるChapter 11
の内容が最新で解説が大変わかりやすいChapter 11
で使われているデータを使い、同書に沿って「傾向スコア」について解説する同じ個体に関して「処置を行い」かつ「処置を行わない」ことはできない
実験研究では、複数の個体を用意し、それらの個体を無作為に「処置群」と「統制群」に割り付けて比較可能な集団を作り、平均処置効果
(ATE
) を推定できる
しかし観察研究では、処置の割り付けが無作為ではない
「処置群」と「統制群」をそのまま比較しても因果効果を適切に推定できない
そこで、処置を受ける確率(= 傾向スコア)が同じ個体同士をペアで比較すればいいのではないかと考える
傾向スコアで条件付けしてマッチングし、観測される共変量が同じ個体をペアにして、異なる個体同士を同じ個体として取り扱う
→ セレクションバイアスを除外して因果効果を推定できる
下の表は 2021年総選挙に出馬した候補者のうち10人の名簿である
処置変数は候補者が世襲かどうか(0 なら非世襲、1 なら世襲)
10人のうち 3 人が世襲、7 人が非世襲候補者
結果は候補者がそれぞれの小選挙区で獲得した得票率 (%)
「年齢」と「性別」が共変量 → 共変量 \(X\) は 2 次元
2 つのペアが可能
40 歳で男性の「小泉進次郎」と「小倉将信」
64 歳で男性の「岸田文雄」と「石破茂」
氏名 | 処置 | 結果 | 性別 | 年齢 |
小泉進次郎 | 1 | 79.17 | male | 40 |
小倉将信 | 0 | 51.25 | male | 40 |
氏名 | 処置 | 結果 | 性別 | 年齢 |
岸田文雄 | 1 | 80.67 | male | 64 |
石破茂 | 0 | 84.07 | male | 64 |
\[{Y(1), Y(0)} ⊥ T|e(X)\]
平均処置効果 | \(τ_{ATE} = E[Y_i(1)-Y_i(0)] = E[Y_i(1)] - E[Y_i(0)]\) |
処置群の平均処置効果 | \(τ_{ATT} = E[Y_i(1)-Y_i(0)|T_i=1] = E[Y_i(1)|T_i=1] - E[Y_i(0)|T_i=1]\) |
ATT
)ATT
)
を推定するy0t |
潜在的結果変数: \(Y_i(0)\) | 通常、観察不可能だが、ここでは観察可と仮定する |
y1t |
潜在的結果変数:\(Y_i(1)\) | 通常、観察不可能だが、ここでは観察可と仮定する |
\(y3\) | 結果変数 | 観察可能 |
t1 |
「t1 = 1 : 処置あり」,
「t1 = 0 : 処置なし」 |
観察可能 |
x1 |
共変量 | 観察可能 |
x2 |
共変量 | 観察可能 |
x3 |
共変量 | 観察可能 |
x4 |
共変量 | 観察可能 |
x5 |
共変量 | 観察可能 |
x6 |
共変量 | 観察可能 |
x1,....,x6
は平均1、標準偏差1の多変量対数正規分布に従う乱数
誤差項 \(ε_i\) は標準正規乱数である
ここでは、高橋将宣著『統計的因果推論の理論と実装』(2022) のサポートページで公開されている「本書で使用するデータ(zip)」をダウンロードし
data11.csv
を使う
生成したデータを読み取る
<- read_csv("data/takahashi/data11.csv") df11
::datatable(df11) DT
\[Y_i(0) = 1 + 1X_{1i} - 3X_{2i} + 5X_{3i} + 7X_{4i} + 9X_{5i} + 11X_{6i} + ε_i\]
y0t
を応答変数として重回帰分析をしてみる <- lm(y0t ~ x1 + x2 + x3 + x4 + x5 + x6, data = df11) m0
tidy(m0)
# A tibble: 7 × 5
term estimate std.error statistic p.value
<chr> <dbl> <dbl> <dbl> <dbl>
1 (Intercept) 0.993 0.0610 16.3 6.53e- 53
2 x1 0.982 0.0376 26.1 8.27e-115
3 x2 -2.99 0.0396 -75.6 0
4 x3 5.04 0.0396 127. 0
5 x4 6.96 0.0418 167. 0
6 x5 8.99 0.0400 225. 0
7 x6 11.0 0.0380 291. 0
\(Y_i(1)\)
に関しては次のように設定してデータを生成してある
\[Y_i(1) = 5 + 2X_{1i} + 4X_{2i} - 6X_{3i} +
8X_{4i} + 10X_{5i} + 12X_{6i} + ε_i\]
試しに y1t
を応答変数として重回帰分析をしてみる
<- lm(y1t ~ x1 + x2 + x3 + x4 + x5 + x6, data = df11) m1
tidy(m1)
# A tibble: 7 × 5
term estimate std.error statistic p.value
<chr> <dbl> <dbl> <dbl> <dbl>
1 (Intercept) 4.99 0.0610 81.8 0
2 x1 1.98 0.0376 52.7 6.11e-290
3 x2 4.01 0.0396 101. 0
4 x3 -5.96 0.0396 -150. 0
5 x4 7.96 0.0418 191. 0
6 x5 9.99 0.0400 250. 0
7 x6 12.0 0.0380 317. 0
t1
の割り付けルール\[T_i = 1 \\if Y_i(0) > med(Y_i(0)) \& u_{1i} ≦ 0.50 \\or Y_i(0) ≦ med(Y_i(0)) \& u_{2i} > 0.75\]
\[T_i = 0 \\if Y_i(0) > med(Y_i(0)) \& u_{1i} > 0.50 \\or Y_i(0) ≦ med(Y_i(0)) \& u_{2i} ≦ 0.75\]
ATT
) の真値mean(df11$y1t[df11$t1==1]) - mean(df11$y0t[df11$t1==1])
[1] 2.888651
ATE
) の真値mean(df11$y1t) - mean(df11$y0t)
[1] 3.755947
人工的に設定したATT
と
ATE
の真値 (data11.csv
) ・ATT
の真値 =
2.889
・ATE
の真値 =
3.756
<- lm(y3 ~ t1, data = df11)
obs_simple tidy(obs_simple)
# A tibble: 2 × 5
term estimate std.error statistic p.value
<chr> <dbl> <dbl> <dbl> <dbl>
1 (Intercept) 26.3 0.906 29.0 1.84e-134
2 t1 15.8 1.45 10.9 4.02e- 26
<- lm(y3 ~ t1 + x1 + x2 + x3 + x4 + x5 + x6, data = df11)
obs_multi tidy(obs_multi)
# A tibble: 8 × 5
term estimate std.error statistic p.value
<chr> <dbl> <dbl> <dbl> <dbl>
1 (Intercept) 1.05 0.309 3.41 6.78e- 4
2 t1 3.47 0.327 10.6 4.24e- 25
3 x1 1.39 0.184 7.57 8.77e- 14
4 x2 -0.292 0.194 -1.50 1.33e- 1
5 x3 0.454 0.194 2.34 1.97e- 2
6 x4 7.47 0.205 36.5 8.05e-186
7 x5 9.66 0.197 49.1 8.91e-268
8 x6 11.2 0.187 59.5 0
推定方法 | 推定値 |
処置群の平均処置効果 (ATT ) の真値 |
2.89 |
平均処置効果 (ATE ) の真値 |
3.76 |
ナイーブな比較 (t1=1 vs t1=0 ) |
15.8 |
共分散分析 (t1 の係数 ) |
3.47 |
ATT
を分析できない3.47
(ATT
の真値
2.89
とかけ離れた推定)ATE
3.47
(ATE
の真値 3.76
ともかけ離れた推定)ATT
)
を推定するために必要な「復元と非復元」に関する考え方を R の
sample()
関数を使って解説するsample()
関数を使った復元と非復元 ・R 上で人工的に 5
人(小泉、岸田、安倍、森下、池内)の変数 list
を作る
<- c("小泉", "岸田", "安倍", "森下", "池内")
list list
[1] "小泉" "岸田" "安倍" "森下" "池内"
sample()
関数を使って、5 人の中から無作為に 4
人を選ぶとするlist
に戻して、2
人目以降を選ぶ方法): replace = TRUE
list
に戻さずに、2
人目以降を選ぶ方法): replace = FALSE
replace = TRUE
と指定する)sample(list, 4, replace = TRUE)
[1] "池内" "森下" "安倍" "小泉"
sample(list, 4, replace = TRUE)
[1] "小泉" "森下" "池内" "小泉"
replace = FALSE
がデフォルト)sample(list, 4)
[1] "池内" "森下" "安倍" "小泉"
sample(list, 4)
[1] "森下" "小泉" "安倍" "池内"
MatchItパッケージ
における
matchit関数
の引数として設定できるreplace = FALSE
と指定replace = TRUE
と指定復元と非復元によるマッチング、どちらが良いのか? ・復元と非復元はどちらも一長一短あるので、長所と短所に配慮して慎重に決める
distance
)MatchItパッケージ
における
matchit関数
の引数 distance
として設定できるdistance
の引数一覧glm |
一般化線形モデル | generalize linear model |
gam |
一般化加法モデル | generalize additive model |
rpart |
分類木 | classification tree |
randomforest |
ランダムフォレスト | random forest |
nnet |
ニューラルネットワーク | neural network |
cbps |
共変量バランシング傾向スコア | covariate blancing propensity score |
bart |
ベイズ的加法回帰木 | BART: Bayesian additive regression trees |
mahalanobis |
マハラノビスの距離 | Mahalanlobis distance :傾向スコアは計算されず |
glm
がデフォルトrandomforest
の場合・・・distance = randomforest
と指定MatchItパッケージ
における
matchit関数
の引数 method
として設定できるmethod
の引数一覧nearest |
最近隣法マッチング | nearest neighbor matching |
optimal |
最適ペアマッチング | optimal pair matching |
genetic |
遺伝的マッチング | genetic matching |
exact |
厳密マッチング | exact matching |
cem |
単純化厳密マッチング | coarsened exact matching |
subclass |
階層 | subclassification |
full |
最適フルマッチング | optimal full matching |
average absolute distance
)
が最小化するようにマッチングする傾向スコアをモデリングする際の注意 ・処置群と統制群における各々の共変量の標準化平均差の絶対値は 0.1 未満が推奨されている
library(MatchIt)
<- matchit(t1 ~ x1 + x2 + x3 + x4 + x5 + x6,
mit_1 data = df11,
replace = TRUE, # 復元のマッチングを指定
distance = "glm", # ロジステック回帰によって計算された傾向スコアを距離として使う
method = "nearest") # 最近隣法マッチングを指定
df12
という名前を付ける<- match.data(mit_1) df12
::datatable(df12) DT
distance
の値が傾向スコア:範囲は 0.11(最小値)から
0.81(最大値)
マッチング後のデータフレーム df12
を使って
ATT
を推定する
復元 (replace = TRUE
)
のマッチングなので、weights == weights
とマッチングの重みを設定する
理論上、傾向スコアマッチングによって共変量の影響による偏りを除去したので
ATT
を推定できる
マッチング後のデータ df12
を用いて平均の差を求めれば良い
<- lm(y3 ~ t1,
model1 data = df12,
weights = weights)
ATT
の推定結果を表示するtidy(model1)
# A tibble: 2 × 5
term estimate std.error statistic p.value
<chr> <dbl> <dbl> <dbl> <dbl>
1 (Intercept) 39.5 1.46 27.0 2.26e-106
2 t1 2.59 1.85 1.41 1.60e- 1
ATT
の真値と推定値
(model1
) ・ATT
の真値 =
2.889
・ATT
の推定値 = 2.59
(model1)
ATT
の真値 (2.899
) と比較すると、過小推定
(2.59
) されている(差は 0.309
)・傾向スコアマッチングの時だけでなく、解析モデルにも共変量
(\(x1, ..., x6\))
を取り込んだ共分散分析を行い ATT
を推定する
・復元(replace = TRUE
)
のマッチングなので、weights == weights
とマッチングの重みを設定する
<- lm(y3 ~ t1 + x1 + x2 + x3 + x4 + x5 + x6,
model2 data = df12,
weights = weights)
ATT
の推定結果を表示するtidy(model2)
# A tibble: 8 × 5
term estimate std.error statistic p.value
<chr> <dbl> <dbl> <dbl> <dbl>
1 (Intercept) 1.85 0.505 3.66 2.73e- 4
2 t1 2.92 0.403 7.25 1.29e- 12
3 x1 1.73 0.247 7.01 6.32e- 12
4 x2 1.10 0.248 4.42 1.18e- 5
5 x3 -2.12 0.244 -8.68 3.52e- 17
6 x4 7.85 0.255 30.7 5.20e-126
7 x5 9.99 0.248 40.3 3.96e-174
8 x6 11.3 0.241 46.7 8.91e-204
ATT
の真値と推定値
(model2
) ・ATT
の真値 =
2.889
・ATT
の推定値 = 2.92
(model2)
ATT
の真値 (2.899
) がかなり正確に推定
(2.92
) されている(差は 0.031
)model1
よりも model2
の方が
ATT
の真値に近いATT
値を推定できることがわかるポイント ・共分散分析と比較すると、傾向スコアモデリングの方が、間違ったモデルを設定しても柔軟に対応できる
・傾向スコアマッチングの時だけでなく、解析モデルにも共変量
(\(x1, ..., x6\))
を取り込んだ共分散分析を行い ATT
を推定すべき
クラスターに頑強な標準誤差を使う場合
・
傾向スコアがモデルから計算されたことに起因する不確実性を標準誤差に反映させる方法
・
標準誤差を推定する際、データがマッチングされたという性質を反映させるべきと主張する研究者もいる
・
どの個体がペアになっているのかという情報をクラスターとして、クラスターに頑強な標準誤差を使う
・ ここでは上で推定した model2
を事例としてクラスターに頑強な標準誤差を計算してみる
・ 2 つのRパッケージをロードする
library(lmtest)
library(sandwich) # 不均一分散に頑強な標準誤差を推定するためのパッケージ
・ cluster
の設定方法:
・ 非復元 (replace = FALSE
) なら
cluster = ~ subclass
・ 復元 (replace = TRUE
) なら
cluster = ~ weights
coeftest(model2,
vcov. = vcovCL,
cluster = ~ weights)
t test of coefficients:
Estimate Std. Error t value Pr(>|t|)
(Intercept) 1.84855 1.08109 1.7099 0.0878 .
t1 2.91741 0.67454 4.3251 1.781e-05 ***
x1 1.72827 0.33283 5.1927 2.829e-07 ***
x2 1.09558 2.06205 0.5313 0.5954
x3 -2.11607 3.03974 -0.6961 0.4866
x4 7.84693 0.33587 23.3631 < 2.2e-16 ***
x5 9.99163 0.25037 39.9077 < 2.2e-16 ***
x6 11.27663 0.42177 26.7365 < 2.2e-16 ***
---
Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
推定値 | 標準誤差 | |
ATT の真値 |
2.889 | |
通常の標準誤差 | 2.92 | 0.403 |
頑強な標準誤差 | 2.92 | 0.675 |
・
点推定値は「通常の標準誤差」を使った場合も「頑強な標準誤差」を使ったばあいもどちらも
2.92
・ 「通常の標準誤差」を使った場合の標準誤差
(0.403)と比較すると、「通常の標準誤差」を使った場合の標準誤差 (0.675)
は若干大きくなっていることがわかる
・ t1
の p-value = 1.781e-05
なので、処置効果
(ATT
) はあるという結論が得られる
傾向スコアによるバランシング
・
傾向スコアを使ってマッチングする際、処置群と統制群が「十分に似ているかどうか」を確認する必要がある
→ 共変量の分布が処置群と統制群で十分にバランシングしているかどうか
・ ここでは mit_1
の結果のサマリーを出力すればバランシングの評価指標を表示できる
<- matchit(t1 ~ x1 + x2 + x3 + x4 + x5 + x6,
mit_1 data = df11,
replace = TRUE, # 復元のマッチングを指定
distance = "glm", # ロジステック回帰によって計算された傾向スコアを距離として使う
method = "nearest") # 最近隣法マッチングを指定
・ Std.Mean Diff
の値が 0
に近いほど、バランスがとれている
・ Var.Ratio
の値が 1 に近いほど、バランスがとれている
summary(mit_1)
Call:
matchit(formula = t1 ~ x1 + x2 + x3 + x4 + x5 + x6, data = df11,
method = "nearest", distance = "glm", replace = TRUE)
Summary of Balance for All Data:
Means Treated Means Control Std. Mean Diff. Var. Ratio eCDF Mean
distance 0.4371 0.3584 0.6022 0.9897 0.1755
x1 0.9655 0.9919 -0.0297 0.7966 0.0210
x2 0.9596 0.9810 -0.0217 0.8841 0.0200
x3 1.1451 0.9162 0.2196 1.0303 0.0616
x4 1.2246 0.8986 0.3429 0.9352 0.1017
x5 1.2874 0.7913 0.4963 1.0065 0.1461
x6 1.2896 0.8382 0.4860 0.9166 0.1376
eCDF Max
distance 0.3232
x1 0.0540
x2 0.0524
x3 0.1002
x4 0.1797
x5 0.2387
x6 0.2212
Summary of Balance for Matched Data:
Means Treated Means Control Std. Mean Diff. Var. Ratio eCDF Mean
distance 0.4371 0.4369 0.0012 1.0028 0.0014
x1 0.9655 0.9759 -0.0117 0.7990 0.0241
x2 0.9596 0.9644 -0.0049 0.8047 0.0273
x3 1.1451 1.1281 0.0162 0.9851 0.0100
x4 1.2246 1.2465 -0.0231 0.8135 0.0241
x5 1.2874 1.2614 0.0260 1.0968 0.0121
x6 1.2896 1.3208 -0.0336 0.9959 0.0120
eCDF Max Std. Pair Dist.
distance 0.0129 0.0076
x1 0.0668 1.2125
x2 0.0771 1.2002
x3 0.0386 1.0269
x4 0.0566 0.9933
x5 0.0540 0.6018
x6 0.0488 0.6997
Percent Balance Improvement:
Std. Mean Diff. Var. Ratio eCDF Mean eCDF Max
distance 99.8 73.1 99.2 96.0
x1 60.7 1.3 -14.6 -23.7
x2 77.6 -76.3 -36.3 -47.2
x3 92.6 49.7 83.8 61.5
x4 93.3 -208.3 76.3 68.5
x5 94.8 -1328.8 91.7 77.4
x6 93.1 95.2 91.3 77.9
Sample Sizes:
Control Treated
All 611. 389
Matched (ESS) 167.21 389
Matched 229. 389
Unmatched 382. 0
Discarded 0. 0
・ これだとわかりにくいので love plot
を描いて、バランシングの改善を可視化してみる
plot(summary(mit_1), position=NULL)
・ ○ が傾向スコアマッチング前
・ ● が傾向スコアマッチング後
・ 横軸・・・標準化平均差
(Standardized Mean Differences
)
・ 標準化平均差 = 処置群と統制群の分布の違い
・ この値が小さいほど望ましい
・ この値が 0 であることが理想
・ この値は 0.1 以下であることが望ましい
・
マッチング前(○)と比べると、マッチング後(●)の標準化平均差が小さくなっている
・
傾向スコアマッチング後に、処置群と統制群の分布の違いが小さくなっている
→ 傾向スコアマッチング後の(●)は全て 0.1 以下
→ ここでの傾向スコアマッチングでは、共変量の偏りが十分是正された
標準化平均差の絶対値が 0.1 以上になった時の対策 ・両群がバランスするように、傾向スコアのモデルに高次の項、非線形の変換、交差項などを含める
ATT
を推定できるATE
を推定できるATE
を推定できないsimple ramdom sampling
)2.1 調査・観察データの場合
」で紹介したケース「ランダムな割り付けは、自然には実現されない」(ローゼンバウム
2021)
→ 男女比にばらつきが出る → 性別による差が生じてしまう
→ この状況は交換可能ではない(=グループを入れ替えられない)
→ 平均因果効果 (ATE
) を推定できない
「自然に任せていたのでは公平な比較は望むべくもない」(ローゼンバウム 2021)
RCT
)
を実現するため、事前にセレクションバイアスが生じないように母集団をブロッキング(層化)するstratified ramdom sampling
)simple random sampling
)
では、通常、母集団はひとつ→ 層化に使った交絡因子の影響を除去できる
-
2021年総選挙に出馬した10人の候補者のリストを「性別」と「年齢」という二つの交絡因子で層化してみる
左側の名簿の情報を、50歳以上と50歳未満で層化
4 つの層に分類できる
同じ層内では「性別」は同じで、年齢もほぼ同じ
→ 層内での結果(得票率)が異なるのは、性別と年齢が理由ではない
→ 他の理由(例えば、処置=世襲かどうか)のはず
それぞれの層ごとに推定値を計算してみる
ここでの知りたい「世襲候補者であることが得票率に与える因果効果」=
平均処置効果 (ATE
) は次の式で表すことができる
\[\hat{τ}_{ATE}=\sum_{k=1}^K \frac{n_k}{N}[\bar{Y}_k(1) - \bar{Y}_k(0)]\]
K |
層の数 |
N |
標本サイズ |
\(n_k\) | k 番目の層における標本サイズ |
\(\bar{Y}_k(1)\) | k番目の層における処置群(世襲)の平均値 |
\(\bar{Y}_k(0)\) | k番目の層における統制群(非世襲)の平均値 |
\(\bar{Y}_k(1) - \bar{Y}_k(0)\) | k番目の層における平均処置効果 (ATE ) |
「性別」と「年齢」で層化
)を使って、平均処置効果
(ATE
) を計算してみるATE
:ATE
= 79.17 - 51.25 = 27.92ATE
:ATE
= 58.06 - 43.11 = 14.95ATE
:ATE
= 41.72 - 42.69 = - 0.97ATE
:ATE
= 75.2 - 63.5 = 11.7ATE
:\[\hat{τ}_{ATE}=\sum_{k=1}^K \frac{n_k}{N}[\bar{Y}_k(1) - \bar{Y}_k(0)] \\ = \frac{2}{10} ・ 27.92 + \frac{2}{10} ・ 14.95 + \frac{3}{10}・ (-0.97)+ \frac{3}{10}・ 11.7 = 11.79 \]
\[{Y(1), Y(0)} ⊥ T|e(X)\]
MatchIt
のデフォルトは 6ATE
の推定y0t |
潜在的結果変数: \(Y_i(0)\) | 通常、観察不可能だが、ここでは観察可と仮定する |
y1t |
潜在的結果変数:\(Y_i(1)\) | 通常、観察不可能だが、ここでは観察可と仮定する |
\(y3\) | 結果変数 | 観察可能 |
t1 |
処置変数(1=処置あり, 0=処置なし) | 観察可能 |
x1 |
共変量 | 観察可能 |
x2 |
共変量 | 観察可能 |
x3 |
共変量 | 観察可能 |
x4 |
共変量 | 観察可能 |
x5 |
共変量 | 観察可能 |
x6 |
共変量 | 観察可能 |
x1,....,x6
は平均1、標準偏差1の多変量対数正規分布に従う乱数
誤差項 \(ε_i\) は標準正規乱数である
ここでは、高橋将宣著『統計的因果推論の理論と実装』(2022) のサポートページで公開されている「本書で使用するデータ(zip)」をダウンロードし
data11.csv
を使う
生成したデータを読み取る
<- read_csv("data/takahashi/data11.csv") df11
::datatable(df11) DT
\[Y_i(0) = 1 + 1X_{1i} - 3X_{2i} + 5X_{3i} + 7X_{4i} + 9X_{5i} + 11X_{6i} + ε_i\]
y0t
を応答変数として重回帰分析をしてみる <- lm(y0t ~ x1 + x2 + x3 + x4 + x5 + x6, data = df11) m0
tidy(m0)
# A tibble: 7 × 5
term estimate std.error statistic p.value
<chr> <dbl> <dbl> <dbl> <dbl>
1 (Intercept) 0.993 0.0610 16.3 6.53e- 53
2 x1 0.982 0.0376 26.1 8.27e-115
3 x2 -2.99 0.0396 -75.6 0
4 x3 5.04 0.0396 127. 0
5 x4 6.96 0.0418 167. 0
6 x5 8.99 0.0400 225. 0
7 x6 11.0 0.0380 291. 0
\(Y_i(1)\)
に関しては次のように設定してデータを生成してある
\[Y_i(1) = 5 + 2X_{1i} + 4X_{2i} - 6X_{3i} +
8X_{4i} + 10X_{5i} + 12X_{6i} + ε_i\]
試しに y1t
を応答変数として重回帰分析をしてみる
<- lm(y1t ~ x1 + x2 + x3 + x4 + x5 + x6, data = df11) m1
tidy(m1)
# A tibble: 7 × 5
term estimate std.error statistic p.value
<chr> <dbl> <dbl> <dbl> <dbl>
1 (Intercept) 4.99 0.0610 81.8 0
2 x1 1.98 0.0376 52.7 6.11e-290
3 x2 4.01 0.0396 101. 0
4 x3 -5.96 0.0396 -150. 0
5 x4 7.96 0.0418 191. 0
6 x5 9.99 0.0400 250. 0
7 x6 12.0 0.0380 317. 0
t1
の割り付けルール\[T_i = 1 \\if Y_i(0) > med(Y_i(0)) \& u_{1i} ≦ 0.50 \\or Y_i(0) ≦ med(Y_i(0)) \& u_{2i} > 0.75\]
\[T_i = 0 \\if Y_i(0) > med(Y_i(0) \& u_{1i} > 0.50 \\or Y_i(0) ≦ med(Y_i(0)) \& u_{2i} ≦ 0.75\]
ATE
) の真値mean(df11$y1t) - mean(df11$y0t)
[1] 3.755947
人工的に設定した ATE
の真値
(data11.csv
) ・ATE
の真値 = 3.756
\(y3\) | 結果変数 | 観察可能 |
t1 |
処置変数(1: 処置あり、0: 処置なし) | 観察可能 |
x1 |
共変量 | 観察可能 |
x2 |
共変量 | 観察可能 |
x3 |
共変量 | 観察可能 |
x4 |
共変量 | 観察可能 |
x5 |
共変量 | 観察可能 |
x6 |
共変量 | 観察可能 |
library(MatchIt)
<- 5 # 層の数を指定
sub <- matchit(t1 ~ x1 + x2 + x3 + x4 + x5 + x6,
m.out2 data = df11,
method = "subclass",
subclass = sub,
estimand = "ATE",
min.n = 2)
m.out2
A matchit object
- method: Subclassification (5 subclasses)
- distance: Propensity score
- estimated with logistic regression
- number of obs.: 1000 (original), 1000 (matched)
- target estimand: ATE
- covariates: x1, x2, x3, x4, x5, x6
<- match.data(m.out2) m.data2
names(df11)
[1] "y0t" "y1t" "y3" "t1" "x1" "x2" "x3" "x4" "x5" "x6"
names(m.data2)
[1] "y0t" "y1t" "y3" "t1" "x1" "x2"
[7] "x3" "x4" "x5" "x6" "distance" "weights"
[13] "subclass"
df11
)
と比較すると、m.data2
では新たに 3 つの変数
(distance
, weights
, subclass
)
がつくられていることがわかるm.data2
の中を確認する ::datatable(m.data2) DT
<- lm(y3 ~ t1 + x1 + x2 + x3 + x4 + x5 + x6,
model4 data = df11)
tidy(model4)
# A tibble: 8 × 5
term estimate std.error statistic p.value
<chr> <dbl> <dbl> <dbl> <dbl>
1 (Intercept) 1.05 0.309 3.41 6.78e- 4
2 t1 3.47 0.327 10.6 4.24e- 25
3 x1 1.39 0.184 7.57 8.77e- 14
4 x2 -0.292 0.194 -1.50 1.33e- 1
5 x3 0.454 0.194 2.34 1.97e- 2
6 x4 7.47 0.205 36.5 8.05e-186
7 x5 9.66 0.197 49.1 8.91e-268
8 x6 11.2 0.187 59.5 0
seshu_dummy
の係数・・・ 3.47、t = 1
であれば
y3
が平均して 3.47%ポイント上がるp-value = 4.24e-25
→ 統計的に有意t1
の推定値は 3.47ATE
の推定(層内で共分散分析を行わない場合)subclass
ごとに t1 = 1
と
t1 = 0
それぞれの y3
の平均値を求めるATE
)ATE
<- m.data2 |>
df01 filter(subclass == 1)
<- mean(df01$y3[df01$t1==1]) # 処置群 (t1=1)での y3 の平均値
sub11_ave <- mean(df01$y3[df01$t1==0]) # 統制群 (t1=0)での y3 の平均値
sub10_ave
- sub10_ave # ATE sub11_ave
[1] 8.86462
ATE
<- m.data2 |>
df02 filter(subclass == 2)
<- mean(df02$y3[df02$t1==1])
sub21_ave <- mean(df02$y3[df02$t1==0])
sub20_ave
- sub20_ave sub21_ave
[1] 3.321628
ATE
<- m.data2 |>
df03 filter(subclass == 3)
<- mean(df03$y3[df03$t1==1])
sub31_ave <- mean(df03$y3[df03$t1==0])
sub30_ave
- sub30_ave sub31_ave
[1] 7.223671
ATE
<- m.data2 |>
df04 filter(subclass == 4)
<- mean(df04$y3[df04$t1==1])
sub41_ave <- mean(df04$y3[df04$t1==0])
sub40_ave
- sub40_ave sub41_ave
[1] 2.714279
ATE
<- m.data2 |>
df05 filter(subclass == 5)
<- mean(df05$y3[df05$t1==1])
sub51_ave <- mean(df05$y3[df05$t1==0])
sub50_ave
- sub50_ave sub51_ave
[1] -1.364288
K |
層の数 = 5 |
N |
標本サイズ = 1000 |
\(n_k\) | k 番目の層における標本サイズ = 200 |
\(\bar{Y}_k(1)\) | k番目の層における処置群(世襲)の平均値 |
\(\bar{Y}_k(0)\) | k番目の層における統制群(非世襲)の平均値 |
\(\bar{Y}_k(1) - \bar{Y}_k(0)\) | k番目の層における平均処置効果 (ATE ) |
table(m.data2$subclass)
1 2 3 4 5
200 200 200 200 200
\[\hat{τ}_{ATE}=\sum_{k=1}^K \frac{n_k}{N}[\bar{Y}_k(1) - \bar{Y}_k(0)] \\ = \frac{200}{1000} ・ 8.86462 + \frac{200}{1000} ・ 3.321628 + \frac{200}{1000}・7.223671 \\+ \frac{200}{1000}・2.714279 + \frac{200}{1000}・(-1.364288) \\ = 4.15 \]
200*(8.86462 + 3.321628 + 7.223671 + 2.714279 - 1.364288)/1000
[1] 4.151982
ATE
の推定(層内で共分散分析を行う場合)ATE
の推定library(lmtest)
library(sandwich)
psp
, psvar
, nps
,
robustvar
<- nrow(df11) # データに含まれる標本サイズ (n = 1000) を設定
n <- NULL # t1 の偏回帰係数を入れる
psp <- NULL # t1 の標準誤差を二乗した値(=分散)を入れる
ps_var <- NULL # 層ごとの標本サイズ
nps <- NULL # 各層内でのクラスターに頑強な分散を入れる robust_var
for ループ
を使って計算を自動化するm.data2
の 1 から 5 までの層化番号を j
と指定するy3
を 1 つの処置変数 t1
と 6 つの共変量 x1, x2, x3, x4, x5, x6
で回帰するfor(j in 1:sub){
<- m.data2[m.data2$subclass == j,] # j 番目の層のデータを取り出して data_ps と名前を付ける
data_ps <- lm(y3 ~ t1 + x1 + x2 + x3 + x4 + x5 + x6,
model4 data = data_ps) # data_ps を使って j 番目の層内で共分散分析を実行
<- summary(model4)$coefficients[2, 1] # t1 の偏回帰係数を取り出して psp に入れる
psp[j] <- summary(model4)$coefficients[2, 2]^2 # t1 の標準誤差を二乗して (=分散) 取り出して psvar に入れる
ps_var[j] <- nrow(data_ps) # data_ps の標本サイズ (N) を入れる
nps[j] <- coeftest(model4, # 各層内でのクラスターに頑強な分散
robust_var[j] vcov. = vcovCL,
cluster = ~weights)[2,2]
}
psp
は次のとおり psp
[1] 8.2114114 4.4809301 3.8157096 2.1218324 0.1144802
nps
は nps
[1] 200 200 200 200 200
psp
を統合する\[\hat{τ}_{ATE}=\sum_{k=1}^K \frac{n_k}{N}[\bar{Y}_k(1) - \bar{Y}_k(0)] \\ = \frac{200}{1000} ・ 8.2114114 + \frac{200}{1000} ・ 4.4809301 + \frac{200}{1000}・3.8157096 \\ + \frac{200}{1000}・2.1218324 + \frac{200}{1000}・(0.1144802) \\ = 3.748873 \]
200*(8.2114114 + 4.4809301 + 3.8157096 + 2.1218324 + 0.1144802)/1000
[1] 3.748873
<- sum((nps/n) * psp)
tau_hat tau_hat
[1] 3.748873
統計的有意性を確認するために必要なのは次の 2 つの情報
1. ATE
の推定値:
tau_hat
2.
統合したクラスターに頑強な標準誤差
ATE
の推定値: tau_hat
は上で得られたので、統合したクラスターに頑強な標準誤差を計算する
各層内での標準誤差の 2 乗(=分散)ps_var
は次のとおり
ps_var
[1] 0.4013066 0.5674602 0.4879605 0.4931660 0.4106398
ps_var
を使って統合した標準誤差を計算する<- sum((nps/n)^2 * ps_var)
var_tau sqrt(var_tau)
[1] 0.3072805
robust_var
は次のとおり robust_var
[1] 0.2943865 0.4497133 0.4868898 0.6962178 0.8831411
robust_var
を使って統合したクラスターに頑強な標準誤差を計算する<- sum((nps/n)^2 * robust_var)
robust_var_tau <- sqrt(robust_var_tau)
robust_se_tau robust_se_tau
[1] 0.3352819
tau_hat
と robust_se_tau
を使って 95%
信頼区間を計算する<- qt(0.975, n - 8)
ci_95 + ci_95 * robust_se_tau tau_hat
[1] 4.406816
- ci_95 * robust_se_tau tau_hat
[1] 3.09093
3.0 〜 4.4
で 0 をまたがない ATE
の真値と推定値
(data11.csv
) ・ATE
の真値 =
3.756
・単純な重回帰分析の推定値 =
3.47(p-value = 4.24e-25
)
・共分散分析なしのATE
の推定値 =
4.15
・共分散分析ありのATE
の推定値 =
3.75(統計的に有意)
→ 層内で共分散分析を行った時のATE
の推定値の方が、より ATE
の真値 (3.765) に近い推定値 (3.75)
を得られる
・
傾向スコアを使ってマッチングする際、処置群と統制群が「十分に似ているかどうか」を確認する必要がある
→ 共変量の分布が処置群と統制群で十分にバランシングしているかどうか
・ ここでは傾向スコアをモデル化した m.out2
の結果のサマリーを出力してバランシングの評価指標を表示してみる
<- 5 # 層の数を指定
sub <- matchit(t1 ~ x1 + x2 + x3 + x4 + x5 + x6,
m.out2 data = df11,
method = "subclass",
subclass = sub,
estimand = "ATE",
min.n = 2)
m.out2
A matchit object
- method: Subclassification (5 subclasses)
- distance: Propensity score
- estimated with logistic regression
- number of obs.: 1000 (original), 1000 (matched)
- target estimand: ATE
- covariates: x1, x2, x3, x4, x5, x6
・ Std.Mean Diff
の値が 0
に近いほど、バランスがとれている
・ Var.Ratio
の値が 1 に近いほど、バランスがとれている
summary(m.out2)
Call:
matchit(formula = t1 ~ x1 + x2 + x3 + x4 + x5 + x6, data = df11,
method = "subclass", estimand = "ATE", subclass = sub, min.n = 2)
Summary of Balance for All Data:
Means Treated Means Control Std. Mean Diff. Var. Ratio eCDF Mean
distance 0.4371 0.3584 0.6007 0.9897 0.1755
x1 0.9655 0.9919 -0.0280 0.7966 0.0210
x2 0.9596 0.9810 -0.0211 0.8841 0.0200
x3 1.1451 0.9162 0.2213 1.0303 0.0616
x4 1.2246 0.8986 0.3371 0.9352 0.1017
x5 1.2874 0.7913 0.4971 1.0065 0.1461
x6 1.2896 0.8382 0.4753 0.9166 0.1376
eCDF Max
distance 0.3232
x1 0.0540
x2 0.0524
x3 0.1002
x4 0.1797
x5 0.2387
x6 0.2212
Summary of Balance Across Subclasses
Means Treated Means Control Std. Mean Diff. Var. Ratio eCDF Mean
distance 0.3902 0.3882 0.0148 1.0303 0.0095
x1 0.9917 0.9727 0.0202 0.7583 0.0190
x2 0.9844 0.9713 0.0129 0.9283 0.0213
x3 1.0157 1.0030 0.0123 1.0600 0.0107
x4 1.0413 1.0228 0.0191 0.9487 0.0205
x5 0.9994 0.9760 0.0235 1.0893 0.0100
x6 1.0112 1.0121 -0.0009 0.9771 0.0083
eCDF Max
distance 0.0339
x1 0.0536
x2 0.0474
x3 0.0408
x4 0.0553
x5 0.0324
x6 0.0328
Percent Balance Improvement:
Std. Mean Diff. Var. Ratio eCDF Mean eCDF Max
distance 97.5 -4.1 94.6 89.5
x1 27.9 4.8 9.5 0.8
x2 38.6 -5.0 -6.2 9.6
x3 94.4 -2.9 82.6 59.3
x4 94.3 -1.4 79.8 69.2
x5 95.3 -8.2 93.2 86.4
x6 99.8 -6.6 94.0 85.1
Sample Sizes:
Control Treated
All 611. 389
Matched (ESS) 570.38 325
Matched 611. 389
Unmatched 0. 0
Discarded 0. 0
・ これだとわかりにくいので love plot
を描いて、バランシングの改善を可視化してみる
plot(summary(m.out2), position=NULL, xlim = c(-0.1, 0.6))
・ ○ が傾向スコアマッチング前
・ ● が傾向スコアマッチング後
・ 横軸・・・標準化平均差
(Standardized Mean Differences
)
・ 標準化平均差 = 処置群と統制群の分布の違い
・ この値が小さいほど望ましい
・ この値が 0 であることが理想
・ この値は 0.1 以下であることが望ましい
・
マッチング前(○)と比べると、マッチング後(●)の標準化平均差が小さくなっている
・
傾向スコアマッチング後に、処置群と統制群の分布の違いが小さくなっている
→ 傾向スコアマッチング後の(●)は全て 0.1 以下
→ ここでの傾向スコアマッチングでは、共変量の偏りが十分是正された
ここでは、処置(世襲候補者か否か)が得票率に与える処置効果を傾向スコアマッチングを使って分析してみる
衆議院議員総選挙の得票データ hr96-21.csv
をダウンロード
1996年から2021年までの総選挙データ(hr96-21.csv
)
を読み込む
<- read_csv("data/hr96-21.csv", na = ".") df
names(df)
[1] "year" "pref" "ku" "kun"
[5] "wl" "rank" "nocand" "seito"
[9] "j_name" "gender" "name" "previous"
[13] "age" "exp" "status" "vote"
[17] "voteshare" "eligible" "turnout" "seshu_dummy"
[21] "jiban_seshu" "nojiban_seshu"
<- df %>%
df mutate(male = ifelse(gender == "male", 1, 0), # 男性なら 1、女性なら 0 の変数 male
inc = ifelse(status == 1, 1, 0), # 現職なら 1、それ以外なら 0 の変数 inc
ldp = ifelse(seito == "自民", 1, 0))# 選挙費用が平均以上なら 1、平均以下なら 0 の変数 more_exp
<- df %>%
df1 ::filter(year == 2009) %>% # 2009年総選挙データだけを抜き出す
dplyr::select(voteshare, seshu_dummy, male, inc, nocand, previous, age, ldp) # 必要な変数を指定 dplyr
::datatable(df1) DT
変数名 | 変数の役割 | 説明 |
---|---|---|
voteshare |
結果変数 | 候補者が得た得票率 (%) |
seshu_dummy |
処置効果 | 候補者が世襲なら 1、それ以外なら 0 |
male |
共変量 | 候補者が男性なら 1、女性なら 0 |
inc |
共変量 | 候補者が現職(小選挙区当選者)なら 1、そうでなければ 0 |
nocand |
共変量 | 小選挙区内における立候補者の数 |
previous |
共変量 | 当選回数 |
age |
共変量 | 候補者の年齢 |
ldp |
共変量 | 候補者が自民党所属なら 1、それ以外なら 0 |
library(MatchIt)
<- na.omit(df1) df1
<- 5 # 層の数を指定
sub <- matchit(seshu_dummy ~ male + inc + nocand + previous + age + ldp,
m.out3 data = df1,
method = "subclass",
subclass = sub,
estimand = "ATE",
min.n = 2)
m.out3
A matchit object
- method: Subclassification (5 subclasses)
- distance: Propensity score
- estimated with logistic regression
- number of obs.: 1135 (original), 1135 (matched)
- target estimand: ATE
- covariates: male, inc, nocand, previous, age, ldp
<- match.data(m.out3)
m.data3 names(df1)
[1] "voteshare" "seshu_dummy" "male" "inc" "nocand"
[6] "previous" "age" "ldp"
names(m.data3)
[1] "voteshare" "seshu_dummy" "male" "inc" "nocand"
[6] "previous" "age" "ldp" "distance" "weights"
[11] "subclass"
df1
)
と比較すると、m.data3
では新たに 3 つの変数
(distance
, weights
, subclass
)
がつくられていることがわかるm.data3
の中を確認する ::datatable(m.data3) DT
<- lm(voteshare ~ seshu_dummy + male + inc + nocand + previous + age + ldp,
model5 data = df1)
tidy(model5)
# A tibble: 8 × 5
term estimate std.error statistic p.value
<chr> <dbl> <dbl> <dbl> <dbl>
1 (Intercept) 32.1 3.41 9.40 2.84e-20
2 seshu_dummy 2.79 1.80 1.55 1.21e- 1
3 male 3.90 1.37 2.84 4.56e- 3
4 inc 20.9 1.67 12.5 7.79e-34
5 nocand -3.02 0.518 -5.82 7.46e- 9
6 previous 2.60 0.318 8.16 8.58e-16
7 age -0.146 0.0509 -2.87 4.19e- 3
8 ldp -2.74 1.56 -1.75 7.98e- 2
seshu_dummy
の係数・・・ 2.79p-value = 0.121
→ 統計的に有意ではないATE
の推定(層内で共分散分析を行う場合)ATE
の推定library(lmtest)
library(sandwich)
psp
, psvar
, nps
,
robustvar
<- nrow(df1) # データに含まれる標本サイズ (n = 1294) を設定
n <- NULL # t1 の偏回帰係数
psp <- NULL # t1 の標準誤差を二乗した値(=分散)
ps_var <- NULL # 層ごとの標本サイズ
nps <- NULL # 各層内でのクラスターに頑強な分散 robust_var
for ループ
を使って計算を自動化するm.data3
の 1 から 5 までの層化番号を j
と指定するvoteshare
を 1 つの処置変数
female
と 8 つの共変量
seshu_dummy, inc, nocand, previous, age, exp, male, ldp
で回帰するfor(j in 1:sub){
<- m.data3[m.data3$subclass == j,] # j 番目の層のデータを取り出して data_ps と名前を付ける
data_ps <- lm(voteshare ~ seshu_dummy + male + inc + nocand + previous + age + ldp,
model5 data = df1) # data_ps を使って j 番目の層内で共分散分析を実行
<- summary(model5)$coefficients[2, 1] # female の偏回帰係数を取り出して psp に入れる
psp[j] <- summary(model5)$coefficients[2, 2]^2 # female の標準誤差を 2 乗して (=分散) 取り出して ps_var に入れる
ps_var[j] <- nrow(data_ps) # data_ps の標本サイズ (N) を入れる
nps[j] <- coeftest(model5, # 各層内でのクラスターに頑強な分散
robust_var[j] vcov. = vcovCL)[2,2]
}
psp
は次のとおり psp
[1] 2.793121 2.793121 2.793121 2.793121 2.793121
nps
は nps
[1] 222 233 226 227 227
psp
を統合する\[\hat{τ}_{ATE}=\sum_{k=1}^K \frac{n_k}{N}[\bar{Y}_k(1) - \bar{Y}_k(0)] \\ = \frac{222}{1294} ・ 2.793121 + \frac{233}{1294} ・ 2.793121 + \frac{226}{1294}・2.793121 \\ + \frac{227}{1294}・2.793121 + \frac{227}{1294}・2.793121 \\ = 2.793121 \]
ATE
の推定値<- sum((nps/n) * psp)
tau_hat tau_hat
[1] 2.793121
統計的有意性を確認するために必要なのは次の 2 つの情報
1. ATE
の推定値:
tau_hat
2.
統合したクラスターに頑強な標準誤差
ATE
の推定値: tau_hat
は上で得られたので、統合したクラスターに頑強な標準誤差を計算する
各層内での標準誤差の 2 乗(=分散)ps_var
は次のとおり
ps_var
[1] 3.245972 3.245972 3.245972 3.245972 3.245972
ps_var
を使って統合した標準誤差を計算する<- sum((nps/n)^2 * ps_var)
var_tau sqrt(var_tau)
[1] 0.805823
robust_var
は次のとおり robust_var
[1] 1.589279 1.589279 1.589279 1.589279 1.589279
robust_var
を使って統合したクラスターに頑強な標準誤差を計算する<- sum((nps/n)^2 * robust_var)
robust_var_tau <- sqrt(robust_var_tau)
robust_se_tau robust_se_tau
[1] 0.5638548
tau_hat
と robust_se_tau
を使って 95%
信頼区間を計算する<- qt(0.975, n - 8) # パラメータの数は 8
ci_95 + ci_95 * robust_se_tau tau_hat
[1] 3.899444
- ci_95 * robust_se_tau tau_hat
[1] 1.686797
1.686797 〜 3.899444
で 0
をまたがない ATE
の真値と推定値
(2009年総選挙:世襲議員の処置効果) ・ATE
の真値 = 不明
・単純な重回帰分析の推定値 =
2.79(統計的に有意ではない)
・共分散分析ありのATE
の推定値 = 2.79(統計的に有意)
・
傾向スコアを使ってマッチングする際、処置群と統制群が「十分に似ているかどうか」を確認する必要がある
→ 共変量の分布が処置群と統制群で十分にバランシングしているかどうか
・ ここでは傾向スコアをモデル化した m.out2
の結果のサマリーを出力してバランシングの評価指標を表示してみる
<- 5 # 層の数を指定
sub <- matchit(seshu_dummy ~ male + inc + nocand + previous + age + ldp,
m.out3 data = df1,
method = "subclass",
subclass = sub,
estimand = "ATE",
min.n = 2)
m.out3
A matchit object
- method: Subclassification (5 subclasses)
- distance: Propensity score
- estimated with logistic regression
- number of obs.: 1135 (original), 1135 (matched)
- target estimand: ATE
- covariates: male, inc, nocand, previous, age, ldp
・ Std.Mean Diff
の値が 0
に近いほど、バランスがとれている
・ Var.Ratio
の値が 1 に近いほど、バランスがとれている
summary(m.out3)
Call:
matchit(formula = seshu_dummy ~ male + inc + nocand + previous +
age + ldp, data = df1, method = "subclass", estimand = "ATE",
subclass = sub, min.n = 2)
Summary of Balance for All Data:
Means Treated Means Control Std. Mean Diff. Var. Ratio eCDF Mean
distance 0.3881 0.0805 1.6100 3.0786 0.4162
male 0.9470 0.8285 0.3820 . 0.1185
inc 0.8864 0.2772 1.5701 . 0.6092
nocand 3.7197 4.0379 -0.3477 0.7583 0.0436
previous 4.1818 0.9521 1.2347 2.8052 0.1899
age 54.8712 49.4666 0.4949 0.9193 0.0958
ldp 0.7576 0.1884 1.3874 . 0.5691
eCDF Max
distance 0.6626
male 0.1185
inc 0.6092
nocand 0.1660
previous 0.5743
age 0.2058
ldp 0.5691
Summary of Balance Across Subclasses
Means Treated Means Control Std. Mean Diff. Var. Ratio eCDF Mean
distance 0.1345 0.1067 0.1458 1.6670 0.0607
male 0.9347 0.8414 0.3008 . 0.0933
inc 0.3565 0.3468 0.0250 . 0.0097
nocand 4.1982 4.0057 0.2104 1.2364 0.0404
previous 1.9766 1.2076 0.2940 1.4411 0.0388
age 49.5520 49.9827 -0.0394 0.7247 0.0383
ldp 0.2554 0.2520 0.0083 . 0.0034
eCDF Max
distance 0.2720
male 0.0933
inc 0.0097
nocand 0.1759
previous 0.2328
age 0.1309
ldp 0.0034
Percent Balance Improvement:
Std. Mean Diff. Var. Ratio eCDF Mean eCDF Max
distance 90.9 45.9 85.4 58.9
male 21.3 . 21.3 21.3
inc 98.4 . 98.4 98.4
nocand 39.5 -63.1 7.3 -5.9
previous 76.2 48.6 79.6 59.5
age 92.0 21.2 60.0 36.4
ldp 99.4 . 99.4 99.4
Sample Sizes:
Control Treated
All 1003. 132.
Matched (ESS) 956.82 20.43
Matched 1003. 132.
Unmatched 0. 0.
Discarded 0. 0.
・ これだとわかりにくいので love plot
を描いて、バランシングの改善を可視化してみる
plot(summary(m.out3), position=NULL, xlim = c(-0.5, 1.7))
・ ○ が傾向スコアマッチング前
・ ● が傾向スコアマッチング後
・ 横軸・・・標準化平均差
(Standardized Mean Differences
)
・ 標準化平均差 = 処置群と統制群の分布の違い
・ この値が小さいほど望ましい
・ この値が 0 であることが理想
・ この値は 0.1 以下であることが望ましい
・
マッチング前(○)と比べると、マッチング後(●)の標準化平均差が小さくなっている
・
傾向スコアマッチング後に、処置群と統制群の分布の違いが小さくなっている
→ 傾向スコアマッチング後のバランス(●)は大幅に改善
→ ここでの傾向スコアマッチングでは、共変量の偏りが十分是正された
Question
:
「8. 世襲候補者は選挙で有利なのか?
」を参考に、小泉純一郎総理が主導して大勝利をもたらした
2005
の「郵政選挙」において、世襲候補者は得票において有利だといえたのかどうか、傾向スコアマッチングを使って調べたい
Q1
: 2005年の「郵政選挙」と民主党による政権交代が実現した
2009
年総選挙と比較すると、どちらの総選挙において世襲候補者がより有意だといえるか?
Q2
:
2005年の「郵政選挙」と2009年の「政権交代選挙」において世襲候補者の優位性に差があるとすれば、それはなぜであろうか?分析結果から推定できる範囲であなたの考えを書きなさい