AI agent skill · by @wentorai
Iv Regression Guide
Apply instrumental variables, 2SLS, and address endogeneity issues
Archived 2026-10-23 · Source updated 2026-06-19 · License: MIT. Check the original repository for the latest version.
SKILL.md instructions
# Instrumental Variables Regression Guide
A skill for applying instrumental variables (IV) estimation to address endogeneity in regression models. Covers the logic of IV, two-stage least squares (2SLS), instrument validity tests, weak instrument diagnostics, and reporting standards.
## The Endogeneity Problem
### Why OLS Fails
```
Ordinary Least Squares assumes: E[u | X] = 0
(Regressors are uncorrelated with the error term)
This assumption is violated when:
- Omitted variable bias: A confound affects both X and Y
- Simultaneity: X affects Y and Y affects X
- Measurement error: X is measured with noise
Consequence: OLS estimates are biased and inconsistent.
No amount of data will fix this.
```
### The IV Solution
An instrumental variable Z satisfies two conditions:
```
1. Relevance: Z is correlated with the endogenous regressor X
Cov(Z, X) != 0
2. Exclusion: Z affects Y ONLY through X (not directly)
Cov(Z, u) = 0
Z --> X --> Y
Z -/-> Y (no direct path)
```
## Two-Stage Least Squares (2SLS)
### How 2SLS Works
```
Stage 1: Regress the endogenous variable on the instrument(s)
X = gamma_0 + gamma_1 * Z + controls + v
Save the fitted values: X_hat
Stage 2: Regress the outcome on the fitted values
Y = beta_0 + beta_1 * X_hat + controls + e
The coefficient beta_1 is the IV estimate of the causal effect.
```
### Implementation in Python
```python
from linearmodels.iv import IV2SLS
import pandas as pd
def run_2sls(data: pd.DataFrame, dependent: str,
endogenous: str, instruments: list[str],
controls: list[str] = None) -> dict:
"""
Run a 2SLS instrumental variables regression.
Args:
data: DataFrame with all variables
dependent: Name of the dependent variable (Y)
endogenous: Name of the endogenous regressor (X)
instruments: List of instrument variable names (Z)
controls: List of exogenous control variable names
"""
controls = controls or []
exog_str = " + ".join(["1"] + controls) if controls else "1"
endog_str = endogenous
instr_str = " + ".join(instruments)
formula = f"{dependent} ~ {exog_str} + [{endog_str} ~ {instr_str}]"
model = IV2SLS.from_formula(formula, data)
result = model.fit(cov_type="robust")
return {
"coefficients": dict(result.params),
"std_errors": dict(result.std_errors),
"p_values": dict(result.pvalues),
"f_statistic_first_stage": result.first_stage.diagnostics,
"summary": str(result.summary)
}
```
### Implementation in R
```r
library(ivreg)
# 2SLS estimation
iv_model <- ivreg(
log(wage) ~ education + experience | parent_education + experience,
data = df
)
summary(iv_model, diagnostics = TRUE)
```
## Instrument Validity Tests
### First-Stage F-Statistic (Relevance)
```python
def check_weak_instruments(first_stage_f: float) -> dict:
"""
Evaluate instrument strength using first-stage F-statistic.
Args:
first_stage_f: F-statistic from the first-stage regression
"""
return {
"f_statistic": first_stage_f,
"rule_of_thumb": (
"Strong instruments" if first_stage_f > 10
else "Potentially weak instruments"
),
"interpretation": (
"Stock & Yogo (2005) suggest F > 10 as a minimum for "
"one endogenous variable. For more precise thresholds, "
"consult the Stock-Yogo critical values table based on "
"the number of instruments and desired maximal bias."
),
"if_weak": [
"Use LIML (Limited Information Maximum Likelihood) instead of 2SLS",
"Report Anderson-Rubin confidence intervals (robust to weak IV)",
"Consider finding stronger instruments",
"Use the Lee et al. (2022) tF procedure for valid inference"
]
}
```
### Overidentification Test (Exclusion Restriction)
When you have more instruments than endogenous variables, the Hansen J test (or Sargan test) checks whether the extra instruments are valid:
```
H0: All instruments are valid (uncorrelated with the error)
H1: At least one instrument is invalid
If p < 0.05: Reject -> at least one instrument may violate exclusion
If p > 0.05: Fail to reject -> instruments appear valid
(but this test has low power)
```
## Classic IV Examples
### Famous Instruments in Economics
```
Research Question | Endogenous Var | Instrument
---------------------------|---------------|------------------
Returns to education | Years of school| Quarter of birth (Angrist & Krueger)
Effect of institutions | Institutions | Settler mortality (Acemoglu et al.)
Colonial origins of trade | Trade openness | Geography (Frankel & Romer)
Effect of military service | Veteran status | Draft lottery number (Angrist)
Price elasticity of demand | Price | Supply shifters (cost, weather)
```
## Reporting IV Results
### Required Elements
```
1. Justify instrument choice with economic/theoretical reasoning
2. Report first-stage regression results:
- Coefficient of Z on X with standard error
- First-stage F-statistic
3. Report second-stage (2SLS) results:
- IV coefficient with robust standard errors
- Compare with OLS estimate (discuss direction of bias)
4. Report diagnostic tests:
- Weak instrument test (F-statistic or Kleibergen-Paap)
- Overidentification test if applicable (Hansen J)
- Endogeneity test (Hausman or Durbin-Wu-Hausman)
5. Discuss threats to instrument validity
- Can the exclusion restriction be challenged?
- Are there plausible alternative channels?
```
Always present both OLS and IV estimates side by side. The comparison helps readers understand the direction and magnitude of endogeneity bias and assess whether the IV correction is meaningful.