# India annual PM2.5 exposure: no stable trend break supported

The public 1990–2023 national exposure series does **not provide convincing evidence for a stable change in trend** under the specified comparisons. A straight-line trend outperforms the searched single-break model in the primary analysis. The candidate break year changes substantially with modest window changes, and its conditional uncertainty covers the entire eligible range. This is not proof that no real change occurred.

## Input and scope

World Bank World Development Indicators, India (IND), indicator **EN.ATM.PM25.MC.M3**, “PM2.5 air pollution, mean annual exposure (micrograms per cubic meter).” The current source attribution is **GBD 2023 Air Pollution Exposure Estimates and Risk Curves 1990–2023**, IHME/GBD Collaborator Network. The metadata defines population-weighted national exposure across urban and rural areas. These are source-model exposure estimates, not 34 independent direct monitor readings.

- Data: https://api.worldbank.org/v2/country/IND/indicator/EN.ATM.PM25.MC.M3?format=json&per_page=1000
- Metadata: https://api.worldbank.org/v2/indicator/EN.ATM.PM25.MC.M3?format=json
- Upstream attribution: https://ghdx.healthdata.org/record/ihme-data/gbd-2023-air-pollution-exposure-estimates-1990-2023 (not downloaded; World Bank metadata says underlying access requires an account).
- Retrieved 8 October 2026, approximately 06:50 UTC. WDI response last-updated field: 13 July 2026.
- 34 nonmissing, unique, consecutive annual values, 1990–2023; no interpolation. The API returned 66 year records, with nulls outside this observed span.
- Mean 51.650, sample SD 2.033 µg/m³; minimum 48.004 in 1995, maximum 56.680 in 2018.
- Original responses retained: 16,935 data bytes plus 1,195 metadata bytes = **18,130 bytes**, below the 10,000,000-byte cap. No further public downloads.
- Frozen CSV SHA-256: `2babc539ecdd4f3bfd34260037060cf7e0ec438fd5053c38ee08b4427228fdde`.

All calculations ran in the existing local native Notebook environment. No installation, product change, added connector/plugin, or remote compute was used.

## Primary comparison

The no-break alternative is a **single slope**, not zero pollution growth. Its fitted slope is +0.145 µg/m³/year with independent errors and +0.143 with AR(1) errors. The continuous hinge searches integer years with at least five observations strictly on each side, giving **1995–2018**. A smooth quadratic is an additional alternative without an abrupt slope break.

| Errors | Model | Best break | AICc | BIC |
|---|---|---:|---:|---:|
|Independent|Line|—|126.674|130.453|
|Independent|Hinge|1995|128.113|133.602|
|Independent|Quadratic|—|128.503|133.229|
|AR(1)|Line|—|128.449|133.175|
|AR(1)|Hinge|1995|130.760|136.807|
|AR(1)|Quadratic|—|130.551|136.040|

Lower scores are better. Hinge-minus-line differences are +1.439 AICc / +3.149 BIC for independent errors and +2.311 / +3.632 for AR(1). These are modest model-selection differences, not decisive proof of a straight line.

The searched hinge selects **1995, the earliest eligible knot**, under both error models. Its fitted before/after slopes are −0.297/+0.178 µg/m³/year (independent) and −0.305/+0.178 (AR(1)). These fitted slopes should not be interpreted as a securely identified reversal.

A simulation test repeats the entire break-year search and all nuisance fitting under a fitted no-break line:

| Errors | 2×log-likelihood improvement | Search-adjusted p | Monte Carlo SE |
|---|---:|---:|---:|
|Independent|3.904|0.2060|0.0090|
|AR(1)|3.421|0.3365|0.0106|

Each uses 1,999 replicates and the add-one p-value rule. These plug-in Gaussian parametric tests are assumption-dependent, not exact tests.

## Stability checks

All **48** planned combinations were evaluated: four windows × raw/log exposure × independent/AR(1) errors × minimum side counts 4/5/6.

| Observed window | Selected hinge years across settings |
|---|---|
|1990–2023|1995–1996|
|1993–2023|2017–2018|
|1990–2020|1995–1996|
|1993–2020|2006–2007|

These moves far exceed the prespecified descriptive ±2-year tolerance. Half the settings (24/48) select an eligibility boundary. The slope-change direction is positive in 36 settings and negative in all 12 that remove the first three years only. No fitted AR(1) correlation hits the ±0.90 grid boundary.

**The hinge wins neither AICc nor BIC in any of the 48 settings.** AICc favors the line in 42 and quadratic in six; BIC favors the line in 45 and quadratic in three. These correlated sensitivity counts are descriptive, not independent votes. The quadratic preferences occur in the window ending in 2020 with independent errors. With the log-likelihood Jacobian included, the full-series log-linear independent-error model has AICc 125.517 versus 126.674 for the raw-scale line: the response transformation also leaves no-break models preferred.

There are **136 leave-one-year-out comparisons**, preserving actual calendar gaps. BIC selects the line in all 136. AICc selects the line in 134; omitting 2022 makes the 1995 hinge preferred in the two independent-error raw/log fits. Candidate knots across omissions span 1995–2018.

Under simulations **conditional on the fitted hinge being the generating model**, the 2.5–97.5 percentile interval for selected knot year is **1995–2018 under both error assumptions**, the entire eligible range. About 45% of independent-error and 44% of AR(1) simulations select either endpoint.

| Conditional quantity (µg/m³/year) | Independent 95% percentile interval | AR(1) 95% percentile interval |
|---|---|---|
|Before-break slope|[−0.671, +0.184]|[−0.719, +0.193]|
|After-break slope|[−0.041, +0.465]|[−0.139, +0.515]|
|Slope change|[−0.225, +0.876]|[−0.312, +0.930]|

These are conditional bootstrap summaries, **not** confidence that a break exists. Boundary concentration and a long tail make a single point date particularly misleading.

## Inspectable calculation conventions

These choices were recorded in `analysis_conventions.md` before fitting. Means are line a+bt; hinge a+bt+d·max(0,year−k); and quadratic a+bt+ct², with t measured from the first included year. The same models are fitted to raw and natural-log exposure.

Stationary Gaussian AR(1) covariance is sigma²R with R[i,j]=rho^|year_i−year_j|; sigma² is marginal variance. The likelihood includes the initial stationary observation. Rho is profiled on −0.90 to +0.90 in increments of 0.02, an explicit numerical approximation. The initial whitening weight is one; later innovations use rho^Δ and variance factor 1−rho^(2Δ), including leave-one-out calendar gaps.

For q=r'R⁻¹r, sigma²=q/n and −2logL=n[log(2π)+1+log(q/n)]+log|R|. Log-scale likelihoods add 2·sum(log(raw exposure)) to report densities on the original response scale. Parameter counts, including variance, are line=3, quadratic=4, searched hinge=5, plus one for AR(1). AICc and BIC include the searched knot; their regular-model approximations do not replace search-adjusted simulation. Compare scores only on identical observations.

Null simulations use seed 20261008. Conditional hinge simulations use seed 20261009. Both refit candidate knots and rho, use 1,999 replicates per error model, and initialize AR(1) from its stationary distribution. The supplementary CSVs retain every simulated statistic, conditional knot and slope estimate, profile, and model comparison.

## Diagnostics, validation, and limits

The raw line's residual lag-one correlation is 0.155; the AR(1) line estimates rho=0.16 and has whitened residual lag-one correlation −0.016. Shapiro–Wilk p-values for primary whitened residuals range 0.167–0.733; this small sample cannot validate Gaussian errors. The largest absolute standardized whitened residual is below 2.80 across these fits.

Residual SD increases from 1.043 in the first 17 years to 1.767 in the last 17 years for the independent-error line. Constant variance is therefore questionable; the raw/log and AR(1) checks do not exhaust possible variance models. No heteroskedastic simulation was added after inspecting results. Unknown source-model measurement uncertainty and covariance are not propagated, and no historical data vintage was compared.

A separate dense covariance calculation reproduced primary likelihoods to better than 5×10⁻¹¹, including an additional calendar-gap check at tolerance 10⁻⁷. Rerunning the exact published analysis code against the frozen CSV reproduced six main tables within 10⁻¹⁰. Input checksum was verified. The 2160×1440 standalone figure was visually inspected for readable labels, legends, and data consistency.

The figure shows (A) annual source estimates and independent-error fits, (B) positive hinge-minus-line AICc at every candidate knot, (C) movement of selected knots across windows, and (D) conditional simulated knot frequencies. Panel A uses a nonzero exposure axis for a point/line plot. Panel C offsets points vertically only to separate settings; it does not alter years. The underlying CSVs provide the data alternative.

This compact series supports an overall increasing fitted trend, but **does not establish a stable abrupt trend change or identify a policy effect**. National aggregation, source-model smoothing and revision, annual variability, short windows, and unmodeled measurement error all constrain inference. Multiple breaks, policy attribution, and regional heterogeneity were outside scope.

## Offline rerun

The bundle contains the frozen input, original responses, provenance, exact analysis code, this report, environment versions, and all result tables/figure. The separate pre-fit conventions Artifact documents the original analysis choices.

1. Extract `pm25_reproducibility.zip` into a new folder.
2. In an already available compatible Python environment, run `python analysis.py` from that folder. The script makes no network calls and installs nothing.
3. Outputs go to a new `rerun_results` folder. Archived reference outputs are in `reference_results`; compare numerical tables there. Rename a prior rerun directory before repeating, since the script deliberately refuses to overwrite it.

Versions used: Python 3.12.3, NumPy 2.4.6, pandas 3.0.5, SciPy 1.17.0, Matplotlib 3.8.4. Library/BLAS differences may cause very small floating-point differences. `provenance.json` includes raw response headers, retrieval details, SHA-256 values, and seeds. `SHA256SUMS.json` records every archive member except itself; ZIP integrity and member checksums were verified.
