## ----include = FALSE----------------------------------------------------------
knitr::opts_chunk$set(
  collapse = TRUE,
  comment = "#>"
)

## ----setup, message = FALSE---------------------------------------------------
library(ivreg2r)
library(dplyr)
data(card)

## ----ols----------------------------------------------------------------------
fit_ols <- ivreg2(
  lwage ~ educ + exper + expersq + black + smsa + south + smsa66 +
    reg662 + reg663 + reg664 + reg665 + reg666 + reg667 + reg668 + reg669,
  data = card
)
summary(fit_ols)

## ----tsls---------------------------------------------------------------------
iv_formula <- lwage ~ exper + expersq + black + smsa + south + smsa66 +
  reg662 + reg663 + reg664 + reg665 + reg666 + reg667 + reg668 + reg669 |
  educ | nearc4

fit_iv <- ivreg2(iv_formula, data = card)
summary(fit_iv)

## ----diag-values, include = FALSE---------------------------------------------
diag_iv <- diagnostics(fit_iv)
cd_f <- diag_iv |> filter(test == "weak_id") |> pull(statistic)
sy10 <- diag_iv |> filter(test == "sy_iv_size_10") |> pull(statistic)
sy15 <- diag_iv |> filter(test == "sy_iv_size_15") |> pull(statistic)
underid_stat <- diag_iv |> filter(test == "underid") |> pull(statistic)
underid_p <- diag_iv |> filter(test == "underid") |> pull(p_value)
endog_stat <- diag_iv |> filter(test == "endogeneity") |> pull(statistic)
endog_p <- diag_iv |> filter(test == "endogeneity") |> pull(p_value)
ar_chi2_p <- diag_iv |> filter(test == "anderson_rubin_chi2") |> pull(p_value)
educ_z_p <- tidy(fit_iv) |> filter(term == "educ") |> pull(p.value)

## ----overid-------------------------------------------------------------------
fit_overid <- ivreg2(
  lwage ~ exper + expersq + black + smsa + south + smsa66 +
    reg662 + reg663 + reg664 + reg665 + reg666 + reg667 + reg668 + reg669 |
    educ | nearc2 + nearc4,
  data = card
)
summary(fit_overid)

## ----overid-values, include = FALSE-------------------------------------------
sargan <- diagnostics(fit_overid) |> filter(test == "overid")

## ----first-stage--------------------------------------------------------------
fit_fs <- ivreg2(iv_formula, data = card, first_stage = TRUE)
fs <- first_stage(fit_fs)
summary(fs$educ)

## ----first-stage-tidy---------------------------------------------------------
tidy(fs$educ)

## ----robust-------------------------------------------------------------------
fit_robust <- ivreg2(iv_formula, data = card, vcov = "robust", small = TRUE)
summary(fit_robust)

## ----robust-values, include = FALSE-------------------------------------------
diag_rob <- diagnostics(fit_robust)
kp_f_rob <- diag_rob |> filter(test == "weak_id_robust") |> pull(statistic)
cd_f_rob <- diag_rob |> filter(test == "weak_id") |> pull(statistic)

## ----cluster------------------------------------------------------------------
data(nlswork)
fit_cluster <- ivreg2(
  ln_wage ~ grade + age + ttl_exp + tenure,
  data = nlswork, clusters = ~ idcode
)
summary(fit_cluster)

## ----cluster-values-----------------------------------------------------------
fit_iid <- ivreg2(ln_wage ~ grade + age + ttl_exp + tenure, data = nlswork)

grade_se <- bind_rows(iid = tidy(fit_iid), cluster = tidy(fit_cluster), .id = "vce") |>
  filter(term == "grade")
grade_se

## ----weights------------------------------------------------------------------
fit_pw <- ivreg2(iv_formula, data = card, weights = weight, weight_type = "pweight",
                 vcov = "robust")
summary(fit_pw)

## ----aweight------------------------------------------------------------------
cells <- card |>
  group_by(black, smsa, south) |>
  summarize(lwage = mean(lwage), n = n(), .groups = "drop")

micro   <- ivreg2(lwage ~ black + smsa + south, data = card)
grouped <- ivreg2(lwage ~ black + smsa + south, data = cells,
                  weights = n, weight_type = "aweight")

all.equal(coef(micro), coef(grouped))

## ----tidy---------------------------------------------------------------------
tidy(fit_iv)

## ----glance-------------------------------------------------------------------
glance(fit_iv)

## ----diagnostics--------------------------------------------------------------
diagnostics(fit_iv)

## ----augment------------------------------------------------------------------
augment(fit_iv) |> head()

