<?xml version="1.0" encoding="utf-8" ?>
<!DOCTYPE article PUBLIC "-//NLM//DTD JATS (Z39.96) Journal Archiving and Interchange DTD v1.2 20190208//EN"
                  "JATS-archivearticle1.dtd">
<article xmlns:mml="http://www.w3.org/1998/Math/MathML" xmlns:xlink="http://www.w3.org/1999/xlink" dtd-version="1.2" article-type="other">
<front>
<journal-meta>
<journal-id journal-id-type="publisher-id">jrepstat</journal-id>
<journal-title-group>
<journal-title>Journal of Reproducible Statistics</journal-title>
</journal-title-group>
<issn publication-format="electronic">3043-2790</issn>
<publisher>
<publisher-name>FAIR Press</publisher-name>
</publisher>
</journal-meta>
<article-meta>
<title-group>
<article-title>FlexRL: an R package for Flexible Record Linkage and Linked Data Quality Assessment</article-title>
</title-group>
<contrib-group>
<contrib contrib-type="author">
<contrib-id contrib-id-type="orcid">https://orcid.org/0000-0002-5725-623X</contrib-id>
<name>
<surname>Robach</surname>
<given-names>Kayané</given-names>
</name>
<aff>Amsterdam UMC, Amsterdam Public Health</aff>
</contrib>
<contrib contrib-type="author">
<name>
<surname>van de Wiel</surname>
<given-names>Mark A.</given-names>
</name>
<aff>Amsterdam UMC, Amsterdam Public Health</aff>
</contrib>
<contrib contrib-type="author">
<name>
<surname>Hof</surname>
<given-names>Michel H.</given-names>
</name>
<aff>Amsterdam UMC, Amsterdam Public Health</aff>
</contrib>
</contrib-group>
<pub-date date-type="pub" publication-format="electronic">
<year>2026</year>
</pub-date>
<volume>1</volume>
<elocation-id>11</elocation-id>
<history>
<date date-type="received" iso-8601-date="2026-10-22"><day>22</day><month>10</month><year>2026</year></date>
<date date-type="accepted" iso-8601-date="2026-10-28"><day>28</day><month>10</month><year>2026</year></date>
</history>
<permissions>
<license license-type="open-access" xlink:href="https://creativecommons.org/licenses/by/4.0/">
<license-p>This is an open access article distributed under the terms of the Creative Commons Attribution 4.0 International License (CC-BY 4.0), which permits unrestricted use, distribution and reproduction in any medium provided the original work is properly cited.</license-p>
</license>
</permissions>
<self-uri content-type="html" xlink:href="https://jrepstat.fairpressjournals.com/articles/flexrl-an-r-package-for-flexible-record-linkage-and-linked-data-quality-assessment/"/>
<abstract>
<p>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.</p>
</abstract>
<kwd-group kwd-group-type="author">
<kwd>Record Linkage</kwd>
<kwd>Inference</kwd>
<kwd>Stochastic EM</kwd>
<kwd>False Discovery Proportion</kwd>
<kwd>Sampling Selection</kwd>
<kwd>Linked Data</kwd>
</kwd-group>
<custom-meta-group>
<custom-meta>
<meta-name>data-availability-route</meta-name>
<meta-value>open</meta-value>
</custom-meta>
<custom-meta>
<meta-name>founding-article</meta-name>
<meta-value>true</meta-value>
</custom-meta>
</custom-meta-group>
</article-meta>
</front>
<body>
<sec id="sec-introduction">
  <title>Introduction</title>
  <p>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.</p>
  <p>Linked data sets become the study sample for downstream analyses,
  where linkage errors may propagate (Doidge &amp; Harron, 2020;
  <named-content content-type="nocase">Robach et al.</named-content>,
  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.</p>
  <p>Two main probabilistic approaches to record linkage have developed
  through times. First, the traditional mixture model (Fellegi &amp;
  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 &amp; 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
  <monospace>R</monospace> for entity resolution (clustering records
  from a single file into entities) rather than for linkage between two
  data sources.</p>
  <p>We address this gap with the <italic>FlexRL</italic>
  <monospace>R</monospace> package, which makes two contributions.
  First, it implements the hierarchical record linkage model proposed by
  <named-content content-type="nocase">Robach, van der Pas, et
  al.</named-content> (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 <monospace>Rcpp</monospace> 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. <italic>FlexRL</italic> implements two estimators of the
  False Discovery Proportion (FDP): one derived from linkage scores
  (Belin &amp; Rubin, 1995; Enamorado et al., 2019; Resnick &amp; Asher,
  2019) and one based on synthetic data (Robach, Hof, et al., 2025).
  <italic>FlexRL</italic> 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
  <italic>FlexRL</italic> provides wrappers for several existing
  <monospace>R</monospace> packages.</p>
  <p>The <italic>FlexRL</italic> 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
  &amp; Harron, 2020; Lahiri &amp; Larsen, 2005;
  <named-content content-type="nocase">Robach et al.</named-content>,
  2026; Tancredi &amp; 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;
  <named-content content-type="nocase">Robach, van der Pas, et
  al.</named-content>, 2025; Sadinle, 2017). By combining record linkage
  and diagnostics in a practical tool, it helps evaluating whether
  inference can be conducted on linked data.</p>
  <p>Throughout the paper, we motivate and illustrate the main
  components of <italic>FlexRL</italic> on the 2012 and 2014 waves of
  the
  <ext-link ext-link-type="uri" xlink:href="https://www.bancaditalia.it/statistiche/tematiche/indagini-famiglie-imprese/bilanci-famiglie/distribuzione-microdati/index.html">Survey
  on Household Income and Wealth</ext-link> (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 <xref alt="2" rid="sec-setup">2</xref>
  introduces the notation, the modelling paradigms, the existing
  software and demonstrates the potential of <italic>FlexRL</italic>.
  Section <xref alt="3" rid="sec-model">3</xref> presents the record
  linkage model implemented in <italic>FlexRL</italic> and its
  estimation on a subset of the SHIW. On the resulting linked data,
  Section <xref alt="4" rid="sec-inference">4</xref> describes the
  diagnostic tools <italic>FlexRL</italic> provides, and illustrates the
  impact of linkage errors on a socio-economic regression analysis.
  Section <xref alt="5" rid="sec-scalability">5</xref> demonstrates the
  scalability of <italic>FlexRL</italic> approach to record linkage on
  the SHIW. Section <xref alt="6" rid="sec-discussion">6</xref>
  concludes.</p>
</sec>
<sec id="sec-setup">
  <title>The record linkage problem</title>
  <sec id="sec-notation">
    <title>Setup and notation</title>
    <p>We consider two overlapping samples
    <inline-formula><alternatives>
    <tex-math><![CDATA[\mathcal A]]></tex-math>
    <mml:math display="inline" xmlns:mml="http://www.w3.org/1998/Math/MathML"><mml:mi mathvariant="script">𝒜</mml:mi></mml:math></alternatives></inline-formula>
    and <inline-formula><alternatives>
    <tex-math><![CDATA[\mathcal B]]></tex-math>
    <mml:math display="inline" xmlns:mml="http://www.w3.org/1998/Math/MathML"><mml:mi mathvariant="script">ℬ</mml:mi></mml:math></alternatives></inline-formula>
    from the same population with <inline-formula><alternatives>
    <tex-math><![CDATA[N_{\mathcal A}]]></tex-math>
    <mml:math display="inline" xmlns:mml="http://www.w3.org/1998/Math/MathML"><mml:msub><mml:mi>N</mml:mi><mml:mi mathvariant="script">𝒜</mml:mi></mml:msub></mml:math></alternatives></inline-formula>
    and <inline-formula><alternatives>
    <tex-math><![CDATA[N_{\mathcal B} \geq N_{\mathcal A}]]></tex-math>
    <mml:math display="inline" xmlns:mml="http://www.w3.org/1998/Math/MathML"><mml:mrow><mml:msub><mml:mi>N</mml:mi><mml:mi mathvariant="script">ℬ</mml:mi></mml:msub><mml:mo>≥</mml:mo><mml:msub><mml:mi>N</mml:mi><mml:mi mathvariant="script">𝒜</mml:mi></mml:msub></mml:mrow></mml:math></alternatives></inline-formula>
    records. Both sources record the same <inline-formula><alternatives>
    <tex-math><![CDATA[K]]></tex-math>
    <mml:math display="inline" xmlns:mml="http://www.w3.org/1998/Math/MathML"><mml:mi>K</mml:mi></mml:math></alternatives></inline-formula>
    categorical PIVs, indexed by <inline-formula><alternatives>
    <tex-math><![CDATA[k = 1, \dots, K]]></tex-math>
    <mml:math display="inline" xmlns:mml="http://www.w3.org/1998/Math/MathML"><mml:mrow><mml:mi>k</mml:mi><mml:mo>=</mml:mo><mml:mn>1</mml:mn><mml:mo>,</mml:mo><mml:mi>…</mml:mi><mml:mo>,</mml:mo><mml:mi>K</mml:mi></mml:mrow></mml:math></alternatives></inline-formula>
    with <inline-formula><alternatives>
    <tex-math><![CDATA[N_k]]></tex-math>
    <mml:math display="inline" xmlns:mml="http://www.w3.org/1998/Math/MathML"><mml:msub><mml:mi>N</mml:mi><mml:mi>k</mml:mi></mml:msub></mml:math></alternatives></inline-formula>
    possible values each. Index <inline-formula><alternatives>
    <tex-math><![CDATA[i]]></tex-math>
    <mml:math display="inline" xmlns:mml="http://www.w3.org/1998/Math/MathML"><mml:mi>i</mml:mi></mml:math></alternatives></inline-formula>
    refers to a record in <inline-formula><alternatives>
    <tex-math><![CDATA[\mathcal A]]></tex-math>
    <mml:math display="inline" xmlns:mml="http://www.w3.org/1998/Math/MathML"><mml:mi mathvariant="script">𝒜</mml:mi></mml:math></alternatives></inline-formula>
    and index <inline-formula><alternatives>
    <tex-math><![CDATA[j]]></tex-math>
    <mml:math display="inline" xmlns:mml="http://www.w3.org/1998/Math/MathML"><mml:mi>j</mml:mi></mml:math></alternatives></inline-formula>
    to a record in <inline-formula><alternatives>
    <tex-math><![CDATA[\mathcal B.]]></tex-math>
    <mml:math display="inline" xmlns:mml="http://www.w3.org/1998/Math/MathML"><mml:mrow><mml:mi mathvariant="script">ℬ</mml:mi><mml:mi>.</mml:mi></mml:mrow></mml:math></alternatives></inline-formula>
    For PIV <inline-formula><alternatives>
    <tex-math><![CDATA[k]]></tex-math>
    <mml:math display="inline" xmlns:mml="http://www.w3.org/1998/Math/MathML"><mml:mi>k</mml:mi></mml:math></alternatives></inline-formula>,
    we denote by <inline-formula><alternatives>
    <tex-math><![CDATA[G^{\mathcal A}_{i,k}]]></tex-math>
    <mml:math display="inline" xmlns:mml="http://www.w3.org/1998/Math/MathML"><mml:msubsup><mml:mi>G</mml:mi><mml:mrow><mml:mi>i</mml:mi><mml:mo>,</mml:mo><mml:mi>k</mml:mi></mml:mrow><mml:mi mathvariant="script">𝒜</mml:mi></mml:msubsup></mml:math></alternatives></inline-formula>
    the registered (observed) value and by
    <inline-formula><alternatives>
    <tex-math><![CDATA[H^{\mathcal A}_{i,k}]]></tex-math>
    <mml:math display="inline" xmlns:mml="http://www.w3.org/1998/Math/MathML"><mml:msubsup><mml:mi>H</mml:mi><mml:mrow><mml:mi>i</mml:mi><mml:mo>,</mml:mo><mml:mi>k</mml:mi></mml:mrow><mml:mi mathvariant="script">𝒜</mml:mi></mml:msubsup></mml:math></alternatives></inline-formula>
    the latent true value in record <inline-formula><alternatives>
    <tex-math><![CDATA[i \in \mathcal A.]]></tex-math>
    <mml:math display="inline" xmlns:mml="http://www.w3.org/1998/Math/MathML"><mml:mrow><mml:mi>i</mml:mi><mml:mo>∈</mml:mo><mml:mi mathvariant="script">𝒜</mml:mi><mml:mi>.</mml:mi></mml:mrow></mml:math></alternatives></inline-formula>
    We define <inline-formula><alternatives>
    <tex-math><![CDATA[G^{\mathcal B}_{j,k}]]></tex-math>
    <mml:math display="inline" xmlns:mml="http://www.w3.org/1998/Math/MathML"><mml:msubsup><mml:mi>G</mml:mi><mml:mrow><mml:mi>j</mml:mi><mml:mo>,</mml:mo><mml:mi>k</mml:mi></mml:mrow><mml:mi mathvariant="script">ℬ</mml:mi></mml:msubsup></mml:math></alternatives></inline-formula>
    and <inline-formula><alternatives>
    <tex-math><![CDATA[H^{\mathcal B}_{j,k}]]></tex-math>
    <mml:math display="inline" xmlns:mml="http://www.w3.org/1998/Math/MathML"><mml:msubsup><mml:mi>H</mml:mi><mml:mrow><mml:mi>j</mml:mi><mml:mo>,</mml:mo><mml:mi>k</mml:mi></mml:mrow><mml:mi mathvariant="script">ℬ</mml:mi></mml:msubsup></mml:math></alternatives></inline-formula>
    analogously. Registered values differ from true values because of
    registration errors: missing values or mistakes (e.g. typographical
    errors). We write <inline-formula><alternatives>
    <tex-math><![CDATA[\textbf{G}]]></tex-math>
    <mml:math display="inline" xmlns:mml="http://www.w3.org/1998/Math/MathML"><mml:mtext mathvariant="bold">𝐆</mml:mtext></mml:math></alternatives></inline-formula>
    and <inline-formula><alternatives>
    <tex-math><![CDATA[\textbf{H}]]></tex-math>
    <mml:math display="inline" xmlns:mml="http://www.w3.org/1998/Math/MathML"><mml:mtext mathvariant="bold">𝐇</mml:mtext></mml:math></alternatives></inline-formula>
    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 <italic>dynamic</italic> PIVs like postal code, whereas
    <italic>stable</italic> PIVs like birth year cannot change. For an
    entity recorded in both sources, the true values of stable PIVs are
    therefore identical in <inline-formula><alternatives>
    <tex-math><![CDATA[\mathcal A]]></tex-math>
    <mml:math display="inline" xmlns:mml="http://www.w3.org/1998/Math/MathML"><mml:mi mathvariant="script">𝒜</mml:mi></mml:math></alternatives></inline-formula>
    and <inline-formula><alternatives>
    <tex-math><![CDATA[\mathcal B]]></tex-math>
    <mml:math display="inline" xmlns:mml="http://www.w3.org/1998/Math/MathML"><mml:mi mathvariant="script">ℬ</mml:mi></mml:math></alternatives></inline-formula>
    and any disagreement between their registered values is due to
    registration errors. We elaborate on dynamic PIVs later.</p>
    <p>The object of interest is the linkage matrix
    <inline-formula><alternatives>
    <tex-math><![CDATA[\boldsymbol{\Delta} \in \{0,1\}^{N_{\mathcal A} \times N_{\mathcal B}}]]></tex-math>
    <mml:math display="inline" xmlns:mml="http://www.w3.org/1998/Math/MathML"><mml:mrow><mml:mi mathvariant="bold">𝚫</mml:mi><mml:mo>∈</mml:mo><mml:mo stretchy="false" form="prefix">{</mml:mo><mml:mn>0</mml:mn><mml:mo>,</mml:mo><mml:mn>1</mml:mn><mml:msup><mml:mo stretchy="false" form="postfix">}</mml:mo><mml:mrow><mml:msub><mml:mi>N</mml:mi><mml:mi mathvariant="script">𝒜</mml:mi></mml:msub><mml:mo>×</mml:mo><mml:msub><mml:mi>N</mml:mi><mml:mi mathvariant="script">ℬ</mml:mi></mml:msub></mml:mrow></mml:msup></mml:mrow></mml:math></alternatives></inline-formula>,
    with <inline-formula><alternatives>
    <tex-math><![CDATA[\Delta_{i,j} = 1]]></tex-math>
    <mml:math display="inline" xmlns:mml="http://www.w3.org/1998/Math/MathML"><mml:mrow><mml:msub><mml:mi mathvariant="normal">Δ</mml:mi><mml:mrow><mml:mi>i</mml:mi><mml:mo>,</mml:mo><mml:mi>j</mml:mi></mml:mrow></mml:msub><mml:mo>=</mml:mo><mml:mn>1</mml:mn></mml:mrow></mml:math></alternatives></inline-formula>
    if records <inline-formula><alternatives>
    <tex-math><![CDATA[i \in \mathcal A]]></tex-math>
    <mml:math display="inline" xmlns:mml="http://www.w3.org/1998/Math/MathML"><mml:mrow><mml:mi>i</mml:mi><mml:mo>∈</mml:mo><mml:mi mathvariant="script">𝒜</mml:mi></mml:mrow></mml:math></alternatives></inline-formula>
    and <inline-formula><alternatives>
    <tex-math><![CDATA[j \in \mathcal B]]></tex-math>
    <mml:math display="inline" xmlns:mml="http://www.w3.org/1998/Math/MathML"><mml:mrow><mml:mi>j</mml:mi><mml:mo>∈</mml:mo><mml:mi mathvariant="script">ℬ</mml:mi></mml:mrow></mml:math></alternatives></inline-formula>
    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: <inline-formula><alternatives>
    <tex-math><![CDATA[\sum_j \Delta_{i,j} \leq 1]]></tex-math>
    <mml:math display="inline" xmlns:mml="http://www.w3.org/1998/Math/MathML"><mml:mrow><mml:msub><mml:mo>∑</mml:mo><mml:mi>j</mml:mi></mml:msub><mml:msub><mml:mi mathvariant="normal">Δ</mml:mi><mml:mrow><mml:mi>i</mml:mi><mml:mo>,</mml:mo><mml:mi>j</mml:mi></mml:mrow></mml:msub><mml:mo>≤</mml:mo><mml:mn>1</mml:mn></mml:mrow></mml:math></alternatives></inline-formula>
    for all <inline-formula><alternatives>
    <tex-math><![CDATA[i]]></tex-math>
    <mml:math display="inline" xmlns:mml="http://www.w3.org/1998/Math/MathML"><mml:mi>i</mml:mi></mml:math></alternatives></inline-formula>
    and <inline-formula><alternatives>
    <tex-math><![CDATA[\sum_i \Delta_{i,j} \leq 1]]></tex-math>
    <mml:math display="inline" xmlns:mml="http://www.w3.org/1998/Math/MathML"><mml:mrow><mml:msub><mml:mo>∑</mml:mo><mml:mi>i</mml:mi></mml:msub><mml:msub><mml:mi mathvariant="normal">Δ</mml:mi><mml:mrow><mml:mi>i</mml:mi><mml:mo>,</mml:mo><mml:mi>j</mml:mi></mml:mrow></mml:msub><mml:mo>≤</mml:mo><mml:mn>1</mml:mn></mml:mrow></mml:math></alternatives></inline-formula>
    for all <inline-formula><alternatives>
    <tex-math><![CDATA[j.]]></tex-math>
    <mml:math display="inline" xmlns:mml="http://www.w3.org/1998/Math/MathML"><mml:mrow><mml:mi>j</mml:mi><mml:mi>.</mml:mi></mml:mrow></mml:math></alternatives></inline-formula>
    This is the one-to-one assignment constraint, also referred to as
    bipartite matching (Sadinle, 2017). We denote by
    <inline-formula><alternatives>
    <tex-math><![CDATA[\gamma \in (0,1)]]></tex-math>
    <mml:math display="inline" xmlns:mml="http://www.w3.org/1998/Math/MathML"><mml:mrow><mml:mi>γ</mml:mi><mml:mo>∈</mml:mo><mml:mo stretchy="false" form="prefix">(</mml:mo><mml:mn>0</mml:mn><mml:mo>,</mml:mo><mml:mn>1</mml:mn><mml:mo stretchy="false" form="postfix">)</mml:mo></mml:mrow></mml:math></alternatives></inline-formula>
    the probability that a record from <inline-formula><alternatives>
    <tex-math><![CDATA[\mathcal A]]></tex-math>
    <mml:math display="inline" xmlns:mml="http://www.w3.org/1998/Math/MathML"><mml:mi mathvariant="script">𝒜</mml:mi></mml:math></alternatives></inline-formula>
    forms a link with a record from <inline-formula><alternatives>
    <tex-math><![CDATA[\mathcal B]]></tex-math>
    <mml:math display="inline" xmlns:mml="http://www.w3.org/1998/Math/MathML"><mml:mi mathvariant="script">ℬ</mml:mi></mml:math></alternatives></inline-formula>,
    that is, the overlap between the sources as a fraction of the
    smaller data set.</p>
    <p>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
    <inline-formula><alternatives>
    <tex-math><![CDATA[\mathcal A \times \mathcal B]]></tex-math>
    <mml:math display="inline" xmlns:mml="http://www.w3.org/1998/Math/MathML"><mml:mrow><mml:mi mathvariant="script">𝒜</mml:mi><mml:mo>×</mml:mo><mml:mi mathvariant="script">ℬ</mml:mi></mml:mrow></mml:math></alternatives></inline-formula>
    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 &amp; Harron, 2020;
    <named-content content-type="nocase">Robach et al.</named-content>,
    2026).</p>
  </sec>
  <sec id="sec-paradigms">
    <title>Modelling paradigms</title>
    <p>Linkage methods can be grouped into four paradigms (Binette &amp;
    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:</p>
    <sec id="paradigm-1-classification-of-comparison-vectors">
      <title>Paradigm 1: classification of comparison vectors</title>
      <p>The traditional ‘Fellegi-Sunter’ approach (Dunn, 1946; Fellegi
      &amp; Sunter, 1969; Newcombe et al., 1959; Tepping, 1968) reduces
      the data to comparison vectors. For each pair
      <inline-formula><alternatives>
      <tex-math><![CDATA[(i,j) \in \mathcal A \times \mathcal B]]></tex-math>
      <mml:math display="inline" xmlns:mml="http://www.w3.org/1998/Math/MathML"><mml:mrow><mml:mo stretchy="false" form="prefix">(</mml:mo><mml:mi>i</mml:mi><mml:mo>,</mml:mo><mml:mi>j</mml:mi><mml:mo stretchy="false" form="postfix">)</mml:mo><mml:mo>∈</mml:mo><mml:mi mathvariant="script">𝒜</mml:mi><mml:mo>×</mml:mo><mml:mi mathvariant="script">ℬ</mml:mi></mml:mrow></mml:math></alternatives></inline-formula>,
      a vector <inline-formula><alternatives>
      <tex-math><![CDATA[\boldsymbol{c}_{i,j} = (c_{i,j,1}, \dots, c_{i,j,K})]]></tex-math>
      <mml:math display="inline" xmlns:mml="http://www.w3.org/1998/Math/MathML"><mml:mrow><mml:msub><mml:mi mathvariant="bold-italic">𝒄</mml:mi><mml:mrow><mml:mi>i</mml:mi><mml:mo>,</mml:mo><mml:mi>j</mml:mi></mml:mrow></mml:msub><mml:mo>=</mml:mo><mml:mo stretchy="false" form="prefix">(</mml:mo><mml:msub><mml:mi>c</mml:mi><mml:mrow><mml:mi>i</mml:mi><mml:mo>,</mml:mo><mml:mi>j</mml:mi><mml:mo>,</mml:mo><mml:mn>1</mml:mn></mml:mrow></mml:msub><mml:mo>,</mml:mo><mml:mi>…</mml:mi><mml:mo>,</mml:mo><mml:msub><mml:mi>c</mml:mi><mml:mrow><mml:mi>i</mml:mi><mml:mo>,</mml:mo><mml:mi>j</mml:mi><mml:mo>,</mml:mo><mml:mi>K</mml:mi></mml:mrow></mml:msub><mml:mo stretchy="false" form="postfix">)</mml:mo></mml:mrow></mml:math></alternatives></inline-formula>
      records whether elements <inline-formula><alternatives>
      <tex-math><![CDATA[G^{\mathcal A}_{i,k}]]></tex-math>
      <mml:math display="inline" xmlns:mml="http://www.w3.org/1998/Math/MathML"><mml:msubsup><mml:mi>G</mml:mi><mml:mrow><mml:mi>i</mml:mi><mml:mo>,</mml:mo><mml:mi>k</mml:mi></mml:mrow><mml:mi mathvariant="script">𝒜</mml:mi></mml:msubsup></mml:math></alternatives></inline-formula>
      and <inline-formula><alternatives>
      <tex-math><![CDATA[G^{\mathcal B}_{j,k}]]></tex-math>
      <mml:math display="inline" xmlns:mml="http://www.w3.org/1998/Math/MathML"><mml:msubsup><mml:mi>G</mml:mi><mml:mrow><mml:mi>j</mml:mi><mml:mo>,</mml:mo><mml:mi>k</mml:mi></mml:mrow><mml:mi mathvariant="script">ℬ</mml:mi></mml:msubsup></mml:math></alternatives></inline-formula>
      for <inline-formula><alternatives>
      <tex-math><![CDATA[k = 1, \dots, K]]></tex-math>
      <mml:math display="inline" xmlns:mml="http://www.w3.org/1998/Math/MathML"><mml:mrow><mml:mi>k</mml:mi><mml:mo>=</mml:mo><mml:mn>1</mml:mn><mml:mo>,</mml:mo><mml:mi>…</mml:mi><mml:mo>,</mml:mo><mml:mi>K</mml:mi></mml:mrow></mml:math></alternatives></inline-formula>
      agree or how similar they are. The pairs of records are split into
      the set of matched <inline-formula><alternatives>
      <tex-math><![CDATA[M]]></tex-math>
      <mml:math display="inline" xmlns:mml="http://www.w3.org/1998/Math/MathML"><mml:mi>M</mml:mi></mml:math></alternatives></inline-formula>
      and the set of unmatched <inline-formula><alternatives>
      <tex-math><![CDATA[U.]]></tex-math>
      <mml:math display="inline" xmlns:mml="http://www.w3.org/1998/Math/MathML"><mml:mrow><mml:mi>U</mml:mi><mml:mi>.</mml:mi></mml:mrow></mml:math></alternatives></inline-formula>
      The comparison vectors follow a two components mixture:
      <styled-content id="eq-FS"><disp-formula><alternatives>
      <tex-math><![CDATA[ \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)]]></tex-math>
      <mml:math display="block" xmlns:mml="http://www.w3.org/1998/Math/MathML"><mml:mrow><mml:mtable><mml:mtr><mml:mtd columnalign="right" style="text-align: right; padding-right: 0"><mml:mi>P</mml:mi><mml:mo stretchy="false" form="prefix">(</mml:mo><mml:msub><mml:mi mathvariant="bold-italic">𝒄</mml:mi><mml:mrow><mml:mi>i</mml:mi><mml:mo>,</mml:mo><mml:mi>j</mml:mi></mml:mrow></mml:msub><mml:mo stretchy="false" form="postfix">)</mml:mo></mml:mtd><mml:mtd columnalign="left" style="text-align: left; padding-left: 0"><mml:mo>=</mml:mo><mml:mi>γ</mml:mi><mml:mspace width="0.278em"></mml:mspace><mml:mi>m</mml:mi><mml:mo stretchy="false" form="prefix">(</mml:mo><mml:msub><mml:mi mathvariant="bold-italic">𝒄</mml:mi><mml:mrow><mml:mi>i</mml:mi><mml:mo>,</mml:mo><mml:mi>j</mml:mi></mml:mrow></mml:msub><mml:mo stretchy="false" form="postfix">)</mml:mo><mml:mo>+</mml:mo><mml:mo stretchy="false" form="prefix">(</mml:mo><mml:mn>1</mml:mn><mml:mo>−</mml:mo><mml:mi>γ</mml:mi><mml:mo stretchy="false" form="postfix">)</mml:mo><mml:mspace width="0.278em"></mml:mspace><mml:mi>u</mml:mi><mml:mo stretchy="false" form="prefix">(</mml:mo><mml:msub><mml:mi mathvariant="bold-italic">𝒄</mml:mi><mml:mrow><mml:mi>i</mml:mi><mml:mo>,</mml:mo><mml:mi>j</mml:mi></mml:mrow></mml:msub><mml:mo stretchy="false" form="postfix">)</mml:mo><mml:mo>,</mml:mo></mml:mtd></mml:mtr><mml:mtr><mml:mtd columnalign="right" style="text-align: right; padding-right: 0"><mml:mi>m</mml:mi><mml:mo stretchy="false" form="prefix">(</mml:mo><mml:mi mathvariant="bold-italic">𝒄</mml:mi><mml:mo stretchy="false" form="postfix">)</mml:mo></mml:mtd><mml:mtd columnalign="left" style="text-align: left; padding-left: 0"><mml:mo>=</mml:mo><mml:mi>P</mml:mi><mml:mo stretchy="false" form="prefix">(</mml:mo><mml:mi mathvariant="bold-italic">𝒄</mml:mi><mml:mo>∣</mml:mo><mml:mi>M</mml:mi><mml:mo stretchy="false" form="postfix">)</mml:mo><mml:mo>,</mml:mo></mml:mtd></mml:mtr><mml:mtr><mml:mtd columnalign="right" style="text-align: right; padding-right: 0"><mml:mi>u</mml:mi><mml:mo stretchy="false" form="prefix">(</mml:mo><mml:mi mathvariant="bold-italic">𝒄</mml:mi><mml:mo stretchy="false" form="postfix">)</mml:mo></mml:mtd><mml:mtd columnalign="left" style="text-align: left; padding-left: 0"><mml:mo>=</mml:mo><mml:mi>P</mml:mi><mml:mo stretchy="false" form="prefix">(</mml:mo><mml:mi mathvariant="bold-italic">𝒄</mml:mi><mml:mo>∣</mml:mo><mml:mi>U</mml:mi><mml:mo stretchy="false" form="postfix">)</mml:mo><mml:mo>,</mml:mo></mml:mtd></mml:mtr></mml:mtable><mml:mspace width="2.0em"></mml:mspace><mml:mo stretchy="false" form="prefix">(</mml:mo><mml:mn>1</mml:mn><mml:mo stretchy="false" form="postfix">)</mml:mo></mml:mrow></mml:math></alternatives></disp-formula></styled-content>
      where <inline-formula><alternatives>
      <tex-math><![CDATA[\gamma]]></tex-math>
      <mml:math display="inline" xmlns:mml="http://www.w3.org/1998/Math/MathML"><mml:mi>γ</mml:mi></mml:math></alternatives></inline-formula>
      in this paradigm is the proportion of links among all pairs. Under
      the assumption that the <inline-formula><alternatives>
      <tex-math><![CDATA[K]]></tex-math>
      <mml:math display="inline" xmlns:mml="http://www.w3.org/1998/Math/MathML"><mml:mi>K</mml:mi></mml:math></alternatives></inline-formula>
      comparisons are independent given the linkage status,
      <inline-formula><alternatives>
      <tex-math><![CDATA[m]]></tex-math>
      <mml:math display="inline" xmlns:mml="http://www.w3.org/1998/Math/MathML"><mml:mi>m</mml:mi></mml:math></alternatives></inline-formula>
      and <inline-formula><alternatives>
      <tex-math><![CDATA[u]]></tex-math>
      <mml:math display="inline" xmlns:mml="http://www.w3.org/1998/Math/MathML"><mml:mi>u</mml:mi></mml:math></alternatives></inline-formula>
      factorise over <inline-formula><alternatives>
      <tex-math><![CDATA[k \in \{1, \dots, K\}.]]></tex-math>
      <mml:math display="inline" xmlns:mml="http://www.w3.org/1998/Math/MathML"><mml:mrow><mml:mi>k</mml:mi><mml:mo>∈</mml:mo><mml:mo stretchy="false" form="prefix">{</mml:mo><mml:mn>1</mml:mn><mml:mo>,</mml:mo><mml:mi>…</mml:mi><mml:mo>,</mml:mo><mml:mi>K</mml:mi><mml:mo stretchy="false" form="postfix">}</mml:mo><mml:mi>.</mml:mi></mml:mrow></mml:math></alternatives></inline-formula>
      The parameters are then estimated with an EM algorithm (Jaro,
      1989; Larsen, 1999). Pairs are classified by thresholding the
      ratios <inline-formula><alternatives>
      <tex-math><![CDATA[m(\boldsymbol{c}_{i,j}) / u(\boldsymbol{c}_{i,j})]]></tex-math>
      <mml:math display="inline" xmlns:mml="http://www.w3.org/1998/Math/MathML"><mml:mrow><mml:mi>m</mml:mi><mml:mo stretchy="false" form="prefix">(</mml:mo><mml:msub><mml:mi mathvariant="bold-italic">𝒄</mml:mi><mml:mrow><mml:mi>i</mml:mi><mml:mo>,</mml:mo><mml:mi>j</mml:mi></mml:mrow></mml:msub><mml:mo stretchy="false" form="postfix">)</mml:mo><mml:mi>/</mml:mi><mml:mi>u</mml:mi><mml:mo stretchy="false" form="prefix">(</mml:mo><mml:msub><mml:mi mathvariant="bold-italic">𝒄</mml:mi><mml:mrow><mml:mi>i</mml:mi><mml:mo>,</mml:mo><mml:mi>j</mml:mi></mml:mrow></mml:msub><mml:mo stretchy="false" form="postfix">)</mml:mo></mml:mrow></mml:math></alternatives></inline-formula>
      or the posterior linkage probabilities. Bayesian versions place a
      prior on the linkage matrix <inline-formula><alternatives>
      <tex-math><![CDATA[\boldsymbol{\Delta}]]></tex-math>
      <mml:math display="inline" xmlns:mml="http://www.w3.org/1998/Math/MathML"><mml:mi mathvariant="bold">𝚫</mml:mi></mml:math></alternatives></inline-formula>
      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
      &amp; Sadinle, 2023). The computations are simple and fast, but
      memory intensive because they operate on
      <inline-formula><alternatives>
      <tex-math><![CDATA[N_{\mathcal A} \times N_{\mathcal B}]]></tex-math>
      <mml:math display="inline" xmlns:mml="http://www.w3.org/1998/Math/MathML"><mml:mrow><mml:msub><mml:mi>N</mml:mi><mml:mi mathvariant="script">𝒜</mml:mi></mml:msub><mml:mo>×</mml:mo><mml:msub><mml:mi>N</mml:mi><mml:mi mathvariant="script">ℬ</mml:mi></mml:msub></mml:mrow></mml:math></alternatives></inline-formula>
      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.</p>
    </sec>
    <sec id="paradigm-2-hierarchical-modelling">
      <title>Paradigm 2: hierarchical modelling</title>
      <p>The second family models how the data were generated (Marchant
      et al., 2021; Marchant et al., 2023;
      <named-content content-type="nocase">Robach, van der Pas, et
      al.</named-content>, 2025; R. C. Steorts, 2015; R. C. Steorts et
      al., 2016; Tancredi &amp; Liseo, 2011). Registered values
      <inline-formula><alternatives>
      <tex-math><![CDATA[\textbf{G}]]></tex-math>
      <mml:math display="inline" xmlns:mml="http://www.w3.org/1998/Math/MathML"><mml:mtext mathvariant="bold">𝐆</mml:mtext></mml:math></alternatives></inline-formula>
      are seen as distorted versions of latent true values
      <inline-formula><alternatives>
      <tex-math><![CDATA[\textbf{H}]]></tex-math>
      <mml:math display="inline" xmlns:mml="http://www.w3.org/1998/Math/MathML"><mml:mtext mathvariant="bold">𝐇</mml:mtext></mml:math></alternatives></inline-formula>,
      which define the linkage structure <inline-formula><alternatives>
      <tex-math><![CDATA[\boldsymbol{\Delta}.]]></tex-math>
      <mml:math display="inline" xmlns:mml="http://www.w3.org/1998/Math/MathML"><mml:mrow><mml:mi mathvariant="bold">𝚫</mml:mi><mml:mi>.</mml:mi></mml:mrow></mml:math></alternatives></inline-formula>
      The joint model reads
      <styled-content id="eq-hier"><disp-formula><alternatives>
      <tex-math><![CDATA[ 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)]]></tex-math>
      <mml:math display="block" xmlns:mml="http://www.w3.org/1998/Math/MathML"><mml:mrow><mml:mi>P</mml:mi><mml:mo stretchy="false" form="prefix">(</mml:mo><mml:mtext mathvariant="bold">𝐆</mml:mtext><mml:mo>,</mml:mo><mml:mtext mathvariant="bold">𝐇</mml:mtext><mml:mo>,</mml:mo><mml:mi mathvariant="bold">𝚫</mml:mi><mml:mo stretchy="false" form="postfix">)</mml:mo><mml:mo>=</mml:mo><mml:mi>P</mml:mi><mml:mo stretchy="false" form="prefix">(</mml:mo><mml:mtext mathvariant="bold">𝐆</mml:mtext><mml:mo>∣</mml:mo><mml:mtext mathvariant="bold">𝐇</mml:mtext><mml:mo stretchy="false" form="postfix">)</mml:mo><mml:mi>P</mml:mi><mml:mo stretchy="false" form="prefix">(</mml:mo><mml:mtext mathvariant="bold">𝐇</mml:mtext><mml:mo>∣</mml:mo><mml:mi mathvariant="bold">𝚫</mml:mi><mml:mo stretchy="false" form="postfix">)</mml:mo><mml:mi>P</mml:mi><mml:mo stretchy="false" form="prefix">(</mml:mo><mml:mi mathvariant="bold">𝚫</mml:mi><mml:mo stretchy="false" form="postfix">)</mml:mo><mml:mo>,</mml:mo><mml:mspace width="2.0em"></mml:mspace><mml:mo stretchy="false" form="prefix">(</mml:mo><mml:mn>2</mml:mn><mml:mo stretchy="false" form="postfix">)</mml:mo></mml:mrow></mml:math></alternatives></disp-formula></styled-content>
      with a model for registration errors
      <inline-formula><alternatives>
      <tex-math><![CDATA[P(\textbf{G} \mid \textbf{H})]]></tex-math>
      <mml:math display="inline" xmlns:mml="http://www.w3.org/1998/Math/MathML"><mml:mrow><mml:mi>P</mml:mi><mml:mo stretchy="false" form="prefix">(</mml:mo><mml:mtext mathvariant="bold">𝐆</mml:mtext><mml:mo>∣</mml:mo><mml:mtext mathvariant="bold">𝐇</mml:mtext><mml:mo stretchy="false" form="postfix">)</mml:mo></mml:mrow></mml:math></alternatives></inline-formula>,
      a model for underlying true values <inline-formula><alternatives>
      <tex-math><![CDATA[P(\textbf{H} \mid \boldsymbol{\Delta})]]></tex-math>
      <mml:math display="inline" xmlns:mml="http://www.w3.org/1998/Math/MathML"><mml:mrow><mml:mi>P</mml:mi><mml:mo stretchy="false" form="prefix">(</mml:mo><mml:mtext mathvariant="bold">𝐇</mml:mtext><mml:mo>∣</mml:mo><mml:mi mathvariant="bold">𝚫</mml:mi><mml:mo stretchy="false" form="postfix">)</mml:mo></mml:mrow></mml:math></alternatives></inline-formula>
      and a model for the linkage structure
      <inline-formula><alternatives>
      <tex-math><![CDATA[P(\boldsymbol{\Delta}).]]></tex-math>
      <mml:math display="inline" xmlns:mml="http://www.w3.org/1998/Math/MathML"><mml:mrow><mml:mi>P</mml:mi><mml:mo stretchy="false" form="prefix">(</mml:mo><mml:mi mathvariant="bold">𝚫</mml:mi><mml:mo stretchy="false" form="postfix">)</mml:mo><mml:mi>.</mml:mi></mml:mrow></mml:math></alternatives></inline-formula>
      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.</p>
    </sec>
  </sec>
  <sec id="sec-software">
    <title>Existing software</title>
    <p>In <monospace>Python</monospace>, <italic>recordlinkage</italic>
    (Bruin, 2019), <italic>Splink</italic> (Linacre et al., 2022) and
    <italic>NameMatch</italic> (Jelveh et al., 2022) implement Paradigm
    1. We list the main <monospace>R</monospace> packages for the task
    considered here in Table <xref alt="1" rid="tbl-packages">1</xref>.
    Paradigm 2 is only available in <monospace>R</monospace> 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.</p>
    <table-wrap>
      <caption>
        <p>Record linkage packages on <monospace>CRAN</monospace>
        compared with <italic>FlexRL</italic>. The
        <italic>FlexRL</italic> package diagnostic tools apply to all
        these packages.</p>
      </caption>
      <table id="tbl-packages">
        <colgroup>
          <col width="14%" />
          <col width="14%" />
          <col width="14%" />
          <col width="14%" />
          <col width="14%" />
          <col width="14%" />
          <col width="14%" />
        </colgroup>
        <thead>
          <tr>
            <th>Package</th>
            <th>Paradigm</th>
            <th>Estimation</th>
            <th>Linkage structure</th>
            <th>Record deduplication</th>
            <th>PIV dynamics</th>
            <th>Quality tools</th>
          </tr>
        </thead>
        <tbody>
          <tr>
            <td><italic>fedmatch</italic> 2.1.0 (Cohen et al., 2021;
            Friedrichs et al., 2023)</td>
            <td>comparison vectors</td>
            <td>push relabel maximum flow</td>
            <td>many-to-many</td>
            <td>no</td>
            <td>no</td>
            <td>no</td>
          </tr>
          <tr>
            <td><italic>diyar</italic> 0.5.1 (Nsonwu, 2023)</td>
            <td>comparison vectors</td>
            <td>multistage weights comparisons, fixed score level
            parameters</td>
            <td>clusters</td>
            <td>yes</td>
            <td>no</td>
            <td>no</td>
          </tr>
          <tr>
            <td><italic>reclin2</italic> 0.6.0
            (<named-content content-type="nocase">van der
            Laan</named-content>, 2025)</td>
            <td>comparison vectors, supervised</td>
            <td>EM, machine learning</td>
            <td>one-to-one post hoc</td>
            <td>no</td>
            <td>no</td>
            <td>no</td>
          </tr>
          <tr>
            <td><italic>fastLink</italic> 0.6.1 (Enamorado et al., 2019;
            Ted Enamorado, 2023)</td>
            <td>comparison vectors</td>
            <td>EM</td>
            <td>one-to-one post hoc</td>
            <td>no</td>
            <td>no</td>
            <td>no</td>
          </tr>
          <tr>
            <td><italic>BRL</italic> 0.1.0 (Sadinle, 2017; Sadinle,
            2020)</td>
            <td>comparison vectors</td>
            <td>Bayesian, bipartite prior, Gibbs sampler</td>
            <td>one-to-one in model</td>
            <td>no</td>
            <td>no</td>
            <td>no</td>
          </tr>
          <tr>
            <td><italic>multilink</italic> 0.1.1 (Aleshin-Guendel, 2023;
            Aleshin-Guendel &amp; Sadinle, 2023)</td>
            <td>comparison vectors</td>
            <td>Bayesian, partition prior, Gibbs sampler</td>
            <td>clusters, one-to-one in model</td>
            <td>yes</td>
            <td>no</td>
            <td>no</td>
          </tr>
          <tr>
            <td><italic>FlexRL</italic> 2.0.0 (Robach &amp; Hof,
            2026)</td>
            <td>hierarchical</td>
            <td>stochastic EM</td>
            <td>one-to-one in model</td>
            <td>no</td>
            <td>yes</td>
            <td>yes</td>
          </tr>
        </tbody>
      </table>
    </table-wrap>
    <p>To our knowledge, no <monospace>R</monospace> 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 <italic>postlink</italic> 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.</p>
    <p>The implementation of <italic>FlexRL</italic> relies on
    <monospace>Rcpp</monospace> (potentially parallelised with
    <monospace>OpenMP</monospace>) for the backend samplers,
    <italic>Matrix</italic> for the sparse linkage matrix, and other
    standard <monospace>R</monospace> packages. The diagnostic tools
    apply to any record linkage output in the required format, with
    built-in wrappers for <italic>BRL</italic>, <italic>diyar</italic>,
    <italic>fastLink</italic>, <italic>fedmatch</italic>,
    <italic>multilink</italic> and <italic>reclin2</italic>.
    Figure <xref alt="1" rid="fig-workflow">1</xref> shows the workflow,
    which follows the structure of
    Section <xref alt="3" rid="sec-model">3</xref> and
    Section <xref alt="4" rid="sec-inference">4</xref>: the data are
    prepared, linked with <monospace>StEM()</monospace> and the linked
    data quality is assessed with
    <monospace>RL_diagnostics()</monospace>. We elaborate on each
    component along the article.</p>
    <fig id="fig-workflow">
      <caption><p>Workflow of <italic>FlexRL</italic>.</p></caption>
      <graphic mimetype="image" mime-subtype="png" xlink:href="Article-FlexRL_files/mermaid-figure-1.png" />
    </fig>
  </sec>
  <sec id="sec-demonstration">
    <title>Demonstration</title>
    <sec id="simulation-study">
      <title>Simulation study</title>
      <p>As a preliminary demonstration of the functionalities of
      <italic>FlexRL</italic>, we simulate data with the package
      <monospace>simulate_data()</monospace> 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.</p>
      <p>Note that this data generation process, on which all packages
      cited in Table <xref alt="1" rid="tbl-packages">1</xref> are
      evaluated, is in line with the hierarchical model
      <italic>FlexRL</italic> 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
      <italic>FlexRL</italic>, 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.</p>
      <p id="tbl-demonstration">
        <table-wrap>
          <table>
            <colgroup>
              <col width="8%" />
              <col width="9%" />
              <col width="9%" />
              <col width="10%" />
              <col width="9%" />
              <col width="9%" />
              <col width="10%" />
              <col width="9%" />
              <col width="12%" />
              <col width="14%" />
            </colgroup>
            <thead>
              <tr>
                <th align="left"></th>
                <th align="center">Naive</th>
                <th align="center">BRL</th>
                <th align="center">multilink</th>
                <th align="center">fastLink</th>
                <th align="center">reclin2</th>
                <th align="center">diyar</th>
                <th align="center">fedmatch</th>
                <th align="center">FlexRL (dynamics)</th>
                <th align="center">FlexRL (no dynamics)</th>
              </tr>
            </thead>
            <tbody>
              <tr>
                <td align="left">TP</td>
                <td align="center">118.40 (5.13)</td>
                <td align="center">80.40 (5.04)</td>
                <td align="center">80.60 (5.95)</td>
                <td align="center">101.70 (6.48)</td>
                <td align="center">114.10 (6.38)</td>
                <td align="center">34.90 (20.24)</td>
                <td align="center">122.10 (6.33)</td>
                <td align="center">114.00 (7.92)</td>
                <td align="center">87.50 (8.30)</td>
              </tr>
              <tr>
                <td align="left">FP</td>
                <td align="center">83.10 (11.02)</td>
                <td align="center">12.30 (3.23)</td>
                <td align="center">14.20 (4.13)</td>
                <td align="center">43.10 (5.59)</td>
                <td align="center">68.30 (8.82)</td>
                <td align="center">3.30 (2.91)</td>
                <td align="center">125.80 (6.32)</td>
                <td align="center">25.90 (5.15)</td>
                <td align="center">19.00 (4.67)</td>
              </tr>
              <tr>
                <td align="left">FN</td>
                <td align="center">81.60 (5.13)</td>
                <td align="center">119.60 (5.04)</td>
                <td align="center">119.40 (5.95)</td>
                <td align="center">98.30 (6.48)</td>
                <td align="center">85.90 (6.38)</td>
                <td align="center">165.10 (20.24)</td>
                <td align="center">77.90 (6.33)</td>
                <td align="center">86.00 (7.92)</td>
                <td align="center">112.50 (8.30)</td>
              </tr>
              <tr>
                <td align="left">sensitivity</td>
                <td align="center">0.59 (0.03)</td>
                <td align="center">0.40 (0.03)</td>
                <td align="center">0.40 (0.03)</td>
                <td align="center">0.51 (0.03)</td>
                <td align="center">0.57 (0.03)</td>
                <td align="center">0.17 (0.10)</td>
                <td align="center">0.61 (0.03)</td>
                <td align="center">0.57 (0.04)</td>
                <td align="center">0.44 (0.04)</td>
              </tr>
              <tr>
                <td align="left">FDP</td>
                <td align="center">0.41 (0.03)</td>
                <td align="center">0.13 (0.03)</td>
                <td align="center">0.15 (0.04)</td>
                <td align="center">0.30 (0.03)</td>
                <td align="center">0.37 (0.03)</td>
                <td align="center">0.08 (0.05)</td>
                <td align="center">0.51 (0.03)</td>
                <td align="center">0.18 (0.03)</td>
                <td align="center">0.18 (0.04)</td>
              </tr>
              <tr>
                <td align="left">time (secs)</td>
                <td align="center">0.27 (0.04)</td>
                <td align="center">0.97 (0.05)</td>
                <td align="center">18.57 (1.48)</td>
                <td align="center">1.29 (0.24)</td>
                <td align="center">0.29 (0.01)</td>
                <td align="center">1.17 (0.06)</td>
                <td align="center">1.44 (0.01)</td>
                <td align="center">4.59 (0.02)</td>
                <td align="center">3.72 (0.01)</td>
              </tr>
              <tr>
                <td align="left">memory (Mb)</td>
                <td align="center">1.04 (0.05)</td>
                <td align="center">78.60 (10.08)</td>
                <td align="center">105.68 (10.18)</td>
                <td align="center">24.85 (4.42)</td>
                <td align="center">41.52 (0.18)</td>
                <td align="center">104.31 (10.84)</td>
                <td align="center">42.14 (2.59)</td>
                <td align="center">102.11 (9.03)</td>
                <td align="center">70.18 (6.42)</td>
              </tr>
            </tbody>
          </table>
        </table-wrap>
        <p>Linkage performance of competing record linkage methods on
        simulated data for the default linkage decision rule; see
        Section <xref alt="3.3" rid="sec-scores">3.3</xref>. We report
        average performance over 10 replications, with standard
        deviations in parentheses.</p>
      </p>
      <p>In (<bold>tbl-demonstration?</bold>), we compare the methods
      presented in Table <xref alt="1" rid="tbl-packages">1</xref> to
      the <italic>FlexRL</italic> 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
      (<named-content content-type="nocase">Robach, van der Pas, et
      al.</named-content>, 2025). (<bold>tbl-demonstration?</bold>) 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
      <monospace>vignette('FlexRL-RL-vignette', 'FlexRL')</monospace> or
      the
      <ext-link ext-link-type="uri" xlink:href="https://robachowyk.github.io/FlexRL/index.html">online
      documentation</ext-link>.</p>
      <p>The results presented in this article are obtained on a MacBook
      Pro (Apple M1 Max ARM chip architecture, 32GB memory, 8 cores)
      with <monospace>R</monospace> version 4.6.1. The random seed is
      set to 1 in each code cell that produces output (some compared
      packages call <monospace>set.seed()</monospace> internally). The
      computations are robust to different operating systems (MacOS,
      Linux, Windows). We measure the memory usage using the
      <monospace>R</monospace> garbage collector. External allocations
      are therefore likely underestimated. All methods compared in this
      article rely on <monospace>Rcpp</monospace> or
      <monospace>C</monospace>, except for <italic>diyar</italic> which
      is fully implemented in <monospace>R</monospace>. Time and memory
      usage may vary depending on the operating system, hardware, and
      system configuration.</p>
    </sec>
  </sec>
</sec>
<sec id="sec-model">
  <title>The hierarchical architecture</title>
  <sec id="sec-prepare">
    <title>Data preparation and PIVs configuration</title>
    <p>The record linkage model requires each PIV
    <inline-formula><alternatives>
    <tex-math><![CDATA[k]]></tex-math>
    <mml:math display="inline" xmlns:mml="http://www.w3.org/1998/Math/MathML"><mml:mi>k</mml:mi></mml:math></alternatives></inline-formula>
    to be categorical, encoded by integers
    <inline-formula><alternatives>
    <tex-math><![CDATA[1, \dots, N_k]]></tex-math>
    <mml:math display="inline" xmlns:mml="http://www.w3.org/1998/Math/MathML"><mml:mrow><mml:mn>1</mml:mn><mml:mo>,</mml:mo><mml:mi>…</mml:mi><mml:mo>,</mml:mo><mml:msub><mml:mi>N</mml:mi><mml:mi>k</mml:mi></mml:msub></mml:mrow></mml:math></alternatives></inline-formula>
    with missing values coded as <inline-formula><alternatives>
    <tex-math><![CDATA[0.]]></tex-math>
    <mml:math display="inline" xmlns:mml="http://www.w3.org/1998/Math/MathML"><mml:mrow><mml:mn>0</mml:mn><mml:mi>.</mml:mi></mml:mrow></mml:math></alternatives></inline-formula>
    The PIVs must cover a common support across the two sources. The
    smaller source should be labelled as <inline-formula><alternatives>
    <tex-math><![CDATA[\mathcal A.]]></tex-math>
    <mml:math display="inline" xmlns:mml="http://www.w3.org/1998/Math/MathML"><mml:mrow><mml:mi mathvariant="script">𝒜</mml:mi><mml:mi>.</mml:mi></mml:mrow></mml:math></alternatives></inline-formula></p>
    <p>As a first step in the workflow represented in
    Figure <xref alt="1" rid="fig-workflow">1</xref>, the
    <monospace>prepare_data()</monospace> 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.</p>
    <p>The function <monospace>naive_linkage()</monospace> links records
    that agree exactly on all PIVs (a missing value matching any value
    when <monospace>na_match = TRUE</monospace>), 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.</p>
    <p>The package distinguishes different kinds of PIVs, which
    determine how the components of the complete data likelihood of
    Equation <xref alt="(3)" rid="eq-flexrl">(3)</xref> are used when
    fitting the model in
    Section <xref alt="3.2" rid="sec-estimation">3.2</xref>. 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 <xref alt="3.2" rid="sec-estimation">3.2</xref>.</p>
    <list list-type="bullet">
      <list-item>
        <p><italic>Stable</italic>: 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
        <inline-formula><alternatives>
        <tex-math><![CDATA[0.10]]></tex-math>
        <mml:math display="inline" xmlns:mml="http://www.w3.org/1998/Math/MathML"><mml:mn>0.10</mml:mn></mml:math></alternatives></inline-formula>)
        for algorithm stability
        (<named-content content-type="nocase">Robach, van der Pas, et
        al.</named-content>, 2025).</p>
      </list-item>
      <list-item>
        <p><italic>Dynamic</italic>: the true values may change
        (e.g. postal code between two survey waves):</p>
        <list list-type="bullet">
          <list-item>
            <p><italic>Flexible</italic>: 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.</p>
          </list-item>
          <list-item>
            <p><italic>Structured</italic>: changes are modelled by the
            survival function of
            Equation <xref alt="(4)" rid="eq-survival">(4)</xref>. 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 <inline-formula><alternatives>
            <tex-math><![CDATA[0.02]]></tex-math>
            <mml:math display="inline" xmlns:mml="http://www.w3.org/1998/Math/MathML"><mml:mn>0.02</mml:mn></mml:math></alternatives></inline-formula>),
            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.</p>
          </list-item>
        </list>
      </list-item>
    </list>
    <p>To illustrate the usage of the <italic>FlexRL</italic> 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 <xref alt="4" rid="sec-inference">4</xref>, we analyse a
    regression of the expected age of retirement in 2014 on the expected
    age of retirement in 2012.</p>
    <p>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
    (<named-content content-type="nocase">Robach, van der Pas, et
    al.</named-content>, 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:</p>
    <code language="r script">PIVs_config &lt;- list(BirthYear     = list(dynamics        = &quot;stable&quot;, 
                                         bound_mistakes  = c(0.10, 0.10), 
                                         fix_mistakes    = c(NA, NA)),
                    Sex           = list(dynamics        = &quot;stable&quot;,
                                         bound_mistakes  = c(0.10, 0.10),
                                         fix_mistakes    = c(NA, NA)),
                    MaritalStatus = list(dynamics        = &quot;flexible&quot;,
                                         bound_mistakes  = c(NA, NA),
                                         fix_mistakes    = c(NA, NA)),
                    BirthRegion   = list(dynamics        = &quot;stable&quot;, 
                                         bound_mistakes  = c(0.10, 0.10), 
                                         fix_mistakes    = c(NA, NA)),
                    Occupation    = list(dynamics        = &quot;flexible&quot;, 
                                         bound_mistakes  = c(NA, NA), 
                                         fix_mistakes    = c(NA, NA)))

PIVs &lt;- names(PIVs_config)</code>
    <p>We prepare the two data sources for the
    <monospace>StEM()</monospace> record linkage algorithm with the
    <monospace>prepare_data()</monospace> function, which takes as
    inputs the data sources and their labels
    <monospace>df2012</monospace>, <monospace>df2014</monospace>,
    <monospace>'2012'</monospace>, <monospace>'2014'</monospace>; the
    PIVs configuration <monospace>PIVs_config</monospace>; a logical
    <monospace>same_mistakes</monospace> describing whether the
    parameters fitting the probability of mistakes among PIVs should be
    the same between data sources (<monospace>TRUE</monospace> when the
    data are sampled from a same source population); a potential record
    identifier variable <monospace>uniq_id</monospace> when available; a
    logical <monospace>restrict_support_intersection</monospace> 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.</p>
    <code language="r script">prep_data &lt;- prepare_data(df2012, df2014, &quot;2012&quot;, &quot;2014&quot;, PIVs_config, 
                          same_mistakes = TRUE, uniq_id = &quot;ID&quot;)</code>
    <preformat>'2014' is the larger source, saved as B; '2012' saved as A.</preformat>
    <p>This function outputs a list suited for
    <monospace>StEM()</monospace>, where data sources have been encoded
    and labelled as <monospace>encodedA</monospace> and
    <monospace>encodedB</monospace>. It additionally includes the number
    of unique values per PIV <monospace>n_values</monospace>, the
    validated <monospace>PIVs_config</monospace>, the logical
    <monospace>same_mistakes</monospace> and a data set of indices of
    true links <monospace>true_pairs</monospace> when
    <monospace>uniq_id</monospace> 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:</p>
    <preformat>PIV 'BirthYear': values out of the common support in data1 [1920, 1912] in data2 [2013, 2014].</preformat>
    <preformat>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.</preformat>
    <p>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
    <monospace>RL_agreement</monospace> 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).</p>
    <preformat>    BirthYear           Sex MaritalStatus   BirthRegion    Occupation 
         0.99          1.00          0.98          0.99          0.82 </preformat>
    <p>In (<bold>tbl-illustration?</bold>), we compare the record
    linkage methods mentioned in
    Table <xref alt="1" rid="tbl-packages">1</xref> 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.</p>
    <p id="tbl-illustration">
      <table-wrap>
        <table>
          <colgroup>
            <col width="14%" />
            <col width="10%" />
            <col width="9%" />
            <col width="13%" />
            <col width="11%" />
            <col width="13%" />
            <col width="9%" />
            <col width="11%" />
            <col width="9%" />
          </colgroup>
          <thead>
            <tr>
              <th align="left"></th>
              <th align="center">Naive</th>
              <th align="center">BRL</th>
              <th align="center">multilink</th>
              <th align="center">fastLink</th>
              <th align="center">reclin2</th>
              <th align="center">diyar</th>
              <th align="center">fedmatch</th>
              <th align="center">FlexRL</th>
            </tr>
          </thead>
          <tbody>
            <tr>
              <td align="left">TP</td>
              <td align="center">710.00</td>
              <td align="center">158.00</td>
              <td align="center">160.00</td>
              <td align="center">467.00</td>
              <td align="center">721.00</td>
              <td align="center">20.00</td>
              <td align="center">510.00</td>
              <td align="center">297.00</td>
            </tr>
            <tr>
              <td align="left">FP</td>
              <td align="center">3494.00</td>
              <td align="center">24.00</td>
              <td align="center">72.00</td>
              <td align="center">850.00</td>
              <td align="center">339232.00</td>
              <td align="center">0.00</td>
              <td align="center">969.00</td>
              <td align="center">103.00</td>
            </tr>
            <tr>
              <td align="left">FN</td>
              <td align="center">188.00</td>
              <td align="center">740.00</td>
              <td align="center">738.00</td>
              <td align="center">431.00</td>
              <td align="center">177.00</td>
              <td align="center">878.00</td>
              <td align="center">388.00</td>
              <td align="center">601.00</td>
            </tr>
            <tr>
              <td align="left">sensitivity</td>
              <td align="center">0.79</td>
              <td align="center">0.18</td>
              <td align="center">0.18</td>
              <td align="center">0.52</td>
              <td align="center">0.80</td>
              <td align="center">0.02</td>
              <td align="center">0.57</td>
              <td align="center">0.33</td>
            </tr>
            <tr>
              <td align="left">FDP</td>
              <td align="center">0.83</td>
              <td align="center">0.13</td>
              <td align="center">0.31</td>
              <td align="center">0.65</td>
              <td align="center">1.00</td>
              <td align="center">0.00</td>
              <td align="center">0.66</td>
              <td align="center">0.26</td>
            </tr>
            <tr>
              <td align="left">time (secs)</td>
              <td align="center">0.37</td>
              <td align="center">17.78</td>
              <td align="center">1118.04</td>
              <td align="center">33.69</td>
              <td align="center">0.84</td>
              <td align="center">11.04</td>
              <td align="center">8.88</td>
              <td align="center">22.57</td>
            </tr>
            <tr>
              <td align="left">memory (Mb)</td>
              <td align="center">8.30</td>
              <td align="center">523.20</td>
              <td align="center">1901.90</td>
              <td align="center">2436.20</td>
              <td align="center">1180.20</td>
              <td align="center">699.50</td>
              <td align="center">213.20</td>
              <td align="center">263.20</td>
            </tr>
          </tbody>
        </table>
      </table-wrap>
      <p>Comparison of record linkage methods on the SHIW in
      Emilia-Romagna (for the default linkage decision rule, see
      Section <xref alt="3.3" rid="sec-scores">3.3</xref>).</p>
    </p>
  </sec>
  <sec id="sec-estimation">
    <title>StEM estimation</title>
    <p>The <italic>FlexRL</italic> hierarchical model for record linkage
    adapts Equation <xref alt="(2)" rid="eq-hier">(2)</xref> 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 <inline-formula><alternatives>
    <tex-math><![CDATA[(i,j)]]></tex-math>
    <mml:math display="inline" xmlns:mml="http://www.w3.org/1998/Math/MathML"><mml:mrow><mml:mo stretchy="false" form="prefix">(</mml:mo><mml:mi>i</mml:mi><mml:mo>,</mml:mo><mml:mi>j</mml:mi><mml:mo stretchy="false" form="postfix">)</mml:mo></mml:mrow></mml:math></alternatives></inline-formula>,
    <inline-formula><alternatives>
    <tex-math><![CDATA[H^{\mathcal B}_{j,k}]]></tex-math>
    <mml:math display="inline" xmlns:mml="http://www.w3.org/1998/Math/MathML"><mml:msubsup><mml:mi>H</mml:mi><mml:mrow><mml:mi>j</mml:mi><mml:mo>,</mml:mo><mml:mi>k</mml:mi></mml:mrow><mml:mi mathvariant="script">ℬ</mml:mi></mml:msubsup></mml:math></alternatives></inline-formula>
    is a copy of <inline-formula><alternatives>
    <tex-math><![CDATA[H^{\mathcal A}_{i,k}]]></tex-math>
    <mml:math display="inline" xmlns:mml="http://www.w3.org/1998/Math/MathML"><mml:msubsup><mml:mi>H</mml:mi><mml:mrow><mml:mi>i</mml:mi><mml:mo>,</mml:mo><mml:mi>k</mml:mi></mml:mrow><mml:mi mathvariant="script">𝒜</mml:mi></mml:msubsup></mml:math></alternatives></inline-formula>
    except when <inline-formula><alternatives>
    <tex-math><![CDATA[k]]></tex-math>
    <mml:math display="inline" xmlns:mml="http://www.w3.org/1998/Math/MathML"><mml:mi>k</mml:mi></mml:math></alternatives></inline-formula>
    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.</p>
    <p>With parameters <inline-formula><alternatives>
    <tex-math><![CDATA[\boldsymbol{\theta} = (\gamma, \boldsymbol{\eta}, \boldsymbol{\alpha}, \boldsymbol{\phi})]]></tex-math>
    <mml:math display="inline" xmlns:mml="http://www.w3.org/1998/Math/MathML"><mml:mrow><mml:mi mathvariant="bold-italic">𝜽</mml:mi><mml:mo>=</mml:mo><mml:mo stretchy="false" form="prefix">(</mml:mo><mml:mi>γ</mml:mi><mml:mo>,</mml:mo><mml:mi mathvariant="bold-italic">𝜼</mml:mi><mml:mo>,</mml:mo><mml:mi mathvariant="bold-italic">𝜶</mml:mi><mml:mo>,</mml:mo><mml:mi mathvariant="bold-italic">𝝓</mml:mi><mml:mo stretchy="false" form="postfix">)</mml:mo></mml:mrow></mml:math></alternatives></inline-formula>,
    the complete data likelihood factorises as
    <styled-content id="eq-flexrl"><disp-formula><alternatives>
    <tex-math><![CDATA[ \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)]]></tex-math>
    <mml:math display="block" xmlns:mml="http://www.w3.org/1998/Math/MathML"><mml:mrow><mml:mtable><mml:mtr><mml:mtd columnalign="right" style="text-align: right; padding-right: 0"><mml:msub><mml:mi mathvariant="script">ℒ</mml:mi><mml:mi mathvariant="bold-italic">𝜽</mml:mi></mml:msub><mml:mo minsize="120%" maxsize="120%" stretchy="true" form="prefix">(</mml:mo><mml:msup><mml:mtext mathvariant="bold">𝐆</mml:mtext><mml:mi mathvariant="script">𝒜</mml:mi></mml:msup><mml:mo>,</mml:mo><mml:msup><mml:mtext mathvariant="bold">𝐆</mml:mtext><mml:mi mathvariant="script">ℬ</mml:mi></mml:msup><mml:mo>,</mml:mo><mml:msup><mml:mtext mathvariant="bold">𝐇</mml:mtext><mml:mi mathvariant="script">𝒜</mml:mi></mml:msup><mml:mo>,</mml:mo><mml:msup><mml:mtext mathvariant="bold">𝐇</mml:mtext><mml:mi mathvariant="script">ℬ</mml:mi></mml:msup><mml:mo>,</mml:mo><mml:mi mathvariant="bold">𝚫</mml:mi><mml:mo minsize="120%" maxsize="120%" stretchy="true" form="postfix">)</mml:mo><mml:mo>=</mml:mo></mml:mtd><mml:mtd columnalign="left" style="text-align: left; padding-left: 0"><mml:munder><mml:munder><mml:mrow><mml:msub><mml:mi mathvariant="script">ℒ</mml:mi><mml:msup><mml:mi mathvariant="bold-italic">𝝓</mml:mi><mml:mi mathvariant="script">𝒜</mml:mi></mml:msup></mml:msub><mml:mo minsize="120%" maxsize="120%" stretchy="true" form="prefix">(</mml:mo><mml:msup><mml:mtext mathvariant="bold">𝐆</mml:mtext><mml:mi mathvariant="script">𝒜</mml:mi></mml:msup><mml:mo>∣</mml:mo><mml:msup><mml:mtext mathvariant="bold">𝐇</mml:mtext><mml:mi mathvariant="script">𝒜</mml:mi></mml:msup><mml:mo minsize="120%" maxsize="120%" stretchy="true" form="postfix">)</mml:mo><mml:msub><mml:mi mathvariant="script">ℒ</mml:mi><mml:msup><mml:mi mathvariant="bold-italic">𝝓</mml:mi><mml:mi mathvariant="script">ℬ</mml:mi></mml:msup></mml:msub><mml:mo minsize="120%" maxsize="120%" stretchy="true" form="prefix">(</mml:mo><mml:msup><mml:mtext mathvariant="bold">𝐆</mml:mtext><mml:mi mathvariant="script">ℬ</mml:mi></mml:msup><mml:mo>∣</mml:mo><mml:msup><mml:mtext mathvariant="bold">𝐇</mml:mtext><mml:mi mathvariant="script">ℬ</mml:mi></mml:msup><mml:mo minsize="120%" maxsize="120%" stretchy="true" form="postfix">)</mml:mo></mml:mrow><mml:mo accent="true">⏟</mml:mo></mml:munder><mml:mtext mathvariant="normal">registration errors</mml:mtext></mml:munder></mml:mtd></mml:mtr><mml:mtr><mml:mtd columnalign="right" style="text-align: right; padding-right: 0"></mml:mtd><mml:mtd columnalign="left" style="text-align: left; padding-left: 0"><mml:munder><mml:munder><mml:mrow><mml:msub><mml:mi mathvariant="script">ℒ</mml:mi><mml:mrow><mml:mi mathvariant="bold-italic">𝜶</mml:mi><mml:mo>,</mml:mo><mml:mi mathvariant="bold-italic">𝜼</mml:mi></mml:mrow></mml:msub><mml:mo minsize="120%" maxsize="120%" stretchy="true" form="prefix">(</mml:mo><mml:msup><mml:mtext mathvariant="bold">𝐇</mml:mtext><mml:mi mathvariant="script">ℬ</mml:mi></mml:msup><mml:mo>∣</mml:mo><mml:msup><mml:mtext mathvariant="bold">𝐇</mml:mtext><mml:mi mathvariant="script">𝒜</mml:mi></mml:msup><mml:mo>,</mml:mo><mml:mi mathvariant="bold">𝚫</mml:mi><mml:mo minsize="120%" maxsize="120%" stretchy="true" form="postfix">)</mml:mo></mml:mrow><mml:mo accent="true">⏟</mml:mo></mml:munder><mml:mtext mathvariant="normal">changes over time</mml:mtext></mml:munder><mml:munder><mml:munder><mml:mrow><mml:msub><mml:mi mathvariant="script">ℒ</mml:mi><mml:mi mathvariant="bold-italic">𝜼</mml:mi></mml:msub><mml:mo minsize="120%" maxsize="120%" stretchy="true" form="prefix">(</mml:mo><mml:msup><mml:mtext mathvariant="bold">𝐇</mml:mtext><mml:mi mathvariant="script">𝒜</mml:mi></mml:msup><mml:mo minsize="120%" maxsize="120%" stretchy="true" form="postfix">)</mml:mo></mml:mrow><mml:mo accent="true">⏟</mml:mo></mml:munder><mml:mtext mathvariant="normal">true values</mml:mtext></mml:munder></mml:mtd></mml:mtr><mml:mtr><mml:mtd columnalign="right" style="text-align: right; padding-right: 0"></mml:mtd><mml:mtd columnalign="left" style="text-align: left; padding-left: 0"><mml:munder><mml:munder><mml:mrow><mml:msub><mml:mi mathvariant="script">ℒ</mml:mi><mml:mi>γ</mml:mi></mml:msub><mml:mo minsize="120%" maxsize="120%" stretchy="true" form="prefix">(</mml:mo><mml:mi mathvariant="bold">𝚫</mml:mi><mml:mo minsize="120%" maxsize="120%" stretchy="true" form="postfix">)</mml:mo></mml:mrow><mml:mo accent="true">⏟</mml:mo></mml:munder><mml:mtext mathvariant="normal">linkage</mml:mtext></mml:munder><mml:mi>.</mml:mi></mml:mtd></mml:mtr></mml:mtable><mml:mspace width="2.0em"></mml:mspace><mml:mo stretchy="false" form="prefix">(</mml:mo><mml:mn>3</mml:mn><mml:mo stretchy="false" form="postfix">)</mml:mo></mml:mrow></mml:math></alternatives></disp-formula></styled-content></p>
    <p>The parameter <inline-formula><alternatives>
    <tex-math><![CDATA[\boldsymbol{\phi}]]></tex-math>
    <mml:math display="inline" xmlns:mml="http://www.w3.org/1998/Math/MathML"><mml:mi mathvariant="bold-italic">𝝓</mml:mi></mml:math></alternatives></inline-formula>
    governs the possible distortion mechanisms (mistakes, missing
    values) at the source of the differences between registered and
    latent true values. The parameter <inline-formula><alternatives>
    <tex-math><![CDATA[\boldsymbol{\alpha}]]></tex-math>
    <mml:math display="inline" xmlns:mml="http://www.w3.org/1998/Math/MathML"><mml:mi mathvariant="bold-italic">𝜶</mml:mi></mml:math></alternatives></inline-formula>
    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 <xref alt="(4)" rid="eq-survival">(4)</xref>). The
    parameter <inline-formula><alternatives>
    <tex-math><![CDATA[\boldsymbol{\eta}]]></tex-math>
    <mml:math display="inline" xmlns:mml="http://www.w3.org/1998/Math/MathML"><mml:mi mathvariant="bold-italic">𝜼</mml:mi></mml:math></alternatives></inline-formula>
    characterises the distributions of the PIVs. The parameter
    <inline-formula><alternatives>
    <tex-math><![CDATA[\gamma]]></tex-math>
    <mml:math display="inline" xmlns:mml="http://www.w3.org/1998/Math/MathML"><mml:mi>γ</mml:mi></mml:math></alternatives></inline-formula>
    represents the probability that an observation in
    <inline-formula><alternatives>
    <tex-math><![CDATA[\mathcal A]]></tex-math>
    <mml:math display="inline" xmlns:mml="http://www.w3.org/1998/Math/MathML"><mml:mi mathvariant="script">𝒜</mml:mi></mml:math></alternatives></inline-formula>
    forms a link with an observation in <inline-formula><alternatives>
    <tex-math><![CDATA[\mathcal B.]]></tex-math>
    <mml:math display="inline" xmlns:mml="http://www.w3.org/1998/Math/MathML"><mml:mrow><mml:mi mathvariant="script">ℬ</mml:mi><mml:mi>.</mml:mi></mml:mrow></mml:math></alternatives></inline-formula>
    Each component of
    Equation <xref alt="(3)" rid="eq-flexrl">(3)</xref> and each
    parameter is developed in the original methodological paper
    (<named-content content-type="nocase">Robach, van der Pas, et
    al.</named-content>, 2025).</p>
    <p>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 <italic>structured</italic> PIV
    <inline-formula><alternatives>
    <tex-math><![CDATA[k]]></tex-math>
    <mml:math display="inline" xmlns:mml="http://www.w3.org/1998/Math/MathML"><mml:mi>k</mml:mi></mml:math></alternatives></inline-formula>
    whose changes are modelled and a linked pair
    <inline-formula><alternatives>
    <tex-math><![CDATA[(i,j)]]></tex-math>
    <mml:math display="inline" xmlns:mml="http://www.w3.org/1998/Math/MathML"><mml:mrow><mml:mo stretchy="false" form="prefix">(</mml:mo><mml:mi>i</mml:mi><mml:mo>,</mml:mo><mml:mi>j</mml:mi><mml:mo stretchy="false" form="postfix">)</mml:mo></mml:mrow></mml:math></alternatives></inline-formula>
    with time gap <inline-formula><alternatives>
    <tex-math><![CDATA[t_{i,j} = |t^{\mathcal B}_j - t^{\mathcal A}_i|]]></tex-math>
    <mml:math display="inline" xmlns:mml="http://www.w3.org/1998/Math/MathML"><mml:mrow><mml:msub><mml:mi>t</mml:mi><mml:mrow><mml:mi>i</mml:mi><mml:mo>,</mml:mo><mml:mi>j</mml:mi></mml:mrow></mml:msub><mml:mo>=</mml:mo><mml:mo stretchy="false" form="prefix">|</mml:mo><mml:msubsup><mml:mi>t</mml:mi><mml:mi>j</mml:mi><mml:mi mathvariant="script">ℬ</mml:mi></mml:msubsup><mml:mo>−</mml:mo><mml:msubsup><mml:mi>t</mml:mi><mml:mi>i</mml:mi><mml:mi mathvariant="script">𝒜</mml:mi></mml:msubsup><mml:mo stretchy="false" form="prefix">|</mml:mo></mml:mrow></mml:math></alternatives></inline-formula>:
    <styled-content id="eq-survival"><disp-formula><alternatives>
    <tex-math><![CDATA[
        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)]]></tex-math>
    <mml:math display="block" xmlns:mml="http://www.w3.org/1998/Math/MathML"><mml:mrow><mml:mi>P</mml:mi><mml:mo minsize="120%" maxsize="120%" stretchy="true" form="prefix">(</mml:mo><mml:msubsup><mml:mi>H</mml:mi><mml:mrow><mml:mi>j</mml:mi><mml:mo>,</mml:mo><mml:mi>k</mml:mi></mml:mrow><mml:mi mathvariant="script">ℬ</mml:mi></mml:msubsup><mml:mo>=</mml:mo><mml:msubsup><mml:mi>H</mml:mi><mml:mrow><mml:mi>i</mml:mi><mml:mo>,</mml:mo><mml:mi>k</mml:mi></mml:mrow><mml:mi mathvariant="script">𝒜</mml:mi></mml:msubsup><mml:mo>∣</mml:mo><mml:msub><mml:mi>t</mml:mi><mml:mrow><mml:mi>i</mml:mi><mml:mo>,</mml:mo><mml:mi>j</mml:mi></mml:mrow></mml:msub><mml:mo>,</mml:mo><mml:msub><mml:mi mathvariant="bold-italic">𝒙</mml:mi><mml:mrow><mml:mi>i</mml:mi><mml:mo>,</mml:mo><mml:mi>j</mml:mi></mml:mrow></mml:msub><mml:mo>,</mml:mo><mml:msub><mml:mi mathvariant="normal">Δ</mml:mi><mml:mrow><mml:mi>i</mml:mi><mml:mo>,</mml:mo><mml:mi>j</mml:mi></mml:mrow></mml:msub><mml:mo>=</mml:mo><mml:mn>1</mml:mn><mml:mo minsize="120%" maxsize="120%" stretchy="true" form="postfix">)</mml:mo><mml:mo>=</mml:mo><mml:msub><mml:mi>S</mml:mi><mml:msub><mml:mi mathvariant="bold-italic">𝜶</mml:mi><mml:mi>k</mml:mi></mml:msub></mml:msub><mml:mo stretchy="false" form="prefix">(</mml:mo><mml:msub><mml:mi mathvariant="bold-italic">𝒙</mml:mi><mml:mrow><mml:mi>i</mml:mi><mml:mo>,</mml:mo><mml:mi>j</mml:mi></mml:mrow></mml:msub><mml:mo>,</mml:mo><mml:msub><mml:mi>t</mml:mi><mml:mrow><mml:mi>i</mml:mi><mml:mo>,</mml:mo><mml:mi>j</mml:mi></mml:mrow></mml:msub><mml:mo stretchy="false" form="postfix">)</mml:mo><mml:mo>=</mml:mo><mml:mrow><mml:mi mathvariant="normal">exp</mml:mi><mml:mo>&#8289;</mml:mo></mml:mrow><mml:mo minsize="120%" maxsize="120%" stretchy="true" form="prefix">{</mml:mo><mml:mo>−</mml:mo><mml:mrow><mml:mi mathvariant="normal">exp</mml:mi><mml:mo>&#8289;</mml:mo></mml:mrow><mml:mo stretchy="false" form="prefix">(</mml:mo><mml:msubsup><mml:mi mathvariant="bold-italic">𝒙</mml:mi><mml:mrow><mml:mi>i</mml:mi><mml:mo>,</mml:mo><mml:mi>j</mml:mi></mml:mrow><mml:mi>T</mml:mi></mml:msubsup><mml:msub><mml:mi mathvariant="bold-italic">𝜶</mml:mi><mml:mi>k</mml:mi></mml:msub><mml:mo stretchy="false" form="postfix">)</mml:mo><mml:msub><mml:mi>t</mml:mi><mml:mrow><mml:mi>i</mml:mi><mml:mo>,</mml:mo><mml:mi>j</mml:mi></mml:mrow></mml:msub><mml:mo minsize="120%" maxsize="120%" stretchy="true" form="postfix">}</mml:mo><mml:mo>,</mml:mo><mml:mspace width="2.0em"></mml:mspace><mml:mo stretchy="false" form="prefix">(</mml:mo><mml:mn>4</mml:mn><mml:mo stretchy="false" form="postfix">)</mml:mo></mml:mrow></mml:math></alternatives></disp-formula></styled-content>
    where <inline-formula><alternatives>
    <tex-math><![CDATA[\boldsymbol{x}_{i,j}]]></tex-math>
    <mml:math display="inline" xmlns:mml="http://www.w3.org/1998/Math/MathML"><mml:msub><mml:mi mathvariant="bold-italic">𝒙</mml:mi><mml:mrow><mml:mi>i</mml:mi><mml:mo>,</mml:mo><mml:mi>j</mml:mi></mml:mrow></mml:msub></mml:math></alternatives></inline-formula>
    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 <inline-formula><alternatives>
    <tex-math><![CDATA[\boldsymbol{\alpha}_k]]></tex-math>
    <mml:math display="inline" xmlns:mml="http://www.w3.org/1998/Math/MathML"><mml:msub><mml:mi mathvariant="bold-italic">𝜶</mml:mi><mml:mi>k</mml:mi></mml:msub></mml:math></alternatives></inline-formula>
    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.</p>
    <p>The likelihood of the observed data is obtained by summing
    Equation <xref alt="(3)" rid="eq-flexrl">(3)</xref> over all values
    of the latent <inline-formula><alternatives>
    <tex-math><![CDATA[\textbf{H}]]></tex-math>
    <mml:math display="inline" xmlns:mml="http://www.w3.org/1998/Math/MathML"><mml:mtext mathvariant="bold">𝐇</mml:mtext></mml:math></alternatives></inline-formula>
    and <inline-formula><alternatives>
    <tex-math><![CDATA[\boldsymbol{\Delta}.]]></tex-math>
    <mml:math display="inline" xmlns:mml="http://www.w3.org/1998/Math/MathML"><mml:mrow><mml:mi mathvariant="bold">𝚫</mml:mi><mml:mi>.</mml:mi></mml:mrow></mml:math></alternatives></inline-formula>
    <italic>FlexRL</italic> maximises it with the
    <monospace>StEM()</monospace> function, a Stochastic Expectation
    Maximisation (StEM) algorithm (Celeux &amp; 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 <xref alt="1" rid="alg-stem">1</xref> summarises the
    procedure, detailed hereafter.</p>
    <p id="alg-stem">
      <p><bold>Algorithm 1</bold></p>
      <preformat>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 &gt; 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 &gt; 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</preformat>
      <p>Stochastic EM for record linkage.</p>
    </p>
    <sec id="initialisation">
      <title>Initialisation</title>
      <p>The probability <inline-formula><alternatives>
      <tex-math><![CDATA[\gamma]]></tex-math>
      <mml:math display="inline" xmlns:mml="http://www.w3.org/1998/Math/MathML"><mml:mi>γ</mml:mi></mml:math></alternatives></inline-formula>
      is drawn uniformly in <inline-formula><alternatives>
      <tex-math><![CDATA[(0.2, 0.8)]]></tex-math>
      <mml:math display="inline" xmlns:mml="http://www.w3.org/1998/Math/MathML"><mml:mrow><mml:mo stretchy="false" form="prefix">(</mml:mo><mml:mn>0.2</mml:mn><mml:mo>,</mml:mo><mml:mn>0.8</mml:mn><mml:mo stretchy="false" form="postfix">)</mml:mo></mml:mrow></mml:math></alternatives></inline-formula>,
      the distribution of each PIV <inline-formula><alternatives>
      <tex-math><![CDATA[k]]></tex-math>
      <mml:math display="inline" xmlns:mml="http://www.w3.org/1998/Math/MathML"><mml:mi>k</mml:mi></mml:math></alternatives></inline-formula>,
      <inline-formula><alternatives>
      <tex-math><![CDATA[\boldsymbol\eta_k]]></tex-math>
      <mml:math display="inline" xmlns:mml="http://www.w3.org/1998/Math/MathML"><mml:msub><mml:mi mathvariant="bold-italic">𝜼</mml:mi><mml:mi>k</mml:mi></mml:msub></mml:math></alternatives></inline-formula>,
      is uniform over the <inline-formula><alternatives>
      <tex-math><![CDATA[N_k]]></tex-math>
      <mml:math display="inline" xmlns:mml="http://www.w3.org/1998/Math/MathML"><mml:msub><mml:mi>N</mml:mi><mml:mi>k</mml:mi></mml:msub></mml:math></alternatives></inline-formula>
      values, the probabilities of mistakes are drawn in
      <inline-formula><alternatives>
      <tex-math><![CDATA[(0.03, 0.20)]]></tex-math>
      <mml:math display="inline" xmlns:mml="http://www.w3.org/1998/Math/MathML"><mml:mrow><mml:mo stretchy="false" form="prefix">(</mml:mo><mml:mn>0.03</mml:mn><mml:mo>,</mml:mo><mml:mn>0.20</mml:mn><mml:mo stretchy="false" form="postfix">)</mml:mo></mml:mrow></mml:math></alternatives></inline-formula>
      and the probabilities of missing values are set to the observed
      proportions. For structured PIVs, the log baseline hazard is drawn
      between <inline-formula><alternatives>
      <tex-math><![CDATA[0.01]]></tex-math>
      <mml:math display="inline" xmlns:mml="http://www.w3.org/1998/Math/MathML"><mml:mn>0.01</mml:mn></mml:math></alternatives></inline-formula>
      and <inline-formula><alternatives>
      <tex-math><![CDATA[1]]></tex-math>
      <mml:math display="inline" xmlns:mml="http://www.w3.org/1998/Math/MathML"><mml:mn>1</mml:mn></mml:math></alternatives></inline-formula>
      per time unit and the covariate coefficients near
      <inline-formula><alternatives>
      <tex-math><![CDATA[0.]]></tex-math>
      <mml:math display="inline" xmlns:mml="http://www.w3.org/1998/Math/MathML"><mml:mrow><mml:mn>0</mml:mn><mml:mi>.</mml:mi></mml:mrow></mml:math></alternatives></inline-formula>
      The user can supply other starting values.</p>
    </sec>
    <sec id="stochastic-e-step">
      <title>Stochastic E-step</title>
      <p>Given <inline-formula><alternatives>
      <tex-math><![CDATA[\boldsymbol{\theta}]]></tex-math>
      <mml:math display="inline" xmlns:mml="http://www.w3.org/1998/Math/MathML"><mml:mi mathvariant="bold-italic">𝜽</mml:mi></mml:math></alternatives></inline-formula>,
      the Gibbs sampler alternates two blocks. First, the latent true
      values are drawn. For a non-linked record
      <inline-formula><alternatives>
      <tex-math><![CDATA[H^{\mathcal A}_{i,k}]]></tex-math>
      <mml:math display="inline" xmlns:mml="http://www.w3.org/1998/Math/MathML"><mml:msubsup><mml:mi>H</mml:mi><mml:mrow><mml:mi>i</mml:mi><mml:mo>,</mml:mo><mml:mi>k</mml:mi></mml:mrow><mml:mi mathvariant="script">𝒜</mml:mi></mml:msubsup></mml:math></alternatives></inline-formula>
      or <inline-formula><alternatives>
      <tex-math><![CDATA[H^{\mathcal B}_{j,k}]]></tex-math>
      <mml:math display="inline" xmlns:mml="http://www.w3.org/1998/Math/MathML"><mml:msubsup><mml:mi>H</mml:mi><mml:mrow><mml:mi>j</mml:mi><mml:mo>,</mml:mo><mml:mi>k</mml:mi></mml:mrow><mml:mi mathvariant="script">ℬ</mml:mi></mml:msubsup></mml:math></alternatives></inline-formula>
      is drawn from <inline-formula><alternatives>
      <tex-math><![CDATA[\boldsymbol\eta_k]]></tex-math>
      <mml:math display="inline" xmlns:mml="http://www.w3.org/1998/Math/MathML"><mml:msub><mml:mi mathvariant="bold-italic">𝜼</mml:mi><mml:mi>k</mml:mi></mml:msub></mml:math></alternatives></inline-formula>
      weighted by the registration model. For a linked pair
      <inline-formula><alternatives>
      <tex-math><![CDATA[(H^{\mathcal A}_{i,k}, H^{\mathcal B}_{j,k})]]></tex-math>
      <mml:math display="inline" xmlns:mml="http://www.w3.org/1998/Math/MathML"><mml:mrow><mml:mo stretchy="false" form="prefix">(</mml:mo><mml:msubsup><mml:mi>H</mml:mi><mml:mrow><mml:mi>i</mml:mi><mml:mo>,</mml:mo><mml:mi>k</mml:mi></mml:mrow><mml:mi mathvariant="script">𝒜</mml:mi></mml:msubsup><mml:mo>,</mml:mo><mml:msubsup><mml:mi>H</mml:mi><mml:mrow><mml:mi>j</mml:mi><mml:mo>,</mml:mo><mml:mi>k</mml:mi></mml:mrow><mml:mi mathvariant="script">ℬ</mml:mi></mml:msubsup><mml:mo stretchy="false" form="postfix">)</mml:mo></mml:mrow></mml:math></alternatives></inline-formula>
      is drawn jointly among the <inline-formula><alternatives>
      <tex-math><![CDATA[N_k \times N_k]]></tex-math>
      <mml:math display="inline" xmlns:mml="http://www.w3.org/1998/Math/MathML"><mml:mrow><mml:msub><mml:mi>N</mml:mi><mml:mi>k</mml:mi></mml:msub><mml:mo>×</mml:mo><mml:msub><mml:mi>N</mml:mi><mml:mi>k</mml:mi></mml:msub></mml:mrow></mml:math></alternatives></inline-formula>
      possible values, from <inline-formula><alternatives>
      <tex-math><![CDATA[\boldsymbol\eta_k]]></tex-math>
      <mml:math display="inline" xmlns:mml="http://www.w3.org/1998/Math/MathML"><mml:msub><mml:mi mathvariant="bold-italic">𝜼</mml:mi><mml:mi>k</mml:mi></mml:msub></mml:math></alternatives></inline-formula>
      weighted by the registration model and the survival model.</p>
      <p>Second, the linkage is updated. Candidate pairs are formed from
      matching sampled latent true values: records
      <inline-formula><alternatives>
      <tex-math><![CDATA[i \in \mathcal A]]></tex-math>
      <mml:math display="inline" xmlns:mml="http://www.w3.org/1998/Math/MathML"><mml:mrow><mml:mi>i</mml:mi><mml:mo>∈</mml:mo><mml:mi mathvariant="script">𝒜</mml:mi></mml:mrow></mml:math></alternatives></inline-formula>
      and <inline-formula><alternatives>
      <tex-math><![CDATA[j \in \mathcal B]]></tex-math>
      <mml:math display="inline" xmlns:mml="http://www.w3.org/1998/Math/MathML"><mml:mrow><mml:mi>j</mml:mi><mml:mo>∈</mml:mo><mml:mi mathvariant="script">ℬ</mml:mi></mml:mrow></mml:math></alternatives></inline-formula>
      are candidates when <inline-formula><alternatives>
      <tex-math><![CDATA[H^{\mathcal A}_{i,k} = H^{\mathcal B}_{j,k}]]></tex-math>
      <mml:math display="inline" xmlns:mml="http://www.w3.org/1998/Math/MathML"><mml:mrow><mml:msubsup><mml:mi>H</mml:mi><mml:mrow><mml:mi>i</mml:mi><mml:mo>,</mml:mo><mml:mi>k</mml:mi></mml:mrow><mml:mi mathvariant="script">𝒜</mml:mi></mml:msubsup><mml:mo>=</mml:mo><mml:msubsup><mml:mi>H</mml:mi><mml:mrow><mml:mi>j</mml:mi><mml:mo>,</mml:mo><mml:mi>k</mml:mi></mml:mrow><mml:mi mathvariant="script">ℬ</mml:mi></mml:msubsup></mml:mrow></mml:math></alternatives></inline-formula>
      for every non-structured PIV <inline-formula><alternatives>
      <tex-math><![CDATA[k]]></tex-math>
      <mml:math display="inline" xmlns:mml="http://www.w3.org/1998/Math/MathML"><mml:mi>k</mml:mi></mml:math></alternatives></inline-formula>
      (stable or flexible). For each candidate pair
      <inline-formula><alternatives>
      <tex-math><![CDATA[(i,j)]]></tex-math>
      <mml:math display="inline" xmlns:mml="http://www.w3.org/1998/Math/MathML"><mml:mrow><mml:mo stretchy="false" form="prefix">(</mml:mo><mml:mi>i</mml:mi><mml:mo>,</mml:mo><mml:mi>j</mml:mi><mml:mo stretchy="false" form="postfix">)</mml:mo></mml:mrow></mml:math></alternatives></inline-formula>,
      we evaluate the log likelihood contribution to
      Equation <xref alt="(3)" rid="eq-flexrl">(3)</xref> when the
      records are linked, <inline-formula><alternatives>
      <tex-math><![CDATA[\log \mathcal L^{\text{linked}}_{i,j}]]></tex-math>
      <mml:math display="inline" xmlns:mml="http://www.w3.org/1998/Math/MathML"><mml:mrow><mml:mrow><mml:mi mathvariant="normal">log</mml:mi><mml:mo>&#8289;</mml:mo></mml:mrow><mml:msubsup><mml:mi mathvariant="script">ℒ</mml:mi><mml:mrow><mml:mi>i</mml:mi><mml:mo>,</mml:mo><mml:mi>j</mml:mi></mml:mrow><mml:mtext mathvariant="normal">linked</mml:mtext></mml:msubsup></mml:mrow></mml:math></alternatives></inline-formula>,
      and when they are not, <inline-formula><alternatives>
      <tex-math><![CDATA[\log \mathcal L^{\mathcal A}_i + \log \mathcal L^{\mathcal B}_j.]]></tex-math>
      <mml:math display="inline" xmlns:mml="http://www.w3.org/1998/Math/MathML"><mml:mrow><mml:mrow><mml:mi mathvariant="normal">log</mml:mi><mml:mo>&#8289;</mml:mo></mml:mrow><mml:msubsup><mml:mi mathvariant="script">ℒ</mml:mi><mml:mi>i</mml:mi><mml:mi mathvariant="script">𝒜</mml:mi></mml:msubsup><mml:mo>+</mml:mo><mml:mrow><mml:mi mathvariant="normal">log</mml:mi><mml:mo>&#8289;</mml:mo></mml:mrow><mml:msubsup><mml:mi mathvariant="script">ℒ</mml:mi><mml:mi>j</mml:mi><mml:mi mathvariant="script">ℬ</mml:mi></mml:msubsup><mml:mi>.</mml:mi></mml:mrow></mml:math></alternatives></inline-formula>
      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 <xref alt="(3)" rid="eq-flexrl">(3)</xref> to the current
      ‘old’ state with probability <inline-formula><alternatives>
      <tex-math><![CDATA[\mathcal L_{\text{new}} / (\mathcal L_{\text{old}} + \mathcal L_{\text{new}})]]></tex-math>
      <mml:math display="inline" xmlns:mml="http://www.w3.org/1998/Math/MathML"><mml:mrow><mml:msub><mml:mi mathvariant="script">ℒ</mml:mi><mml:mtext mathvariant="normal">new</mml:mtext></mml:msub><mml:mi>/</mml:mi><mml:mo stretchy="false" form="prefix">(</mml:mo><mml:msub><mml:mi mathvariant="script">ℒ</mml:mi><mml:mtext mathvariant="normal">old</mml:mtext></mml:msub><mml:mo>+</mml:mo><mml:msub><mml:mi mathvariant="script">ℒ</mml:mi><mml:mtext mathvariant="normal">new</mml:mtext></mml:msub><mml:mo stretchy="false" form="postfix">)</mml:mo></mml:mrow></mml:math></alternatives></inline-formula>;
      the two states differ by <inline-formula><alternatives>
      <tex-math><![CDATA[\log \mathcal L^{\text{linked}}_{i,j} - \log \mathcal L^{\mathcal A}_i - \log \mathcal L^{\mathcal B}_j]]></tex-math>
      <mml:math display="inline" xmlns:mml="http://www.w3.org/1998/Math/MathML"><mml:mrow><mml:mrow><mml:mi mathvariant="normal">log</mml:mi><mml:mo>&#8289;</mml:mo></mml:mrow><mml:msubsup><mml:mi mathvariant="script">ℒ</mml:mi><mml:mrow><mml:mi>i</mml:mi><mml:mo>,</mml:mo><mml:mi>j</mml:mi></mml:mrow><mml:mtext mathvariant="normal">linked</mml:mtext></mml:msubsup><mml:mo>−</mml:mo><mml:mrow><mml:mi mathvariant="normal">log</mml:mi><mml:mo>&#8289;</mml:mo></mml:mrow><mml:msubsup><mml:mi mathvariant="script">ℒ</mml:mi><mml:mi>i</mml:mi><mml:mi mathvariant="script">𝒜</mml:mi></mml:msubsup><mml:mo>−</mml:mo><mml:mrow><mml:mi mathvariant="normal">log</mml:mi><mml:mo>&#8289;</mml:mo></mml:mrow><mml:msubsup><mml:mi mathvariant="script">ℒ</mml:mi><mml:mi>j</mml:mi><mml:mi mathvariant="script">ℬ</mml:mi></mml:msubsup></mml:mrow></mml:math></alternatives></inline-formula>
      and by the contributions from changes in the linkage matrix.</p>
      <p>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 <inline-formula><alternatives>
      <tex-math><![CDATA[\textbf{G}]]></tex-math>
      <mml:math display="inline" xmlns:mml="http://www.w3.org/1998/Math/MathML"><mml:mtext mathvariant="bold">𝐆</mml:mtext></mml:math></alternatives></inline-formula>
      and <inline-formula><alternatives>
      <tex-math><![CDATA[\textbf{H}]]></tex-math>
      <mml:math display="inline" xmlns:mml="http://www.w3.org/1998/Math/MathML"><mml:mtext mathvariant="bold">𝐇</mml:mtext></mml:math></alternatives></inline-formula>)—summary
      statistics required for the M-step.</p>
      <p>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.</p>
    </sec>
    <sec id="m-step">
      <title>M-step</title>
      <p>The summary statistics averaged over the Gibbs draws after
      burn-in give the parameter updates. Thanks to the factorisation of
      Equation <xref alt="(3)" rid="eq-flexrl">(3)</xref>,
      <inline-formula><alternatives>
      <tex-math><![CDATA[\gamma]]></tex-math>
      <mml:math display="inline" xmlns:mml="http://www.w3.org/1998/Math/MathML"><mml:mi>γ</mml:mi></mml:math></alternatives></inline-formula>,
      <inline-formula><alternatives>
      <tex-math><![CDATA[\boldsymbol{\eta}]]></tex-math>
      <mml:math display="inline" xmlns:mml="http://www.w3.org/1998/Math/MathML"><mml:mi mathvariant="bold-italic">𝜼</mml:mi></mml:math></alternatives></inline-formula>
      and <inline-formula><alternatives>
      <tex-math><![CDATA[\boldsymbol{\phi}]]></tex-math>
      <mml:math display="inline" xmlns:mml="http://www.w3.org/1998/Math/MathML"><mml:mi mathvariant="bold-italic">𝝓</mml:mi></mml:math></alternatives></inline-formula>
      have separate closed form updates
      (<named-content content-type="nocase">Robach, van der Pas, et
      al.</named-content>, 2025), and <inline-formula><alternatives>
      <tex-math><![CDATA[\boldsymbol{\alpha}]]></tex-math>
      <mml:math display="inline" xmlns:mml="http://www.w3.org/1998/Math/MathML"><mml:mi mathvariant="bold-italic">𝜶</mml:mi></mml:math></alternatives></inline-formula>
      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.</p>
    </sec>
  </sec>
  <sec id="sec-scores">
    <title>Linkage scores and decision rule</title>
    <p>Based on the StEM chains of estimates, we build an estimate of
    the set of parameters, <inline-formula><alternatives>
    <tex-math><![CDATA[\widehat{\boldsymbol{\theta}}]]></tex-math>
    <mml:math display="inline" xmlns:mml="http://www.w3.org/1998/Math/MathML"><mml:mover><mml:mi mathvariant="bold-italic">𝜽</mml:mi><mml:mo accent="true">̂</mml:mo></mml:mover></mml:math></alternatives></inline-formula>,
    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 <inline-formula><alternatives>
    <tex-math><![CDATA[\boldsymbol{\Delta}]]></tex-math>
    <mml:math display="inline" xmlns:mml="http://www.w3.org/1998/Math/MathML"><mml:mi mathvariant="bold">𝚫</mml:mi></mml:math></alternatives></inline-formula>
    as a final output, namely <inline-formula><alternatives>
    <tex-math><![CDATA[\widehat{\boldsymbol{D}}]]></tex-math>
    <mml:math display="inline" xmlns:mml="http://www.w3.org/1998/Math/MathML"><mml:mover><mml:mi mathvariant="bold-italic">𝑫</mml:mi><mml:mo accent="true">̂</mml:mo></mml:mover></mml:math></alternatives></inline-formula>,
    whose entries <inline-formula><alternatives>
    <tex-math><![CDATA[\widehat{D}_{i,j}]]></tex-math>
    <mml:math display="inline" xmlns:mml="http://www.w3.org/1998/Math/MathML"><mml:msub><mml:mover><mml:mi>D</mml:mi><mml:mo accent="true">̂</mml:mo></mml:mover><mml:mrow><mml:mi>i</mml:mi><mml:mo>,</mml:mo><mml:mi>j</mml:mi></mml:mrow></mml:msub></mml:math></alternatives></inline-formula>
    are the posterior probabilities for the pair
    <inline-formula><alternatives>
    <tex-math><![CDATA[(i,j)]]></tex-math>
    <mml:math display="inline" xmlns:mml="http://www.w3.org/1998/Math/MathML"><mml:mrow><mml:mo stretchy="false" form="prefix">(</mml:mo><mml:mi>i</mml:mi><mml:mo>,</mml:mo><mml:mi>j</mml:mi><mml:mo stretchy="false" form="postfix">)</mml:mo></mml:mrow></mml:math></alternatives></inline-formula>
    to be linked, which we call the linkage scores. A decision rule on
    each entry <inline-formula><alternatives>
    <tex-math><![CDATA[\xi \in [0.5,1)]]></tex-math>
    <mml:math display="inline" xmlns:mml="http://www.w3.org/1998/Math/MathML"><mml:mrow><mml:mi>ξ</mml:mi><mml:mo>∈</mml:mo><mml:mo stretchy="false" form="prefix">[</mml:mo><mml:mn>0.5</mml:mn><mml:mo>,</mml:mo><mml:mn>1</mml:mn><mml:mo stretchy="false" form="postfix">)</mml:mo></mml:mrow></mml:math></alternatives></inline-formula>
    then defines the final set of linked data
    <inline-formula><alternatives>
    <tex-math><![CDATA[\mathcal{D} = \{(i,j) ; \widehat{D}_{i,j} > \xi\}.]]></tex-math>
    <mml:math display="inline" xmlns:mml="http://www.w3.org/1998/Math/MathML"><mml:mrow><mml:mi mathvariant="script">𝒟</mml:mi><mml:mo>=</mml:mo><mml:mo stretchy="false" form="prefix">{</mml:mo><mml:mo stretchy="false" form="prefix">(</mml:mo><mml:mi>i</mml:mi><mml:mo>,</mml:mo><mml:mi>j</mml:mi><mml:mo stretchy="false" form="postfix">)</mml:mo><mml:mo>;</mml:mo><mml:msub><mml:mover><mml:mi>D</mml:mi><mml:mo accent="true">̂</mml:mo></mml:mover><mml:mrow><mml:mi>i</mml:mi><mml:mo>,</mml:mo><mml:mi>j</mml:mi></mml:mrow></mml:msub><mml:mo>&gt;</mml:mo><mml:mi>ξ</mml:mi><mml:mo stretchy="false" form="postfix">}</mml:mo><mml:mi>.</mml:mi></mml:mrow></mml:math></alternatives></inline-formula>
    Since the scores of a record sum to at most one, a threshold of at
    least <inline-formula><alternatives>
    <tex-math><![CDATA[0.5]]></tex-math>
    <mml:math display="inline" xmlns:mml="http://www.w3.org/1998/Math/MathML"><mml:mn>0.5</mml:mn></mml:math></alternatives></inline-formula>
    ensures the one-to-one assignment (Sadinle, 2017; Tancredi &amp;
    Liseo, 2011). The choice of <inline-formula><alternatives>
    <tex-math><![CDATA[\xi]]></tex-math>
    <mml:math display="inline" xmlns:mml="http://www.w3.org/1998/Math/MathML"><mml:mi>ξ</mml:mi></mml:math></alternatives></inline-formula>
    is the subject of the upcoming
    Section <xref alt="4" rid="sec-inference">4</xref>.</p>
    <p>Note that probabilistic record linkage methods estimate
    <inline-formula><alternatives>
    <tex-math><![CDATA[\boldsymbol{\Delta}]]></tex-math>
    <mml:math display="inline" xmlns:mml="http://www.w3.org/1998/Math/MathML"><mml:mi mathvariant="bold">𝚫</mml:mi></mml:math></alternatives></inline-formula>
    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
    <inline-formula><alternatives>
    <tex-math><![CDATA[[0,1]]]></tex-math>
    <mml:math display="inline" xmlns:mml="http://www.w3.org/1998/Math/MathML"><mml:mrow><mml:mo stretchy="false" form="prefix">[</mml:mo><mml:mn>0</mml:mn><mml:mo>,</mml:mo><mml:mn>1</mml:mn><mml:mo stretchy="false" form="postfix">]</mml:mo></mml:mrow></mml:math></alternatives></inline-formula>
    and treat all the methods listed in
    Table <xref alt="1" rid="tbl-packages">1</xref> in the same way.
    Accordingly, the default decision rule is
    <inline-formula><alternatives>
    <tex-math><![CDATA[\xi=0.5.]]></tex-math>
    <mml:math display="inline" xmlns:mml="http://www.w3.org/1998/Math/MathML"><mml:mrow><mml:mi>ξ</mml:mi><mml:mo>=</mml:mo><mml:mn>0.5</mml:mn><mml:mi>.</mml:mi></mml:mrow></mml:math></alternatives></inline-formula>
    The ‘FDP versus linkage decision rule’ curves (see
    Figure <xref alt="3" rid="fig-tradeoff">3</xref>) provide a more
    comprehensive assessment of record linkage performance.</p>
  </sec>
  <sec id="sec-stem">
    <title>Record linkage with <monospace>StEM()</monospace></title>
    <p><monospace>StEM()</monospace> runs
    Algorithm <xref alt="1" rid="alg-stem">1</xref>. Its main arguments
    are:</p>
    <list list-type="bullet">
      <list-item>
        <p><monospace>data</monospace>: a list, typically the output of
        <monospace>prepare_data()</monospace>, with the encoded sources
        <monospace>encodedA</monospace> and
        <monospace>encodedB</monospace>, the number of distinct values
        of each PIV <monospace>n_values</monospace> (excluding missing
        values), a logical indicating whether both sources share the
        registration error parameters
        <monospace>same_mistakes</monospace>, and the PIVs configuration
        <monospace>PIVs_config</monospace>.</p>
      </list-item>
      <list-item>
        <p><monospace>StEM_iter</monospace>,
        <monospace>StEM_burnin</monospace>,
        <monospace>gibbs_iter</monospace>,
        <monospace>gibbs_burnin</monospace>: the numbers of iterations
        of the outer StEM algorithm and of the inner Gibbs sampler, and
        their burn-in periods. <monospace>gibbs_burnin = 0</monospace>
        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.</p>
      </list-item>
      <list-item>
        <p><monospace>threads</monospace>: the number of
        <monospace>OpenMP</monospace> threads used by the
        <monospace>Rcpp</monospace> samplers, default 4. The argument is
        ignored on systems where the package is built without
        <monospace>OpenMP</monospace>.</p>
      </list-item>
      <list-item>
        <p><monospace>model_dynamics</monospace>: the survival model for
        structured PIVs, by default the exponential model of
        Equation <xref alt="(4)" rid="eq-survival">(4)</xref>. It is
        only used if a PIV is declared structured in
        <monospace>PIVs_config</monospace>.</p>
      </list-item>
      <list-item>
        <p><monospace>n_post_sample</monospace>: the number of posterior
        draws used to compute the linkage scores.</p>
      </list-item>
      <list-item>
        <p>Starting values for <inline-formula><alternatives>
        <tex-math><![CDATA[\gamma]]></tex-math>
        <mml:math display="inline" xmlns:mml="http://www.w3.org/1998/Math/MathML"><mml:mi>γ</mml:mi></mml:math></alternatives></inline-formula>
        and for the agreement probabilities
        <inline-formula><alternatives>
        <tex-math><![CDATA[1-\boldsymbol\phi]]></tex-math>
        <mml:math display="inline" xmlns:mml="http://www.w3.org/1998/Math/MathML"><mml:mrow><mml:mn>1</mml:mn><mml:mo>−</mml:mo><mml:mi mathvariant="bold-italic">𝝓</mml:mi></mml:mrow></mml:math></alternatives></inline-formula>
        can be supplied.</p>
      </list-item>
      <list-item>
        <p>For long runs, <monospace>new_directory</monospace> and
        <monospace>save_info_iter = TRUE</monospace> save the
        environment after each StEM iteration, and
        <monospace>music_on = TRUE</monospace> plays a short tune when
        the algorithm finishes running.</p>
      </list-item>
    </list>
    <p>The function returns <monospace>Delta</monospace>, a data frame
    with columns <monospace>i</monospace> (indices in
    <inline-formula><alternatives>
    <tex-math><![CDATA[\mathcal A]]></tex-math>
    <mml:math display="inline" xmlns:mml="http://www.w3.org/1998/Math/MathML"><mml:mi mathvariant="script">𝒜</mml:mi></mml:math></alternatives></inline-formula>),
    <monospace>j</monospace> (indices in <inline-formula><alternatives>
    <tex-math><![CDATA[\mathcal B]]></tex-math>
    <mml:math display="inline" xmlns:mml="http://www.w3.org/1998/Math/MathML"><mml:mi mathvariant="script">ℬ</mml:mi></mml:math></alternatives></inline-formula>)
    and <monospace>x</monospace> (scores <inline-formula><alternatives>
    <tex-math><![CDATA[\widehat{D}_{i,j}]]></tex-math>
    <mml:math display="inline" xmlns:mml="http://www.w3.org/1998/Math/MathML"><mml:msub><mml:mover><mml:mi>D</mml:mi><mml:mo accent="true">̂</mml:mo></mml:mover><mml:mrow><mml:mi>i</mml:mi><mml:mo>,</mml:mo><mml:mi>j</mml:mi></mml:mrow></mml:msub></mml:math></alternatives></inline-formula>)
    for every pair with a positive score, and the four chains:
    <monospace>gamma</monospace> (a vector of length
    <monospace>StEM_iter</monospace>), <monospace>eta</monospace> (one
    <monospace>StEM_iter</monospace><inline-formula><alternatives>
    <tex-math><![CDATA[\times N_k]]></tex-math>
    <mml:math display="inline" xmlns:mml="http://www.w3.org/1998/Math/MathML"><mml:mrow><mml:mi>×</mml:mi><mml:msub><mml:mi>N</mml:mi><mml:mi>k</mml:mi></mml:msub></mml:mrow></mml:math></alternatives></inline-formula>
    matrix per PIV), <monospace>alpha</monospace> (one matrix per
    structured PIV, with <monospace>StEM_iter</monospace> rows and one
    column per parameter of the survival model) and
    <monospace>phi</monospace> (one
    <monospace>StEM_iter</monospace><inline-formula><alternatives>
    <tex-math><![CDATA[\times 4]]></tex-math>
    <mml:math display="inline" xmlns:mml="http://www.w3.org/1998/Math/MathML"><mml:mrow><mml:mi>×</mml:mi><mml:mn>4</mml:mn></mml:mrow></mml:math></alternatives></inline-formula>
    matrix per PIV: agreement in <inline-formula><alternatives>
    <tex-math><![CDATA[\mathcal A]]></tex-math>
    <mml:math display="inline" xmlns:mml="http://www.w3.org/1998/Math/MathML"><mml:mi mathvariant="script">𝒜</mml:mi></mml:math></alternatives></inline-formula>,
    in <inline-formula><alternatives>
    <tex-math><![CDATA[\mathcal B]]></tex-math>
    <mml:math display="inline" xmlns:mml="http://www.w3.org/1998/Math/MathML"><mml:mi mathvariant="script">ℬ</mml:mi></mml:math></alternatives></inline-formula>,
    missing in <inline-formula><alternatives>
    <tex-math><![CDATA[\mathcal A]]></tex-math>
    <mml:math display="inline" xmlns:mml="http://www.w3.org/1998/Math/MathML"><mml:mi mathvariant="script">𝒜</mml:mi></mml:math></alternatives></inline-formula>,
    in <inline-formula><alternatives>
    <tex-math><![CDATA[\mathcal B]]></tex-math>
    <mml:math display="inline" xmlns:mml="http://www.w3.org/1998/Math/MathML"><mml:mi mathvariant="script">ℬ</mml:mi></mml:math></alternatives></inline-formula>).</p>
    <p>We run the <italic>FlexRL</italic> <monospace>StEM</monospace>
    algorithm for record linkage as follows:</p>
    <code language="r script">fit &lt;- StEM(data = prep_data)</code>
  </sec>
  <sec id="sec-computation">
    <title>Computational aspects</title>
    <p>The two latent variable samplers are implemented with
    <monospace>Rcpp</monospace>. To draw the true values,
    <monospace>sampleH()</monospace> goes through the
    <inline-formula><alternatives>
    <tex-math><![CDATA[N_k^2]]></tex-math>
    <mml:math display="inline" xmlns:mml="http://www.w3.org/1998/Math/MathML"><mml:msubsup><mml:mi>N</mml:mi><mml:mi>k</mml:mi><mml:mn>2</mml:mn></mml:msubsup></mml:math></alternatives></inline-formula>
    joint values once per PIV <inline-formula><alternatives>
    <tex-math><![CDATA[k]]></tex-math>
    <mml:math display="inline" xmlns:mml="http://www.w3.org/1998/Math/MathML"><mml:mi>k</mml:mi></mml:math></alternatives></inline-formula>
    for linked pairs and through the <inline-formula><alternatives>
    <tex-math><![CDATA[N_k]]></tex-math>
    <mml:math display="inline" xmlns:mml="http://www.w3.org/1998/Math/MathML"><mml:msub><mml:mi>N</mml:mi><mml:mi>k</mml:mi></mml:msub></mml:math></alternatives></inline-formula>
    values once per PIV <inline-formula><alternatives>
    <tex-math><![CDATA[k]]></tex-math>
    <mml:math display="inline" xmlns:mml="http://www.w3.org/1998/Math/MathML"><mml:mi>k</mml:mi></mml:math></alternatives></inline-formula>
    for non-linked records. <monospace>sampleD()</monospace> performs
    the sequential sweep over candidate pairs, recording the current
    linkage in two vectors that give, for each record of
    <inline-formula><alternatives>
    <tex-math><![CDATA[\mathcal A]]></tex-math>
    <mml:math display="inline" xmlns:mml="http://www.w3.org/1998/Math/MathML"><mml:mi mathvariant="script">𝒜</mml:mi></mml:math></alternatives></inline-formula>
    and of <inline-formula><alternatives>
    <tex-math><![CDATA[\mathcal B]]></tex-math>
    <mml:math display="inline" xmlns:mml="http://www.w3.org/1998/Math/MathML"><mml:mi mathvariant="script">ℬ</mml:mi></mml:math></alternatives></inline-formula>,
    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
    <inline-formula><alternatives>
    <tex-math><![CDATA[N_{\mathcal A} + N_{\mathcal B}]]></tex-math>
    <mml:math display="inline" xmlns:mml="http://www.w3.org/1998/Math/MathML"><mml:mrow><mml:msub><mml:mi>N</mml:mi><mml:mi mathvariant="script">𝒜</mml:mi></mml:msub><mml:mo>+</mml:mo><mml:msub><mml:mi>N</mml:mi><mml:mi mathvariant="script">ℬ</mml:mi></mml:msub></mml:mrow></mml:math></alternatives></inline-formula>
    rather than in <inline-formula><alternatives>
    <tex-math><![CDATA[N_{\mathcal A} \times N_{\mathcal B}.]]></tex-math>
    <mml:math display="inline" xmlns:mml="http://www.w3.org/1998/Math/MathML"><mml:mrow><mml:msub><mml:mi>N</mml:mi><mml:mi mathvariant="script">𝒜</mml:mi></mml:msub><mml:mo>×</mml:mo><mml:msub><mml:mi>N</mml:mi><mml:mi mathvariant="script">ℬ</mml:mi></mml:msub><mml:mi>.</mml:mi></mml:mrow></mml:math></alternatives></inline-formula></p>
    <p>Candidate pairs are found by hashing the pattern of sampled true
    values on the non-structured PIVs, an operation linear in
    <inline-formula><alternatives>
    <tex-math><![CDATA[N_{\mathcal A} + N_{\mathcal B}.]]></tex-math>
    <mml:math display="inline" xmlns:mml="http://www.w3.org/1998/Math/MathML"><mml:mrow><mml:msub><mml:mi>N</mml:mi><mml:mi mathvariant="script">𝒜</mml:mi></mml:msub><mml:mo>+</mml:mo><mml:msub><mml:mi>N</mml:mi><mml:mi mathvariant="script">ℬ</mml:mi></mml:msub><mml:mi>.</mml:mi></mml:mrow></mml:math></alternatives></inline-formula>
    Their contributions to the complete data likelihood are computed in
    a single pass over the records and the candidate pairs, implemented
    in <monospace>Rcpp</monospace>. Built-in survival models are
    evaluated in <monospace>Rcpp</monospace>; custom survival functions
    keep their <monospace>R</monospace> implementation.</p>
    <p>The single pass over the candidate pairs likelihood contributions
    can be parallelised over <monospace>OpenMP</monospace> threads, each
    processing a disjoint set of candidates. Without
    <monospace>OpenMP</monospace> the code runs sequentially. All random
    draws occur upstream, so the threads never call the
    <monospace>R</monospace> random number generator. Results are
    therefore identical regardless of the number of threads, and
    <monospace>set.seed()</monospace> ensures reproducibility.</p>
    <p>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.</p>
  </sec>
</sec>
<sec id="sec-inference">
  <title>Inference on linked data</title>
  <sec id="sec-linkage-error">
    <title>Impact of linkage errors on linear regression</title>
    <p>Suppose we are interested in estimating the association between
    <inline-formula><alternatives>
    <tex-math><![CDATA[X]]></tex-math>
    <mml:math display="inline" xmlns:mml="http://www.w3.org/1998/Math/MathML"><mml:mi>X</mml:mi></mml:math></alternatives></inline-formula>
    recorded in <inline-formula><alternatives>
    <tex-math><![CDATA[\mathcal A]]></tex-math>
    <mml:math display="inline" xmlns:mml="http://www.w3.org/1998/Math/MathML"><mml:mi mathvariant="script">𝒜</mml:mi></mml:math></alternatives></inline-formula>
    and <inline-formula><alternatives>
    <tex-math><![CDATA[Y]]></tex-math>
    <mml:math display="inline" xmlns:mml="http://www.w3.org/1998/Math/MathML"><mml:mi>Y</mml:mi></mml:math></alternatives></inline-formula>
    recorded in <inline-formula><alternatives>
    <tex-math><![CDATA[\mathcal B]]></tex-math>
    <mml:math display="inline" xmlns:mml="http://www.w3.org/1998/Math/MathML"><mml:mi mathvariant="script">ℬ</mml:mi></mml:math></alternatives></inline-formula>,
    for instance through the slope <inline-formula><alternatives>
    <tex-math><![CDATA[\beta]]></tex-math>
    <mml:math display="inline" xmlns:mml="http://www.w3.org/1998/Math/MathML"><mml:mi>β</mml:mi></mml:math></alternatives></inline-formula>
    of the linear regression <inline-formula><alternatives>
    <tex-math><![CDATA[Y = X\beta + \varepsilon]]></tex-math>
    <mml:math display="inline" xmlns:mml="http://www.w3.org/1998/Math/MathML"><mml:mrow><mml:mi>Y</mml:mi><mml:mo>=</mml:mo><mml:mi>X</mml:mi><mml:mi>β</mml:mi><mml:mo>+</mml:mo><mml:mi>ε</mml:mi></mml:mrow></mml:math></alternatives></inline-formula>,
    with <inline-formula><alternatives>
    <tex-math><![CDATA[\mathbb E[\varepsilon]=0]]></tex-math>
    <mml:math display="inline" xmlns:mml="http://www.w3.org/1998/Math/MathML"><mml:mrow><mml:mi mathvariant="double-struck">𝔼</mml:mi><mml:mo stretchy="false" form="prefix">[</mml:mo><mml:mi>ε</mml:mi><mml:mo stretchy="false" form="postfix">]</mml:mo><mml:mo>=</mml:mo><mml:mn>0</mml:mn></mml:mrow></mml:math></alternatives></inline-formula>
    and <inline-formula><alternatives>
    <tex-math><![CDATA[\mathbb E[X \varepsilon]=0]]></tex-math>
    <mml:math display="inline" xmlns:mml="http://www.w3.org/1998/Math/MathML"><mml:mrow><mml:mi mathvariant="double-struck">𝔼</mml:mi><mml:mo stretchy="false" form="prefix">[</mml:mo><mml:mi>X</mml:mi><mml:mi>ε</mml:mi><mml:mo stretchy="false" form="postfix">]</mml:mo><mml:mo>=</mml:mo><mml:mn>0</mml:mn></mml:mrow></mml:math></alternatives></inline-formula>,
    so that
    <styled-content id="eq-beta-hat-0"><disp-formula><alternatives>
    <tex-math><![CDATA[\widehat \beta = \operatorname{Cov}(X,Y)/\operatorname{Var}(X). \label{eq-beta-hat-0} \qquad(5)]]></tex-math>
    <mml:math display="block" xmlns:mml="http://www.w3.org/1998/Math/MathML"><mml:mrow><mml:mover><mml:mi>β</mml:mi><mml:mo accent="true">̂</mml:mo></mml:mover><mml:mo>=</mml:mo><mml:mrow><mml:mi mathvariant="normal">Cov</mml:mi><mml:mo>&#8289;</mml:mo></mml:mrow><mml:mo stretchy="false" form="prefix">(</mml:mo><mml:mi>X</mml:mi><mml:mo>,</mml:mo><mml:mi>Y</mml:mi><mml:mo stretchy="false" form="postfix">)</mml:mo><mml:mi>/</mml:mi><mml:mrow><mml:mi mathvariant="normal">Var</mml:mi><mml:mo>&#8289;</mml:mo></mml:mrow><mml:mo stretchy="false" form="prefix">(</mml:mo><mml:mi>X</mml:mi><mml:mo stretchy="false" form="postfix">)</mml:mo><mml:mi>.</mml:mi><mml:mspace width="2.0em"></mml:mspace><mml:mo stretchy="false" form="prefix">(</mml:mo><mml:mn>5</mml:mn><mml:mo stretchy="false" form="postfix">)</mml:mo></mml:mrow></mml:math></alternatives></disp-formula></styled-content>
    The target is <inline-formula><alternatives>
    <tex-math><![CDATA[\beta]]></tex-math>
    <mml:math display="inline" xmlns:mml="http://www.w3.org/1998/Math/MathML"><mml:mi>β</mml:mi></mml:math></alternatives></inline-formula>
    in the population of entities present in both sources. The analyst
    only observes the linked data <inline-formula><alternatives>
    <tex-math><![CDATA[\mathcal{D} = \{(i,j) ; \widehat{D}_{i,j} > \xi\}]]></tex-math>
    <mml:math display="inline" xmlns:mml="http://www.w3.org/1998/Math/MathML"><mml:mrow><mml:mi mathvariant="script">𝒟</mml:mi><mml:mo>=</mml:mo><mml:mo stretchy="false" form="prefix">{</mml:mo><mml:mo stretchy="false" form="prefix">(</mml:mo><mml:mi>i</mml:mi><mml:mo>,</mml:mo><mml:mi>j</mml:mi><mml:mo stretchy="false" form="postfix">)</mml:mo><mml:mo>;</mml:mo><mml:msub><mml:mover><mml:mi>D</mml:mi><mml:mo accent="true">̂</mml:mo></mml:mover><mml:mrow><mml:mi>i</mml:mi><mml:mo>,</mml:mo><mml:mi>j</mml:mi></mml:mrow></mml:msub><mml:mo>&gt;</mml:mo><mml:mi>ξ</mml:mi><mml:mo stretchy="false" form="postfix">}</mml:mo></mml:mrow></mml:math></alternatives></inline-formula>
    with <inline-formula><alternatives>
    <tex-math><![CDATA[X_i]]></tex-math>
    <mml:math display="inline" xmlns:mml="http://www.w3.org/1998/Math/MathML"><mml:msub><mml:mi>X</mml:mi><mml:mi>i</mml:mi></mml:msub></mml:math></alternatives></inline-formula>
    from <inline-formula><alternatives>
    <tex-math><![CDATA[\mathcal A]]></tex-math>
    <mml:math display="inline" xmlns:mml="http://www.w3.org/1998/Math/MathML"><mml:mi mathvariant="script">𝒜</mml:mi></mml:math></alternatives></inline-formula>
    and <inline-formula><alternatives>
    <tex-math><![CDATA[Y_j]]></tex-math>
    <mml:math display="inline" xmlns:mml="http://www.w3.org/1998/Math/MathML"><mml:msub><mml:mi>Y</mml:mi><mml:mi>j</mml:mi></mml:msub></mml:math></alternatives></inline-formula>
    from <inline-formula><alternatives>
    <tex-math><![CDATA[\mathcal B.]]></tex-math>
    <mml:math display="inline" xmlns:mml="http://www.w3.org/1998/Math/MathML"><mml:mrow><mml:mi mathvariant="script">ℬ</mml:mi><mml:mi>.</mml:mi></mml:mrow></mml:math></alternatives></inline-formula>
    <inline-formula><alternatives>
    <tex-math><![CDATA[Y_j]]></tex-math>
    <mml:math display="inline" xmlns:mml="http://www.w3.org/1998/Math/MathML"><mml:msub><mml:mi>Y</mml:mi><mml:mi>j</mml:mi></mml:msub></mml:math></alternatives></inline-formula>
    equals <inline-formula><alternatives>
    <tex-math><![CDATA[Y_i]]></tex-math>
    <mml:math display="inline" xmlns:mml="http://www.w3.org/1998/Math/MathML"><mml:msub><mml:mi>Y</mml:mi><mml:mi>i</mml:mi></mml:msub></mml:math></alternatives></inline-formula>
    for truly linked pairs but belongs to another entity for falsely
    linked records. Among the linked data, a proportion
    <inline-formula><alternatives>
    <tex-math><![CDATA[1-\text{FDP}]]></tex-math>
    <mml:math display="inline" xmlns:mml="http://www.w3.org/1998/Math/MathML"><mml:mrow><mml:mn>1</mml:mn><mml:mo>−</mml:mo><mml:mtext mathvariant="normal">FDP</mml:mtext></mml:mrow></mml:math></alternatives></inline-formula>
    (that may in reality depend on <inline-formula><alternatives>
    <tex-math><![CDATA[X]]></tex-math>
    <mml:math display="inline" xmlns:mml="http://www.w3.org/1998/Math/MathML"><mml:mi>X</mml:mi></mml:math></alternatives></inline-formula>)
    carries the correct <inline-formula><alternatives>
    <tex-math><![CDATA[Y]]></tex-math>
    <mml:math display="inline" xmlns:mml="http://www.w3.org/1998/Math/MathML"><mml:mi>Y</mml:mi></mml:math></alternatives></inline-formula>
    and a proportion <inline-formula><alternatives>
    <tex-math><![CDATA[\text{FDP}]]></tex-math>
    <mml:math display="inline" xmlns:mml="http://www.w3.org/1998/Math/MathML"><mml:mtext mathvariant="normal">FDP</mml:mtext></mml:math></alternatives></inline-formula>
    carries a spurious one. Below we denote by
    <inline-formula><alternatives>
    <tex-math><![CDATA[\widehat{\boldsymbol{\Delta}}]]></tex-math>
    <mml:math display="inline" xmlns:mml="http://www.w3.org/1998/Math/MathML"><mml:mover><mml:mi mathvariant="bold">𝚫</mml:mi><mml:mo accent="true">̂</mml:mo></mml:mover></mml:math></alternatives></inline-formula>
    the estimator of <inline-formula><alternatives>
    <tex-math><![CDATA[\boldsymbol{\Delta}]]></tex-math>
    <mml:math display="inline" xmlns:mml="http://www.w3.org/1998/Math/MathML"><mml:mi mathvariant="bold">𝚫</mml:mi></mml:math></alternatives></inline-formula>,
    with <inline-formula><alternatives>
    <tex-math><![CDATA[\widehat{\Delta}_{i,j} = 1]]></tex-math>
    <mml:math display="inline" xmlns:mml="http://www.w3.org/1998/Math/MathML"><mml:mrow><mml:msub><mml:mover><mml:mi mathvariant="normal">Δ</mml:mi><mml:mo accent="true">̂</mml:mo></mml:mover><mml:mrow><mml:mi>i</mml:mi><mml:mo>,</mml:mo><mml:mi>j</mml:mi></mml:mrow></mml:msub><mml:mo>=</mml:mo><mml:mn>1</mml:mn></mml:mrow></mml:math></alternatives></inline-formula>
    for pairs <inline-formula><alternatives>
    <tex-math><![CDATA[(i,j)]]></tex-math>
    <mml:math display="inline" xmlns:mml="http://www.w3.org/1998/Math/MathML"><mml:mrow><mml:mo stretchy="false" form="prefix">(</mml:mo><mml:mi>i</mml:mi><mml:mo>,</mml:mo><mml:mi>j</mml:mi><mml:mo stretchy="false" form="postfix">)</mml:mo></mml:mrow></mml:math></alternatives></inline-formula>
    in <inline-formula><alternatives>
    <tex-math><![CDATA[\mathcal{D}.]]></tex-math>
    <mml:math display="inline" xmlns:mml="http://www.w3.org/1998/Math/MathML"><mml:mrow><mml:mi mathvariant="script">𝒟</mml:mi><mml:mi>.</mml:mi></mml:mrow></mml:math></alternatives></inline-formula>
    Truly linked pairs of records (true positives, TP) are thus denoted
    <inline-formula><alternatives>
    <tex-math><![CDATA[\{ \widehat{\boldsymbol{\Delta}} = 1, \boldsymbol{\Delta} = 1 \}]]></tex-math>
    <mml:math display="inline" xmlns:mml="http://www.w3.org/1998/Math/MathML"><mml:mrow><mml:mo stretchy="false" form="prefix">{</mml:mo><mml:mover><mml:mi mathvariant="bold">𝚫</mml:mi><mml:mo accent="true">̂</mml:mo></mml:mover><mml:mo>=</mml:mo><mml:mn>1</mml:mn><mml:mo>,</mml:mo><mml:mi mathvariant="bold">𝚫</mml:mi><mml:mo>=</mml:mo><mml:mn>1</mml:mn><mml:mo stretchy="false" form="postfix">}</mml:mo></mml:mrow></mml:math></alternatives></inline-formula>
    and falsely linked pairs of records (false positives, FP)
    <inline-formula><alternatives>
    <tex-math><![CDATA[\{ \widehat{\boldsymbol{\Delta}} = 1, \boldsymbol{\Delta} = 0 \}.]]></tex-math>
    <mml:math display="inline" xmlns:mml="http://www.w3.org/1998/Math/MathML"><mml:mrow><mml:mo stretchy="false" form="prefix">{</mml:mo><mml:mover><mml:mi mathvariant="bold">𝚫</mml:mi><mml:mo accent="true">̂</mml:mo></mml:mover><mml:mo>=</mml:mo><mml:mn>1</mml:mn><mml:mo>,</mml:mo><mml:mi mathvariant="bold">𝚫</mml:mi><mml:mo>=</mml:mo><mml:mn>0</mml:mn><mml:mo stretchy="false" form="postfix">}</mml:mo><mml:mi>.</mml:mi></mml:mrow></mml:math></alternatives></inline-formula>
    Heuristically, <disp-formula><alternatives>
    <tex-math><![CDATA[ \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} ]]></tex-math>
    <mml:math display="block" xmlns:mml="http://www.w3.org/1998/Math/MathML"><mml:mtable><mml:mtr><mml:mtd columnalign="right" style="text-align: right; padding-right: 0"><mml:mi mathvariant="double-struck">𝔼</mml:mi><mml:mo stretchy="false" form="prefix">[</mml:mo><mml:mi>Y</mml:mi><mml:mo>∣</mml:mo><mml:mi>X</mml:mi><mml:mo>,</mml:mo><mml:mover><mml:mi mathvariant="bold">𝚫</mml:mi><mml:mo accent="true">̂</mml:mo></mml:mover><mml:mo>=</mml:mo><mml:mn>1</mml:mn><mml:mo stretchy="false" form="postfix">]</mml:mo></mml:mtd><mml:mtd columnalign="left" style="text-align: left; padding-left: 0"><mml:mo>=</mml:mo><mml:mo stretchy="false" form="prefix">(</mml:mo><mml:mn>1</mml:mn><mml:mo>−</mml:mo><mml:mtext mathvariant="normal">FDP</mml:mtext><mml:mo stretchy="false" form="postfix">)</mml:mo><mml:mo>⋅</mml:mo><mml:mi mathvariant="double-struck">𝔼</mml:mi><mml:mo stretchy="false" form="prefix">[</mml:mo><mml:mi>Y</mml:mi><mml:mo>∣</mml:mo><mml:mi>X</mml:mi><mml:mo>,</mml:mo><mml:mover><mml:mi mathvariant="bold">𝚫</mml:mi><mml:mo accent="true">̂</mml:mo></mml:mover><mml:mo>=</mml:mo><mml:mn>1</mml:mn><mml:mo>,</mml:mo><mml:mi mathvariant="bold">𝚫</mml:mi><mml:mo>=</mml:mo><mml:mn>1</mml:mn><mml:mo stretchy="false" form="postfix">]</mml:mo><mml:mo>+</mml:mo><mml:mtext mathvariant="normal">FDP</mml:mtext><mml:mo>⋅</mml:mo><mml:mi mathvariant="double-struck">𝔼</mml:mi><mml:mo stretchy="false" form="prefix">[</mml:mo><mml:mi>Y</mml:mi><mml:mo>∣</mml:mo><mml:mi>X</mml:mi><mml:mo>,</mml:mo><mml:mover><mml:mi mathvariant="bold">𝚫</mml:mi><mml:mo accent="true">̂</mml:mo></mml:mover><mml:mo>=</mml:mo><mml:mn>1</mml:mn><mml:mo>,</mml:mo><mml:mi mathvariant="bold">𝚫</mml:mi><mml:mo>=</mml:mo><mml:mn>0</mml:mn><mml:mo stretchy="false" form="postfix">]</mml:mo></mml:mtd></mml:mtr><mml:mtr><mml:mtd columnalign="right" style="text-align: right; padding-right: 0"></mml:mtd><mml:mtd columnalign="left" style="text-align: left; padding-left: 0"><mml:mo>=</mml:mo><mml:mo stretchy="false" form="prefix">(</mml:mo><mml:mn>1</mml:mn><mml:mo>−</mml:mo><mml:mtext mathvariant="normal">FDP</mml:mtext><mml:mo stretchy="false" form="postfix">)</mml:mo><mml:mo>⋅</mml:mo><mml:msub><mml:mi mathvariant="double-struck">𝔼</mml:mi><mml:mrow><mml:mi>T</mml:mi><mml:mi>P</mml:mi></mml:mrow></mml:msub><mml:mo stretchy="false" form="prefix">[</mml:mo><mml:mi>Y</mml:mi><mml:mo>∣</mml:mo><mml:mi>X</mml:mi><mml:mo stretchy="false" form="postfix">]</mml:mo><mml:mo>+</mml:mo><mml:mtext mathvariant="normal">FDP</mml:mtext><mml:mo>⋅</mml:mo><mml:msub><mml:mi mathvariant="double-struck">𝔼</mml:mi><mml:mrow><mml:mi>F</mml:mi><mml:mi>P</mml:mi></mml:mrow></mml:msub><mml:mo stretchy="false" form="prefix">[</mml:mo><mml:mi>Y</mml:mi><mml:mo>∣</mml:mo><mml:mi>X</mml:mi><mml:mo stretchy="false" form="postfix">]</mml:mo><mml:mo>,</mml:mo></mml:mtd></mml:mtr></mml:mtable></mml:math></alternatives></disp-formula>
    where <inline-formula><alternatives>
    <tex-math><![CDATA[\mathbb E_{TP}]]></tex-math>
    <mml:math display="inline" xmlns:mml="http://www.w3.org/1998/Math/MathML"><mml:msub><mml:mi mathvariant="double-struck">𝔼</mml:mi><mml:mrow><mml:mi>T</mml:mi><mml:mi>P</mml:mi></mml:mrow></mml:msub></mml:math></alternatives></inline-formula>
    and <inline-formula><alternatives>
    <tex-math><![CDATA[\mathbb E_{FP}]]></tex-math>
    <mml:math display="inline" xmlns:mml="http://www.w3.org/1998/Math/MathML"><mml:msub><mml:mi mathvariant="double-struck">𝔼</mml:mi><mml:mrow><mml:mi>F</mml:mi><mml:mi>P</mml:mi></mml:mrow></mml:msub></mml:math></alternatives></inline-formula>
    denote expectations among truly and falsely linked pairs.</p>
    <p>Let us recast <inline-formula><alternatives>
    <tex-math><![CDATA[\widehat\beta]]></tex-math>
    <mml:math display="inline" xmlns:mml="http://www.w3.org/1998/Math/MathML"><mml:mover><mml:mi>β</mml:mi><mml:mo accent="true">̂</mml:mo></mml:mover></mml:math></alternatives></inline-formula>
    accordingly. If <inline-formula><alternatives>
    <tex-math><![CDATA[X]]></tex-math>
    <mml:math display="inline" xmlns:mml="http://www.w3.org/1998/Math/MathML"><mml:mi>X</mml:mi></mml:math></alternatives></inline-formula>
    has the same mean and variance among all data in
    <inline-formula><alternatives>
    <tex-math><![CDATA[\mathcal{A}]]></tex-math>
    <mml:math display="inline" xmlns:mml="http://www.w3.org/1998/Math/MathML"><mml:mi mathvariant="script">𝒜</mml:mi></mml:math></alternatives></inline-formula>,
    then <inline-formula><alternatives>
    <tex-math><![CDATA[\widehat\beta]]></tex-math>
    <mml:math display="inline" xmlns:mml="http://www.w3.org/1998/Math/MathML"><mml:mover><mml:mi>β</mml:mi><mml:mo accent="true">̂</mml:mo></mml:mover></mml:math></alternatives></inline-formula>
    is a mixture of <inline-formula><alternatives>
    <tex-math><![CDATA[\widehat\beta_{TP}]]></tex-math>
    <mml:math display="inline" xmlns:mml="http://www.w3.org/1998/Math/MathML"><mml:msub><mml:mover><mml:mi>β</mml:mi><mml:mo accent="true">̂</mml:mo></mml:mover><mml:mrow><mml:mi>T</mml:mi><mml:mi>P</mml:mi></mml:mrow></mml:msub></mml:math></alternatives></inline-formula>
    and <inline-formula><alternatives>
    <tex-math><![CDATA[\widehat\beta_{FP}]]></tex-math>
    <mml:math display="inline" xmlns:mml="http://www.w3.org/1998/Math/MathML"><mml:msub><mml:mover><mml:mi>β</mml:mi><mml:mo accent="true">̂</mml:mo></mml:mover><mml:mrow><mml:mi>F</mml:mi><mml:mi>P</mml:mi></mml:mrow></mml:msub></mml:math></alternatives></inline-formula>,
    defined as in
    Equation <xref alt="(5)" rid="eq-beta-hat-0">(5)</xref> for the
    subsets of TP and FP,
    <styled-content id="eq-beta-hat"><disp-formula><alternatives>
    <tex-math><![CDATA[
        \widehat\beta = (1-\text{FDP}) \cdot \widehat\beta_{TP} + \text{FDP} \cdot \widehat\beta_{FP}.
     \label{eq-beta-hat} \qquad(6)]]></tex-math>
    <mml:math display="block" xmlns:mml="http://www.w3.org/1998/Math/MathML"><mml:mrow><mml:mover><mml:mi>β</mml:mi><mml:mo accent="true">̂</mml:mo></mml:mover><mml:mo>=</mml:mo><mml:mo stretchy="false" form="prefix">(</mml:mo><mml:mn>1</mml:mn><mml:mo>−</mml:mo><mml:mtext mathvariant="normal">FDP</mml:mtext><mml:mo stretchy="false" form="postfix">)</mml:mo><mml:mo>⋅</mml:mo><mml:msub><mml:mover><mml:mi>β</mml:mi><mml:mo accent="true">̂</mml:mo></mml:mover><mml:mrow><mml:mi>T</mml:mi><mml:mi>P</mml:mi></mml:mrow></mml:msub><mml:mo>+</mml:mo><mml:mtext mathvariant="normal">FDP</mml:mtext><mml:mo>⋅</mml:mo><mml:msub><mml:mover><mml:mi>β</mml:mi><mml:mo accent="true">̂</mml:mo></mml:mover><mml:mrow><mml:mi>F</mml:mi><mml:mi>P</mml:mi></mml:mrow></mml:msub><mml:mi>.</mml:mi><mml:mspace width="2.0em"></mml:mspace><mml:mo stretchy="false" form="prefix">(</mml:mo><mml:mn>6</mml:mn><mml:mo stretchy="false" form="postfix">)</mml:mo></mml:mrow></mml:math></alternatives></disp-formula></styled-content>
    Linkage errors are often assumed to occur at random, in which case
    <inline-formula><alternatives>
    <tex-math><![CDATA[\mathbb E_{FP}[ Y \mid X ] = \mathbb E_{FP}[ Y ]]]></tex-math>
    <mml:math display="inline" xmlns:mml="http://www.w3.org/1998/Math/MathML"><mml:mrow><mml:msub><mml:mi mathvariant="double-struck">𝔼</mml:mi><mml:mrow><mml:mi>F</mml:mi><mml:mi>P</mml:mi></mml:mrow></mml:msub><mml:mo stretchy="false" form="prefix">[</mml:mo><mml:mi>Y</mml:mi><mml:mo>∣</mml:mo><mml:mi>X</mml:mi><mml:mo stretchy="false" form="postfix">]</mml:mo><mml:mo>=</mml:mo><mml:msub><mml:mi mathvariant="double-struck">𝔼</mml:mi><mml:mrow><mml:mi>F</mml:mi><mml:mi>P</mml:mi></mml:mrow></mml:msub><mml:mo stretchy="false" form="prefix">[</mml:mo><mml:mi>Y</mml:mi><mml:mo stretchy="false" form="postfix">]</mml:mo></mml:mrow></mml:math></alternatives></inline-formula>
    and <inline-formula><alternatives>
    <tex-math><![CDATA[\widehat\beta_{FP} = 0.]]></tex-math>
    <mml:math display="inline" xmlns:mml="http://www.w3.org/1998/Math/MathML"><mml:mrow><mml:msub><mml:mover><mml:mi>β</mml:mi><mml:mo accent="true">̂</mml:mo></mml:mover><mml:mrow><mml:mi>F</mml:mi><mml:mi>P</mml:mi></mml:mrow></mml:msub><mml:mo>=</mml:mo><mml:mn>0</mml:mn><mml:mi>.</mml:mi></mml:mrow></mml:math></alternatives></inline-formula>
    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 <inline-formula><alternatives>
    <tex-math><![CDATA[X]]></tex-math>
    <mml:math display="inline" xmlns:mml="http://www.w3.org/1998/Math/MathML"><mml:mi>X</mml:mi></mml:math></alternatives></inline-formula>
    and <inline-formula><alternatives>
    <tex-math><![CDATA[Y]]></tex-math>
    <mml:math display="inline" xmlns:mml="http://www.w3.org/1998/Math/MathML"><mml:mi>Y</mml:mi></mml:math></alternatives></inline-formula>
    among falsely linked pairs.</p>
    <p>The estimation error of the analysis can be decomposed into two
    parts: <disp-formula><alternatives>
    <tex-math><![CDATA[
        \widehat\beta - \beta = \underbrace{(\widehat\beta_{TP} - \beta)}_{\text{sampling bias}} \:\:\: + \underbrace{(\widehat\beta - \widehat\beta_{TP})}_{\text{contamination bias}}.
    ]]></tex-math>
    <mml:math display="block" xmlns:mml="http://www.w3.org/1998/Math/MathML"><mml:mrow><mml:mover><mml:mi>β</mml:mi><mml:mo accent="true">̂</mml:mo></mml:mover><mml:mo>−</mml:mo><mml:mi>β</mml:mi><mml:mo>=</mml:mo><mml:munder><mml:munder><mml:mrow><mml:mo stretchy="false" form="prefix">(</mml:mo><mml:msub><mml:mover><mml:mi>β</mml:mi><mml:mo accent="true">̂</mml:mo></mml:mover><mml:mrow><mml:mi>T</mml:mi><mml:mi>P</mml:mi></mml:mrow></mml:msub><mml:mo>−</mml:mo><mml:mi>β</mml:mi><mml:mo stretchy="false" form="postfix">)</mml:mo></mml:mrow><mml:mo accent="true">⏟</mml:mo></mml:munder><mml:mtext mathvariant="normal">sampling bias</mml:mtext></mml:munder><mml:mspace width="0.222em"></mml:mspace><mml:mspace width="0.222em"></mml:mspace><mml:mspace width="0.222em"></mml:mspace><mml:mo>+</mml:mo><mml:munder><mml:munder><mml:mrow><mml:mo stretchy="false" form="prefix">(</mml:mo><mml:mover><mml:mi>β</mml:mi><mml:mo accent="true">̂</mml:mo></mml:mover><mml:mo>−</mml:mo><mml:msub><mml:mover><mml:mi>β</mml:mi><mml:mo accent="true">̂</mml:mo></mml:mover><mml:mrow><mml:mi>T</mml:mi><mml:mi>P</mml:mi></mml:mrow></mml:msub><mml:mo stretchy="false" form="postfix">)</mml:mo></mml:mrow><mml:mo accent="true">⏟</mml:mo></mml:munder><mml:mtext mathvariant="normal">contamination bias</mml:mtext></mml:munder><mml:mi>.</mml:mi></mml:mrow></mml:math></alternatives></disp-formula>
    Missed links may cause sample selection and falsely linked data may
    cause measurement error in the linked variables (Doidge &amp;
    Harron, 2020; <named-content content-type="nocase">Robach et
    al.</named-content>, 2026; Wang et al., 2022).</p>
    <sec id="linkage-decision-rule-trade-off">
      <title>Linkage decision rule trade-off</title>
      <p>Raising the threshold <inline-formula><alternatives>
      <tex-math><![CDATA[\xi]]></tex-math>
      <mml:math display="inline" xmlns:mml="http://www.w3.org/1998/Math/MathML"><mml:mi>ξ</mml:mi></mml:math></alternatives></inline-formula>
      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 <xref alt="(6)" rid="eq-beta-hat">(6)</xref>
      we derive:
      <styled-content id="eq-beta-contamination"><disp-formula><alternatives>
      <tex-math><![CDATA[
          \underbrace{\widehat\beta - \widehat\beta_{TP}}_{\text{contamination bias}} = \text{FDP} (\widehat\beta_{FP} - \widehat\beta_{TP}).
       \label{eq-beta-contamination} \qquad(7)]]></tex-math>
      <mml:math display="block" xmlns:mml="http://www.w3.org/1998/Math/MathML"><mml:mrow><mml:munder><mml:munder><mml:mrow><mml:mover><mml:mi>β</mml:mi><mml:mo accent="true">̂</mml:mo></mml:mover><mml:mo>−</mml:mo><mml:msub><mml:mover><mml:mi>β</mml:mi><mml:mo accent="true">̂</mml:mo></mml:mover><mml:mrow><mml:mi>T</mml:mi><mml:mi>P</mml:mi></mml:mrow></mml:msub></mml:mrow><mml:mo accent="true">⏟</mml:mo></mml:munder><mml:mtext mathvariant="normal">contamination bias</mml:mtext></mml:munder><mml:mo>=</mml:mo><mml:mtext mathvariant="normal">FDP</mml:mtext><mml:mo stretchy="false" form="prefix">(</mml:mo><mml:msub><mml:mover><mml:mi>β</mml:mi><mml:mo accent="true">̂</mml:mo></mml:mover><mml:mrow><mml:mi>F</mml:mi><mml:mi>P</mml:mi></mml:mrow></mml:msub><mml:mo>−</mml:mo><mml:msub><mml:mover><mml:mi>β</mml:mi><mml:mo accent="true">̂</mml:mo></mml:mover><mml:mrow><mml:mi>T</mml:mi><mml:mi>P</mml:mi></mml:mrow></mml:msub><mml:mo stretchy="false" form="postfix">)</mml:mo><mml:mi>.</mml:mi><mml:mspace width="2.0em"></mml:mspace><mml:mo stretchy="false" form="prefix">(</mml:mo><mml:mn>7</mml:mn><mml:mo stretchy="false" form="postfix">)</mml:mo></mml:mrow></mml:math></alternatives></disp-formula></styled-content></p>
      <p>However, raising the threshold <inline-formula><alternatives>
      <tex-math><![CDATA[\xi]]></tex-math>
      <mml:math display="inline" xmlns:mml="http://www.w3.org/1998/Math/MathML"><mml:mi>ξ</mml:mi></mml:math></alternatives></inline-formula>
      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
      <inline-formula><alternatives>
      <tex-math><![CDATA[X]]></tex-math>
      <mml:math display="inline" xmlns:mml="http://www.w3.org/1998/Math/MathML"><mml:mi>X</mml:mi></mml:math></alternatives></inline-formula>;
      in the context of linear regression, this yields:
      <styled-content id="eq-beta-sampling"><disp-formula><alternatives>
      <tex-math><![CDATA[
          \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)]]></tex-math>
      <mml:math display="block" xmlns:mml="http://www.w3.org/1998/Math/MathML"><mml:mrow><mml:munder><mml:munder><mml:mrow><mml:msub><mml:mover><mml:mi>β</mml:mi><mml:mo accent="true">̂</mml:mo></mml:mover><mml:mrow><mml:mi>T</mml:mi><mml:mi>P</mml:mi></mml:mrow></mml:msub><mml:mo>−</mml:mo><mml:mi>β</mml:mi></mml:mrow><mml:mo accent="true">⏟</mml:mo></mml:munder><mml:mtext mathvariant="normal">sampling bias</mml:mtext></mml:munder><mml:mo>=</mml:mo><mml:mfrac><mml:mrow><mml:msub><mml:mrow><mml:mi mathvariant="normal">Cov</mml:mi><mml:mo>&#8289;</mml:mo></mml:mrow><mml:mrow><mml:mi>T</mml:mi><mml:mi>P</mml:mi></mml:mrow></mml:msub><mml:mo stretchy="false" form="prefix">(</mml:mo><mml:mi>X</mml:mi><mml:mo>,</mml:mo><mml:mi>β</mml:mi><mml:mi>X</mml:mi><mml:mo>+</mml:mo><mml:mi>ε</mml:mi><mml:mo stretchy="false" form="postfix">)</mml:mo></mml:mrow><mml:mrow><mml:msub><mml:mrow><mml:mi mathvariant="normal">Var</mml:mi><mml:mo>&#8289;</mml:mo></mml:mrow><mml:mrow><mml:mi>T</mml:mi><mml:mi>P</mml:mi></mml:mrow></mml:msub><mml:mo stretchy="false" form="prefix">(</mml:mo><mml:mi>X</mml:mi><mml:mo stretchy="false" form="postfix">)</mml:mo></mml:mrow></mml:mfrac><mml:mo>−</mml:mo><mml:mi>β</mml:mi><mml:mo>=</mml:mo><mml:mfrac><mml:mrow><mml:msub><mml:mrow><mml:mi mathvariant="normal">Cov</mml:mi><mml:mo>&#8289;</mml:mo></mml:mrow><mml:mrow><mml:mi>T</mml:mi><mml:mi>P</mml:mi></mml:mrow></mml:msub><mml:mo stretchy="false" form="prefix">(</mml:mo><mml:mi>X</mml:mi><mml:mo>,</mml:mo><mml:mi>ε</mml:mi><mml:mo stretchy="false" form="postfix">)</mml:mo></mml:mrow><mml:mrow><mml:msub><mml:mrow><mml:mi mathvariant="normal">Var</mml:mi><mml:mo>&#8289;</mml:mo></mml:mrow><mml:mrow><mml:mi>T</mml:mi><mml:mi>P</mml:mi></mml:mrow></mml:msub><mml:mo stretchy="false" form="prefix">(</mml:mo><mml:mi>X</mml:mi><mml:mo stretchy="false" form="postfix">)</mml:mo></mml:mrow></mml:mfrac><mml:mi>.</mml:mi><mml:mspace width="2.0em"></mml:mspace><mml:mo stretchy="false" form="prefix">(</mml:mo><mml:mn>8</mml:mn><mml:mo stretchy="false" form="postfix">)</mml:mo></mml:mrow></mml:math></alternatives></disp-formula></styled-content></p>
      <p>These aspects motivate the complementary tools we develop in
      <italic>FlexRL</italic> to quantify these two biases. Estimating
      the FDP (see Section <xref alt="4.2" rid="sec-fdp">4.2</xref>) and
      evaluating the divergence of the linked sample from the data
      sources (see
      Section <xref alt="4.3" rid="sec-representativeness">4.3</xref>)
      over a range of values of <inline-formula><alternatives>
      <tex-math><![CDATA[\xi]]></tex-math>
      <mml:math display="inline" xmlns:mml="http://www.w3.org/1998/Math/MathML"><mml:mi>ξ</mml:mi></mml:math></alternatives></inline-formula>
      may help users appraise this trade-off.</p>
    </sec>
  </sec>
  <sec id="sec-fdp">
    <title>False discovery proportion</title>
    <p>For the decision rule <inline-formula><alternatives>
    <tex-math><![CDATA[\xi \in [0.5, 1)]]></tex-math>
    <mml:math display="inline" xmlns:mml="http://www.w3.org/1998/Math/MathML"><mml:mrow><mml:mi>ξ</mml:mi><mml:mo>∈</mml:mo><mml:mo stretchy="false" form="prefix">[</mml:mo><mml:mn>0.5</mml:mn><mml:mo>,</mml:mo><mml:mn>1</mml:mn><mml:mo stretchy="false" form="postfix">)</mml:mo></mml:mrow></mml:math></alternatives></inline-formula>,
    the FDP is <inline-formula><alternatives>
    <tex-math><![CDATA[\text{FDP}(\xi) = \text{FP}(\xi) / \{\text{TP}(\xi) + \text{FP}(\xi)\}]]></tex-math>
    <mml:math display="inline" xmlns:mml="http://www.w3.org/1998/Math/MathML"><mml:mrow><mml:mtext mathvariant="normal">FDP</mml:mtext><mml:mo stretchy="false" form="prefix">(</mml:mo><mml:mi>ξ</mml:mi><mml:mo stretchy="false" form="postfix">)</mml:mo><mml:mo>=</mml:mo><mml:mtext mathvariant="normal">FP</mml:mtext><mml:mo stretchy="false" form="prefix">(</mml:mo><mml:mi>ξ</mml:mi><mml:mo stretchy="false" form="postfix">)</mml:mo><mml:mi>/</mml:mi><mml:mo stretchy="false" form="prefix">{</mml:mo><mml:mtext mathvariant="normal">TP</mml:mtext><mml:mo stretchy="false" form="prefix">(</mml:mo><mml:mi>ξ</mml:mi><mml:mo stretchy="false" form="postfix">)</mml:mo><mml:mo>+</mml:mo><mml:mtext mathvariant="normal">FP</mml:mtext><mml:mo stretchy="false" form="prefix">(</mml:mo><mml:mi>ξ</mml:mi><mml:mo stretchy="false" form="postfix">)</mml:mo><mml:mo stretchy="false" form="postfix">}</mml:mo></mml:mrow></mml:math></alternatives></inline-formula>
    where <inline-formula><alternatives>
    <tex-math><![CDATA[\text{TP}(\xi)]]></tex-math>
    <mml:math display="inline" xmlns:mml="http://www.w3.org/1998/Math/MathML"><mml:mrow><mml:mtext mathvariant="normal">TP</mml:mtext><mml:mo stretchy="false" form="prefix">(</mml:mo><mml:mi>ξ</mml:mi><mml:mo stretchy="false" form="postfix">)</mml:mo></mml:mrow></mml:math></alternatives></inline-formula>
    and <inline-formula><alternatives>
    <tex-math><![CDATA[\text{FP}(\xi)]]></tex-math>
    <mml:math display="inline" xmlns:mml="http://www.w3.org/1998/Math/MathML"><mml:mrow><mml:mtext mathvariant="normal">FP</mml:mtext><mml:mo stretchy="false" form="prefix">(</mml:mo><mml:mi>ξ</mml:mi><mml:mo stretchy="false" form="postfix">)</mml:mo></mml:mrow></mml:math></alternatives></inline-formula>
    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 &amp; Rubin,
    1995; Enamorado et al., 2019; Resnick &amp; 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 &amp; Salmond, 2002; Dasylva &amp;
    Goussanou, 2020, 2022). <italic>FlexRL</italic> implements the first
    two estimation procedures. We focus on the FDP because it drives the
    contamination bias of
    Equation <xref alt="(7)" rid="eq-beta-contamination">(7)</xref>; the
    sampling bias is addressed by the diagnostics of
    Section <xref alt="4.3" rid="sec-representativeness">4.3</xref>. The
    estimators are provided as functions of
    <inline-formula><alternatives>
    <tex-math><![CDATA[\xi]]></tex-math>
    <mml:math display="inline" xmlns:mml="http://www.w3.org/1998/Math/MathML"><mml:mi>ξ</mml:mi></mml:math></alternatives></inline-formula>,
    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).</p>
    <sec id="score-based-estimator">
      <title>Score based estimator</title>
      <p>If the linkage model is well calibrated,
      <inline-formula><alternatives>
      <tex-math><![CDATA[\widehat{D}_{i,j}]]></tex-math>
      <mml:math display="inline" xmlns:mml="http://www.w3.org/1998/Math/MathML"><mml:msub><mml:mover><mml:mi>D</mml:mi><mml:mo accent="true">̂</mml:mo></mml:mover><mml:mrow><mml:mi>i</mml:mi><mml:mo>,</mml:mo><mml:mi>j</mml:mi></mml:mrow></mml:msub></mml:math></alternatives></inline-formula>
      should represent the probability that the pair
      <inline-formula><alternatives>
      <tex-math><![CDATA[(i,j)]]></tex-math>
      <mml:math display="inline" xmlns:mml="http://www.w3.org/1998/Math/MathML"><mml:mrow><mml:mo stretchy="false" form="prefix">(</mml:mo><mml:mi>i</mml:mi><mml:mo>,</mml:mo><mml:mi>j</mml:mi><mml:mo stretchy="false" form="postfix">)</mml:mo></mml:mrow></mml:math></alternatives></inline-formula>
      is a true link, and the expected number of truly linked pairs
      among linked data is <inline-formula><alternatives>
      <tex-math><![CDATA[\sum_{(i,j)} \widehat{D}_{i,j} \mathbb 1 \{\widehat{D}_{i,j} > \xi\}]]></tex-math>
      <mml:math display="inline" xmlns:mml="http://www.w3.org/1998/Math/MathML"><mml:mrow><mml:msub><mml:mo>∑</mml:mo><mml:mrow><mml:mo stretchy="false" form="prefix">(</mml:mo><mml:mi>i</mml:mi><mml:mo>,</mml:mo><mml:mi>j</mml:mi><mml:mo stretchy="false" form="postfix">)</mml:mo></mml:mrow></mml:msub><mml:msub><mml:mover><mml:mi>D</mml:mi><mml:mo accent="true">̂</mml:mo></mml:mover><mml:mrow><mml:mi>i</mml:mi><mml:mo>,</mml:mo><mml:mi>j</mml:mi></mml:mrow></mml:msub><mml:mn mathvariant="double-struck">𝟙</mml:mn><mml:mo stretchy="false" form="prefix">{</mml:mo><mml:msub><mml:mover><mml:mi>D</mml:mi><mml:mo accent="true">̂</mml:mo></mml:mover><mml:mrow><mml:mi>i</mml:mi><mml:mo>,</mml:mo><mml:mi>j</mml:mi></mml:mrow></mml:msub><mml:mo>&gt;</mml:mo><mml:mi>ξ</mml:mi><mml:mo stretchy="false" form="postfix">}</mml:mo></mml:mrow></mml:math></alternatives></inline-formula>
      (Enamorado et al., 2019; Robach, Hof, et al., 2025). Therefore
      <styled-content id="eq-fdp-model"><disp-formula><alternatives>
      <tex-math><![CDATA[
          \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)]]></tex-math>
      <mml:math display="block" xmlns:mml="http://www.w3.org/1998/Math/MathML"><mml:mrow><mml:mover><mml:mtext mathvariant="normal">FDP</mml:mtext><mml:mo accent="true">̂</mml:mo></mml:mover><mml:mo stretchy="false" form="prefix">(</mml:mo><mml:mi>ξ</mml:mi><mml:mo stretchy="false" form="postfix">)</mml:mo><mml:mo>=</mml:mo><mml:mn>1</mml:mn><mml:mo>−</mml:mo><mml:mfrac><mml:mrow><mml:munder><mml:mo>∑</mml:mo><mml:mrow><mml:mo stretchy="false" form="prefix">(</mml:mo><mml:mi>i</mml:mi><mml:mo>,</mml:mo><mml:mi>j</mml:mi><mml:mo stretchy="false" form="postfix">)</mml:mo></mml:mrow></mml:munder><mml:msub><mml:mover><mml:mi>D</mml:mi><mml:mo accent="true">̂</mml:mo></mml:mover><mml:mrow><mml:mi>i</mml:mi><mml:mo>,</mml:mo><mml:mi>j</mml:mi></mml:mrow></mml:msub><mml:mn mathvariant="double-struck">𝟙</mml:mn><mml:mo stretchy="false" form="prefix">{</mml:mo><mml:msub><mml:mover><mml:mi>D</mml:mi><mml:mo accent="true">̂</mml:mo></mml:mover><mml:mrow><mml:mi>i</mml:mi><mml:mo>,</mml:mo><mml:mi>j</mml:mi></mml:mrow></mml:msub><mml:mo>&gt;</mml:mo><mml:mi>ξ</mml:mi><mml:mo stretchy="false" form="postfix">}</mml:mo></mml:mrow><mml:mrow><mml:munder><mml:mo>∑</mml:mo><mml:mrow><mml:mo stretchy="false" form="prefix">(</mml:mo><mml:mi>i</mml:mi><mml:mo>,</mml:mo><mml:mi>j</mml:mi><mml:mo stretchy="false" form="postfix">)</mml:mo></mml:mrow></mml:munder><mml:mn mathvariant="double-struck">𝟙</mml:mn><mml:mo stretchy="false" form="prefix">{</mml:mo><mml:msub><mml:mover><mml:mi>D</mml:mi><mml:mo accent="true">̂</mml:mo></mml:mover><mml:mrow><mml:mi>i</mml:mi><mml:mo>,</mml:mo><mml:mi>j</mml:mi></mml:mrow></mml:msub><mml:mo>&gt;</mml:mo><mml:mi>ξ</mml:mi><mml:mo stretchy="false" form="postfix">}</mml:mo></mml:mrow></mml:mfrac><mml:mi>.</mml:mi><mml:mspace width="2.0em"></mml:mspace><mml:mo stretchy="false" form="prefix">(</mml:mo><mml:mn>9</mml:mn><mml:mo stretchy="false" form="postfix">)</mml:mo></mml:mrow></mml:math></alternatives></disp-formula></styled-content>
      This estimator comes at no extra cost for any method that returns
      linkage scores, but it is only as good as the linkage model.</p>
      <p>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
      <italic>FlexRL</italic> and <italic>BRL</italic> across a range of
      configurations (<named-content content-type="nocase">Robach, van
      der Pas, et al.</named-content>, 2025; Robach, Hof, et al.,
      2025).</p>
    </sec>
    <sec id="synthetic-data-estimator">
      <title>Synthetic data estimator</title>
      <p>An estimator that does not rely on linkage scores can be
      computed with synthetic data (Robach, Hof, et al., 2025). Source
      <inline-formula><alternatives>
      <tex-math><![CDATA[\mathcal B]]></tex-math>
      <mml:math display="inline" xmlns:mml="http://www.w3.org/1998/Math/MathML"><mml:mi mathvariant="script">ℬ</mml:mi></mml:math></alternatives></inline-formula>
      is augmented with <inline-formula><alternatives>
      <tex-math><![CDATA[N_{\text{synth}}]]></tex-math>
      <mml:math display="inline" xmlns:mml="http://www.w3.org/1998/Math/MathML"><mml:msub><mml:mi>N</mml:mi><mml:mtext mathvariant="normal">synth</mml:mtext></mml:msub></mml:math></alternatives></inline-formula>
      synthetic records, drawn from a generative model fitted on the
      PIVs of <inline-formula><alternatives>
      <tex-math><![CDATA[\mathcal B]]></tex-math>
      <mml:math display="inline" xmlns:mml="http://www.w3.org/1998/Math/MathML"><mml:mi mathvariant="script">ℬ</mml:mi></mml:math></alternatives></inline-formula>—for
      example <italic>arf</italic> (Watson et al., 2023),
      <italic>synthpop</italic> (Nowok et al., 2016) or
      <italic>mice</italic> (Buuren &amp; Groothuis-Oudshoorn, 2011).
      Synthetic records by definition do not form a link in
      <inline-formula><alternatives>
      <tex-math><![CDATA[\mathcal A]]></tex-math>
      <mml:math display="inline" xmlns:mml="http://www.w3.org/1998/Math/MathML"><mml:mi mathvariant="script">𝒜</mml:mi></mml:math></alternatives></inline-formula>,
      so synthetic links can represent false positives when links and
      non-links have similar distributions (Robach, Hof, et al., 2025).
      Then <inline-formula><alternatives>
      <tex-math><![CDATA[\text{FP}_{\text{synth}}(\xi)]]></tex-math>
      <mml:math display="inline" xmlns:mml="http://www.w3.org/1998/Math/MathML"><mml:mrow><mml:msub><mml:mtext mathvariant="normal">FP</mml:mtext><mml:mtext mathvariant="normal">synth</mml:mtext></mml:msub><mml:mo stretchy="false" form="prefix">(</mml:mo><mml:mi>ξ</mml:mi><mml:mo stretchy="false" form="postfix">)</mml:mo></mml:mrow></mml:math></alternatives></inline-formula>
      is rescaled by <inline-formula><alternatives>
      <tex-math><![CDATA[N_{\mathcal B}/N_{\text{synth}}]]></tex-math>
      <mml:math display="inline" xmlns:mml="http://www.w3.org/1998/Math/MathML"><mml:mrow><mml:msub><mml:mi>N</mml:mi><mml:mi mathvariant="script">ℬ</mml:mi></mml:msub><mml:mi>/</mml:mi><mml:msub><mml:mi>N</mml:mi><mml:mtext mathvariant="normal">synth</mml:mtext></mml:msub></mml:mrow></mml:math></alternatives></inline-formula>,
      which follows from equating <inline-formula><alternatives>
      <tex-math><![CDATA[\text{FP}(\xi) / (N_{\mathcal A} \cdot N_{\mathcal B})]]></tex-math>
      <mml:math display="inline" xmlns:mml="http://www.w3.org/1998/Math/MathML"><mml:mrow><mml:mtext mathvariant="normal">FP</mml:mtext><mml:mo stretchy="false" form="prefix">(</mml:mo><mml:mi>ξ</mml:mi><mml:mo stretchy="false" form="postfix">)</mml:mo><mml:mi>/</mml:mi><mml:mo stretchy="false" form="prefix">(</mml:mo><mml:msub><mml:mi>N</mml:mi><mml:mi mathvariant="script">𝒜</mml:mi></mml:msub><mml:mo>⋅</mml:mo><mml:msub><mml:mi>N</mml:mi><mml:mi mathvariant="script">ℬ</mml:mi></mml:msub><mml:mo stretchy="false" form="postfix">)</mml:mo></mml:mrow></mml:math></alternatives></inline-formula>
      with <inline-formula><alternatives>
      <tex-math><![CDATA[\text{FP}_{\text{synth}}(\xi) / (N_{\mathcal A} \cdot N_{\text{synth}})]]></tex-math>
      <mml:math display="inline" xmlns:mml="http://www.w3.org/1998/Math/MathML"><mml:mrow><mml:msub><mml:mtext mathvariant="normal">FP</mml:mtext><mml:mtext mathvariant="normal">synth</mml:mtext></mml:msub><mml:mo stretchy="false" form="prefix">(</mml:mo><mml:mi>ξ</mml:mi><mml:mo stretchy="false" form="postfix">)</mml:mo><mml:mi>/</mml:mi><mml:mo stretchy="false" form="prefix">(</mml:mo><mml:msub><mml:mi>N</mml:mi><mml:mi mathvariant="script">𝒜</mml:mi></mml:msub><mml:mo>⋅</mml:mo><mml:msub><mml:mi>N</mml:mi><mml:mtext mathvariant="normal">synth</mml:mtext></mml:msub><mml:mo stretchy="false" form="postfix">)</mml:mo></mml:mrow></mml:math></alternatives></inline-formula>.
      As for the score based estimator, <inline-formula><alternatives>
      <tex-math><![CDATA[\text{TP}(\xi) + \text{FP}(\xi)]]></tex-math>
      <mml:math display="inline" xmlns:mml="http://www.w3.org/1998/Math/MathML"><mml:mrow><mml:mtext mathvariant="normal">TP</mml:mtext><mml:mo stretchy="false" form="prefix">(</mml:mo><mml:mi>ξ</mml:mi><mml:mo stretchy="false" form="postfix">)</mml:mo><mml:mo>+</mml:mo><mml:mtext mathvariant="normal">FP</mml:mtext><mml:mo stretchy="false" form="prefix">(</mml:mo><mml:mi>ξ</mml:mi><mml:mo stretchy="false" form="postfix">)</mml:mo></mml:mrow></mml:math></alternatives></inline-formula>
      corresponds to the number of (real) linked pairs
      <inline-formula><alternatives>
      <tex-math><![CDATA[N_{\text{real}}(\xi) = \sum_{(i,j)} \mathbb 1 \{\widehat{D}_{i,j} > \xi\}]]></tex-math>
      <mml:math display="inline" xmlns:mml="http://www.w3.org/1998/Math/MathML"><mml:mrow><mml:msub><mml:mi>N</mml:mi><mml:mtext mathvariant="normal">real</mml:mtext></mml:msub><mml:mo stretchy="false" form="prefix">(</mml:mo><mml:mi>ξ</mml:mi><mml:mo stretchy="false" form="postfix">)</mml:mo><mml:mo>=</mml:mo><mml:msub><mml:mo>∑</mml:mo><mml:mrow><mml:mo stretchy="false" form="prefix">(</mml:mo><mml:mi>i</mml:mi><mml:mo>,</mml:mo><mml:mi>j</mml:mi><mml:mo stretchy="false" form="postfix">)</mml:mo></mml:mrow></mml:msub><mml:mn mathvariant="double-struck">𝟙</mml:mn><mml:mo stretchy="false" form="prefix">{</mml:mo><mml:msub><mml:mover><mml:mi>D</mml:mi><mml:mo accent="true">̂</mml:mo></mml:mover><mml:mrow><mml:mi>i</mml:mi><mml:mo>,</mml:mo><mml:mi>j</mml:mi></mml:mrow></mml:msub><mml:mo>&gt;</mml:mo><mml:mi>ξ</mml:mi><mml:mo stretchy="false" form="postfix">}</mml:mo></mml:mrow></mml:math></alternatives></inline-formula>:
      <styled-content id="eq-fdp-synth"><disp-formula><alternatives>
      <tex-math><![CDATA[ 
          \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)]]></tex-math>
      <mml:math display="block" xmlns:mml="http://www.w3.org/1998/Math/MathML"><mml:mrow><mml:msub><mml:mover><mml:mtext mathvariant="normal">FDP</mml:mtext><mml:mo accent="true">̂</mml:mo></mml:mover><mml:mtext mathvariant="normal">synth</mml:mtext></mml:msub><mml:mo stretchy="false" form="prefix">(</mml:mo><mml:mi>ξ</mml:mi><mml:mo stretchy="false" form="postfix">)</mml:mo><mml:mo>=</mml:mo><mml:mfrac><mml:mrow><mml:msub><mml:mtext mathvariant="normal">FP</mml:mtext><mml:mtext mathvariant="normal">synth</mml:mtext></mml:msub><mml:mo stretchy="false" form="prefix">(</mml:mo><mml:mi>ξ</mml:mi><mml:mo stretchy="false" form="postfix">)</mml:mo><mml:mo>⋅</mml:mo><mml:msub><mml:mi>N</mml:mi><mml:mi mathvariant="script">ℬ</mml:mi></mml:msub><mml:mi>/</mml:mi><mml:msub><mml:mi>N</mml:mi><mml:mtext mathvariant="normal">synth</mml:mtext></mml:msub></mml:mrow><mml:mrow><mml:msub><mml:mi>N</mml:mi><mml:mtext mathvariant="normal">real</mml:mtext></mml:msub><mml:mo stretchy="false" form="prefix">(</mml:mo><mml:mi>ξ</mml:mi><mml:mo stretchy="false" form="postfix">)</mml:mo></mml:mrow></mml:mfrac><mml:mi>.</mml:mi><mml:mspace width="2.0em"></mml:mspace><mml:mo stretchy="false" form="prefix">(</mml:mo><mml:mn>10</mml:mn><mml:mo stretchy="false" form="postfix">)</mml:mo></mml:mrow></mml:math></alternatives></disp-formula></styled-content>
      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.</p>
      <p>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 <xref alt="3.1" rid="sec-prepare">3.1</xref>). For models
      assuming independent PIVs, such as <italic>FlexRL</italic> and
      Fellegi-Sunter mixture models (see
      Equation <xref alt="(1)" rid="eq-FS">(1)</xref>), 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
      (<bold>fig-print-output?</bold>).</p>
    </sec>
  </sec>
  <sec id="sec-representativeness">
    <title>Representativeness of the linked sample</title>
    <p>As explained in
    Section <xref alt="4.1" rid="sec-linkage-error">4.1</xref>, the
    linked sample may differ from the data sources in ways the analyst
    cannot see (Doidge &amp; Harron, 2020;
    <named-content content-type="nocase">Robach et al.</named-content>,
    2026; Wang et al., 2022). In particular, we appraise the sampling
    bias of Equation <xref alt="(8)" rid="eq-beta-sampling">(8)</xref>
    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 <inline-formula><alternatives>
    <tex-math><![CDATA[\xi \in [0.5, 1)]]></tex-math>
    <mml:math display="inline" xmlns:mml="http://www.w3.org/1998/Math/MathML"><mml:mrow><mml:mi>ξ</mml:mi><mml:mo>∈</mml:mo><mml:mo stretchy="false" form="prefix">[</mml:mo><mml:mn>0.5</mml:mn><mml:mo>,</mml:mo><mml:mn>1</mml:mn><mml:mo stretchy="false" form="postfix">)</mml:mo></mml:mrow></mml:math></alternatives></inline-formula>,
    <italic>FlexRL</italic> compares each source with its linked subset
    using the following measures, computed on sets of variables
    <inline-formula><alternatives>
    <tex-math><![CDATA[\mathcal V_{\mathcal A}]]></tex-math>
    <mml:math display="inline" xmlns:mml="http://www.w3.org/1998/Math/MathML"><mml:msub><mml:mi mathvariant="script">𝒱</mml:mi><mml:mi mathvariant="script">𝒜</mml:mi></mml:msub></mml:math></alternatives></inline-formula>
    and <inline-formula><alternatives>
    <tex-math><![CDATA[\mathcal V_{\mathcal B}]]></tex-math>
    <mml:math display="inline" xmlns:mml="http://www.w3.org/1998/Math/MathML"><mml:msub><mml:mi mathvariant="script">𝒱</mml:mi><mml:mi mathvariant="script">ℬ</mml:mi></mml:msub></mml:math></alternatives></inline-formula>
    available in sources <inline-formula><alternatives>
    <tex-math><![CDATA[\mathcal A]]></tex-math>
    <mml:math display="inline" xmlns:mml="http://www.w3.org/1998/Math/MathML"><mml:mi mathvariant="script">𝒜</mml:mi></mml:math></alternatives></inline-formula>
    and <inline-formula><alternatives>
    <tex-math><![CDATA[\mathcal B]]></tex-math>
    <mml:math display="inline" xmlns:mml="http://www.w3.org/1998/Math/MathML"><mml:mi mathvariant="script">ℬ</mml:mi></mml:math></alternatives></inline-formula>
    respectively:</p>
    <list list-type="bullet">
      <list-item>
        <p><italic>Agreement rates</italic>: the proportion of linked
        pairs whose records agree on <inline-formula><alternatives>
        <tex-math><![CDATA[v]]></tex-math>
        <mml:math display="inline" xmlns:mml="http://www.w3.org/1998/Math/MathML"><mml:mi>v</mml:mi></mml:math></alternatives></inline-formula>,
        for each variable <inline-formula><alternatives>
        <tex-math><![CDATA[v \in \mathcal V_{\mathcal A} \cap \mathcal V_{\mathcal B}]]></tex-math>
        <mml:math display="inline" xmlns:mml="http://www.w3.org/1998/Math/MathML"><mml:mrow><mml:mi>v</mml:mi><mml:mo>∈</mml:mo><mml:msub><mml:mi mathvariant="script">𝒱</mml:mi><mml:mi mathvariant="script">𝒜</mml:mi></mml:msub><mml:mo>∩</mml:mo><mml:msub><mml:mi mathvariant="script">𝒱</mml:mi><mml:mi mathvariant="script">ℬ</mml:mi></mml:msub></mml:mrow></mml:math></alternatives></inline-formula>
        (such as the PIVs).</p>
      </list-item>
      <list-item>
        <p><italic>Standardised Mean Differences</italic> (SMD):
        <inline-formula><alternatives>
        <tex-math><![CDATA[(\text{mean}(v_{\text{linked}}) - \text{mean}(v_{\text{source}})) / \text{sd}(v_{\text{source}})]]></tex-math>
        <mml:math display="inline" xmlns:mml="http://www.w3.org/1998/Math/MathML"><mml:mrow><mml:mo stretchy="false" form="prefix">(</mml:mo><mml:mtext mathvariant="normal">mean</mml:mtext><mml:mo stretchy="false" form="prefix">(</mml:mo><mml:msub><mml:mi>v</mml:mi><mml:mtext mathvariant="normal">linked</mml:mtext></mml:msub><mml:mo stretchy="false" form="postfix">)</mml:mo><mml:mo>−</mml:mo><mml:mtext mathvariant="normal">mean</mml:mtext><mml:mo stretchy="false" form="prefix">(</mml:mo><mml:msub><mml:mi>v</mml:mi><mml:mtext mathvariant="normal">source</mml:mtext></mml:msub><mml:mo stretchy="false" form="postfix">)</mml:mo><mml:mo stretchy="false" form="postfix">)</mml:mo><mml:mi>/</mml:mi><mml:mtext mathvariant="normal">sd</mml:mtext><mml:mo stretchy="false" form="prefix">(</mml:mo><mml:msub><mml:mi>v</mml:mi><mml:mtext mathvariant="normal">source</mml:mtext></mml:msub><mml:mo stretchy="false" form="postfix">)</mml:mo></mml:mrow></mml:math></alternatives></inline-formula>,
        for a continuous variable <inline-formula><alternatives>
        <tex-math><![CDATA[v]]></tex-math>
        <mml:math display="inline" xmlns:mml="http://www.w3.org/1998/Math/MathML"><mml:mi>v</mml:mi></mml:math></alternatives></inline-formula>
        in a given set; the same quantity is computed for the indicator
        of each level when <inline-formula><alternatives>
        <tex-math><![CDATA[v]]></tex-math>
        <mml:math display="inline" xmlns:mml="http://www.w3.org/1998/Math/MathML"><mml:mi>v</mml:mi></mml:math></alternatives></inline-formula>
        is categorical.</p>
      </list-item>
      <list-item>
        <p><italic>Overlap of supports</italic> (support IoU): the
        Intersection over Union (IoU) of the sets of values taken in the
        linked sample and in the source, for a variable
        <inline-formula><alternatives>
        <tex-math><![CDATA[v]]></tex-math>
        <mml:math display="inline" xmlns:mml="http://www.w3.org/1998/Math/MathML"><mml:mi>v</mml:mi></mml:math></alternatives></inline-formula>
        in a given set.</p>
      </list-item>
      <list-item>
        <p><italic>Maximum Mean Discrepancy</italic> (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).</p>
      </list-item>
    </list>
    <p>These quantities are computed over a grid of values of
    <inline-formula><alternatives>
    <tex-math><![CDATA[\xi.]]></tex-math>
    <mml:math display="inline" xmlns:mml="http://www.w3.org/1998/Math/MathML"><mml:mrow><mml:mi>ξ</mml:mi><mml:mi>.</mml:mi></mml:mrow></mml:math></alternatives></inline-formula>
    They are built on the declared pairs and, when available, their
    linkage scores; they therefore apply to any linkage method.</p>
    <p>In (<bold>tbl-demonstration-2?</bold>) we proceed with the
    demonstration of
    Section <xref alt="2.4" rid="sec-demonstration">2.4</xref>
    showcasing the functionalities of <italic>FlexRL</italic> on a
    simulation study. The synthetic data FDP estimates (‘est. FDP*
    synth’) are not reliable for <italic>fedmatch</italic> and
    <italic>FlexRL (dynamics)</italic>, possibly because of the specific
    linkage procedures these packages implement. For <italic>FlexRL
    (dynamics)</italic>, 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 <italic>FlexRL (no
    dynamics)</italic> is reliable.</p>
    <p id="tbl-demonstration-2">
      <table-wrap>
        <table>
          <colgroup>
            <col width="10%" />
            <col width="9%" />
            <col width="9%" />
            <col width="10%" />
            <col width="9%" />
            <col width="9%" />
            <col width="10%" />
            <col width="9%" />
            <col width="12%" />
            <col width="13%" />
          </colgroup>
          <thead>
            <tr>
              <th align="left"></th>
              <th align="center">Naive</th>
              <th align="center">BRL</th>
              <th align="center">multilink</th>
              <th align="center">fastLink</th>
              <th align="center">reclin2</th>
              <th align="center">diyar</th>
              <th align="center">fedmatch</th>
              <th align="center">FlexRL (dynamics)</th>
              <th align="center">FlexRL (no dynamics)</th>
            </tr>
          </thead>
          <tbody>
            <tr>
              <td align="left">TP</td>
              <td align="center">118.40 (5.13)</td>
              <td align="center">80.40 (5.04)</td>
              <td align="center">80.60 (5.95)</td>
              <td align="center">101.70 (6.48)</td>
              <td align="center">114.10 (6.38)</td>
              <td align="center">34.90 (20.24)</td>
              <td align="center">122.10 (6.33)</td>
              <td align="center">114.00 (7.92)</td>
              <td align="center">87.50 (8.30)</td>
            </tr>
            <tr>
              <td align="left">FP</td>
              <td align="center">83.10 (11.02)</td>
              <td align="center">12.30 (3.23)</td>
              <td align="center">14.20 (4.13)</td>
              <td align="center">43.10 (5.59)</td>
              <td align="center">68.30 (8.82)</td>
              <td align="center">3.30 (2.91)</td>
              <td align="center">125.80 (6.32)</td>
              <td align="center">25.90 (5.15)</td>
              <td align="center">19.00 (4.67)</td>
            </tr>
            <tr>
              <td align="left">FN</td>
              <td align="center">81.60 (5.13)</td>
              <td align="center">119.60 (5.04)</td>
              <td align="center">119.40 (5.95)</td>
              <td align="center">98.30 (6.48)</td>
              <td align="center">85.90 (6.38)</td>
              <td align="center">165.10 (20.24)</td>
              <td align="center">77.90 (6.33)</td>
              <td align="center">86.00 (7.92)</td>
              <td align="center">112.50 (8.30)</td>
            </tr>
            <tr>
              <td align="left">sensitivity</td>
              <td align="center">0.59 (0.03)</td>
              <td align="center">0.40 (0.03)</td>
              <td align="center">0.40 (0.03)</td>
              <td align="center">0.51 (0.03)</td>
              <td align="center">0.57 (0.03)</td>
              <td align="center">0.17 (0.10)</td>
              <td align="center">0.61 (0.03)</td>
              <td align="center">0.57 (0.04)</td>
              <td align="center">0.44 (0.04)</td>
            </tr>
            <tr>
              <td align="left">FDP</td>
              <td align="center">0.41 (0.03)</td>
              <td align="center">0.13 (0.03)</td>
              <td align="center">0.15 (0.04)</td>
              <td align="center">0.30 (0.03)</td>
              <td align="center">0.37 (0.03)</td>
              <td align="center">0.08 (0.05)</td>
              <td align="center">0.51 (0.03)</td>
              <td align="center">0.18 (0.03)</td>
              <td align="center">0.18 (0.04)</td>
            </tr>
            <tr>
              <td align="left">est. FDP score</td>
              <td align="center">NA</td>
              <td align="center">0.19 (0.02)</td>
              <td align="center">NA</td>
              <td align="center">0.37 (0.02)</td>
              <td align="center">0.44 (0.03)</td>
              <td align="center">NA</td>
              <td align="center">0.10 (0.01)</td>
              <td align="center">0.20 (0.01)</td>
              <td align="center">0.18 (0.02)</td>
            </tr>
            <tr>
              <td align="left">est. FDP* score</td>
              <td align="center">NA</td>
              <td align="center">0.21 (0.02)</td>
              <td align="center">NA</td>
              <td align="center">0.39 (0.02)</td>
              <td align="center">0.43 (0.07)</td>
              <td align="center">NA</td>
              <td align="center">0.10 (0.01)</td>
              <td align="center">0.21 (0.01)</td>
              <td align="center">0.19 (0.02)</td>
            </tr>
            <tr>
              <td align="left">est. FDP* synth</td>
              <td align="center">NA</td>
              <td align="center">0.18 (0.10)</td>
              <td align="center">0.20 (0.05)</td>
              <td align="center">0.33 (0.07)</td>
              <td align="center">0.45 (0.14)</td>
              <td align="center">0.14 (0.07)</td>
              <td align="center">0.08 (0.03)</td>
              <td align="center">0.37 (0.11)</td>
              <td align="center">0.27 (0.08)</td>
            </tr>
            <tr>
              <td align="left">max SMD</td>
              <td align="center">NA</td>
              <td align="center">0.22 (0.05)</td>
              <td align="center">0.22 (0.06)</td>
              <td align="center">0.17 (0.03)</td>
              <td align="center">0.24 (0.04)</td>
              <td align="center">0.68 (0.31)</td>
              <td align="center">0.15 (0.03)</td>
              <td align="center">0.17 (0.04)</td>
              <td align="center">0.22 (0.04)</td>
            </tr>
            <tr>
              <td align="left">min support IoU</td>
              <td align="center">NA</td>
              <td align="center">0.80 (0.01)</td>
              <td align="center">0.80 (0.01)</td>
              <td align="center">0.80 (0.01)</td>
              <td align="center">0.80 (0.01)</td>
              <td align="center">0.76 (0.10)</td>
              <td align="center">0.82 (0.03)</td>
              <td align="center">0.82 (0.03)</td>
              <td align="center">0.81 (0.02)</td>
            </tr>
            <tr>
              <td align="left">max MMD</td>
              <td align="center">NA</td>
              <td align="center">0.01 (0.00)</td>
              <td align="center">0.01 (0.00)</td>
              <td align="center">0.01 (0.00)</td>
              <td align="center">0.01 (0.00)</td>
              <td align="center">0.08 (0.05)</td>
              <td align="center">0.01 (0.00)</td>
              <td align="center">0.01 (0.00)</td>
              <td align="center">0.01 (0.00)</td>
            </tr>
            <tr>
              <td align="left">time (secs)</td>
              <td align="center">0.27 (0.04)</td>
              <td align="center">0.97 (0.05)</td>
              <td align="center">18.57 (1.48)</td>
              <td align="center">1.29 (0.24)</td>
              <td align="center">0.29 (0.01)</td>
              <td align="center">1.17 (0.06)</td>
              <td align="center">1.44 (0.01)</td>
              <td align="center">4.59 (0.02)</td>
              <td align="center">3.72 (0.01)</td>
            </tr>
            <tr>
              <td align="left">memory (Mb)</td>
              <td align="center">1.04 (0.05)</td>
              <td align="center">78.60 (10.08)</td>
              <td align="center">105.68 (10.18)</td>
              <td align="center">24.85 (4.42)</td>
              <td align="center">41.52 (0.18)</td>
              <td align="center">104.31 (10.84)</td>
              <td align="center">42.14 (2.59)</td>
              <td align="center">102.11 (9.03)</td>
              <td align="center">70.18 (6.42)</td>
            </tr>
          </tbody>
        </table>
      </table-wrap>
      <p>Linkage performance of competing record linkage methods on
      simulated data for the default decision rule
      <inline-formula><alternatives>
      <tex-math><![CDATA[\xi=0.5]]></tex-math>
      <mml:math display="inline" xmlns:mml="http://www.w3.org/1998/Math/MathML"><mml:mrow><mml:mi>ξ</mml:mi><mml:mo>=</mml:mo><mml:mn>0.5</mml:mn></mml:mrow></mml:math></alternatives></inline-formula>,
      with linked data quality assessed through <italic>FlexRL</italic>.
      The * symbol denotes the record linkage augmented task, see
      Section <xref alt="4.2" rid="sec-fdp">4.2</xref>. We report
      average performance over 10 replications, with standard deviations
      in parentheses.</p>
    </p>
    <p>This short simulation study demonstrates the potential of the
    <italic>FlexRL</italic> package. Since <italic>FlexRL</italic>
    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 <xref alt="4.2" rid="sec-fdp">4.2</xref> presented the FDP
    estimators implemented in the package and
    Section <xref alt="4.3" rid="sec-representativeness">4.3</xref>
    discussed the measures of divergence. The FDP estimators are
    averaged over 5 procedures in each of the 10 replications.</p>
  </sec>
  <sec id="sec-diagnostics">
    <title>Diagnostics</title>
    <p><monospace>RL_diagnostics()</monospace> gathers the tools of
    Section <xref alt="4.2" rid="sec-fdp">4.2</xref> and
    Section <xref alt="4.3" rid="sec-representativeness">4.3</xref>,
    summarised in Table <xref alt="2" rid="tbl-diagnostics">2</xref>,
    and returns an S3 object of class
    <monospace>RL_diagnostics</monospace>, with
    <monospace>print</monospace> and <monospace>plot</monospace>
    methods. All measures are computed over a grid of thresholds
    <inline-formula><alternatives>
    <tex-math><![CDATA[\xi \in [0.5,1)]]></tex-math>
    <mml:math display="inline" xmlns:mml="http://www.w3.org/1998/Math/MathML"><mml:mrow><mml:mi>ξ</mml:mi><mml:mo>∈</mml:mo><mml:mo stretchy="false" form="prefix">[</mml:mo><mml:mn>0.5</mml:mn><mml:mo>,</mml:mo><mml:mn>1</mml:mn><mml:mo stretchy="false" form="postfix">)</mml:mo></mml:mrow></mml:math></alternatives></inline-formula>
    (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
    <monospace>vignette('FlexRL-RL-vignette', 'FlexRL')</monospace> or
    the
    <ext-link ext-link-type="uri" xlink:href="https://robachowyk.github.io/FlexRL/index.html">online
    documentation</ext-link>.</p>
    <table-wrap>
      <caption>
        <p>Diagnostics performed by
        <monospace>RL_diagnostics()</monospace>.</p>
      </caption>
      <table id="tbl-diagnostics">
        <colgroup>
          <col width="33%" />
          <col width="33%" />
          <col width="33%" />
        </colgroup>
        <thead>
          <tr>
            <th>Diagnostic</th>
            <th>Computation</th>
            <th>Display</th>
          </tr>
        </thead>
        <tbody>
          <tr>
            <td>Convergence</td>
            <td><monospace>plot_StEM_convergence()</monospace> on the
            chains returned by <monospace>StEM()</monospace></td>
            <td><monospace>plot(x, 'convergence')</monospace></td>
          </tr>
          <tr>
            <td>Linkage scores</td>
            <td><monospace>plot_linkage_scores()</monospace></td>
            <td><monospace>plot(x, 'scores')</monospace></td>
          </tr>
          <tr>
            <td>FDP estimation</td>
            <td><monospace>compute_RL_FDP_score()</monospace>
            (Equation <xref alt="(9)" rid="eq-fdp-model">(9)</xref>),
            <monospace>compute_augmRL_FDP_synth()</monospace>
            (Equation <xref alt="(10)" rid="eq-fdp-synth">(10)</xref>)</td>
            <td><monospace>plot(x, 'FDP')</monospace></td>
          </tr>
          <tr>
            <td>Discrepancy measures</td>
            <td><monospace>smd()</monospace>,
            <monospace>support_iou()</monospace>,
            <monospace>mmd()</monospace>,
            <monospace>RL_agreement()</monospace></td>
            <td><monospace>plot(x, 'discrepancy')</monospace></td>
          </tr>
          <tr>
            <td>Data comparison</td>
            <td><monospace>plot_distributions()</monospace> on each
            source and its linked subset</td>
            <td><monospace>plot(x, 'distributions')</monospace></td>
          </tr>
        </tbody>
      </table>
    </table-wrap>
    <p>The function takes several arguments as input. The record linkage
    output <monospace>fit</monospace>, the data sources
    <monospace>encodedA</monospace> and <monospace>encodedB</monospace>,
    the set of variables of interest to compare
    <monospace>compare_vars</monospace>, their type
    <monospace>vars_type_cont</monospace> (<monospace>TRUE</monospace>
    if continuous) and the <monospace>PIVs</monospace> are passed to
    <monospace>RL_diagnostics()</monospace>, which computes FDP
    estimates and discrepancy measures that characterise the linked
    sample across a grid of thresholds <inline-formula><alternatives>
    <tex-math><![CDATA[\xi.]]></tex-math>
    <mml:math display="inline" xmlns:mml="http://www.w3.org/1998/Math/MathML"><mml:mrow><mml:mi>ξ</mml:mi><mml:mi>.</mml:mi></mml:mrow></mml:math></alternatives></inline-formula>
    The <monospace>true_pairs</monospace> enables reporting the true FDP
    and sensitivity when known.</p>
    <code language="r script">compare_vars &lt;- c(&quot;BirthYear&quot;, &quot;Sex&quot;, &quot;MaritalStatus&quot;, 
                  &quot;BirthRegion&quot;, &quot;Occupation&quot;)

vars_type_cont &lt;- list(BirthYear = TRUE, Sex = FALSE, MaritalStatus = FALSE,
                       BirthRegion = FALSE, Occupation = FALSE)

diag &lt;- 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 = &quot;FlexRL&quot;, data = prep_data)</code>
    <p>The FDP estimation is optional
    (<monospace>FDP_estimation = TRUE</monospace>) since it can be time
    consuming. For a given <monospace>RL_method</monospace>, it is
    repeated <monospace>n_repeats</monospace> times and the estimates
    are averaged. <monospace>compute_RL_FDP_score()</monospace> returns
    the score based estimate on the original task.
    <monospace>compute_augmRL_FDP_synth()</monospace> adds
    <monospace>n_synth</monospace> records generated by
    <monospace>synth_method</monospace> to
    <inline-formula><alternatives>
    <tex-math><![CDATA[\mathcal B]]></tex-math>
    <mml:math display="inline" xmlns:mml="http://www.w3.org/1998/Math/MathML"><mml:mi mathvariant="script">ℬ</mml:mi></mml:math></alternatives></inline-formula>,
    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.
    (<bold>tbl-demonstration-2?</bold>) reported these three estimates
    as ‘est. FDP score’, ‘est. FDP* score’, ‘est. FDP* synth’.</p>
    <p>The <monospace>plot(x, type)</monospace> method for an object of
    class <monospace>RL_diagnostics</monospace> draws the plots listed
    in Table <xref alt="2" rid="tbl-diagnostics">2</xref>, with
    <monospace>type</monospace> being one of
    <monospace>'convergence'</monospace>,
    <monospace>'scores'</monospace>, <monospace>'FDP'</monospace>,
    <monospace>'discrepancy'</monospace> and
    <monospace>'distributions'</monospace>. With the
    <monospace>'convergence'</monospace> plots, we could verify that the
    StEM chains have stabilised.</p>
    <code language="r script">plot(diag, 'convergence')</code>
    <p>With the <monospace>'scores'</monospace> plot, we can analyse the
    distribution of the linkage scores of the <monospace>fit</monospace>
    as shown in Figure <xref alt="2" rid="fig-scores">2</xref>.</p>
    <fig id="fig-scores">
      <caption><p>Distribution of the linkage scores returned by
      <italic>FlexRL</italic> <monospace>StEM()</monospace> on the SHIW
      in Emilia-Romagna.</p></caption>
      <p specific-use="wrapper">
        <code language="r script">plot(diag, 'scores')</code>
        <graphic mimetype="image" mime-subtype="svg+xml" xlink:href="Article-FlexRL_files/figure-html/illustration-15-1.svg" />
      </p>
    </fig>
    <p>Albeit bimodal, the distribution of linkage scores produced by
    the record linkage algorithm does not indicate where to set the
    threshold <inline-formula><alternatives>
    <tex-math><![CDATA[\xi.]]></tex-math>
    <mml:math display="inline" xmlns:mml="http://www.w3.org/1998/Math/MathML"><mml:mrow><mml:mi>ξ</mml:mi><mml:mi>.</mml:mi></mml:mrow></mml:math></alternatives></inline-formula>
    The FDP estimation results and the divergence plots may help
    further. In Figure <xref alt="3" rid="fig-tradeoff">3</xref> we show
    the <monospace>'FDP'</monospace> plot and some of the
    <monospace>'discrepancy'</monospace> plots for the MMD and the SMD.
    Similar plots for the overlap of supports and the agreement rate are
    usually displayed by
    <monospace>plot(diag, 'discrepancy')</monospace>.</p>
    <fig id="fig-tradeoff">
      <caption><p>Estimated FDP and discrepancy measures against the
      linkage decision rule threshold obtained with
      <italic>FlexRL</italic> <monospace>RL_diagnostics()</monospace> on
      the SHIW in Emilia-Romagna.</p></caption>
      <p specific-use="wrapper">
        <code language="r script">plot(diag, 'FDP')</code>
      </p>
      <p specific-use="wrapper">
        <graphic mimetype="image" mime-subtype="svg+xml" xlink:href="Article-FlexRL_files/figure-html/illustration-18-1.svg" />
      </p>
      <p specific-use="wrapper">
        <code language="r script">plot(diag, 'discrepancy')</code>
      </p>
      <p specific-use="wrapper">
        <graphic mimetype="image" mime-subtype="svg+xml" xlink:href="Article-FlexRL_files/figure-html/illustration-20-1.svg" />
      </p>
      <p specific-use="wrapper">
        <graphic mimetype="image" mime-subtype="svg+xml" xlink:href="Article-FlexRL_files/figure-html/illustration-21-1.svg" />
      </p>
    </fig>
    <p>The graphics from
    Figure <xref alt="3" rid="fig-tradeoff">3</xref> show how each
    linkage decision rule affects linked data quality. They illustrate
    the trade-off of
    Section <xref alt="4.1" rid="sec-linkage-error">4.1</xref>: as the
    threshold <inline-formula><alternatives>
    <tex-math><![CDATA[\xi]]></tex-math>
    <mml:math display="inline" xmlns:mml="http://www.w3.org/1998/Math/MathML"><mml:mi>ξ</mml:mi></mml:math></alternatives></inline-formula>
    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 &amp; Harron, 2020; Lahiri
    &amp; Larsen, 2005; <named-content content-type="nocase">Robach et
    al.</named-content>, 2026; Tancredi &amp; 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 <xref alt="(8)" rid="eq-beta-sampling">(8)</xref>.
    For our example, we choose <inline-formula><alternatives>
    <tex-math><![CDATA[\xi = 0.86]]></tex-math>
    <mml:math display="inline" xmlns:mml="http://www.w3.org/1998/Math/MathML"><mml:mrow><mml:mi>ξ</mml:mi><mml:mo>=</mml:mo><mml:mn>0.86</mml:mn></mml:mrow></mml:math></alternatives></inline-formula>
    following this rule, as indicated by the vertical line in
    Figure <xref alt="3" rid="fig-tradeoff">3</xref>.</p>
    <p>With the <monospace>'distributions'</monospace> plots, we could
    compare the distribution of the linked data and of the data sources
    at the selected threshold—for example <inline-formula><alternatives>
    <tex-math><![CDATA[\xi = 0.86.]]></tex-math>
    <mml:math display="inline" xmlns:mml="http://www.w3.org/1998/Math/MathML"><mml:mrow><mml:mi>ξ</mml:mi><mml:mo>=</mml:mo><mml:mn>0.86</mml:mn><mml:mi>.</mml:mi></mml:mrow></mml:math></alternatives></inline-formula></p>
    <code language="r script">plot(diag, 'distributions', threshold = 0.86)</code>
    <p>The <monospace>print()</monospace> method for an S3 object of
    class <monospace>RL_diagnostics</monospace> reports the linked
    sample size, the FDP estimates, the true FDP and sensitivity when
    available, and the discrepancy measures. We report the output in
    (<bold>fig-print-output?</bold>). As discussed in
    Section <xref alt="4.2" rid="sec-fdp">4.2</xref>, 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.</p>
    <p id="fig-print-output">
      <code language="r script">print(diag, threshold = 0.86)</code>
      <preformat>  Linked pairs  (score &gt; 0.86):  282</preformat>
      <preformat>  FDP           (true pairs):    0.16
  Sensitivity   (true pairs):    0.26</preformat>
      <preformat>  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)</preformat>
      <preformat>  Multivariate MMD  (linked A vs. A):  0.07</preformat>
      <preformat>  Multivariate MMD  (linked B vs. B):  0.06</preformat>
      <preformat>  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, ...</preformat>
      <preformat>  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, ...</preformat>
      <p>Example of output from the <monospace>print()</monospace>
      method on <italic>FlexRL</italic>
      <monospace>RL_diagnostics</monospace> class, at threshold 0.86, on
      the SHIW in Emilia-Romagna.</p>
    </p>
    <p>Across the diagnostics, record linkage is run through wrappers
    with a common form,
    <monospace>link_with_&lt;pkg&gt;(dataA, dataB, ...)</monospace>,
    returning the indices of linked pairs and their linkage score.
    Wrappers exist for <italic>FlexRL</italic>,
    <italic>fastLink</italic>, <italic>BRL</italic>,
    <italic>reclin2</italic>, <italic>multilink</italic>,
    <italic>diyar</italic> and <italic>fedmatch</italic>. That way, the
    diagnostic tools apply to any of these methods in a similar
    fashion.</p>
    <p>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 <monospace>prepare_data()</monospace> in
    Section <xref alt="3.1" rid="sec-prepare">3.1</xref>), we work with
    1479 and 1524 records in the two data sources, which share 898 true
    links. The solid red line in
    Figure <xref alt="4" rid="fig-example">4</xref> is the reference
    estimate computed on these true links.</p>
    <p>The tools presented so far help identify a suitable linkage
    threshold by assessing the trade-off between contamination and
    sampling bias. In Figure <xref alt="4" rid="fig-example">4</xref>, a
    low threshold <inline-formula><alternatives>
    <tex-math><![CDATA[\xi=0.55]]></tex-math>
    <mml:math display="inline" xmlns:mml="http://www.w3.org/1998/Math/MathML"><mml:mrow><mml:mi>ξ</mml:mi><mml:mo>=</mml:mo><mml:mn>0.55</mml:mn></mml:mrow></mml:math></alternatives></inline-formula>
    yields a linked data estimate (dotted orange) affected by
    contamination bias, due to noisy falsely linked data (short dashed
    yellow estimate); see
    Equation <xref alt="(7)" rid="eq-beta-contamination">(7)</xref>.
    Conversely, a high threshold <inline-formula><alternatives>
    <tex-math><![CDATA[\xi=0.99]]></tex-math>
    <mml:math display="inline" xmlns:mml="http://www.w3.org/1998/Math/MathML"><mml:mrow><mml:mi>ξ</mml:mi><mml:mo>=</mml:mo><mml:mn>0.99</mml:mn></mml:mrow></mml:math></alternatives></inline-formula>
    yields a linked data estimate (dotted orange) affected by sampling
    bias, due to atypical truly linked data (long dashed yellow
    estimate); see
    Equation <xref alt="(8)" rid="eq-beta-sampling">(8)</xref>.</p>
    <p>Guided by the diagnostic tools, we choose
    <inline-formula><alternatives>
    <tex-math><![CDATA[\xi = 0.86]]></tex-math>
    <mml:math display="inline" xmlns:mml="http://www.w3.org/1998/Math/MathML"><mml:mrow><mml:mi>ξ</mml:mi><mml:mo>=</mml:mo><mml:mn>0.86</mml:mn></mml:mrow></mml:math></alternatives></inline-formula>,
    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.</p>
    <fig id="fig-example">
      <caption><p>Regression analysis on the SHIW in Emilia-Romagna
      linked through <italic>FlexRL</italic>.</p></caption>
      <p specific-use="wrapper">
        <graphic mimetype="image" mime-subtype="svg+xml" xlink:href="Article-FlexRL_files/figure-html/illustration-26-1.svg" />
      </p>
    </fig>
  </sec>
</sec>
<sec id="sec-scalability">
  <title>Scalability</title>
  <p>In (<bold>tbl-illustration?</bold>) of
  Section <xref alt="3" rid="sec-model">3</xref>, 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 <italic>FlexRL</italic> 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.</p>
  <p>In Section <xref alt="3.1" rid="sec-prepare">3.1</xref>, 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.</p>
  <preformat>    BirthYear           Sex MaritalStatus   BirthRegion    Occupation 
         0.99          1.00          0.98          1.00          0.82 
       Region 
         1.00 </preformat>
  <p>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
  <inline-formula><alternatives>
  <tex-math><![CDATA[\mathcal B]]></tex-math>
  <mml:math display="inline" xmlns:mml="http://www.w3.org/1998/Math/MathML"><mml:mi mathvariant="script">ℬ</mml:mi></mml:math></alternatives></inline-formula>
  for each record in <inline-formula><alternatives>
  <tex-math><![CDATA[\mathcal A]]></tex-math>
  <mml:math display="inline" xmlns:mml="http://www.w3.org/1998/Math/MathML"><mml:mi mathvariant="script">𝒜</mml:mi></mml:math></alternatives></inline-formula>
  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
  <italic>FlexRL</italic> which has both a higher FDP and a higher
  sensitivity without blocking. Note that
  <monospace>prepare_data()</monospace> eliminates out-of-support
  records at regional levels, which explains the differences in the
  partial confusion matrix of the ‘Naive’ method between
  (<bold>tbl-scalability?</bold>) and
  (<bold>tbl-scalability-block?</bold>).</p>
  <p>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 (<bold>tbl-scalability?</bold>) and
  (<bold>tbl-scalability-block?</bold>), which reflects how many records
  share the same combination of PIV values.</p>
  <preformat>    BirthYear           Sex MaritalStatus   BirthRegion    Occupation 
           94             2             4            18            52 </preformat>
  <preformat>    BirthYear           Sex MaritalStatus   BirthRegion    Occupation 
           99             2             4            20            84 
       Region 
           20 </preformat>
  <p>(<bold>tbl-scalability?</bold>) presents the comparative study
  without blocking; ‘Not Available’ results indicate memory errors. When
  supported, methods run with four threads
  (<monospace>threads</monospace> for <italic>FlexRL</italic>,
  <monospace>n.cores</monospace> for <italic>fastLink</italic>,
  <monospace>nthread</monospace> for <italic>fedmatch</italic>).
  (<bold>tbl-scalability-block?</bold>) shows the results with blocking
  on the Italian regions. More details on this data application
  showcasing the scalability of <italic>FlexRL</italic> are given in the
  package vignette ‘Scalable Record Linkage with FlexRL’ available
  through
  <monospace>vignette('FlexRL-RL-block-vignette', 'FlexRL')</monospace>
  or the
  <ext-link ext-link-type="uri" xlink:href="https://robachowyk.github.io/FlexRL/index.html">online
  documentation</ext-link>.</p>
  <p id="tbl-scalability">
    <table-wrap>
      <table>
        <colgroup>
          <col width="14%" />
          <col width="12%" />
          <col width="6%" />
          <col width="13%" />
          <col width="12%" />
          <col width="11%" />
          <col width="8%" />
          <col width="12%" />
          <col width="11%" />
        </colgroup>
        <thead>
          <tr>
            <th align="left"></th>
            <th align="center">Naive</th>
            <th align="center">BRL</th>
            <th align="center">multilink</th>
            <th align="center">fastLink</th>
            <th align="center">reclin2</th>
            <th align="center">diyar</th>
            <th align="center">fedmatch</th>
            <th align="center">FlexRL</th>
          </tr>
        </thead>
        <tbody>
          <tr>
            <td align="left">TP</td>
            <td align="center">8289.00</td>
            <td align="center">NA</td>
            <td align="center">NA</td>
            <td align="center">5061.00</td>
            <td align="center">NA</td>
            <td align="center">NA</td>
            <td align="center">5057.00</td>
            <td align="center">4105.00</td>
          </tr>
          <tr>
            <td align="left">FP</td>
            <td align="center">49350.00</td>
            <td align="center">NA</td>
            <td align="center">NA</td>
            <td align="center">11175.00</td>
            <td align="center">NA</td>
            <td align="center">NA</td>
            <td align="center">14154.00</td>
            <td align="center">5417.00</td>
          </tr>
          <tr>
            <td align="left">FN</td>
            <td align="center">2279.00</td>
            <td align="center">NA</td>
            <td align="center">NA</td>
            <td align="center">5507.00</td>
            <td align="center">NA</td>
            <td align="center">NA</td>
            <td align="center">5511.00</td>
            <td align="center">6463.00</td>
          </tr>
          <tr>
            <td align="left">sensitivity</td>
            <td align="center">0.78</td>
            <td align="center">NA</td>
            <td align="center">NA</td>
            <td align="center">0.48</td>
            <td align="center">NA</td>
            <td align="center">NA</td>
            <td align="center">0.48</td>
            <td align="center">0.39</td>
          </tr>
          <tr>
            <td align="left">FDP</td>
            <td align="center">0.86</td>
            <td align="center">NA</td>
            <td align="center">NA</td>
            <td align="center">0.69</td>
            <td align="center">NA</td>
            <td align="center">NA</td>
            <td align="center">0.74</td>
            <td align="center">0.57</td>
          </tr>
          <tr>
            <td align="left">time (mins)</td>
            <td align="center">0.00</td>
            <td align="center">NA</td>
            <td align="center">NA</td>
            <td align="center">9.00</td>
            <td align="center">NA</td>
            <td align="center">NA</td>
            <td align="center">5.00</td>
            <td align="center">6.00</td>
          </tr>
          <tr>
            <td align="left">memory (Mb)</td>
            <td align="center">123.20</td>
            <td align="center">NA</td>
            <td align="center">NA</td>
            <td align="center">20070.10</td>
            <td align="center">NA</td>
            <td align="center">NA</td>
            <td align="center">1877.00</td>
            <td align="center">4030.30</td>
          </tr>
        </tbody>
      </table>
    </table-wrap>
    <p>Comparison of record linkage methods on the complete SHIW data
    application for the default decision rule
    <inline-formula><alternatives>
    <tex-math><![CDATA[\xi=0.5.]]></tex-math>
    <mml:math display="inline" xmlns:mml="http://www.w3.org/1998/Math/MathML"><mml:mrow><mml:mi>ξ</mml:mi><mml:mo>=</mml:mo><mml:mn>0.5</mml:mn><mml:mi>.</mml:mi></mml:mrow></mml:math></alternatives></inline-formula></p>
  </p>
  <p id="tbl-scalability-block">
    <table-wrap>
      <table>
        <colgroup>
          <col width="13%" />
          <col width="11%" />
          <col width="10%" />
          <col width="12%" />
          <col width="11%" />
          <col width="13%" />
          <col width="11%" />
          <col width="11%" />
          <col width="10%" />
        </colgroup>
        <thead>
          <tr>
            <th align="left"></th>
            <th align="center">Naive</th>
            <th align="center">BRL</th>
            <th align="center">multilink</th>
            <th align="center">fastLink</th>
            <th align="center">reclin2</th>
            <th align="center">diyar</th>
            <th align="center">fedmatch</th>
            <th align="center">FlexRL</th>
          </tr>
        </thead>
        <tbody>
          <tr>
            <td align="left">TP</td>
            <td align="center">8289.00</td>
            <td align="center">1609.00</td>
            <td align="center">1771.00</td>
            <td align="center">4911.00</td>
            <td align="center">8993.00</td>
            <td align="center">316.00</td>
            <td align="center">5284.00</td>
            <td align="center">2916.00</td>
          </tr>
          <tr>
            <td align="left">FP</td>
            <td align="center">49346.00</td>
            <td align="center">449.00</td>
            <td align="center">1092.00</td>
            <td align="center">11295.00</td>
            <td align="center">4092774.00</td>
            <td align="center">12.00</td>
            <td align="center">13123.00</td>
            <td align="center">1308.00</td>
          </tr>
          <tr>
            <td align="left">FN</td>
            <td align="center">2059.00</td>
            <td align="center">8739.00</td>
            <td align="center">8577.00</td>
            <td align="center">5437.00</td>
            <td align="center">1355.00</td>
            <td align="center">10032.00</td>
            <td align="center">5064.00</td>
            <td align="center">7432.00</td>
          </tr>
          <tr>
            <td align="left">sensitivity</td>
            <td align="center">0.80</td>
            <td align="center">0.16</td>
            <td align="center">0.17</td>
            <td align="center">0.48</td>
            <td align="center">0.87</td>
            <td align="center">0.03</td>
            <td align="center">0.51</td>
            <td align="center">0.28</td>
          </tr>
          <tr>
            <td align="left">FDP</td>
            <td align="center">0.86</td>
            <td align="center">0.22</td>
            <td align="center">0.38</td>
            <td align="center">0.70</td>
            <td align="center">1.00</td>
            <td align="center">0.04</td>
            <td align="center">0.71</td>
            <td align="center">0.31</td>
          </tr>
          <tr>
            <td align="left">time (mins)</td>
            <td align="center">0.33</td>
            <td align="center">3.63</td>
            <td align="center">206.82</td>
            <td align="center">5.82</td>
            <td align="center">0.42</td>
            <td align="center">2.67</td>
            <td align="center">2.25</td>
            <td align="center">5.03</td>
          </tr>
          <tr>
            <td align="left">memory (Mb)</td>
            <td align="center">16.00</td>
            <td align="center">1150.00</td>
            <td align="center">3837.00</td>
            <td align="center">4716.00</td>
            <td align="center">2223.00</td>
            <td align="center">1530.00</td>
            <td align="center">766.00</td>
            <td align="center">862.00</td>
          </tr>
        </tbody>
      </table>
    </table-wrap>
    <p>Comparison of record linkage methods on the complete SHIW data
    application with regional blocking, for the default decision rule
    <inline-formula><alternatives>
    <tex-math><![CDATA[\xi=0.5.]]></tex-math>
    <mml:math display="inline" xmlns:mml="http://www.w3.org/1998/Math/MathML"><mml:mrow><mml:mi>ξ</mml:mi><mml:mo>=</mml:mo><mml:mn>0.5</mml:mn><mml:mi>.</mml:mi></mml:mrow></mml:math></alternatives></inline-formula></p>
  </p>
</sec>
<sec id="sec-discussion">
  <title>Discussion</title>
  <p>This article presented <italic>FlexRL</italic>: an
  <monospace>R</monospace> 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). <italic>FlexRL</italic> 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.</p>
  <p>To draw attention to the implications of linkage quality for
  statistical analysis, <italic>FlexRL</italic> 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.</p>
  <p>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.</p>
  <p>Notwithstanding these considerations, <italic>FlexRL</italic>
  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.</p>
</sec>
<sec id="data-and-code-availability" sec-type="data-availability">
  <title>Data and Code Availability</title>
  <p>The <italic>FlexRL</italic> package is available from the
  Comprehensive R Archive Network (<monospace>CRAN</monospace>) or from
  the package
  <ext-link ext-link-type="uri" xlink:href="https://github.com/robachowyk/FlexRL/">GitHub
  repository</ext-link> alongside documentation and vignettes describing
  its functionality. <italic>FlexRL</italic> is also available as a
  module in <monospace>JASP 1.0</monospace> (JASP Team, 2026). The
  script is available as supplementary material and on the
  <ext-link ext-link-type="uri" xlink:href="https://github.com/robachowyk/FlexRL/tree/master/vignettes/article">GitHub
  repository</ext-link> of the package.</p>
</sec>
<sec id="acknowledgements">
  <title>Acknowledgements</title>
  <p>The authors thank the anonymous reviewers for their valuable
  suggestions and for conducting a thorough reproducibility check.</p>
</sec>
<sec id="competing-interests">
  <title>Competing interests</title>
  <p>The authors are the developers of <italic>FlexRL</italic>.</p>
</sec>
</body>
<back><ref-list><ref id="ref1"><mixed-citation>Aleshin-Guendel, S. (2023). Multifile record linkage and duplicate detection [R package version 0.1.1]. https://CRAN.R-project.org/package=multilink</mixed-citation></ref><ref id="ref2"><element-citation publication-type="journal"><person-group person-group-type="author"><name><surname>Aleshin-Guendel</surname><given-names>Serge</given-names></name><name><surname>Sadinle</surname><given-names>Mauricio</given-names></name></person-group><article-title>Multifile Partitioning for Record Linkage and Duplicate Detection</article-title><source>Journal of the American Statistical Association</source><year>2023</year><volume>118</volume><issue>543</issue><fpage>1786</fpage><lpage>1795</lpage><publisher-name>Informa UK Limited</publisher-name><pub-id pub-id-type="doi">10.1080/01621459.2021.2013242</pub-id></element-citation></ref><ref id="ref3"><element-citation publication-type="journal"><person-group person-group-type="author"><name><surname>Belin</surname><given-names>Thomas R.</given-names></name><name><surname>Rubin</surname><given-names>Donald B.</given-names></name></person-group><article-title>A Method for Calibrating False-Match Rates in Record Linkage</article-title><source>Journal of the American Statistical Association</source><year>1995</year><volume>90</volume><issue>430</issue><fpage>694</fpage><lpage>707</lpage><publisher-name>Informa UK Limited</publisher-name><pub-id pub-id-type="doi">10.1080/01621459.1995.10476563</pub-id></element-citation></ref><ref id="ref4"><element-citation publication-type="journal"><person-group person-group-type="author"><name><surname>Binette</surname><given-names>Olivier</given-names></name><name><surname>Steorts</surname><given-names>Rebecca C.</given-names></name></person-group><article-title>(Almost) all of entity resolution</article-title><source>Science Advances</source><year>2022</year><volume>8</volume><issue>12</issue><publisher-name>American Association for the Advancement of Science (AAAS)</publisher-name><pub-id pub-id-type="doi">10.1126/sciadv.abi8021</pub-id></element-citation></ref><ref id="ref5"><element-citation publication-type="journal"><person-group person-group-type="author"><name><surname>Blakely</surname><given-names>Tony</given-names></name><name><surname>Salmond</surname><given-names>Clare</given-names></name></person-group><article-title>Probabilistic record linkage and a method to calculate the positive predictive value</article-title><source>International Journal of Epidemiology</source><year>2002</year><volume>31</volume><issue>6</issue><fpage>1246</fpage><lpage>1252</lpage><publisher-name>Oxford University Press (OUP)</publisher-name><pub-id pub-id-type="doi">10.1093/ije/31.6.1246</pub-id></element-citation></ref><ref id="ref6"><element-citation publication-type="journal"><person-group person-group-type="author"><name><surname>De Bruin</surname><given-names>J</given-names></name></person-group><article-title>Python Record Linkage Toolkit: A toolkit for record linkage and duplicate detection in Python</article-title><year>2019</year><publisher-name>Zenodo</publisher-name><pub-id pub-id-type="doi">10.5281/zenodo.3559043</pub-id></element-citation></ref><ref id="ref7"><mixed-citation>Bukke, P., Kamat, G., Cui, J., Gutman, R., &amp; Slawski, M. (2026). Postlink: Post-linkage data analysis [R package version 0.1.2]. https://postlink-group.github.io/postlink/</mixed-citation></ref><ref id="ref8"><element-citation publication-type="journal"><person-group person-group-type="author"><name><surname>Buuren</surname><given-names>Stef van</given-names></name><name><surname>Groothuis-Oudshoorn</surname><given-names>Karin</given-names></name></person-group><article-title>mice: Multivariate Imputation by Chained Equations in&lt;i&gt;R&lt;/i&gt;</article-title><source>Journal of Statistical Software</source><year>2011</year><volume>45</volume><issue>3</issue><publisher-name>Foundation for Open Access Statistic</publisher-name><pub-id pub-id-type="doi">10.18637/jss.v045.i03</pub-id></element-citation></ref><ref id="ref9"><mixed-citation>Celeux, G., &amp; 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/</mixed-citation></ref><ref id="ref10"><mixed-citation>Cleaton, M., Hall, J., Shipsey, R., White, Z., &amp; 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.</mixed-citation></ref><ref id="ref11"><element-citation publication-type="journal"><person-group person-group-type="author"><name><surname>Cohen</surname><given-names>Gregory J.</given-names></name><name><surname>Dice</surname><given-names>Jacob</given-names></name><name><surname>Friedrichs</surname><given-names>Melanie</given-names></name><name><surname>Gupta</surname><given-names>Kamran</given-names></name><name><surname>Hayes</surname><given-names>William</given-names></name><name><surname>Kitschelt</surname><given-names>Isabel</given-names></name><name><surname>Lee</surname><given-names>Seung Jung</given-names></name><name><surname>Marsh</surname><given-names>W. Blake</given-names></name><name><surname>Mislang</surname><given-names>Nathan</given-names></name><name><surname>Shaton</surname><given-names>Maya</given-names></name><name><surname>Sicilian</surname><given-names>Martin</given-names></name><name><surname>Webster</surname><given-names>Chris</given-names></name></person-group><article-title>The U.S. syndicated loan market: Matching data</article-title><source>Journal of Financial Research</source><year>2021</year><volume>44</volume><issue>4</issue><fpage>695</fpage><lpage>723</lpage><publisher-name>Wiley</publisher-name><pub-id pub-id-type="doi">10.1111/jfir.12261</pub-id></element-citation></ref><ref id="ref12"><mixed-citation>Cooney, T., Yu, S., Daral, S., Field, M., Krebs, B., Kieran, M., Manley, P., Govinda Raju, S., &amp; 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</mixed-citation></ref><ref id="ref13"><mixed-citation>Dasylva, A., &amp; Goussanou, A. (2020). Estimating linkage errors under regularity conditions. Proceedings of the Survey Research Methods Section.</mixed-citation></ref><ref id="ref14"><element-citation publication-type="journal"><person-group person-group-type="author"><name><surname>Dasylva</surname><given-names>Abel</given-names></name><name><surname>Goussanou</surname><given-names>Arthur</given-names></name></person-group><article-title>On the consistent estimation of linkage errors without training data</article-title><source>Japanese Journal of Statistics and Data Science</source><year>2022</year><volume>5</volume><issue>1</issue><fpage>181</fpage><lpage>216</lpage><publisher-name>Springer Science and Business Media LLC</publisher-name><pub-id pub-id-type="doi">10.1007/s42081-022-00153-3</pub-id></element-citation></ref><ref id="ref15"><element-citation publication-type="journal"><person-group person-group-type="author"><name><surname>Doidge</surname><given-names>James C</given-names></name><name><surname>Harron</surname><given-names>Katie L</given-names></name></person-group><article-title>Reflections on modern methods: linkage error bias</article-title><source>International Journal of Epidemiology</source><year>2019</year><publisher-name>Oxford University Press (OUP)</publisher-name><pub-id pub-id-type="doi">10.1093/ije/dyz203</pub-id></element-citation></ref><ref id="ref16"><element-citation publication-type="journal"><person-group person-group-type="author"><name><surname>Dunn</surname><given-names>Halbert L.</given-names></name></person-group><article-title>Record Linkage</article-title><source>American Journal of Public Health and the Nations Health</source><year>1946</year><volume>36</volume><issue>12</issue><fpage>1412</fpage><lpage>1416</lpage><publisher-name>American Public Health Association</publisher-name><pub-id pub-id-type="doi">10.2105/ajph.36.12.1412</pub-id></element-citation></ref><ref id="ref17"><mixed-citation>Dusetzina, S. B., Tyree, S., Meyer, A. M., Meyer, A., Green, L., &amp; 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/</mixed-citation></ref><ref id="ref18"><element-citation publication-type="journal"><person-group person-group-type="author"><name><surname>ENAMORADO</surname><given-names>TED</given-names></name><name><surname>FIFIELD</surname><given-names>BENJAMIN</given-names></name><name><surname>IMAI</surname><given-names>KOSUKE</given-names></name></person-group><article-title>Using a Probabilistic Model to Assist Merging of Large-Scale Administrative Records</article-title><source>American Political Science Review</source><year>2019</year><volume>113</volume><issue>2</issue><fpage>353</fpage><lpage>371</lpage><publisher-name>Cambridge University Press (CUP)</publisher-name><pub-id pub-id-type="doi">10.1017/S0003055418000783</pub-id></element-citation></ref><ref id="ref19"><element-citation publication-type="journal"><person-group person-group-type="author"><name><surname>Fellegi</surname><given-names>Ivan P.</given-names></name><name><surname>Sunter</surname><given-names>Alan B.</given-names></name></person-group><article-title>A Theory for Record Linkage</article-title><source>Journal of the American Statistical Association</source><year>1969</year><volume>64</volume><issue>328</issue><fpage>1183</fpage><lpage>1210</lpage><publisher-name>Informa UK Limited</publisher-name><pub-id pub-id-type="doi">10.1080/01621459.1969.10501049</pub-id></element-citation></ref><ref id="ref20"><mixed-citation>Fortini, M., Liseo, B., Nuccitelli, A., &amp; Scanu, M. (2001). On Bayesian record linkage. Research in Official Statistics, 4(6), 185–198.</mixed-citation></ref><ref id="ref21"><mixed-citation>Friedrichs, M., Webster, C., Marsh, B., Dice, J., &amp; 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</mixed-citation></ref><ref id="ref22"><mixed-citation>Gretton, A., Borgwardt, K. M., Rasch, M. J., Schölkopf, B., &amp; Smola, A. (2012). A kernel two-sample test. Journal of Machine Learning Research, 13, 723–773.</mixed-citation></ref><ref id="ref23"><element-citation publication-type="journal"><person-group person-group-type="author"><name><surname>Harron</surname><given-names>Katie</given-names></name><name><surname>Doidge</surname><given-names>James C.</given-names></name><name><surname>Goldstein</surname><given-names>Harvey</given-names></name></person-group><article-title>Assessing data linkage quality in cohort studies</article-title><source>Annals of Human Biology</source><year>2020</year><volume>47</volume><issue>2</issue><fpage>218</fpage><lpage>226</lpage><publisher-name>Informa UK Limited</publisher-name><pub-id pub-id-type="doi">10.1080/03014460.2020.1742379</pub-id></element-citation></ref><ref id="ref24"><element-citation publication-type="journal"><person-group person-group-type="author"><name><surname>Harron</surname><given-names>Katie L</given-names></name><name><surname>Doidge</surname><given-names>James C</given-names></name><name><surname>Knight</surname><given-names>Hannah E</given-names></name><name><surname>Gilbert</surname><given-names>Ruth E</given-names></name><name><surname>Goldstein</surname><given-names>Harvey</given-names></name><name><surname>Cromwell</surname><given-names>David A</given-names></name><name><surname>van der Meulen</surname><given-names>Jan H</given-names></name></person-group><article-title>A guide to evaluating linkage quality for the analysis of linked data</article-title><source>International Journal of Epidemiology</source><year>2017</year><volume>46</volume><issue>5</issue><fpage>1699</fpage><lpage>1710</lpage><publisher-name>Oxford University Press (OUP)</publisher-name><pub-id pub-id-type="doi">10.1093/ije/dyx177</pub-id></element-citation></ref><ref id="ref25"><element-citation publication-type="journal"><person-group person-group-type="author"><name><surname>Jaro</surname><given-names>Matthew A.</given-names></name></person-group><article-title>Advances in Record-Linkage Methodology as Applied to Matching the 1985 Census of Tampa, Florida</article-title><source>Journal of the American Statistical Association</source><year>1989</year><volume>84</volume><issue>406</issue><fpage>414</fpage><lpage>420</lpage><publisher-name>Informa UK Limited</publisher-name><pub-id pub-id-type="doi">10.1080/01621459.1989.10478785</pub-id></element-citation></ref><ref id="ref26"><mixed-citation>JASP Team. (2026). JASP (Version 1.0.0)[Computer software]. https://jasp-stats.org/</mixed-citation></ref><ref id="ref27"><mixed-citation>Jelveh, Z., McNeill, M., &amp; Lin, T.-Y. (2022). NameMatch. https://github.com/urban-labs/namematch</mixed-citation></ref><ref id="ref28"><mixed-citation>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</mixed-citation></ref><ref id="ref29"><element-citation publication-type="journal"><person-group person-group-type="author"><name><surname>Lahiri</surname><given-names>P</given-names></name><name><surname>Larsen</surname><given-names>Michael D</given-names></name></person-group><article-title>Regression Analysis With Linked Data</article-title><source>Journal of the American Statistical Association</source><year>2005</year><volume>100</volume><issue>469</issue><fpage>222</fpage><lpage>230</lpage><publisher-name>Informa UK Limited</publisher-name><pub-id pub-id-type="doi">10.1198/016214504000001277</pub-id></element-citation></ref><ref id="ref30"><element-citation publication-type="journal"><person-group person-group-type="author"><name><surname>Laidler</surname><given-names>Jonny</given-names></name><name><surname>Imaz Blanco</surname><given-names>Amaia</given-names></name><name><surname>Balasubramanian</surname><given-names>Divya</given-names></name></person-group><article-title>Probabilistic Linkage Pipeline Improving Linkage Quality and Explainability in Healthcare</article-title><source>International Journal of Population Data Science</source><year>2025</year><volume>10</volume><issue>4</issue><publisher-name>Swansea University</publisher-name><pub-id pub-id-type="doi">10.23889/ijpds.v10i4.3271</pub-id></element-citation></ref><ref id="ref31"><element-citation publication-type="journal"><person-group person-group-type="author"><name><surname>Lam</surname><given-names>Joseph</given-names></name><name><surname>Boyd</surname><given-names>Andy</given-names></name><name><surname>Linacre</surname><given-names>Robin</given-names></name><name><surname>Blackburn</surname><given-names>Ruth</given-names></name><name><surname>Harron</surname><given-names>Katie</given-names></name></person-group><article-title>Generating synthetic identifiers to support development and evaluation of data linkage methods</article-title><source>International Journal of Population Data Science</source><year>2024</year><volume>9</volume><issue>1</issue><publisher-name>Swansea University</publisher-name><pub-id pub-id-type="doi">10.23889/ijpds.v9i1.2389</pub-id></element-citation></ref><ref id="ref32"><mixed-citation>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.</mixed-citation></ref><ref id="ref33"><element-citation publication-type="journal"><person-group person-group-type="author"><name><surname>Linacre</surname><given-names>Robin</given-names></name><name><surname>Lindsay</surname><given-names>Sam</given-names></name><name><surname>Manassis</surname><given-names>Theodore</given-names></name><name><surname>Slade</surname><given-names>Zoe</given-names></name><name><surname>Hepworth</surname><given-names>Tom</given-names></name></person-group><article-title>Splink: Free software for probabilistic record linkage at scale.</article-title><source>International Journal of Population Data Science</source><year>2022</year><volume>7</volume><issue>3</issue><publisher-name>Swansea University</publisher-name><pub-id pub-id-type="doi">10.23889/ijpds.v7i3.1794</pub-id></element-citation></ref><ref id="ref34"><element-citation publication-type="journal"><person-group person-group-type="author"><name><surname>Marchant</surname><given-names>Neil G.</given-names></name><name><surname>Kaplan</surname><given-names>Andee</given-names></name><name><surname>Elazar</surname><given-names>Daniel N.</given-names></name><name><surname>Rubinstein</surname><given-names>Benjamin I. P.</given-names></name><name><surname>Steorts</surname><given-names>Rebecca C.</given-names></name></person-group><article-title>d-blink: Distributed End-to-End Bayesian Entity Resolution</article-title><source>Journal of Computational and Graphical Statistics</source><year>2021</year><volume>30</volume><issue>2</issue><fpage>406</fpage><lpage>421</lpage><publisher-name>Informa UK Limited</publisher-name><pub-id pub-id-type="doi">10.1080/10618600.2020.1825451</pub-id></element-citation></ref><ref id="ref35"><element-citation publication-type="journal"><person-group person-group-type="author"><name><surname>Marchant</surname><given-names>Neil G</given-names></name><name><surname>Rubinstein</surname><given-names>Benjamin I P</given-names></name><name><surname>Steorts</surname><given-names>Rebecca C</given-names></name></person-group><article-title>Bayesian Graphical Entity Resolution using Exchangeable Random Partition Priors</article-title><source>Journal of Survey Statistics and Methodology</source><year>2023</year><volume>11</volume><issue>3</issue><fpage>569</fpage><lpage>596</lpage><publisher-name>Oxford University Press (OUP)</publisher-name><pub-id pub-id-type="doi">10.1093/jssam/smac030</pub-id></element-citation></ref><ref id="ref36"><element-citation publication-type="confproc"><person-group person-group-type="author"><name><surname>Mudgal</surname><given-names>Sidharth</given-names></name><name><surname>Li</surname><given-names>Han</given-names></name><name><surname>Rekatsinas</surname><given-names>Theodoros</given-names></name><name><surname>Doan</surname><given-names>AnHai</given-names></name><name><surname>Park</surname><given-names>Youngchoon</given-names></name><name><surname>Krishnan</surname><given-names>Ganesh</given-names></name><name><surname>Deep</surname><given-names>Rohit</given-names></name><name><surname>Arcaute</surname><given-names>Esteban</given-names></name><name><surname>Raghavendra</surname><given-names>Vijay</given-names></name></person-group><article-title>Deep Learning for Entity Matching: A Design Space Exploration</article-title><source>Proceedings of the 2018 International Conference on Management of Data</source><year>2018</year><fpage>19</fpage><lpage>34</lpage><publisher-name>ACM</publisher-name><pub-id pub-id-type="doi">10.1145/3183713.3196926</pub-id></element-citation></ref><ref id="ref37"><element-citation publication-type="journal"><person-group person-group-type="author"><name><surname>Newcombe</surname><given-names>H. B.</given-names></name><name><surname>Kennedy</surname><given-names>J. M.</given-names></name><name><surname>Axford</surname><given-names>S. J.</given-names></name><name><surname>James</surname><given-names>A. P.</given-names></name></person-group><article-title>Automatic Linkage of Vital Records: Computers can be used to extract &quot;follow-up&quot; statistics of families from files of routine records</article-title><source>Science</source><year>1959</year><volume>130</volume><issue>3381</issue><fpage>954</fpage><lpage>959</lpage><publisher-name>American Association for the Advancement of Science (AAAS)</publisher-name><pub-id pub-id-type="doi">10.1126/science.130.3381.954</pub-id></element-citation></ref><ref id="ref38"><element-citation publication-type="journal"><person-group person-group-type="author"><name><surname>Nowok</surname><given-names>Beata</given-names></name><name><surname>Raab</surname><given-names>Gillian M.</given-names></name><name><surname>Dibben</surname><given-names>Chris</given-names></name></person-group><article-title>synthpop
                    : Bespoke Creation of Synthetic Data in
                    &lt;i&gt;R&lt;/i&gt;</article-title><source>Journal of Statistical Software</source><year>2016</year><volume>74</volume><issue>11</issue><publisher-name>Foundation for Open Access Statistic</publisher-name><pub-id pub-id-type="doi">10.18637/jss.v074.i11</pub-id></element-citation></ref><ref id="ref39"><mixed-citation>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</mixed-citation></ref><ref id="ref40"><element-citation publication-type="journal"><person-group person-group-type="author"><name><surname>Pontesilli</surname><given-names>M</given-names></name><name><surname>Hof</surname><given-names>M H</given-names></name><name><surname>Ravelli</surname><given-names>A C J</given-names></name><name><surname>van Altena</surname><given-names>A J</given-names></name><name><surname>Soufan</surname><given-names>A T</given-names></name><name><surname>Mol</surname><given-names>B W</given-names></name><name><surname>Kostelijk</surname><given-names>E H</given-names></name><name><surname>Slappendel</surname><given-names>E</given-names></name><name><surname>Consten</surname><given-names>D</given-names></name><name><surname>Cantineau</surname><given-names>A E P</given-names></name><name><surname>van der Westerlaken</surname><given-names>L A J</given-names></name><name><surname>van Inzen</surname><given-names>W</given-names></name><name><surname>Dumoulin</surname><given-names>J C M</given-names></name><name><surname>Ramos</surname><given-names>L</given-names></name><name><surname>Baart</surname><given-names>E B</given-names></name><name><surname>Broekmans</surname><given-names>F J M</given-names></name><name><surname>Rijnders</surname><given-names>P M</given-names></name><name><surname>Curfs</surname><given-names>M H J M</given-names></name><name><surname>Mastenbroek</surname><given-names>S</given-names></name><name><surname>Repping</surname><given-names>S</given-names></name><name><surname>Roseboom</surname><given-names>T J</given-names></name><name><surname>Painter</surname><given-names>R C</given-names></name></person-group><article-title>Effect of parental and ART treatment characteristics on perinatal outcomes</article-title><source>Human Reproduction</source><year>2021</year><volume>36</volume><issue>6</issue><fpage>1640</fpage><lpage>1665</lpage><publisher-name>Oxford University Press (OUP)</publisher-name><pub-id pub-id-type="doi">10.1093/humrep/deab008</pub-id></element-citation></ref><ref id="ref41"><mixed-citation>Resnick, D., &amp; 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</mixed-citation></ref><ref id="ref42"><mixed-citation>Robach, K., &amp; 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</mixed-citation></ref><ref id="ref43"><element-citation publication-type="journal"><person-group person-group-type="author"><name><surname>Robach</surname><given-names>Kayané</given-names></name><name><surname>Hof</surname><given-names>Michel H.</given-names></name><name><surname>van de Wiel</surname><given-names>Mark A.</given-names></name></person-group><article-title>False Discovery Estimation in Record Linkage</article-title><source>Statistics in Medicine</source><year>2025</year><volume>44</volume><issue>23-24</issue><publisher-name>Wiley</publisher-name><pub-id pub-id-type="doi">10.1002/sim.70292</pub-id></element-citation></ref><ref id="ref44"><mixed-citation>Robach, K., van de Wiel, M. A., Hof, M. H., &amp; van der Pas, S. L. (2026). Causal record linkage. https://arxiv.org/abs/2611.00760</mixed-citation></ref><ref id="ref45"><element-citation publication-type="journal"><person-group person-group-type="author"><name><surname>Robach</surname><given-names>Kayané</given-names></name><name><surname>van der Pas</surname><given-names>Stéphanie L</given-names></name><name><surname>van de Wiel</surname><given-names>Mark A</given-names></name><name><surname>Hof</surname><given-names>Michel H</given-names></name></person-group><article-title>A flexible model for record linkage</article-title><source>Journal of the Royal Statistical Society Series C: Applied Statistics</source><year>2025</year><volume>74</volume><issue>4</issue><fpage>1100</fpage><lpage>1127</lpage><publisher-name>Oxford University Press (OUP)</publisher-name><pub-id pub-id-type="doi">10.1093/jrsssc/qlaf016</pub-id></element-citation></ref><ref id="ref46"><element-citation publication-type="journal"><person-group person-group-type="author"><name><surname>Sadinle</surname><given-names>Mauricio</given-names></name></person-group><article-title>Bayesian Estimation of Bipartite Matchings for Record Linkage</article-title><source>Journal of the American Statistical Association</source><year>2017</year><volume>112</volume><issue>518</issue><fpage>600</fpage><lpage>612</lpage><publisher-name>Informa UK Limited</publisher-name><pub-id pub-id-type="doi">10.1080/01621459.2016.1148612</pub-id></element-citation></ref><ref id="ref47"><mixed-citation>Sadinle, M. (2020). Beta record linkage [R package version 0.1.0]. https://CRAN.R-project.org/package=BRL</mixed-citation></ref><ref id="ref48"><element-citation publication-type="journal"><person-group person-group-type="author"><name><surname>Steorts</surname><given-names>Rebecca C.</given-names></name></person-group><article-title>Entity Resolution with Empirically Motivated Priors</article-title><source>Bayesian Analysis</source><year>2015</year><volume>10</volume><issue>4</issue><fpage>849</fpage><lpage>875</lpage><publisher-name>Institute of Mathematical Statistics</publisher-name><pub-id pub-id-type="doi">10.1214/15-ba965si</pub-id></element-citation></ref><ref id="ref49"><element-citation publication-type="journal"><person-group person-group-type="author"><name><surname>Steorts</surname><given-names>Rebecca C.</given-names></name><name><surname>Hall</surname><given-names>Rob</given-names></name><name><surname>Fienberg</surname><given-names>Stephen E.</given-names></name></person-group><article-title>A Bayesian Approach to Graphical Record Linkage and Deduplication</article-title><source>Journal of the American Statistical Association</source><year>2016</year><volume>111</volume><issue>516</issue><fpage>1660</fpage><lpage>1672</lpage><publisher-name>Informa UK Limited</publisher-name><pub-id pub-id-type="doi">10.1080/01621459.2015.1105807</pub-id></element-citation></ref><ref id="ref50"><element-citation publication-type="book"><person-group person-group-type="author"><name><surname>Steorts</surname><given-names>Rebecca C.</given-names></name><name><surname>Ventura</surname><given-names>Samuel L.</given-names></name><name><surname>Sadinle</surname><given-names>Mauricio</given-names></name><name><surname>Fienberg</surname><given-names>Stephen E.</given-names></name></person-group><article-title>A Comparison of Blocking Methods for Record Linkage</article-title><source>Lecture Notes in Computer Science</source><year>2014</year><fpage>253</fpage><lpage>268</lpage><publisher-name>Springer International Publishing</publisher-name><pub-id pub-id-type="doi">10.1007/978-3-319-11257-2_20</pub-id></element-citation></ref><ref id="ref51"><mixed-citation>Steorts, R., Hall, R., &amp; Fienberg, S. (2014). SMERED: A Bayesian Approach to Graphical Record Linkage and De-duplication. In S. Kaski &amp; 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</mixed-citation></ref><ref id="ref52"><element-citation publication-type="journal"><person-group person-group-type="author"><name><surname>Tancredi</surname><given-names>Andrea</given-names></name><name><surname>Liseo</surname><given-names>Brunero</given-names></name></person-group><article-title>A hierarchical Bayesian approach to record linkage and population size problems</article-title><source>The Annals of Applied Statistics</source><year>2011</year><volume>5</volume><issue>2B</issue><fpage>1553</fpage><lpage>1585</lpage><publisher-name>Institute of Mathematical Statistics</publisher-name><pub-id pub-id-type="doi">10.1214/10-aoas447</pub-id></element-citation></ref><ref id="ref53"><element-citation publication-type="journal"><person-group person-group-type="author"><name><surname>Tancredi</surname><given-names>Andrea</given-names></name><name><surname>Liseo</surname><given-names>Brunero</given-names></name></person-group><article-title>Regression analysis with linked data: problems and possible solutions</article-title><source>Statistica</source><year>2015</year><volume>Vol 75</volume><fpage>No 1 (2015)</fpage><publisher-name>Dep. of Statistical Sciences &quot;Paolo Fortunati&quot;, Università di Bologna</publisher-name><pub-id pub-id-type="doi">10.6092/issn.1973-2201/5821</pub-id></element-citation></ref><ref id="ref54"><mixed-citation>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</mixed-citation></ref><ref id="ref55"><element-citation publication-type="journal"><person-group person-group-type="author"><name><surname>Tepping</surname><given-names>Benjamin J.</given-names></name></person-group><article-title>A Model for Optimum Linkage of Records</article-title><source>Journal of the American Statistical Association</source><year>1968</year><volume>63</volume><issue>324</issue><fpage>1321</fpage><lpage>1332</lpage><publisher-name>Informa UK Limited</publisher-name><pub-id pub-id-type="doi">10.1080/01621459.1968.10480930</pub-id></element-citation></ref><ref id="ref56"><mixed-citation>van der Laan, J. (2025). reclin2: Record linkage toolkit [R package version 0.6.0]. https://github.com/djvanderlaan/reclin2</mixed-citation></ref><ref id="ref57"><element-citation publication-type="journal"><person-group person-group-type="author"><name><surname>Vo</surname><given-names>Thanh Huan</given-names></name><name><surname>Garès</surname><given-names>Valérie</given-names></name><name><surname>Zhang</surname><given-names>Li‐Chun</given-names></name><name><surname>Happe</surname><given-names>André</given-names></name><name><surname>Oger</surname><given-names>Emmanuel</given-names></name><name><surname>Paquelet</surname><given-names>Stéphane</given-names></name><name><surname>Chauvet</surname><given-names>Guillaume</given-names></name></person-group><article-title>Cox regression with linked data</article-title><source>Statistics in Medicine</source><year>2024</year><volume>43</volume><issue>2</issue><fpage>296</fpage><lpage>314</lpage><publisher-name>Wiley</publisher-name><pub-id pub-id-type="doi">10.1002/sim.9960</pub-id></element-citation></ref><ref id="ref58"><element-citation publication-type="journal"><person-group person-group-type="author"><name><surname>Wang</surname><given-names>Zhenbang</given-names></name><name><surname>Ben‐David</surname><given-names>Emanuel</given-names></name><name><surname>Diao</surname><given-names>Guoqing</given-names></name><name><surname>Slawski</surname><given-names>Martin</given-names></name></person-group><article-title>Regression with linked datasets subject to linkage error</article-title><source>WIREs Computational Statistics</source><year>2022</year><volume>14</volume><issue>4</issue><publisher-name>Wiley</publisher-name><pub-id pub-id-type="doi">10.1002/wics.1570</pub-id></element-citation></ref><ref id="ref59"><mixed-citation>Watson, D. S., Blesch, K., Kapar, J., &amp; 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</mixed-citation></ref><ref id="ref60"><mixed-citation>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.</mixed-citation></ref></ref-list>
<ref-list>
  <title>References</title>
  <ref id="ref-multilinkmanual">
    <mixed-citation>Aleshin-Guendel, S. (2023). <italic>Multifile record
    linkage and duplicate detection</italic> [R package version 0.1.1].
    <ext-link ext-link-type="uri" xlink:href="https://CRAN.R-project.org/package=multilink">https://CRAN.R-project.org/package=multilink</ext-link></mixed-citation>
  </ref>
  <ref id="ref-multifilepartitioningrecordlinkage">
    <mixed-citation>Aleshin-Guendel, S., &amp; Sadinle, M. (2023).
    Multifile partitioning for record linkage and duplicate detection.
    <italic>Journal of the American Statistical Association</italic>,
    <italic>118</italic>(543), 1786–1795.
    <ext-link ext-link-type="uri" xlink:href="https://doi.org/10.1080/01621459.2021.2013242">https://doi.org/10.1080/01621459.2021.2013242</ext-link></mixed-citation>
  </ref>
  <ref id="ref-belin_rubin_1995">
    <mixed-citation>Belin, T. R., &amp; Rubin, D. B. (1995). A method
    for calibrating false-match rates in record linkage. <italic>Journal
    of the American Statistical Association</italic>,
    <italic>90</italic>(430), 694–707.
    <ext-link ext-link-type="uri" xlink:href="http://www.jstor.org/stable/2291082">http://www.jstor.org/stable/2291082</ext-link></mixed-citation>
  </ref>
  <ref id="ref-Binette_Steorts_2022">
    <mixed-citation>Binette, O., &amp; Steorts, R. C. (2022). (Almost)
    all of entity resolution. <italic>Science Advances</italic>,
    <italic>8</italic>(12), eabi8021.
    <ext-link ext-link-type="uri" xlink:href="https://doi.org/10.1126/sciadv.abi8021">https://doi.org/10.1126/sciadv.abi8021</ext-link></mixed-citation>
  </ref>
  <ref id="ref-sensitivity_2002">
    <mixed-citation>Blakely, T., &amp; Salmond, C. (2002). Probabilistic
    record linkage and a method to calculate the positive predictive
    value. <italic>International Journal of Epidemiology</italic>,
    <italic>31</italic>(6), 1246–1252.
    <ext-link ext-link-type="uri" xlink:href="https://doi.org/10.1093/ije/31.6.1246">https://doi.org/10.1093/ije/31.6.1246</ext-link></mixed-citation>
  </ref>
  <ref id="ref-PYRL_de_bruin_j_2019">
    <mixed-citation>Bruin, J. de. (2019). <italic>Python record linkage
    toolkit: A toolkit for record linkage and duplicate detection in
    python</italic>.
    <ext-link ext-link-type="uri" xlink:href="https://doi.org/10.5281/zenodo.3559043">https://doi.org/10.5281/zenodo.3559043</ext-link></mixed-citation>
  </ref>
  <ref id="ref-postlink26">
    <mixed-citation>Bukke, P., Kamat, G., Cui, J., Gutman, R., &amp;
    Slawski, M. (2026). <italic>Postlink: Post-linkage data
    analysis</italic> [R package version 0.1.2].
    <ext-link ext-link-type="uri" xlink:href="https://postlink-group.github.io/postlink/">https://postlink-group.github.io/postlink/</ext-link></mixed-citation>
  </ref>
  <ref id="ref-mice_2011">
    <mixed-citation>Buuren, S. van, &amp; Groothuis-Oudshoorn, K.
    (2011). Mice: Multivariate imputation by chained equations in r.
    <italic>Journal of Statistical Software</italic>,
    <italic>45</italic>(3), 1–67.
    <ext-link ext-link-type="uri" xlink:href="https://doi.org/10.18637/jss.v045.i03">https://doi.org/10.18637/jss.v045.i03</ext-link></mixed-citation>
  </ref>
  <ref id="ref-celeux_diebolt_SEM">
    <mixed-citation>Celeux, G., &amp; Diebolt, J. (1986). L’algorithme
    SEM : Un algorithme d’apprentissage probabiliste pour la
    reconnaissance de mélange de densités. <italic>Revue de Statistiques
    Appliquées</italic>, <italic>34</italic>(2), 35–52.
    <ext-link ext-link-type="uri" xlink:href="http://www.numdam.org/item/RSA_1986__34_2_35_0/">http://www.numdam.org/item/RSA_1986__34_2_35_0/</ext-link></mixed-citation>
  </ref>
  <ref id="ref-Cleaton_Splink_2024">
    <mixed-citation>Cleaton, M., Hall, J., Shipsey, R., White, Z., &amp;
    Xhaferaj, K. (2024). A case study of using Splink: Census duplicate
    matching. <italic>Proceedings of Statistics Canada Symposium 2022.
    Data Disaggregation: Building a More Representative Data Portrait of
    Society</italic>.</mixed-citation>
  </ref>
  <ref id="ref-fedmatch_article">
    <mixed-citation>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., &amp; Webster, C. (2021). The U.S.
    Syndicated loan market: Matching data. <italic>Journal of Financial
    Research</italic>, <italic>44</italic>(4), 695–723.
    https://doi.org/<ext-link ext-link-type="uri" xlink:href="https://doi.org/10.1111/jfir.12261">https://doi.org/10.1111/jfir.12261</ext-link></mixed-citation>
  </ref>
  <ref id="ref-cooneyhealthcare_2023">
    <mixed-citation>Cooney, T., Yu, S., Daral, S., Field, M., Krebs, B.,
    Kieran, M., Manley, P., Govinda Raju, S., &amp; Zelt, S. (2023).
    Healthcare resource use for pediatric low-grade glioma care: A
    cohort of linked electronic health records and claims data.
    <italic>Journal of Clinical Oncology</italic>,
    <italic>41</italic>(16_suppl), 10038–10038.
    <ext-link ext-link-type="uri" xlink:href="https://doi.org/10.1200/JCO.2023.41.16\_suppl.10038">https://doi.org/10.1200/JCO.2023.41.16\_suppl.10038</ext-link></mixed-citation>
  </ref>
  <ref id="ref-sensitivity_2020">
    <mixed-citation>Dasylva, A., &amp; Goussanou, A. (2020). Estimating
    linkage errors under regularity conditions. <italic>Proceedings of
    the Survey Research Methods Section</italic>.</mixed-citation>
  </ref>
  <ref id="ref-DG_esterror22">
    <mixed-citation>Dasylva, A., &amp; Goussanou, A. (2022). On the
    consistent estimation of linkage errors without training data.
    <italic>Japanese Journal of Statistics and Data Science</italic>,
    <italic>5</italic>.
    <ext-link ext-link-type="uri" xlink:href="https://doi.org/10.1007/s42081-022-00153-3">https://doi.org/10.1007/s42081-022-00153-3</ext-link></mixed-citation>
  </ref>
  <ref id="ref-reflexRL_2020">
    <mixed-citation>Doidge, J. C., &amp; Harron, K. L. (2020).
    Reflections on modern methods: Linkage error bias.
    <italic>International Journal of Epidemiology</italic>.
    <ext-link ext-link-type="uri" xlink:href="https://doi.org/10.1093/ije/dyz203">https://doi.org/10.1093/ije/dyz203</ext-link></mixed-citation>
  </ref>
  <ref id="ref-bookoflife">
    <mixed-citation>Dunn, H. L. (1946). Record linkage. <italic>American
    Journal of Public Health and the Nations Health</italic>,
    <italic>36</italic>(12), 1412–1416.</mixed-citation>
  </ref>
  <ref id="ref-review_methods_2014">
    <mixed-citation>Dusetzina, S. B., Tyree, S., Meyer, A. M., Meyer,
    A., Green, L., &amp; Carpenter, W. R. (2014). Linking data for
    health services research: A framework and instructional guide
    [internet]. In <italic>Agency for Healthcare Research and Quality
    (US)</italic>. https://www.ncbi.nlm.nih.gov/books/NBK253312/.
    <ext-link ext-link-type="uri" xlink:href="https://www.ncbi.nlm.nih.gov/books/NBK253312/">https://www.ncbi.nlm.nih.gov/books/NBK253312/</ext-link></mixed-citation>
  </ref>
  <ref id="ref-fastLink_paper_2019">
    <mixed-citation>Enamorado, T., Fifield, B., &amp; Imai, K. (2019).
    Using a probabilistic model to assist merging of large-scale
    administrative records. <italic>American Political Science
    Review</italic>, <italic>113</italic>(2), 353–371.
    <ext-link ext-link-type="uri" xlink:href="https://doi.org/10.1017/S0003055418000783">https://doi.org/10.1017/S0003055418000783</ext-link></mixed-citation>
  </ref>
  <ref id="ref-FS_RL_1969">
    <mixed-citation>Fellegi, I. P., &amp; Sunter, A. B. (1969). A theory
    for record linkage. <italic>Journal of the American Statistical
    Association</italic>, <italic>64</italic>(328),
    1183–1210.</mixed-citation>
  </ref>
  <ref id="ref-fortini_bay_RL_2001">
    <mixed-citation>Fortini, M., Liseo, B., Nuccitelli, A., &amp; Scanu,
    M. (2001). On Bayesian record linkage. <italic>Research in Official
    Statistics</italic>, <italic>4</italic>(6),
    185–198.</mixed-citation>
  </ref>
  <ref id="ref-fedmatchmanual">
    <mixed-citation>Friedrichs, M., Webster, C., Marsh, B., Dice, J.,
    &amp; Lee, S. (2023). <italic>Fedmatch: Fast, flexible, and
    user-friendly record linkage methods</italic> [R package version
    2.0.6].
    <ext-link ext-link-type="uri" xlink:href="https://CRAN.R-project.org/package=fedmatch">https://CRAN.R-project.org/package=fedmatch</ext-link></mixed-citation>
  </ref>
  <ref id="ref-gretton2012">
    <mixed-citation>Gretton, A., Borgwardt, K. M., Rasch, M. J.,
    Schölkopf, B., &amp; Smola, A. (2012). A kernel two-sample test.
    <italic>Journal of Machine Learning Research</italic>,
    <italic>13</italic>, 723–773.</mixed-citation>
  </ref>
  <ref id="ref-datalinkagequal2020">
    <mixed-citation>Harron, K. L., Doidge, J. C., &amp; Goldstein, H.
    (2020). Assessing data linkage quality in cohort studies.
    <italic>Annals of Human Biology</italic>, <italic>47</italic>,
    218–226.
    <ext-link ext-link-type="uri" xlink:href="https://doi.org/10.1080/03014460.2020.1742379">https://doi.org/10.1080/03014460.2020.1742379</ext-link></mixed-citation>
  </ref>
  <ref id="ref-eval_linkage_17">
    <mixed-citation>Harron, K. L., Doidge, J. C., Knight, H. E.,
    Gilbert, R. E., Goldstein, H., Cromwell, D. A., &amp; Meulen, J. H.
    van der. (2017). A guide to evaluating linkage quality for the
    analysis of linked data. <italic>International Journal of
    Epidemiology</italic>, <italic>46</italic>(5), 1699–1710.
    <ext-link ext-link-type="uri" xlink:href="https://doi.org/10.1093/ije/dyx177">https://doi.org/10.1093/ije/dyx177</ext-link></mixed-citation>
  </ref>
  <ref id="ref-jaro_RL_matching_1989">
    <mixed-citation>Jaro, M. A. (1989). Advances in record-linkage
    methodology as applied to matching the 1985 census of tampa,
    florida. <italic>Journal of the American Statistical
    Association</italic>, <italic>84</italic>(406),
    414–420.</mixed-citation>
  </ref>
  <ref id="ref-JASP2026">
    <mixed-citation>JASP Team. (2026).
    <italic><named-content content-type="nocase">JASP (Version
    1.0.0)[Computer software]</named-content></italic>.
    <ext-link ext-link-type="uri" xlink:href="https://jasp-stats.org/">https://jasp-stats.org/</ext-link></mixed-citation>
  </ref>
  <ref id="ref-PYRL_namematch">
    <mixed-citation>Jelveh, Z., McNeill, M., &amp; Lin, T.-Y. (2022).
    <italic>NameMatch</italic>.
    <ext-link ext-link-type="uri" xlink:href="https://github.com/urban-labs/namematch">https://github.com/urban-labs/namematch</ext-link></mixed-citation>
  </ref>
  <ref id="ref-Kramer_Destatis_2026">
    <mixed-citation>Kramer, R. (2026). Towards scalable probabilistic
    linkage of administrative population data in Germany: Insights from
    a method test with Splink. <italic>International Journal of
    Population Data Science</italic>, <italic>11</italic>(4).
    <ext-link ext-link-type="uri" xlink:href="https://doi.org/10.23889/ijpds.v11i4.3814">https://doi.org/10.23889/ijpds.v11i4.3814</ext-link></mixed-citation>
  </ref>
  <ref id="ref-Lahiri_Larsen_linked_2005">
    <mixed-citation>Lahiri, P., &amp; Larsen, M. D. (2005). Regression
    analysis with linked data. <italic>Journal of the American
    Statistical Association</italic>, <italic>100</italic>(469),
    222–230.
    <ext-link ext-link-type="uri" xlink:href="http://www.jstor.org/stable/27590532">http://www.jstor.org/stable/27590532</ext-link></mixed-citation>
  </ref>
  <ref id="ref-Laidler_NHSE_2025">
    <mixed-citation>Laidler, J., Imaz Blanco, A., &amp; Balasubramanian,
    D. (2025). Probabilistic linkage pipeline improving linkage quality
    and explainability in healthcare. <italic>International Journal of
    Population Data Science</italic>, <italic>10</italic>(4).
    <ext-link ext-link-type="uri" xlink:href="https://doi.org/10.23889/ijpds.v10i4.3271">https://doi.org/10.23889/ijpds.v10i4.3271</ext-link></mixed-citation>
  </ref>
  <ref id="ref-linkage_bias_datasynthesis24">
    <mixed-citation>Lam, J., Boyd, A., Linacre, R., Blackburn, R., &amp;
    Harron, K. (2024). Generating synthetic identifiers to support
    development and evaluation of data linkage methods.
    <italic>International Journal of Population Data Science</italic>,
    <italic>9</italic>(1).
    <ext-link ext-link-type="uri" xlink:href="https://doi.org/10.23889/ijpds.v9i1.2389">https://doi.org/10.23889/ijpds.v9i1.2389</ext-link></mixed-citation>
  </ref>
  <ref id="ref-Larsen_mixture_1999">
    <mixed-citation>Larsen, M. D. (1999). Multiple imputation analysis
    of records linked using mixture models. <italic>Proceedings of the
    Survey Methods Section, Statistical Society of Canada Annual
    Meeting</italic>, <italic>63</italic>, 65–71.</mixed-citation>
  </ref>
  <ref id="ref-splink_2022">
    <mixed-citation>Linacre, R., Lindsay, S., Manassis, T., Slade, Z.,
    Hepworth, T., Kennedy, R., &amp; Bond, A. (2022). Splink: Free
    software for probabilistic record linkage at scale.
    <italic>International Journal of Population Data Science</italic>,
    <italic>7</italic>(3).
    <ext-link ext-link-type="uri" xlink:href="https://doi.org/10.23889/ijpds.v7i3.1794">https://doi.org/10.23889/ijpds.v7i3.1794</ext-link></mixed-citation>
  </ref>
  <ref id="ref-dblink_2021">
    <mixed-citation>Marchant, N. G., Kaplan, A., Elazar, D. N.,
    Rubinstein, B. I. P., &amp; Steorts, R. C. (2021). D-blink:
    Distributed end-to-end Bayesian entity resolution. <italic>Journal
    of Computational and Graphical Statistics</italic>,
    <italic>30</italic>(2), 406--421.</mixed-citation>
  </ref>
  <ref id="ref-marchantsteorts2023">
    <mixed-citation>Marchant, N. G., Rubinstein, B. I. P., &amp;
    Steorts, R. C. (2023). Bayesian graphical entity resolution using
    exchangeable random partition priors. <italic>Journal of Survey
    Statistics and Methodology</italic>, <italic>11</italic>(3),
    569–596.</mixed-citation>
  </ref>
  <ref id="ref-DeepMatcher_method_2018">
    <mixed-citation>Mudgal, S., Li, H., Rekatsinas, T., Doan, A., Park,
    Y., Krishnan, G., Deep, R., Arcaute, E., &amp; Raghavendra, V.
    (2018). Deep learning for entity matching: A design space
    exploration. <italic>Proceedings of the 2018 International
    Conference on Management of Data, SIGMOD ’18</italic>, 19–34.
    <ext-link ext-link-type="uri" xlink:href="https://doi.org/10.1145/3183713.3196926">https://doi.org/10.1145/3183713.3196926</ext-link></mixed-citation>
  </ref>
  <ref id="ref-newcombe1959">
    <mixed-citation>Newcombe, H. B., Kennedy, J. M., Axford, S. J.,
    &amp; James, A. P. (1959). Automatic linkage of vital records.
    <italic>Science</italic>, <italic>130</italic>(3381), 954–959.
    <ext-link ext-link-type="uri" xlink:href="https://doi.org/10.1126/science.130.3381.954">https://doi.org/10.1126/science.130.3381.954</ext-link></mixed-citation>
  </ref>
  <ref id="ref-synthpop_2016">
    <mixed-citation>Nowok, B., Raab, G. M., &amp; Dibben, C. (2016).
    Synthpop: Bespoke creation of synthetic data in r. <italic>Journal
    of Statistical Software</italic>, <italic>74</italic>(11), 1–26.
    <ext-link ext-link-type="uri" xlink:href="https://doi.org/10.18637/jss.v074.i11">https://doi.org/10.18637/jss.v074.i11</ext-link></mixed-citation>
  </ref>
  <ref id="ref-diyarmanual">
    <mixed-citation>Nsonwu, O. (2023). <italic>Diyar: Record linkage and
    epidemiological case definitions in ’r’</italic> [R package version
    0.5.1].
    <ext-link ext-link-type="uri" xlink:href="https://olisansonwu.github.io/diyar/index.html">https://olisansonwu.github.io/diyar/index.html</ext-link></mixed-citation>
  </ref>
  <ref id="ref-perined_linkage_2021">
    <mixed-citation>Pontesilli, M., Hof, M. H., Ravelli, A. C. J.,
    Altena, A. J. van, Soufan, A. T., Mol, B. W., Kostelijk, E. H.,
    Slappendel, E., Consten, D., Cantineau, A. E. P., Westerlaken, L. A.
    J. van der, Inzen, W. van, 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).
    <named-content content-type="nocase">Effect of parental and ART
    treatment characteristics on perinatal outcomes</named-content>.
    <italic>Human Reproduction</italic>, <italic>36</italic>(6),
    1640–1665.
    <ext-link ext-link-type="uri" xlink:href="https://doi.org/10.1093/humrep/deab008">https://doi.org/10.1093/humrep/deab008</ext-link></mixed-citation>
  </ref>
  <ref id="ref-measurementError_2019">
    <mixed-citation>Resnick, D., &amp; Asher, J. (2019, September).
    Measurement of type i and type II record linkage error.
    <italic>Using and Linking Administrative and Auxiliary Data,
    Government Statistics Section</italic>.
    <ext-link ext-link-type="uri" xlink:href="https://ww2.amstat.org/meetings/proceedings/2019/data/assets/pdf/1199462.pdf">https://ww2.amstat.org/meetings/proceedings/2019/data/assets/pdf/1199462.pdf</ext-link></mixed-citation>
  </ref>
  <ref id="ref-flexrlmanual">
    <mixed-citation>Robach, K., &amp; Hof, M. H. (2026). <italic>FlexRL:
    Flexible record linkage and inference on linked data</italic> [R
    package version 2.0.0].
    <ext-link ext-link-type="uri" xlink:href="https://CRAN.R-project.org/package=FlexRL">https://CRAN.R-project.org/package=FlexRL</ext-link></mixed-citation>
  </ref>
  <ref id="ref-FDProbachetal25">
    <mixed-citation>Robach, K., Hof, M. H., &amp; Wiel, M. A. van de.
    (2025). False discovery estimation in record linkage.
    <italic>Statistics in Medicine</italic>, <italic>44</italic>(23-24),
    e70292.
    https://doi.org/<ext-link ext-link-type="uri" xlink:href="https://doi.org/10.1002/sim.70292">https://doi.org/10.1002/sim.70292</ext-link></mixed-citation>
  </ref>
  <ref id="ref-CRLrobachetal26">
    <mixed-citation><named-content content-type="nocase">Robach, K., van
    de Wiel, M. A., Hof, M. H., &amp; van der Pas, S. L.</named-content>
    (2026). <italic>Causal record linkage</italic>.
    <ext-link ext-link-type="uri" xlink:href="https://arxiv.org/abs/2611.00760">https://arxiv.org/abs/2611.00760</ext-link></mixed-citation>
  </ref>
  <ref id="ref-RLrobachetal25">
    <mixed-citation><named-content content-type="nocase">Robach, K., van
    der Pas, S. L., van de Wiel, M. A., &amp; Hof, M. H.</named-content>
    (2025). A flexible model for record linkage. <italic>Journal of the
    Royal Statistical Society Series C: Applied Statistics</italic>,
    qlaf016.
    <ext-link ext-link-type="uri" xlink:href="https://doi.org/10.1093/jrsssc/qlaf016">https://doi.org/10.1093/jrsssc/qlaf016</ext-link></mixed-citation>
  </ref>
  <ref id="ref-sadinle_bay_bipartite_RL_2017">
    <mixed-citation>Sadinle, M. (2017). Bayesian estimation of bipartite
    matchings for record linkage. <italic>Journal of the American
    Statistical Association</italic>, <italic>112</italic>(518),
    600–612.</mixed-citation>
  </ref>
  <ref id="ref-brlmanual">
    <mixed-citation>Sadinle, M. (2020). <italic>Beta record
    linkage</italic> [R package version 0.1.0].
    <ext-link ext-link-type="uri" xlink:href="https://CRAN.R-project.org/package=BRL">https://CRAN.R-project.org/package=BRL</ext-link></mixed-citation>
  </ref>
  <ref id="ref-steorts2015">
    <mixed-citation>Steorts, R. C. (2015). Entity resolution with
    empirically motivated priors. <italic>Bayesian Analysis</italic>,
    <italic>10</italic>(4), 849–875.</mixed-citation>
  </ref>
  <ref id="ref-smered2016">
    <mixed-citation>Steorts, R. C., Hall, R., &amp; Fienberg, S. E.
    (2016). A Bayesian approach to graphical record linkage and
    deduplication. <italic>Journal of the American Statistical
    Association</italic>, <italic>111</italic>(516),
    1660–1672.</mixed-citation>
  </ref>
  <ref id="ref-blocking_methods_2014">
    <mixed-citation>Steorts, R. C., Ventura, S. L., Sadinle, M., &amp;
    Fienberg, S. E. (2014). <italic>A comparison of blocking methods for
    record linkage</italic>. Springer International
    Publishing.</mixed-citation>
  </ref>
  <ref id="ref-smered16software">
    <mixed-citation>Steorts, R., Hall, R., &amp; Fienberg, S. (2014).
    <named-content content-type="nocase">SMERED: A Bayesian Approach to
    Graphical Record Linkage and De-duplication</named-content>. In S.
    Kaski &amp; J. Corander (Eds.), <italic>Proceedings of the
    seventeenth international conference on artificial intelligence and
    statistics</italic> (Vol. 33, pp. 922–930). PMLR.
    <ext-link ext-link-type="uri" xlink:href="https://proceedings.mlr.press/v33/steorts14.html">https://proceedings.mlr.press/v33/steorts14.html</ext-link></mixed-citation>
  </ref>
  <ref id="ref-tancredi_bay_RL_2011">
    <mixed-citation>Tancredi, A., &amp; Liseo, B. (2011). A hierarchical
    Bayesian approach to record linkage and population size problems.
    <italic>The Annals of Applied Statistics</italic>,
    <italic>5</italic>(2B).</mixed-citation>
  </ref>
  <ref id="ref-Tancredi_Liseo_linked_2015">
    <mixed-citation>Tancredi, A., &amp; Liseo, B. (2015). Regression
    analysis with linked data: Problems and possible solutions.
    <italic>Statistica</italic>, <italic>75</italic>(1), 19–35.
    <ext-link ext-link-type="uri" xlink:href="https://doi.org/10.6092/issn.1973-2201/5821">https://doi.org/10.6092/issn.1973-2201/5821</ext-link></mixed-citation>
  </ref>
  <ref id="ref-fastLinkmanual">
    <mixed-citation>Ted Enamorado, K. I., Ben Fifield. (2023).
    <italic>fastLink: Fast probabilistic record linkage with missing
    data</italic> [R package version 0.6.1].
    <ext-link ext-link-type="uri" xlink:href="https://CRAN.R-project.org/package=fastLink">https://CRAN.R-project.org/package=fastLink</ext-link></mixed-citation>
  </ref>
  <ref id="ref-Tepping1968">
    <mixed-citation>Tepping, B. J. (1968). A model for optimum linkage
    of records. <italic>Journal of the American Statistical
    Association</italic>, <italic>63</italic>,
    1321–1332.</mixed-citation>
  </ref>
  <ref id="ref-reclin2manual">
    <mixed-citation><named-content content-type="nocase">van der Laan,
    J.</named-content> (2025). <italic>reclin2: Record linkage
    toolkit</italic> [R package version 0.6.0].
    <ext-link ext-link-type="uri" xlink:href="https://github.com/djvanderlaan/reclin2">https://github.com/djvanderlaan/reclin2</ext-link></mixed-citation>
  </ref>
  <ref id="ref-CoxLinkedData_2024">
    <mixed-citation>Vo, T. H., Garès, V., Zhang, L.-C., Happe, A., Oger,
    E., Paquelet, S., &amp; Chauvet, G. (2024). Cox regression with
    linked data. <italic>Statistics in Medicine</italic>,
    <italic>43</italic>(2), 296–314.
    https://doi.org/<ext-link ext-link-type="uri" xlink:href="https://doi.org/10.1002/sim.9960">https://doi.org/10.1002/sim.9960</ext-link></mixed-citation>
  </ref>
  <ref id="ref-Wang_Slawski_linked_2022">
    <mixed-citation>Wang, Z., Ben-David, E., Diao, G., &amp; Slawski, M.
    (2022). Regression with linked datasets subject to linkage error.
    <italic>WIREs Computational Statistics</italic>,
    <italic>14</italic>(4), e1570.
    https://doi.org/<ext-link ext-link-type="uri" xlink:href="https://doi.org/10.1002/wics.1570">https://doi.org/10.1002/wics.1570</ext-link></mixed-citation>
  </ref>
  <ref id="ref-arf_2023">
    <mixed-citation>Watson, D. S., Blesch, K., Kapar, J., &amp; Wright,
    M. N. (2023). <italic>Adversarial random forests for density
    estimation and generative modeling</italic>.
    https://arxiv.org/abs/2205.09435.
    <ext-link ext-link-type="uri" xlink:href="https://CRAN.R-project.org/package=arf">https://CRAN.R-project.org/package=arf</ext-link></mixed-citation>
  </ref>
  <ref id="ref-opensafely2020">
    <mixed-citation>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.
    <italic>MedRxiv</italic>, 430–436.</mixed-citation>
  </ref>
</ref-list>
</back>
<sub-article id="pr-r1-letter" article-type="editor-report">
<front-stub>
<article-id pub-id-type="doi">10.68365/jrepstat.2026.11.r1.letter</article-id>
<title-group>
<article-title>Decision letter, round 1</article-title>
</title-group>
<contrib-group>
<contrib contrib-type="author">
<contrib-id contrib-id-type="orcid">https://orcid.org/0000-0002-8638-5276</contrib-id>
<string-name>Matthias Templ</string-name>
<role specific-use="editor">Editor</role>
</contrib>
</contrib-group>
<pub-history>
<event event-type="editor-decision-sent">
<event-desc>Editor decision sent</event-desc>
<date iso-8601-date="2026-10-23"><day>23</day><month>10</month><year>2026</year></date>
</event>
</pub-history>
<related-object document-id="10.68365/jrepstat.2026.11" document-id-type="doi" document-type="peer-reviewed-article"/>
<custom-meta-group>
<custom-meta><meta-name>peer-review-stage</meta-name><meta-value>pre-publication</meta-value></custom-meta>
<custom-meta><meta-name>peer-review-revision-round</meta-name><meta-value>0</meta-value></custom-meta>
<custom-meta><meta-name>peer-review-recommendation</meta-name><meta-value>major-revision</meta-value></custom-meta>
</custom-meta-group>
</front-stub>
<body>
<p><bold>Major revision.</bold> Confirmed and signed by Matthias Templ on 2026-10-23.</p>
<p>Thank you for your submission to JRepStat. We are inviting a major revision. The reviewers’ points follow, grouped by weight.</p>
<p>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.</p>
<p>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.</p>
<p><sc>required</sc> (the decision rests on these):</p>
<list list-type="bullet">
  <list-item>
    <p>[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.</p>
  </list-item>
  <list-item>
    <p>[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.</p>
  </list-item>
  <list-item>
    <p>[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.</p>
  </list-item>
  <list-item>
    <p>[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.</p>
  </list-item>
  <list-item>
    <p>[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.</p>
  </list-item>
  <list-item>
    <p>[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 &gt; 1. If it does not, qualify the reproducibility claim and state the thread count used for the reported tables.</p>
  </list-item>
  <list-item>
    <p>[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.</p>
  </list-item>
</list>
<p><sc>recommended</sc>:</p>
<list list-type="bullet">
  <list-item>
    <p>[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.</p>
  </list-item>
  <list-item>
    <p>[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.</p>
  </list-item>
  <list-item>
    <p>[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.</p>
  </list-item>
  <list-item>
    <p>[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.</p>
  </list-item>
  <list-item>
    <p>[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.</p>
  </list-item>
  <list-item>
    <p>[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.</p>
  </list-item>
  <list-item>
    <p>[software-quality] The DESCRIPTION declares BRL, arf, diyar, fastLink, fedmatch, mice, multilink, reclin2 and synthpop as hard <monospace>Imports</monospace>. These are needed only by the optional <monospace>link_with_&lt;pkg&gt;()</monospace> 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 <monospace>Suggests</monospace> with <monospace>requireNamespace()</monospace> guards at the call sites would lighten the install and match how wrappers are used.</p>
  </list-item>
  <list-item>
    <p>[software-quality] The log-likelihood sanity check in <monospace>simulateD()</monospace> compares <monospace>round(Dsample$loglik, 3) != round(ll_check, 3)</monospace> and calls <monospace>stop()</monospace> 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 <monospace>isTRUE(all.equal(..., tolerance = 1e-6))</monospace>) would be more robust.</p>
  </list-item>
  <list-item>
    <p>[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.</p>
  </list-item>
  <list-item>
    <p>[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.</p>
  </list-item>
  <list-item>
    <p>[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.</p>
  </list-item>
  <list-item>
    <p>[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.</p>
  </list-item>
  <list-item>
    <p>[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.</p>
  </list-item>
  <list-item>
    <p>[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.</p>
  </list-item>
  <list-item>
    <p>[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.</p>
  </list-item>
  <list-item>
    <p>[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.</p>
  </list-item>
  <list-item>
    <p>[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.</p>
  </list-item>
  <list-item>
    <p>[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.</p>
  </list-item>
  <list-item>
    <p>[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.</p>
  </list-item>
</list>
<p><sc>optional</sc>:</p>
<list list-type="bullet">
  <list-item>
    <p>[software-quality] The <monospace>.onAttach</monospace> startup message (“please cite us … feel free to complain as well”) and the <monospace>music_on</monospace> 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.</p>
  </list-item>
  <list-item>
    <p>[Reviewer 2] A broader simulation varying overlap, PIV discriminative power and error rates would map out when each FDP estimator is reliable.</p>
  </list-item>
</list>
<p>We will correct these in production, and you confirm them in the proof:</p>
<list list-type="bullet">
  <list-item>
    <p>[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.</p>
  </list-item>
</list>
</body>
</sub-article>
<sub-article id="pr-r1-report1" article-type="reviewer-report">
<front-stub>
<article-id pub-id-type="doi">10.68365/jrepstat.2026.11.r1.report1</article-id>
<title-group>
<article-title>Report Reviewer 1, round 1</article-title>
</title-group>
<contrib-group>
<contrib contrib-type="author">
<collab>JRepStat review engine</collab>
<role specific-use="reviewer" content-type="reviewer-1">Reviewer 1</role>
</contrib>
</contrib-group>
<pub-history>
<event event-type="reviewer-report-received">
<event-desc>Reviewer report received</event-desc>
<date iso-8601-date="2026-10-22"><day>22</day><month>10</month><year>2026</year></date>
</event>
</pub-history>
<related-object document-id="10.68365/jrepstat.2026.11" document-id-type="doi" document-type="peer-reviewed-article"/>
<custom-meta-group>
<custom-meta><meta-name>peer-review-stage</meta-name><meta-value>pre-publication</meta-value></custom-meta>
<custom-meta><meta-name>peer-review-revision-round</meta-name><meta-value>0</meta-value></custom-meta>
<custom-meta><meta-name>peer-review-recommendation</meta-name><meta-value>minor-revision</meta-value></custom-meta>
</custom-meta-group>
</front-stub>
<body>
<p><italic>Written by the journal&#x27;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 <ext-link ext-link-type="uri" xlink:href="https://jrepstat.fairpressjournals.com/about/peer-review/">peer review page</ext-link>.</italic></p>
<p>Recommendation: minor.</p>
<p>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.</p>
<p>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.</p>
<p>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.</p>
<p>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.</p>
<p>Numbered suggestions to the authors:</p>
<list list-type="order">
  <list-item>
    <p><sc>required</sc> 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.</p>
  </list-item>
  <list-item>
    <p>[editor_fix] Complete the reference “Robach et al. 2026. Causal Record Linkage. h.”.</p>
  </list-item>
  <list-item>
    <p><sc>recommended</sc> 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).</p>
  </list-item>
  <list-item>
    <p><sc>recommended</sc> 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.</p>
  </list-item>
  <list-item>
    <p><sc>recommended</sc> 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.</p>
  </list-item>
  <list-item>
    <p><sc>recommended</sc> 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.</p>
  </list-item>
</list>
</body>
</sub-article>
<sub-article id="pr-r1-report2" article-type="reviewer-report">
<front-stub>
<article-id pub-id-type="doi">10.68365/jrepstat.2026.11.r1.report2</article-id>
<title-group>
<article-title>Report Reviewer 2, round 1</article-title>
</title-group>
<contrib-group>
<contrib contrib-type="author">
<collab>JRepStat review engine</collab>
<role specific-use="reviewer" content-type="reviewer-2">Reviewer 2</role>
</contrib>
</contrib-group>
<pub-history>
<event event-type="reviewer-report-received">
<event-desc>Reviewer report received</event-desc>
<date iso-8601-date="2026-10-22"><day>22</day><month>10</month><year>2026</year></date>
</event>
</pub-history>
<related-object document-id="10.68365/jrepstat.2026.11" document-id-type="doi" document-type="peer-reviewed-article"/>
<custom-meta-group>
<custom-meta><meta-name>peer-review-stage</meta-name><meta-value>pre-publication</meta-value></custom-meta>
<custom-meta><meta-name>peer-review-revision-round</meta-name><meta-value>0</meta-value></custom-meta>
<custom-meta><meta-name>peer-review-recommendation</meta-name><meta-value>minor-revision</meta-value></custom-meta>
</custom-meta-group>
</front-stub>
<body>
<p><italic>Written by the journal&#x27;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 <ext-link ext-link-type="uri" xlink:href="https://jrepstat.fairpressjournals.com/about/peer-review/">peer review page</ext-link>.</italic></p>
<p>Recommendation: minor.</p>
<p>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.</p>
<p>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.</p>
<p>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.</p>
<p>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.</p>
<p>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.</p>
<p>Numbered suggestions to the authors:</p>
<list list-type="order">
  <list-item>
    <p><sc>required</sc> 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.</p>
  </list-item>
  <list-item>
    <p>[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).</p>
  </list-item>
  <list-item>
    <p><sc>recommended</sc> 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.</p>
  </list-item>
  <list-item>
    <p><sc>recommended</sc> 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.</p>
  </list-item>
  <list-item>
    <p><sc>recommended</sc> 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.</p>
  </list-item>
  <list-item>
    <p><sc>recommended</sc> 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.</p>
  </list-item>
  <list-item>
    <p><sc>optional</sc> A broader simulation varying overlap, PIV discriminative power and error rates would characterise when each FDP estimator is reliable.</p>
  </list-item>
</list>
</body>
</sub-article>
<sub-article id="pr-r1-report3" article-type="reviewer-report">
<front-stub>
<article-id pub-id-type="doi">10.68365/jrepstat.2026.11.r1.report3</article-id>
<title-group>
<article-title>Report Reviewer 3, round 1</article-title>
</title-group>
<contrib-group>
<contrib contrib-type="author">
<collab>JRepStat review engine</collab>
<role specific-use="reviewer" content-type="reviewer-3">Reviewer 3</role>
</contrib>
</contrib-group>
<pub-history>
<event event-type="reviewer-report-received">
<event-desc>Reviewer report received</event-desc>
<date iso-8601-date="2026-10-22"><day>22</day><month>10</month><year>2026</year></date>
</event>
</pub-history>
<related-object document-id="10.68365/jrepstat.2026.11" document-id-type="doi" document-type="peer-reviewed-article"/>
<custom-meta-group>
<custom-meta><meta-name>peer-review-stage</meta-name><meta-value>pre-publication</meta-value></custom-meta>
<custom-meta><meta-name>peer-review-revision-round</meta-name><meta-value>0</meta-value></custom-meta>
<custom-meta><meta-name>peer-review-recommendation</meta-name><meta-value>minor-revision</meta-value></custom-meta>
</custom-meta-group>
</front-stub>
<body>
<p><italic>Written by the journal&#x27;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 <ext-link ext-link-type="uri" xlink:href="https://jrepstat.fairpressjournals.com/about/peer-review/">peer review page</ext-link>.</italic></p>
<p>Recommendation: minor.</p>
<p>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.</p>
<p>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 &gt; 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.</p>
<p>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.</p>
<p>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.</p>
<p>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.</p>
<p>Numbered suggestions to the authors:</p>
<list list-type="order">
  <list-item>
    <p><sc>required</sc> State how random draws are generated inside the OpenMP-parallelised Rcpp samplers and whether set.seed() reproduces a run bit-for-bit with threads &gt; 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.</p>
  </list-item>
  <list-item>
    <p><sc>required</sc> 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.</p>
  </list-item>
  <list-item>
    <p>[editor_fix] Repair the truncated reference “Robach et al. 2026. Causal Record Linkage. h.” with its full citation and URL.</p>
  </list-item>
  <list-item>
    <p><sc>recommended</sc> 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.</p>
  </list-item>
</list>
</body>
</sub-article>
<sub-article id="pr-r1-response" article-type="author-comment">
<front-stub>
<article-id pub-id-type="doi">10.68365/jrepstat.2026.11.r1.response</article-id>
<title-group>
<article-title>Authors&#x27; response, round 1</article-title>
</title-group>
<contrib-group>
<contrib contrib-type="author">
<string-name>Kayané Robach</string-name>
<role specific-use="author">Author</role>
</contrib>
<contrib contrib-type="author">
<string-name>Mark A. van de Wiel</string-name>
<role specific-use="author">Author</role>
</contrib>
<contrib contrib-type="author">
<string-name>Michel H. Hof</string-name>
<role specific-use="author">Author</role>
</contrib>
</contrib-group>
<pub-history>
<event event-type="author-comment-received">
<event-desc>Author comment received</event-desc>
<date iso-8601-date="2026-10-26"><day>26</day><month>10</month><year>2026</year></date>
</event>
</pub-history>
<related-object document-id="10.68365/jrepstat.2026.11.r1.letter" document-id-type="doi" document-type="editor-report"/>
<related-object document-id="10.68365/jrepstat.2026.11.r1.report1" document-id-type="doi" document-type="reviewer-report"/>
<related-object document-id="10.68365/jrepstat.2026.11.r1.report2" document-id-type="doi" document-type="reviewer-report"/>
<related-object document-id="10.68365/jrepstat.2026.11.r1.report3" document-id-type="doi" document-type="reviewer-report"/>
<custom-meta-group>
<custom-meta><meta-name>peer-review-stage</meta-name><meta-value>pre-publication</meta-value></custom-meta>
<custom-meta><meta-name>peer-review-revision-round</meta-name><meta-value>0</meta-value></custom-meta>
</custom-meta-group>
</front-stub>
<body>
<p>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&#x27;s reports say what remains open.</p>
<p>To the editors and reviewers:</p>
<p>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.</p>
<p>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.</p>
<p>We hope that we have answered your concerns adequately and have improved the quality of the manuscript.</p>
<list list-type="simple">
<list-item>
<p><sc>required</sc> 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.</p>
<p><bold>Done.</bold> 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.</p>
</list-item>
<list-item>
<p><sc>required</sc> 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.</p>
<p><bold>Done.</bold> 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).</p>
</list-item>
<list-item>
<p><sc>required</sc> 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.</p>
<p><bold>Done.</bold> 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.</p>
</list-item>
<list-item>
<p><sc>required</sc> 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.</p>
<p><bold>Done.</bold> We added such competing interests statement at the end.</p>
</list-item>
<list-item>
<p><sc>required</sc> 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.</p>
<p><bold>Done.</bold> 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.</p>
</list-item>
<list-item>
<p><sc>required</sc> Document how random draws are produced inside the OpenMP-parallelised Rcpp samplers and whether set.seed() reproduces a run bit-for-bit when threads &gt; 1. If it does not, qualify the reproducibility claim and state the thread count used for the reported tables.</p>
<p><bold>Done.</bold> 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.</p>
</list-item>
<list-item>
<p><sc>required</sc> 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.</p>
<p><bold>Done.</bold> 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.</p>
</list-item>
<list-item>
<p><sc>recommended</sc> The simulation DGP is the package&#x27;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 &quot;modelling PIVs dynamics improves record linkage&quot; 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&#x27;s own DGP and that the dynamics benefit is quantified on real linkage only.</p>
<p><bold>Done.</bold> 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.</p>
</list-item>
<list-item>
<p><sc>recommended</sc> 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.</p>
<p><bold>Declined.</bold> 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).</p>
</list-item>
<list-item>
<p><sc>recommended</sc> The threshold ξ=0.82 is chosen in Section 4.4 from the divergence &quot;elbow&quot;, 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.</p>
<p><bold>Done.</bold> 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.</p>
</list-item>
<list-item>
<p><sc>recommended</sc> 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.</p>
<p><bold>Done.</bold> 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.</p>
</list-item>
<list-item>
<p><sc>recommended</sc> The Discussion describes FlexRL as a &quot;reliable solution to record linkage&quot;. 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.</p>
<p><bold>Done.</bold> 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.</p>
</list-item>
<list-item>
<p><sc>recommended</sc> The second stated contribution is a method-agnostic toolkit of linked-data quality diagnostics. Edwards et al. 2026 (&quot;Assessing Linkage Quality: Metrics, Insights, and a Reusable Python Toolkit&quot;, 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.</p>
<p><bold>Declined.</bold> The details of the article &quot;Assessing Linkage Quality: Metrics, Insights, and a Reusable Python Toolkit&quot; (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.</p>
</list-item>
<list-item>
<p><sc>recommended</sc> 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_&lt;pkg&gt;()` 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.</p>
<p><bold>Done.</bold> We modified the package accordingly to lighten its installation.</p>
</list-item>
<list-item>
<p><sc>recommended</sc> 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.</p>
<p><bold>Done.</bold> We modified the package accordingly for a more robust log likelihood sanity check.</p>
</list-item>
<list-item>
<p><sc>recommended</sc> 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.</p>
<p><bold>Done.</bold> 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.</p>
</list-item>
<list-item>
<p><sc>recommended</sc> Figure 5 distinguishes four regression fits by colour alone: the text names &quot;estimate in dashed orange&quot;, &quot;estimate in yellow&quot; and &quot;truth represented in red&quot;. 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.</p>
<p><bold>Done.</bold> We modified Figure 5 so it is interpretable without relying on colours.</p>
</list-item>
<list-item>
<p><sc>recommended</sc> One sentence in Section 3.5 reads &quot;so the sweep is linear the number of candidate pairs&quot;, which is missing a word (&quot;linear in the number&quot;). The table column heading &quot;FlexRL (no dynamic)&quot; in Tables 2 and 4 would read better as &quot;(no dynamics)&quot; to match the &quot;dynamics&quot; wording used elsewhere.</p>
<p><bold>Done.</bold> We modified the article accordingly.</p>
</list-item>
<list-item>
<p><sc>recommended</sc> 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.</p>
<p><bold>Done.</bold> We elaborated on the SHIW provenance and access terms in the last paragraph of the “Introduction”.</p>
</list-item>
<list-item>
<p><sc>recommended</sc> Qualify the word &quot;reliable&quot; 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.</p>
<p><bold>Done.</bold> 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.</p>
</list-item>
<list-item>
<p><sc>recommended</sc> 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.</p>
<p><bold>Done.</bold> We reported the regression specifics in the “Diagnostics” section.</p>
</list-item>
<list-item>
<p><sc>recommended</sc> State how the PIV independence violation (Occupation and Sex associated, Cramér&#x27;s V 0.32 and 0.35) may affect calibration of the FDP estimators, beyond issuing a warning.</p>
<p><bold>Done.</bold> 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.</p>
</list-item>
<list-item>
<p><sc>recommended</sc> 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.</p>
<p><bold>Done.</bold> At the end of the section “False discovery proportion” we now provide guidance on which FDP estimator to rely on depending on the setting.</p>
</list-item>
<list-item>
<p><sc>recommended</sc> 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.</p>
<p><bold>Done.</bold> 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.</p>
</list-item>
<list-item>
<p><sc>recommended</sc> Note that the linked-sample divergence measures are heuristic indicators of sampling bias, not estimates of the bias in β, and that the &quot;elbow&quot; threshold choice carries no formal guarantee.</p>
<p><bold>Done.</bold> 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.</p>
</list-item>
<list-item>
<p><sc>recommended</sc> Provide a single master script that maps each table and figure to the command that regenerates it, with a captured session-info / environment record.</p>
<p><bold>Done.</bold> 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.</p>
</list-item>
<list-item>
<p><sc>optional</sc> The `.onAttach` startup message (&quot;please cite us ... feel free to complain as well&quot;) 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.</p>
<p><bold>Declined.</bold> 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.</p>
</list-item>
<list-item>
<p><sc>optional</sc> A broader simulation varying overlap, PIV discriminative power and error rates would map out when each FDP estimator is reliable.</p>
<p><bold>Declined.</bold> 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.</p>
</list-item>
</list>
</body>
</sub-article>
<sub-article id="pr-r2-letter" article-type="editor-report">
<front-stub>
<article-id pub-id-type="doi">10.68365/jrepstat.2026.11.r2.letter</article-id>
<title-group>
<article-title>Decision letter, round 2</article-title>
</title-group>
<contrib-group>
<contrib contrib-type="author">
<contrib-id contrib-id-type="orcid">https://orcid.org/0000-0002-8638-5276</contrib-id>
<string-name>Matthias Templ</string-name>
<role specific-use="editor">Editor</role>
</contrib>
</contrib-group>
<pub-history>
<event event-type="editor-decision-sent">
<event-desc>Editor decision sent</event-desc>
<date iso-8601-date="2026-10-26"><day>26</day><month>10</month><year>2026</year></date>
</event>
</pub-history>
<related-object document-id="10.68365/jrepstat.2026.11" document-id-type="doi" document-type="peer-reviewed-article"/>
<custom-meta-group>
<custom-meta><meta-name>peer-review-stage</meta-name><meta-value>pre-publication</meta-value></custom-meta>
<custom-meta><meta-name>peer-review-revision-round</meta-name><meta-value>1</meta-value></custom-meta>
<custom-meta><meta-name>peer-review-recommendation</meta-name><meta-value>minor-revision</meta-value></custom-meta>
</custom-meta-group>
</front-stub>
<body>
<p><bold>Minor revision.</bold> Confirmed and signed by Matthias Templ on 2026-10-26.</p>
<p>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.</p>
<p>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.</p>
<p>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.</p>
<p>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.</p>
<p><sc>recommended</sc>:</p>
<list list-type="bullet">
  <list-item>
    <p>[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.</p>
  </list-item>
  <list-item>
    <p>[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.</p>
  </list-item>
  <list-item>
    <p>[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.</p>
  </list-item>
  <list-item>
    <p>[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.</p>
  </list-item>
  <list-item>
    <p>[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.</p>
  </list-item>
  <list-item>
    <p>[software-quality] <monospace>cran-comments.md</monospace> states “an update from version 1.0.0 to 1.0.1” while <monospace>DESCRIPTION</monospace> is <monospace>Version: 2.0.0</monospace>, 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.</p>
  </list-item>
  <list-item>
    <p>[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.</p>
  </list-item>
</list>
<p><sc>optional</sc>:</p>
<list list-type="bullet">
  <list-item>
    <p>[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.</p>
  </list-item>
</list>
<p>We will correct these in production, and you confirm them in the proof:</p>
<list list-type="bullet">
  <list-item>
    <p>[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.</p>
  </list-item>
</list>
</body>
</sub-article>
<sub-article id="pr-r2-report1" article-type="reviewer-report">
<front-stub>
<article-id pub-id-type="doi">10.68365/jrepstat.2026.11.r2.report1</article-id>
<title-group>
<article-title>Report Reviewer 1, round 2</article-title>
</title-group>
<contrib-group>
<contrib contrib-type="author">
<collab>JRepStat review engine</collab>
<role specific-use="reviewer" content-type="reviewer-1">Reviewer 1</role>
</contrib>
</contrib-group>
<pub-history>
<event event-type="reviewer-report-received">
<event-desc>Reviewer report received</event-desc>
<date iso-8601-date="2026-10-26"><day>26</day><month>10</month><year>2026</year></date>
</event>
</pub-history>
<related-object document-id="10.68365/jrepstat.2026.11" document-id-type="doi" document-type="peer-reviewed-article"/>
<custom-meta-group>
<custom-meta><meta-name>peer-review-stage</meta-name><meta-value>pre-publication</meta-value></custom-meta>
<custom-meta><meta-name>peer-review-revision-round</meta-name><meta-value>1</meta-value></custom-meta>
<custom-meta><meta-name>peer-review-recommendation</meta-name><meta-value>accept</meta-value></custom-meta>
</custom-meta-group>
</front-stub>
<body>
<p><italic>Written by the journal&#x27;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 <ext-link ext-link-type="uri" xlink:href="https://jrepstat.fairpressjournals.com/about/peer-review/">peer review page</ext-link>.</italic></p>
<p>Recommendation: accept.</p>
<p>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.</p>
<p>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.</p>
<p>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.</p>
<p>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.</p>
<p>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.</p>
<p>Numbered suggestions to the authors:</p>
<list list-type="order">
  <list-item>
    <p>[editor_fix] Complete the bibliography entry “Robach et al. 2026. Causal Record Linkage. h.” with its venue or repository details.</p>
  </list-item>
</list>
</body>
</sub-article>
<sub-article id="pr-r2-report2" article-type="reviewer-report">
<front-stub>
<article-id pub-id-type="doi">10.68365/jrepstat.2026.11.r2.report2</article-id>
<title-group>
<article-title>Report Reviewer 2, round 2</article-title>
</title-group>
<contrib-group>
<contrib contrib-type="author">
<collab>JRepStat review engine</collab>
<role specific-use="reviewer" content-type="reviewer-2">Reviewer 2</role>
</contrib>
</contrib-group>
<pub-history>
<event event-type="reviewer-report-received">
<event-desc>Reviewer report received</event-desc>
<date iso-8601-date="2026-10-26"><day>26</day><month>10</month><year>2026</year></date>
</event>
</pub-history>
<related-object document-id="10.68365/jrepstat.2026.11" document-id-type="doi" document-type="peer-reviewed-article"/>
<custom-meta-group>
<custom-meta><meta-name>peer-review-stage</meta-name><meta-value>pre-publication</meta-value></custom-meta>
<custom-meta><meta-name>peer-review-revision-round</meta-name><meta-value>1</meta-value></custom-meta>
<custom-meta><meta-name>peer-review-recommendation</meta-name><meta-value>accept</meta-value></custom-meta>
</custom-meta-group>
</front-stub>
<body>
<p><italic>Written by the journal&#x27;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 <ext-link ext-link-type="uri" xlink:href="https://jrepstat.fairpressjournals.com/about/peer-review/">peer review page</ext-link>.</italic></p>
<p>Recommendation: accept.</p>
<p>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.</p>
<p>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.</p>
<p>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.</p>
<p>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.</p>
<p>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.</p>
<p>Numbered suggestions to the authors:</p>
<list list-type="order">
  <list-item>
    <p>[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).</p>
  </list-item>
  <list-item>
    <p><sc>recommended</sc> 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.</p>
  </list-item>
</list>
</body>
</sub-article>
<sub-article id="pr-r2-report3" article-type="reviewer-report">
<front-stub>
<article-id pub-id-type="doi">10.68365/jrepstat.2026.11.r2.report3</article-id>
<title-group>
<article-title>Report Reviewer 3, round 2</article-title>
</title-group>
<contrib-group>
<contrib contrib-type="author">
<collab>JRepStat review engine</collab>
<role specific-use="reviewer" content-type="reviewer-3">Reviewer 3</role>
</contrib>
</contrib-group>
<pub-history>
<event event-type="reviewer-report-received">
<event-desc>Reviewer report received</event-desc>
<date iso-8601-date="2026-10-26"><day>26</day><month>10</month><year>2026</year></date>
</event>
</pub-history>
<related-object document-id="10.68365/jrepstat.2026.11" document-id-type="doi" document-type="peer-reviewed-article"/>
<custom-meta-group>
<custom-meta><meta-name>peer-review-stage</meta-name><meta-value>pre-publication</meta-value></custom-meta>
<custom-meta><meta-name>peer-review-revision-round</meta-name><meta-value>1</meta-value></custom-meta>
<custom-meta><meta-name>peer-review-recommendation</meta-name><meta-value>accept</meta-value></custom-meta>
</custom-meta-group>
</front-stub>
<body>
<p><italic>Written by the journal&#x27;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 <ext-link ext-link-type="uri" xlink:href="https://jrepstat.fairpressjournals.com/about/peer-review/">peer review page</ext-link>.</italic></p>
<p>Recommendation: accept.</p>
<p>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.</p>
<p>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.</p>
<p>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.</p>
<p>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.</p>
<p>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.</p>
<p>Numbered suggestions to the authors:</p>
<list list-type="order">
  <list-item>
    <p>[editor_fix] Repair the reference “Robach et al. 2026. Causal Record Linkage. h.” with its complete citation and URL.</p>
  </list-item>
</list>
</body>
</sub-article>
<sub-article id="pr-r2-response" article-type="author-comment">
<front-stub>
<article-id pub-id-type="doi">10.68365/jrepstat.2026.11.r2.response</article-id>
<title-group>
<article-title>Authors&#x27; response, round 2</article-title>
</title-group>
<contrib-group>
<contrib contrib-type="author">
<string-name>Kayané Robach</string-name>
<role specific-use="author">Author</role>
</contrib>
<contrib contrib-type="author">
<string-name>Mark A. van de Wiel</string-name>
<role specific-use="author">Author</role>
</contrib>
<contrib contrib-type="author">
<string-name>Michel H. Hof</string-name>
<role specific-use="author">Author</role>
</contrib>
</contrib-group>
<pub-history>
<event event-type="author-comment-received">
<event-desc>Author comment received</event-desc>
<date iso-8601-date="2026-10-26"><day>26</day><month>10</month><year>2026</year></date>
</event>
</pub-history>
<related-object document-id="10.68365/jrepstat.2026.11.r2.letter" document-id-type="doi" document-type="editor-report"/>
<related-object document-id="10.68365/jrepstat.2026.11.r2.report1" document-id-type="doi" document-type="reviewer-report"/>
<related-object document-id="10.68365/jrepstat.2026.11.r2.report2" document-id-type="doi" document-type="reviewer-report"/>
<related-object document-id="10.68365/jrepstat.2026.11.r2.report3" document-id-type="doi" document-type="reviewer-report"/>
<custom-meta-group>
<custom-meta><meta-name>peer-review-stage</meta-name><meta-value>pre-publication</meta-value></custom-meta>
<custom-meta><meta-name>peer-review-revision-round</meta-name><meta-value>1</meta-value></custom-meta>
</custom-meta-group>
</front-stub>
<body>
<p>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&#x27;s reports say what remains open.</p>
<p>We made minor edits to the text to clarify these points.</p>
<list list-type="simple">
<list-item>
<p><sc>recommended</sc> The nearest uncited close work is Edwards et al. 2026, &quot;Assessing Linkage Quality: Metrics, Insights, and a Reusable Python Toolkit&quot; (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.</p>
<p><bold>Declined.</bold> 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.</p>
</list-item>
<list-item>
<p><sc>recommended</sc> 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.</p>
<p><bold>Done.</bold> 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.</p>
</list-item>
<list-item>
<p><sc>recommended</sc> The text uses &quot;dotted orange&quot; 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.</p>
<p><bold>Done.</bold> 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.</p>
</list-item>
<list-item>
<p><sc>recommended</sc> 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.</p>
<p><bold>Done.</bold> 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.</p>
</list-item>
<list-item>
<p><sc>recommended</sc> 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&#x27;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&#x27;s wrapper computes from fastLink&#x27;s own scores next to the FDP fastLink&#x27;s native output would imply, would make clear the estimator is the published one and that the wrapper feeds it correctly.</p>
<p><bold>Done.</bold> 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.</p>
</list-item>
<list-item>
<p><sc>recommended</sc> `cran-comments.md` states &quot;an update from version 1.0.0 to 1.0.1&quot; while `DESCRIPTION` is `Version: 2.0.0`, and README &quot;News&quot; still says &quot;Version 1.0.0 of FlexRL is ready&quot; and &quot;will be soon available on JASP&quot; 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.</p>
<p><bold>Done.</bold> 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.</p>
</list-item>
<list-item>
<p><sc>recommended</sc> 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.</p>
<p><bold>Done.</bold> We softened the sentence to present both FDP estimators in a similar fashion. In the &quot;False discovery proportion&quot; section, we provide guidance on which estimator of the FDP to rely on depending on the setting.</p>
</list-item>
<list-item>
<p><sc>optional</sc> 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.</p>
<p><bold>Done.</bold> 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.</p>
</list-item>
</list>
</body>
</sub-article>
<sub-article id="pr-r3-letter" article-type="editor-report">
<front-stub>
<article-id pub-id-type="doi">10.68365/jrepstat.2026.11.r3.letter</article-id>
<title-group>
<article-title>Decision letter, round 3</article-title>
</title-group>
<contrib-group>
<contrib contrib-type="author">
<contrib-id contrib-id-type="orcid">https://orcid.org/0000-0002-8638-5276</contrib-id>
<string-name>Matthias Templ</string-name>
<role specific-use="editor">Editor</role>
</contrib>
</contrib-group>
<pub-history>
<event event-type="editor-decision-sent">
<event-desc>Editor decision sent</event-desc>
<date iso-8601-date="2026-10-28"><day>28</day><month>10</month><year>2026</year></date>
</event>
</pub-history>
<related-object document-id="10.68365/jrepstat.2026.11" document-id-type="doi" document-type="peer-reviewed-article"/>
<custom-meta-group>
<custom-meta><meta-name>peer-review-stage</meta-name><meta-value>pre-publication</meta-value></custom-meta>
<custom-meta><meta-name>peer-review-revision-round</meta-name><meta-value>2</meta-value></custom-meta>
<custom-meta><meta-name>peer-review-recommendation</meta-name><meta-value>accept</meta-value></custom-meta>
</custom-meta-group>
</front-stub>
<body>
<p><bold>Accepted.</bold> Signed by Matthias Templ on 2026-10-28.</p>
<p>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.</p>
<p>Congratulations, your manuscript has been accepted for publication in JRepStat. Production begins now.</p>
<p>Where it is not on file yet, we still need the following for production.</p>
<list list-type="bullet">
  <list-item>
    <p>a valid ORCID iD for every author</p>
  </list-item>
  <list-item>
    <p>a captured computational environment (dependencies/lockfile/container)</p>
  </list-item>
  <list-item>
    <p>a signed determinism attestation for the entry-point command</p>
  </list-item>
</list>
</body>
</sub-article>
<sub-article id="pr-r3-report1" article-type="reviewer-report">
<front-stub>
<article-id pub-id-type="doi">10.68365/jrepstat.2026.11.r3.report1</article-id>
<title-group>
<article-title>Report Reviewer 1, round 3</article-title>
</title-group>
<contrib-group>
<contrib contrib-type="author">
<collab>JRepStat review engine</collab>
<role specific-use="reviewer" content-type="reviewer-1">Reviewer 1</role>
</contrib>
</contrib-group>
<pub-history>
<event event-type="reviewer-report-received">
<event-desc>Reviewer report received</event-desc>
<date iso-8601-date="2026-10-26"><day>26</day><month>10</month><year>2026</year></date>
</event>
</pub-history>
<related-object document-id="10.68365/jrepstat.2026.11" document-id-type="doi" document-type="peer-reviewed-article"/>
<custom-meta-group>
<custom-meta><meta-name>peer-review-stage</meta-name><meta-value>pre-publication</meta-value></custom-meta>
<custom-meta><meta-name>peer-review-revision-round</meta-name><meta-value>2</meta-value></custom-meta>
<custom-meta><meta-name>peer-review-recommendation</meta-name><meta-value>accept</meta-value></custom-meta>
</custom-meta-group>
</front-stub>
<body>
<p><italic>Written by the journal&#x27;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 <ext-link ext-link-type="uri" xlink:href="https://jrepstat.fairpressjournals.com/about/peer-review/">peer review page</ext-link>.</italic></p>
<p>Recommendation: accept.</p>
<p>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.</p>
<p>Nothing else is open. My recommendation is unchanged.</p>
<p>Numbered suggestions to the authors:</p>
<list list-type="order">
  <list-item>
    <p>[editor_fix] Complete the bibliography entry “Robach et al. 2026. Causal Record Linkage. h.” with its venue or repository details.</p>
  </list-item>
</list>
</body>
</sub-article>
<sub-article id="pr-r3-report2" article-type="reviewer-report">
<front-stub>
<article-id pub-id-type="doi">10.68365/jrepstat.2026.11.r3.report2</article-id>
<title-group>
<article-title>Report Reviewer 2, round 3</article-title>
</title-group>
<contrib-group>
<contrib contrib-type="author">
<collab>JRepStat review engine</collab>
<role specific-use="reviewer" content-type="reviewer-2">Reviewer 2</role>
</contrib>
</contrib-group>
<pub-history>
<event event-type="reviewer-report-received">
<event-desc>Reviewer report received</event-desc>
<date iso-8601-date="2026-10-26"><day>26</day><month>10</month><year>2026</year></date>
</event>
</pub-history>
<related-object document-id="10.68365/jrepstat.2026.11" document-id-type="doi" document-type="peer-reviewed-article"/>
<custom-meta-group>
<custom-meta><meta-name>peer-review-stage</meta-name><meta-value>pre-publication</meta-value></custom-meta>
<custom-meta><meta-name>peer-review-revision-round</meta-name><meta-value>2</meta-value></custom-meta>
<custom-meta><meta-name>peer-review-recommendation</meta-name><meta-value>accept</meta-value></custom-meta>
</custom-meta-group>
</front-stub>
<body>
<p><italic>Written by the journal&#x27;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 <ext-link ext-link-type="uri" xlink:href="https://jrepstat.fairpressjournals.com/about/peer-review/">peer review page</ext-link>.</italic></p>
<p>Recommendation: accept.</p>
<p>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.</p>
<p>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.</p>
<p>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.</p>
<p>Numbered suggestions to the authors:</p>
<list list-type="order">
  <list-item>
    <p>[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).</p>
  </list-item>
  <list-item>
    <p><sc>recommended</sc> 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.</p>
  </list-item>
</list>
</body>
</sub-article>
<sub-article id="pr-r3-report3" article-type="reviewer-report">
<front-stub>
<article-id pub-id-type="doi">10.68365/jrepstat.2026.11.r3.report3</article-id>
<title-group>
<article-title>Report Reviewer 3, round 3</article-title>
</title-group>
<contrib-group>
<contrib contrib-type="author">
<collab>JRepStat review engine</collab>
<role specific-use="reviewer" content-type="reviewer-3">Reviewer 3</role>
</contrib>
</contrib-group>
<pub-history>
<event event-type="reviewer-report-received">
<event-desc>Reviewer report received</event-desc>
<date iso-8601-date="2026-10-26"><day>26</day><month>10</month><year>2026</year></date>
</event>
</pub-history>
<related-object document-id="10.68365/jrepstat.2026.11" document-id-type="doi" document-type="peer-reviewed-article"/>
<custom-meta-group>
<custom-meta><meta-name>peer-review-stage</meta-name><meta-value>pre-publication</meta-value></custom-meta>
<custom-meta><meta-name>peer-review-revision-round</meta-name><meta-value>2</meta-value></custom-meta>
<custom-meta><meta-name>peer-review-recommendation</meta-name><meta-value>accept</meta-value></custom-meta>
</custom-meta-group>
</front-stub>
<body>
<p><italic>Written by the journal&#x27;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 <ext-link ext-link-type="uri" xlink:href="https://jrepstat.fairpressjournals.com/about/peer-review/">peer review page</ext-link>.</italic></p>
<p>Recommendation: accept.</p>
<p>My prior report left a single open item, the truncated “Causal Record Linkage” reference, and that is the one point to settle here.</p>
<p>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.</p>
<p>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.</p>
<p>Numbered suggestions to the authors:</p>
<list list-type="order">
  <list-item>
    <p>[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.</p>
  </list-item>
</list>
</body>
</sub-article>
</article>
