--- title: "Continuous-Time Dynamics with ctsem in tidyILD" author: "tidyILD authors" date: "`r Sys.Date()`" output: rmarkdown::html_vignette vignette: > %\VignetteIndexEntry{Continuous-Time Dynamics with ctsem in tidyILD} %\VignetteEngine{knitr::rmarkdown} %\VignetteEncoding{UTF-8} --- ```{r setup, include = FALSE} knitr::opts_chunk$set(collapse = TRUE, comment = "#>") ``` This vignette introduces the `ctsem` backend in tidyILD via `ild_ctsem()`. Use this path when your scientific target is **continuous-time latent dynamics** under irregular measurement timing. ## When to use `ild_ctsem()` - Choose `ild_ctsem()` for continuous-time latent process modeling. - Choose `ild_kfas()` for discrete-time state-space workflows. - Choose `ild_lme()` / `ild_brms()` for multilevel regression targets. ## Minimal workflow ```{r eval = FALSE} library(tidyILD) d <- ild_simulate(n_id = 1, n_obs_per = 60, seed = 501) x <- ild_prepare(d, id = "id", time = "time") x <- ild_center(x, y) fit_ct <- ild_ctsem( data = x, outcome = "y", model_type = "stanct", chains = 1, iter = 400 ) fit_ct td <- ild_tidy(fit_ct) ag <- ild_augment(fit_ct) dg <- ild_diagnose(fit_ct) ``` ## Diagnostics and plots ```{r eval = FALSE} ild_autoplot(fit_ct, type = "fitted_vs_actual") ild_autoplot(fit_ct, type = "residual_time") ild_autoplot(dg, section = "fit", type = "convergence") ild_autoplot(dg, section = "residual", type = "acf") ``` ## Guardrails and reporting `ild_diagnose(fit_ct)` may trigger ctsem-focused guardrails such as: - `GR_CTSEM_NONCONVERGENCE` - `GR_CTSEM_UNSTABLE_DYNAMICS` - `GR_CTSEM_SHORT_SERIES_FOR_COMPLEX_DYNAMICS` These guardrails are surfaced in `print(dg)`, `ild_methods(fit_ct, bundle = dg)`, and `ild_report(fit_ct)`. ## Notes - The v1 ctsem wrapper is intentionally conservative. - You can pass a custom `ct_model` object for advanced specifications. - Keep time scaling explicit (`time_col`, `time_scale`) for interpretability.