Software · Founding article · Published 2026-11-09 · Open access, CC-BY 4.0

FlexRL: an R package for Flexible Record Linkage and Linked Data Quality Assessment

Kayané Robach1 · Mark A. van de Wiel2 · Michel H. Hof3

1 Amsterdam UMC, Amsterdam Public Health · orcid 0000-0002-5725-623X · 2 Amsterdam UMC, Amsterdam Public Health · 3 Amsterdam UMC, Amsterdam Public Health

Record LinkageInferenceStochastic EMFalse Discovery ProportionSampling SelectionLinked Data
doi: https://doi.org/10.68365/jrepstat.2026.11 Vol. 1 (2026) · Art. 11 Version 1 how to cite ↓ html pdf (typeset)
✓ Reproduced

Reproducibility record

verified 2026-10-28
Result
Reported results reproduced. Reproduced on macOS arm64, except the BRL and multilink cells of Tables 2 and 4 (other packages' samplers) and fastLink in Table 6 (20 GB).
✓ measured
Entry point
cd code/FlexRL-e4d511daaf35cb24d88480de49e4cf4e6ea87032/vignettes/article && quarto render Article-FlexRL.qmd
✓ executed
Environment
R 4.5.2 on macOS arm64 (native), Tables 6 and 7 R 4.6.1 on linux/aarch64, packages as in Table 1
✓ measured
Determinism
Seeded.
declared
Archive
flexrl-an-r-package-for-flexible-record-linkage-and-linked-data-quality-assessment-v1-repro.zip · reviewed bundle SHA-256 7ced60afc2cf7c0f08b53a1ec27c83753258ac1fad6e541e34fc169bade51cb3 · https://doi.org/10.5281/zenodo.24092325
✓ computed
Data
Open.
declared, route checked

Reproducibility package (.zip, 17.3 MB) · Zenodo doi:10.5281/zenodo.24092325 · SHA-256 1e4c9332705c9dcfce588fd446fc57aa218aa98fd8d3d71868f44be1213aa9c7

$cd code/FlexRL-e4d511daaf35cb24d88480de49e4cf4e6ea87032/vignettes/article && quarto render Article-FlexRL.qmd
Open review

Peer review record

3 rounds · 3 reviewers · signed Full reviewsHide reviews
2026-10-23Major revision2026-10-2628 answers2026-10-26Minor revision2026-10-268 answers2026-10-28Accepted

The decision letters, the reports the authors read, their answers and the editor's signed decisions, as written. The reports come from the journal's review engine. The authors could have kept this record private until they confirmed the proof.

Round 1Major revision3 reviewers · response
Major revisionConfirmed and signed by Matthias Templ2026-10-23 · orcid 0000-0002-8638-5276
Decision letter2026-10-23FlexRL packages a hierarchical two-source record linkage model (StEM) together with method-agnostic diagnostics, two FDP estimators and several sample-divergence measures, so a practitioner linking sources without a unique identifier can judge how the linkage decision rule affects downstream inference. It matters to statistical agencies and to researchers working with administrative, registry and survey data. We would be glad to see the revised version.

Thank you for your submission to JRepStat. We are inviting a major revision. The reviewers’ points follow, grouped by weight.

FlexRL packages a hierarchical two-source record linkage model (StEM) together with method-agnostic diagnostics, two FDP estimators and several sample-divergence measures, so a practitioner linking sources without a unique identifier can judge how the linkage decision rule affects downstream inference. It matters to statistical agencies and to researchers working with administrative, registry and survey data. We would be glad to see the revised version.

How to read this letter. The decision rests on the items marked required. If a required item seems wrong to you, or cannot be done within this paper, decline it on the revision page and give the reason. A reasoned decline is a legitimate answer, and the editor weighs it. Reviewers can be mistaken. Items marked recommended or optional are advice from the reviewers. Adopt them, decline them with a sentence, or leave them for later work. None of that counts against the paper. The reviewer reports below carry the same marks. The editor who signs this decision may weigh an item differently in the accompanying message, and that message prevails.

required (the decision rests on these):

  • [consistency-check] Table 7 does not reconcile internally. Taking BRL, sensitivity from the table is TP/(TP+FN) = 80/(80+438) = 0.15, but the table reports 0.26; its FDP from FP/(TP+FP) = 21.90/(80+21.90) = 0.21, reported as 0.23. The same mismatch holds for multilink (sensitivity 137/517 = 0.27 vs 0.36; FDP 270.70/407.70 = 0.66 vs 0.58), fastLink, fedmatch and FlexRL. Please reconcile the reported rates with the counts, or state the aggregation rule in the caption. Tables 2, 3 and 6 reproduce their rates exactly from their counts, so Table 7 is the outlier.
  • [consistency-check] Table 6 and Table 7 appear to be on different scales. Table 6 (no blocking) implies 10568 true links (TP+FN, consistent across fastLink, fedmatch, FlexRL). Table 7 (with blocking) shows TP+FN of about 517 to 518 per method, roughly one twentieth of 10568, which matches a per-region average over the 20 regional blocks. Section 5 states region is stable and error free with agreement 1.00, so blocking on region should not drop true links from the national total. Please state whether Table 7 reports per-region averages or totals, since the two tables are presented as a direct comparison. A one-sentence caption note resolves it.
  • [simulation-design] No replications or Monte Carlo error are reported for the headline simulation tables. Table 2 and Table 4 appear to come from a single simulated pair of files (350/400 records). Several reported gaps are within plausible sampling noise of one run, for example FlexRL dynamics sensitivity 0.59 against fedmatch 0.60, and FlexRL FDP 0.16 against multilink 0.16. The FDP estimators are averaged over n_repeats, but the TP/FP/sensitivity/FDP comparison is not. Repeat the generate-and-link cycle across replications and report the spread of sensitivity and FDP, or qualify the dynamics claim to a single illustrative run and drop any ranking of methods that are within one run of each other.
  • [ethics-and-integrity] Add a competing-interests statement. The authors are the developers of FlexRL (Robach and Hof 2026) and the paper benchmarks that package against competing methods in Tables 2, 3, 6 and 7, so a disclosure of this role is a standard integrity obligation that is currently absent.
  • [Reviewer 1] In the SHIW application the score-based FDP estimate at the chosen threshold is about 0.03 while the true FDP is 0.16. State this gap explicitly where the print output appears, and note the synthetic estimate (0.12) was closer, so a practitioner is warned which estimator held up here.
  • [Reviewer 3] Document how random draws are produced inside the OpenMP-parallelised Rcpp samplers and whether set.seed() reproduces a run bit-for-bit when threads > 1. If it does not, qualify the reproducibility claim and state the thread count used for the reported tables.
  • [Reviewer 3] For each benchmark table (2, 3, 6, 7), record the seed(s), R version, OS and hardware, and the version of every compared package, or state these in the text. The comparative timing, memory and performance numbers depend on all of them.

recommended:

  • [simulation-design] The simulation DGP is the package’s own simulate_data() function, which synthesises records from the same hierarchical generative model FlexRL fits (registration errors, missingness, a dynamic PIV governed by a hazard). This is a DGP aligned with the method under test, and the comparison-vector competitors are evaluated on data generated under assumptions they do not share. The headline claim that “modelling PIVs dynamics improves record linkage” rests on exactly this self-generated setting (Table 2: FlexRL dynamics sensitivity 0.59 vs no-dynamics 0.49). Report the same comparison on data generated outside the FlexRL model, or state in Section 2.4 that the simulation is a demonstration of the model’s own DGP and that the dynamics benefit is quantified on real linkage only.
  • [simulation-design] The simulation factor grid is a single configuration: one sample size, one overlap (300 of 350/400), 2% mistakes, 0.5% missingness, four PIVs, one dynamic PIV. The conditions that would stress the method and expose its failure modes, lower overlap, higher error rates, fewer discriminative PIVs, more dynamic PIVs, are not varied in the simulation. The real-data sections add scale and a national/regional contrast, but not a controlled sweep of these factors. Vary overlap and error rate across a small grid and report how the dynamics advantage and the FDP estimates hold up.
  • [methods-soundness] The threshold ξ=0.82 is chosen in Section 4.4 from the divergence “elbow”, and in Section 4.1/Figure 5 that choice is then shown to give a regression estimate close to the known truth. In the SHIW the truth is available, so this is a validation of the elbow heuristic, but the heuristic itself is the only guidance a practitioner has when the truth is unknown. State explicitly that the elbow rule is a heuristic and that its reliability away from benchmark data where true links exist has not been characterised.
  • [methods-soundness] The cross-method tables (Table 2, Table 3, Table 6, Table 7) compare methods at the single default rule ξ=0.5. Methods with different score scales and operating points are not necessarily comparable at one fixed cutoff, as the wide spread in sensitivity and FDP shows (for example reclin2 at sensitivity 0.80 with FDP 1.00 versus FlexRL at 0.33 and 0.26 in Table 3). Note in the table captions or surrounding text that these are single-threshold snapshots and that the FDP-versus-threshold curves give the fuller comparison.
  • [methods-soundness] The Discussion describes FlexRL as a “reliable solution to record linkage”. On the SHIW the method reaches sensitivity near 0.33 to 0.39 with FDP near 0.26 to 0.57, which reflects the difficulty of the task rather than a fault, but the wording overstates what the numbers show. Soften to describe the demonstrated behaviour, for example that the method controls FDP at a stated threshold while recovering a known fraction of links.
  • [novelty-and-prior-art] The second stated contribution is a method-agnostic toolkit of linked-data quality diagnostics. Edwards et al. 2026 (“Assessing Linkage Quality: Metrics, Insights, and a Reusable Python Toolkit”, IJPDS) addresses the same problem of quality metrics for linked data in a reusable toolkit and is not cited. This is a live, actively-published line (the manuscript already cites Laidler 2025, Lam 2024, Harron 2017/2020 in the same venue). Please position the diagnostics contribution against it. The published metrics are the point here; comparison of the software itself sits with another assessor.
  • [software-quality] The DESCRIPTION declares BRL, arf, diyar, fastLink, fedmatch, mice, multilink, reclin2 and synthpop as hard Imports. These are needed only by the optional link_with_<pkg>() wrappers and the synthetic-data FDP estimator, so loading FlexRL for its own StEM linkage pulls in nine extra packages, and a single install failure among them blocks FlexRL. Moving the wrapper and synthesis dependencies to Suggests with requireNamespace() guards at the call sites would lighten the install and match how wrappers are used.
  • [software-quality] The log-likelihood sanity check in simulateD() compares round(Dsample$loglik, 3) != round(ll_check, 3) and calls stop() on mismatch. Equality after rounding to three decimals can false-trigger on large-magnitude log-likelihoods where a benign floating-point difference exceeds 0.0005, and can mask a real discrepancy below that scale. A relative tolerance (for example isTRUE(all.equal(..., tolerance = 1e-6))) would be more robust.
  • [statistical-rigor] The FDP estimates in the print output and tables are given as point values (for example 0.03 at threshold 0.82 against a true FDP of 0.16). Since the synthetic-data estimator is already averaged over n_repeats draws, reporting the dispersion across those repeats would show how much of the gap between estimated and true FDP is sampling variability of the estimator.
  • [visualisation] Figure 5 distinguishes four regression fits by colour alone: the text names “estimate in dashed orange”, “estimate in yellow” and “truth represented in red”. Orange and red read as close hues under the common red-green deficiencies, and yellow lines carry low contrast on a white ground. Redraw Figure 5 with a colourblind-safe palette and pair each line with a distinct line style or a direct label, so the three thresholds (0.55, 0.82, 0.99) and the truth can be told apart without relying on colour.
  • [writing-quality] One sentence in Section 3.5 reads “so the sweep is linear the number of candidate pairs”, which is missing a word (“linear in the number”). The table column heading “FlexRL (no dynamic)” in Tables 2 and 4 would read better as “(no dynamics)” to match the “dynamics” wording used elsewhere.
  • [ethics-and-integrity] State the provenance and access terms of the SHIW data in one sentence. The 2012 and 2014 waves are anonymised microdata released by the Bank of Italy for research, which places this work within secondary analysis of public data. Recording that status makes clear why separate ethics approval and participant consent are not required here.
  • [Reviewer 1] Qualify the word “reliable” in the Discussion given the reported FDPs (0.57 on the full data, 0.29 with blocking); say that the scalability claim concerns compute and memory, not linkage accuracy.
  • [Reviewer 1] Report the regression specifics: which SHIW variable encodes expected age of retirement, the linked sample size used (273 at the chosen threshold), the sensitivity there (0.26), and that the reference line is the estimate computed on true links.
  • [Reviewer 1] State how the PIV independence violation (Occupation and Sex associated, Cramér’s V 0.32 and 0.35) may affect calibration of the FDP estimators, beyond issuing a warning.
  • [Reviewer 1] Give practitioners guidance on which FDP estimator to trust when the two disagree, since the SHIW example shows them diverging from each other and from the truth.
  • [Reviewer 2] Clarify the scaling factor N_B/N_synth in Equation 11 and state when the synthetic estimator is expected to be biased. The simulation returns 0.28 against a true 0.16 for the dynamics model, which the text does not address.
  • [Reviewer 2] Note that the linked-sample divergence measures are heuristic indicators of sampling bias, not estimates of the bias in β, and that the “elbow” threshold choice carries no formal guarantee.
  • [Reviewer 3] Provide a single master script that maps each table and figure to the command that regenerates it, with a captured session-info / environment record.

optional:

  • [software-quality] The .onAttach startup message (“please cite us … feel free to complain as well”) and the music_on argument that opens a browser tune are informal side effects. They are harmless and default off, but a plainer startup message reads better in a statistical-agency setting and avoids friction with package-check gates that flag chatty attach messages.
  • [Reviewer 2] A broader simulation varying overlap, PIV discriminative power and error rates would map out when each FDP estimator is reliable.

We will correct these in production, and you confirm them in the proof:

  • [consistency-check] The reference “Robach, Kayané, Mark A van de Wiel, Michel H Hof, and Stéphanie L van der Pas. 2026. Causal Record Linkage” ends with a truncated URL (“h.”), and the Lam et al. 2024 entry carries a concatenated DOI (“…238910.23889/ijpds.v7i3.1794”). Confirm the correct links at proof.

Reviews

Report Reviewer 1recommends minorThe problem this package addresses is real and the framing is right for practice. Agencies and researchers routinely link survey, registry and administrative sources without a unique identifier, and the downstream analyst then works with a sample that carries two unobserved errors at once. A tool that returns FDP estimates and sample-divergence measures as functions of the decision rule, and that works on the output of any linkage method, is genuinely useful. The SHIW example is a good choice because the true links can be reconstructed, so the diagnostics can be shown against a known answer. The package is positioned clearly against the existing R landscape in Table 1, and the distinction between the comparison-vector paradigm and the hierarchical model is drawn fairly.

Written by the journal's review engine in the role of the application reviewer, and read by the editor before the decision. How the engine works is on the peer review page.

The problem this package addresses is real and the framing is right for practice. Agencies and researchers routinely link survey, registry and administrative sources without a unique identifier, and the downstream analyst then works with a sample that carries two unobserved errors at once. A tool that returns FDP estimates and sample-divergence measures as functions of the decision rule, and that works on the output of any linkage method, is genuinely useful. The SHIW example is a good choice because the true links can be reconstructed, so the diagnostics can be shown against a known answer. The package is positioned clearly against the existing R landscape in Table 1, and the distinction between the comparison-vector paradigm and the hierarchical model is drawn fairly.

My main application concern is the honesty of the headline diagnostic in the worked example. At the chosen threshold of 0.82 the print output reports a score-based FDP of about 0.03, while the true FDP at that threshold is 0.16. A practitioner reading the score estimate alone would conclude the linked sample is almost clean when roughly one in six linked pairs is wrong. The paper already states that the score estimator is only as good as the linkage model and that calibration suffers under missing values, low overlap and weak PIVs, so the groundwork is there. What is missing is the explicit connection at the point where the numbers appear. The synthetic estimate (0.12) came closer to 0.16, which is the more reassuring result for your method, and saying so would help rather than hurt the package. Without that sentence the example reads as if the tool worked when its primary estimator underestimated the error it exists to flag.

A second application point concerns what the chosen threshold costs. At 0.82 the sensitivity is 0.26, so the regression runs on a heavily selected quarter of the recoverable links. This is exactly the sampling-bias direction the Section 4.3 diagnostics are meant to surface, and the elbow heuristic lands the user there by design. The reader would benefit from seeing the linked sample size (273), the sensitivity, and a line on how representative that remaining sample is, stated alongside the regression figure. The retirement-age regression itself needs a little more detail: name the SHIW variable, and state that the reference line is the estimate on true links, so the comparison in Figure 5 is unambiguous.

On the broader claims, “reliable solution” in the Discussion sits awkwardly next to the FDPs of 0.57 on the full data and 0.29 with blocking. The scalability demonstration is convincing as a statement about memory and running time on a standard machine, and that is a real strength. Separating the compute claim from an accuracy claim would make the Discussion match the tables. Finally, the independence assumption is violated in the very example used throughout (Occupation and Sex are associated, and working status and branch were merged for the same reason). The warning mechanism is good, but a sentence on what that dependence does to the calibration of the FDP estimators would set expectations for users who will meet the same situation. These are matters of qualifying claims and connecting numbers already in the paper, not of new work.

Numbered suggestions to the authors:

  1. required Where the print output at threshold 0.82 is shown, state that the score-based FDP estimate (about 0.03) is below the true FDP (0.16) and that the synthetic estimate (0.12) was closer, so readers know which estimator held up in this application.
  2. [editor_fix] Complete the reference “Robach et al. 2026. Causal Record Linkage. h.”.
  3. recommended In the Discussion, qualify “reliable” and separate the compute-and-memory claim from linkage accuracy, given the reported FDPs of 0.57 (full data) and 0.29 (blocked).
  4. recommended Report the regression specifics: the SHIW variable for expected age of retirement, the linked sample size (273) and sensitivity (0.26) at the chosen threshold, and that the reference line is computed on true links; add one line on the representativeness of the retained sample.
  5. recommended State how the PIV independence violation (Occupation and Sex, Cramér’s V 0.32 and 0.35) may affect the calibration of the FDP estimators, beyond the warning.
  6. recommended Add guidance on which FDP estimator a user should trust when the two disagree, since the SHIW example shows divergence between them and from the truth.
Report Reviewer 2recommends minorThis is a software paper built on methodology that is already published (the linkage model in Robach, van der Pas et al. 2025, the FDP estimators in Robach, Hof et al. 2025). I read it as a methodology reviewer, so my question is whether the statistics shown here are correct and presented so that a practitioner uses the tools as intended. The modelling is sound and the package fills a real gap: Paradigm 2 (hierarchical generative modelling) for linkage between two sources under a one-to-one constraint, with time-varying PIVs, was not previously available in R. The diagnostic layer that turns a linkage threshold into FDP and sampling-bias summaries is a genuine contribution for applied work. The estimation description in Section 3.2 is clear, the factorisation in Equation 3 and the StEM scheme in Algorithm 1 are coherent, and the inference decomposition in Equations 6 to 9 gives a usable account of the two biases.

Written by the journal's review engine in the role of the methodology reviewer, and read by the editor before the decision. How the engine works is on the peer review page.

This is a software paper built on methodology that is already published (the linkage model in Robach, van der Pas et al. 2025, the FDP estimators in Robach, Hof et al. 2025). I read it as a methodology reviewer, so my question is whether the statistics shown here are correct and presented so that a practitioner uses the tools as intended. The modelling is sound and the package fills a real gap: Paradigm 2 (hierarchical generative modelling) for linkage between two sources under a one-to-one constraint, with time-varying PIVs, was not previously available in R. The diagnostic layer that turns a linkage threshold into FDP and sampling-bias summaries is a genuine contribution for applied work. The estimation description in Section 3.2 is clear, the factorisation in Equation 3 and the StEM scheme in Algorithm 1 are coherent, and the inference decomposition in Equations 6 to 9 gives a usable account of the two biases.

My main concern is calibration of the headline tool in the paper’s own illustration. In Figure 4 the true FDP at the selected threshold ξ=0.82 is 0.16, the sensitivity is 0.26, and the score-based estimate reads 0.03. The score-based estimator therefore understates the true FDP by about a factor of five in the example used to sell it. The text says in passing that this estimator is “only as good as the linkage model”, but it does not connect that caveat to the number on the page. A reader who follows the recommended workflow (pick the elbow, check the estimated FDP is “reasonable”) would see 0.03 and conclude the linked data are nearly clean when roughly one linked pair in six is spurious. Please state the discrepancy where it occurs and explain it: posterior scores that are overconfident drive the estimate down, and this is the motivation for the synthetic estimator, which gives 0.12 at the same threshold and sits closer to the truth. This is a short textual fix and the package is better for being honest about where its cheaper estimator fails.

The estimators are reported as point values with no spread. The procedure averages over n_repeats synthetic draws and over posterior draws, so the ingredients for an interval are already computed. For a tool whose purpose is to pick a threshold from an estimated FDP curve, the width of that estimate is part of the answer, and I would like to see it reported. Relatedly, the scaling in Equation 11 (multiplying the synthetic false-positive count by N_B/N_synth) assumes synthetic records are falsely linked at the same rate as real non-matching records. The simulation in Table 4 shows the synthetic estimate at 0.28 against a true 0.16 for the dynamics model, while the no-dynamics model gives 0.17 against 0.16. That pattern suggests the synthetic generator, which does not reproduce temporal change, mischaracterises the false-positive distribution when dynamics are modelled. A sentence stating the scaling assumption and the conditions under which the estimator is biased would let users read Table 4 correctly.

Two smaller methodological points. The divergence measures (SMD, support IoU, MMD, agreement rates) are descriptive indicators of how the linked sample differs from its source. They are not estimates of the bias in β, and the “elbow” rule for choosing the threshold is a visual heuristic with no formal guarantee. Both are reasonable for a practical tool, and both should be labelled as such so the user does not over-read a flat MMD curve. Finally, in the SHIW analysis Sex and Occupation stay in the model despite the association the package itself flags (Cramér’s V around 0.32 to 0.35), which violates the conditional-independence assumption that the model and the score-based FDP both rest on. A note on the likely direction of its effect would close the loop between the warning the software prints and the analysis the paper runs.

I could not see the vignettes or the reproducibility artifacts referenced in the text, so I have raised no ask for content that may sit inside them, and the reference issues I note (the truncated “h.” URL, the concatenated DOI, the JASP version mismatch) are for the production list.

Numbered suggestions to the authors:

  1. required Where Figure 4 appears, state that the score-based FDP estimate at ξ=0.82 is 0.03 while the true FDP is 0.16, and qualify the calibration claim: the score-based estimator understates FDP when the posterior scores are overconfident, which is the reason the synthetic estimator (0.12 here) is provided.
  2. [editor_fix] Complete the truncated reference “Robach et al. 2026, Causal Record Linkage” (URL reads “h.”), fix the concatenated DOI in Lam et al. 2024, and reconcile the JASP version (text says 1.0, the reference says 0.98.8).
  3. recommended Report the spread of the FDP estimates and the divergence measures across the n_repeats synthetic draws and the posterior draws, so the threshold-dependent FDP comes with a measure of precision.
  4. recommended Clarify the N_B/N_synth scaling in Equation 11 and state when the synthetic estimator is expected to be biased, referencing the simulation where it returned 0.28 against a true 0.16 for the dynamics model.
  5. recommended Label the linked-sample divergence measures as heuristic indicators of sampling bias, not estimates of the bias in β, and note that the elbow threshold choice has no formal guarantee.
  6. recommended In the SHIW analysis, note that Sex and Occupation remain associated (Cramér’s V around 0.32 to 0.35) against the conditional-independence assumption, and discuss the likely effect on linkage and on the FDP estimates.
  7. optional A broader simulation varying overlap, PIV discriminative power and error rates would characterise when each FDP estimator is reliable.
Report Reviewer 3recommends minorThis is a software paper, so I read it for whether the package can be run, whether the implementation is sound, and whether the reported numbers are the code’s numbers. The engineering account is clear and the design choices are explained at the level a user needs. The workflow (prepare_data, naive_linkage, StEM, RL_diagnostics with print and plot S3 methods) is coherent, the Rcpp backend and the memory argument (linear in NA+NB and in candidate pairs, not in NA×NB) are stated precisely, and the function arguments are documented in the prose. Availability on CRAN, a GitHub repository with vignettes, and a JASP module is a strong distribution story. The diagnostics being agnostic to the linkage method, with wrappers for six other packages, is the kind of feature that makes a package useful beyond its own model.

Written by the journal's review engine in the role of the software reviewer, and read by the editor before the decision. How the engine works is on the peer review page.

This is a software paper, so I read it for whether the package can be run, whether the implementation is sound, and whether the reported numbers are the code’s numbers. The engineering account is clear and the design choices are explained at the level a user needs. The workflow (prepare_data, naive_linkage, StEM, RL_diagnostics with print and plot S3 methods) is coherent, the Rcpp backend and the memory argument (linear in NA+NB and in candidate pairs, not in NA×NB) are stated precisely, and the function arguments are documented in the prose. Availability on CRAN, a GitHub repository with vignettes, and a JASP module is a strong distribution story. The diagnostics being agnostic to the linkage method, with wrappers for six other packages, is the kind of feature that makes a package useful beyond its own model.

My main concern is reproducibility of the stochastic core under parallelism. The paper states that all random draws use R’s generator so that set.seed() makes a run reproducible, and separately that the samplers are parallelised over OpenMP threads with a default of four. R’s RNG is not thread-safe, and floating-point summation order across threads is not fixed, so a reader cannot tell from the text whether a run with threads > 1 is bit-reproducible, reproducible up to Monte Carlo noise, or reproducible only when forced to a single thread. This matters for a package whose output is a stochastic linkage matrix and whose headline tables report exact counts. Please state how the draws are handled across threads and what set.seed() actually guarantees, and give the thread count used for the paper’s tables.

The second concern is the provenance of the benchmark tables. Tables 2, 3, 6 and 7 compare FlexRL against six other packages on sensitivity, FDP, time and memory, and the scalability claim rests on them. Those numbers depend on the seed, the machine, the R version and the exact version of each compared package, and comparative timing in particular can shift substantially across package versions. The paper gives citation years but not installed versions, and gives no seed or hardware specification for the reported runs. Please record these, in the text or in a reproduction script, so a reader can regenerate the reported figures or at least understand why their numbers differ. I note the memory caveat (R garbage collector, external allocations underestimated) is already disclosed, which is the right thing to do.

One reference, “Robach et al. 2026. Causal Record Linkage. h.”, has a URL that extraction renders as a single “h.” and is clearly incomplete. I have flagged it for the production list rather than as author work.

I could not run anything, because I was handed the manuscript and intake facts only. If the vignettes already carry a reproduction path for the comparative tables, some of the above is satisfied and the ask reduces to pointing at it and recording the environment. I have written the asks so they collapse to that if the material exists.

Numbered suggestions to the authors:

  1. required State how random draws are generated inside the OpenMP-parallelised Rcpp samplers and whether set.seed() reproduces a run bit-for-bit with threads > 1. If reproducibility holds only at a single thread or only up to Monte Carlo noise, say so in Section 3.5 and give the thread count used for the reported tables.
  2. required For Tables 2, 3, 6 and 7, record the seed(s), R version, operating system and hardware, and the installed version of every compared package, either in the text or in a reproduction script, so the comparative performance, timing and memory numbers can be regenerated or placed in context.
  3. [editor_fix] Repair the truncated reference “Robach et al. 2026. Causal Record Linkage. h.” with its full citation and URL.
  4. recommended Add one master script that maps each table and figure to the command producing it, together with a captured session-info or environment record, so a reader can reproduce the article’s results end to end.

Revision

Authors' response2026-10-26 · 28 answersAuthors confirm each required point as done or give their reason for declining it. Further answers are voluntary, because the review compares every revision with the previous version and the next round's reports say what remains open.

Authors confirm each required point as done or give their reason for declining it. Further answers are voluntary, because the review compares every revision with the previous version and the next round's reports say what remains open.

To the editors and reviewers:

Please find hereby the revised version of our manuscript “FlexRL: an R package for Flexible Record Linkage and Linked Data Quality Assessment” which we resubmit for consideration for publication in the Journal of Reproducible Statistics. Please also find our answers to the comments of the review. We found these recommendations and points of discussion valuable, we incorporated them in the revised manuscript, with corresponding changes to the package code.

Please note that we have changed the random seeds since the first submission, having discovered that some of the compared packages call set.seed() internally. Thus, the results are slightly different from those previously reported, but we applied the same decision rules as before and revised our comments accordingly.

We hope that we have answered your concerns adequately and have improved the quality of the manuscript.

required Table 7 does not reconcile internally. Taking BRL, sensitivity from the table is TP/(TP+FN) = 80/(80+438) = 0.15, but the table reports 0.26; its FDP from FP/(TP+FP) = 21.90/(80+21.90) = 0.21, reported as 0.23. The same mismatch holds for multilink (sensitivity 137/517 = 0.27 vs 0.36; FDP 270.70/407.70 = 0.66 vs 0.58), fastLink, fedmatch and FlexRL. Please reconcile the reported rates with the counts, or state the aggregation rule in the caption. Tables 2, 3 and 6 reproduce their rates exactly from their counts, so Table 7 is the outlier.
Done The display of Table 7 was faulty. We now display the results on the same scale as Table 6 and reconciled the linkage performance over all regions.
required Table 6 and Table 7 appear to be on different scales. Table 6 (no blocking) implies 10568 true links (TP+FN, consistent across fastLink, fedmatch, FlexRL). Table 7 (with blocking) shows TP+FN of about 517 to 518 per method, roughly one twentieth of 10568, which matches a per-region average over the 20 regional blocks. Section 5 states region is stable and error free with agreement 1.00, so blocking on region should not drop true links from the national total. Please state whether Table 7 reports per-region averages or totals, since the two tables are presented as a direct comparison. A one-sentence caption note resolves it.
Done Following the previous comment, we now present Table 7 on the same scale as Table 6 since the comparison between those holds importance in the section “Scalability”. We now make it clear both tables report the national performance (with and without blocking).
required No replications or Monte Carlo error are reported for the headline simulation tables. Table 2 and Table 4 appear to come from a single simulated pair of files (350/400 records). Several reported gaps are within plausible sampling noise of one run, for example FlexRL dynamics sensitivity 0.59 against fedmatch 0.60, and FlexRL FDP 0.16 against multilink 0.16. The FDP estimators are averaged over n_repeats, but the TP/FP/sensitivity/FDP comparison is not. Repeat the generate-and-link cycle across replications and report the spread of sensitivity and FDP, or qualify the dynamics claim to a single illustrative run and drop any ranking of methods that are within one run of each other.
Done The simulation study presented in Table 2 and Tables 4 now report the mean and standard deviation over n_sim = 10 procedures, in each procedure the FDP estimation is based on n_repeats = 5 repetitions.
required Add a competing-interests statement. The authors are the developers of FlexRL (Robach and Hof 2026) and the paper benchmarks that package against competing methods in Tables 2, 3, 6 and 7, so a disclosure of this role is a standard integrity obligation that is currently absent.
Done We added such competing interests statement at the end.
required In the SHIW application the score-based FDP estimate at the chosen threshold is about 0.03 while the true FDP is 0.16. State this gap explicitly where the print output appears, and note the synthetic estimate (0.12) was closer, so a practitioner is warned which estimator held up here.
Done We added such comment in the “Diagnostics” section, as well as guidance on which estimator of the FDP to rely on in the “False Discovery proportion” section.
required Document how random draws are produced inside the OpenMP-parallelised Rcpp samplers and whether set.seed() reproduces a run bit-for-bit when threads > 1. If it does not, qualify the reproducibility claim and state the thread count used for the reported tables.
Done We documented the reproducibility with regard to the OpenMP parallelisation in section “Computational aspects”. Indeed set.seed() reproduces a run bit-for-bit regardless of the number of threads.
required For each benchmark table (2, 3, 6, 7), record the seed(s), R version, OS and hardware, and the version of every compared package, or state these in the text. The comparative timing, memory and performance numbers depend on all of them.
Done Throughout the article (the quarto document) we (re)set the seed to 1 to produce each table and figure. We do so because some of the packages we compare FlexRL with call set.seed() within their source code, disturbing the random number generation. At the end of the “Simulation study” section, we now give these details as well as information on the R version, OS and hardware. The versions of the compared packages are given in Table 1.
recommended The simulation DGP is the package's own simulate_data() function, which synthesises records from the same hierarchical generative model FlexRL fits (registration errors, missingness, a dynamic PIV governed by a hazard). This is a DGP aligned with the method under test, and the comparison-vector competitors are evaluated on data generated under assumptions they do not share. The headline claim that "modelling PIVs dynamics improves record linkage" rests on exactly this self-generated setting (Table 2: FlexRL dynamics sensitivity 0.59 vs no-dynamics 0.49). Report the same comparison on data generated outside the FlexRL model, or state in Section 2.4 that the simulation is a demonstration of the model's own DGP and that the dynamics benefit is quantified on real linkage only.
Done The simulation study presented in Table 2 and Table 4 demonstrate the use of the simulate_data() function of the package and the potential of the FlexRL package (record linkage, diagnostic tools). The DGP is classical in record linkage and indeed aligns with the model FlexRL fits, we have clarified this in the “Simulation study” section. All methods are compared on the same simulated data. Moreover, to make a fair comparison of FlexRL record linkage with and without accounting for PIV dynamics, we generate the temporal changes with a piecewise constant hazard and fit these dynamics with an exponential survival model. This shows the benefits of modelling PIV dynamics rather than treating them as registration errors (even under model misspecification). We made this clear in the “Simulation study” section.
recommended The simulation factor grid is a single configuration: one sample size, one overlap (300 of 350/400), 2% mistakes, 0.5% missingness, four PIVs, one dynamic PIV. The conditions that would stress the method and expose its failure modes, lower overlap, higher error rates, fewer discriminative PIVs, more dynamic PIVs, are not varied in the simulation. The real-data sections add scale and a national/regional contrast, but not a controlled sweep of these factors. Vary overlap and error rate across a small grid and report how the dynamics advantage and the FDP estimates hold up.
Declined It is not the scope of this software article to study the behaviour of the compared packages over plausible record linkage configurations. In the “False discovery proportion” section, we refer the reader to the literature for a more detailed discussion on the the strengths and limitations of different record linkage paradigms across a range of configuration (including comparisons of FlexRL and BRL packages).
recommended The threshold ξ=0.82 is chosen in Section 4.4 from the divergence "elbow", and in Section 4.1/Figure 5 that choice is then shown to give a regression estimate close to the known truth. In the SHIW the truth is available, so this is a validation of the elbow heuristic, but the heuristic itself is the only guidance a practitioner has when the truth is unknown. State explicitly that the elbow rule is a heuristic and that its reliability away from benchmark data where true links exist has not been characterised.
Done In the “Diagnostics” section we made it clear that the “elbow” of divergence measures is only a heuristic to choose the threshold and carries no formal guarantee.
recommended The cross-method tables (Table 2, Table 3, Table 6, Table 7) compare methods at the single default rule ξ=0.5. Methods with different score scales and operating points are not necessarily comparable at one fixed cutoff, as the wide spread in sensitivity and FDP shows (for example reclin2 at sensitivity 0.80 with FDP 1.00 versus FlexRL at 0.33 and 0.26 in Table 3). Note in the table captions or surrounding text that these are single-threshold snapshots and that the FDP-versus-threshold curves give the fuller comparison.
Done In the captions of the tables comparing record linkage methods we clarified the use of a single threshold. In the section “Linkage scores and decision rule” we mention that the “FDP versus linkage decision rule” curves provide a more comprehensive assessment of record linkage performance.
recommended The Discussion describes FlexRL as a "reliable solution to record linkage". On the SHIW the method reaches sensitivity near 0.33 to 0.39 with FDP near 0.26 to 0.57, which reflects the difficulty of the task rather than a fault, but the wording overstates what the numbers show. Soften to describe the demonstrated behaviour, for example that the method controls FDP at a stated threshold while recovering a known fraction of links.
Done We softened the “Discussion” with regard to the reliability of FlexRL record linkage and clarified the demonstrated behaviour: scalable in terms of memory and running time, flexible in terms of accommodating diverse scenarios, with performance depending on the difficulty of the task and the chosen decision rule, controlling the FDP and recovering a fraction of the true links (sensitivity) accordingly.
recommended The second stated contribution is a method-agnostic toolkit of linked-data quality diagnostics. Edwards et al. 2026 ("Assessing Linkage Quality: Metrics, Insights, and a Reusable Python Toolkit", IJPDS) addresses the same problem of quality metrics for linked data in a reusable toolkit and is not cited. This is a live, actively-published line (the manuscript already cites Laidler 2025, Lam 2024, Harron 2017/2020 in the same venue). Please position the diagnostics contribution against it. The published metrics are the point here; comparison of the software itself sits with another assessor.
Declined The details of the article "Assessing Linkage Quality: Metrics, Insights, and a Reusable Python Toolkit" (Edwards et al., IJPDS, 2026) do not yet seem available. From the main author website, this article appears to be a conference contribution. At this point, we therefore cannot position the diagnostics contribution of FlexRL against those provided by this toolkit.
recommended The DESCRIPTION declares BRL, arf, diyar, fastLink, fedmatch, mice, multilink, reclin2 and synthpop as hard `Imports`. These are needed only by the optional `link_with_<pkg>()` wrappers and the synthetic-data FDP estimator, so loading FlexRL for its own StEM linkage pulls in nine extra packages, and a single install failure among them blocks FlexRL. Moving the wrapper and synthesis dependencies to `Suggests` with `requireNamespace()` guards at the call sites would lighten the install and match how wrappers are used.
Done We modified the package accordingly to lighten its installation.
recommended The log-likelihood sanity check in `simulateD()` compares `round(Dsample$loglik, 3) != round(ll_check, 3)` and calls `stop()` on mismatch. Equality after rounding to three decimals can false-trigger on large-magnitude log-likelihoods where a benign floating-point difference exceeds 0.0005, and can mask a real discrepancy below that scale. A relative tolerance (for example `isTRUE(all.equal(..., tolerance = 1e-6))`) would be more robust.
Done We modified the package accordingly for a more robust log likelihood sanity check.
recommended The FDP estimates in the print output and tables are given as point values (for example 0.03 at threshold 0.82 against a true FDP of 0.16). Since the synthetic-data estimator is already averaged over n_repeats draws, reporting the dispersion across those repeats would show how much of the gap between estimated and true FDP is sampling variability of the estimator.
Done We modified the package to provide in the print output the mean and standard deviation of the FDP estimates obtained over n_repeats procedures. To lighten the “FDP versus linkage decision rule” figure we do not show the sample dispersion but the user can now access it in the output of the RL_diagnostics() function.
recommended Figure 5 distinguishes four regression fits by colour alone: the text names "estimate in dashed orange", "estimate in yellow" and "truth represented in red". Orange and red read as close hues under the common red-green deficiencies, and yellow lines carry low contrast on a white ground. Redraw Figure 5 with a colourblind-safe palette and pair each line with a distinct line style or a direct label, so the three thresholds (0.55, 0.82, 0.99) and the truth can be told apart without relying on colour.
Done We modified Figure 5 so it is interpretable without relying on colours.
recommended One sentence in Section 3.5 reads "so the sweep is linear the number of candidate pairs", which is missing a word ("linear in the number"). The table column heading "FlexRL (no dynamic)" in Tables 2 and 4 would read better as "(no dynamics)" to match the "dynamics" wording used elsewhere.
Done We modified the article accordingly.
recommended State the provenance and access terms of the SHIW data in one sentence. The 2012 and 2014 waves are anonymised microdata released by the Bank of Italy for research, which places this work within secondary analysis of public data. Recording that status makes clear why separate ethics approval and participant consent are not required here.
Done We elaborated on the SHIW provenance and access terms in the last paragraph of the “Introduction”.
recommended Qualify the word "reliable" in the Discussion given the reported FDPs (0.57 on the full data, 0.29 with blocking); say that the scalability claim concerns compute and memory, not linkage accuracy.
Done Following a previous comment, we clarified the “Discussion” to position the scalability in terms of memory and running time and the flexibility in terms of accommodating diverse scenarios, with performance depending on the difficulty of the task and the chosen decision rule, controlling the FDP and recovering a fraction of the true links (sensitivity) accordingly.
recommended Report the regression specifics: which SHIW variable encodes expected age of retirement, the linked sample size used (273 at the chosen threshold), the sensitivity there (0.26), and that the reference line is the estimate computed on true links.
Done We reported the regression specifics in the “Diagnostics” section.
recommended State how the PIV independence violation (Occupation and Sex associated, Cramér's V 0.32 and 0.35) may affect calibration of the FDP estimators, beyond issuing a warning.
Done At the end of the section “False discovery proportion” we now elaborate on the assumptions underlying each FDP estimator and on the expected impact of deviations from the PIV independence assumption. We refer the reader to the FDP estimation article for a broader overview of the robustness of these FDP estimators to record linkage configurations.
recommended Give practitioners guidance on which FDP estimator to trust when the two disagree, since the SHIW example shows them diverging from each other and from the truth.
Done At the end of the section “False discovery proportion” we now provide guidance on which FDP estimator to rely on depending on the setting.
recommended Clarify the scaling factor N_B/N_synth in Equation 11 and state when the synthetic estimator is expected to be biased. The simulation returns 0.28 against a true 0.16 for the dynamics model, which the text does not address.
Done In the “Synthetic data estimator” section we gave details on the assumptions underlying the synthetic data FDP estimator and on its derivation. We commented on the performance of the estimators around Table 4.
recommended Note that the linked-sample divergence measures are heuristic indicators of sampling bias, not estimates of the bias in β, and that the "elbow" threshold choice carries no formal guarantee.
Done Following a previous comment, we clarified that the divergence measures are only heuristics and therefore neither estimate the sampling bias nor carry any formal guarantee.
recommended Provide a single master script that maps each table and figure to the command that regenerates it, with a captured session-info / environment record.
Done We added a preview of our session info at the beginning of the script. The quarto script is provided as a single document to generate the article and its content. We mentioned that the script is available as supplementary material and on the GitHub repository of the package at the end of the “Simulation study” section.
optional The `.onAttach` startup message ("please cite us ... feel free to complain as well") and the `music_on` argument that opens a browser tune are informal side effects. They are harmless and default off, but a plainer startup message reads better in a statistical-agency setting and avoids friction with package-check gates that flag chatty attach messages.
Declined The message printing on attachment of the package can be silenced with suppressPackageStartupMessages() and does not interferes with the package checks. The music_on argument of the StEM() record linkage function is off by default and is convenient for long runs on very large data sets. We did not modify these elements.
optional A broader simulation varying overlap, PIV discriminative power and error rates would map out when each FDP estimator is reliable.
Declined It is not the scope of this software article to study the behaviour of FDP estimators across a range of record linkage configuration. However, such broader simulation study has been performed in the FDP estimation article and we refer the reader to it in the “False discovery proportion” section.
Round 2Minor revision3 reviewers · response
Minor revisionConfirmed and signed by Matthias Templ2026-10-26 · orcid 0000-0002-8638-5276

The editor's note

The three reviewers recommend acceptance and every required point of the first round is met. A minor revision is asked for the recommended points. The authors may leave any of them with a reason, and that will not hold the paper back.

Decision letter2026-10-26FlexRL packages a hierarchical two-source record linkage model (StEM) together with method-agnostic diagnostics, two FDP estimators and several sample-divergence measures, so a practitioner linking sources without a unique identifier can judge how the linkage decision rule affects downstream inference. It matters to statistical agencies and to researchers working with administrative, registry and survey data. We would be glad to see the revised version.

Thank you for the revised version of your manuscript. This is round 2, and we are inviting a further minor revision. Because you were asked for a major revision, this round read the new version whole, and the editor has read your response against it. What follows is our reading of this version. An item carried over from the previous round says so.

FlexRL packages a hierarchical two-source record linkage model (StEM) together with method-agnostic diagnostics, two FDP estimators and several sample-divergence measures, so a practitioner linking sources without a unique identifier can judge how the linkage decision rule affects downstream inference. It matters to statistical agencies and to researchers working with administrative, registry and survey data. We would be glad to see the revised version.

How to read this letter. The decision rests on the items marked required. If a required item seems wrong to you, or cannot be done within this paper, decline it on the revision page and give the reason. A reasoned decline is a legitimate answer, and the editor weighs it. Reviewers can be mistaken. Items marked recommended or optional are advice from the reviewers. Adopt them, decline them with a sentence, or leave them for later work. None of that counts against the paper. The reviewer reports below carry the same marks. The editor who signs this decision may weigh an item differently in the accompanying message, and that message prevails.

recommended:

  • [novelty-and-prior-art] The nearest uncited close work is Edwards et al. 2026, “Assessing Linkage Quality: Metrics, Insights, and a Reusable Python Toolkit” (IJPDS, doi:10.23889/ijpds.v11i5.3597), which addresses the same problem the paper claims as its second contribution: a method-agnostic toolkit of linked-data quality diagnostics. This was raised in round 1 (918f2fc9) and declined because the article was not yet available. The search now returns it as published in OpenAlex, so the ground for declining has changed. The two toolkits differ (FlexRL offers two FDP estimators and divergence measures rather than match-rate/precision/recall-style metrics), so this is positioning, not a claim collision. Cite it and state in the diagnostics section what the FDP and divergence tools add relative to the metrics Edwards et al. report.
  • [statistical-rigor] The SHIW benchmark tables (3, 6, 7) report FlexRL from a single seed, yet FlexRL linkage is stochastic (StEM with an inner Gibbs sampler), so its counts carry Monte Carlo variability that the simulation tables now quantify but the real-data tables do not. Report the spread of FlexRL sensitivity and FDP across a small set of seeds on the Emilia-Romagna subset, or state in Section 5 that the reported real-data figures are a single realisation at seed 1 and note the dependence on it.
  • [visualisation] The text uses “dotted orange” for the linked-data estimate at three different thresholds (0.55, 0.99 and 0.94) in Figure 5. If these appear together on one panel, add the threshold value as a direct label on each line so the three dotted lines are not confused. If they sit on separate panels, a one-line caption note saying so removes the ambiguity.
  • [visualisation] Figure 3 shows the estimated FDP and several divergence measures against the threshold on shared axes. Confirm each curve carries a units label and that the FDP axis runs on a fixed 0 to 1 scale, so the elbow and the FDP level can be read without a truncated-axis effect. A direct label or legend entry per measure helps, since MMD, SMD and support IoU are on different scales.
  • [software-landscape] The score-based FDP estimator (Equation 10) is the literature estimator used, among others, inside fastLink (Enamorado et al. 2019), yet the paper reports it only on FlexRL’s own scores. A short line stating that Equation 10 is the general score estimator applied uniformly across all methods in Table 4, with one row showing the estimate FlexRL’s wrapper computes from fastLink’s own scores next to the FDP fastLink’s native output would imply, would make clear the estimator is the published one and that the wrapper feeds it correctly.
  • [software-quality] cran-comments.md states “an update from version 1.0.0 to 1.0.1” while DESCRIPTION is Version: 2.0.0, and README “News” still says “Version 1.0.0 of FlexRL is ready” and “will be soon available on JASP” though the paper describes FlexRL 2.0.0 already shipping as a JASP module. Refresh these before the CRAN/release submission so the metadata agrees with the version the paper documents.
  • [Reviewer 2] In the SHIW example, note that the synthetic FDP estimate (0.07) carries a dispersion (sd 0.08) comparable to its own size, and that the near-zero dispersion of the score based estimate (0.01, sd 0.00) reflects confidence in a misspecified model, not precision about the true FDP of 0.15. New, visible because dispersions are now reported.

optional:

  • [simulation-design] The factor grid is still a single configuration, one overlap, one error rate, one dynamic PIV (prior point af410fe5, declined). The authors decline on scope grounds and point to the published configuration sweeps. A small grid varying overlap and error rate would show how the dynamics advantage and the FDP estimates hold up across difficulty, and could be parked for a later paper.

We will correct these in production, and you confirm them in the proof:

  • [methods-soundness] The reference “Robach, Kayané, Mark A van de Wiel, Michel H Hof, and Stéphanie L van der Pas. 2026. Causal Record Linkage. h.” still ends in a truncated URL, and the Lam et al. 2024 entry still carries a concatenated DOI (“v9i1.238910.23889/ijpds.v7i3.1794”). Confirm both links at proof.

Reviews

Report Reviewer 1recommends acceptI read the whole revision. Of the one required point and five lighter ones I raised, all are met in substance, and the one item still open is the incomplete reference, which is a production fix rather than an author task.

Written by the journal's review engine in the role of the application reviewer, and read by the editor before the decision. How the engine works is on the peer review page.

I read the whole revision. Of the one required point and five lighter ones I raised, all are met in substance, and the one item still open is the incomplete reference, which is a production fix rather than an author task.

The required point was the honesty of the headline diagnostic in the worked example. The re-seeded run now lands the threshold at 0.94, and Section 4.4 states the gap directly: the synthetic data estimator yields 0.07 against a true FDP of 0.15, while the score based estimator yields 0.01. A reader now sees that the primary score estimator understated the error by an order of magnitude here and that the synthetic estimator held up, which is exactly the warning a practitioner needs. Section 4.2.2 goes further and explains why: under the PIV independence violation present in this example, the score based estimator inherits the model’s misspecification, while the synthetic estimator stays valid if the synthesiser captures the PIV dependence. That reasoning is sound and it closes the point I was most concerned about, together with the related asks on the independence violation and on which estimator to trust when the two disagree.

The regression now names the SHIW variable (‘etapen’), reports 245 retained links with sensitivity 0.23 and FDP 0.15 at the chosen threshold, and states that the solid reference line in Figure 5 is computed on the 898 true links. The Discussion no longer calls the method a “reliable solution” and instead separates the memory-and-runtime claim from linkage accuracy, which matches the FDPs in Tables 6 and 7. The simulation tables now report mean and standard deviation over 10 replications, and Tables 6 and 7 are on a common national scale, which makes the scalability comparison legible. These address the reproducibility and clarity points cleanly.

Two recommended points and two optional points were declined. The decline on not benchmarking the compared packages across a range of linkage configurations is reasonable for a software article, and the pointer to the methodological papers that do carry out that study is the right place for it. The decline on positioning against the Edwards et al. toolkit is also reasonable, since that work is not yet available to compare against. The optional declines on startup messages and on a broader FDP-estimator simulation do not affect the paper’s claims. I am convinced by all four.

One item remains. The bibliography still shows “Robach, Kayané, Mark A van de Wiel, Michel H Hof, and Stéphanie L van der Pas. 2026. Causal Record Linkage. h.” with a truncated venue field. This is cited for the inference consequences of linkage error, so it should carry a resolvable entry. It belongs on the production list the authors confirm in the proof.

Numbered suggestions to the authors:

  1. [editor_fix] Complete the bibliography entry “Robach et al. 2026. Causal Record Linkage. h.” with its venue or repository details.
Report Reviewer 2recommends acceptOf the required calibration point and the methodological clarifications I raised, the substantive ones are met. The paper now states in Section 4.4 that the score based estimator reads 0.01 against a true FDP of 0.15 on the SHIW while the synthetic estimator reads 0.07, and Section 4.2.2 explains the gap: the Sex and Occupation association the package itself flags violates the PIV independence that the score based estimator rests on, so that estimator understates the FDP, and the synthetic estimator should remain valid when the synthesiser captures the dependence. This is the honest account the headline tool needed, and the simulation in Table 4, where the PIVs are independent and the score based estimate (0.18 against 0.18 for the no-dynamics model) is well pinned, supports the mechanism. The decomposition in Equations 6 to 9, the StEM scheme in Algorithm 1 and the synthetic estimator derivation in Equation 11 are coherent as presented.

Written by the journal's review engine in the role of the methodology reviewer, and read by the editor before the decision. How the engine works is on the peer review page.

Of the required calibration point and the methodological clarifications I raised, the substantive ones are met. The paper now states in Section 4.4 that the score based estimator reads 0.01 against a true FDP of 0.15 on the SHIW while the synthetic estimator reads 0.07, and Section 4.2.2 explains the gap: the Sex and Occupation association the package itself flags violates the PIV independence that the score based estimator rests on, so that estimator understates the FDP, and the synthetic estimator should remain valid when the synthesiser captures the dependence. This is the honest account the headline tool needed, and the simulation in Table 4, where the PIVs are independent and the score based estimate (0.18 against 0.18 for the no-dynamics model) is well pinned, supports the mechanism. The decomposition in Equations 6 to 9, the StEM scheme in Algorithm 1 and the synthetic estimator derivation in Equation 11 are coherent as presented.

The seed change propagated new numbers throughout, and they hang together: the regional subset carries 898 true links, Table 3 gives FlexRL 298 true and 101 false positives at the default rule (FDP 0.25), and the ξ=0.94 analysis retains 245 pairs at FDP 0.15 and sensitivity 0.23. Table 4 now reports means and standard deviations over the replications, the print output carries the per-estimator spread, and the Table 4 text labels the synthetic estimate as unreliable for FlexRL (dynamics) and attributes it to the misspecified dynamics model. The divergence measures are now labelled as indicators of sampling bias that do not estimate Equation 9, and the elbow rule is stated as a heuristic whose reliability has not been assessed. These settle the points I raised.

One point is newly visible because the dispersions are now on the page, and it bears on the tool’s practical use. In the SHIW example the synthetic estimate is 0.07 with a standard deviation of 0.08, so it is compatible with an FDP anywhere from near zero to roughly 0.23, and the true 0.15 sits inside that range. The score based estimate is 0.01 with a reported standard deviation of 0.00. A user choosing a threshold from the estimated FDP curve could read that 0.00 as precision when it is confidence in a model whose independence assumption is violated here. A sentence where the print output appears, noting the width of the synthetic estimate and what the near-zero score based spread does and does not mean, would let the reader weigh the two estimates as the authors intend. This strengthens the example and the paper stands without it.

The reference-level fixes I marked for production last round are still present: the truncated “h.” URL on Robach et al. 2026, the concatenated DOI on Lam et al. 2024, and the JASP version that reads 1.0 in the text and 0.98.8 in the reference. These are confirmed in the proof rather than reworked by the authors.

The declined items are reasonably argued. A broader study of the compared packages and of the FDP estimators across linkage configurations sits outside a software paper and is referred to the methodological articles, the Edwards et al. toolkit is not yet available to position against, and the startup-message points are cosmetic. I am convinced on each.

Numbered suggestions to the authors:

  1. [editor_fix] Complete the truncated “Robach et al. 2026, Causal Record Linkage” reference (URL still reads “h.”), split the concatenated DOI in Lam et al. 2024, and reconcile the JASP version (text says 1.0, reference says 0.98.8).
  2. recommended Where the print output in Figure 4 is discussed, note that the synthetic FDP estimate (0.07) has a dispersion (sd 0.08) comparable to its own size, and that the near-zero dispersion of the score based estimate (0.01, sd 0.00) reflects confidence in a model whose independence assumption is violated here, not precision about the true FDP of 0.15.
Report Reviewer 3recommends acceptOf the two required points and one recommended point I raised, both required points are met and the recommended one is done, leaving a single production fix.

Written by the journal's review engine in the role of the software reviewer, and read by the editor before the decision. How the engine works is on the peer review page.

Of the two required points and one recommended point I raised, both required points are met and the recommended one is done, leaving a single production fix.

The reproducibility question I pressed on is now resolved in a way I find convincing. Section 3.5 states that all random draws occur upstream of the parallel region, so the OpenMP threads never call R’s generator and only compute likelihood contributions over disjoint sets of candidate pairs, while the create-or-break proposals run as a sequential sweep. That design makes the output independent of the thread count, and set.seed() then fixes the whole run. This is the right answer to the concern, because it removes the thread-dependence at its source instead of asserting reproducibility and leaving the reader to guess what it covers. I could not run the samplers to confirm bit-for-bit identity across thread counts, so my confidence rests on the account rather than on execution, but the account is internally coherent and matches the stated architecture.

The provenance of the benchmark tables is now recorded. The hardware (MacBook Pro, Apple M1 Max, 32GB, 8 cores), R 4.6.1, the seed of 1 per output-producing cell, and the compared-package versions in Table 1 are all present, and the note that some compared packages call set.seed() internally explains why the reported numbers shifted from the first submission. That disclosure is the useful part: a reader who regenerates the tables and sees different figures now knows where to look. The quarto document plus the session-info preview and the GitHub reproduction path cover the master-script request.

On the two declined points, both reasoned declines convince me. A study of how the competing packages behave across a range of linkage configurations, and a broader simulation of the FDP estimators, both sit outside a software paper and are already covered by the cited methodological articles. Deferring to that literature is the correct scope call here.

Reading the revised version as a whole, the changes to Tables 2 and 4 (mean and standard deviation over 10 replications, FDP averaged over 5 repeats) and the rescaling of Table 7 onto Table 6’s scale improve the paper without opening anything new that I would hold it for. The one item still outstanding is the truncated reference, which the authors’ own bibliography determines and which belongs on the production list.

Numbered suggestions to the authors:

  1. [editor_fix] Repair the reference “Robach et al. 2026. Causal Record Linkage. h.” with its complete citation and URL.

Revision

Authors' response2026-10-26 · 8 answersAuthors confirm each required point as done or give their reason for declining it. Further answers are voluntary, because the review compares every revision with the previous version and the next round's reports say what remains open.

Authors confirm each required point as done or give their reason for declining it. Further answers are voluntary, because the review compares every revision with the previous version and the next round's reports say what remains open.

We made minor edits to the text to clarify these points.

recommended The nearest uncited close work is Edwards et al. 2026, "Assessing Linkage Quality: Metrics, Insights, and a Reusable Python Toolkit" (IJPDS, doi:10.23889/ijpds.v11i5.3597), which addresses the same problem the paper claims as its second contribution: a method-agnostic toolkit of linked-data quality diagnostics. This was raised in round 1 (918f2fc9) and declined because the article was not yet available. The search now returns it as published in OpenAlex, so the ground for declining has changed. The two toolkits differ (FlexRL offers two FDP estimators and divergence measures rather than match-rate/precision/recall-style metrics), so this is positioning, not a claim collision. Cite it and state in the diagnostics section what the FDP and divergence tools add relative to the metrics Edwards et al. report.
Declined We can only find an abstract of Edwards et al. research work and cannot find any Python code. For that reason we cannot examine the tools provided and cannot position them against the diagnostics provided in FlexRL.
recommended The SHIW benchmark tables (3, 6, 7) report FlexRL from a single seed, yet FlexRL linkage is stochastic (StEM with an inner Gibbs sampler), so its counts carry Monte Carlo variability that the simulation tables now quantify but the real-data tables do not. Report the spread of FlexRL sensitivity and FDP across a small set of seeds on the Emilia-Romagna subset, or state in Section 5 that the reported real-data figures are a single realisation at seed 1 and note the dependence on it.
Done Around Table 3, we stated that all results based on the SHIW data depend on the seed set in our script and on the seeds that some of the compared methods use internally.
recommended The text uses "dotted orange" for the linked-data estimate at three different thresholds (0.55, 0.99 and 0.94) in Figure 5. If these appear together on one panel, add the threshold value as a direct label on each line so the three dotted lines are not confused. If they sit on separate panels, a one-line caption note saying so removes the ambiguity.
Done The figures are arranged in separate panels, and the title of each panel informs the reader of the threshold (0.55, 0.94, 0.99). Each panel shows several curves, drawn in different colours and line styles, so they can be distinguished without relying on colour.
recommended Figure 3 shows the estimated FDP and several divergence measures against the threshold on shared axes. Confirm each curve carries a units label and that the FDP axis runs on a fixed 0 to 1 scale, so the elbow and the FDP level can be read without a truncated-axis effect. A direct label or legend entry per measure helps, since MMD, SMD and support IoU are on different scales.
Done Figure 3 presents multiple subfigures. All curve have their unit label and their axis. The FDP axis runs from 0 to 1 but in practice shows curves on the range 0 to 0.3. The elbow on the divergence curves (namely MMD, SMD in A, SMD in B) and the FDP levels can be read without problem. Each curve is describe in the legend.
recommended The score-based FDP estimator (Equation 10) is the literature estimator used, among others, inside fastLink (Enamorado et al. 2019), yet the paper reports it only on FlexRL's own scores. A short line stating that Equation 10 is the general score estimator applied uniformly across all methods in Table 4, with one row showing the estimate FlexRL's wrapper computes from fastLink's own scores next to the FDP fastLink's native output would imply, would make clear the estimator is the published one and that the wrapper feeds it correctly.
Done In the “Score based estimator” section, we added references to the two articles that derive the score based FDP estimator of Equation 10. This simple derivation is implemented only in the FlexRL package and corresponds to the formula given in Enamorado et al. (2019) and Robach et al. (2025). In the “Diagnostics” section, we mention that diagnostics are run through wrappers with a common form for all compared methods.
recommended `cran-comments.md` states "an update from version 1.0.0 to 1.0.1" while `DESCRIPTION` is `Version: 2.0.0`, and README "News" still says "Version 1.0.0 of FlexRL is ready" and "will be soon available on JASP" though the paper describes FlexRL 2.0.0 already shipping as a JASP module. Refresh these before the CRAN/release submission so the metadata agrees with the version the paper documents.
Done We updated cran-comments.md, DESCRIPTION and NEWS.md accordingly. FlexRL has been prepared as a JASP module for JASP 1.0, which has not yet been released. We will submit FlexRL 2.0.0 to CRAN once the journal has approved all changes.
recommended In the SHIW example, note that the synthetic FDP estimate (0.07) carries a dispersion (sd 0.08) comparable to its own size, and that the near-zero dispersion of the score based estimate (0.01, sd 0.00) reflects confidence in a misspecified model, not precision about the true FDP of 0.15. New, visible because dispersions are now reported.
Done We softened the sentence to present both FDP estimators in a similar fashion. In the "False discovery proportion" section, we provide guidance on which estimator of the FDP to rely on depending on the setting.
optional The factor grid is still a single configuration, one overlap, one error rate, one dynamic PIV (prior point af410fe5, declined). The authors decline on scope grounds and point to the published configuration sweeps. A small grid varying overlap and error rate would show how the dynamics advantage and the FDP estimates hold up across difficulty, and could be parked for a later paper.
Done Both points have been investigated in articles we reference. The behaviour of the two FDP estimators implemented in FlexRL across configurations is studied in the article cited in the “False discovery proportion” section. The benefit of modelling PIV dynamics, compared for FlexRL with and without dynamics and with other record linkage paradigms, is studied in the article cited in the “Simulation study” section. We clarified these contributions.
Round 3Accepted3 reviewers
AcceptedSigned by Matthias Templ2026-10-28 · orcid 0000-0002-8638-5276

The editor's note

Final acceptance of version 2, after the editor read the preview of the article. The journal’s re-run reproduces the reported values on macOS arm64, except the BRL and multilink cells of Tables 2 and 4, which come from other packages’ samplers, and fastLink in Table 6, which needs 20 GB of memory. One required point remains for the proof: the text names JASP 1.0 and the reference version 0.98.8.

Decision letter2026-10-28Congratulations, your manuscript has been accepted for publication in JRepStat. Production begins now.

Congratulations, your manuscript has been accepted for publication in JRepStat. Production begins now.

Where it is not on file yet, we still need the following for production.

  • a valid ORCID iD for every author
  • a captured computational environment (dependencies/lockfile/container)
  • a signed determinism attestation for the entry-point command

Reviews

Report Reviewer 1recommends acceptThe one item I left open last round was the single editor_fix on the truncated reference, since everything else was met in substance. That item is still open. The bibliography still reads “Robach, Kayané, Mark A van de Wiel, Michel H Hof, and Stéphanie L van der Pas. 2026. Causal Record Linkage. h.” with no resolvable venue or repository. It is cited for the inference consequences of linkage error, so it should carry a complete entry. This belongs on the production list the authors confirm in the proof.

Written by the journal's review engine in the role of the application reviewer, and read by the editor before the decision. How the engine works is on the peer review page.

The one item I left open last round was the single editor_fix on the truncated reference, since everything else was met in substance. That item is still open. The bibliography still reads “Robach, Kayané, Mark A van de Wiel, Michel H Hof, and Stéphanie L van der Pas. 2026. Causal Record Linkage. h.” with no resolvable venue or repository. It is cited for the inference consequences of linkage error, so it should carry a complete entry. This belongs on the production list the authors confirm in the proof.

Nothing else is open. My recommendation is unchanged.

Numbered suggestions to the authors:

  1. [editor_fix] Complete the bibliography entry “Robach et al. 2026. Causal Record Linkage. h.” with its venue or repository details.
Report Reviewer 2recommends acceptOf the two items I carried into the accept round, the recommended dispersion note is not in the text and the three reference fixes are unchanged. Neither bears on the recommendation, which stands at accept.

Written by the journal's review engine in the role of the methodology reviewer, and read by the editor before the decision. How the engine works is on the peer review page.

Of the two items I carried into the accept round, the recommended dispersion note is not in the text and the three reference fixes are unchanged. Neither bears on the recommendation, which stands at accept.

The reference-level items remain for the proof. The truncated “Causal Record Linkage” URL still reads “h.”, the Lam et al. 2024 DOI is still two DOIs run together, and the text still says the JASP module is for version 1.0 while the reference cites version 0.98.8. The response letter explains the JASP point, that the module targets an unreleased JASP 1.0 while the current release is 0.98.8, which makes the two numbers defensible rather than contradictory. The editor should still decide whether to align them in the proof, so I leave the item on the production list rather than close it.

The recommended dispersion note was voluntary and the authors did not take it up. In the print output the synthetic estimate is 0.07 with a standard deviation of 0.08 and the score based estimate is 0.01 with a reported standard deviation of 0.00, against a true FDP of 0.15. A sentence reading those two spreads would help a user weigh the estimates, since the near-zero score based spread reflects confidence in a model whose independence assumption is violated here, not precision about the true value. The paper stands without it, and the Section 4.2.2 account of why the score based estimator understates the FDP already carries the main point.

Numbered suggestions to the authors:

  1. [editor_fix] Complete the truncated “Robach et al. 2026, Causal Record Linkage” reference (URL still reads “h.”), split the concatenated DOI in Lam et al. 2024, and reconcile the JASP version between the text (1.0) and the reference (0.98.8).
  2. recommended Where the print output in Figure 4 is discussed, add a sentence noting that the synthetic FDP estimate (0.07) has a dispersion (sd 0.08) comparable to its own size, and that the near-zero dispersion of the score based estimate (0.01, sd 0.00) reflects confidence in a model whose independence assumption is violated here, not precision about the true FDP of 0.15.
Report Reviewer 3recommends acceptMy prior report left a single open item, the truncated “Causal Record Linkage” reference, and that is the one point to settle here.

Written by the journal's review engine in the role of the software reviewer, and read by the editor before the decision. How the engine works is on the peer review page.

My prior report left a single open item, the truncated “Causal Record Linkage” reference, and that is the one point to settle here.

It is still truncated. In the revised bibliography the entry reads “Robach, Kayané, Mark A van de Wiel, Michel H Hof, and Stéphanie L van der Pas. 2026. Causal Record Linkage. h.”, where the trailing “h.” is a cut-off URL. The response letter answered a set of recommended and optional points but did not touch this one, so the error carries over unchanged. Its correct value is fixed by the authors’ own citation, which keeps it on the production list rather than the Required list, and it does not bear on any claim in the paper.

Nothing else in this version changes my view. The reproducibility design I pressed on, all random draws upstream of the parallel region so thread count does not affect the output, and the benchmark provenance (hardware, R 4.6.1, seed of 1 per output cell, compared-package versions) both stand as in the round I reviewed. The recommendation remains accept, with the one reference repair handled in the proof.

Numbered suggestions to the authors:

  1. [editor_fix] Repair the reference “Robach, Kayané, Mark A van de Wiel, Michel H Hof, and Stéphanie L van der Pas. 2026. Causal Record Linkage. h.” with its complete citation and URL.

Peer review record (PDF) · How open review works

Abstract

FlexRL is an R package for probabilistic record linkage and inference on linked data. It provides a method to link observations from the same entities across two data sources that lack a unique identifier but share partially identifying variables. This method fits a hierarchical latent variable model of the data generation process, rather than classifying pairs of records from the comparison of their values, and accommodates registration errors and variables changing over time. Since linkage may affect subsequent analyses, the package also provides tools to assess the linked data quality as functions of the linkage decision rule. Two false discovery proportion estimators are implemented: a probabilistic approach contingent on the record linkage model and an augmented approach relying on an auxiliary estimation using synthetic data. Several measures of divergence of the linked sample from the source population are provided. These tools are agnostic to the underlying record linkage model and can be applied to any method. Together, they connect the output of the linkage to the validity of the subsequent analyses. The implementation combines standard R functions and S3 methods with Rcpp computations, resulting in fast execution times and a low memory footprint.

1 Introduction

Researchers and statistical agencies increasingly combine data sources that do not share a unique identifier (Cleaton et al., 2024; Kramer, 2026; Laidler et al., 2025). Record linkage connects records referring to the same entity across sources based on Partially Identifying Variables (PIVs, e.g. birth year, sex, postal code or product code, brand and category). Each PIV has limited discriminative power on its own and may be missing, incorrectly recorded or change over time. Record linkage underpins the production of official statistics, enables the reuse of administrative and registry data for research (Cooney et al., 2023; Pontesilli et al., 2021; Williamson et al., 2020) and improves data quality through linkage and deduplication.

Linked data sets become the study sample for downstream analyses, where linkage errors may propagate (Doidge & Harron, 2019; Robach et al., 2026; Vo et al., 2024; Wang et al., 2022). Errors arise when links between entities that appear in both sources are missed or when records from distinct entities are falsely linked. These errors cannot be reduced simultaneously and may bias the conclusions drawn from linked data. A stricter decision rule reduces falsely linked pairs but misses more links. Practitioners therefore need not only record linkage methods, but also tools to quantify linkage errors and appraise their consequences for statistical analysis.

Two main probabilistic approaches to record linkage have developed through times. First, the traditional mixture model (Fellegi & Sunter, 1969; Fortini et al., 2001; Jaro, 1989; Larsen, 1999; Sadinle, 2017) treats linkage as a classification problem between pairs of records that are similar and pairs that are not. Second, the hierarchical entity resolution framework (Marchant et al., 2021; Marchant et al., 2023; R. C. Steorts, 2015; R. C. Steorts et al., 2016; Tancredi & Liseo, 2011) models the data generation process, considering observed values as potentially distorted versions of latent true values. The latter framework uses all the information contained in the records and is therefore more flexible but more computationally demanding. It has been implemented in R for entity resolution (clustering records from a single file into entities) rather than for linkage between two data sources.

We address this gap with the FlexRL R package, which makes two contributions. First, it implements the hierarchical record linkage model proposed by Robach, van der Pas, et al. (2025). The model is fitted with a Stochastic Expectation Maximisation (StEM) algorithm that accounts for registration errors and temporal changes in PIVs. Its architecture and efficient Rcpp backend support scalability to large data sets and a wide range of applications: health monitoring studies, survey waves, census and administrative records or data from different retailers. Second, it provides tools to assess the quality of the linked data, which quantify the linkage error and sample selection. FlexRL implements two estimators of the False Discovery Proportion (FDP): one derived from linkage scores (Belin & Rubin, 1995; Enamorado et al., 2019; Resnick & Asher, 2019) and one based on synthetic data (Robach, Hof, et al., 2025). FlexRL measures the divergence of the linked sample from the original sources using standardised mean differences, overlap of supports, maximum mean discrepancy and agreement rates. These tools only need the linked pairs and, when available, their linkage scores. They therefore apply to the output of any linkage method and FlexRL provides wrappers for several existing R packages.

The FlexRL package is aimed at practitioners, statistical agencies and researchers who need to link data sources without a unique identifier or who want to measure the error and the sample selection induced by record linkage. It builds on three lines of work: the biases that linkage errors cause in inference (Doidge & Harron, 2019; Lahiri & Larsen, 2005; Robach et al., 2026; Tancredi & Liseo, 2015; Wang et al., 2022); the need for linked data quality control in practice (Harron et al., 2020; Harron et al., 2017; Laidler et al., 2025; Lam et al., 2024); advances in record linkage methodology (Marchant et al., 2023; Robach, van der Pas, et al., 2025; Sadinle, 2017). By combining record linkage and diagnostics in a practical tool, it helps evaluating whether inference can be conducted on linked data.

Throughout the paper, we motivate and illustrate the main components of FlexRL on the 2012 and 2014 waves of the Survey on Household Income and Wealth (SHIW), conducted and made available by the Bank of Italy for research purposes. As a secondary analysis of public data, no additional ethics approval or participant consent was required. Section 2 introduces the notation, the modelling paradigms, the existing software and demonstrates the potential of FlexRL. Section 3 presents the record linkage model implemented in FlexRL and its estimation on a subset of the SHIW. On the resulting linked data, Section 4 describes the diagnostic tools FlexRL provides, and illustrates the impact of linkage errors on a socio-economic regression analysis. Section 5 demonstrates the scalability of FlexRL approach to record linkage on the SHIW. Section 6 concludes.

2 The record linkage problem

2.1 Setup and notation

We consider two overlapping samples 𝒜\mathcal A and ℬ\mathcal B from the same population with N𝒜N_{\mathcal A} and Nℬ≥N𝒜N_{\mathcal B} \geq N_{\mathcal A} records. Both sources record the same KK categorical PIVs, indexed by k=1,…,Kk = 1, \dots, K with NkN_k possible values each. Index ii refers to a record in 𝒜\mathcal A and index jj to a record in ℬ.\mathcal B. For PIV kk, we denote by Gi,k𝒜G^{\mathcal A}_{i,k} the registered (observed) value and by Hi,k𝒜H^{\mathcal A}_{i,k} the latent true value in record i∈𝒜.i \in \mathcal A. We define Gj,kℬG^{\mathcal B}_{j,k} and Hj,kℬH^{\mathcal B}_{j,k} analogously. Registered values differ from true values because of registration errors: missing values or mistakes (e.g. typographical errors). We write 𝐆\textbf{G} and 𝐇\textbf{H} for the collections of all registered and all true values. True values may also differ between the two data collections. This is the case for dynamic PIVs like postal code, whereas stable PIVs like birth year cannot change. For an entity recorded in both sources, the true values of stable PIVs are therefore identical in 𝒜\mathcal A and ℬ\mathcal B and any disagreement between their registered values is due to registration errors. We elaborate on dynamic PIVs later.

The object of interest is the linkage matrix 𝚫∈{0,1}N𝒜×Nℬ\boldsymbol{\Delta} \in \{0,1\}^{N_{\mathcal A} \times N_{\mathcal B}}, with Δi,j=1\Delta_{i,j} = 1 if records i∈𝒜i \in \mathcal A and j∈ℬj \in \mathcal B refer to the same entity. We assume that there are no duplicates within a data source. Thus, each record forms a link with at most one record in the other data source: ∑jΔi,j≤1\sum_j \Delta_{i,j} \leq 1 for all ii and ∑iΔi,j≤1\sum_i \Delta_{i,j} \leq 1 for all j.j. This is the one-to-one assignment constraint, also referred to as bipartite matching (Sadinle, 2017). We denote by γ∈(0,1)\gamma \in (0,1) the probability that a record from 𝒜\mathcal A forms a link with a record from ℬ\mathcal B, that is, the overlap between the sources as a fraction of the smaller data set.

Since record linkage is imperfect, the linked data contain two types of error: false positives (pairs declared linked while referring to distinct entities) and false negatives (true links that are missed). The non-links in the Cartesian product 𝒜×ℬ\mathcal A \times \mathcal B are far more numerous than the links and are rarely of interest. The useful summaries are therefore the False Discovery Proportion (FDP) among the linked data (complement of precision or positive predictive value) and the sensitivity (also called recall, complement of miss rate). The two errors affect inference differently: falsely linked pairs contaminate the inference and missed links induce sample selection (Doidge & Harron, 2019; Robach et al., 2026).

2.2 Modelling paradigms

Linkage methods can be grouped into four paradigms (Binette & Steorts, 2022; Dusetzina et al., 2014). Deterministic (rule based) linkage declares a link when records agree on a set of variables, exactly or up to a tolerance. Supervised methods train a classifier on pairs whose linkage status is known (Mudgal et al., 2018); such labelled pairs are seldom available. The two remaining paradigms are unsupervised and probabilistic, and differ in what they model:

2.2.1 Paradigm 1: classification of comparison vectors

The traditional ‘Fellegi-Sunter’ approach (Dunn, 1946; Fellegi & Sunter, 1969; Newcombe et al., 1959; Tepping, 1968) reduces the data to comparison vectors. For each pair (i,j)∈𝒜×ℬ(i,j) \in \mathcal A \times \mathcal B, a vector 𝒄i,j=(ci,j,1,…,ci,j,K)\boldsymbol{c}_{i,j} = (c_{i,j,1}, \dots, c_{i,j,K}) records whether elements Gi,k𝒜G^{\mathcal A}_{i,k} and Gj,kℬG^{\mathcal B}_{j,k} for k=1,…,Kk = 1, \dots, K agree or how similar they are. The pairs of records are split into the set of matched MM and the set of unmatched U.U. The comparison vectors follow a two components mixture: P(𝒄i,j)=γm(𝒄i,j)+(1−γ)u(𝒄i,j),m(𝒄)=P(𝒄∣M),u(𝒄)=P(𝒄∣U),(1) \begin{aligned} P(\boldsymbol{c}_{i,j}) &= \gamma \; m(\boldsymbol{c}_{i,j}) + (1-\gamma) \; u(\boldsymbol{c}_{i,j}), \\ m(\boldsymbol{c}) &= P(\boldsymbol{c} \mid M), \\ u(\boldsymbol{c}) &= P(\boldsymbol{c} \mid U), \end{aligned} \label{eq-FS} \qquad(1) where γ\gamma in this paradigm is the proportion of links among all pairs. Under the assumption that the KK comparisons are independent given the linkage status, mm and uu factorise over k∈{1,…,K}.k \in \{1, \dots, K\}. The parameters are then estimated with an EM algorithm (Jaro, 1989; Larsen, 1999). Pairs are classified by thresholding the ratios m(𝒄i,j)/u(𝒄i,j)m(\boldsymbol{c}_{i,j}) / u(\boldsymbol{c}_{i,j}) or the posterior linkage probabilities. Bayesian versions place a prior on the linkage matrix 𝚫\boldsymbol{\Delta} to enforce the one-to-one assignment constraint (Fortini et al., 2001; Sadinle, 2017) or a prior on a partition of the records when there are more than two sources or duplicates (Aleshin-Guendel & Sadinle, 2023). The computations are simple and fast, but memory intensive because they operate on N𝒜×NℬN_{\mathcal A} \times N_{\mathcal B} comparison vectors. Scaling to large data sets may therefore require blocking, which compares only pairs that agree on some variables (R. C. Steorts et al., 2014). This paradigm treats pairs as independent although they share records, and the reduction to comparison vectors discards part of the information contained in the records.

2.2.2 Paradigm 2: hierarchical modelling

The second family models how the data were generated (Marchant et al., 2021; Marchant et al., 2023; Robach, van der Pas, et al., 2025; R. C. Steorts, 2015; R. C. Steorts et al., 2016; Tancredi & Liseo, 2011). Registered values 𝐆\textbf{G} are seen as distorted versions of latent true values 𝐇\textbf{H}, which define the linkage structure 𝚫.\boldsymbol{\Delta}. The joint model reads P(𝐆,𝐇,𝚫)=P(𝐆∣𝐇)P(𝐇∣𝚫)P(𝚫),(2) P(\textbf{G}, \textbf{H}, \boldsymbol{\Delta}) = P(\textbf{G} \mid \textbf{H}) P(\textbf{H} \mid \boldsymbol{\Delta}) P(\boldsymbol{\Delta}), \label{eq-hier} \qquad(2) with a model for registration errors P(𝐆∣𝐇)P(\textbf{G} \mid \textbf{H}), a model for underlying true values P(𝐇∣𝚫)P(\textbf{H} \mid \boldsymbol{\Delta}) and a model for the linkage structure P(𝚫).P(\boldsymbol{\Delta}). Since records are never reduced to pairwise comparisons, the model can separate missing values, mistakes and changes over time, and it does not need blocking to fit in memory. However, it is more computationally demanding.

2.3 Existing software

In Python, recordlinkage (Bruin, 2019), Splink (Linacre et al., 2022) and NameMatch (Jelveh et al., 2022) implement Paradigm 1. We list the main R packages for the task considered here in Table 1. Paradigm 2 is only available in R through methods for entity resolution (Marchant et al., 2021; Marchant et al., 2023; R. Steorts et al., 2014). These methods cluster records from a single file, possibly containing duplicates, into entities.

Table 1: Record linkage packages on CRAN compared with FlexRL. The FlexRL package diagnostic tools apply to all these packages.
Package Paradigm Estimation Linkage structure Record deduplication PIV dynamics Quality tools
fedmatch 2.1.0 (Cohen et al., 2021; Friedrichs et al., 2023) comparison vectors push relabel maximum flow many-to-many no no no
diyar 0.5.1 (Nsonwu, 2023) comparison vectors multistage weights comparisons, fixed score level parameters clusters yes no no
reclin2 0.6.0 (van der Laan, 2025) comparison vectors, supervised EM, machine learning one-to-one post hoc no no no
fastLink 0.6.1 (Enamorado et al., 2019; Ted Enamorado, 2023) comparison vectors EM one-to-one post hoc no no no
BRL 0.1.0 (Sadinle, 2017; Sadinle, 2020) comparison vectors Bayesian, bipartite prior, Gibbs sampler one-to-one in model no no no
multilink 0.1.1 (Aleshin-Guendel, 2023; Aleshin-Guendel & Sadinle, 2023) comparison vectors Bayesian, partition prior, Gibbs sampler clusters, one-to-one in model yes no no
FlexRL 2.0.0 (Robach & Hof, 2026) hierarchical stochastic EM one-to-one in model no yes yes

To our knowledge, no R package implements Paradigm 2 for the linkage of two sources under the one-to-one assignment constraint or models the dynamics of PIVs over time. While the postlink package (Bukke et al., 2026) develops statistical tools for post-linkage data analysis, no record linkage package provides tools to assess the quality of the linked data and their suitability for inference.

The implementation of FlexRL relies on Rcpp (potentially parallelised with OpenMP) for the backend samplers, Matrix for the sparse linkage matrix, and other standard R packages. The diagnostic tools apply to any record linkage output in the required format, with built-in wrappers for BRL, diyar, fastLink, fedmatch, multilink and reclin2. Figure 1 shows the workflow, which follows the structure of Section 3 and Section 4: the data are prepared, linked with StEM() and the linked data quality is assessed with RL_diagnostics(). We elaborate on each component along the article.

Fig 1: Workflow of FlexRL.

2.4 Demonstration

2.4.1 Simulation study

As a preliminary demonstration of the functionalities of FlexRL, we simulate data with the package simulate_data() function. This function synthesises two files with a given overlap, given rates of mistakes and missing values per PIV and file, and given hazard coefficients for structured PIVs, useful for exploring and comparing record linkage methods. Here, we generate two data sets of 250 and 300 records, with 200 entities common to both. Entities are represented by four independent discrete non-uniform PIVs. We distort the data in each file uniformly with 2% of mistakes and 0.5% of missing values; one of the PIVs undergoes temporal changes.

Note that this data generation process, on which all packages cited in Table 1 are evaluated, is in line with the hierarchical model FlexRL fits and represents a simple setting. The fourth PIV follows a dynamic process whose hazard is piecewise constant over time and modulated by a Gaussian covariate. We fit these changes with an exponential survival model in FlexRL, illustrating the benefits of modelling PIV dynamics, even under model misspecification, rather than treating them as registration errors. Later in the article, we evaluate all packages on real data for a fairer comparison.

Naive BRL multilink fastLink reclin2 diyar fedmatch FlexRL (dynamics) FlexRL (no dynamics)
TP 118.40 (5.13) 80.40 (5.04) 80.60 (5.95) 101.70 (6.48) 114.10 (6.38) 34.90 (20.24) 122.10 (6.33) 114.00 (7.92) 87.50 (8.30)
FP 83.10 (11.02) 12.30 (3.23) 14.20 (4.13) 43.10 (5.59) 68.30 (8.82) 3.30 (2.91) 125.80 (6.32) 25.90 (5.15) 19.00 (4.67)
FN 81.60 (5.13) 119.60 (5.04) 119.40 (5.95) 98.30 (6.48) 85.90 (6.38) 165.10 (20.24) 77.90 (6.33) 86.00 (7.92) 112.50 (8.30)
sensitivity 0.59 (0.03) 0.40 (0.03) 0.40 (0.03) 0.51 (0.03) 0.57 (0.03) 0.17 (0.10) 0.61 (0.03) 0.57 (0.04) 0.44 (0.04)
FDP 0.41 (0.03) 0.13 (0.03) 0.15 (0.04) 0.30 (0.03) 0.37 (0.03) 0.08 (0.05) 0.51 (0.03) 0.18 (0.03) 0.18 (0.04)
time (secs) 0.27 (0.04) 0.97 (0.05) 18.57 (1.48) 1.29 (0.24) 0.29 (0.01) 1.17 (0.06) 1.44 (0.01) 4.59 (0.02) 3.72 (0.01)
memory (Mb) 1.04 (0.05) 78.60 (10.08) 105.68 (10.18) 24.85 (4.42) 41.52 (0.18) 104.31 (10.84) 42.14 (2.59) 102.11 (9.03) 70.18 (6.42)

Linkage performance of competing record linkage methods on simulated data for the default linkage decision rule; see Section 3.3. We report average performance over 10 replications, with standard deviations in parentheses.

In (tbl-demonstration?), we compare the methods presented in Table 1 to the FlexRL record linkage algorithm with and without modelling PIV dynamics in terms of sensitivity and FDP. When appropriate, modelling PIV dynamics improves record linkage by increasing sensitivity (more true links are recovered) while keeping the FDP under control. The original methodological article provides a more comprehensive study of the behaviour of FlexRL with and without modelling PIV dynamics (Robach, van der Pas, et al., 2025). (tbl-demonstration?) also shows the differences in computational time and in memory usage between the methods. More details on this demonstration showcasing the utility of accounting for PIV dynamics are given in the package vignette ‘Linkage and Diagnostics with FlexRL’ available through vignette('FlexRL-RL-vignette', 'FlexRL') or the online documentation.

The results presented in this article are obtained on a MacBook Pro (Apple M1 Max ARM chip architecture, 32GB memory, 8 cores) with R version 4.6.1. The random seed is set to 1 in each code cell that produces output (some compared packages call set.seed() internally). The computations are robust to different operating systems (MacOS, Linux, Windows). We measure the memory usage using the R garbage collector. External allocations are therefore likely underestimated. All methods compared in this article rely on Rcpp or C, except for diyar which is fully implemented in R. Time and memory usage may vary depending on the operating system, hardware, and system configuration.

3 The hierarchical architecture

3.1 Data preparation and PIVs configuration

The record linkage model requires each PIV kk to be categorical, encoded by integers 1,…,Nk1, \dots, N_k with missing values coded as 0.0. The PIVs must cover a common support across the two sources. The smaller source should be labelled as 𝒜.\mathcal A.

As a first step in the workflow represented in Figure 1, the prepare_data() function which we will describe validates the PIVs configuration, labels the data sources and encodes the PIVs. When a unique identifier is available, like in simulation studies or in benchmark record linkage data such as the SHIW, it also returns the set of true links. This set may be used to evaluate linkage performance.

The function naive_linkage() links records that agree exactly on all PIVs (a missing value matching any value when na_match = TRUE), without enforcing the one-to-one constraint. When the true links are known, the performance of this deterministic linkage indicates the discriminative power of the PIVs and the difficulty of the task. The FDP of the ‘Naive’ linkage reflects how many records share the same combination of PIV values.

The package distinguishes different kinds of PIVs, which determine how the components of the complete data likelihood of Equation (3) are used when fitting the model in Section 3.2. Candidate pairs of records are formed from records whose latent true values agree on every PIV for which temporal changes are not modelled; whether a candidate pair is linked is then decided from its contribution to the complete likelihood. We elaborate on candidate pairs and linked pairs in Section 3.2.

  • Stable: the latent true values do not change (e.g. birth year). Such PIV is used to form candidate pairs and its probability of mistake may be bounded (for example by 0.100.10) for algorithm stability (Robach, van der Pas, et al., 2025).
  • Dynamic: the true values may change (e.g. postal code between two survey waves):
    • Flexible: changes cannot be modelled, typically because registration dates are not available. The PIV is still used to form candidate pairs, but its probability of mistake should not be bounded, so that the registration model absorbs both mistakes and changes.
    • Structured: changes are modelled by the survival function of Equation (4). Such PIV is not used to form candidate pairs. Registration dates are needed in both sources and covariates for the hazard may be supplied. Mistakes cannot be distinguished from temporal changes, so the probability of mistake should be fixed (for example at 0.020.02), unless enough linked pairs have time gaps near zero, where changes are not plausible and mistakes can be estimated without confusion. Estimating the changes also requires variation in the time gaps among linked pairs.

To illustrate the usage of the FlexRL package throughout the paper, we consider the Emilia-Romagna regional subset of the SHIW data. The record linkage task can be validated in this example where the linkage structure can be reconstructed. After preparation, the 2012 and 2014 waves cover 1479 and 1524 individuals, with 898 individuals observed in both waves. In Section 4, we analyse a regression of the expected age of retirement in 2014 on the expected age of retirement in 2012.

To link the two survey waves, we use the following variables: year and region of birth, sex, marital status, working status and branch of activity. The strong association between working status and branch of activity violates the PIV independence assumption of the method and may degrade the record linkage performance (Robach, van der Pas, et al., 2025). We thus combine these variables into a single variable ‘occupation’. Although marital status and occupation are ‘dynamic’ PIVs, we do not have enough information to model their temporal changes and set them as ‘flexible’ in the configuration:

PIVs_config <- list(BirthYear     = list(dynamics        = "stable", 
                                         bound_mistakes  = c(0.10, 0.10), 
                                         fix_mistakes    = c(NA, NA)),
                    Sex           = list(dynamics        = "stable",
                                         bound_mistakes  = c(0.10, 0.10),
                                         fix_mistakes    = c(NA, NA)),
                    MaritalStatus = list(dynamics        = "flexible",
                                         bound_mistakes  = c(NA, NA),
                                         fix_mistakes    = c(NA, NA)),
                    BirthRegion   = list(dynamics        = "stable", 
                                         bound_mistakes  = c(0.10, 0.10), 
                                         fix_mistakes    = c(NA, NA)),
                    Occupation    = list(dynamics        = "flexible", 
                                         bound_mistakes  = c(NA, NA), 
                                         fix_mistakes    = c(NA, NA)))

PIVs <- names(PIVs_config)

We prepare the two data sources for the StEM() record linkage algorithm with the prepare_data() function, which takes as inputs the data sources and their labels df2012, df2014, '2012', '2014'; the PIVs configuration PIVs_config; a logical same_mistakes describing whether the parameters fitting the probability of mistakes among PIVs should be the same between data sources (TRUE when the data are sampled from a same source population); a potential record identifier variable uniq_id when available; a logical restrict_support_intersection to harmonise the support of the PIVs in the observed data. In the application, records with birth years outside of the range shared by the sources are excluded.

prep_data <- prepare_data(df2012, df2014, "2012", "2014", PIVs_config, 
                          same_mistakes = TRUE, uniq_id = "ID")
'2014' is the larger source, saved as B; '2012' saved as A.

This function outputs a list suited for StEM(), where data sources have been encoded and labelled as encodedA and encodedB. It additionally includes the number of unique values per PIV n_values, the validated PIVs_config, the logical same_mistakes and a data set of indices of true links true_pairs when uniq_id was provided. It alerts the user to potential issues, including inconsistent configurations, strongly associated PIVs and values outside the common support. For instance, the following warnings appear on the Emilia-Romagna subsets of the 2012 and 2014 waves of the SHIW data:

PIV 'BirthYear': values out of the common support in data1 [1920, 1912] in data2 [2013, 2014].
PIVs 'Occupation' and 'Sex' are associated (Cramer's V = 0.32 in data1, 0.35 in data2); FlexRL assumes conditional independence between PIVs, consider merging or dropping one.

Among the true links, known in this application, there are some registration errors or temporal changes in the PIVs. As a consequence the true links do not necessarily carry the exact same information in their records. With the RL_agreement function, the user can see the proportion of agreements among pairs of records (for example among linked pairs of records or, in the case presented below, among true links).

    BirthYear           Sex MaritalStatus   BirthRegion    Occupation 
         0.99          1.00          0.98          0.99          0.82 

In (tbl-illustration?), we compare the record linkage methods mentioned in Table 1 on this regional subset of the SHIW data. Memory usage is of the same order of magnitude on these relatively small data sets for all methods. The figures and tables based on the SHIW data reflect a single random realisation. They depend on the seed we use in the script and on the seed some other packages use internally.

Naive BRL multilink fastLink reclin2 diyar fedmatch FlexRL
TP 710.00 158.00 160.00 467.00 721.00 20.00 510.00 297.00
FP 3494.00 24.00 72.00 850.00 339232.00 0.00 969.00 103.00
FN 188.00 740.00 738.00 431.00 177.00 878.00 388.00 601.00
sensitivity 0.79 0.18 0.18 0.52 0.80 0.02 0.57 0.33
FDP 0.83 0.13 0.31 0.65 1.00 0.00 0.66 0.26
time (secs) 0.37 17.78 1118.04 33.69 0.84 11.04 8.88 22.57
memory (Mb) 8.30 523.20 1901.90 2436.20 1180.20 699.50 213.20 263.20

Comparison of record linkage methods on the SHIW in Emilia-Romagna (for the default linkage decision rule, see Section 3.3).

3.2 StEM estimation

The FlexRL hierarchical model for record linkage adapts Equation (2) to two sources under the one-to-one assignment constraint. For non-linked records, the true values are independent draws from the population distribution. For a linked pair (i,j)(i,j), Hj,kℬH^{\mathcal B}_{j,k} is a copy of Hi,k𝒜H^{\mathcal A}_{i,k} except when kk is a dynamic PIV, whose values may have changed between the two registrations. The registered values are versions of the true values distorted by registration errors.

With parameters 𝜽=(γ,𝜼,𝜶,𝝓)\boldsymbol{\theta} = (\gamma, \boldsymbol{\eta}, \boldsymbol{\alpha}, \boldsymbol{\phi}), the complete data likelihood factorises as ℒ𝜽(𝐆𝒜,𝐆ℬ,𝐇𝒜,𝐇ℬ,𝚫)=ℒ𝝓𝒜(𝐆𝒜∣𝐇𝒜)ℒ𝝓ℬ(𝐆ℬ∣𝐇ℬ)⏟registration errorsℒ𝜶,𝜼(𝐇ℬ∣𝐇𝒜,𝚫)⏟changes over timeℒ𝜼(𝐇𝒜)⏟true valuesℒγ(𝚫)⏟linkage.(3) \begin{aligned} \mathcal{L}_{\boldsymbol{\theta}} \big( \textbf{G}^{\mathcal{A}}, \textbf{G}^{\mathcal{B}}, \textbf{H}^{\mathcal{A}}, \textbf{H}^{\mathcal{B}}, \boldsymbol{\Delta} \big) = & \underbrace{\mathcal{L}_{\boldsymbol{\phi}^{\mathcal A}} \big( \textbf{G}^{\mathcal{A}} \mid \textbf{H}^{\mathcal{A}} \big) \mathcal{L}_{\boldsymbol{\phi}^{\mathcal B}} \big( \textbf{G}^{\mathcal{B}} \mid \textbf{H}^{\mathcal{B}} \big)}_{\text{registration errors}} \\ & \underbrace{\mathcal{L}_{\boldsymbol{\alpha}, \boldsymbol{\eta}} \big( \textbf{H}^{\mathcal{B}} \mid \textbf{H}^{\mathcal{A}}, \boldsymbol{\Delta} \big)}_{\text{changes over time}} \underbrace{\mathcal{L}_{\boldsymbol{\eta}} \big( \textbf{H}^{\mathcal{A}} \big)}_{\text{true values}} \\ & \underbrace{\mathcal{L}_{\gamma} \big( \boldsymbol{\Delta} \big)}_{\text{linkage}} . \end{aligned} \label{eq-flexrl} \qquad(3)

The parameter 𝝓\boldsymbol{\phi} governs the possible distortion mechanisms (mistakes, missing values) at the source of the differences between registered and latent true values. The parameter 𝜶\boldsymbol{\alpha} shapes the model for temporal changes between latent true values in data sources depending on the chosen ‘structure’ (see the different survival models for Equation (4)). The parameter 𝜼\boldsymbol{\eta} characterises the distributions of the PIVs. The parameter γ\gamma represents the probability that an observation in 𝒜\mathcal A forms a link with an observation in ℬ.\mathcal B. Each component of Equation (3) and each parameter is developed in the original methodological paper (Robach, van der Pas, et al., 2025).

Notably, the probability that true values have not changed between data collections is modelled with a survival function. By default, the package uses an exponential model with proportional hazards. For a dynamic structured PIV kk whose changes are modelled and a linked pair (i,j)(i,j) with time gap ti,j=|tjℬ−ti𝒜|t_{i,j} = |t^{\mathcal B}_j - t^{\mathcal A}_i|: P(Hj,kℬ=Hi,k𝒜∣ti,j,𝒙i,j,Δi,j=1)=S𝜶k(𝒙i,j,ti,j)=exp⁡{−exp⁡(𝒙i,jT𝜶k)ti,j},(4) P\big(H^{\mathcal B}_{j,k} = H^{\mathcal A}_{i,k} \mid t_{i,j}, \boldsymbol{x}_{i,j}, \Delta_{i,j} = 1\big) = S_{\boldsymbol{\alpha}_k}(\boldsymbol{x}_{i,j}, t_{i,j}) = \exp\big\{ - \exp(\boldsymbol{x}_{i,j}^{T} \boldsymbol{\alpha}_k) t_{i,j} \big\}, \label{eq-survival} \qquad(4) where 𝒙i,j\boldsymbol{x}_{i,j} contains an intercept and, optionally, covariates from either data source that explain the hazard of change (for example age or income for a relocation) and 𝜶k\boldsymbol{\alpha}_k contains the log hazard coefficients. The user can choose another survival model, such as a Weibull, a Gompertz, a piecewise constant hazard or any custom model.

The likelihood of the observed data is obtained by summing Equation (3) over all values of the latent 𝐇\textbf{H} and 𝚫.\boldsymbol{\Delta}. FlexRL maximises it with the StEM() function, a Stochastic Expectation Maximisation (StEM) algorithm (Celeux & Diebolt, 1986). In a classical EM, the E-step computes the conditional expectation of the complete likelihood given the observed data. In the stochastic version, this expectation is approximated by Monte Carlo: a Gibbs sampler simulates the latent variables given the current parameters. The averages of the summary statistics collected after burn-in estimate the conditional expectation from which the M-step derives the parameter updates. Algorithm 1 summarises the procedure, detailed hereafter.

Algorithm 1

Input: encoded sources G_A, G_B; PIV configuration;
       N_StEM iterations (burn-in N0_StEM); N_Gibbs iterations (burn-in N0_Gibbs)
Initialise θ = (γ, η, α, φ)
for StEM iter = 1, ..., N_StEM do
    Δ ← 0
    # stochastic E-step
    for Gibbs iter = 1, ..., N_Gibbs do          
        draw H_A, H_B | G_A, G_B, Δ, θ, x, t
        form candidate pairs (i,j) such that H_A[i,k] = H_B[j,k] for all stable or flexible k
        for each non-linked candidate pair: propose to link
        for each linked candidate pair: propose to break the link
        accept each proposal with the likelihood of the model
        if Gibbs iter > N0_Gibbs then
            accumulate summary statistics: 
              number of linked pairs, 
              latent true values distribution, 
              temporal changes in linked (H_A = H_B, x, t), 
              registration errors in linked and non-linked (G = H)
        end if
    end for
    average the accumulated summary statistics # estimate E[ H, Δ | G; θ]
    # M-step
    update and store θ = (γ, η, α, φ)
end for
θ_hat ← average of θ over StEM iter > N0_StEM
run further Gibbs iterations at θ_hat to build D_hat:
D_hat[i,j] ← proportion of iterations in which (i,j) is linked

Stochastic EM for record linkage.

3.2.1 Initialisation

The probability γ\gamma is drawn uniformly in (0.2,0.8)(0.2, 0.8), the distribution of each PIV kk, 𝜼k\boldsymbol\eta_k, is uniform over the NkN_k values, the probabilities of mistakes are drawn in (0.03,0.20)(0.03, 0.20) and the probabilities of missing values are set to the observed proportions. For structured PIVs, the log baseline hazard is drawn between 0.010.01 and 11 per time unit and the covariate coefficients near 0.0. The user can supply other starting values.

3.2.2 Stochastic E-step

Given 𝜽\boldsymbol{\theta}, the Gibbs sampler alternates two blocks. First, the latent true values are drawn. For a non-linked record Hi,k𝒜H^{\mathcal A}_{i,k} or Hj,kℬH^{\mathcal B}_{j,k} is drawn from 𝜼k\boldsymbol\eta_k weighted by the registration model. For a linked pair (Hi,k𝒜,Hj,kℬ)(H^{\mathcal A}_{i,k}, H^{\mathcal B}_{j,k}) is drawn jointly among the Nk×NkN_k \times N_k possible values, from 𝜼k\boldsymbol\eta_k weighted by the registration model and the survival model.

Second, the linkage is updated. Candidate pairs are formed from matching sampled latent true values: records i∈𝒜i \in \mathcal A and j∈ℬj \in \mathcal B are candidates when Hi,k𝒜=Hj,kℬH^{\mathcal A}_{i,k} = H^{\mathcal B}_{j,k} for every non-structured PIV kk (stable or flexible). For each candidate pair (i,j)(i,j), we evaluate the log likelihood contribution to Equation (3) when the records are linked, log⁡ℒi,jlinked\log \mathcal L^{\text{linked}}_{i,j}, and when they are not, log⁡ℒi𝒜+log⁡ℒjℬ.\log \mathcal L^{\mathcal A}_i + \log \mathcal L^{\mathcal B}_j. A sequential sweep over the candidate pairs then proposes to create or break links. A proposal is accepted by comparing the proposed ‘new’ state of Equation (3) to the current ‘old’ state with probability ℒnew/(ℒold+ℒnew)\mathcal L_{\text{new}} / (\mathcal L_{\text{old}} + \mathcal L_{\text{new}}); the two states differ by log⁡ℒi,jlinked−log⁡ℒi𝒜−log⁡ℒjℬ\log \mathcal L^{\text{linked}}_{i,j} - \log \mathcal L^{\mathcal A}_i - \log \mathcal L^{\mathcal B}_j and by the contributions from changes in the linkage matrix.

Over the Gibbs iterations, the sampler stochastically explores the latent space of possible linkage matrices and PIVs true values. At each iteration after burn-in we store the number of pairs that were linked, the distribution of latent true values, the temporal changes (disagreements between the linked records latent true values) and the registration errors (disagreements between 𝐆\textbf{G} and 𝐇\textbf{H})—summary statistics required for the M-step.

Restricting the sweep to candidate pairs keeps the algorithm light in memory: likelihood contributions are computed only for these pairs and for the remaining non-linked records in each data source, which together represent the estimated unique entities in the population.

3.2.3 M-step

The summary statistics averaged over the Gibbs draws after burn-in give the parameter updates. Thanks to the factorisation of Equation (3), γ\gamma, 𝜼\boldsymbol{\eta} and 𝝓\boldsymbol{\phi} have separate closed form updates (Robach, van der Pas, et al., 2025), and 𝜶\boldsymbol{\alpha} is obtained by numerical optimisation. Optional bounds on the probabilities of a mistake are applied at this stage. A warning is displayed when a bound is reached in many iterations, suggesting that the bound is too tight or that the PIV is dynamic.

3.3 Linkage scores and decision rule

Based on the StEM chains of estimates, we build an estimate of the set of parameters, 𝜽̂\widehat{\boldsymbol{\theta}}, by averaging the post burn-in elements in the sequence. These are used to sample further linkage matrices that are averaged to return a probabilistic estimate of 𝚫\boldsymbol{\Delta} as a final output, namely 𝑫̂\widehat{\boldsymbol{D}}, whose entries D̂i,j\widehat{D}_{i,j} are the posterior probabilities for the pair (i,j)(i,j) to be linked, which we call the linkage scores. A decision rule on each entry ξ∈[0.5,1)\xi \in [0.5,1) then defines the final set of linked data 𝒟={(i,j);D̂i,j>ξ}.\mathcal{D} = \{(i,j) ; \widehat{D}_{i,j} > \xi\}. Since the scores of a record sum to at most one, a threshold of at least 0.50.5 ensures the one-to-one assignment (Sadinle, 2017; Tancredi & Liseo, 2011). The choice of ξ\xi is the subject of the upcoming Section 4.

Note that probabilistic record linkage methods estimate 𝚫\boldsymbol{\Delta} in comparable ways, by classifying pairs according to their linkage scores. Although these scores may be on different scales (e.g. likelihood ratios, log odds, posterior probabilities), they can be mapped to a probability scale. Hereafter, we take linkage scores to be posterior linkage probabilities in [0,1][0,1] and treat all the methods listed in Table 1 in the same way. Accordingly, the default decision rule is ξ=0.5.\xi=0.5. The ‘FDP versus linkage decision rule’ curves (see Figure 3) provide a more comprehensive assessment of record linkage performance.

3.4 Record linkage with StEM()

StEM() runs Algorithm 1. Its main arguments are:

  • data: a list, typically the output of prepare_data(), with the encoded sources encodedA and encodedB, the number of distinct values of each PIV n_values (excluding missing values), a logical indicating whether both sources share the registration error parameters same_mistakes, and the PIVs configuration PIVs_config.
  • StEM_iter, StEM_burnin, gibbs_iter, gibbs_burnin: the numbers of iterations of the outer StEM algorithm and of the inner Gibbs sampler, and their burn-in periods. gibbs_burnin = 0 sets the burn-in automatically: the sampler runs until the number of links changes by fewer than 10 for 10 consecutive iterations, with a maximum of 500 iterations.
  • threads: the number of OpenMP threads used by the Rcpp samplers, default 4. The argument is ignored on systems where the package is built without OpenMP.
  • model_dynamics: the survival model for structured PIVs, by default the exponential model of Equation (4). It is only used if a PIV is declared structured in PIVs_config.
  • n_post_sample: the number of posterior draws used to compute the linkage scores.
  • Starting values for γ\gamma and for the agreement probabilities 1−𝝓1-\boldsymbol\phi can be supplied.
  • For long runs, new_directory and save_info_iter = TRUE save the environment after each StEM iteration, and music_on = TRUE plays a short tune when the algorithm finishes running.

The function returns Delta, a data frame with columns i (indices in 𝒜\mathcal A), j (indices in ℬ\mathcal B) and x (scores D̂i,j\widehat{D}_{i,j}) for every pair with a positive score, and the four chains: gamma (a vector of length StEM_iter), eta (one StEM_iter×Nk\times N_k matrix per PIV), alpha (one matrix per structured PIV, with StEM_iter rows and one column per parameter of the survival model) and phi (one StEM_iter×4\times 4 matrix per PIV: agreement in 𝒜\mathcal A, in ℬ\mathcal B, missing in 𝒜\mathcal A, in ℬ\mathcal B).

We run the FlexRL StEM algorithm for record linkage as follows:

fit <- StEM(data = prep_data)

3.5 Computational aspects

The two latent variable samplers are implemented with Rcpp. To draw the true values, sampleH() goes through the Nk2N_k^2 joint values once per PIV kk for linked pairs and through the NkN_k values once per PIV kk for non-linked records. sampleD() performs the sequential sweep over candidate pairs, recording the current linkage in two vectors that give, for each record of 𝒜\mathcal A and of ℬ\mathcal B, the index of the record it is linked to (or a negative value when not linked). Reading and updating the linkage takes a fixed number of operations, so the sweep is linear in the number of candidate pairs and the memory is linear in the number of records N𝒜+NℬN_{\mathcal A} + N_{\mathcal B} rather than in N𝒜×Nℬ.N_{\mathcal A} \times N_{\mathcal B}.

Candidate pairs are found by hashing the pattern of sampled true values on the non-structured PIVs, an operation linear in N𝒜+Nℬ.N_{\mathcal A} + N_{\mathcal B}. Their contributions to the complete data likelihood are computed in a single pass over the records and the candidate pairs, implemented in Rcpp. Built-in survival models are evaluated in Rcpp; custom survival functions keep their R implementation.

The single pass over the candidate pairs likelihood contributions can be parallelised over OpenMP threads, each processing a disjoint set of candidates. Without OpenMP the code runs sequentially. All random draws occur upstream, so the threads never call the R random number generator. Results are therefore identical regardless of the number of threads, and set.seed() ensures reproducibility.

Running time grows with the number of records; the number of candidate pairs, larger when PIVs have few levels; the number of PIVs and their numbers of levels; the number of structured PIVs, whose survival model is estimated at each iteration; the number of iterations; and decreases with the number of threads.

4 Inference on linked data

4.1 Impact of linkage errors on linear regression

Suppose we are interested in estimating the association between XX recorded in 𝒜\mathcal A and YY recorded in ℬ\mathcal B, for instance through the slope β\beta of the linear regression Y=Xβ+εY = X\beta + \varepsilon, with 𝔼[ε]=0\mathbb E[\varepsilon]=0 and 𝔼[Xε]=0\mathbb E[X \varepsilon]=0, so that β̂=Cov⁡(X,Y)/Var⁡(X).(5)\widehat \beta = \operatorname{Cov}(X,Y)/\operatorname{Var}(X). \label{eq-beta-hat-0} \qquad(5) The target is β\beta in the population of entities present in both sources. The analyst only observes the linked data 𝒟={(i,j);D̂i,j>ξ}\mathcal{D} = \{(i,j) ; \widehat{D}_{i,j} > \xi\} with XiX_i from 𝒜\mathcal A and YjY_j from ℬ.\mathcal B. YjY_j equals YiY_i for truly linked pairs but belongs to another entity for falsely linked records. Among the linked data, a proportion 1−FDP1-\text{FDP} (that may in reality depend on XX) carries the correct YY and a proportion FDP\text{FDP} carries a spurious one. Below we denote by 𝚫̂\widehat{\boldsymbol{\Delta}} the estimator of 𝚫\boldsymbol{\Delta}, with Δ̂i,j=1\widehat{\Delta}_{i,j} = 1 for pairs (i,j)(i,j) in 𝒟.\mathcal{D}. Truly linked pairs of records (true positives, TP) are thus denoted {𝚫̂=1,𝚫=1}\{ \widehat{\boldsymbol{\Delta}} = 1, \boldsymbol{\Delta} = 1 \} and falsely linked pairs of records (false positives, FP) {𝚫̂=1,𝚫=0}.\{ \widehat{\boldsymbol{\Delta}} = 1, \boldsymbol{\Delta} = 0 \}. Heuristically, 𝔼[Y∣X,𝚫̂=1]=(1−FDP)⋅𝔼[Y∣X,𝚫̂=1,𝚫=1]+FDP⋅𝔼[Y∣X,𝚫̂=1,𝚫=0]=(1−FDP)⋅𝔼TP[Y∣X]+FDP⋅𝔼FP[Y∣X], \begin{aligned} \mathbb E[ Y \mid X, \widehat{\boldsymbol{\Delta}} = 1 ] & = (1-\text{FDP}) \cdot \mathbb E[ Y \mid X, \widehat{\boldsymbol{\Delta}} = 1, \boldsymbol{\Delta} = 1 ] + \text{FDP} \cdot \mathbb E[ Y \mid X, \widehat{\boldsymbol{\Delta}} = 1, \boldsymbol{\Delta} = 0] \\ & = (1-\text{FDP}) \cdot \mathbb E_{TP}[ Y \mid X ] + \text{FDP} \cdot \mathbb E_{FP}[ Y \mid X ], \end{aligned} where 𝔼TP\mathbb E_{TP} and 𝔼FP\mathbb E_{FP} denote expectations among truly and falsely linked pairs.

Let us recast β̂\widehat\beta accordingly. If XX has the same mean and variance among all data in 𝒜\mathcal{A}, then β̂\widehat\beta is a mixture of β̂TP\widehat\beta_{TP} and β̂FP\widehat\beta_{FP}, defined as in Equation (5) for the subsets of TP and FP, β̂=(1−FDP)⋅β̂TP+FDP⋅β̂FP.(6) \widehat\beta = (1-\text{FDP}) \cdot \widehat\beta_{TP} + \text{FDP} \cdot \widehat\beta_{FP}. \label{eq-beta-hat} \qquad(6) Linkage errors are often assumed to occur at random, in which case 𝔼FP[Y∣X]=𝔼FP[Y]\mathbb E_{FP}[ Y \mid X ] = \mathbb E_{FP}[ Y ] and β̂FP=0.\widehat\beta_{FP} = 0. However, the PIVs, often demographic, are likely to be associated with variables of interest in the analysis, so it is more realistic to consider an association between XX and YY among falsely linked pairs.

The estimation error of the analysis can be decomposed into two parts: β̂−β=(β̂TP−β)⏟sampling bias+(β̂−β̂TP)⏟contamination bias. \widehat\beta - \beta = \underbrace{(\widehat\beta_{TP} - \beta)}_{\text{sampling bias}} \:\:\: + \underbrace{(\widehat\beta - \widehat\beta_{TP})}_{\text{contamination bias}}. Missed links may cause sample selection and falsely linked data may cause measurement error in the linked variables (Doidge & Harron, 2019; Robach et al., 2026; Wang et al., 2022).

4.1.1 Linkage decision rule trade-off

Raising the threshold ξ\xi on the linkage scores reduces the number of falsely linked pairs, which lowers the FDP and hence the contamination bias. Falsely linked data would distort the signal in proportion to the FDP. Indeed, from Equation (6) we derive: β̂−β̂TP⏟contamination bias=FDP(β̂FP−β̂TP).(7) \underbrace{\widehat\beta - \widehat\beta_{TP}}_{\text{contamination bias}} = \text{FDP} (\widehat\beta_{FP} - \widehat\beta_{TP}). \label{eq-beta-contamination} \qquad(7)

However, raising the threshold ξ\xi also selects fewer and more atypical records, which may increase the sampling bias due to the implicit record linkage selection. Indeed, the chance of being linked may be related to XX; in the context of linear regression, this yields: β̂TP−β⏟sampling bias=Cov⁡TP(X,βX+ε)Var⁡TP(X)−β=Cov⁡TP(X,ε)Var⁡TP(X).(8) \underbrace{\widehat\beta_{TP} - \beta}_{\text{sampling bias}} = \frac{\operatorname{Cov}_{TP}(X,\beta X + \varepsilon)}{\operatorname{Var}_{TP}(X)} - \beta = \frac{\operatorname{Cov}_{TP}(X,\varepsilon)}{\operatorname{Var}_{TP}(X)}. \label{eq-beta-sampling} \qquad(8)

These aspects motivate the complementary tools we develop in FlexRL to quantify these two biases. Estimating the FDP (see Section 4.2) and evaluating the divergence of the linked sample from the data sources (see Section 4.3) over a range of values of ξ\xi may help users appraise this trade-off.

4.2 False discovery proportion

For the decision rule ξ∈[0.5,1)\xi \in [0.5, 1), the FDP is FDP(ξ)=FP(ξ)/{TP(ξ)+FP(ξ)}\text{FDP}(\xi) = \text{FP}(\xi) / \{\text{TP}(\xi) + \text{FP}(\xi)\} where TP(ξ)\text{TP}(\xi) and FP(ξ)\text{FP}(\xi) are the numbers of truly and falsely linked pairs. In real data applications this quantity is unknown. Linkage errors can be estimated from the scores of the linkage model (Belin & Rubin, 1995; Enamorado et al., 2019; Resnick & Asher, 2019), from synthetic data (Lam et al., 2024; Robach, Hof, et al., 2025) or from a separate model under conditions on the distribution of the number of records per entity (Blakely & Salmond, 2002; Dasylva & Goussanou, 2020, 2022). FlexRL implements the first two estimation procedures. We focus on the FDP because it drives the contamination bias of Equation (7); the sampling bias is addressed by the diagnostics of Section 4.3. The estimators are provided as functions of ξ\xi, together with the linked sample size available for inference, so that the user can choose a threshold controlling the estimated FDP (and hopefully, the true underlying FDP).

4.2.1 Score based estimator

If the linkage model is well calibrated, D̂i,j\widehat{D}_{i,j} should represent the probability that the pair (i,j)(i,j) is a true link, and the expected number of truly linked pairs among linked data is ∑(i,j)D̂i,j𝟙{D̂i,j>ξ}\sum_{(i,j)} \widehat{D}_{i,j} \mathbb 1 \{\widehat{D}_{i,j} > \xi\} (Enamorado et al., 2019; Robach, Hof, et al., 2025). Therefore FDP̂(ξ)=1−∑(i,j)D̂i,j𝟙{D̂i,j>ξ}∑(i,j)𝟙{D̂i,j>ξ}.(9) \widehat{\text{FDP}}(\xi) = 1 - \frac{\sum_{(i,j)} \widehat{D}_{i,j} \mathbb 1 \{\widehat{D}_{i,j} > \xi\}}{\sum_{(i,j)} \mathbb 1 \{\widehat{D}_{i,j} > \xi\}} . \label{eq-fdp-model} \qquad(9) This estimator comes at no extra cost for any method that returns linkage scores, but it is only as good as the linkage model.

Notably, the calibration of the scores and the record linkage performance are affected by missing values and mistakes, the size of the overlap between the sources, the number of entities in the population, the discriminative power of the PIVs, their changes over time, and their marginal and joint distributions. The literature discusses the strengths and limitations of different record linkage paradigms in detail, including comparisons of FlexRL and BRL across a range of configurations (Robach, van der Pas, et al., 2025; Robach, Hof, et al., 2025).

4.2.2 Synthetic data estimator

An estimator that does not rely on linkage scores can be computed with synthetic data (Robach, Hof, et al., 2025). Source ℬ\mathcal B is augmented with NsynthN_{\text{synth}} synthetic records, drawn from a generative model fitted on the PIVs of ℬ\mathcal B—for example arf (Watson et al., 2023), synthpop (Nowok et al., 2016) or mice (Buuren & Groothuis-Oudshoorn, 2011). Synthetic records by definition do not form a link in 𝒜\mathcal A, so synthetic links can represent false positives when links and non-links have similar distributions (Robach, Hof, et al., 2025). Then FPsynth(ξ)\text{FP}_{\text{synth}}(\xi) is rescaled by Nℬ/NsynthN_{\mathcal B}/N_{\text{synth}}, which follows from equating FP(ξ)/(N𝒜⋅Nℬ)\text{FP}(\xi) / (N_{\mathcal A} \cdot N_{\mathcal B}) with FPsynth(ξ)/(N𝒜⋅Nsynth)\text{FP}_{\text{synth}}(\xi) / (N_{\mathcal A} \cdot N_{\text{synth}}). As for the score based estimator, TP(ξ)+FP(ξ)\text{TP}(\xi) + \text{FP}(\xi) corresponds to the number of (real) linked pairs Nreal(ξ)=∑(i,j)𝟙{D̂i,j>ξ}N_{\text{real}}(\xi) = \sum_{(i,j)} \mathbb 1 \{\widehat{D}_{i,j} > \xi\}: FDP̂synth(ξ)=FPsynth(ξ)⋅Nℬ/NsynthNreal(ξ).(10) \widehat{\text{FDP}}_{\text{synth}}(\xi) = \frac{\text{FP}_{\text{synth}}(\xi) \cdot N_{\mathcal B} / N_{\text{synth}}}{N_{\text{real}}(\xi)}. \label{eq-fdp-synth} \qquad(10) The procedure is repeated over several synthetic draws and the results are averaged. The estimator does not depend on the linkage model, but it depends on the quality of the data synthesis.

When the two estimators disagree, a practitioner should rely on the one whose assumptions are more plausible. The score based estimator relies on the correct specification of the linkage model, including its specific assumptions. It reflects the performance the model would achieve under correct specification. The synthetic data estimator relies on the fidelity of the synthesiser and on the assumption that links and non-links have similar distributions. Earlier work assessed both estimators robustness to the degree of overlap between the data sources, the discriminative power of the PIVs and differences between the PIV distributions of true links and non-links (Robach, Hof, et al., 2025), but not to deviations from PIV independence. In the SHIW in Emilia-Romagna application, the PIV independence is violated (occupation and sex are associated; see the warning in Section 3.1). For models assuming independent PIVs, such as FlexRL and Fellegi-Sunter mixture models (see Equation (1)), we expect the score based estimator to be biased, as its validity rests on the violated assumption. The synthetic data estimator though, should remain valid provided the synthesiser captures the dependencies among PIVs. This is in line with what we observe in the output of (fig-print-output?).

4.3 Representativeness of the linked sample

As explained in Section 4.1, the linked sample may differ from the data sources in ways the analyst cannot see (Doidge & Harron, 2019; Robach et al., 2026; Wang et al., 2022). In particular, we appraise the sampling bias of Equation (8) by comparing the distributions of variables of interest between the linked data (‘selected’ through record linkage) and the original data sources. For any decision rule ξ∈[0.5,1)\xi \in [0.5, 1), FlexRL compares each source with its linked subset using the following measures, computed on sets of variables 𝒱𝒜\mathcal V_{\mathcal A} and 𝒱ℬ\mathcal V_{\mathcal B} available in sources 𝒜\mathcal A and ℬ\mathcal B respectively:

  • Agreement rates: the proportion of linked pairs whose records agree on vv, for each variable v∈𝒱𝒜∩𝒱ℬv \in \mathcal V_{\mathcal A} \cap \mathcal V_{\mathcal B} (such as the PIVs).
  • Standardised Mean Differences (SMD): (mean(vlinked)−mean(vsource))/sd(vsource)(\text{mean}(v_{\text{linked}}) - \text{mean}(v_{\text{source}})) / \text{sd}(v_{\text{source}}), for a continuous variable vv in a given set; the same quantity is computed for the indicator of each level when vv is categorical.
  • Overlap of supports (support IoU): the Intersection over Union (IoU) of the sets of values taken in the linked sample and in the source, for a variable vv in a given set.
  • Maximum Mean Discrepancy (MMD): a multivariate measure of the difference between the linked sample and the source, computed jointly over a given set of variables, with a Gaussian kernel and the median heuristic for the bandwidth (Gretton et al., 2012).

These quantities are computed over a grid of values of ξ.\xi. They are built on the declared pairs and, when available, their linkage scores; they therefore apply to any linkage method.

In (tbl-demonstration-2?) we proceed with the demonstration of Section 2.4 showcasing the functionalities of FlexRL on a simulation study. The synthetic data FDP estimates (‘est. FDP* synth’) are not reliable for fedmatch and FlexRL (dynamics), possibly because of the specific linkage procedures these packages implement. For FlexRL (dynamics), the cause is likely the misspecified PIV dynamics model, or the added difficulty of estimating the FDP under modelling of PIV dynamics, since the estimate for FlexRL (no dynamics) is reliable.

Naive BRL multilink fastLink reclin2 diyar fedmatch FlexRL (dynamics) FlexRL (no dynamics)
TP 118.40 (5.13) 80.40 (5.04) 80.60 (5.95) 101.70 (6.48) 114.10 (6.38) 34.90 (20.24) 122.10 (6.33) 114.00 (7.92) 87.50 (8.30)
FP 83.10 (11.02) 12.30 (3.23) 14.20 (4.13) 43.10 (5.59) 68.30 (8.82) 3.30 (2.91) 125.80 (6.32) 25.90 (5.15) 19.00 (4.67)
FN 81.60 (5.13) 119.60 (5.04) 119.40 (5.95) 98.30 (6.48) 85.90 (6.38) 165.10 (20.24) 77.90 (6.33) 86.00 (7.92) 112.50 (8.30)
sensitivity 0.59 (0.03) 0.40 (0.03) 0.40 (0.03) 0.51 (0.03) 0.57 (0.03) 0.17 (0.10) 0.61 (0.03) 0.57 (0.04) 0.44 (0.04)
FDP 0.41 (0.03) 0.13 (0.03) 0.15 (0.04) 0.30 (0.03) 0.37 (0.03) 0.08 (0.05) 0.51 (0.03) 0.18 (0.03) 0.18 (0.04)
est. FDP score NA 0.19 (0.02) NA 0.37 (0.02) 0.44 (0.03) NA 0.10 (0.01) 0.20 (0.01) 0.18 (0.02)
est. FDP* score NA 0.21 (0.02) NA 0.39 (0.02) 0.43 (0.07) NA 0.10 (0.01) 0.21 (0.01) 0.19 (0.02)
est. FDP* synth NA 0.18 (0.10) 0.20 (0.05) 0.33 (0.07) 0.45 (0.14) 0.14 (0.07) 0.08 (0.03) 0.37 (0.11) 0.27 (0.08)
max SMD NA 0.22 (0.05) 0.22 (0.06) 0.17 (0.03) 0.24 (0.04) 0.68 (0.31) 0.15 (0.03) 0.17 (0.04) 0.22 (0.04)
min support IoU NA 0.80 (0.01) 0.80 (0.01) 0.80 (0.01) 0.80 (0.01) 0.76 (0.10) 0.82 (0.03) 0.82 (0.03) 0.81 (0.02)
max MMD NA 0.01 (0.00) 0.01 (0.00) 0.01 (0.00) 0.01 (0.00) 0.08 (0.05) 0.01 (0.00) 0.01 (0.00) 0.01 (0.00)
time (secs) 0.27 (0.04) 0.97 (0.05) 18.57 (1.48) 1.29 (0.24) 0.29 (0.01) 1.17 (0.06) 1.44 (0.01) 4.59 (0.02) 3.72 (0.01)
memory (Mb) 1.04 (0.05) 78.60 (10.08) 105.68 (10.18) 24.85 (4.42) 41.52 (0.18) 104.31 (10.84) 42.14 (2.59) 102.11 (9.03) 70.18 (6.42)

Linkage performance of competing record linkage methods on simulated data for the default decision rule ξ=0.5\xi=0.5, with linked data quality assessed through FlexRL. The * symbol denotes the record linkage augmented task, see Section 4.2. We report average performance over 10 replications, with standard deviations in parentheses.

This short simulation study demonstrates the potential of the FlexRL package. Since FlexRL provides linked data quality diagnostics for any record linkage method, we report three estimates of the FDP along with measures of the divergence of the linked sample from the data sources. Section 4.2 presented the FDP estimators implemented in the package and Section 4.3 discussed the measures of divergence. The FDP estimators are averaged over 5 procedures in each of the 10 replications.

4.4 Diagnostics

RL_diagnostics() gathers the tools of Section 4.2 and Section 4.3, summarised in Table 2, and returns an S3 object of class RL_diagnostics, with print and plot methods. All measures are computed over a grid of thresholds ξ∈[0.5,1)\xi \in [0.5,1) (when the linkage method allows it by returning scores) or for a fixed threshold when specified. Each diagnostic can also be computed on its own. We present all commands hereafter but show only some outputs. Further details on these diagnostic tools are given in the package vignette ‘Linkage and Diagnostics with FlexRL’ available through vignette('FlexRL-RL-vignette', 'FlexRL') or the online documentation.

Table 2: Diagnostics performed by RL_diagnostics().
Diagnostic Computation Display
Convergence plot_StEM_convergence() on the chains returned by StEM() plot(x, 'convergence')
Linkage scores plot_linkage_scores() plot(x, 'scores')
FDP estimation compute_RL_FDP_score() (Equation (9)), compute_augmRL_FDP_synth() (Equation (10)) plot(x, 'FDP')
Discrepancy measures smd(), support_iou(), mmd(), RL_agreement() plot(x, 'discrepancy')
Data comparison plot_distributions() on each source and its linked subset plot(x, 'distributions')

The function takes several arguments as input. The record linkage output fit, the data sources encodedA and encodedB, the set of variables of interest to compare compare_vars, their type vars_type_cont (TRUE if continuous) and the PIVs are passed to RL_diagnostics(), which computes FDP estimates and discrepancy measures that characterise the linked sample across a grid of thresholds ξ.\xi. The true_pairs enables reporting the true FDP and sensitivity when known.

compare_vars <- c("BirthYear", "Sex", "MaritalStatus", 
                  "BirthRegion", "Occupation")

vars_type_cont <- list(BirthYear = TRUE, Sex = FALSE, MaritalStatus = FALSE,
                       BirthRegion = FALSE, Occupation = FALSE)

diag <- RL_diagnostics(fit, prep_data$encodedA, prep_data$encodedB,
                       compare_vars, vars_type_cont, PIVs,
                       true_pairs = prep_data$true_pairs, FDP_estimation = TRUE,
                       RL_method = "FlexRL", data = prep_data)

The FDP estimation is optional (FDP_estimation = TRUE) since it can be time consuming. For a given RL_method, it is repeated n_repeats times and the estimates are averaged. compute_RL_FDP_score() returns the score based estimate on the original task. compute_augmRL_FDP_synth() adds n_synth records generated by synth_method to ℬ\mathcal B, links the augmented sources as an auxiliary task and computes both the score based and the synthetic data estimates on it. Similar score based estimates on the original and augmented tasks support the use of the synthetic data estimator. (tbl-demonstration-2?) reported these three estimates as ‘est. FDP score’, ‘est. FDP* score’, ‘est. FDP* synth’.

The plot(x, type) method for an object of class RL_diagnostics draws the plots listed in Table 2, with type being one of 'convergence', 'scores', 'FDP', 'discrepancy' and 'distributions'. With the 'convergence' plots, we could verify that the StEM chains have stabilised.

plot(diag, 'convergence')

With the 'scores' plot, we can analyse the distribution of the linkage scores of the fit as shown in Figure 2.

plot(diag, 'scores')

Fig 2: Distribution of the linkage scores returned by FlexRL StEM() on the SHIW in Emilia-Romagna.

Albeit bimodal, the distribution of linkage scores produced by the record linkage algorithm does not indicate where to set the threshold ξ.\xi. The FDP estimation results and the divergence plots may help further. In Figure 3 we show the 'FDP' plot and some of the 'discrepancy' plots for the MMD and the SMD. Similar plots for the overlap of supports and the agreement rate are usually displayed by plot(diag, 'discrepancy').

plot(diag, 'FDP')

plot(diag, 'discrepancy')

Fig 3: Estimated FDP and discrepancy measures against the linkage decision rule threshold obtained with FlexRL RL_diagnostics() on the SHIW in Emilia-Romagna.

The graphics from Figure 3 show how each linkage decision rule affects linked data quality. They illustrate the trade-off of Section 4.1: as the threshold ξ\xi increases, the estimated FDP diminishes while the divergence of the linked sample from the sources grows. Ideally, we choose an appropriate threshold for inference at the ‘elbow’ of the divergence curves, provided that the estimated FDP at that level is reasonable. This decision rule is a heuristic motivated by the potential impact of linkage errors on inference (Doidge & Harron, 2019; Lahiri & Larsen, 2005; Robach et al., 2026; Tancredi & Liseo, 2015; Wang et al., 2022) and its reliability has not been assessed. Note that the divergence measures are indicators of the sampling bias but do not estimate Equation (8). For our example, we choose ξ=0.86\xi = 0.86 following this rule, as indicated by the vertical line in Figure 3.

With the 'distributions' plots, we could compare the distribution of the linked data and of the data sources at the selected threshold—for example ξ=0.86.\xi = 0.86.

plot(diag, 'distributions', threshold = 0.86)

The print() method for an S3 object of class RL_diagnostics reports the linked sample size, the FDP estimates, the true FDP and sensitivity when available, and the discrepancy measures. We report the output in (fig-print-output?). As discussed in Section 4.2, the FDP estimators have different strengths and weaknesses. In the SHIW in Emilia-Romagna, the synthetic data estimator yields an estimate of 0.07 and the score based estimator yields an estimate of 0.01, compared with the true value of 0.15.

print(diag, threshold = 0.86)
  Linked pairs  (score > 0.86):  282
  FDP           (true pairs):    0.16
  Sensitivity   (true pairs):    0.26
  FDP score estimate (RL task):            min threshold 0.50: FDP ~ 0.12 (sd 0.00)
                                               threshold 0.86: FDP ~ 0.02 (sd 0.00)
                                           max threshold 0.99: FDP ~ 0.00 (sd 0.00)
  FDP score estimate (augmented RL task):  min threshold 0.50: FDP ~ 0.13 (sd 0.00)
                                               threshold 0.86: FDP ~ 0.03 (sd 0.00)
                                           max threshold 0.99: FDP ~ 0.00 (sd 0.00)
  FDP synth estimate (augmented RL task):  min threshold 0.50: FDP ~ 0.19 (sd 0.06)
                                               threshold 0.86: FDP ~ 0.10 (sd 0.07)
                                           max threshold 0.99: FDP ~ 0.04 (sd 0.07)
  Multivariate MMD  (linked A vs. A):  0.07
  Multivariate MMD  (linked B vs. B):  0.06
  SMD BirthYear                          (linked A vs. A):  -0.01
  SMD Sex values: {1, 2}                 (linked A vs. A):  -0.01, 0.01
  SMD MaritalStatus values: {2, 3, ...}  (linked A vs. A):  -0.14, 0.19, ...
  SMD BirthRegion values: {13, 17, ...}  (linked A vs. A):  0.35, -0.59, ...
  SMD Occupation values: {7, 25, ...}    (linked A vs. A):  -0.73, 0.24, ...
  SMD BirthYear                          (linked B vs. B):  -0.08
  SMD Sex values: {1, 2}                 (linked B vs. B):  -0.01, 0.01
  SMD MaritalStatus values: {2, 3, ...}  (linked B vs. B):  -0.16, 0.13, ...
  SMD BirthRegion values: {17, 18, ...}  (linked B vs. B):  -0.47, 0.30, ...
  SMD Occupation values: {7, 10, ...}    (linked B vs. B):  -0.71, 0.22, ...

Example of output from the print() method on FlexRL RL_diagnostics class, at threshold 0.86, on the SHIW in Emilia-Romagna.

Across the diagnostics, record linkage is run through wrappers with a common form, link_with_<pkg>(dataA, dataB, ...), returning the indices of linked pairs and their linkage score. Wrappers exist for FlexRL, fastLink, BRL, reclin2, multilink, diyar and fedmatch. That way, the diagnostic tools apply to any of these methods in a similar fashion.

On the illustrative example developed along this article, we regress the expected age of retirement in 2014 on the expected age of retirement in 2012 (originally named ‘etapen’ in each wave). After preparation of the SHIW in Emilia-Romagna data for record linkage (see prepare_data() in Section 3.1), we work with 1479 and 1524 records in the two data sources, which share 898 true links. The solid red line in Figure 4 is the reference estimate computed on these true links.

The tools presented so far help identify a suitable linkage threshold by assessing the trade-off between contamination and sampling bias. In Figure 4, a low threshold ξ=0.55\xi=0.55 yields a linked data estimate (dotted orange) affected by contamination bias, due to noisy falsely linked data (short dashed yellow estimate); see Equation (7). Conversely, a high threshold ξ=0.99\xi=0.99 yields a linked data estimate (dotted orange) affected by sampling bias, due to atypical truly linked data (long dashed yellow estimate); see Equation (8).

Guided by the diagnostic tools, we choose ξ=0.86\xi = 0.86, which yields a linked data estimate (dotted orange) closer to the reference. At this threshold, we retain 282 linked observations, corresponding to an FDP of 0.16 and a sensitivity of 0.26.

Fig 4: Regression analysis on the SHIW in Emilia-Romagna linked through FlexRL.

5 Scalability

In (tbl-illustration?) of Section 3, we compared record linkage methods on the SHIW in Emilia-Romagna. Despite heterogeneous linkage performance, running time and memory usage, all methods ran at that scale. To complete our investigation, we demonstrate the scalability of FlexRL and examine that of other record linkage methods on the complete SHIW data sets. After preparation, the 2012 and 2014 waves over the 20 Italian regions cover 19215 and 20002 individuals, with 10568 individuals observed in both waves. We consider two settings, without and with regional blocking. Note that blocking on the region assumes that this variable is stable and free of registration errors.

In Section 3.1, we showed the proportion of agreements between the information carried by records among true links of the SHIW in Emilia-Romagna. Below we show the proportion of agreements among true links of the complete SHIW data. In this application, the region is indeed free of registration errors and stable.

    BirthYear           Sex MaritalStatus   BirthRegion    Occupation 
         0.99          1.00          0.98          1.00          0.82 
       Region 
         1.00 

Record linkage becomes harder on large data sets: the discriminative power of the PIVs is unlikely to grow with the size of the sources, whereas the number of candidate records in ℬ\mathcal B for each record in 𝒜\mathcal A does. Without blocking, we may therefore expect higher FDPs and also higher sensitivities, since true links that blocking excludes (due to registration errors or changes between waves) become recoverable. However, in the complete SHIW the region is stable and error free so the expected gain does not apply. FDPs and sensitivities are similar without and with blocking for the comparable methods, except for FlexRL which has both a higher FDP and a higher sensitivity without blocking. Note that prepare_data() eliminates out-of-support records at regional levels, which explains the differences in the partial confusion matrix of the ‘Naive’ method between (tbl-scalability?) and (tbl-scalability-block?).

Below, we report the number of unique values of each PIV in the SHIW in Emilia-Romagna and in the complete SHIW. These counts indicate the discriminative power of the PIVs in the regional and national applications. In addition, we appraise the difficulty of the tasks, without and with regional blocking, through the performance of the ‘Naive’ approach in (tbl-scalability?) and (tbl-scalability-block?), which reflects how many records share the same combination of PIV values.

    BirthYear           Sex MaritalStatus   BirthRegion    Occupation 
           94             2             4            18            52 
    BirthYear           Sex MaritalStatus   BirthRegion    Occupation 
           99             2             4            20            84 
       Region 
           20 

(tbl-scalability?) presents the comparative study without blocking; ‘Not Available’ results indicate memory errors. When supported, methods run with four threads (threads for FlexRL, n.cores for fastLink, nthread for fedmatch). (tbl-scalability-block?) shows the results with blocking on the Italian regions. More details on this data application showcasing the scalability of FlexRL are given in the package vignette ‘Scalable Record Linkage with FlexRL’ available through vignette('FlexRL-RL-block-vignette', 'FlexRL') or the online documentation.

Naive BRL multilink fastLink reclin2 diyar fedmatch FlexRL
TP 8289.00 NA NA 5061.00 NA NA 5057.00 4105.00
FP 49350.00 NA NA 11175.00 NA NA 14154.00 5417.00
FN 2279.00 NA NA 5507.00 NA NA 5511.00 6463.00
sensitivity 0.78 NA NA 0.48 NA NA 0.48 0.39
FDP 0.86 NA NA 0.69 NA NA 0.74 0.57
time (mins) 0.00 NA NA 9.00 NA NA 5.00 6.00
memory (Mb) 123.20 NA NA 20070.10 NA NA 1877.00 4030.30

Comparison of record linkage methods on the complete SHIW data application for the default decision rule ξ=0.5.\xi=0.5.

Naive BRL multilink fastLink reclin2 diyar fedmatch FlexRL
TP 8289.00 1609.00 1771.00 4911.00 8993.00 316.00 5284.00 2916.00
FP 49346.00 449.00 1092.00 11295.00 4092774.00 12.00 13123.00 1308.00
FN 2059.00 8739.00 8577.00 5437.00 1355.00 10032.00 5064.00 7432.00
sensitivity 0.80 0.16 0.17 0.48 0.87 0.03 0.51 0.28
FDP 0.86 0.22 0.38 0.70 1.00 0.04 0.71 0.31
time (mins) 0.33 3.63 206.82 5.82 0.42 2.67 2.25 5.03
memory (Mb) 16.00 1150.00 3837.00 4716.00 2223.00 1530.00 766.00 862.00

Comparison of record linkage methods on the complete SHIW data application with regional blocking, for the default decision rule ξ=0.5.\xi=0.5.

6 Discussion

This article presented FlexRL: an R package for probabilistic record linkage of two overlapping data sources using a hierarchical model that accounts for registration errors and accommodates temporal changes in Partially Identifying Variables (PIVs). FlexRL provides tools for assessing the quality of the resulting linked data. These diagnostics are independent of the linkage method and thus apply broadly. These tools are essential for using record linkage in practice, where potential linkage errors and induced sample selection cannot be observed directly.

To draw attention to the implications of linkage quality for statistical analysis, FlexRL provides two complementary tools as functions of the linkage threshold. First, the estimated False Discovery Proportion (FDP), which quantifies contamination among the linked pairs. Second, the divergence of the linked sample from the source populations, which captures potential sampling bias. Examining these quantities jointly makes the trade-off between contamination and sampling bias explicit and provides users with information to select a linkage decision rule in light of its potential consequences for subsequent inference.

Several directions follow naturally from this work. On the computational side, the memory footprint is linear in the number of records and the running time scales with the number of records, candidate pairs, PIVs, their levels and configurations. Memory and running time allow record linkage between large data sets on a standard computer. On the modelling side though, the linkage model currently assumes independence of PIVs given the latent true values, no duplicates within a source, categorical PIVs; extensions would broaden the range of applications. Moreover, the diagnostic estimators and the proposed quality measures, whose validity rests on the assumptions underlying their estimation, would benefit from further theoretical and empirical investigation.

Notwithstanding these considerations, FlexRL provides a framework that connects record linkage to linked data quality assessment. It offers a solution to record linkage that is scalable in terms of memory usage and running time, and flexible in accommodating diverse scenarios. Linkage performance depends on the difficulty of the task and the chosen decision rule, controlling the FDP and recovering a fraction of the true links accordingly. It brings record linkage into practice, helping researchers and practitioners not only to link data, but also to quantify and communicate the extent to which linkage decisions may affect downstream inference.

Data and Code Availability

The FlexRL package is available from the Comprehensive R Archive Network (CRAN) or from the package GitHub repository alongside documentation and vignettes describing its functionality. FlexRL is also available as a module in JASP 1.0 (JASP Team, 2026). The script is available as supplementary material and on the GitHub repository of the package.

7 Acknowledgements

The authors thank the anonymous reviewers for their valuable suggestions and for conducting a thorough reproducibility check.

8 Competing interests

The authors are the developers of FlexRL.

References

  • Aleshin-Guendel, S. (2023). Multifile record linkage and duplicate detection [R package version 0.1.1]. https://CRAN.R-project.org/package=multilink
  • Aleshin-Guendel, S., & Sadinle, M. (2023). Multifile Partitioning for Record Linkage and Duplicate Detection. Journal of the American Statistical Association, 118(543), 1786–1795. https://doi.org/10.1080/01621459.2021.2013242
  • Belin, T. R., & Rubin, D. B. (1995). A Method for Calibrating False-Match Rates in Record Linkage. Journal of the American Statistical Association, 90(430), 694–707. https://doi.org/10.1080/01621459.1995.10476563 ↩ 1 2
  • Binette, O., & Steorts, R. C. (2022). (Almost) all of entity resolution. Science Advances, 8(12). https://doi.org/10.1126/sciadv.abi8021 ↩
  • Blakely, T., & Salmond, C. (2002). Probabilistic record linkage and a method to calculate the positive predictive value. International Journal of Epidemiology, 31(6), 1246–1252. https://doi.org/10.1093/ije/31.6.1246 ↩
  • De Bruin, J. (2019). Python Record Linkage Toolkit: A toolkit for record linkage and duplicate detection in Python [Computer software]. Zenodo. https://doi.org/10.5281/ZENODO.3559043 ↩
  • Bukke, P., Kamat, G., Cui, J., Gutman, R., & Slawski, M. (2026). Postlink: Post-linkage data analysis [R package version 0.1.2]. https://postlink-group.github.io/postlink/ ↩
  • Buuren, S. van, & Groothuis-Oudshoorn, K. (2011). mice: Multivariate Imputation by Chained Equations inR. Journal of Statistical Software, 45(3). https://doi.org/10.18637/jss.v045.i03 ↩
  • Celeux, G., & Diebolt, J. (1986). L’algorithme SEM : Un algorithme d’apprentissage probabiliste pour la reconnaissance de mélange de densités. Revue de Statistiques Appliquées, 34(2), 35–52. http://www.numdam.org/item/RSA_1986__34_2_35_0/ ↩
  • Cleaton, M., Hall, J., Shipsey, R., White, Z., & Xhaferaj, K. (2024). A case study of using Splink: Census duplicate matching. Proceedings of Statistics Canada Symposium 2022. Data Disaggregation: Building a More Representative Data Portrait of Society. ↩
  • Cohen, G. J., Dice, J., Friedrichs, M., Gupta, K., Hayes, W., Kitschelt, I., Lee, S. J., Marsh, W. B., Mislang, N., Shaton, M., Sicilian, M., & Webster, C. (2021). The U.S. syndicated loan market: Matching data. Journal of Financial Research, 44(4), 695–723. https://doi.org/10.1111/jfir.12261 ↩
  • Cooney, T., Yu, S., Daral, S., Field, M., Krebs, B., Kieran, M., Manley, P., Govinda Raju, S., & Zelt, S. (2023). Healthcare resource use for pediatric low-grade glioma care: A cohort of linked electronic health records and claims data. Journal of Clinical Oncology, 41(16_suppl), 10038–10038. https://doi.org/10.1200/JCO.2023.41.16\_suppl.10038 ↩
  • Dasylva, A., & Goussanou, A. (2020). Estimating linkage errors under regularity conditions. Proceedings of the Survey Research Methods Section.
  • Dasylva, A., & Goussanou, A. (2022). On the consistent estimation of linkage errors without training data. Japanese Journal of Statistics and Data Science, 5(1), 181–216. https://doi.org/10.1007/s42081-022-00153-3 ↩
  • Doidge, J. C., & Harron, K. L. (2019). Reflections on modern methods: linkage error bias. International Journal of Epidemiology. https://doi.org/10.1093/ije/dyz203 ↩ 1 2 3 4 5 6
  • Dunn, H. L. (1946). Record Linkage. American Journal of Public Health and the Nations Health, 36(12), 1412–1416. https://doi.org/10.2105/ajph.36.12.1412 ↩
  • Dusetzina, S. B., Tyree, S., Meyer, A. M., Meyer, A., Green, L., & Carpenter, W. R. (2014). Linking data for health services research: A framework and instructional guide [internet]. In Agency for Healthcare Research and Quality (US). https://www.ncbi.nlm.nih.gov/books/NBK253312/. https://www.ncbi.nlm.nih.gov/books/NBK253312/ ↩
  • ENAMORADO, T., FIFIELD, B., & IMAI, K. (2019). Using a Probabilistic Model to Assist Merging of Large-Scale Administrative Records. American Political Science Review, 113(2), 353–371. https://doi.org/10.1017/s0003055418000783 ↩ 1 2 3 4
  • Fellegi, I. P., & Sunter, A. B. (1969). A Theory for Record Linkage. Journal of the American Statistical Association, 64(328), 1183–1210. https://doi.org/10.1080/01621459.1969.10501049 ↩ 1 2
  • Fortini, M., Liseo, B., Nuccitelli, A., & Scanu, M. (2001). On Bayesian record linkage. Research in Official Statistics, 4(6), 185–198. ↩ 1 2
  • Friedrichs, M., Webster, C., Marsh, B., Dice, J., & Lee, S. (2023). Fedmatch: Fast, flexible, and user-friendly record linkage methods [R package version 2.0.6]. https://CRAN.R-project.org/package=fedmatch ↩
  • Gretton, A., Borgwardt, K. M., Rasch, M. J., Schölkopf, B., & Smola, A. (2012). A kernel two-sample test. Journal of Machine Learning Research, 13, 723–773. ↩
  • Harron, K., Doidge, J. C., & Goldstein, H. (2020). Assessing data linkage quality in cohort studies. Annals of Human Biology, 47(2), 218–226. https://doi.org/10.1080/03014460.2020.1742379 ↩
  • Harron, K. L., Doidge, J. C., Knight, H. E., Gilbert, R. E., Goldstein, H., Cromwell, D. A., & van der Meulen, J. H. (2017). A guide to evaluating linkage quality for the analysis of linked data. International Journal of Epidemiology, 46(5), 1699–1710. https://doi.org/10.1093/ije/dyx177 ↩
  • Jaro, M. A. (1989). Advances in Record-Linkage Methodology as Applied to Matching the 1985 Census of Tampa, Florida. Journal of the American Statistical Association, 84(406), 414–420. https://doi.org/10.1080/01621459.1989.10478785 ↩ 1 2
  • JASP Team. (2026). JASP (Version 1.0.0)[Computer software]. https://jasp-stats.org/ ↩
  • Jelveh, Z., McNeill, M., & Lin, T.-Y. (2022). NameMatch. https://github.com/urban-labs/namematch ↩
  • Kramer, R. (2026). Towards scalable probabilistic linkage of administrative population data in Germany: Insights from a method test with Splink. International Journal of Population Data Science, 11(4). https://doi.org/10.23889/ijpds.v11i4.3814 ↩
  • Lahiri, P., & Larsen, M. D. (2005). Regression Analysis With Linked Data. Journal of the American Statistical Association, 100(469), 222–230. https://doi.org/10.1198/016214504000001277 ↩ 1 2
  • Laidler, J., Imaz Blanco, A., & Balasubramanian, D. (2025). Probabilistic Linkage Pipeline Improving Linkage Quality and Explainability in Healthcare. International Journal of Population Data Science, 10(4). https://doi.org/10.23889/ijpds.v10i4.3271 ↩ 1 2
  • Lam, J., Boyd, A., Linacre, R., Blackburn, R., & Harron, K. (2024). Generating synthetic identifiers to support development and evaluation of data linkage methods. International Journal of Population Data Science, 9(1). https://doi.org/10.23889/ijpds.v9i1.2389 ↩ 1 2
  • Larsen, M. D. (1999). Multiple imputation analysis of records linked using mixture models. Proceedings of the Survey Methods Section, Statistical Society of Canada Annual Meeting, 63, 65–71. ↩ 1 2
  • Linacre, R., Lindsay, S., Manassis, T., Slade, Z., & Hepworth, T. (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 ↩
  • Marchant, N. G., Kaplan, A., Elazar, D. N., Rubinstein, B. I. P., & Steorts, R. C. (2021). d-blink: Distributed End-to-End Bayesian Entity Resolution. Journal of Computational and Graphical Statistics, 30(2), 406–421. https://doi.org/10.1080/10618600.2020.1825451 ↩ 1 2 3
  • Marchant, N. G., Rubinstein, B. I. P., & Steorts, R. C. (2023). Bayesian Graphical Entity Resolution using Exchangeable Random Partition Priors. Journal of Survey Statistics and Methodology, 11(3), 569–596. https://doi.org/10.1093/jssam/smac030 ↩ 1 2 3 4
  • Mudgal, S., Li, H., Rekatsinas, T., Doan, A., Park, Y., Krishnan, G., Deep, R., Arcaute, E., & Raghavendra, V. (2018). Deep Learning for Entity Matching: A Design Space Exploration. Proceedings of the 2018 International Conference on Management of Data, 19–34. https://doi.org/10.1145/3183713.3196926 ↩
  • Newcombe, H. B., Kennedy, J. M., Axford, S. J., & James, A. P. (1959). Automatic Linkage of Vital Records: Computers can be used to extract “follow-up” statistics of families from files of routine records. Science, 130(3381), 954–959. https://doi.org/10.1126/science.130.3381.954 ↩
  • Nowok, B., Raab, G. M., & Dibben, C. (2016). synthpop : Bespoke Creation of Synthetic Data in R. Journal of Statistical Software, 74(11). https://doi.org/10.18637/jss.v074.i11 ↩
  • Nsonwu, O. (2023). Diyar: Record linkage and epidemiological case definitions in ’r’ [R package version 0.5.1]. https://olisansonwu.github.io/diyar/index.html ↩
  • Pontesilli, M., Hof, M. H., Ravelli, A. C. J., van Altena, A. J., Soufan, A. T., Mol, B. W., Kostelijk, E. H., Slappendel, E., Consten, D., Cantineau, A. E. P., van der Westerlaken, L. A. J., van Inzen, W., Dumoulin, J. C. M., Ramos, L., Baart, E. B., Broekmans, F. J. M., Rijnders, P. M., Curfs, M. H. J. M., Mastenbroek, S., … Painter, R. C. (2021). Effect of parental and ART treatment characteristics on perinatal outcomes. Human Reproduction, 36(6), 1640–1665. https://doi.org/10.1093/humrep/deab008 ↩
  • Resnick, D., & Asher, J. (2019, September). Measurement of type i and type II record linkage error. Using and Linking Administrative and Auxiliary Data, Government Statistics Section. https://ww2.amstat.org/meetings/proceedings/2019/data/assets/pdf/1199462.pdf ↩ 1 2
  • Robach, K., & Hof, M. H. (2026). FlexRL: Flexible record linkage and inference on linked data [R package version 2.0.0]. https://CRAN.R-project.org/package=FlexRL
  • Robach, K., Hof, M. H., & van de Wiel, M. A. (2025). False Discovery Estimation in Record Linkage. Statistics in Medicine, 44(23-24). https://doi.org/10.1002/sim.70292
  • Robach, K., van de Wiel, M. A., Hof, M. H., & van der Pas, S. L. (2026). Causal record linkage. https://arxiv.org/abs/2611.00760
  • Robach, K., van der Pas, S. L., van de Wiel, M. A., & Hof, M. H. (2025). A flexible model for record linkage. Journal of the Royal Statistical Society Series C: Applied Statistics, 74(4), 1100–1127. https://doi.org/10.1093/jrsssc/qlaf016
  • Sadinle, M. (2017). Bayesian Estimation of Bipartite Matchings for Record Linkage. Journal of the American Statistical Association, 112(518), 600–612. https://doi.org/10.1080/01621459.2016.1148612 ↩ 1 2 3 4 5 6
  • Sadinle, M. (2020). Beta record linkage [R package version 0.1.0]. https://CRAN.R-project.org/package=BRL ↩
  • Steorts, R. C. (2015). Entity Resolution with Empirically Motivated Priors. Bayesian Analysis, 10(4), 849–875. https://doi.org/10.1214/15-ba965si ↩ 1 2
  • Steorts, R. C., Hall, R., & Fienberg, S. E. (2016). A Bayesian Approach to Graphical Record Linkage and Deduplication. Journal of the American Statistical Association, 111(516), 1660–1672. https://doi.org/10.1080/01621459.2015.1105807 ↩ 1 2
  • Steorts, R. C., Ventura, S. L., Sadinle, M., & Fienberg, S. E. (2014). A Comparison of Blocking Methods for Record Linkage. In Lecture Notes in Computer Science (pp. 253–268). Springer International Publishing. https://doi.org/10.1007/978-3-319-11257-2_20
  • Steorts, R., Hall, R., & Fienberg, S. (2014). SMERED: A Bayesian Approach to Graphical Record Linkage and De-duplication. In S. Kaski & J. Corander (Eds.), Proceedings of the Seventeenth International Conference on Artificial Intelligence and Statistics (Vol. 33, pp. 922–930). PMLR. https://proceedings.mlr.press/v33/steorts14.html
  • Tancredi, A., & Liseo, B. (2011). A hierarchical Bayesian approach to record linkage and population size problems. The Annals of Applied Statistics, 5(2B), 1553–1585. https://doi.org/10.1214/10-aoas447 ↩ 1 2 3
  • Tancredi, A., & Liseo, B. (2015). Regression analysis with linked data: problems and possible solutions. Statistica, Vol 75, No 1 (2015). https://doi.org/10.6092/ISSN.1973-2201/5821 ↩ 1 2
  • Ted Enamorado, K. I., Ben Fifield. (2023). fastLink: Fast probabilistic record linkage with missing data [R package version 0.6.1]. https://CRAN.R-project.org/package=fastLink ↩
  • Tepping, B. J. (1968). A Model for Optimum Linkage of Records. Journal of the American Statistical Association, 63(324), 1321–1332. https://doi.org/10.1080/01621459.1968.10480930 ↩
  • van der Laan, J. (2025). reclin2: Record linkage toolkit [R package version 0.6.0]. https://github.com/djvanderlaan/reclin2
  • Vo, T. H., Garès, V., Zhang, L., Happe, A., Oger, E., Paquelet, S., & Chauvet, G. (2024). Cox regression with linked data. Statistics in Medicine, 43(2), 296–314. https://doi.org/10.1002/sim.9960 ↩
  • Wang, Z., Ben‐David, E., Diao, G., & Slawski, M. (2022). Regression with linked datasets subject to linkage error. WIREs Computational Statistics, 14(4). https://doi.org/10.1002/wics.1570 ↩ 1 2 3 4 5
  • Watson, D. S., Blesch, K., Kapar, J., & Wright, M. N. (2023). Adversarial random forests for density estimation and generative modeling. https://arxiv.org/abs/2205.09435. https://CRAN.R-project.org/package=arf ↩
  • Williamson, E. J., Walker, A. J., Bhaskaran, K., Bacon, S., Bates, C., Morton, C. E., Curtis, H. J., Mehrkar, A., Evans, D., Inglesby, P., Cockburn, J., McDonald, H. I., MacKenna, B., Tomlinson, L., Douglas, I. J., Rentsch, C. T., Mathur, R., Wong, A. Y. S., Grieve, R., … Goldacre, B. (2020). OpenSAFELY: Factors associated with COVID-19-related hospital death in the linked electronic health records of 17 million adult NHS patients. MedRxiv, 430–436. ↩

Cite this article

Robach, K., van de Wiel, M. A., & Hof, M. H. (2026). FlexRL: an R package for Flexible Record Linkage and Linked Data Quality Assessment. Journal of Reproducible Statistics, 1, 11. https://doi.org/10.68365/jrepstat.2026.11

doi: https://doi.org/10.68365/jrepstat.2026.11

Downloads

PDF JATS XML .bib .ris .csl.json Reproducibility package (.zip) 1e4c9332705c9dcfce588fd446fc57aa218aa98fd8d3d71868f44be1213aa9c7

https://doi.org/10.68365/jrepstat.2026.11 also supports content negotiation, so reference managers can fetch the citation from the DOI directly. The exports above work without it.