| id | 処置 | 年齢 | 結果 |
|---|---|---|---|
| 1 | 処置群 | 20 | 10 |
| 2 | 処置群 | 20 | 12 |
| 3 | 処置群 | 18 | 8 |
| 4 | 統制群 | 25 | 9 |
| 5 | 統制群 | 20 | 7 |
| 6 | 統制群 | 18 | 6 |
以下の要領に従い、処置および、結果変数を以下から選んで、マッチング法で処置群の平均処置効果 Average Treatment Effect of Treated (ATT) を計算しなさい。
| id | 処置 | 年齢 | 結果 |
|---|---|---|---|
| 1 | 処置群 | 20 | 10 |
| 2 | 処置群 | 20 | 12 |
| 3 | 処置群 | 18 | 8 |
| 4 | 統制群 | 25 | 9 |
| 5 | 統制群 | 20 | 7 |
| 6 | 統制群 | 18 | 6 |
復元マッチングの場合、事例 1, 2 はどちらも同じ年齢の事例 5 とマッチさせるので、 \[ \mathrm{ATT} = \frac{(10-7) + (12-7) + (8-6)}{3}= 3.33 \] となる。非復元マッチングの場合、事例 5 は1回しか使えないので、事例 1, 2 のいずれかは事例 4 とマッチさせ、 \[ \mathrm{ATT} =\frac{(10-9) + (12-7) + (8-6)}{3}= 2.67 \]
厳密 exact マッチング: 共変量の値が完全に一致するペアのみマッチさせ、マッチしないデータはすべて捨てる
最近傍 nearest neighbor マッチング: 共変量の値が最も近いペアをマッチさせる
前ページの非復元マッチングでは、A の値の異なる 事例 1 と 4 をマッチさせているので最近傍マッチング
非復元厳密マッチングすると、 \[ \mathrm{ATT} =\frac{(10-7) + (8-6)}{2}= 2.5 \] 上の計算では事例 5 を捨てたが、事例 4 を捨ててもよい
卒業状況を処置変数とする場合もほぼ同じだが、sex, 最終学歴, 専門分野, 年齢, 卒業状況の順で並べ替えるとよいと思う。
こういう基本的事実を確認しておくと間違いに気づきやすい
| sex | 最終学歴 | 専門分野 | 卒業状況 | |
|---|---|---|---|---|
| 男:199 | 4大 :301 | 社会科学:157 | 卒業:309 | |
| 女:132 | 大学院: 30 | 人文学 : 55 | 中退: 22 | |
| 工学 : 49 | ||||
| 保健 : 19 | ||||
| 理学 : 18 | ||||
| 教育学 : 13 | ||||
| (Other) : 20 |
| age | 個人年収 | 生活満足度 | |
|---|---|---|---|
| Min. :22 | Min. : 0 | Min. :0.0 | |
| 1st Qu.:29 | 1st Qu.: 200 | 1st Qu.:2.0 | |
| Median :39 | Median : 400 | Median :3.0 | |
| Mean :39 | Mean : 424 | Mean :2.4 | |
| 3rd Qu.:48 | 3rd Qu.: 600 | 3rd Qu.:3.0 | |
| Max. :59 | Max. :2300 | Max. :4.0 |
おまけ:傾向スコアを使っているので、課題の結果とは少し違う結果になる
library(MatchIt)
## 大学院かどうかを処置とした場合
m.out1 <- matchit(I(edu =="大学院") ~ sex + age + field, data= d1, replace = TRUE, distance = "glm", method = "nearest")
m.data1 <- get_matches(m.out1)
l1 <- list()
l1 [[1]] <- lm(inc ~ edu, data= m.data1, weights = weights)
## 中退かどうかを処置とした場合
m.out2 <- matchit(I(grad =="中退") ~ sex + age + field, data= d1, replace = TRUE, distance = "glm", method = "nearest")
m.data2 <- get_matches(m.out2)
l1 [[2]] <- lm(inc ~ grad, data= m.data2, weights = weights)
library(texreg)
knitreg(l1,
custom.model.names = c("大学院", "中退"),
include.adjrs = FALSE)| 大学院 | 中退 | |
|---|---|---|
| (Intercept) | 429.67*** | 413.18*** |
| (72.05) | (76.05) | |
| edu大学院 | 312.83** | |
| (101.89) | ||
| grad中退 | -66.82 | |
| (107.55) | ||
| R2 | 0.14 | 0.01 |
| Num. obs. | 60 | 44 |
| ***p < 0.001; **p < 0.01; *p < 0.05 | ||
カッコ内は標準誤差
l2 <- list()
for(i in 1 : length(l1)){
l2 [[i]] <- update(l1 [[i]], satisfaction ~ .)
}
library(texreg)
knitreg(l2,
custom.model.names = c("大学院", "中退"),
include.adjrs = FALSE)| 大学院 | 中退 | |
|---|---|---|
| (Intercept) | 2.27*** | 2.23*** |
| (0.21) | (0.28) | |
| edu大学院 | 0.10 | |
| (0.30) | ||
| grad中退 | -0.27 | |
| (0.40) | ||
| R2 | 0.00 | 0.01 |
| Num. obs. | 60 | 44 |
| ***p < 0.001; **p < 0.01; *p < 0.05 | ||
カッコ内は標準誤差