assignment_1

Author

Sam Kuhn

Part 1: Regression Analysis

## Load data
#| echo: false
#| message: false
library(tidyverse)
library(tidymodels)
library(haven)
library(gt)
library(modelsummary)
library(corrplot)
library(MatchIt)
library(marginaleffects)
options(kableExtra.latex.load_packages = FALSE)

lalonde_df <- haven::read_dta(here::here("data", "lalonde.dta"))
psid_df <- haven::read_dta(here::here("data", "psid.dta"))

1. Estimate ATE by calculating mean difference in earnings between treatment and control group

lalonde_df |> 
  group_by(treat) |> 
  summarise(mean_earnings = mean(re78)) |> 
  gt::gt() |>
  tab_header(
    title = "Mean difference in earnings, 1978"
  ) |>
  cols_label(
    treat = "Received job training",
    mean_earnings = "Mean earnings, 1978 dollars"
  )
Mean difference in earnings, 1978
Received job training Mean earnings, 1978 dollars
0 4554.802
1 6349.145

2. Estimate ATE using non-experimental data

psid_df |> 
  group_by(treat) |> 
  summarise(mean_earnings = mean(re78)) |> 
  gt::gt() |>
  tab_header(
    title = "Mean difference in earnings, 1978"
  ) |>
  cols_label(
    treat = "Received job training",
    mean_earnings = "Mean earnings, 1978 dollars"
  )
Mean difference in earnings, 1978
Received job training Mean earnings, 1978 dollars
0 21553.921
1 6349.145

3. Estimate ATE using OLS on all covariates

lm_1 <- lm(re78 ~ treat + age + educ + black + hisp + marr + re74 + re75 + u74 + u75, data = psid_df)
summary(lm_1)

Call:
lm(formula = re78 ~ treat + age + educ + black + hisp + marr + 
    re74 + re75 + u74 + u75, data = psid_df)

Residuals:
   Min     1Q Median     3Q    Max 
-65427  -4347   -369   3783 111501 

Coefficients:
              Estimate Std. Error t value Pr(>|t|)    
(Intercept)  9.536e+02  1.371e+03   0.696   0.4866    
treat        1.154e+02  1.007e+03   0.115   0.9088    
age         -8.977e+01  2.194e+01  -4.091 4.41e-05 ***
educ         5.141e+02  7.644e+01   6.726 2.13e-11 ***
black       -4.542e+02  4.969e+02  -0.914   0.3607    
hisp         2.197e+03  1.092e+03   2.013   0.0442 *  
marr         1.205e+03  5.855e+02   2.058   0.0397 *  
re74         3.126e-01  3.163e-02   9.883  < 2e-16 ***
re75         5.436e-01  3.090e-02  17.592  < 2e-16 ***
u74         -1.462e+03  9.472e+02  -1.543   0.1228    
u75          2.390e+03  1.024e+03   2.333   0.0197 *  
---
Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1

Residual standard error: 10060 on 2664 degrees of freedom
Multiple R-squared:  0.5871,    Adjusted R-squared:  0.5855 
F-statistic: 378.8 on 10 and 2664 DF,  p-value: < 2.2e-16

4. Estimate ATE using simple difference in 1978 and 1975 wages

#manual method
psid_df |> 
  group_by(treat) |> 
  summarise(
    mean_75 = mean(re75),
    mean_78 = mean(re78),
    simple_ate = (mean_78 - mean_75)
  ) |> 
  gt::gt() |>
  tab_header(
    title = "Mean Difference in 1978 and 1975 Wages"
  ) |>
  cols_label(
    mean_75 = "Mean earnings, 1975",
    mean_78 = "Mean earnings, 1978",
    simple_ate = "Average treatment effect"
  )
Mean Difference in 1978 and 1975 Wages
Treatment indicator Mean earnings, 1975 Mean earnings, 1978 Average treatment effect
0 19063.337 21553.921 2490.585
1 1532.056 6349.145 4817.090

5. Estimate the average treatment effect using the regression-adjusted differences

psid_df <- psid_df |> 
  mutate(diff = (re78 - re75))
ate_ols <- lm(diff ~ treat + age + educ + black + hisp + marr + re74 + u74 + u75, data = psid_df)
summary(ate_ols)

Call:
lm(formula = diff ~ treat + age + educ + black + hisp + marr + 
    re74 + u74 + u75, data = psid_df)

Residuals:
   Min     1Q Median     3Q    Max 
-69217  -4434   -405   3939 114605 

Coefficients:
              Estimate Std. Error t value Pr(>|t|)    
(Intercept)  1.596e+03  1.425e+03   1.120  0.26274    
treat        1.029e+03  1.045e+03   0.985  0.32488    
age         -1.111e+02  2.277e+01  -4.879 1.13e-06 ***
educ         3.791e+02  7.892e+01   4.803 1.65e-06 ***
black       -1.763e+02  5.163e+02  -0.341  0.73280    
hisp         2.803e+03  1.134e+03   2.470  0.01356 *  
marr         1.091e+03  6.088e+02   1.792  0.07322 .  
re74        -5.531e-02  2.026e-02  -2.729  0.00639 ** 
u74          4.835e+03  8.795e+02   5.498 4.21e-08 ***
u75         -2.643e+03  1.005e+03  -2.631  0.00857 ** 
---
Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1

Residual standard error: 10470 on 2665 degrees of freedom
Multiple R-squared:  0.04552,   Adjusted R-squared:  0.0423 
F-statistic: 14.12 on 9 and 2665 DF,  p-value: < 2.2e-16

Part 2: Matching

1. Estimate the probability of treatment (the propensity score) as a function of all the pre-treatment variables

pscores_mi <- matchit(treat ~ age + educ + black + hisp + marr + re75 + 
                re74 + u74 + u75, data = psid_df)
summary(pscores_mi)

Call:
matchit(formula = treat ~ age + educ + black + hisp + marr + 
    re75 + re74 + u74 + u75, data = psid_df)

Summary of Balance for All Data:
         Means Treated Means Control Std. Mean Diff. Var. Ratio eCDF Mean
distance        0.6818        0.0236          2.2091    10.7691    0.4852
age            25.8162       34.8506         -1.2627     0.4696    0.2317
educ           10.3459       12.1169         -0.8808     0.4255    0.1091
black           0.8432        0.2506          1.6301          .    0.5926
hisp            0.0595        0.0325          0.1139          .    0.0269
marr            0.1892        0.8663         -1.7287          .    0.6771
re75         1532.0556    19063.3368         -5.4458     0.0561    0.4695
re74         2095.5740    19428.7453         -3.5471     0.1329    0.4681
u74             0.6000        0.1000          1.0206          .    0.5000
u75             0.7081        0.0863          1.3676          .    0.6218
         eCDF Max
distance   0.8869
age        0.3771
educ       0.4029
black      0.5926
hisp       0.0269
marr       0.6771
re75       0.7736
re74       0.7292
u74        0.5000
u75        0.6218

Summary of Balance for Matched Data:
         Means Treated Means Control Std. Mean Diff. Var. Ratio eCDF Mean
distance        0.6818        0.2574          1.4245     1.7607    0.0477
age            25.8162       29.2054         -0.4737     0.4720    0.0869
educ           10.3459       10.5892         -0.1210     0.4983    0.0436
black           0.8432        0.7297          0.3122          .    0.1135
hisp            0.0595        0.0649         -0.0229          .    0.0054
marr            0.1892        0.5189         -0.8419          .    0.3297
re75         1532.0556     3450.3586         -0.5959     0.7658    0.0719
re74         2095.5740     4933.3903         -0.5807     0.7146    0.0833
u74             0.6000        0.3730          0.4634          .    0.2270
u75             0.7081        0.3838          0.7134          .    0.3243
         eCDF Max Std. Pair Dist.
distance   0.6432          1.4245
age        0.1405          1.3092
educ       0.1459          1.2340
black      0.1135          0.8772
hisp       0.0054          0.4343
marr       0.3297          1.1179
re75       0.3351          1.0537
re74       0.3568          1.0470
u74        0.2270          1.1034
u75        0.3243          1.1890

Sample Sizes:
          Control Treated
All          2490     185
Matched       185     185
Unmatched    2305       0
Discarded       0       0
#probit model
pscores <- glm(treat ~ age + educ + black + hisp + marr + re75 + 
                re74 + u74 + u75, family = binomial(link = "probit"), data = psid_df)
Warning: glm.fit: fitted probabilities numerically 0 or 1 occurred
modelsummary(pscores, stars = TRUE)
(1)
(Intercept) 0.775
(0.506)
age -0.059***
(0.009)
educ -0.055+
(0.029)
black 1.415***
(0.180)
hisp 1.167***
(0.303)
marr -0.840***
(0.142)
re75 0.000***
(0.000)
re74 0.000
(0.000)
u74 -0.544*
(0.236)
u75 1.721***
(0.251)
Num.Obs. 2675
AIC 451.4
BIC 510.3
Log.Lik. -215.687
F 32.032
RMSE 0.15
+ p < 0.1, * p < 0.05, ** p < 0.01, *** p < 0.001
pscores_fitted <- fitted(pscores)
psid_df$pscores <- pscores_fitted

2. Reestimate the propensity score with common support

pscores_cs <- matchit(
  formula = treat ~ age + educ + black + hisp + marr + re75 + re74 + u74 + u75,
  distance = "glm",
  discard = "both",
  data = psid_df
)
summary(pscores_cs)

Call:
matchit(formula = treat ~ age + educ + black + hisp + marr + 
    re75 + re74 + u74 + u75, data = psid_df, distance = "glm", 
    discard = "both")

Summary of Balance for All Data:
         Means Treated Means Control Std. Mean Diff. Var. Ratio eCDF Mean
distance        0.6818        0.0236          2.2091    10.7691    0.4852
age            25.8162       34.8506         -1.2627     0.4696    0.2317
educ           10.3459       12.1169         -0.8808     0.4255    0.1091
black           0.8432        0.2506          1.6301          .    0.5926
hisp            0.0595        0.0325          0.1139          .    0.0269
marr            0.1892        0.8663         -1.7287          .    0.6771
re75         1532.0556    19063.3368         -5.4458     0.0561    0.4695
re74         2095.5740    19428.7453         -3.5471     0.1329    0.4681
u74             0.6000        0.1000          1.0206          .    0.5000
u75             0.7081        0.0863          1.3676          .    0.6218
         eCDF Max
distance   0.8869
age        0.3771
educ       0.4029
black      0.5926
hisp       0.0269
marr       0.6771
re75       0.7736
re74       0.7292
u74        0.5000
u75        0.6218

Summary of Balance for Matched Data:
         Means Treated Means Control Std. Mean Diff. Var. Ratio eCDF Mean
distance        0.6767        0.2604          1.3973     1.7492    0.0464
age            25.9341       29.1044         -0.4431     0.4753    0.0813
educ           10.3571       10.6099         -0.1257     0.5008    0.0433
black           0.8407        0.7253          0.3174          .    0.1154
hisp            0.0604        0.0659         -0.0232          .    0.0055
marr            0.1923        0.5165         -0.8277          .    0.3242
re75         1546.4132     3436.4065         -0.5871     0.7206    0.0685
re74         2130.1164     4934.2940         -0.5738     0.7086    0.0826
u74             0.6099        0.3791          0.4711          .    0.2308
u75             0.7033        0.3901          0.6889          .    0.3132
         eCDF Max Std. Pair Dist.
distance   0.6374          1.3974
age        0.1264          1.2709
educ       0.1538          1.3281
black      0.1154          1.0125
hisp       0.0055          0.5344
marr       0.3242          0.9680
re75       0.3242          0.9980
re74       0.3462          1.0320
u74        0.2308          0.9870
u75        0.3132          1.0273

Sample Sizes:
          Control Treated
All          2490     185
Matched       182     182
Unmatched    1093       0
Discarded    1215       3
plot(pscores_cs, type = "density", which.xs = ~age + educ + re75 + re74 + u74 + u75)

3a. Estimate the average treatment effect for the treated using nearest neighbor matching based on the propensity score.

pscores_ncs <- matchit(
  formula = treat ~ age + educ + black + hisp + marr + re75 + re74 + u74 + u75,
  method = "nearest",
  distance = "glm",
  link = "probit",
  replace = TRUE,
  discard = "none",
  data = psid_df
)
summary(pscores_ncs)

Call:
matchit(formula = treat ~ age + educ + black + hisp + marr + 
    re75 + re74 + u74 + u75, data = psid_df, method = "nearest", 
    distance = "glm", link = "probit", discard = "none", replace = TRUE)

Summary of Balance for All Data:
         Means Treated Means Control Std. Mean Diff. Var. Ratio eCDF Mean
distance        0.6613        0.0251          2.1847    10.3530    0.4993
age            25.8162       34.8506         -1.2627     0.4696    0.2317
educ           10.3459       12.1169         -0.8808     0.4255    0.1091
black           0.8432        0.2506          1.6301          .    0.5926
hisp            0.0595        0.0325          0.1139          .    0.0269
marr            0.1892        0.8663         -1.7287          .    0.6771
re75         1532.0556    19063.3368         -5.4458     0.0561    0.4695
re74         2095.5740    19428.7453         -3.5471     0.1329    0.4681
u74             0.6000        0.1000          1.0206          .    0.5000
u75             0.7081        0.0863          1.3676          .    0.6218
         eCDF Max
distance   0.8825
age        0.3771
educ       0.4029
black      0.5926
hisp       0.0269
marr       0.6771
re75       0.7736
re74       0.7292
u74        0.5000
u75        0.6218

Summary of Balance for Matched Data:
         Means Treated Means Control Std. Mean Diff. Var. Ratio eCDF Mean
distance        0.6613        0.6623         -0.0035     0.9568    0.0010
age            25.8162       24.8649          0.1330     0.7715    0.0721
educ           10.3459       10.6432         -0.1479     0.6351    0.0366
black           0.8432        0.7622          0.2230          .    0.0811
hisp            0.0595        0.1135         -0.2286          .    0.0541
marr            0.1892        0.1243          0.1656          .    0.0649
re75         1532.0556     2490.2992         -0.2977     0.6553    0.0342
re74         2095.5740     2230.1760         -0.0275     0.9654    0.0102
u74             0.6000        0.4000          0.4082          .    0.2000
u75             0.7081        0.6865          0.0476          .    0.0216
         eCDF Max Std. Pair Dist.
distance   0.0595          0.0257
age        0.2486          0.9217
educ       0.1351          1.2017
black      0.0811          0.8772
hisp       0.0541          0.7314
marr       0.0649          0.4140
re75       0.2000          0.7985
re74       0.0757          0.5157
u74        0.2000          0.8717
u75        0.0216          0.4756

Sample Sizes:
              Control Treated
All           2490.       185
Matched (ESS)   23.95     185
Matched         60.       185
Unmatched     2430.         0
Discarded        0.         0
mdata_a <- match.data(pscores_ncs)
fit_a <- lm(re78 ~ treat + age + educ + black + hisp + marr + re75 + re74 + u74 + u75, data = mdata_a)
summary(fit_a)

Call:
lm(formula = re78 ~ treat + age + educ + black + hisp + marr + 
    re75 + re74 + u74 + u75, data = mdata_a)

Residuals:
   Min     1Q Median     3Q    Max 
-12374  -5063  -1332   3302  51090 

Coefficients:
              Estimate Std. Error t value Pr(>|t|)   
(Intercept) -2689.1973  3750.9391  -0.717  0.47413   
treat         739.8824  1174.0052   0.630  0.52917   
age            -0.7872    65.8083  -0.012  0.99047   
educ          528.3949   226.1950   2.336  0.02034 * 
black         -24.1616  1520.9149  -0.016  0.98734   
hisp          -39.3648  2379.8769  -0.017  0.98682   
marr          962.9716  1221.5496   0.788  0.43131   
re75            0.2448     0.1878   1.303  0.19374   
re74            0.3122     0.1369   2.280  0.02352 * 
u74         -3230.9958  1514.9344  -2.133  0.03399 * 
u75          5086.6401  1699.7399   2.993  0.00306 **
---
Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1

Residual standard error: 7371 on 234 degrees of freedom
Multiple R-squared:  0.1372,    Adjusted R-squared:  0.1003 
F-statistic:  3.72 on 10 and 234 DF,  p-value: 0.0001198

3b. Estimate the average treatment effect for the treated by stratifying on the propensity score.

#strata
pscores_stratified <- matchit(
  formula = treat ~ age + educ + black + hisp + marr + re75 + re74 + u74 + u75,
  method = "subclass",
  estimand = "ATT",
  subclass = 5,
  distance = "glm",
  discard = "none",
  data = psid_df
)
summary(pscores_stratified)

Call:
matchit(formula = treat ~ age + educ + black + hisp + marr + 
    re75 + re74 + u74 + u75, data = psid_df, method = "subclass", 
    distance = "glm", estimand = "ATT", discard = "none", subclass = 5)

Summary of Balance for All Data:
         Means Treated Means Control Std. Mean Diff. Var. Ratio eCDF Mean
distance        0.6818        0.0236          2.2091    10.7691    0.4852
age            25.8162       34.8506         -1.2627     0.4696    0.2317
educ           10.3459       12.1169         -0.8808     0.4255    0.1091
black           0.8432        0.2506          1.6301          .    0.5926
hisp            0.0595        0.0325          0.1139          .    0.0269
marr            0.1892        0.8663         -1.7287          .    0.6771
re75         1532.0556    19063.3368         -5.4458     0.0561    0.4695
re74         2095.5740    19428.7453         -3.5471     0.1329    0.4681
u74             0.6000        0.1000          1.0206          .    0.5000
u75             0.7081        0.0863          1.3676          .    0.6218
         eCDF Max
distance   0.8869
age        0.3771
educ       0.4029
black      0.5926
hisp       0.0269
marr       0.6771
re75       0.7736
re74       0.7292
u74        0.5000
u75        0.6218

Summary of Balance Across Subclasses
         Means Treated Means Control Std. Mean Diff. Var. Ratio eCDF Mean
distance        0.6818        0.6452          0.1227     0.6944    0.0834
age            25.8162       25.7160          0.0140     0.6592    0.0663
educ           10.3459       10.8872         -0.2692     0.5558    0.0443
black           0.8432        0.6999          0.3942          .    0.1433
hisp            0.0595        0.0750         -0.0656          .    0.0155
marr            0.1892        0.1859          0.0084          .    0.0033
re75         1532.0556     4947.4273         -1.0609     0.1078    0.0919
re74         2095.5740     5487.8700         -0.6942     0.2208    0.0926
u74             0.6000        0.3613          0.4871          .    0.2387
u75             0.7081        0.5925          0.2543          .    0.1156
         eCDF Max
distance   0.1479
age        0.2480
educ       0.1777
black      0.1433
hisp       0.0155
marr       0.0033
re75       0.2387
re74       0.1550
u74        0.2387
u75        0.1156

Sample Sizes:
              Control Treated
All           2490.       185
Matched (ESS)   29.72     185
Matched       2490.       185
Unmatched        0.         0
Discarded        0.         0
mdata_b <- match.data(pscores_stratified)
fit_b <- lm(re78 ~ treat + age + educ + black + hisp + marr, data = mdata_b)
summary(fit_b)

Call:
lm(formula = re78 ~ treat + age + educ + black + hisp + marr, 
    data = mdata_b)

Residuals:
   Min     1Q Median     3Q    Max 
-34511  -7379   -112   6816 105656 

Coefficients:
            Estimate Std. Error t value Pr(>|t|)    
(Intercept) -9039.09    1864.99  -4.847 1.33e-06 ***
treat       -5889.75    1239.03  -4.754 2.11e-06 ***
age           166.86      27.65   6.036 1.80e-09 ***
educ         1774.90      97.84  18.140  < 2e-16 ***
black       -2731.22     679.76  -4.018 6.03e-05 ***
hisp          884.79    1506.87   0.587    0.557    
marr         4533.46     803.35   5.643 1.85e-08 ***
---
Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1

Residual standard error: 13910 on 2668 degrees of freedom
Multiple R-squared:  0.2102,    Adjusted R-squared:  0.2084 
F-statistic: 118.3 on 6 and 2668 DF,  p-value: < 2.2e-16

5b Estimate ATE without labor market covariates

pscores_ncs_no_labor_market <- matchit(
  formula = treat ~ age + educ + black + hisp + marr,
  method = "nearest",
  distance = "glm",
  link = "probit",
  replace = TRUE,
  discard = "none",
  data = psid_df
)
summary(pscores_ncs_no_labor_market)

Call:
matchit(formula = treat ~ age + educ + black + hisp + marr, data = psid_df, 
    method = "nearest", distance = "glm", link = "probit", discard = "none", 
    replace = TRUE)

Summary of Balance for All Data:
         Means Treated Means Control Std. Mean Diff. Var. Ratio eCDF Mean
distance        0.4204        0.0433          1.5857     4.7499    0.5114
age            25.8162       34.8506         -1.2627     0.4696    0.2317
educ           10.3459       12.1169         -0.8808     0.4255    0.1091
black           0.8432        0.2506          1.6301          .    0.5926
hisp            0.0595        0.0325          0.1139          .    0.0269
marr            0.1892        0.8663         -1.7287          .    0.6771
         eCDF Max
distance   0.7492
age        0.3771
educ       0.4029
black      0.5926
hisp       0.0269
marr       0.6771

Summary of Balance for Matched Data:
         Means Treated Means Control Std. Mean Diff. Var. Ratio eCDF Mean
distance        0.4204        0.4201          0.0012     0.9883    0.0008
age            25.8162       25.7243          0.0128     1.0112    0.0276
educ           10.3459       10.2865          0.0296     0.8196    0.0181
black           0.8432        0.8757         -0.0892          .    0.0324
hisp            0.0595        0.0216          0.1600          .    0.0378
marr            0.1892        0.1946         -0.0138          .    0.0054
         eCDF Max Std. Pair Dist.
distance   0.0486          0.0116
age        0.1081          0.4737
educ       0.0973          0.6318
black      0.0324          0.3271
hisp       0.0378          0.2971
marr       0.0054          0.2070

Sample Sizes:
              Control Treated
All           2490.       185
Matched (ESS)   54.76     185
Matched        101.       185
Unmatched     2389.         0
Discarded        0.         0
mdata <- match.data(pscores_ncs_no_labor_market)
fit <- lm(re78 ~ treat + age + educ + black + hisp + marr, data = mdata)
summary(fit)

Call:
lm(formula = re78 ~ treat + age + educ + black + hisp + marr, 
    data = mdata)

Residuals:
   Min     1Q Median     3Q    Max 
-17218  -5261  -1120   4188  53668 

Coefficients:
            Estimate Std. Error t value Pr(>|t|)    
(Intercept)  -1086.8     3735.7  -0.291   0.7713    
treat        -5239.3     1039.9  -5.038 8.45e-07 ***
age            153.2       66.6   2.300   0.0222 *  
educ           954.0      234.9   4.061 6.36e-05 ***
black        -1817.1     1496.1  -1.215   0.2256    
hisp           703.1     2573.7   0.273   0.7849    
marr          1801.7     1180.4   1.526   0.1281    
---
Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1

Residual standard error: 8186 on 279 degrees of freedom
Multiple R-squared:  0.1822,    Adjusted R-squared:  0.1646 
F-statistic: 10.36 on 6 and 279 DF,  p-value: 2.304e-10
pscores_ncs_no_labor_market_stratified <- matchit(
  formula = treat ~ age + educ + black + hisp + marr,
  method = "subclass",
  estimand = "ATT",
  subclass = 5,
  distance = "glm",
  discard = "none",
  data = psid_df
)
summary(pscores_ncs_no_labor_market_stratified)

Call:
matchit(formula = treat ~ age + educ + black + hisp + marr, data = psid_df, 
    method = "subclass", distance = "glm", estimand = "ATT", 
    discard = "none", subclass = 5)

Summary of Balance for All Data:
         Means Treated Means Control Std. Mean Diff. Var. Ratio eCDF Mean
distance        0.4287        0.0424          1.5059     5.4867    0.5110
age            25.8162       34.8506         -1.2627     0.4696    0.2317
educ           10.3459       12.1169         -0.8808     0.4255    0.1091
black           0.8432        0.2506          1.6301          .    0.5926
hisp            0.0595        0.0325          0.1139          .    0.0269
marr            0.1892        0.8663         -1.7287          .    0.6771
         eCDF Max
distance   0.7492
age        0.3771
educ       0.4029
black      0.5926
hisp       0.0269
marr       0.6771

Summary of Balance Across Subclasses
         Means Treated Means Control Std. Mean Diff. Var. Ratio eCDF Mean
distance        0.4287        0.4067          0.0858     0.8814    0.0711
age            25.8162       26.8575         -0.1455     0.6410    0.0458
educ           10.3459       10.3987         -0.0263     0.5258    0.0390
black           0.8432        0.7564          0.2389          .    0.0868
hisp            0.0595        0.0337          0.1088          .    0.0257
marr            0.1892        0.2484         -0.1513          .    0.0593
         eCDF Max
distance   0.1307
age        0.1283
educ       0.1209
black      0.0868
hisp       0.0257
marr       0.0593

Sample Sizes:
              Control Treated
All           2490.       185
Matched (ESS)  123.34     185
Matched       2490.       185
Unmatched        0.         0
Discarded        0.         0
mdata2 <- match.data(pscores_ncs_no_labor_market_stratified)
fit2 <- lm(re78 ~ treat + age + educ + black + hisp + marr, data = mdata2)
summary(fit2)

Call:
lm(formula = re78 ~ treat + age + educ + black + hisp + marr, 
    data = mdata2)

Residuals:
   Min     1Q Median     3Q    Max 
-34511  -7379   -112   6816 105656 

Coefficients:
            Estimate Std. Error t value Pr(>|t|)    
(Intercept) -9039.09    1864.99  -4.847 1.33e-06 ***
treat       -5889.75    1239.03  -4.754 2.11e-06 ***
age           166.86      27.65   6.036 1.80e-09 ***
educ         1774.90      97.84  18.140  < 2e-16 ***
black       -2731.22     679.76  -4.018 6.03e-05 ***
hisp          884.79    1506.87   0.587    0.557    
marr         4533.46     803.35   5.643 1.85e-08 ***
---
Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1

Residual standard error: 13910 on 2668 degrees of freedom
Multiple R-squared:  0.2102,    Adjusted R-squared:  0.2084 
F-statistic: 118.3 on 6 and 2668 DF,  p-value: < 2.2e-16

6b.

pscores_cs <- matchit(
  formula = treat ~ age + educ + black + hisp + marr + re75 + re74 + u74 + u75,
  distance = "glm",
  discard = "both",
  data = psid_df
)
summary(pscores_cs)

Call:
matchit(formula = treat ~ age + educ + black + hisp + marr + 
    re75 + re74 + u74 + u75, data = psid_df, distance = "glm", 
    discard = "both")

Summary of Balance for All Data:
         Means Treated Means Control Std. Mean Diff. Var. Ratio eCDF Mean
distance        0.6818        0.0236          2.2091    10.7691    0.4852
age            25.8162       34.8506         -1.2627     0.4696    0.2317
educ           10.3459       12.1169         -0.8808     0.4255    0.1091
black           0.8432        0.2506          1.6301          .    0.5926
hisp            0.0595        0.0325          0.1139          .    0.0269
marr            0.1892        0.8663         -1.7287          .    0.6771
re75         1532.0556    19063.3368         -5.4458     0.0561    0.4695
re74         2095.5740    19428.7453         -3.5471     0.1329    0.4681
u74             0.6000        0.1000          1.0206          .    0.5000
u75             0.7081        0.0863          1.3676          .    0.6218
         eCDF Max
distance   0.8869
age        0.3771
educ       0.4029
black      0.5926
hisp       0.0269
marr       0.6771
re75       0.7736
re74       0.7292
u74        0.5000
u75        0.6218

Summary of Balance for Matched Data:
         Means Treated Means Control Std. Mean Diff. Var. Ratio eCDF Mean
distance        0.6767        0.2604          1.3973     1.7492    0.0464
age            25.9341       29.1044         -0.4431     0.4753    0.0813
educ           10.3571       10.6099         -0.1257     0.5008    0.0433
black           0.8407        0.7253          0.3174          .    0.1154
hisp            0.0604        0.0659         -0.0232          .    0.0055
marr            0.1923        0.5165         -0.8277          .    0.3242
re75         1546.4132     3436.4065         -0.5871     0.7206    0.0685
re74         2130.1164     4934.2940         -0.5738     0.7086    0.0826
u74             0.6099        0.3791          0.4711          .    0.2308
u75             0.7033        0.3901          0.6889          .    0.3132
         eCDF Max Std. Pair Dist.
distance   0.6374          1.3974
age        0.1264          1.2709
educ       0.1538          1.3281
black      0.1154          1.0125
hisp       0.0055          0.5344
marr       0.3242          0.9680
re75       0.3242          0.9980
re74       0.3462          1.0320
u74        0.2308          0.9870
u75        0.3132          1.0273

Sample Sizes:
          Control Treated
All          2490     185
Matched       182     182
Unmatched    1093       0
Discarded    1215       3
mdata_cs <- match.data(pscores_cs)
fit_cs <- lm(re78 ~ treat + age + educ + black + hisp + marr + re75 + re74 + u74 + u75, data = mdata_cs)
summary(fit_cs)

Call:
lm(formula = re78 ~ treat + age + educ + black + hisp + marr + 
    re75 + re74 + u74 + u75, data = mdata_cs)

Residuals:
   Min     1Q Median     3Q    Max 
-19335  -4867  -1629   3276 103230 

Coefficients:
              Estimate Std. Error t value Pr(>|t|)    
(Intercept) -6.859e+02  3.788e+03  -0.181   0.8564    
treat        8.151e+01  1.140e+03   0.072   0.9430    
age         -8.520e+01  6.581e+01  -1.295   0.1962    
educ         4.659e+02  2.174e+02   2.143   0.0328 *  
black        8.281e+02  1.485e+03   0.558   0.5774    
hisp         1.971e+02  2.327e+03   0.085   0.9326    
marr         1.853e+03  1.112e+03   1.667   0.0965 .  
re75        -1.012e-02  1.894e-01  -0.053   0.9574    
re74         6.714e-01  1.278e-01   5.253  2.6e-07 ***
u74         -1.151e+03  1.621e+03  -0.710   0.4782    
u75          3.512e+03  1.823e+03   1.927   0.0548 .  
---
Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1

Residual standard error: 9077 on 353 degrees of freedom
Multiple R-squared:  0.1474,    Adjusted R-squared:  0.1232 
F-statistic: 6.101 on 10 and 353 DF,  p-value: 1.388e-08
fit_ate_ols <- lm(diff ~ treat + age + educ + black + hisp + marr + re74 + u74 + u75, data = mdata_cs)
summary(fit_ate_ols)

Call:
lm(formula = diff ~ treat + age + educ + black + hisp + marr + 
    re74 + u74 + u75, data = mdata_cs)

Residuals:
   Min     1Q Median     3Q    Max 
-28817  -4870  -1533   2879 107627 

Coefficients:
              Estimate Std. Error t value Pr(>|t|)    
(Intercept) -4252.0674  3869.9324  -1.099 0.272626    
treat         708.1219  1176.6732   0.602 0.547693    
age           -68.5173    68.2328  -1.004 0.315983    
educ          461.7625   225.6787   2.046 0.041484 *  
black         288.6996  1537.7855   0.188 0.851190    
hisp          434.5207  2415.2860   0.180 0.857331    
marr         1439.5616  1151.6774   1.250 0.212136    
re74            0.4675     0.1266   3.693 0.000257 ***
u74          3066.6001  1469.3595   2.087 0.037600 *  
u75          2614.0372  1884.1405   1.387 0.166196    
---
Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1

Residual standard error: 9422 on 354 degrees of freedom
Multiple R-squared:  0.07841,   Adjusted R-squared:  0.05498 
F-statistic: 3.347 on 9 and 354 DF,  p-value: 0.0006022