Sign in

Chris Kenny, PhD

@chriskenny.bsky.social
808 followers 353 following 258 posts

Postdoc, Princeton DDSS. PhD '25 Government @harvard.edu. Studies redistricting with #rstats. christophertkenny.com

PostsRepliesMedia
Chris Kenny, PhD @chriskenny.bsky.social · 11/10/2026
irelink is now on CRAN. It is a translation of Python's beloved record linkage package splink into a friendly, pipeable #rstats syntax If you try it out and have feedback, please let me know! Docs: christophertkenny.com/irelink/
christophertkenny.com
Fast Probabilistic Record Linkage
Performs fast, scalable probabilistic record linkage and deduplication using the Fellegi-Sunter model. Records lacking a shared unique identifier are compared across configurable dimensions using exac...
073
Reposted by Chris Kenny, PhD
Christine Zhang @christinezhang.bsky.social · 16/09/2026
sad to not be covering this momentous #fed day as I’m at @posit.co #positconf, but Very glad to see the Fed balance sheet visualized in Hamid Shafiezadeh’s excellent presentation at the #rstats R nerds session 🤓, “When English Is Second, R Comes First”
1142
Chris Kenny, PhD @chriskenny.bsky.social · 17/09/2026
Very well done on the talk today!
110
Chris Kenny, PhD @chriskenny.bsky.social · 15/09/2026
Looking forward to it!
000
Chris Kenny, PhD @chriskenny.bsky.social · 15/09/2026
That’s great. Never a silver bullet, but it would be great for students writing technical documents to have evidence of some kind in support of their work when we’re worried that false accusations of AI slop are likely worse than missed ones in educational settings
120
Chris Kenny, PhD @chriskenny.bsky.social · 15/09/2026
This looks awesome! Looking forward to hearing more about it this week. Is the automerge history exposed in some way? It would be awesome to be able to export that for profs looking for evidence that documents were hand written and not AI. I’ve seen a lot of folks using gdocs history for that.
220
Reposted by Chris Kenny, PhD
Gabor Csardi @gaborcsardi.org · 14/09/2026
New beta of #Rstats rig: LOTS of EXCITING stuff: - new: web site: rig.r-lib.org - new: user-mode R installation: rig.r-lib.org/admin-vs-use... - new: manage R packages (CRAN + git): rig.r-lib.org/pkg-guide.html - new: manage R projects and virtual environments: rig.r-lib.org/proj-guide.h...
rig.r-lib.org
rig – the R Installation Manager – rig
35019
Chris Kenny, PhD @chriskenny.bsky.social · 14/09/2026
Headed to posit::conf(2026)! Feel free to send me a message if you want to chat #rstats and polisci/social science!
040
Chris Kenny, PhD @chriskenny.bsky.social · 14/09/2026
Thanks for this, especially the .exe change!
010
Reposted by Chris Kenny, PhD
CAC @myconstitution.bsky.social · 02/09/2026
CAC, along with Stafford Rosenbaum, is proud to represent Kosuke Imai, @chriskenny.bsky.social, @philjones.bsky.social, and John Griffin.
021
Reposted by Chris Kenny, PhD
CAC @myconstitution.bsky.social · 02/09/2026
Anti-competitive gerrymandering strikes at the heart of our democracy. Read our brief in the Wisconsin Supreme Court: www.theusconstitution.org/litigation/w...
theusconstitution.org
Wisconsin Business Leaders for Democracy v. Wisconsin State Legislature | Constitutional Accountability Center
112
Reposted by Chris Kenny, PhD
Cory McCartan @corymccartan.com · 07/08/2026
Out yesterday at Nature Human Behaviour is my paper with @chriskenny.bsky.social on a unified way to measure individual & group harms in redistricting! Due to extortionate APC fees (~$13k) we did not publish open access, but you can read for free at rdcu.be/fyd95 !
rdcu.be
Individual and differential harm in redistricting
Nature Human Behaviour - McCartan and Kenny develop a framework for quantifying the individual-level impacts of redistricting in the USA, showing its applicability for identifying partisan...
1101
Reposted by Chris Kenny, PhD
Cambridge University Press Political Science & IR @cambup-polsci.cambridge.org · 30/07/2026
#OpenAccess from @apsrjournal.bsky.social - Redistricting Reforms Reduce Gerrymandering by Constraining Partisan Actors - cup.org/4pNwXA7 - @corymccartan.com, @chriskenny.bsky.social, @simko.bsky.social, EMMA EBOWE, MICHAEL Y. ZHAO & KOSUKE IMAI #FirstView
Banner with the hashtag #OpenAccess on a green background and the text "American Political Science Review" on a blue background below.
054
Chris Kenny, PhD @chriskenny.bsky.social · 22/07/2026
Thanks Julio! Hope you’re doing well.
010
Chris Kenny, PhD @chriskenny.bsky.social · 22/07/2026
Thank you Sharon!
020
Chris Kenny, PhD @chriskenny.bsky.social · 21/07/2026
Thank you!
010
Chris Kenny, PhD @chriskenny.bsky.social · 21/07/2026
Thanks Kabir!
010
Chris Kenny, PhD @chriskenny.bsky.social · 21/07/2026
Thrilled to share that I received POLMETH's Statistical Software Award for 2026 for the #rstats package geomander. It's a performant toolkit for working with spatial data, especially election and demographic data. Learn more about the package at christophertkenny.com/geomander/
christophertkenny.com
Geographic Tools for Studying Gerrymandering
A compilation of tools to complete common tasks for studying gerrymandering. This focuses on the geographic tool side of common problems, such as linking different levels of spatial units or estimatin...
813534
Chris Kenny, PhD @chriskenny.bsky.social · 31/05/2026
Check it all out at christophertkenny.com/atlas. More details explained in the data and methodology sections of the website!
christophertkenny.com
Algorithmic Redistricting Atlas
020
Chris Kenny, PhD @chriskenny.bsky.social · 31/05/2026
The new algorithm works well with an existing “short-burst” concept for drawing optimized plans. This powers the simulated gerrymanders in the atlas, for both seat maximizing and safe seat maximizing.
100
Chris Kenny, PhD @chriskenny.bsky.social · 31/05/2026
3/3 In a second new paper, I extend a standard MCMC algorithm for sampling redistricting plans to redraw more than 2 districts at a time. Random sampling has become the standard way to detect gerrymanders. osf.io/preprints/so...
100
Chris Kenny, PhD @chriskenny.bsky.social · 31/05/2026
I assemble precinct-level returns from the last five presidential elections and combine them with nonpartisan simulations. 2008 voters give Democrats around 203 seats, while 2024 voters would split the House about evenly, absent gerrymandering. This data powers the atlas. Original data sources:
110
Chris Kenny, PhD @chriskenny.bsky.social · 31/05/2026
2/3 Republicans have had a built-in edge in the House for years from the asymmetric geographic sorting of Democrats and Republicans. In a new paper, I show that edge has steadily declined and largely disappeared by 2024. osf.io/preprints/so...
110
Chris Kenny, PhD @chriskenny.bsky.social · 31/05/2026
You can explore it here: christophertkenny.com/atlas. The heatmaps are reminiscent of 538's old redistricting atlas.
110
Chris Kenny, PhD @chriskenny.bsky.social · 31/05/2026
3 new projects: 1/3 an Algorithmic Redistricting Atlas. Explore congressional redistricting across enacted, simulated, and optimized maps. It has data for the last 5 presidential elections, and you can swing the national baseline.
184
Chris Kenny, PhD @chriskenny.bsky.social · 29/05/2026
Ah, that’s interesting. The spaces aren’t random, just unintuitive. Although it looks like the example has an extra space in each column too
000
Chris Kenny, PhD @chriskenny.bsky.social · 29/05/2026
Is air formatting broken for tribbles at the moment? It seems to be inserting spaces inconsistently, almost at-random
A screenshot from GitHub desktop showing a tribble pre and post running air.
110
Chris Kenny, PhD @chriskenny.bsky.social · 22/05/2026
Thanks. Please let me know if you encounter any issues. I ran the 10k row deduplication example (www.tedenamorado.com/software) for fastLink when testing and saw a 738x speedup with ~identical results.
tedenamorado.com
Software — Ted Enamorado
010
Chris Kenny, PhD @chriskenny.bsky.social · 21/05/2026
It is not on CRAN yet, so download with pak::pak('christopherkenny/irelink') Full website: christophertkenny.com/irelink/
christophertkenny.com
Fast Probabilistic Record Linkage
Performs fast, scalable probabilistic record linkage and deduplication using the Fellegi-Sunter model. Records lacking a shared unique identifier are compared across configurable dimensions using exac...
010
Chris Kenny, PhD @chriskenny.bsky.social · 21/05/2026
If you do work in R and use fuzzy record linkage methods, I'd appreciate your feedback. It comes with 8 vignettes, notably: Getting started: christophertkenny.com/irelink/arti... Translating from splink: christophertkenny.com/irelink/arti...
christophertkenny.com
Getting Started
140
Chris Kenny, PhD @chriskenny.bsky.social · 21/05/2026
Once the API was settled, the bot translated all of splink's tests for full validation into the new syntax. Then, the bot implemented the actual features. After weeks of fixes and reviews, I finally made it public. It is extremely fast! 1 million record to 1 million record fuzzy join takes ~8s!
100
Chris Kenny, PhD @chriskenny.bsky.social · 21/05/2026
This is part of a larger project involving agentic AI in statistical software. If you're interested, I kept a full record of the prompts and 50+ agent summaries in the `inst/` folder. The main approach was to develop an API that I liked for the package, with examples from ggplot, dplyr, gt, etc
100
Chris Kenny, PhD @chriskenny.bsky.social · 21/05/2026
If you do record linkage in #rstats, I'd love your feedback on irelink: Fast Probabilistic Record Linkage. It is a port of Python's splink package, rewritten with a clean, pipeable R interface. All of the magic happens in a database backend (default is DuckDB) so it's incredibly fast.
Find duplicate records within a single dataset. The bundled fake_20 dataset provides a small example for experimentation. irelink pushes data into a SQL database for efficient pair generation, so you need a DBI connection. Here we use an in-memory DuckDB instance.An il_spec describes the linkage model: which fields to compare, how to compare them, and which blocking rules to apply. Blocking rules restrict which record pairs are generated. Only pairs that share a surname or first name are scored, keeping computation manageable. il_estimate_u() estimates parameters for non-matching pairs via random sampling, and il_estimate_em() refines the match-weight parameters using Expectation-Maximization.
spec <- il_spec() |>
  il_compare(first_name, cl_jaro_winkler(0.9, 0.7)) |>
  il_compare(surname, cl_jaro_winkler(0.9, 0.7)) |>
  il_compare(dob, cl_exact()) |>
  il_block_on(surname) |>
  il_block_on(first_name)

model <- il_model(df, spec = spec, con = con)
model <- il_estimate_u(model)
model <- il_estimate_em(model, block_on(surname))
predict() scores all candidate pairs and returns those above the match-probability threshold. The returned match_weight is the evidence-only log2 Bayes factor; total_match_weight adds the prior odds used to compute match_probability. il_cluster() groups the matched pairs into deduplicated entities.
2174
Reposted by Chris Kenny, PhD
Cory McCartan @corymccartan.com · 19/05/2026
This is also not quite true. Empirically, states with independent commissions or nonpartisan drawers produce maps that are at or near the median simulation on partisan + racial demographics. Because of that, it's reasonable to treat the median as a forecast for a drawer following only certain rules
011
Chris Kenny, PhD @chriskenny.bsky.social · 19/05/2026
To throw in an example: Jake Brown, Tyler Simko, and I are applying the same methodological tools to study the MAUP problem and quantify how much aggregation choices impact measures like segregation
220
Reposted by Chris Kenny, PhD
Cory McCartan @corymccartan.com · 19/05/2026
This is not accurate! Just like polling, we can randomly sample maps in a representative way, and understand typical maps without looking at every one. We have mathematical proofs that these algorithms produce representative samples if run long enough.
161
Reposted by Chris Kenny, PhD
Cory McCartan @corymccartan.com · 19/05/2026
Unfortunately some inaccurate info in this thread. The point of the NYT sims was to see what typical maps drawn without the VRA would look like. But the maps Stephen draws incorporate VRA compliance. Also wrong info on the algorithms which I will say more about separately
221
Chris Kenny, PhD @chriskenny.bsky.social · 18/05/2026
I use project-specific skills for everything. It might not be the most efficient choice, but some of the skills I use compete (eg, package dev practices vs data analysis)
110
Chris Kenny, PhD @chriskenny.bsky.social · 17/05/2026
One of the joys of open source: Seeing the NYT use your #rstats packages www.nytimes.com/2026/05/17/u...
nytimes.com
Why Neutral Maps Could Empower Black Voters as Much as the Voting Rights Act
0332
Chris Kenny, PhD @chriskenny.bsky.social · 16/05/2026
Happy to. Send me a message or an email and I’m happy to work out a time
000
Chris Kenny, PhD @chriskenny.bsky.social · 15/05/2026
Memorable letters in “workflow”. I was looking for a short name since this is the type of package I imagine using from the console as wf::fun() rather than calling library(wf) for scripts most of the time.
110
Reposted by Chris Kenny, PhD
Mickaël CANOUIL, Ph.D. @mickael.canouil.fr · 15/05/2026
Quarto Typst Render 0.13 ships 'typst_define()' for R and Python. Push polars DataFrames, lists, scalars from a knitr or jupyter session into every '{typst}' cell, accessible as '#typst_define.<name>'. github.com/mcanouil/quarto-typst-render #Quarto #Typst #rstats #python #dataviz
061
Chris Kenny, PhD @chriskenny.bsky.social · 15/05/2026
I’m using wf: christophertkenny.com/wf/ (Admittedly, I’m probably the only one using it because I wrote it)
christophertkenny.com
Artificial Intelligence Workflow Tools
Manage skills for large language model coding agents. Supports installing skills from GitHub or local directories, tracking versions in a lock file, and keeping installations current. Installations ca...
341
Chris Kenny, PhD @chriskenny.bsky.social · 14/05/2026
Thanks!
000
Chris Kenny, PhD @chriskenny.bsky.social · 14/05/2026
Introducing dais: a Rust-based PDF presenter tool. Present PDF slides (eg, Beamer) in a PowerPoint-like interface. Full drawing control, navigation tools, live text boxes, and more: christophertkenny.com/posts/2026-0...
christophertkenny.com
dais: A better way to present PDF slides – Christopher T. Kenny
Introducing a new Rust-powered PDF presenter CLI with features including slide groups, drawing, blackouts, a whiteboard, zooming, and live text boxes with math support.
191
Chris Kenny, PhD @chriskenny.bsky.social · 13/05/2026
Now with a short blog post on the Princeton DDSS engineering website: princeton-ddss.github.io/notes/cran-g... This increase is driven by solo devs with prior #rstats packages on CRAN!
princeton-ddss.github.io
090
Chris Kenny, PhD @chriskenny.bsky.social · 08/05/2026
Submission to CRAN #rstats through May 7th. Looks like the LLMs are gaining speed
051
Chris Kenny, PhD @chriskenny.bsky.social · 29/04/2026
Given the Callais decision, resharing our (w @corymccartan.com) "Individual and Differential Harm in Redistricting" piece which tries to tackle estimating group harm, including separating partisan and racial effects of maps... osf.io/preprints/so... (conditionally accepted at Nature Human Behavior)
osf.io
OSF
041
Chris Kenny, PhD @chriskenny.bsky.social · 21/04/2026
The Positron release from last week is *substantially* faster than the March version on startup. Highly recommend updating!
260
Chris Kenny, PhD @chriskenny.bsky.social · 18/04/2026
Very nice! A bit like the inverse of this baptiste.codeberg.page/gridcetz/art...
baptiste.codeberg.page
ggplot Examples: CeTZ vs svglite
120