Mechanism-level privacy argument
Source:vignettes/articles/privacy-argument.Rmd
privacy-argument.RmdStatus: implementation argument for review. It has not received independent differential-privacy, legal, information-security, or data-governance approval.
Claim and privacy unit
For production fits made with the validated OpenDP adapter, the
released fitted model is subject-level, add-or-remove
(epsilon, delta) differentially private. The privacy unit
is one person’s complete bounded longitudinal contribution: all rows,
visits, actual and nominal times, occasions, doses, infusions,
covariates, endpoint values, missingness, DVIDs, and censoring
states.
For neighboring datasets D and D' differing
by one complete subject and any set of possible model releases
S, the target guarantee is
Pr[M(D) in S] <= exp(epsilon) Pr[M(D') in S] + delta.
The implementation currently uses pure-DP Laplace releases, so
realized delta is zero. A positive requested delta is
accepted only with an explicit justification; it is unspent and does not
alter the mechanisms.
The noiseless backend = "public" path is excluded from
this claim. It requires public_source = TRUE, records
formal_dp = FALSE, and exists only so public fixtures and
demonstrations can test structure without pretending to provide
privacy.
Confidential-data access inventory
synpmx_empirical() is the only exported synthesis
function that accepts source data. Inside the fit, source data are
accessed for the following bounded representations:
| Internal component | Source access | Released form |
|---|---|---|
| subject count | number of unique subject IDs | OpenDP scalar Laplace release, sensitivity 1 |
| event/regimen | bounded dose/event counts, interval, amount, rate, infusion and duration features; optionally a declared public subject-property stratum | OpenDP vector Laplace release |
| endpoint timing | per-subject fixed-basis presence indicators | OpenDP vector Laplace release |
| trajectories | per-subject fixed-basis presence and bounded transformed cell means | OpenDP vector Laplace release |
| covariates | bounded first/second moments or indicators over public categories | OpenDP vector Laplace release |
| censoring | bounded endpoint-level state frequencies and boundaries | OpenDP vector Laplace release |
Input schema checks, role checks, identifier/date rejection, and structural validation also read the source inside the restricted fit. They must not be exposed as public diagnostics or logs. They either validate public assertions or stop the restricted process; they are not serialized into the fitted model.
synpmx_generate(),
validate_private_model(), privacy_report(),
and generated- data validation do not accept or consult source data.
compare_pmx() does read source data, but every
source-derived component is explicitly marked
restricted_not_releasable; it is outside the model’s DP
release unless a separate approved mechanism is added.
Public inputs and deterministic bounding
The proof treats these caller declarations as established independently of confidential values: column roles and exclusions; schema, classes, and category levels (including every subject-property domain); endpoint names, DVIDs, clocks, transforms, units, generic fixed-grid bases (or independently public user-supplied bases), and compartments; numeric bounds; contribution limits; approved protocol values; generator variability; requested output size; and budget fractions.
For each complete subject, fitting deterministically:
- retains at most
max_rowsrows; - retains at most
max_dosesdose starts; - retains at most
max_occasionsoccasions; - retains at most the declared observations per endpoint and occasion;
- uses at most
max_timing_cellspublic cells; and - clips time, amount, rate, numeric covariates, DV, and censoring limits to declared public domains before forming features.
The implementation does not release who was truncated or clipped.
Sensitivity and OpenDP mechanism
Each private summary group represents subject i as a
fixed vector q_i in [0, 1]^p, where
p is the group’s recorded number of dimensions. The vector
sum is
s(D) = sum_i q_i.
Adding or removing one bounded subject changes each coordinate by at
most one, so the add-or-remove L1 sensitivity is at most p.
The adapter constructs an OpenDP vector domain over finite
f64 atoms with the L1 metric and invokes
make_laplace(scale = p / epsilon_group). Scalar count uses
an f64 atom domain, absolute distance, sensitivity 1, and
scale 1 / epsilon_count.
The property-conditioned event release uses a tighter sparse bound.
For K declared public strata it releases 10K
coordinates: one count indicator and nine bounded event features per
stratum. One subject belongs to exactly one stratum, so only one
10-coordinate block can change and its L1 sensitivity is at most 10,
independent of K. The accounting entry records dimension
10K and sensitivity 10. Decoding a stratum
probability/regimen, sampling it, and reconstructing an
occasion-assigned dose from generated positive AMT are
post-processing.
Before invocation, the adapter asks OpenDP’s privacy map to verify
the requested d_in/d_out relation. It rejects
nonfinite inputs or output and fails closed when OpenDP is unavailable.
It never substitutes an R implementation of privacy noise. OpenDP
represents floating inputs exactly as rationals and uses discrete
internal sampling; the exact installed version/platform remains an
independent-review item.
The privacy-map check uses the exact group epsilon with no acceptance slack. If floating multiplication would make valid budget fractions sum microscopically above the requested epsilon, the implementation reduces the largest group by that overshoot before constructing any mechanism.
Noisy counts, means, proportions, variances, curve smoothing, interpolation, constraint repair, event-table construction, schema casting, validation, and all later generated datasets are post-processing.
Budget composition
The caller explicitly allocates fractions of requested epsilon to subject count, event/regimen, timing, covariates, endpoints, and censoring. Every active group must receive positive budget. Each group makes at most one vector release (or one scalar count release) at its recorded group epsilon. Basic sequential composition gives
epsilon_realized = sum_g epsilon_g <= epsilon_requested
delta_realized = sum_g 0 = 0 <= delta_requested.
The accounting table records query name, mechanism, epsilon, delta,
sensitivity, and dimension. Finalization stops if composition exceeds
the request. Every fit creates one release-ledger entry. Refitting the
same source is a new release whose budget must be composed with all
previous releases by organizational governance. Repeated
synpmx_generate() calls against one release consume no
additional budget.
Serialization audit boundary
The returned model contains only:
- declared public configuration and a manifest of its asserted status;
- decoded noisy population summaries;
- backend name/version and proof assumptions;
- composed accounting and a release-ledger entry; and
- warnings derived only from released values and public dimensions.
It must not contain source IDs, rows, subject vectors, exact
schedules, event skeletons, raw residuals, unnoised sums, confidential
levels or bounds, or source-dependent caches.
validate_private_model() checks prohibited payload names
and accounting, and tests serialize and inspect the model structure.
Factor-valued source ID levels and any public-design default for the ID
column are removed before release; generation creates a fresh
synthetic-only level set. Name-based checks are defense in depth, not a
substitute for independent code and binary serialization review.
Assumptions and unresolved review work
The formal claim depends on all of the following:
- every declared public input really was established independently of the confidential data;
- all source-dependent releases are present in the mechanism inventory and ledger;
- deterministic contribution bounds and sensitivity calculations are correct for complete-subject adjacency;
- the installed OpenDP implementation and privacy map are correct for the exact domains, metrics, scales, and platform;
- source-dependent errors, warnings, timing, memory, logs, and other side channels remain inside the restricted environment;
- serialization and downstream systems do not expose transient unnoised aggregates; and
- governance composes this fit with every other release from the source.
Before production claims, obtain independent DP-specialist review of this argument and code, test the canonical mechanisms with the deployed OpenDP version, audit runtime and serialization, and complete legal, privacy, information-security, and data-governance review. Empirical attacks may find bugs but cannot prove the guarantee.