Calibrate the self-censoring sensitivity parameter from a design feature
Source:R/calibrate.R
calibrate_delta.RdMaps an observed statistic that is sensitive to self-censoring onto the
tilt profile and returns the value of the sensitivity parameter at which
the fitted model reproduces it. Three statistics are supported: the sensor gap (the
coefficient of \(R_t\) in sensor_gap_test; needs an
always-observed sensor), the probe contrast (the within-person difference
between the states reported at randomized forced-response probes and at
ordinary answered prompts; needs probes), and the post-skip contrast of the
silence_test (needs no extra channel but relies entirely on
the functional form). All three are parametric calibrations, not
identification results (Yu, 2026).
Usage
calibrate_delta(
profile,
data,
method = c("sensor", "probe", "postskip"),
sensor = "S",
probe = "Z",
id = "id",
time = "time",
day = NULL,
R = "R",
n_sim = 20L,
burden = c("none", "fit"),
kappa_grid = c(0, 0.5, 1, 1.5, 2.5),
seed = NULL,
level = 0.95,
boot = 0L,
boot_unit = c("person", "day"),
boot_grid = NULL
)Arguments
- profile
A
tilt_profile.- data
The data used for the profile.
- method
One of
"sensor","probe","postskip".- sensor, probe
Names of the sensor and probe columns.
- id, time, day, R
Column names as in
make_pairs.- n_sim
Number of simulated data sets per grid value (and per burden value) for
method = "postskip"; the Monte Carlo error of the model-implied curve is roughly the standard error of the post-skip coefficient divided bysqrt(n_sim).- burden
For
method = "postskip":"none"simulates from the fitted self-censoring model alone;"fit"adds a burden term calibrated to the observed response persistence (use when M3 is declared).- kappa_grid
Grid of burden values (probit drop in the response propensity after a skipped prompt) searched by
burden = "fit".- seed
Optional seed for the post-skip simulation and the bootstrap; the caller's random-number state is restored afterwards.
NULLuses (and advances) the current stream.- level
Confidence level for the interval obtained by inverting the observed statistic's confidence limits through the predicted curve (the uncertainty of the curve itself is ignored; Yu, 2026, reports the empirical coverage of this interval).
- boot
Number of cluster-bootstrap resamples for a percentile interval that refits the profile in every resample (0 = none).
- boot_unit
Resampling unit: persons, or days (for single-person data).
- boot_grid
Optional grid for the bootstrap profiles; by default seven points around the point estimate.
Value
An object of class "delta_calibration": a list with
method, delta_hat (the calibrated value; NA when
the model-implied curve does not cross the observed value on the grid),
interval (the level interval obtained by inverting the
confidence limits of the observed statistic; an endpoint outside the range
of the curve leaves that side open, -Inf or Inf),
n_crossings (when the curve crosses more than once the crossing
nearest zero is used), observed and se (the observed
statistic and its standard error), curve (a data frame of the
grid values and the model-implied statistics, with the calibrated burden
value kappa_hat per grid point when burden = "fit" and a
note column when a grid point could not be evaluated),
variable, level, burden,
persistence_observed, and, when boot > 0, boot
(the bootstrap replicates of delta_hat), boot_se and
boot_interval (percentile interval). Methods: print and
plot.
Details
The post-skip calibration compares the observed post-skip contrast with the
contrast implied by data simulated from the fitted tilt model at every grid
value. When burden (motif M3) is declared together with self-censoring, the
post-skip contrast also carries the collider contribution of
\(R_t \to R_{t+1} \leftarrow X_{t+1}\), which works against the
self-censoring signal; with burden = "fit" the simulated model
includes a burden term whose size is calibrated, at every grid value, so
that the simulated response persistence (the response rate after an
answered minus after a skipped prompt) matches the observed persistence.
Without a burden term the model-implied curve is the M2-only curve, which
understates \(|\delta|\) when burden is present.
Examples
sim <- simulate_ema(N = 40, n_prompts = 30, motifs = "M2", delta = -1, sensor_cor = 0.6,
p_probe = 0.05, seed = 3)
vars <- sim$vars
prof <- tilt_profile(sim$data, vars, delta_grid = c(-1.5, -1, -0.5, 0), probe = "Z")
cs <- calibrate_delta(prof, sim$data, method = "sensor")
cs
#> Calibration of delta (NegA) by the sensor method
#> observed statistic: -0.697 (SE 0.079)
#> calibrated delta: -1.306 95% interval: [-Inf, -0.897]
cs$curve
#> delta predicted
#> 1 -1.5 -0.7608423
#> 2 -1.0 -0.5964532
#> 3 -0.5 -0.3372259
#> 4 0.0 0.0000000
calibrate_delta(prof, sim$data, method = "probe")
#> Calibration of delta (NegA) by the probe method
#> observed statistic: 0.200 (SE 0.146)
#> calibrated delta: NA 95% interval: [-Inf, Inf]
#> (no crossing on the grid: the model-implied curve does not reach the observed value; widen delta_grid or report the profile band)
# the post-skip calibration simulates from every fitted model
calibrate_delta(prof, sim$data, method = "postskip", n_sim = 5, seed = 1)
#> Calibration of delta (NegA) by the postskip method
#> observed statistic: -0.457 (SE 0.106)
#> calibrated delta: NA 95% interval: [-0.609, Inf]
#> (no crossing on the grid: the model-implied curve does not reach the observed value; widen delta_grid or report the profile band)