id: an-008 hypothesis: headline-sponsor-bias headline: SP-only prototype (2026-06-01): within-candidate FE gave β = +7.24 pp on 15 self-sponsored rows. Superseded by AN-001's all-Brazil run but kept as the project's first-pass design validation. type: robustness question: "Does the within-candidate FE design work on the SP slice before the all-Brazil LLM extraction finishes?" tags: ["hyp:headline-sponsor-bias", regressions, sp-slice, prototype, historical] status: interpreted status_date: 2026-06-01 confidence: yellow created: 2026-06-01 script: source/analysis/sp_regressions.py target: build/table/sp_regressions.csv commit: 4f41c25 design: sample: estimulado-non-aggregate-match2-SP-only specification: error ~ sponsored_by + opponent_sponsored + controls | candidate FE + pollster FE (via Patsy C(entity)); cluster-robust SE at muni comparator: all cluster: muni notes: "Patsy C(entity) materializes 8k dummy columns — OOM'd on all-Brazil. The fix in AN-001 was linearmodels.PanelOLS within-demeaning."
AN-008: SP-slice prototype design validation
Results
SP-only sample: 1,203 polls with estimulado scenarios, 15 self-sponsored rows after match-score ≥ 2 filter.
Table: Spec ladder for β (sponsored_by)
| Spec | β (sponsored_by) | SE | p |
|---|---|---|---|
| naive (no FE) | +2.17 | 2.49 | 0.38 |
| Spec 1 (pollster + candidate FE) | +7.64 | 2.56 | 0.003 |
| Spec 2 (+ methodology controls) | +7.24 | 2.46 | 0.003 |
| Spec 3c (clean + race × week FE) | +15.73 | 3.41 | <0.001 |
| Spec 2 WLS | +8.06 | 2.60 | 0.002 |
(from source/analysis/sp_regressions.py)
The naive → Spec 1 transition is dramatic: +2.17 → +7.64. SP-only candidates who self-sponsor are negatively selected on standing — the within-candidate FE strips that out.
Symmetry test (Spec 2): β_self = +7.24, β_opp = −3.14, β_self − β_opp = +10.4 pp.
Table: SP slice vs all-Brazil run
| Quantity | SP only | All-Brazil |
|---|---|---|
| β (Spec 2) | +7.24 | +7.75 |
| n_self | 15 | 568 |
| Spec 3c β | +15.73 (3 cells) | +6.95 (60 cells) |
| Placebo n | 7 | 132 |
| Placebo jump | +11.27 (noisy) | +6.70 (t=5.21) |
| Independent-baseline mean error | −12.55 | +0.93 |
(from source/analysis/sp_regressions.py)
Interpretation
This was the project's first piece of empirical evidence — demonstrated 2026-06-01 on SP-only data while the laptop bulk extraction was still running for the other 25 UFs. It showed:
- Design identifies. β jumps from +2 naive to +7 FE — there IS within-candidate variation in the data.
- Magnitude is large. ~7-8 pp and significant at p < 0.01 despite only 15 self-sponsored observations.
- Spec 3c is suggestive but thin. Race × week FE ran on only 3 cells and gave +15.7 — too thin to take literally.
- Symmetry test works. β_self − β_opp = +10 gave a clean sign-test for sender-specific bias.
All four findings replicated at the all-Brazil scale (see AN-001). The SP slice was the go/no-go test that justified the bulk extraction investment.
Independent-baseline shift is the key difference. The −12.55 → +0.93 movement is the most important contrast with the all-Brazil run: at SP-only scale, the selection of candidates with matched independent + self-sponsored polls happened to pick candidates whose independent polls undershot dramatically. At all-Brazil scale, the baseline is centered.
Confidence rationale (yellow). The prototype's headline number (+7.24 pp) lines up almost exactly with the all-Brazil β (+7.75 pp), but with only 15 self-sponsored rows the SP estimate is fragile — Spec 3c on 3 cells and the −12.55 baseline shift show how easily the slice could have given a misleading picture. The page is kept as a provenance record of the design validation, not as a load-bearing result.
Follow-ups
This page is historical. No further work planned on the SP slice;
all design questions are resolved at the all-Brazil scale in AN-001
through AN-007. The brief at
docs/briefs/sp_slice_analysis.md preserves the contemporaneous
writeup for the project's provenance story.