id: an-090
hypothesis: shell-contratante
headline: Paper-ready 4-spec × 3-outcome × 3-bucket appendix table consolidating AN-082 / AN-085 / AN-089. Three readings emerge clearly: (a) other_firm is the most-robust sponsor-bucket signal — significant on margin_error in 3 of 4 FE specs (S0 −3.01, S1 −1.87, S2 −2.65, S3 −0.91); collapses to ns only under firm + race FE jointly. (b) candidate margin_error coefficient FLIPS sign across specs (raw +0.02 → race FE −2.57 → firm FE +1.01 → both FE −1.76*) — the sponsor effect is entangled with which races candidates commission polls in. (c) mean_abs_error is null across specs except raw candidate (+1.07***), absorbed by either FE. The headline message for the paper appendix is "race + firm sorting accounts for most of the cross-sectional sponsor differences; the residual within-firm-within-race slant is small but directionally consistent."
type: synthesis-table
question: "Single appendix table showing the spec ladder for sponsor-bucket effects across the four FE levels."
tags: ["hyp:shell-contratante", "paper-ready", "spec-ladder", "synthesis"]
status: interpreted
status_date: 2026-06-17
confidence: green
created: 2026-06-17
script: source/analysis/an-090-sponsor-effect-spec-ladder.py
target: build/table/an-090-sponsor-effect-spec-ladder.csv
AN-090: Sponsor-effect spec ladder (paper-ready)
Consolidates the regression results from AN-082 (race FE only), AN-085 (race FE + trusted-firm dummy), and AN-089 (firm + race FE) into a single appendix table. Same sample, same outcomes, same bucket definitions throughout — only the FE block changes.
The table
Cluster SE at race level in parentheses. Reference = media- sponsored polls. * p<0.10, ** p<0.05, *** p<0.01.
Calls winner first
| Bucket | S0 No FE | S1 Race FE | S2 Firm FE | S3 Firm + Race FE |
|---|---|---|---|---|
| is_candidate | −0.007 (0.021) | +0.027 (0.032) | +0.055 (0.024) | +0.057 (0.035) |
| is_pollster_self | −0.024 (0.019) | +0.023 (0.022) | +0.038 (0.026) | +0.045 (0.029) |
| is_other_firm | −0.039 (0.018) | −0.022 (0.024) | −0.004 (0.020) | +0.010 (0.025) |
| n | 6,991 | 5,750 | 6,929 | 5,655 |
Margin error
| Bucket | S0 No FE | S1 Race FE | S2 Firm FE | S3 Firm + Race FE |
|---|---|---|---|---|
| is_candidate | +0.018 (1.075) | −2.572 (0.932) | +1.008 (1.069) | −1.755 (0.974) |
| is_pollster_self | −0.306 (0.898) | −0.841 (0.612) | +1.372 (1.074) | +0.223 (0.776) |
| is_other_firm | −3.009 (0.841) | −1.867 (0.618) | −2.645 (0.899) | −0.905 (0.617) |
| n | 6,693 | 5,521 | 6,633 | 5,424 |
Mean |error|
| Bucket | S0 No FE | S1 Race FE | S2 Firm FE | S3 Firm + Race FE |
|---|---|---|---|---|
| is_candidate | +1.072 (0.382) | +0.270 (0.460) | +0.096 (0.377) | +0.110 (0.444) |
| is_pollster_self | +0.235 (0.287) | +0.250 (0.304) | +0.278 (0.388) | −0.004 (0.355) |
| is_other_firm | +0.029 (0.276) | +0.130 (0.289) | −0.243 (0.296) | +0.127 (0.288) |
| n | 6,991 | 5,750 | 6,929 | 5,655 |
What the spec ladder shows
1. other_firm is the most-robust sponsor-bucket signal.
The margin_error coefficient is significant at *** in S0, S1,
S2 and drops to ns only under the joint S3 (firm + race FE).
Cross-firm composition (which firms get hired by shells) and
cross-race composition (which races get shell-sponsored polls)
both contribute, but neither alone explains the effect. Only
when both are held fixed does the coefficient halve and lose
significance. This is the cleanest case in the table for a
sponsor effect that requires both layers of identification to
shrink.
2. candidate margin_error coefficient flips sign across
specs. Raw +0.02 → race FE −2.57*** → firm FE +1.01 → both
FE −1.76*. The sign is not stable to the choice of FE block.
The natural reading: candidates commission polls in races that
are systematically harder/closer (race FE makes within-race
candidate-vs-media comparisons look better for candidate); and
firms that take candidate work have different baseline margin
errors than firms that take media work (firm FE flips the
within-firm comparison the other way). Both effects partly
cancel under S3, leaving a directional candidate-margin effect
of about −1.8 pp at p=0.07. The candidate-bucket effect is
real but composition-sensitive — the paper should report S1 and
S3 together rather than picking one.
3. mean_abs_error is null across all FE specs except S0
candidate (+1.07***). The candidate raw mean-error effect
is fully absorbed by either race FE alone or firm FE alone.
Magnitude (absolute) accuracy doesn't differ by sponsor type
after conditioning on either layer. The sponsor signal lives
in rank concordance and margin, not in magnitude.
4. is_pollster_self is null on every outcome in every
spec. The cross-sectional AN-085 / AN-086 finding that
pollster_self polls call the winner more often (within race ×
week, with a trusted-firm dummy) does NOT survive removing the
trusted-firm dummy. Without that orthogonal control, the
pollster_self effect washes out. This confirms AN-085's reading:
the pollster_self winner-call advantage is mostly the trusted-
firm subset (Datafolha / Quaest showcase polls), not a general
property of self-contracted polls.
How to read the table for the paper
Three honest summary statements:
- Cross-sectional contrasts (S0/S1) show clear sponsor
effects —
other_firmpolls have ~3 pp lower margin error raw, ~1.9 pp lower after race FE;candidatepolls have ~1 pp higher mean |error| raw. - Firm-quality decomposition (S2 vs S1) shows the
other_firmmargin-error coefficient is stable at −1.9 to −2.6 pp once you hold either race OR firm constant — both layers carry the signal. - Within-firm within-race (S3) is the most demanding
identification:
other_firmhalves to −0.9 (ns);candidateis −1.76 (p=0.07). Most of the cross-sectional sponsor effects are composition. The within-cell residual is small but directionally consistent.
Implications for the paper structure
- §Results headline can lead with S1 (race FE). That's AN-082's spec and the cleanest one for a non-technical audience.
- §Identification can show this table as the spec ladder. The S0→S3 progression demonstrates how race + firm sorting absorb most of the cross-sectional effect, with a small residual surviving the joint absorption.
- §Robustness should include the within-firm + race FE
(S3) as the most demanding identification. Reporting
−1.76 pp on
candidatemargin_error (p=0.07) and −0.91 pp onother_firm(ns) honestly is more credible than emphasizing the −3 pp raw or the −1.95 pp race-FE coefficient as if those were within-firm slants. - §Discussion should distinguish cross-firm sorting from within-firm slant. Two channels: candidates and shells hire firms with systematically different baseline accuracy, AND those firms also produce somewhat-different polls when serving different sponsors. Both matter; the paper has evidence for both.
Caveats
- The sponsor coefficients are jointly identified with the reference category (media-sponsored). The media bucket is heterogeneous (per AN-085); changing the reference to "trusted-firm-major-media-sponsor" would tighten the comparison but reduce n. AN-085 ran the trusted-firm-dummy version which is the cleanest alternative.
is_pollster_selfis null in every spec. AN-085's pollster_self winner-call advantage of +7.4 pp at p=0.009 was driven by the trusted-firm × pollster_self cell (Datafolha brand-protection polls). Without the trusted-firm control, the average pollster_self poll does not stand out.- S2 (firm FE) does not include race FE. Cross-race variation in difficulty contaminates the within-firm contrast. S2 → S3 (adding race FE) is the demanding test; S0 → S2 alone is not a clean within-firm identification.
- S0 contrasts (raw cross-sectional) don't account for cross-firm-cross-race composition. They're the loudest numbers in the table but the least defensible. Reporting them alone would overstate the sponsor effect.
Artifacts
- Script:
source/analysis/an-090-sponsor-effect-spec-ladder.py - CSV (full coefficient matrix):
build/table/an-090-sponsor-effect-spec-ladder.csv - LaTeX appendix table:
build/table/an-090-sponsor-effect-spec-ladder.tex - Markdown table:
build/table/an-090-sponsor-effect-spec-ladder.md - Headline JSON:
build/table/an-090-sponsor-effect-spec-ladder.json
Related
- AN-082 four-bucket accuracy split — S1 source
- AN-084 broad spec ladder sweep — more outcomes / restrictions
- AN-085 trusted-source decomposition — orthogonal trusted-firm dummy
- AN-088 variance decomposition — sponsor adds 0.1-0.2 % R² over firm + race
- AN-089 within-firm sponsor accuracy — S3 source, split by trust