pilihanraya.my results desk · internal post-mortem · 12 Jul 2026

Johor PRN-16: the realignment that didn’t need its turnout wave

BN 48 · PH 8 · PN 0. PN’s collapse released nearly a quarter-million 2022 votes — the flow patterns are most consistent with BN inheriting the bulk of them — while a +15pp turnout surge, disproportionately non-Malay, lifted every seat and changed almost none. Eight analyses on the official SPR per-candidate returns, the July roll, and 163 scored predictions.

BN 48
PH 8
Majority threshold 29. 2022: BN 40 · PH 12 · PN 3 · MUDA 1.
69.6%
Weighted turnout
2022: 54.6% · +15.0pp, all 56 seats rose
+22.4pp
Malay swing to BN
ecological 95% CI 18.5–26.3
~220k
BN votes attributed to ex-PN reservoirs
model-consistent range 187k–232k = 36–45% of the +519k gain
107.2%
BN’s share of vote growth
>100% — only possible by recycling PN’s base

1The turnout wave

Every one of 56 seats rose, from +9.0pp (Paloh) to +20.0pp (Puteri Wangsa). Ecological estimates put the surge at Malay +10.8pp, Chinese +17.0pp, Indian & other +30.5pp — the wave was disproportionately non-Malay and urban-south. BN’s landslide happened despite the turnout composition, not because of it.

Two specifications, one estimator. The unpenalised WLS shown below ("Model A": Malay 77.3 / Chinese 61.7 / Indian+other 57.1) and the repo build’s ridge-penalised fit ("Model B", λ = 2.7×10&sup5;: 73.8 / 59.4 / 50–53, conditional bootstrap CIs of ±1–2pp) are the same estimator at different penalty choices — two specifications of one family, not independent methods, so their agreement is weaker evidence than cross-method agreement would be. Model B’s unpenalised (λ = 0) run plateaus at Model A’s estimates but reports converged:false — a near-equivalent solution that stops short of the convergence threshold, not an independent validation. The level is specification-dependent; the ordering and direction (Malay highest; surge non-Malay-tilted) hold across the whole λ path, and no single headline specification is selected. Bootstrap intervals here are conditional-on-specification — they do not include this model-choice uncertainty, which is the larger of the two.

Read with care. Group estimates are ecological inference from 56 seat aggregates (weighted no-intercept WLS). Composition is not behaviour; the north/south residual structure proves geographic confounding exists. 2022 group turnout uses the 2026 roll composition as proxy.

2Who voted for whom — composition scatters

The strongest relationship in the dataset: PH’s 2026 share is almost a pure function of Chinese composition (slope 0.915, R² 0.95). The election-in-one-number is the Malay swing: +22.4pp to BN, absorbing PN’s −20.1pp Malay collapse. The Chinese drift to BN (+6.9pp) is weak and lives in BN-incumbent small towns, not the metro.

Age: levels show nothing, one swing signal survives

Age composition predicts nothing about 2026 vote levels (R² ≤ 0.01). The celebrated “young seats swung PH” slope (+0.84) is an artifact of two ex-MUDA seats (N41, N50) where PH had no 2022 baseline; corrected, it is −0.05. What survives: young seats abandoned PN hardest.

Swing 2022→2026to BNto PHto PN
Malay+22.4 [18.5, 26.3]+5.0 (n.s.)−20.1 [−25.4, −14.8]
Chinese+6.9 [0.5, 13.4]+7.4 (n.s.)
Indianunidentified — 7% of roll, max 18.7% in any seat; refuse headline claims

3PN’s collapse and the PAS→BN pipeline

PN: 334,457 votes (24.0%) → 102,090 (5.45%). It retained 47.7% of its own base where it stood and forfeited deposits in 21 of 33 seats. The regressions are consistent with the released vote flowing to BN at slope 0.66 where PN contested and 0.86 where it was absent; the model finds no net flow to PH (slope ≈ 0, CI includes 0). Raw accounting agrees: in the 23 PN-absent seats, BN’s vote gain equals 0.889 of the prior PN reservoir. Model-consistent range: 187,000–232,000 of BN’s added votes came from reservoirs that previously backed PN36–45% of BN’s +518,806 gain (central ~220,000 ≈ 42%), ~11.7pp of the 2026 valid vote. Aggregate data cannot directly separate individual PN→BN transfer from turnout, new-voter and candidate effects; this is a model-consistent attribution, not a measured transition.

Simulator lever, measured: pnToBn ≈ 0.85–1.0 where PN is absent (near-total inheritance, ~zero abstention); net ≈ 0.35–0.47 of the full 2022 PN base where PN stands. Nomination day — counting the seats PN skips — is the single highest-value NS input.

4BERSAMA: marginal everywhere, decisive twice

28,816 votes across 15 seats (3.39% there), zero deposits saved, best 5.45% (Larkin). Central estimate: ~4.3% of PH’s 2022 vote leaked to BERSAMA (upper bound 14.4%); the regression drag on PH (−1.5pp) is indistinguishable from zero. But the two closest PH losses are exactly where it mattered: at 100% vote-return PH takes N46 Perling and N51 Bukit Batu (BN 46 / PH 10 ceiling); at the central ~45% transfer, only N51 flips. Counterfactual rule: add BERSAMA’s recorded votes to PH seat-by-seat, hold everything else fixed, recount winners. An alternative accounting diagnostic (BERSAMA votes as a share of PH’s prior-vote at current turnout) reads 11.1% — a ceiling-style ratio, not a transfer estimate.

5The map

Winner and winning margin, official 2026. Median margin doubled (18.3pp → 35.5pp); BN won 33 seats by ≥30pp. PH’s eight survivals are the Chinese-majority urban core plus Simpang Jeram by 170 votes.

6What the simulator needed to believe

Inverse-fitting the engine’s 13 knobs to the official result (~28,500 evaluations): gw = 0 (no GE15 reversion — the pre-election fear pointed the wrong way), statewide swing railed at the UI clamp (BN +15 / PN −15; reality was +16.9 / −18.0), pnToBn railed at 0.75 (wants ~0.80), mb = 1, bp ≈ 0, turnout ~70%. Best expressible fit: 55/56 winners, share MAE 3.18pp — against the published base case’s 8 wrong winners and 9.96pp. The one irreducible miss is N41 Puteri Wangsa: MUDA won it in 2022, so PH’s baseline there is zero — a bloc discontinuity no knob reaches.

Recalibrations adopted for NS: SWING_MAX ±15 → ±25pp · turnout anchor 49% → ~70% · pnToBn ceiling to 1.0 · proportional (not additive) collapse mode · per-seat pins for baseline-discontinuity seats · drop age-tilt turnout priors (unidentified even ex-post).

7The prediction field: right direction, wrong magnitude

163 scored entries. 62% called BN two-thirds; mean prediction BN 36.6 vs actual 48; only 2 of 163 reached BN ≥48. The consensus map scored 48/56 with all 8 misses in BN’s favour. Humans and the model failed on the same seats — PN-inertia holds and PH-incumbency flips. The field is well-calibrated up to 65 confidence and systematically overconfident above it: the 86–100 bucket (71% of all picks) stated 98.0, realized 84.1.

8Non-obvious: a landslide fragile at both tails

9The NS playbook (polls Aug 1 · nomination Jul 18)

Standing caveat. Every group-level number here is ecological inference from 56 seat aggregates (Malay↔Chinese collinearity r = −0.953; Indian unidentified). Reported intervals are conditional (bootstrap/homoskedastic) and exclude model-specification uncertainty, which dominates. “The arithmetic closes within ~15%” means: stacking the turnout deltas (§1), group splits (§2) and transfer estimates (§3) predicts BN +445k vs +519k actual and PH +168k vs +244k — residuals ≈ 14–15% of the actual gains, within stacked (optimistic) intervals; consistency, not proof. Johor→NS priors are directional, not numeric: NS 2023 was a pact election with a structurally different baseline.

Sources: SPR dashboard official feeds · pilihanraya.my predictions table (163 scored) · prn engine inverse-fit (~28.5k evaluations). Analysis: jin + 8-agent team, 12 Jul 2026.