# Load required packages
library(dplyr)
library(haven)
library(AER) # for 2SLS

# Load the data
card <- read_dta("https://raw.github.com/scunning1975/mixtape/master/card.dta")

# 1. Wald IV as a ratio of two covariances
# Cov(Y,Z) = E[YZ] - E[Y]E[Z]
mean_wage <- mean(card$lwage, na.rm = TRUE)
mean_iv <- mean(card$nearc4, na.rm = TRUE)
mean_educ <- mean(card$educ, na.rm = TRUE)

yz_product <- mean_wage * mean_iv
sz_product <- mean_educ * mean_iv

mean_yz <- mean(card$lwage * card$nearc4, na.rm = TRUE)
mean_sz <- mean(card$educ * card$nearc4, na.rm = TRUE)

# Calculate covariances
cov_yz <- mean_yz - yz_product
cov_sz <- mean_sz - sz_product

# Wald IV estimator (ratio of covariances)
wald_iv1 <- cov_yz / cov_sz

# 2. Wald IV as a ratio of two OLS regression coefficients
# Reduced Form
rf_model <- lm(lwage ~ nearc4, data = card)
rf <- coef(rf_model)["nearc4"]

# First Stage
fs_model <- lm(educ ~ nearc4, data = card)
fs <- coef(fs_model)["nearc4"]

# Wald IV estimator (ratio of coefficients)
wald_iv2 <- rf / fs

# 3. Wald IV as Two-Stage Least Squares (manual)
# First stage
fs_model <- lm(educ ~ nearc4, data = card)
card$shat <- predict(fs_model)

# Second stage
ss_model <- lm(lwage ~ shat, data = card)
wald_2sls1 <- coef(ss_model)["shat"]

# 4. Wald IV using built-in 2SLS
iv_model <- ivreg(lwage ~ educ | nearc4, data = card)
wald_2sls2 <- coef(iv_model)["educ"]

# Display results
list(
  wald_iv1 = wald_iv1,
  wald_iv2 = wald_iv2,
  wald_2sls1 = wald_2sls1,
  wald_2sls2 = wald_2sls2
)

