Robin Linacre

@robinlinacre.bsky.social

Lead developer of Splink. Data scientist at Ministry of Justice. Trustee, GiveDirectly UK. Pledgee, http://givingwhatwecan.org. All views my own.

We've released a new dev (beta) version of Splink 5 today which you can install using pip install splink==5.0.0.dev4. This is very close to the final code we expect to release in Splink 5 (expected in September), so please do give it a try and let us know if you find any issues.

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.

BildFind 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.

As capabilities have improved, I am increasingly sceptical of the description of LLMs as a 'calculator for words', and the idea that they excel at semantics, because their rate of improvement in these areas seems extremely modest in comparison to things like coding and tool use

Developing a cursive writing typescript library capable of powering educational apps. It's free an open source and has: - Geometry for each letter - Algorithm for joining letters - Algorithm for animating cursive writing - Algorithm for tracing/path finding Link in 🧵

Reading The Baroque Cycle - King of the Vagabonds (2003). This quote hit me: “What does the Doctor want?” “To translate all human knowledge into a new philosophical language, consisting of numbers. To write it down in a vast Encyclopedia that will be a sort of machine...

We are pleased to release `uk_address_matcher`, a free Python package for address matching and geocoding, developed by Tom Hepworth and me. The package has several aims: simplicity, speed and accuracy.

UK Address Matcher logo

For anyone with FOMO wondering whether to pay for Opus 4.5/Claude Code, my experience is that OpenAI Codex is very similar in performance. i.e. both are excellent, but Claude Code is not a magic unlock