Bug fixes and one API addition, all surfaced while preparing the JSS software paper. Three of these change reported values, so results produced with 0.1.0 are not directly comparable.
tcap() gains cont_bins (default 10),
matching dcap(). A continuous target is now discretised
into quantile bins before matching. Previously an exact match on a
continuous value essentially never occurred and every TCAP score
collapsed to zero.tcap() now reports all three TCAP variants in use in
the literature and gains a kind argument
("certain", the default; "matched";
"conditional") that selects which one
print()/summary() highlight – reported values
are unchanged. tcap_certain keeps riskutility’s strict
definition (the key uniquely determines the target in both the original
and the synthetic data). The new tcap_matched reproduces
synthpop’s TCAP as defined up to synthpop 1.9-2; the new
tcap_conditional implements the definition of Little,
Allmendinger & Elliot (2025, Journal of Official Statistics 41(1),
255-308), which synthpop adopts from version 1.9-3. The previous
documentation claim that tcap_certain equals synthpop’s
TCAP held only on data where every disclosive synthetic key class is
also unambiguous in the original data; the documentation now states the
exact mapping.propscore(): the synthetic-side kernel density was
indexed with length(ps) – a scalar – rather than
nrow(p), so the index ran backwards and every density
diagnostic reported by summary() (kl,
density_ratio, mean_ratio,
sd_ratio and their Bayes-space counterparts) was computed
on the wrong records.tstr(): R-squared is now clamped at 0, and the
TSTR/TRTR ratio is returned as NA with a warning when the
train-on-real model has no predictive power. Previously two negative
R-squared values could divide to a large positive ratio and be reported
as excellent utility.tail_fidelity(): the Jensen-Shannon divergence is now
computed in density space. It previously used Bayes-space (clr)
ordinates, which are sign-indefinite, and could return values far
outside [0, log 2].dcr() now warns when the training and holdout sets
differ in size. The dcr_share reference value of 0.5 and
the 0.55 rule used by privacy_pass assume equal sizes; with
an unequal split the expected share under no memorisation is
n_train / (n_train + n_holdout).devtools::test()
runs.print.tcap() no longer errors on a result with zero
matched records.compare_feature_importance(importance_type = "permutation")
no longer requires the vip package (archived from CRAN on 2026-07-08 and
therefore flagged by the CRAN incoming checks): permutation importance
is computed internally, and the documented caret-style metric names
("Accuracy", "Kappa", "ROC AUC",
"RMSE", "MAE", "MAPE",
"R-squared") as well as custom metric functions are handled
directly, with error metrics sign-flipped so that larger importance
always means a more influential feature. vip was removed from
Suggests.Initial release: a comprehensive framework for measuring disclosure
risk and data utility of anonymized and synthetic data. All measures
share a consistent S3 API (print(), summary(),
plot()) and feed a multivariate Risk-Utility (R-U) map.
dcap()
(reports both the raw mean CAP and the differential CAP = mean CAP minus
baseline), tcap(), weap(),
disco().rapid() (Risk of Attribute
Prediction-Induced Disclosure; random-forest default, also
lm/cart/gbm/logit)
with confint(), permutation test, threshold selection,
synthesizer cross-validation, and six plot types.dcr(),
nndr(), ims(), repu(), including
the DCR-Delusion caveat and null-distribution diagnostics.domias(),
nnaa(), mia_classifier().kanonymity(), ldiversity()
(distinct/entropy/recursive), tcloseness() (EMD),
suda(), individual_risk(),
population_uniqueness() (Pitman/Zayatz/SNB),
epsilon_identifiability(), delta_presence(),
hitting_rate(), singling_out(),
linkability(), attacker_risk()
(prosecutor/journalist/marketer), drisk().recordLinkage() with
deterministic, probabilistic (Fellegi-Sunter), PRAM, predictive,
random-forest, RBRL, robust-Mahalanobis, and embedding (autoencoder)
methods; independent, bijective (Hungarian / GDBRL), and
optimal-transport (Sinkhorn) matching; blocking and per-record
accessors. All eight methods share a single re-identification-risk
definition — the probability of identifying the true match
within the attacker’s candidate set. For the random-forest and embedding
methods, the nearest-neighbour similarity (their former
risk value) is now retained in an
nn_similarity diagnostic column. na_anon
(ignore/match/mismatch) is
honored consistently across all methods (PRAM no longer reports an
artificial zero risk for records with a missing key). New options:
compute_baseline = TRUE reports the no-perturbation
reference risk (with risk_reduction), and
expected_risk = TRUE reports a perturbation-aware expected
PRAM risk over the transition distribution. User-supplied
m_probs/u_probs are validated and clamped to
the open interval (0,1).disclosure_report()
produces a comprehensive multi-metric report.propscore(),
pMSE(), specks().gower(), mqs(),
ci_overlap(), ci_proximity().compare_wasserstein(),
compare_ks_test(), compare_chisq_gof(),
compare_pca(), compare_embedding(),
compare_correlation_matrices(), hellinger(),
energy_distance(), mmd(),
copula_fidelity(), tail_fidelity(),
contingency_fidelity().tstr() (train on synthetic,
test on real), compare_feature_importance(),
compare_model_performance(),
regression_fidelity(),
subgroup_utility().KLDiv(), JSDiv(),
CrossEntropy(), entropy and mutual-information helpers,
privacy_score().rumap(): normalized multivariate R-U evaluation with
Pareto-frontier identification, internal-consistency metrics, and seven
visualizations (scatter, heatmap, dot plot, parallel coordinates,
radial, PCA biplot, blockwise PCA).synth_pair() container plus
from_synthpop() and from_simPop() converters;
most measures dispatch on synth_pair objects as well as
plain data frames.