Tools for diagnosing and correcting informative nonresponse in
ecological momentary assessment (EMA) and other experience-sampling designs. Declares the assumed nonresponse
mechanism as a dynamic missingness graph built from a taxonomy of seven
motifs, following the graphical missing-data framework of Mohan and Pearl
(2021)
Dynamic missingness graphs, recoverability checks, and sensitivity analysis for informative nonresponse in ecological momentary assessment (EMA) and other experience-sampling data.
Participants skip prompts, and the reasons are rarely unrelated to the states being measured. silentema lets an analyst
dm_graph()), built from a taxonomy of seven motifs (completely random, lagged-state dependence, self-censoring, burden, person propensity, context confounding, and reactivity);recoverability());silence_test()) or an always-observed sensor (sensor_gap_test()), and describe response persistence (fatigue_check());fit_pairs()), by inverse-probability weighting on an observed context (fit_ipw()), or by full-information maximum likelihood under missing at random (MAR) (fit_fiml());fit_tilt(), tilt_profile(), break_even());calibrate_delta()), and compare with worst-case bounds (bounds_support());missingness_declaration()).A simulator for the whole taxonomy (simulate_ema(), simulate_from_fit()) supports design planning and replication.
From CRAN (once the package is accepted):
install.packages("silentema")
The development version from GitHub:
# install.packages("remotes")
remotes::install_github("hsiutingyu/silentema")
The package contains C++ code (the state-space EM algorithm), so a compiler toolchain is needed to install from source: Rtools on Windows, Xcode command-line tools on macOS, r-base-dev or equivalent on Linux.
library(silentema)
sim <- simulate_ema(N = 100, n_prompts = 56, motifs = "M2", compliance = 0.7, delta = -1,
sensor_cor = 0.6, seed = 1)
g <- dm_graph("M2", sensor = TRUE)
recoverability(g) # what can be recovered under the declared mechanism?
silence_test(sim$data, sim$vars) # was silence informative?
prof <- tilt_profile(sim$data, sim$vars, delta_grid = seq(-2, 0.5, by = 0.5))
cal <- calibrate_delta(prof, sim$data, method = "sensor")
break_even(prof, delta_max = 1.5)
cat(missingness_declaration(g, profile = prof, calibration = cal, plausible = c(-1.5, 0)), sep = "\n")
vignette("silentema-workflow"): a complete analysis from declaration to report.vignette("dm-graphs"): the motif taxonomy, d-separation and the recoverability report.vignette("testing-informativeness"): the silence test, the sensor-gap test and the fatigue check.vignette("sensitivity-analysis"): tilting, break-even values, calibration and reporting.vignette("simulation-and-design"): the simulator and design planning.Yu, H.-T. (2026). What skipped prompts hide: Detecting, diagnosing, and correcting informative nonresponse in ecological momentary assessment. Manuscript under review. Materials: https://osf.io/x6d2t/
Yu, H.-T. (2026). silentema: Dynamic Missingness Graphs and Sensitivity Analysis for EMA Data. R package version 1.0.0. https://CRAN.R-project.org/package=silentema
Run citation("silentema") in R for BibTeX entries.
GPL (>= 3)