SI Code 2a · Parts 1–3
Four gates decide whether a sampler budget is adequate. Three of them ask whether the chains agree with each other; only one asks whether they found the right answer. The forward grid is now complete across all three models — and the inverse model turns out to need a different question entirely.
A budget passes only if all four hold at once. They are deliberately different in kind — the first three are self-consistency checks that a broken sampler can still pass, and the fourth is the one that catches it.
Compares variance between chains against variance within them. At 1.00 the chains are exploring one common distribution; above 1.01 they are still describing different places.
Catches: warmup too short for the sampler to adapt. Misses: four chains that are all confidently wrong in the same way.
How many independent draws the correlated chain is worth. 400 across 4 chains is 100 each — the usual floor for trusting a posterior mean.
Catches: chains that move but crawl. Misses: bias — a stuck sampler can report high ESS for the wrong distribution.
The integrator failing on curvature it cannot resolve. Divergences are not noise: they mark regions the sampler could not enter, so the posterior is biased away from them.
Catches: geometry the step size cannot handle. Any non-zero count invalidates the run regardless of R̂.
Distance from a long reference run’s posterior mean, in units of that reference’s SD. The only gate that asks whether this budget reproduces the answer rather than merely agreeing with itself.
Catches: everything above passing on a posterior that is quietly shifted. This is the gate that makes the other three meaningful.
Two different vocabularies get mixed together in the output. These are the knobs:
4 throughout, because
R̂ is a between-chain statistic — a budget adequate at 4 chains says nothing about
the same budget at 2.iter_sampling / iter_warmup. A convenience for laying the grid out, not a
quantity Stan knows about.And these are the calibration parameters being watched. R̂ and ESS are reported per parameter; the gates use the worst one.
t0 — an expectation the grid did not support.All 81 cells complete, N = 1513 coretop sites, 4 chains, one seed per cell. Each recommendation is the cheapest cell clearing all four gates, measured against the 1000/1000 incumbent.
| model | warmup / sampling | wall | vs 1000/1000 | max R̂ | min ESS | max |z| | cells passing |
|---|---|---|---|---|---|---|---|
| univariate | 400 / 600 | 16.3 s | 1.92× | 1.00568 | 428 | 0.032 | 8 of 26 |
| EIV multivariate | 400 / 800 | 140.6 s | 1.16× | 1.00974 | 1700 | 0.049 | 7 of 26 |
| T0-shift | 300 / 900 | 79.3 s | 1.35× | 1.00912 | 1511 | 0.068 | 8 of 26 |
It converges at warmup 300 where the parent EIV model needs 400, and it does so in 79 s against the parent’s 141 s. The reasoning for giving it its own grid is unaffected and still stands — a budget does not transfer between models, which is the entire premise of this exercise. Only the guess about which direction the difference would run was wrong.
Superseded: the earlier draft of this page, and the notebook
prose it was written from, predicted bounded‑T would set the binding budget because
gamma enters inside the logistic and goes near-degenerate with t0. Both have
been corrected in the repository rather than quietly deleted — the expectation is
why the third grid was run at all.
Each cell holds the number of parameters left with R̂ > 1.01. The univariate panel is the one that produced the original headline: read across a row and sampling three times longer barely moves it, read down and crossing warmup 400 collapses it to zero.
The two EIV panels do not behave that way. Both axes matter there, because what is being counted is dominated by 3026 per-site latent variables — and those do respond to more draws.
| warmup | 1× | 1.5× | 2× | 2.5× | 3× | 4× |
|---|---|---|---|---|---|---|
| 100 | 7 | 8 | 7 | 7 | 7 | — |
| 200 | 7 | 6 | 6 | 1 | 1 | — |
| 300 | 7 | 6 | 7 | 6 | 6 | — |
| 400 | 3 | 0 | 1 | 0 | 0 | — |
| 500 | 7 | 0 | 0 | 0 | 0 | — |
| 1000 | 0 | — | — | — | — | 0 |
| warmup | 1× | 1.5× | 2× | 2.5× | 3× | 4× |
|---|---|---|---|---|---|---|
| 100 | 1834 | 1317 | 967 | 647 | 392 | — |
| 200 | 754 | 310 | 102 | 27 | 13 | — |
| 300 | 428 | 99 | 20 | 5 | 3 | — |
| 400 | 179 | 24 | 0 | 0 | 0 | — |
| 500 | 58 | 3 | 0 | 0 | 0 | — |
| 1000 | 0 | — | — | — | — | 0 |
| warmup | 1× | 1.5× | 2× | 2.5× | 3× | 4× |
|---|---|---|---|---|---|---|
| 100 | 1936 | 1427 | 1064 | 752 | 467 | — |
| 200 | 899 | 392 | 135 | 53 | 23 | — |
| 300 | 216 | 38 | 3 | 2 | 0 | — |
| 400 | 107 | 9 | 1 | 0 | 0 | — |
| 500 | 26 | 0 | 0 | 0 | 0 | — |
| 1000 | 0 | — | — | — | — | 0 |
The counts are not comparable across panels — the univariate model has about seven parameters and the EIV models about 3040, so a 7 and a 754 describe very different failures. Within a panel the gradient is the message.
The practical advice survives, with its scope narrowed: if a fit will not converge, raise warmup first. Adding draws to an unadapted chain buys ESS on a posterior that has not settled, which makes a bad answer look more precise. For the EIV models, raising both is what actually clears the latent variables.
Two univariate cells still break the pattern: 500 / 500 reports 7 while its
neighbours report 0, and 300 stays bad where 200 / 500 is nearly clean.
Each cell is a single seed, so these are almost certainly noise — see the
caveats.
The EIV models add a latent true value per site for both G2/3 and NO3− — 3026 extra parameters, each informed by roughly one observation. They dominate the maximum, and they are not the calibration.
How completely they dominate it is worth stating precisely: across the full grid, the worst-R̂ parameter is a per-site latent in 27 of 27 EIV cells and 27 of 27 bounded‑T cells. Not once, in 54 fits, is the slowest parameter one the calibration actually uses.
| model | gate | budget | wall | speed-up | R̂ used | cells passing |
|---|---|---|---|---|---|---|
| EIV multivariate | all parameters | 400 / 800 | 140.6 s | 1.16× | 1.00974 | 7 of 26 |
| EIV multivariate | calibration only | 200 / 300 | 63.3 s | 2.58× | 1.00523 | 21 of 26 |
| T0-shift | all parameters | 300 / 900 | 79.3 s | 1.35× | 1.00912 | 8 of 26 |
| T0-shift | calibration only | 200 / 200 | 43.3 s | 2.46× | 1.00661 | 22 of 26 |
Core-gating is roughly 2.2× cheaper than strict gating for both EIV models, and it is defensible: the parameters it drops are per-site nuisance variables that never enter a reconstruction. But it is a choice that has to be argued for in the SI, because the strict gate does work — it is simply paying to converge 3026 variables nobody reads.
Superseded: at 6 of 27 EIV cells this page said “the criterion
as written will reject every EIV budget” and called it a false negative requiring a
max_rhat_core gate before any EIV recommendation could be quoted. With all 27
cells in, 7 pass the strict gate. The observation about which parameters are
slowest was right; the conclusion drawn from it was too strong, because the failing
cells were all at low warmup.
The proxy-convention comparison (Part 2) refits the whole calibration under three crenarchaeol ring conventions at a deliberately generous 1000/1000. Three of those posteriors are flagged as failing — and every one fails on a latent, exactly as the grid predicts.
| posterior | max R̂ (all) | verdict | max R̂ (calibration) | slowest calibration parameter | file |
|---|---|---|---|---|---|
| univ_priorApprox · SST · thermal only · scaledRI_cren5 | 1.01407 | FAIL | 1.00417 | v_crtp | tx.v026.GHPU.sst.sri05.p0.001.fwd.nc |
| multiv_priorApprox_eiv · SST · G23 · scaledRI_cren3 | 1.01268 | FAIL | 1.00060 | k_crtp | gen_logi_fixed_hier_crtp_multiv_priorApprox_eiv_SST_gdgt23ratio_scaledRI_cren3_041626.nc |
| multiv_priorApprox_eiv · SST · G23+NO3 · scaledRI | 1.01188 | FAIL | 1.00020 | beta_NO3_crtp | tx.v026.GHEA.sst.sri.G23-N10.001.fwd.nc |
| multiv_priorApprox_eiv · SST · G23+NO3 · scaledRI_cren3 | 1.01023 | FAIL | 1.00001 | k_crtp | gen_logi_fixed_hier_crtp_multiv_priorApprox_eiv_SST_gdgt23ratio_no3_1.0_scaledRI_cren3.nc |
| multiv_priorApprox_eiv · SST · G23+NO3 · scaledRI_cren3 | 1.01023 | FAIL | 1.00001 | k_crtp | gen_logi_fixed_hier_crtp_multiv_priorApprox_eiv_SST_gdgt23ratio_no3_1.0_scaledRI_cren3_041626_eiv.nc |
The calibration behind the main-text figures carries a headline R̂ of 1.01023 — and a calibration-parameter R̂ of 1.00001. Every parameter that reaches a reconstruction is converged with room to spare.
It is tempting to carry the forward budget across to the reconstructions. The Stan source says not to. The forward EIV model is hierarchical with ~3000 correlated latent variables, which is why its warmup binds. The inverse model declares one parameter block:
parameters { vector[N] t_est; } // the ONLY parameter in this model
The calibration draws arrive as data, not parameters, and the target is a sum of per-sample terms with no coupling between samples. The posterior therefore factorises into N independent one-dimensional posteriors, where a diagonal metric is exact rather than approximate — the easiest geometry HMC ever sees.
So N is a cost knob, not a difficulty knob, and what binds instead is
M and saturation: where Ring Index approaches the upper asymptote the
likelihood goes flat in temperature and t_est is prior-dominated. Neither is fixed
by more iterations. Part 3 sweeps 4 budgets × M ∈ {300, 500}
against 200 coretop sites spread over the proxy range rather than sampled at
random — the near-saturated warm end is 15.6% of the compilation and 30% of this
subset, and it is where the paleo sites live.
Because coretop temperature is known, this half can be scored on accuracy as well as convergence: bias, RMSE, and 68% / 90% interval coverage against measured SST. The sites trained the calibration, so those numbers are a tuning diagnostic and never a validation statistic.
No inverse run has ever recorded its convergence. The invT path calls
sample_from_model, which returned draws without ever summarising the fit — so
all 35 cached reconstructions carry no R̂, no ESS, no divergence count. The loss is
irreversible after the fact: the fit object goes out of scope, and the draws are
reduced to quantiles before saving. Fixed, with tests.
The drift gate was set below the noise floor. Worst-site drift came in at 0.24–0.45 °C and did not fall as the budget rose — 1000/1000 at M=300 drifted further from the reference than 300/1000 at M=500 did. That is Monte Carlo jitter in the single reference realisation, not a budget effect, and a 0.1 °C threshold under it can never be met at any cost. The sweep now runs a seed replicate of the reference configuration and gates on whichever is larger, the threshold or the measured seed-to-seed drift.
| warmup / sampling | M | wall | max R̂ | min ESS | RMSE °C | cov 68 | drift °C |
|---|---|---|---|---|---|---|---|
| 300 / 1000 | 25 | 27 s | 1.0058 | 1571 | 4.319 | 0.635 | 0.411 |
| 500 / 1000 | 25 | 33 s | 1.0060 | 1251 | 4.307 | 0.620 | 0.422 |
| 300 / 1000 | 50 | 47 s | 1.0056 | 1375 | 4.314 | 0.625 | 0.337 |
| 500 / 1000 | 50 | 48 s | 1.0060 | 1368 | 4.313 | 0.630 | 0.418 |
| 300 / 1000 | 100 | 76 s | 1.0073 | 1469 | 4.307 | 0.625 | 0.322 |
| 500 / 1000 | 100 | 81 s | 1.0059 | 1336 | 4.310 | 0.625 | 0.301 |
| 300 / 1000 | 200 | 128 s | 1.0065 | 1562 | 4.318 | 0.625 | 0.301 |
| 500 / 1000 | 200 | 134 s | 1.0053 | 1476 | 4.304 | 0.625 | 0.315 |
| 300 / 1000 | 300 | 171 s | 1.0061 | 1467 | 4.305 | 0.625 | 0.296 |
| 500 / 1000 | 300 | 189 s | 1.0051 | 1453 | 4.310 | 0.630 | 0.259 |
| 300 / 1000 | 500 | 277 s | 1.0048 | 1505 | 4.309 | 0.620 | 0.296 |
| 500 / 1000 replicate | 500 | 304 s | 1.0059 | 1450 | 4.305 | 0.620 | 0.371 |
| 500 / 1000 | 500 | 304 s | 1.0072 | 1454 | 4.300 | 0.625 | 0.000 |
R̂ = 1.0056 · ESS = 1375 · worst-site drift 0.337 °C against a measured seed-to-seed floor of 0.371 °C. At 47 s that is 6.48× faster than the richest cell swept.
Forward 400/1000, inverse 500/1000 with M = 300 (scripts/paper/run_manuscript_refits.py).
The inverse budget is a deliberate choice over the recommender’s output, on three grounds: it clears R̂ < 1.01 and ESS ≥ 400 with room; its accuracy is indistinguishable from every other cell; and it avoids warmup 300, which is the one place the grid genuinely does discriminate — two of its three cells fail R̂. Over 64 reconstructions it costs about three hours rather than six.
Stated plainly because it is a judgement call: the drift gate does not pass this cell, for the reason given above. More seed replicates would either vindicate it or move it on evidence.
RMSE varies by 0.02 °C across a 11.5× spread in cost, and M = 300 is indistinguishable from M = 500. The defensible SI statement is therefore not “we picked this budget” but “the answer does not depend on it”, which is the stronger claim.
Coverage is the open question: 68% intervals contain the measured SST 62%–64% of the time and 90% intervals 86%–86%, stable across every cell, so it is not sampling noise. Some of that is by construction — a constant prior mean, an in-sample set, a subset deliberately weighted toward the hard end — but systematic under-coverage deserves an explanation before it reaches an SI.
-1 / UNKNOWN for every run. It is therefore
not one of the four gates, and no claim about energy-transition efficiency
should be made from this sweep.|z| ≤ 0.1 accuracy
bound and the 0.1 °C drift bound are this study’s own choices and should be
stated as such.Every item this page listed as pending has now been resolved:
Still open: the corrected Part 3 run, the under-coverage question, and a seed-repeat pass on the forward cells nearest the threshold.