Original hypothesis refuted at the relevant unit: Fundo Partidário polls (party-fund-routed, n=239) show β = +6.9 pp, statistically indistinguishable from the pooled +7.8 baseline. Recursos Próprios (candidate-personal-money) is untestable at the contratante level — n=3 because Brazilian campaigns route candidate-personal money through the committee, not via the candidate's own CPF. The empirical signal that does emerge is DISCLOSURE-QUALITY: #NULO# (undeclared funding source) polls show elevated β = +10.4 pp (Spec A, n=25; committee × #NULO# cell β = +13.8 pp, n=16). Within the route=committee block, the funding gradient runs Doações Eleitorais (+5.8) < Fundo Partidário (+9.2) < Outros (+8.3) < #NULO# (+13.8) — opposite of the party-budget-discipline prediction (party fund should be lowest).
Question
The headline +7-8 pp within-candidate β pools across candidate-sponsored polls of every route (CPF / committee / party / party-name) and every declared funding source. AN-006 split by route and found CPF polls at β ≈ +19 pp vs other routes at +6-9 pp; AN-074/AN-075/AN-076 attributed the CPF tail to one-shot strategic-stake (M4) mechanics.
A complementary cut is funding source. TSE registration requires the contracting entity (contratante) to declare which budget bucket pays for the poll. The original prediction: if Fundo Partidário (party-fund- routed) polls show lower β than Recursos Próprios (candidate-personal money), sponsor IDENTITY (party-as-principal with reputational stakes across many candidates vs candidate-as-principal) carries explanatory weight independent of the route.
Design
source/analysis/an-120-funding-source-heterogeneity.py:
- Load
pipelines/politica/build/clean/poll_sponsor_2024.parquet. Restrict to contratante rows (role='contratante') withsponsor_routeflagging a candidate-linked sponsor. Build per-protocolfunding_sourcefromorigem_recurso; collapse compound declarations like "Fundo Partidário / Outros" toMultiple. Modal aggregation within protocol; ties →Mixed. - Merge
funding_sourceonto the matched_share=1.0 cand_poll panel. - Spec A — Funding-source split. Build
sp_<funding>dummies per declared level (drop levels with n_self < 10 to avoid rank-deficient regressors). Fit PanelOLS with candidate FE + pollster FE + opponent_sponsored + base methodology controls; cluster SE at muni. Joint estimation; each coefficient is the within-candidate β conditional on that funding bucket. - Spec B — Route × funding cross. For each (route × funding) cell with n_self ≥ 5, refit Spec 2 restricted to that cell + the full independent comparator pool.
Results

Table: Spec A — pooled β by funding source
| Funding source | β | SE | 95% CI | p | n_self |
|---|---|---|---|---|---|
| Fundo Partidário | +6.86 | 1.52 | [+3.89, +9.84] | <10⁻⁵ | 239 |
| Doações Eleitorais | +3.05 | 2.43 | [−1.72, +7.81] | 0.21 | 50 |
| Outros | +6.93 | 1.97 | [+3.07, +10.78] | <10⁻³ | 127 |
| #NULO# (undeclared) | +10.39 | 2.25 | [+5.98, +14.79] | <10⁻⁵ | 25 |
| Recursos Próprios | dropped | — | — | — | 3 |
| Multiple | dropped | — | — | — | 6 |
Table: Spec B — route × funding cross (n_self ≥ 5 cells)
| Route | Funding | β | SE | n_self |
|---|---|---|---|---|
| committee | Fundo Partidário | +9.20 | 1.87 | 167 |
| committee | Doações Eleitorais | +5.83 | 2.33 | 39 |
| committee | Outros | +8.25 | 1.66 | 94 |
| committee | #NULO# | +13.77 | 1.98 | 16 |
| committee | Multiple | +11.00 | 3.91 | 6 |
| party | Fundo Partidário | +5.72 | 3.41 | 10 |
| party | Doações Eleitorais | −9.79 | 14.47 | 5 |
| party | Outros | +7.99 | 4.21 | 6 |
| party | #NULO# | +1.25 | 8.82 | 6 |
| party_name | Fundo Partidário | +4.38 | 3.33 | 62 |
| party_name | Doações Eleitorais | +0.51 | 2.86 | 6 |
| party_name | Outros | +3.63 | 4.26 | 21 |
| cpf | Outros | +25.74 | 15.28 | 6 |
Interpretation
Original hypothesis refuted at the relevant unit. Fundo Partidário polls — the party-fund-routed bucket where party-as- principal discipline was supposed to bind — show β = +6.86 pp on n=239 sponsored polls, statistically indistinguishable from the pooled +7.8 baseline. Within route=committee (the dominant route), Fundo Partidário polls run β = +9.2 pp; Doações Eleitorais polls run β = +5.8 pp — opposite direction from the party-budget- discipline prediction (party fund should be lowest, not highest, among declared sources).
The Recursos Próprios test is structurally untestable from contratante declarations. Only 3 sponsored protocols declare Recursos Próprios at the contratante level. Brazilian campaigns route the contract through the committee (party or candidate committee) even when the candidate's own money funds it; the candidate's CPF rarely appears as the legal contratante. Recursos Próprios shows up more often at the pagante level (payment processor), but pagante's declaration captures the candidate's reimbursement of the committee, not the budget bucket the poll was originally paid from. The hypothesis as written cannot be tested on this data; a follow-up that uses pagante-level or value_brl matching might recover a partial signal but would test something different.
The new finding is disclosure-quality, not party identity. The cell that breaks +10 pp at p < 10⁻⁵ is #NULO# — undeclared funding source: β = +10.4 (Spec A, n=25) and +13.8 (committee × #NULO# cell, n=16). Polls that fail to declare a funding source at all carry meaningfully higher bias than polls that declare any specific bucket. This is consistent with the paper's selective-disclosure mechanism — polls that under-document on visible compliance dimensions (coverage, audit, methodology completeness in AN-024 / AN-021 / AN-022; funding source here) also slant more. The funding-disclosure axis is a new instance of the same pattern.
Within-route gradient (committee block, where most variation lives). Doações Eleitorais (+5.8) < Fundo Partidário (+9.2) ≈ Outros (+8.3) < #NULO# (+13.8). The party-fund cell is in the middle of the gradient, not the bottom. Donations (campaign donations from third parties) show the lowest β by point estimate, but the cell is underpowered (n=39, CI [+1.3, +10.4]) and the difference from Fundo Partidário is within 1 SE.
Confidence rationale (yellow). The empirical findings are clean: the funding-split Spec A coefficients are jointly identified, well within p < 10⁻⁵ for the largest cells, and reproduce the pooled +7-8 baseline on the modal categories. The #NULO# elevation is robust across Spec A (n=25) and Spec B committee × #NULO# (n=16). What keeps the badge from green: (i) the original hypothesis (Fundo Partidário vs Recursos Próprios as a sponsor-identity discriminator) is structurally untestable at the contratante level, so the result answers a different question than asked; (ii) interpretation of the #NULO# elevation hinges on the assumption that contratante is the right unit of analysis (vs pagante or a joint contratante+pagante declaration); (iii) party × Doações Eleitorais shows β = −9.8 on n=5, but the CI is so wide ([−38.1, +18.6]) that the negative point estimate carries no information. Green would require replication of the #NULO# signal on the 2022 cycle (when it ships) or on the pagante-level declaration as a cross-check.
Follow-ups
Add a "funding declared vs not declared" row to the §sec:roadmap design-inventory table (extension). The selective-disclosure paragraph already documents under-disclosure of coverage / audit / methodology completeness on sponsored polls; funding-source disclosure is a parallel dimension with a sharper p-value (#NULO# β = +10.4, p < 10⁻⁵) than several rows already in Table 5. Cell: "Funding source declared at registration" — share #NULO# on sponsored vs independent. The check is a one-line addition to
source/analysis/an-120-funding-source-heterogeneity.py. Suggested script extension: same file, new functionfunding_disclosure_by_sponsor().Cross-validate the funding signal on the pagante row (blind spot). The contratante's declaration is one of two per-protocol declarations; the pagante's may carry different information (especially for Recursos Próprios where the candidate personally reimburses the committee). A pagante-level rerun would test whether the contratante-level reading is artefactual. Suggested script:
an-NNN-funding-source-pagante.py.#NULO# protocols — what's the within-firm pattern? (puzzle). Is the +13.8 pp on n=16 committee × #NULO# protocols concentrated in specific firms (consistent with firm-tier discipline gradient AN-018) or spread across many? If concentrated in low-volume firms, the funding-disclosure axis is collinear with the volume axis and adds no new mechanism. If spread evenly, funding-disclosure is a separable signal worth its own paper paragraph. Suggested script:
an-NNN-nulo-funding-by-firm.py.Doações Eleitorais low-β puzzle (puzzle, low priority). Point estimate +3.0 (Spec A) / +5.8 (committee cell) is the lowest among declared categories, but n is thin (50 / 39) and CI overlaps the others. If this cell expands to 2× in the 2022 cycle, the "donor-funded polls are less biased" reading would emerge as a distinct mechanism (donor-side reputational stake) parallel to pollster-side reputation. Park until cycle extension ships.