マッチング・レポート

太郎丸 博

レポート課題

以下の要領に従い、処置および、結果変数を以下から選んで、マッチング法で処置群の平均処置効果 Average Treatment Effect of Treated (ATT) を計算しなさい。

  • 処置1: 最終学歴(4年制大学か、大学院か)
  • 処置2: 最後に行った学校を卒業したか、中退したか
  • 結果1: 個人年収
  • 結果2: 生活満足度

要領

  1. データは univ20250616.csv を使う(データは第三者に見せたり配布したり、公開してはいけない)。
  2. 分量は特に指定しない。必要十分なだけ書くこと。
  3. 離散変数に関しては厳密復元マッチング、年齢に関しては最近傍復元マッチングで計算(後の解説を参照)。
  4. 大学院を処置とする場合、卒業状況は交絡要因とは考えにくいので、卒業状況はマッチしなくていいと思う
  5. 以下の手続きに従うこと。

復元/非復元マッチング

  • 復元マッチング:統制群の事例を複数回使っていい
  • 非復元  〃  : 統制群はそれぞれ一度しか使えない
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 を捨ててもよい

手続1 データの読み込み

  1. univ20250616.csv をリソースからダウンロード
  2. Google Spreadsheet から、「ファイル」「インポート」「アップロード」で、univ20250616.csv を選択
  3. デフォルトの設定のまま「データをインポート」をクリック
  4. 「今すぐ開く」をクリック

手続2 必要ない列を削除

  • この作業は必ずしも必要ないが、余分な列がないほうがわかりやすい
  • id は計算には必要ないが、混乱や間違いを避けるために必要なので残す
  • 選ばなかった結果変数は削除
  • 学歴を処置とする場合、卒業状況は交絡要因にならないので、削除する
  • 卒業状況を処置とする場合は、学歴も残す

手続3 データのソート: 大学院が処置

  1. データを選択し、「データ」「範囲を並べ替え」「範囲の並べ替え詳細オプション」をクリック
  2. 「データにヘッダ行が含まれている」をチェック
  3. 「並べ替え条件」を「sex」にする
  4. 「並べ替えの基準となる別の列を追加」をクリック
  5. 「並べ替え条件」を「専門分野」にする
  6. 同様にして、「age」「最終学歴」の順で並べ替えの基準とし、「並べ替え」をクリック

手続4 データのソート: 中退が処置

卒業状況を処置変数とする場合もほぼ同じだが、sex, 最終学歴, 専門分野, 年齢, 卒業状況の順で並べ替えるとよいと思う。

手続5 マッチング

  1. 「大学院」の行を探し、その上下で同じ性別、同じ専門分野でできるだけ年齢の近い「4大」の事例を探す
  1. 同じ性別、年齢等の4大が複数該当する場合どれか一つマッチさせる(一番下の事例、などルール決める)
  1. 新しくシートを作って、そこに「大学院」の行をコピぺ
  2. コピペした大学院の行とマッチさせる「4大」の行を、大学院の行の「右」にコピペ
  3. 以下同様に、「大学院」の行を探し、マッチさせる「4大」の行を探し、データを別のシートにコピペ

手続6 ATT の計算

  1. 一番右の列に、「大学院」の結果変数の値と「4大」の結果変数の値の差を計算・入力
  2. それらの差の平均値が処置群の平均処置効果 ATT

手続7 計算結果のまとめ

  • 文章でまとめる
  • いわゆる IMRaD (Introduction, Methods, Results, and Discussion) 構成でまとめる
    • IMRaD 構成についてはググれ
  • データは美的労働調査2024のデータから4年制大学または大学院が最終学歴のものだけとってきたもの(ふつう Methods の節に書く)

評価基準

  1. この授業を受講していない社会学を勉強している京大生が読んでもわかる
  2. 正しく計算されていることがわかる
  3. 誤字脱字、論理の飛躍や無駄な繰り返しなどがない
  4. 指定された手続に従っている
  5. 気の利いたイントロや議論などついていればさらに加点

データの記述統計1

こういう基本的事実を確認しておくと間違いに気づきやすい

sex 最終学歴 専門分野 卒業状況
男:199 4大 :301 社会科学:157 卒業:309
女:132 大学院: 30 人文学 : 55 中退: 22
工学 : 49
保健 : 19
理学 : 18
教育学 : 13
(Other) : 20

データの記述統計2

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

R の MatchIt パッケージで ATT を計算: 個人収入

おまけ:傾向スコアを使っているので、課題の結果とは少し違う結果になる

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)
Statistical models
  大学院 中退
(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

カッコ内は標準誤差

R の MatchIt パッケージで ATT を計算: 生活満足度

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)
Statistical models
  大学院 中退
(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

カッコ内は標準誤差