New York City Council ideal points

Technical appendix · Pooled stated-meeting roll calls, 2014–2026

Author

Boris Shor

Updated

October 8, 2026

This appendix documents the estimation behind the New York report: 123 members placed on one dimension using 1239 contested stated-meeting roll calls from November 2014 to September 2026.

Data and construction

The input is the New York City stated-meeting subset of the MyTown corpus, release of September 18, 2026. Code/18_prepare_nyc_full.r filters to municipality 3405 and body City Council Stated Meeting, joins meeting dates and the alias tables to resolve person_id, and asserts that no member has two different recorded votes on the same item.

The published 2022–2026 analysis used the same source with a deliberate meeting_date >= 2022-01-01 cutoff. That cutoff, not the data, set the earlier window: the September 14 extract already reached back to November 13, 2014. Restricting the current release to the 94 meetings of the earlier fit reproduces all 127,142 records exactly, so nothing previously fitted has changed.

Yea is coded 1 and nay 0. Every other status is missing and never a nay: absence, abstention, medical, maternity, paternity, bereavement, and suspension. An item is one recorded meeting–motion combination and is retained when at least one member votes on each side and at least 40 recorded responses are yea or nay — 1239 of 5,842 items. The enlarged fit adds 502 one-member-minority items to the earlier 737-item fit, preserved in Results/nyc-full-min2-2026-10-08/.

Council Members Contested items voted
2014⁠-⁠2017 56 1,170
2018⁠-⁠2021 58 2,129
2022⁠-⁠2023 51 1,100
2024⁠-⁠2025 54 1,093
2026– 52 350

Model and estimation

The model is P(yea on item j by member i) = Φ(xᵢβⱼ − αⱼ), where Φ is the standard normal CDF, xᵢ is the member’s ideal point, βⱼ is item discrimination, and αⱼ is item difficulty. Each member receives one coordinate for their whole service.

The implementation follows the workflow used for the other city pilots: pscl::rollcall(), dropRollCall(legisMin=3, lop=0), and ideal(d=1, normalize=TRUE, store.item=TRUE) with the package’s default normal priors. Exactly two chains run 110,000 iterations each — 100,000 sampling after 10,000 burn-in, thinned by 100. Both start from researched affiliation: Democratic −1, Republican +1, and Ari Kagan’s switch 0, with different random seeds. Starts enter neither the likelihood nor the prior. pscl::ideal is single-threaded, so the chains are dispatched as parallel forks.

normalize=TRUE supplies location and scale identification. Draw signs are then aligned to a single vote-derived axis — the leading singular vector of the centered vote matrix, oriented so that Joseph Borelli is positive. One global axis orients every fit: anchoring a subset on an individual member silently flips that subset’s sign whenever the member is absent from it.

Diagnostics

Convergence

Measure Value
Members 123
Retained items 1239
Chains 2
Iterations per chain 110,000
Maximum R-hat 1.048
Members with R-hat above 1.1 0
Minimum effective sample size 49
Minimum pairwise chain-mean correlation 1.000

These are classical univariate R-hat and coda effective sample sizes, not rank-normalized split R-hat or bulk/tail ESS. They describe sampling behavior, not whether the model is the right one.

Why starting values matter here

The one-vote-minority diagnostic compared vote-derived, dispersed random, party and jittered vote-derived starts at 50,000, 100,000 and 250,000 sampling iterations. The vote-derived, random and party starts recover essentially the same solution without requiring party labels to identify it. The reported two-chain means correlate 0.9999 with the longer agreeing reference, with a maximum member difference of 0.09. These initialization checks are separate from the two chains used for reported estimates.

The jittered start reaches a persistent second mode that places Inez Barron and Jumaane Williams on the positive side. A response-level prediction check gives it worse log loss than the agreeing solutions. This is a known alternative mode, not evidence that the two reported chains disagree. The prediction check holds full-data member positions fixed and trains item-specific ridge-logistic response models on subsets of votes. It requires two training responses on each side and therefore excludes lone-dissenter items; it is not a complete held-out refit of the ideal-point model.

Split Test responses Vote-derived start Random start Party start Jittered start
1 6,068 0.205 0.205 0.205 0.222
2 5,942 0.204 0.205 0.204 0.221
3 6,025 0.206 0.207 0.206 0.227

Charles Barron has the lowest effective sample size (49), with the next-lowest at 104. His extreme position and wide interval warrant more caution than agreement in chain means alone suggests.

What connects the eras

Transition Members that year Also serving the next year
2014→2015 51 48
2015→2016 50 49
2016→2017 51 50
2017→2018 52 41
2018→2019 51 51
2019→2020 52 51
2020→2021 52 46
2021→2022 51 16
2022→2023 51 51
2023→2024 51 47
2024→2025 51 50
2025→2026 53 42

The weakest overlap is between 2021 and 2022, when term limits turned over most of the chamber: 16 members carry across, against 41–51 in the other transitions. This service-overlap structure connects the historical and current councils on the pooled scale.

Sensitivity to repeated voting patterns

Many stated-meeting items share an identical pattern of binary votes and missing responses within a meeting. Keeping one copy of each pattern would reduce the item set from 1239 to 569. No repeated-pattern fit was run for this update. The earlier 737-item repeated-pattern experiment did not converge and is not a result for the enlarged matrix. Matching response vectors alone do not establish that two records describe the same actual vote; event-level consolidation requires source evidence.

Member estimates

Member Posterior mean 95% lower 95% upper R-hat ESS Retained votes
Charles Barron -6.719 -8.485 -5.249 1.025 49.231 336
Inez D. Barron -1.755 -2.006 -1.529 1.012 283.731 596
Kristin Richardson Jordan -1.500 -1.773 -1.258 1.000 134.336 307
Jumaane D. Williams -1.105 -1.327 -0.899 1.013 263.512 176
Tiffany L. Cabán -1.073 -1.305 -0.871 1.002 113.268 564
Alexa Avilés -1.064 -1.297 -0.869 1.000 145.797 566
Sandy Nurse -0.858 -1.061 -0.680 1.002 128.800 561
Chi A. Ossé -0.817 -1.018 -0.640 1.004 127.959 537
Shahana K. Hanif -0.814 -1.010 -0.635 1.002 123.291 569
Kayla Santosuosso -0.771 -1.049 -0.499 1.001 277.682 70
Carlos Menchaca -0.707 -0.864 -0.552 1.009 122.552 589
Jennifer Gutiérrez -0.672 -0.874 -0.492 1.003 135.187 562
Julie Won -0.617 -0.809 -0.440 1.001 146.792 560
Brad S. Lander -0.586 -0.731 -0.438 1.017 124.994 615
James G. Van Bramer -0.503 -0.652 -0.347 1.014 137.160 588
Justin E. Sanchez -0.454 -0.727 -0.198 1.002 379.807 70
Shirley Aldebol -0.450 -0.728 -0.207 1.000 318.994 70
Crystal Hudson -0.444 -0.642 -0.268 1.003 239.410 562
Lincoln Restler -0.431 -0.625 -0.251 1.001 127.151 574
Shekar Krishnan -0.426 -0.621 -0.244 1.009 150.876 578
Antonio Reynoso -0.410 -0.567 -0.253 1.013 171.767 570
Rita C. Joseph -0.400 -0.592 -0.219 1.006 132.637 573
Costa G. Constantinides -0.396 -0.566 -0.234 1.005 183.156 425
Ben Kallos -0.376 -0.525 -0.218 1.006 145.815 637
Maria Del Carmen Arroyo -0.362 -2.157 0.955 1.006 1191.495 14
Carmen N. De La Rosa -0.350 -0.548 -0.165 1.006 163.893 588
Pierina Ana Sanchez -0.339 -0.537 -0.144 1.003 182.164 573
Erik D. Bottcher -0.339 -0.553 -0.120 1.005 243.476 476
Gale A. Brewer -0.338 -0.541 -0.142 1.001 161.166 584
Althea V. Stevens -0.332 -0.535 -0.145 1.004 209.266 581
Harvey D. Epstein -0.327 -0.609 -0.058 1.001 288.020 74
Amanda C. Farías -0.326 -0.518 -0.148 1.001 142.158 586
Rosie Mendez -0.325 -0.590 0.041 1.003 748.033 108
Diana I. Ayala -0.320 -0.482 -0.158 1.011 135.954 974
Bill Perkins -0.300 -0.494 -0.094 1.005 302.654 429
Mark S. Weprin -0.289 -2.288 1.163 1.002 1591.115 7
Carlina Rivera -0.270 -0.422 -0.113 1.000 147.516 962
Donovan J. Richards -0.267 -0.464 -0.054 1.003 280.650 430
Daniel Dromm -0.255 -0.422 -0.083 1.002 265.418 647
Keith Powers -0.252 -0.411 -0.088 1.002 158.720 1,032
Margaret S. Chin -0.252 -0.438 -0.049 1.002 178.853 621
Rafael L. Espinal Jr. -0.241 -0.487 0.009 1.002 320.018 274
Corey D. Johnson -0.237 -0.416 -0.056 1.001 309.656 631
Laurie A. Cumbo -0.230 -0.414 -0.046 1.002 265.444 533
Carl Wilson -0.229 -0.676 0.222 1.002 662.091 47
Stephen T. Levin -0.229 -0.408 -0.041 1.000 275.567 620
Alicka Ampry-Samuel -0.225 -0.414 -0.026 1.006 270.609 474
Christopher Marte -0.218 -0.413 -0.031 1.000 155.305 555
Mark Levine -0.217 -0.402 -0.037 1.005 165.045 609
Adrienne E. Adams -0.216 -0.381 -0.053 1.003 169.161 1,034
Ydanis A. Rodriguez -0.215 -0.405 -0.013 1.000 210.439 589
Shaun Abreu -0.212 -0.398 -0.041 1.002 210.139 585
Vanessa L. Gibson -0.209 -0.389 -0.023 1.006 225.034 632
Mark Treyger -0.209 -0.387 -0.018 1.001 245.465 641
Ritchie J. Torres -0.206 -0.400 -0.003 1.002 239.974 418
Julie Menin -0.204 -0.398 -0.021 1.006 229.479 587
Mathieu Eugene -0.204 -0.386 -0.016 1.003 233.962 634
Yusef Salaam -0.202 -0.406 -0.011 1.002 221.255 240
Karen Koslowitz -0.199 -0.380 -0.013 1.001 258.655 629
Oswald J. Feliz -0.198 -0.386 -0.027 1.003 209.088 736
Helen K. Rosenthal -0.175 -0.359 0.017 1.004 205.421 635
Francisco P. Moya -0.174 -0.331 -0.008 1.000 181.942 979
Andrew Cohen -0.174 -0.378 0.016 1.000 280.547 447
Rafael Salamanca Jr. -0.160 -0.314 -0.011 1.001 170.484 1,079
Kevin C. Riley -0.149 -0.330 0.025 1.001 170.749 781
Lynn C. Schulman -0.140 -0.324 0.048 1.000 221.831 588
Nantasha M. Williams -0.132 -0.313 0.033 1.002 273.700 569
Sandra Ung -0.128 -0.321 0.058 1.006 267.082 540
Elsie Encarnación -0.126 -0.400 0.165 1.001 724.292 70
Virginia Maloney -0.123 -0.416 0.169 1.002 380.086 70
Julissa Ferreras-Copeland -0.114 -0.492 0.313 1.005 886.728 92
Vincent J. Gentile -0.103 -0.460 0.295 1.004 902.894 129
Peter A. Koo -0.087 -0.276 0.100 1.008 239.561 637
Darma V. Diaz -0.085 -0.358 0.234 1.001 600.599 214
Selvena N. Brooks-Powers -0.082 -0.263 0.086 1.003 272.158 747
Melissa Mark-Viverito -0.074 -0.432 0.305 1.000 690.552 130
Alan N. Maisel -0.073 -0.265 0.115 1.003 250.417 632
Annabel Palma -0.067 -0.439 0.335 1.000 1170.408 99
Ty Hankerson -0.058 -0.352 0.243 1.000 554.191 69
Rory I. Lancman -0.058 -0.273 0.144 1.000 297.221 422
Fernando Cabrera -0.052 -0.252 0.145 1.002 268.603 520
Mercedes Narcisse -0.042 -0.263 0.142 1.015 404.815 564
Daniel R. Garodnick -0.014 -0.418 0.366 1.001 1222.385 122
Shanel Thomas-Henry 0.014 -0.287 0.298 1.000 646.179 70
Marjorie Velázquez 0.020 -0.317 0.323 1.000 898.285 316
Chris Banks 0.022 -0.160 0.184 1.004 176.513 236
Eric Dinowitz 0.024 -0.145 0.176 1.001 147.177 738
Ruben Wills 0.054 -0.621 0.793 1.001 1263.883 37
Justin L. Brannan 0.059 -0.078 0.191 1.003 142.571 1,028
Andy L. King 0.060 -0.200 0.284 1.002 298.624 283
James F. Gennaro 0.077 -0.077 0.223 1.001 191.711 723
Barry S. Grodenchik 0.079 -0.104 0.254 1.004 223.289 632
Farah N. Louis 0.089 -0.055 0.223 1.000 131.788 885
Linda Lee 0.100 -0.062 0.252 1.000 174.392 548
Robert E. Cornegy Jr. 0.144 -0.041 0.330 1.003 209.817 562
Deborah L. Rose 0.260 0.072 0.440 1.002 199.285 599
Inez E. Dickens 0.294 -0.424 1.160 1.004 815.698 29
I. Daneek Miller 0.387 0.215 0.565 1.000 161.140 564
Darlene Mealy 0.399 0.264 0.536 1.000 128.311 487
Kamillah Hanks 0.419 0.289 0.561 1.000 104.373 508
Susan Zhuang 0.532 0.382 0.675 1.003 127.067 210
Elizabeth S. Crowley 0.546 0.316 0.773 1.002 337.247 113
Paul A. Vallone 0.595 0.413 0.767 1.002 163.040 568
David G. Greenfield 0.624 0.379 0.859 1.000 400.133 127
Simcha Felder 0.670 0.500 0.835 1.014 180.902 123
Ruben Diaz Sr. 0.700 0.501 0.902 1.009 218.857 394
Phil Wong 0.803 0.607 1.018 1.004 213.343 70
James Vacca 0.830 0.608 1.050 1.001 255.202 126
Chaim M. Deutsch 0.896 0.714 1.083 1.009 178.009 476
Mark Gjonaj 1.036 0.854 1.223 1.022 140.891 490
Ari Kagan 1.251 1.043 1.474 1.028 196.043 335
Eric A. Ulrich 1.318 1.140 1.503 1.034 113.515 593
Robert F. Holden 1.404 1.235 1.581 1.047 105.476 1,039
Kristy Marmorato 1.512 1.267 1.780 1.023 241.268 170
Frank Morano 1.772 1.474 2.133 1.013 455.725 112
Joann Ariola 1.898 1.670 2.155 1.045 179.604 579
Inna Vernikov 1.956 1.718 2.227 1.047 156.816 504
David M. Carr 1.959 1.715 2.236 1.046 148.936 568
Kalman Yeger 1.987 1.778 2.220 1.046 163.381 905
Vickie Paladino 2.021 1.783 2.294 1.027 150.210 545
Joseph C. Borelli 2.604 2.319 2.909 1.046 107.862 995
Vincent Ignizio 2.786 1.716 4.259 1.002 1819.709 5
Steven Matteo 2.878 2.561 3.221 1.048 146.176 632

Intervals are marginal equal-tail intervals under the fitted model. Vincent Ignizio has only 5 retained votes and an interval spanning 1.72 to 4.26. Charles Barron, the most extreme estimate, has 336 votes, including 131 lone nays, and an interval from -8.48 to -5.25. Inez Barron’s 135 lone nays belong to a separate member. The crowded middle has heavily overlapping intervals and should not be read as a ranking.

Validation construction

Organizational indicators are assembled by Code/24_nyc_validation_data.r into source-backed tables and joined on person_id, not on names. Records carry validity intervals, and several rosters are snapshots rather than continuous memberships, so the pooled indicator is “ever recorded in this group”. Party affiliation is a separate 124-row research ledger produced by Code/41_nyc_party_primary_audit.r and Code/42_nyc_party_affiliation_research.r, covering all 123 fitted people. Its sources are the Council’s captured 2026 roster, official partisan primary returns, and candidate-supplied enrollment statements. These prove dated affiliations, not an uninterrupted enrollment history. One person, Ari Kagan, has both Democratic and Republican rows because the Council documented his switch on December 5, 2022; his single pooled ideal point is excluded from static party comparisons. Board of Elections general-election ballot lines remain a separate fusion-line measure and are never treated as registration.

Code/43_nyc_dated_groups.r adds a contemporaneous check rather than extrapolating those snapshots across the pooled period. The September 18 Progressive comparison uses that day’s complete 51-person Council directory and official caucus page. The June 11 Common-Sense comparison uses the 51 people named in that day’s Council roll call, including the one absent voter, and the six-person official caucus roster with June 11 membership start dates (observed September 28). The two Council cohorts contain the same 51 people. Within each dated cohort, absence from an exhaustive caucus roster can be coded unlisted; it cannot be generalized to other dates. The script also stratifies by researched Democratic affiliation, omitting Kagan’s switch from the fixed-party comparison. Four DSA endorsement episodes are retained as positive evidence only because the available announcements do not establish an exhaustive candidate slate. The dated detail, four-row summary, and positive-only DSA ledger are under Results/NYC-full/.

The local ledger joins 122 fitted person_ids to the published local-id-v1 crosswalk. I. Daneek Miller is the one missing registry entry, retained with his legacy ID and a blank local_id pending upstream allocation. The proposed upstream evidence vocabulary has no explicit official-legislative-roster type; its 51 Council-roster rows are provisionally coded reported, with the official source and local capture named in the row. Neither issue changes the local person-ID join, but both matter before a release-ready party_affiliation.csv is published.

District comparisons: 2024 presidential results aggregate the published precinct polygons to council boundaries; council-election shares use candidate totals, because per-line splits are unavailable for 2023; and the 2025 mayoral figures aggregate Board of Elections election-district returns to all 51 districts using that same election’s council result files as the crosswalk, with all 4,117 in-play election districts matching exactly one district. None of these quantities enters estimation.

Bridging to the state common space

The mapping

Sixteen people in the analysis also served in the New York State Assembly or Senate, where the Shor–McCarty common space measures legislators on a scale shared across states. Fifteen enter calibration: Charles Barron is excluded at Boris’s direction because his council estimate is extreme and uncertain. He remains a verified officeholding bridge and a member of the council fit; Inez Barron remains in calibration. state_bridge_candidate_members.csv preserves all sixteen matches with an inclusion flag and reason; state_bridge_members.csv contains the fifteen used. The bridge follows the core of linear_map_states(): regress the common-space score on council coordinates over the included members, then apply the coefficients to the council.

Term Estimate Std. error t p
Intercept -1.491 0.107 -13.88 3.6e-09
Slope (council ideal point) 0.529 0.104 5.08 0.00021

R² is 0.67 on 15 bridges, Pearson 0.82, residual standard error 0.41. The simulation-based standard errors, party-indicator variants, and leave-one-out consistency checks in the original function are not reproduced here, so the mapping’s own uncertainty is not propagated into member positions: the mapped scores are point estimates of a transform.

Because the transform is linear, it changes no member’s rank. The slope 0.529 converts council distances into state units. The empirical ratio of the state-score and council-coordinate standard deviations among included bridges is 0.65; that descriptive ratio is not the fitted slope.

Council name State name Party Chamber Council ideal point Common space Common-space SE
Inez D. Barron Barron, Inez (listed as Charles; AD-40) D H -1.755 -1.463 0.105
Carmen N. De La Rosa De La Rosa, Carmen D H -0.350 -1.946 0.113
Erik D. Bottcher Bottcher, Erik D S -0.339 -1.781 0.206
Harvey D. Epstein Epstein, Harvey D H -0.327 -1.790 0.124
Bill Perkins Perkins, Bill D S -0.300 -2.408 0.165
Keith Powers Powers, Keith D H -0.252 -1.477 0.182
Vanessa L. Gibson Gibson, Vanessa D H -0.209 -2.135 0.132
Francisco P. Moya Moya, Francisco P. D H -0.174 -1.774 0.088
Alan N. Maisel Maisel, Alan D H -0.073 -1.499 0.091
Rory I. Lancman Lancman, Rory D H -0.058 -1.414 0.092
Inez E. Dickens Dickens, Inez D H 0.294 -1.333 0.088
Simcha Felder Felder, Simcha D S 0.670 -0.816 0.068
Mark Gjonaj Gjonaj, Mark D H 1.036 -0.835 0.068
Kalman Yeger Yeger, Kalman D H 1.987 -0.464 0.070
Joseph C. Borelli Borelli, Joseph R H 2.604 0.231 0.106

Matching, and why it is the weak point

There is no identifier shared end to end. The bridge table carries modern OCD person ids (ocd-person/…); the state project’s id file carries legacy OpenStates ids (NYL000342); and the published common-scores file carries no id at all. The join is therefore on normalized names — first name plus full surname, accents and generational suffixes stripped — with no chamber or district check. Thirteen of the sixteen are unambiguous. Adding a person id to the scores export would make this durable, and would serve any future city-to-state bridge.

One case had to be resolved by hand. The scores file contains two records named “Barron, Charles”, for assembly districts 40 and 60. They are two different people: the state id file places Charles in AD-60 from 2015 and Inez Barron in AD-40 from 2009. Both Barrons served on the council and in the assembly, so both are genuine bridges, and the AD-40 record is Inez’s score carrying Charles’s name. Averaging those records would merge a married couple. The separated mapping uses 15 bridges, slope 0.529, R² 0.67. The mislabeling is upstream, in the state project’s output, not in this analysis.

Charles Barron does not enter this regression. His council coordinate remains displayed in council plots; applying the fifteen-member transform to him is an extrapolation beyond the calibration range, not new bridge evidence. The exclusion changes calibration only, not the underlying council fit or the verified cross-office identity record.

State legislators representing the city

Comparing the council with every legislator in Albany mixes constituencies. Census TIGER 2024 state legislative boundaries were intersected with the city, taken as the union of the 51 council districts, keeping districts with a majority of their area inside: 65 of 150 assembly districts and 28 of 63 senate districts. Only 2 districts straddle the line meaningfully, and they are reported rather than dropped silently.

Party comparisons are made party by party — council Democrats against state Democrats, council Republicans against state Republicans. An overall council median mixes the parties and is comparable with neither.

Benchmarks are also period-matched. The state project publishes per-chamber, per-year common scores, so each council class is compared with the legislators sitting during that class’s own years rather than with a pool spanning 1994–2026; the pooled file would flatter the comparison, since the state Democratic median itself moves left over the period.

Limits

  • Pooling assumes fixed positions. Each member receives one coordinate for their entire service, across several speakers and two charter revisions.
  • Cross-era identification is thin at one seam, as above.
  • Recorded divisions are selected. 1239 of 5,842 items were contested enough to scale; which matters reach a divided vote is itself a political choice, so this is a small and non-random slice of council business.
  • One dimension is imposed, not tested. No higher-dimensional comparison or item-level fit assessment has been run.
  • Scores are city-specific. On their own scale they share no units with the Chicago, Denver, or Houston fits. The state mapping expresses them in common-space units through fifteen included calibration members.
  • The bridge is name-matched. Sixteen verified matches are preserved, but fifteen enter calibration. Charles Barron’s uncertain coordinate is excluded; no shared identifier runs end to end.

Reproduction

From the project root:

Rscript Code/18_prepare_nyc_full.r   # SOURCE_DIR must hold the release parquet files
Rscript Code/19_fit_nyc_full.r       # IDEAL_ITER, IDEAL_CORES, IDEAL_FITS
Rscript Code/24_nyc_validation_data.r
Rscript Code/41_nyc_party_primary_audit.r
Rscript Code/42_nyc_party_affiliation_research.r
Rscript Code/20_nyc_full_face_validity.r
Rscript Code/21_nyc_full_validation.r
Rscript Code/22_nyc_mayoral_districts.r
Rscript Code/25_nyc_mayoral_series.r
Rscript Code/27_nyc_presidential_series.r
Rscript Code/23_nyc_council_series.r
Rscript Code/28_nyc_state_bridge.r
Rscript Code/29_nyc_common_space_plots.r
Rscript Code/30_nyc_common_space_series.r
Rscript Code/31_nyc_state_districts.r     # downloads Census TIGER boundaries once
Rscript Code/32_nyc_city_state_compare.r
quarto render nyc-report.qmd
quarto render nyc-technical-appendix.qmd

Seeds and session information are saved with the results in Results/NYC-full/.