This paper was generated by AI from the lab's code, data and documentation.
Abstract
Common-Space Ideal Points (CSIPs) place members of Congress, state legislators, statewide officials and candidates for federal and state office on a single left–right scale. The estimates combine nearly 10 million roll-call votes from Congress and the state legislatures, contributions from 9.7 million individual donors linked across federal and state disclosure records, and the phrases legislators use in their official communications. Roll calls identify the ideological dimension; contributions and phrases, calibrated against the votes within one model, extend the scale to politicians who have not voted and connect the legislatures to one another. The October 2026 estimates cover 43,039 politicians and committees, including every member of the House, 98 of 100 senators and 7,295 of 7,336 sitting state legislators. Within party, the scores correlate with DW-NOMINATE between .67 and .83 for members whose votes enter the model and between .39 and .53 for members whose votes are withheld. This paper describes how the estimates are produced and why, how to use them, and how to reproduce them.
1 Introduction
CSIPs exist to answer questions that cross institutions: whether a party's state legislators are more extreme than its delegation in Congress, how one state's legislature compares with another's, or whether a primary challenger stands to the flank of the incumbent. These comparisons require one scale that covers members of Congress, state legislators and candidates who have never voted, and that is current. No available measure does all of this. Roll-call scales such as DW-NOMINATE cover only members of Congress. The Shor–McCarty scores for state legislators end in 2022 (Shor and McCarty 2025). CFscores reach candidates without voting records but are estimated from contributions alone, and among House Democrats whose votes are withheld they correlate −.15 with DW-NOMINATE (Bonica 2014; Table 3).
The design follows from these requirements. Roll calls fix the ideological dimension and order legislators within their chambers. Contributions from donors who give in several chambers and states, phrases whose slant is estimated from the politicians who use them, and the 833 politicians who served in both a state legislature and Congress connect the chambers and place politicians who have not voted. We assemble every input from the original filings and vote records rather than from existing compilations, which gives us control over the treatment of earmarked contributions, refunds and duplicate filings and allows the model to be re-estimated monthly. We made the principal modeling choices by a single test: agreement with DW-NOMINATE, within party, for members of Congress whose votes were withheld from the model (Section 5.2). The test stands in for the case of a challenger, who is placed without votes.
Sections 2 through 5 describe the data, model, estimation and validation, and give the reason for each choice. Section 6 explains how to use the estimates and where they should not be used. Section 7 describes how to reproduce them, and Appendix A lists every setting.
2 Data
The estimates use contributions, roll-call votes and text from the 2014 through 2026 election cycles. The window comprises the current cycle and the six preceding cycles and advances every two years. We chose seven cycles after comparing windows: a window beginning in 2014 placed held-out House and Senate Republicans better than one beginning in 2020, and one beginning in 2008 placed held-out Democrats worse, since a single position pooled over 18 years blurs real change. Table 1 summarizes the inputs to the October 2026 estimates.
| Source | Provider | Period | Volume |
|---|---|---|---|
| Federal contributions | FEC bulk files | 2014–2026 cycles | 14.5 million donor–candidate–cycle pairs |
| State contributions | State campaign-finance agencies, 50 states and DC | 2019–2026 | 13.6 million donor–candidate–cycle pairs |
| Congressional roll calls | Voteview | 113th–119th Congresses | 3.6 million votes on 12,621 roll calls |
| State roll calls | Open States | 2019–2026 | 6.1 million votes |
| Phrases | Members' tweets, press releases, newsletters and floor speeches; state legislators' tweets | 2014–2026 (state legislators 2023–2026) | 10,000 phrases; 6.1 million speaker–cycle uses |
2.1 Campaign contributions
Federal contributions come from the FEC's bulk individual-contribution files. We retain contributions from individuals to candidates' authorized committees. Contributions earmarked through conduits such as ActBlue and WinRed, which carried 86 percent of the 14.3 million itemized contributions in the 2024 FEC files by our tabulation, are attributed once, to the original donor. We keep FEC transaction types 15, 15E, 15J and 22Y. Refunds are netted against contributions, and self-financing and transfers between committees are excluded. The FEC files also carry a second, date-sorted copy of each contribution, which we remove; left in place, it doubles every contribution. We code a donor as having contributed to a candidate in a cycle if the net amount is positive and otherwise disregard the size of the contribution, so that the measure reflects whom a donor supports rather than how much the donor gives. Contributions from political action committees do not enter the model: in our tests they did not improve the placement of held-out members and, in the 2020 window, lowered the correlation for House Democrats from .09 to −.22.
State contributions come from the campaign-finance agency of every state and the District of Columbia and comprise 29.3 million records since 2019. Only contributions from individuals to candidates for legislative and statewide office enter the model. Mississippi since July 2023, South Dakota's itemized schedules and a subset of Kansas filers publish their records only as scanned images. We transcribe these pages with a vision-language model and flag any report whose transcribed records do not sum to its printed totals. Nevada and Ohio restrict automated access to their files, which we therefore download manually each month.
2.2 Linking donors across records
A donor's records vary in spelling, address and employer across filings and agencies, and treating each variant as a distinct donor would sever the connections on which a common scale depends. We link records with the probabilistic model of Fellegi and Sunter (1969), as implemented in Splink (Linacre et al. 2022). The model compares names, allowing for nicknames, initials and typographical errors, along with nested geography from ZIP code to state, employer and occupation, and we link pairs whose match probability is at least .9. Federal and state records are linked jointly. On 420 hand-labeled record pairs from 2024, the linkage has a precision of .951 and a recall of .943, compared with a recall of .768 for exact matching on name and ZIP code. Linkage was the largest single improvement we tested: in the 2014 window it raised the held-out correlation for House Democrats from −.14 to .11 and for House Republicans from .41 to .54. The October estimates reduce 19.4 million distinct records to 9.7 million donors. Joint linkage matters because the federal and state donor pools overlap. In a test covering 17 states, 31 percent of state donors also contributed to federal candidates, and federal donors made up 42 percent of the donors of the median state candidate.
2.3 Roll-call votes
Congressional votes come from Voteview for the 113th through 119th Congresses (Lewis et al. 2026). Yea and nay votes enter the model; abstentions do not. State votes come from Open States floor records beginning in 2019. In the state legislatures we exclude roll calls on which the minority comprised less than 2.5 percent of those voting, the threshold used by W-NOMINATE (Poole 2005), because nearly unanimous votes carry almost no information about ideology; congressional roll calls enter without this filter. In each state chamber we retain at most 300 roll calls per cycle, selected by a fixed hash of the vote identifier so that the same votes are drawn in each estimation; the cap is enough to place each legislator without letting the state legislatures' votes outweigh the other data. Because Open States occasionally records committee votes as floor votes, we assign each roll call to the chamber containing at least 75 percent of its voters and treat it as a floor vote only if at least 60 percent of that chamber's members are recorded on it. A legislator recorded as voting both yea and nay on one roll call is a data error, and both records are dropped. Open States has no member-level votes for Alaska and Missouri, and their legislators are placed by contributions and text alone.
2.4 Text
For members of Congress we use official tweets, press releases, e-newsletters and floor speeches; for state legislators we use tweets. In the 2024 cycle these sources comprised 741,043 congressional tweets, 52,325 press releases, 29,656 newsletters, 58,453 floor speeches and 518,439 tweets by state legislators. We represent each document by its two-word phrases after removing links and mentions, dropping stopwords and stemming, because pairs of words carry framing (death tax, border crisis) that single words do not. A politician is coded as using a phrase in a cycle if it appears in at least two of the politician's documents from that cycle, so that one stray use is ignored and one newsletter that repeats a phrase counts once. The vocabulary consists of the 10,000 most widely used phrases among those used by at least 20 speakers and by no more than half of all speakers: rarer phrases cannot be calibrated, and more common ones are procedural boilerplate with no slant. Among the phrases the model estimates to be most conservative are biden border, illeg alien and born aliv; among the most liberal are fair pay, system racism and fight climat. We exclude campaign websites and campaign social-media accounts because campaign text placed members poorly in our tests: scored from campaign text alone, held-out House Democrats correlated −.14 with DW-NOMINATE.
2.5 Recipients and bridges
The unit of analysis is the recipient of contributions. Federal candidates are identified by FEC candidate number. State legislators are identified by Open States person identifier, and each legislator's campaign committees are merged into a single recipient. We match committees to legislators conservatively, because a false match would attach one politician's donors to another. A match requires the same state, a seat held within four years of the committee's elections and compatible names; a committee is matched to a legislator in the other chamber only on a strong and unique name match. A conflicting district rules out a match unless the committee shares donors with the legislator's other committees, and a conflicting party rules out any match that rests on the name alone. Ambiguous committees remain unmatched. This procedure recovers 91 percent of legislators seated between 2023 and 2026. Unmatched committees, most of them belonging to losing candidates and candidates for statewide office, are retained as recipients in their own right. Politicians who served in a state legislature and ran for or served in Congress are merged into a single recipient. There are 833 such links: 28 from shared Ballotpedia identifiers and 805 from unique same-state name matches, of which 496 are confirmed by shared donors. A candidate enters the model with at least five donors or a voting record. The October estimates include 8,945 federal recipients (1,724 with roll calls), 11,662 state legislators (10,743 with roll calls) and 22,432 unmatched state committees.
3 Measurement Model
Each recipient r has a position φᵣ on the ideological dimension. Contributions, phrase use and roll-call votes are each modeled as functions of φᵣ, so that the three sources jointly inform a single set of positions.
3.1 Contributions and phrases
Let ydr = 1 if donor d contributed to recipient r. We model
\Pr(y_{dr}=1)=\operatorname{logit}^{-1}\Big(a_d+b_r+\theta_d\,\phi_r+\sum_{k=1}^{2}\theta_{dk}\,\psi_{rk}\Big)where ad captures the donor's overall propensity to give, br the recipient's capacity to attract contributions and θd the donor's position. The intercepts absorb variation in giving unrelated to ideology, so that neither a prolific donor nor a well-funded recipient appears moderate or extreme for that reason. Two additional dimensions, ψᵣ, absorb structure in giving that is not ideological, such as national small-dollar appeal and local donor networks; adding them raised the held-out correlation for House Democrats from −.17 to −.04 in the 2020 window, before the other changes described here. Because the data record only contributions, we sample non-contributions: for each contribution we draw three recipients uniformly, with replacement, from the same cycle and the same pool (federal candidates for a federal contribution, recipients in the same state for a state contribution), and discard any draw to whom the donor in fact gave. Drawing non-contributions nationwide would teach the model geography, since a Vermont donor who does not give to Texas legislators reveals nothing about ideology. Drawing them in proportion to recipients' popularity lowered every held-out correlation we examined.
Phrases enter the model in the same form, with each phrase treated as endorsing the politicians who use it. In equation (1), a then indexes the phrase's overall frequency, b the politician's volume of communication and θ the phrase's slant. We draw three non-uses for each use, only from among politicians with text in the same cycle, since a politician whose text we do not have has not declined to use a phrase. Phrases and donors share the two non-ideological dimensions.
3.2 Roll calls
Let yrv = 1 if legislator r voted yea on roll call v. We model
\Pr(y_{rv}=1)=\operatorname{logit}^{-1}\big(\alpha_v+\beta_v\,\phi_r\big)a logistic version of the item-response model of Clinton, Jackman and Rivers (2004), with a separate intercept and discrimination parameter for each roll call, so that the vote parameters absorb each chamber's agenda. Roll calls load only on φ. This restriction identifies φ as the dimension that structures legislative voting; contributions and phrases are calibrated against it rather than defining it. Estimated from contributions alone, the scale ordered held-out House Democrats in the wrong direction (r = −.29 in the 2020 window), and fitting the votes in the same model is what corrects this.
3.3 Weights and priors
Contribution observations enter the log-likelihood with weight 0.3, and phrase and roll-call observations with weight 1. Legislators typically have many more contribution observations than votes, and at equal weight the contributions pull members away from their voting records. At weight 0.3 the correlation with DW-NOMINATE for House Democrats whose votes are in the model rose from .21 to .64, and the held-out correlation from −.04 to .09, at a cost of .01 to .07 for the other held-out groups. Positions follow a hierarchical prior,
\phi_r\sim N\big(\mu_{g(r)},\,1\big),\qquad \mu_g\sim N\big(0,\,1/5\big)where g(r) indexes party (Democrat, Republican or other) crossed with office (House, Senate, president, state legislature or other state office). Intercepts and discrimination parameters have N(0, 25) priors and donor and phrase slants N(0, 4); recipients' positions on the non-ideological dimensions have N(0, 1) priors, and donors' and phrases' loadings on them N(0, 4). A recipient pooled across cycles takes the group of its earliest cycle. The hierarchical prior places a recipient with few observations near similar recipients rather than wherever its few donors happen to fall. It also means that party informs the estimates directly, since a recipient with little data is placed near the mean of its party and office. Agreement between CSIPs and party is therefore not evidence of validity, and the validation in Section 5 relies on comparisons within party.
3.4 Identifying a common space
Three features of the model place recipients in different institutions on one scale. Each linked donor has a single position across all recipients to whom the donor contributes, so that a donor who supports both a state senator and a member of Congress ties their positions together. Each phrase has a single slant across all speakers, state and federal. The 833 politicians with both state and federal records are single recipients, whose state roll calls and federal contributions and votes inform the same position. Roll calls alone do not bridge chambers, because each roll call has its own parameters. Comparisons across chambers therefore rest on donors, phrases and shared careers.
4 Estimation
4.1 Estimator and sampling
We estimate all parameters jointly by maximizing the posterior density with L-BFGS-B, computing the objective and its gradient in PyTorch in single precision. The October estimates use 2.2 million sampled donors, 16.7 million contributions and 49.5 million sampled non-contributions, 9.7 million roll-call votes, and 6.1 million phrase uses with 14.9 million sampled non-uses. A single fit takes approximately 100 minutes on an eight-processor machine. We first estimated the model by expectation-maximization with data augmentation, the approach of Imai, Lo and Olmsted (2016). Its updates for weakly informed recipients were small enough that recipients with few contributions remained near their starting values, which made unpopular candidates appear moderate. Direct optimization of the same posterior does not have this problem.
To prevent recipients with very large donor bases from dominating the likelihood, each donor is included with probability min{1, maxᵣ 1000/nᵣ}, where nᵣ is the number of donors to recipient r in a cycle and the maximum is taken over the recipients to whom the donor gave. Inclusion is decided by a fixed hash of the donor's identifier, so the same donors are drawn in each estimation. Each recipient therefore retains approximately 1,000 donors per cycle, or all of its donors if it has fewer, and a donor must appear with retained recipients in at least two recipient–cycle combinations, since a single contribution relates the donor to no other recipient. Raising the cap to 100,000 lowered the held-out correlation for House Democrats from .09 to −.08 and made each fit about seven times slower. Donors excluded by sampling are scored after estimation from the recipients they supported.
4.2 Stopping rule
We stop the optimizer after 600 iterations, well before it satisfies its convergence tolerance; it also stops earlier if the change in the objective or the gradient falls below its tolerance or if no position moves by more than 0.001 standard deviations over 50 iterations. In our tests, running the optimizer to convergence, approximately 3,500 iterations, lowered every held-out correlation we examined. In those tests, which are separate from the October estimates in Table 2, the within-party correlation with DW-NOMINATE fell from .39 to .36 for House Democrats and from .43 to .36 for Senate Republicans, and the correlation of held-out state Democrats with their chambers' roll-call scores fell from .16 to .11. We interpret the additional iterations as fitting noise in the contribution data and treat the iteration limit as a form of regularization that is applied identically on any hardware. These differences are of the same order as the variation between estimations, and we will revisit the limit as estimations accumulate. The main fit of each monthly estimation is initialized at the positions of the currently published estimation; because estimation stops before convergence, the estimates in a given month depend in part on that earlier solution.
4.3 Normalization
The likelihood is invariant to reflection, translation and rescaling of the positions. Absent an earlier estimation, we initialize Republicans at +0.5, Democrats at −0.5 and others at zero, and we reflect the scale after estimation if the Republican mean lies below the Democratic mean. We then standardize positions so that members of Congress whose roll calls enter the model have mean zero and standard deviation one, weighting each member by the number of cycles in the window in which the member has contributions, votes or text, and transform the remaining parameters so that fitted probabilities are unchanged. A difference of one unit therefore corresponds to one standard deviation of congressional ideology over the estimation window. Positive values denote conservative positions.
4.4 Uncertainty
We report an approximate standard error for each recipient, computed from the curvature of the posterior at the estimate with all other parameters held fixed,
\mathrm{se}_r=\frac{1}{s}\Big(\sum_v\beta_v^2\,p_{rv}(1-p_{rv})+\sum_j w_j\,\theta_j^2\,p_{jr}(1-p_{jr})+1\Big)^{-1/2}where the sums run over the recipient's roll calls and over the donors and phrases observed with the recipient, wⱼ is the observation weight, p denotes fitted probabilities and s is the standardization factor from Section 4.3. Median standard errors are 0.014 for members of Congress, 0.026 for state legislators with roll calls, 0.065 for federal candidates without roll calls and 0.082 for unmatched state committees. These standard errors understate the uncertainty in the estimates. They condition on the donor and phrase parameters and ignore the sampling of donors and non-contributions, error in record linkage and committee matching, and the stopping rule.
5 Validation
CSIPs recover the ordering of legislators within parties, and they do so most accurately when roll calls are observed. Except where noted, correlations in this section are computed within party. Across members of the 119th Congress the correlation between CSIPs and DW-NOMINATE is .98, but that figure reflects the separation of the parties and says little about the measure's validity.
5.1 Checks on each estimation
Each monthly estimation must pass three checks before it replaces the published estimates. Within every chamber-and-party group of at least 20 members of Congress, CSIPs must correlate at least .4 with the first dimension of DW-NOMINATE. The new estimates must correlate at least .9 with those they would replace. Republicans must lie to the right of Democrats on average. The thresholds are intended to detect failed estimations rather than small changes. An estimation that fails any check is recorded as rejected, and the previous estimates remain in place. The held-out results described next are computed after an estimation is published and recorded with it; they do not determine whether it is published, and a refit is skipped if too little of the job's time remains.
5.2 Held-out legislators
A more demanding test withholds information from the model. In each estimation we refit the model after removing the roll calls of a fixed half of all members of Congress and state legislators, selected by a hash of their identifiers, and compare the resulting positions of the members of Congress with DW-NOMINATE. The refit starts from the standard starting values rather than from the published estimates, so that no information from the withheld votes enters it. Table 2 reports these correlations for the October 2026 estimates alongside the correlations obtained when all legislators' votes are included.
| Group | Roll calls included, r (n) | Roll calls withheld, r (n) |
|---|---|---|
| House Democrats | .67 (407) | .39 (197) |
| House Republicans | .83 (490) | .53 (247) |
| Senate Democrats | .81 (78) | .51 (43) |
| Senate Republicans | .76 (88) | .39 (43) |
Held-out members retain their official tweets, press releases, newsletters and floor speeches, so the withheld column of Table 2 describes politicians observed through contributions and official communications but not votes. Challengers have no official communications in the model and are placed by contributions alone, so each estimation also records a second refit in which the withheld legislators lose their text as well as their votes. In research estimations that scored held-out members from contributions alone, the mean correlations across five random splits were .04 for House Democrats, .53 for House Republicans, .44 for Senate Democrats and .70 for Senate Republicans; in the October 2026 estimation that refit gave .14, .40, .57 and .51. The Senate groups contain 43 held-out members per party, and differences smaller than .1 between estimations are within sampling variation. An earlier October estimation, whose refit started from the published positions, gave withheld correlations within .03 of those in Table 2.
For state legislators we compare held-out positions with roll-call ideal points estimated separately for each chamber (Section 6.3). Placed by contributions and tweets, held-out Democrats correlate .20 with their own chamber's roll-call scores (2,320 legislators in 75 chambers) and held-out Republicans .20 (3,036 legislators in 90 chambers), averaging within chamber and party and weighting by group size. Contributions order state legislators within a party only weakly, and the estimates for legislators without roll calls, including those in Alaska and Missouri, are correspondingly less accurate.
5.3 External measures
In the same held-out design, CSIPs outperform CFscores among Democrats, the group in which contribution-based measures have performed worst (Table 3). The CFscores come from the 1979–2024 recipient file of DIME version 4.0 (Bonica 2024): each candidate's score is averaged over the candidate's records for cycles since 2020, and the correlations are computed for the held-out members of a single split. The CSIP figures are means over five splits from research estimations in which held-out members retain their official communications. We have not compared CSIPs with the DW-DIME scores of Bonica (2018), which are calibrated to roll calls.
| Measure | House D | House R | Senate D | Senate R |
|---|---|---|---|---|
| CFscores (Bonica 2014) | −.15 | .56 | .58 | .60 |
| CSIPs | .37 | .57 | .74 | .54 |
We also compare CSIPs with Shor–McCarty scores (Shor and McCarty 2025) for state legislators seated between 2019 and 2022, in a research estimation covering 41 states in which 9,006 of 9,085 legislators were matched. Within state chamber and party, CSIPs correlate .73 with Shor–McCarty among Democrats and .67 among Republicans; within party nationally, the correlations are .56 and .33. Our chamber-specific roll-call scores correlate .79 and .80 with Shor–McCarty for the same legislators, so a scale estimated for a single chamber orders that chamber more accurately than CSIPs do. The weakest result concerns state parties in aggregate. The mean CSIP of each state's Democratic legislators correlates .51 with the corresponding Shor–McCarty mean, but the correlation for Republicans is −.03. Finally, members first seated in the 118th or 119th Congress, scored from data that precede their service, are the closest available analogue to challengers. For these 84 members the correlations are .58 for Republicans (CFscores, .42) and .16 for Democrats (CFscores, −.28); we regard the Democratic estimate as unstable.
6 Using the Estimates
6.1 What is published
The estimates are distributed as csip_scores.zip among the bulk files of the America's Political Pulse data site. The same estimates are returned by the site's data API and shown on the site's profile, dashboard and search pages. Each row gives one recipient's estimate from one estimation. The estimation identifier (run_id) is the time the estimation began, in UTC, written as YYYY-MM-DDTHHMMSS. The recipient key identifies a federal candidate (fec: followed by the FEC candidate number), a state legislator matched to Open States (os: followed by the Open States person identifier) or an unmatched state committee (st: followed by the state and a committee key). The remaining columns give the position (score), its standard error (se), the number of roll calls behind it (n_roll_calls), the recipient's name, party, office and state, and, where they exist, the Open States and FEC identifiers. The column cycle is 0 for estimates pooled over the window, which is currently every row. The column n_donors counts the distinct linked donors who gave to the recipient during the window, including donors not sampled for estimation.
Positive values denote conservative positions, and one unit equals one standard deviation of the positions of members of Congress over the estimation window. Users should cite the dataset (Westwood and Lelkes 2024) and report the estimation identifier, so that others can retrieve the same estimates. We do not publish donor-level estimates, linked donor records or the contribution files we download manually. Federal law prohibits the use of information copied from FEC reports to solicit contributions or for commercial purposes (52 U.S.C. §30111(a)(4)), and a linked and scored list of named donors would facilitate such use.
6.2 Comparisons the estimates support
CSIPs are intended for comparisons that cross chambers, states or levels of government, or that include candidates without voting records. Within a single state chamber, the chamber-specific scores described in Section 6.3 order legislators more accurately. For comparisons confined to members of Congress, CSIPs add little to DW-NOMINATE, which is estimated from the same roll calls.
Several comparisons should be avoided or made with care. CSIPs do not align Republican state parties across states: they order Republicans within states and nationally, but the average positions of Republican legislators in different states should not be compared with them (Section 5.3). Among congressional groups, CSIPs are least accurate for House Democrats, and Democrats scored before taking office are poorly placed under every specification we have estimated, including CFscores. Challengers are placed by contributions alone, and their within-party order is correspondingly uncertain. In research estimations, adding text improved the placement of House and Senate Democrats but reduced the within-party correlation for Senate Republicans by .16, possibly because divisions between populist and establishment Republicans are more visible in their rhetoric than in their roll-call votes.
Each recipient has a single position over the 2014–2026 window, so the estimates cannot represent change in an individual's views. A dynamic specification in which positions follow a random walk across cycles placed held-out members less accurately, and we did not adopt it. Changes over time in party medians computed from CSIPs therefore reflect turnover in membership rather than change in individual positions.
The standard errors in Section 4.4 are lower bounds. An interval of ±1.96 standard errors is not a 95 percent interval, and non-overlapping intervals are not sufficient evidence that two recipients differ.
Coverage is uneven. Open States has no member-level roll calls for Alaska or Missouri, and few Hawaii legislators have roll calls in the estimation. Candidates in Maine's public-financing program and many members of the 400-seat New Hampshire House raise little itemized money, so their positions rest on few donors. Mississippi's paper filings from before July 2023 are unavailable. Members who served in both the House and the Senate currently receive a separate estimate for each chamber, which affects 29 politicians. Governors and other statewide candidates are placed by their campaign committees' state contributions alone.
6.3 Chamber-specific scores for state legislators
We also estimate a second measure for state legislators: a one-dimensional probit model of each chamber's floor votes since 2019, estimated with the algorithm of Imai, Lo and Olmsted (2016) and standardized within the chamber. These scores use neither contributions nor text and are comparable only within a chamber. They provide the benchmark for the state-level validation in Section 5.2 and are the better measure for comparisons within a single chamber.
6.4 Updating
Contribution data are collected on the first day of each month and the model is re-estimated on the third. Estimates change as new filings, votes and statements arrive, as record linkage incorporates new records, and through the dependence on initialization described in Section 4.2. Each published estimate carries the identifier of the estimation that produced it, and every published estimation is retained, so that a cited identifier can always be retrieved. The window advances every two years; from January 2027 it will cover the 2016 through 2028 cycles.
7 Replication
7.1 Code and software
The pipeline is part of the lab's code for America's Political Pulse. Collection of contributions, donor linkage, committee matching, the model and the checks on each estimation are in elite/csip/; state roll calls and the chamber-specific scores are in elite/state_legislation/; and the jobs that run them are in elite/entrypoints/. The code is not public; the lab shares it with researchers on request. Estimation runs in Python 3.11 with PyTorch 2.14.1 (CPU build), Splink 5.0.0, DuckDB 1.5.6, pandas 2.3.3, NumPy 1.26.4, SciPy 1.17.1 and NLTK 3.10.3; the version of every dependency is pinned in docker/requirements-csip.lock. A production estimation runs on 8 virtual CPUs with 60 GB of memory.
7.2 Inputs
Table 4 lists the inputs and where they are obtained. Every input except the lab's text archive and the two manual downloads can be collected by the code, which needs only an Open States API key and, for the scanned filings, an OpenAI account.
| Input | Source | Notes |
|---|---|---|
| Federal contributions, candidates and committees | FEC bulk files indiv, cn, cm, ccl and pas2 for each cycle, from fec.gov/files/bulk-downloads | Rebuilt monthly for the current and previous cycles; the date-sorted duplicate inside indiv is skipped |
| State contributions | Each state's campaign-finance agency, one collector per state in elite/csip/states/ | Nevada and Ohio downloaded by hand each month; Arizona, Kansas and Mississippi collected with a headless browser |
| Scanned state filings | Mississippi, South Dakota and Kansas images transcribed by gpt-6-luna through OpenAI's Batch API | Pages rendered at 150 dpi in grayscale; output constrained to a fixed JSON schema |
| Congressional roll calls and DW-NOMINATE | Voteview votes and members files (HS{Congress}_votes.csv, HS{Congress}_members.csv) | DW-NOMINATE first dimension taken from each member's latest Congress in the window |
| Member identifiers | unitedstates/congress-legislators | Links bioguide, FEC and Voteview identifiers |
| State roll calls and rosters | Open States bulk session files; openstates/people | Collected weekly by a separate job |
| Text | The lab's archive of official communications (see the companion paper on rhetoric) | Post text cannot be redistributed |
| Shor–McCarty scores | Harvard Dataverse, doi:10.7910/DVN/SGOQ7G, January 2025 release | Validation only |
7.3 Running an estimation
Three jobs run each month, after the weekly job that collects state roll calls:
python -m elite.entrypoints.csip_fec_ingest # 1st of the month, 03:00 UTC
python -m elite.entrypoints.csip_state_ingest # 1st of the month, 03:00 UTC
python -m elite.entrypoints.csip_score # 3rd of the month, 10:00 UTCThe two collection jobs write contribution files by cycle and by state. The scoring job links donors, matches state committees to legislators, builds the links between state and federal careers, assembles the contribution, phrase and roll-call data, fits the model, applies the checks in Section 5.1, publishes the result, and then refits twice, once with the held-out legislators' votes removed and once with their text removed as well. Linkage reuses a stored Splink model so that donor identifiers do not change between estimations; the option --retrain-linkage retrains it, and --no-holdout, --no-donations-holdout and --no-promote skip the held-out refits and publication. Each estimation writes its recipients, donors, recipient map and career links as Parquet files, together with a record of its settings, data summary and validation results and a manifest of its inputs: the key, size, checksum and modification time of every file read, the checksum of the linkage model and the versions of the libraries used. Every setting is listed in Appendix A.
7.4 Limits on exact reproduction
A third party with the code can rerun the procedure but cannot reproduce a published estimate exactly. The inputs change: the FEC and the states amend filings and Voteview revises its files, and although each estimation records a manifest of its inputs, the raw downloads are not retained, so a later rebuild starts from different data. The text inputs come from the lab's archive, and posts on X cannot be redistributed. Sampling itself is deterministic: donors are sampled by an MD5 hash of their identifiers, and non-contributions and non-uses are drawn from a seeded generator after the data are sorted, so two estimations on identical inputs draw identical samples, although single-precision sums computed in a different order can differ in their last digits. Each estimation starts from the published one and stops after 600 iterations, so its result also depends on the chain of earlier estimations. Nevada's and Ohio's files must be downloaded by hand, and the transcriptions of scanned filings come from a proprietary model. The research estimations reported in this paper, including those behind Table 3, were run with separate research scripts rather than the monthly jobs. The lab shares these scripts on the same terms as the code, but the intermediate files they read were not retained, so repeating those estimations requires rebuilding their inputs.
References
Bonica, Adam. 2014. “Mapping the Ideological Marketplace.” American Journal of Political Science 58(2): 367–386.
Bonica, Adam. 2018. “Inferring Roll-Call Scores from Campaign Contributions Using Supervised Machine Learning.” American Journal of Political Science 62(4): 830–848.
Bonica, Adam. 2024. Database on Ideology, Money in Politics, and Elections: Public Version 4.0 [data set]. Stanford University Libraries. https://data.stanford.edu/dime. Accessed October 2026.
Clinton, Joshua, Simon Jackman, and Douglas Rivers. 2004. “The Statistical Analysis of Roll Call Data.” American Political Science Review 98(2): 355–370.
Fellegi, Ivan P., and Alan B. Sunter. 1969. “A Theory for Record Linkage.” Journal of the American Statistical Association 64(328): 1183–1210.
Imai, Kosuke, James Lo, and Jonathan Olmsted. 2016. “Fast Estimation of Ideal Points with Massive Data.” American Political Science Review 110(4): 631–656.
Lewis, Jeffrey B., Keith Poole, Howard Rosenthal, Adam Boche, Aaron Rudkin, and Luke Sonnet. 2026. Voteview: Congressional Roll-Call Votes Database. https://voteview.com. Accessed October 2026.
Linacre, Robin, Sam Lindsay, Theodore Manassis, Zoe Slade, and Tom Hepworth. 2022. “Splink: Free Software for Probabilistic Record Linkage at Scale.” International Journal of Population Data Science 7(3). https://doi.org/10.23889/ijpds.v7i3.1794.
Poole, Keith T. 2005. Spatial Models of Parliamentary Voting. New York: Cambridge University Press.
Shor, Boris, and Nolan McCarty. 2025. Individual State Legislator Shor-McCarty Ideology Data, January 2025 Update [data set]. Harvard Dataverse. https://doi.org/10.7910/DVN/SGOQ7G.
Westwood, Sean J., and Yphtach Lelkes. 2024. America's Political Pulse [data set]. Polarization Research Lab. https://americaspoliticalpulse.com/data. Accessed October 2026.
Appendix A. Settings
| Setting | Value | Reason |
|---|---|---|
| Window | Seven cycles, 2014–2026; advances in January of odd years | Beat windows beginning in 2008 and 2020 on the held-out test |
| Contributions | Individuals to candidates' authorized committees; FEC types 15, 15E, 15J and 22Y; earmarks attributed to the original donor; refunds netted; coded 1 if the net amount in the cycle is positive | Measures whom a donor supports, not how much |
| PAC contributions | Not in the model | Lowered the held-out correlation for House Democrats |
| Donor linkage | Splink, match probability at least .9; model trained once and reused | Precision .951, recall .943; stable donor identifiers |
| Recipients | At least five donors or a voting record | Fewer donors cannot place a recipient |
| Donors | At least two recipient–cycle combinations among retained recipients | One contribution relates a donor to no other recipient |
| Donor sampling | Inclusion probability maxᵣ min{1, 1000/nᵣ}, by MD5 hash of the donor identifier | A cap of 100,000 lowered held-out accuracy and was seven times slower |
| Non-contributions | Three per contribution, uniform with replacement within cycle and pool (federal candidates; recipients in the same state); draws matching a real contribution discarded | Popularity-weighted and nationwide draws were worse |
| Phrases | Porter-stemmed two-word phrases after removing links, mentions and a custom stopword list; counted if in at least two of a speaker's documents in the cycle; the 10,000 most widely used phrases used by at least 20 speakers and at most half of them | Rare phrases cannot be calibrated; ubiquitous ones carry no slant |
| Non-uses | Three per use, among speakers with text in the cycle | A speaker without text has not declined a phrase |
| Campaign text | Excluded | Held-out House Democrats correlated −.14 when scored from it |
| Congressional roll calls | All yea and nay votes, 113th–119th Congresses | |
| State roll calls | Floor votes since 2019, yea and nay; minority at least 2.5 percent; at most 300 per chamber and cycle, chosen by MD5 hash of the vote identifier | Lopsided votes carry no information; the cap keeps state votes from outweighing other data |
| Chamber assignment | Chamber holding at least 75 percent of identified voters (at least three); floor vote if at least 60 percent of seated members are recorded, or if the chamber has fewer than ten members | Open States records some committee votes as floor votes |
| Dimensions | One ideological dimension; two further dimensions for contributions and phrases only | Raised held-out accuracy for House Democrats |
| Link function | Logit | |
| Observation weights | Contributions 0.3; phrases and roll calls 1 | Keeps members' positions close to their voting records |
| Priors | φ ~ N(μg, 1); μg ~ N(0, 1/5); intercepts and discrimination N(0, 25); slants N(0, 4); non-ideological positions N(0, 1), loadings N(0, 4) | Shrinks thinly observed recipients toward their group |
| Groups | Party (Democrat, Republican, other) × office (House, Senate, president, state legislature, other state office); a pooled recipient takes the group of its earliest cycle | |
| Optimizer | L-BFGS-B in single precision, 20 stored corrections; stops at 600 iterations, objective tolerance 10⁻⁸, gradient tolerance 10⁻⁵, or no position moving more than 0.001 SD in 50 iterations | Converged fits were less accurate on the held-out test |
| Initialization | Main fit: positions of the published estimation; held-out refits and first fits: Republicans +0.5, Democrats −0.5, others 0 | |
| Orientation and scale | Reflected if the Republican mean lies below the Democratic mean; mean 0 and SD 1 among members of Congress with roll calls, over recipient–cycles | Positive is conservative; one unit is one SD of congressional ideology |
| Held-out set | Half of members of Congress and state legislators: those whose identifiers fall in the lower half of a fixed MD5 hash (prefix “holdout”); refit once without their votes and once without their votes or text | Fixed across estimations, so results are comparable |
| Acceptance | r ≥ .4 with DW-NOMINATE in every chamber-and-party group of at least 20 members of Congress; r ≥ .9 with the published estimates; Republicans right of Democrats | Detects failed estimations |
| Chamber-specific scores | EM probit per chamber and two-year session, plus a pooled period from 2019; minority at least 2.5 percent; at least 20 votes per legislator and 10 legislators; up to 1,000 iterations, tolerance 10⁻⁷ | Benchmark for state validation |

