Skip to contents

Maps 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 by sqrt(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. NULL uses (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)