Simulation study results — 50-seed run plus an independent 10-seed replication.
Data were generated from the non-separable model, then fitted with both models on the identical dataset. The non-separable model achieves lower RMSE in 56.8% of 2,250 paired comparisons (95% CI 54.7–58.8%, sign test p = 1.6×10⁻¹⁰). Median difference +0.000195 — about 0.1% of an RMSE of ~0.20. Real, but small.
| config | 10-seed | 50-seed | p (50-seed) |
|---|---|---|---|
| 1 (rt=2) | 58.7% | 50.5% | 0.80 |
| 2 (rt=6) | 58.0% | 54.8% | 0.0095 |
| 3 (rt=24) | 75.3% | 64.9% | 2×10⁻¹⁶ |
| overall | 64.0% | 56.8% | 1.6×10⁻¹⁰ |
Non-separable win rate by spatial coarsening (n=450 each) — monotone, crossing 50% between nsf 4 and 6:
| nsf | 2 | 3 | 4 | 6 | 8 |
|---|---|---|---|---|---|
| NS wins | 86.9% | 68.0% | 59.3% | 37.1% | 32.4% |
Temporal coarsening matters far less: ntf 2/3/4 → 60.4% / 57.3% / 52.5%.
The mean difference is negative (−0.0033) while the median is positive — a heavy left tail. In five cases the non-separable fit gave RMSE of 1.2–3.0 against the separable model's ~0.24, roughly 10× worse. Ten of the twelve extreme cases favour separable, all at nsf=8.
The only two INLA convergence failures in the whole run were also at nsf=8 (2 of 350 fits there; 0 of 1,404 elsewhere). The cells that fail to converge are the cells that blow up.
The warm start (control.mode) was removed — measured at 1.80× slower than a
cold fit on the identical dataset (893.1 s vs 495.7 s), with no effect on where the optimiser converges.
A bug in runa_s.R was fixed: a bare load() overwrote the separable chain's
theta.ini with the non-separable one's. Field generation is now seeded. Details in SUMMARY.md.