Applied Econometrics
14 articles
Matching in Python: a balanced covariate table doesn't make the estimate valid
Propensity-score matching returns 2.21 for a planted effect of 2.0 with a balance table that passes the 0.10 rule. The overlap diagnostic shows 6% of treated units have no comparable control; trimming recovers 2.04.
Difference-in-differences in Python: why the TWFE coefficient can mislead
With staggered adoption and heterogeneous effects, two-way fixed effects returns 1.01 where the planted average is 1.60, and a group-time estimator with clean controls recovers 1.60.
Synthetic control in Python: read the pre-fit before the gap
A hands-on walk through synthetic control in Python: why a zero-error pre-treatment fit is the weakest evidence for the gap, and the pre-fit that is allowed to be large is the diagnostic to trust.
Regression discontinuity in Python: getting the effect at the cutoff right
A global polynomial fit returns a clean, plausible 1.8 where the effect planted at the cutoff is 0.75. A local fit recovers about 0.75. How to estimate a regression discontinuity in Python, and the confounder the local fit still cannot see.
How to tell whether a double machine learning estimate is right
Double machine learning in Python: why a naive plug-in reads a true effect of 1.0 as 0.55, how cross-fitting recovers 0.97, and the confounder it still cannot detect.
Using difference-in-differences in practice
When difference-in-differences is the right tool, the three assumptions stated as decisions, and the ways it breaks, each shown in a worked Too Early To Say case with open code.
Instrumental variables in Python: a strong first stage doesn't make the estimate valid
2SLS recovers a planted effect of 2.0 where OLS reads 2.79, but only if the exclusion restriction holds. A small direct path biases 2SLS to 2.62 while the first-stage F stays 2051, uncatchable in-sample.
How do we know an AI's estimator does what we meant?
AI-generated econometric code can run without error and still be wrong. A routine to verify it: spec the low-visibility choices, plant a known truth, and read the code against its source.
When a policy reaches only a few units: rolling difference-in-differences (lwdid)
Rolling difference-in-differences (lwdid) gives credible effects from one treated unit and a few controls, and with so few units the transformation choice drives the answer.
Logistic regression beats LLM readouts on survey prediction
On a real survey prediction task, a plain logistic regression beat a language-model activation pipeline, AUC 0.769 vs 0.747; steering changed nothing useful.
Prediction-powered inference corrects AI survey imputation
Treating AI-imputed survey responses as data understated prevalence threefold; a regression adjustment lets predictions sharpen estimates without harm.
Steering vectors estimate an average regression gradient
Activation steering approximates an average regression gradient, cosine 0.63 in our data, and classic estimator choices change how hard the vector steers.
Well-Executed But Not Important: Reading the Record
When AI thins out the technical-flaws desk-rejection pretext, editors will have to learn to say 'well-executed but not important' on the record.
Cycling Through Bad Ideas Faster: A Worked Example
How AI-augmented iterative critique compresses the cost of discarding bad ideas in applied research, illustrated through three coding rules, a controls…