Econometrics re-analysis
Re-analysis of my 2023 econometrics team project on crop yields and infant deaths across 673 Indian districts: the original headline effects were artifacts of the crop-index construction and of iid standard errors.
Overview
In 2023, five of us at IIIT Delhi (Utkarsh Arora, me, Krishnasai Addala, Samarth Raina and Sejal Kardam) wrote an econometrics course project asking whether crop yields, health-system indicators and state economics explain the share of reported infant deaths attributed to low birth weight across 673 Indian districts from 2011 to 2016. The repository is Utkarsh Arora's.
By the numbers
- 673 districts, 6 years
- tables match to 6 dp
- within-R2 under 0.02
Highlights
- 01
Re-analyzed my 2023 econometrics team project on crop yields and infant deaths across 673 Indian districts and six years: I reproduced both original regression tables to six decimals, then showed the crop indices were the yield of whichever crop row came first in the CSV, so the Kharif cash-crop effect (p < 1e-16 originally) is not significant once the index is built per category and the nitrate sample restriction is lifted.
- 02
Rebuilt it as a deterministic pipeline, Python for a 3,585-row district-year panel with Census 2011, NFHS-4 and IMD rainfall joined through LGD district codes, R in fixest for six specifications with state-clustered standard errors and district and year fixed effects, under which the child-marriage and hospital-bed effects are indistinguishable from zero and within-R2 is below 0.02.
- 03
Wrote the review, archived the original scripts with seven run-breaking bugs fixed, added a GPL-3.0 license and CI that reruns the whole pipeline on Ubuntu and fails if any committed table, the panel or the README changes; merged as PR #1 (114 files) with three follow-up commits for the CI and cross-platform reproducibility.
The story
In September 2026 I went back to it on my own to check whether the results held. They did not.
In 2023, five of us at IIIT Delhi (Utkarsh Arora, me, Krishnasai Addala, Samarth Raina and Sejal Kardam) wrote an econometrics course project asking whether crop yields, health-system indicators and state economics explain the share of reported infant deaths attributed to low birth weight across 673 Indian districts from 2011 to 2016. The repository is Utkarsh Arora’s. In September 2026 I went back to it on my own to check whether the results held. They did not.
I started by reproducing both regression tables in the original README, which worked to six decimals but only with log(tap) in the Kharif model, where the committed script used tap in levels. The real problem was the crop indices: the script kept the first crop row of each district-year in whatever order the CSV had, so cash_index was that row’s yield if it happened to be a cash crop and 0 otherwise. In the Kharif sample the kept row was a cash crop for 1,576 district-years and a cereal for 772. The Kharif and Rabi tables were the same annual outcome and regressors with a different first row. GDP, hospital beds, child marriage and nitrate vary only by state, but the standard errors were iid over 24 states, and clustering by state multiplies them by 2 to 3. With the indices rebuilt per category, clustered errors and the nitrate sample restriction lifted, the three headline effects go: child marriage from -0.08 (p < 0.001) to -0.01, hospital beds from -3.9 (p < 1e-8) to -2.8 (p = 0.13), and the Kharif cash-crop index from -0.20 (p < 1e-16) to -0.08 and not significant. The report’s drop in child-marriage cases in 2014 is not in the data either: the yearly state totals are 214, 304, 240, 277, 298 and 321.
The rebuild is a Python data-preparation step and an R analysis. Python collapses the 41,773 crop rows to one row per district-year (3,585 rows) with per-season, per-category yield indices, within-district yield shocks and lags, and joins Census 2011, NFHS-4 and IMD monsoon rainfall through Local Government Directory district codes (594 of the 673 districts exist in Census 2011). R runs six specifications in fixest, from the original regressors with corrected indices through year and zone effects, district and year effects, Census and NFHS controls and lags, all with state-clustered standard errors. Between districts, two associations survive a 999-draw district cluster bootstrap: a higher state GDP per capita goes with a higher LBW share (+6.5 points per log point, 95% CI 4.0 to 9.0), which reads as cause-of-death reporting rather than nutrition, and a higher rabi cereal yield with a lower one (-1.5 per tonne per hectare, CI -1.9 to -1.0). Within districts over time nothing in the data moves the outcome: within-R2 is below 0.02 with district and year effects. Monsoon rainfall is too weak an instrument for yields (clustered first-stage F = 2.3), so no causal claim is made.
The original scripts are archived under legacy/ with seven run-breaking bugs fixed and nothing else changed, plus a map from each script to the two course reports. make all rebuilds everything and a second run produces no diff; generated CSVs are rounded (10 significant digits for the Python panel, 6 for the R tidy tables) so macOS and Linux agree byte for byte, and a GitHub Actions workflow reruns the pipeline on a clean Ubuntu runner and fails if any committed table, the panel, the codebook or the README changes. The review is in docs/REVIEW.md, with a final section recording an independent recomputation of the derived columns and of the fixest estimates against lm and sandwich. I added a GPL-3.0-or-later license. The work went in as PR #1 (114 files changed), merged by Utkarsh Arora, plus three follow-up commits on main for the CI and reproducibility; the latest run is green.