Intensive longitudinal data (ILD) benefits from layered
plots: raw trajectories, spacing and missingness,
within/between structure, model-based residuals, and (when fitted)
heterogeneity of person-specific parameters. tidyILD spreads these
across ild_plot(), ild_autoplot() on
diagnostics bundles, and backend-specific helpers (KFAS, TVEM,
circadian). There is no single ild_visualize(); use the
table below as an index.
| Question | Primary API | Notes |
|---|---|---|
| Spaghetti trajectories | ild_spaghetti(),
ild_plot(..., type = "trajectory") |
max_ids, time_var, optional
facet_by |
| Person × time heatmap | ild_heatmap(),
ild_plot(..., type = "heatmap") |
Optional facet_by for clusters |
| Spacing / intervals | ild_plot(..., type = "gaps"),
ild_autoplot(bundle, section = "design", type = "coverage") |
ild_spacing() is tabular + AR1/CAR1 hint |
| Missingness pattern | ild_plot(..., type = "missingness"),
ild_missing_pattern()$plot |
Bundle: section = "data", type = "missingness" |
| Within/between densities | ild_center_plot(),
ild_decomposition(..., plot = TRUE) |
Not marginal effects of fitted model |
| Residual ACF | ild_plot(fit, type = "residual_acf"),
ild_autoplot(bundle, section = "residual", type = "acf") |
Sequence-based lag; see ?ild_acf |
| Obs vs fitted scatter | ild_plot(fit, type = "fitted") |
|
| Obs vs fitted over time | ild_plot_predicted_trajectory(fit),
ild_plot(..., type = "predicted_trajectory") |
Two lines per id |
| Person-specific / partial pooling | ild_autoplot(h, type = "caterpillar") on
ild_heterogeneity(); bundle
section = "fit", type = "heterogeneity" |
|
| Time-varying effect | ild_tvem_plot() |
After ild_tvem() |
| State space / continuous time | ild_plot_states(), ild_plot_forecast(),
ild_plot_filtered_vs_smoothed() on ild_kfas()
fits; ild_autoplot for ctsem where supported |
Optional KFAS / ctsem |
| Diurnal pattern | ild_circadian() |
After ild_diagnose(), prefer
ild_autoplot(bundle, ...) for a consistent section layout
(residual, fit, predictive,
data, design, causal).
library(tidyILD)
set.seed(1)
d <- ild_simulate(n_id = 24, n_obs_per = 10, seed = 1)
d$cluster <- rep(LETTERS[1:3], length.out = nrow(d))
x <- ild_prepare(d, id = "id", time = "time")
ild_spaghetti(x, var = "y", facet_by = "cluster", max_ids = 12L)
fit <- ild_lme(y ~ 1 + (1 | id), data = x, ar1 = FALSE, warn_no_ar1 = FALSE, warn_uncentered = FALSE)
ild_plot_predicted_trajectory(fit, time_var = ".ild_seq", max_ids = 8L, facet_by = "cluster")Any ggplot from ild_* can be stored and extended
(e.g. p + facet_wrap(vars(week))) if you add a column to
the ILD first. The facet_by argument on
ild_plot() passes through to ggplot2::facet_wrap()
for trajectory, heatmap, gaps, and predicted trajectories.
_wp and _bp (external
packages)tidyILD does not reimplement marginal effects. After
ild_center(), fit with
y ~ x_wp + x_bp + (1|id) and use
marginaleffects or ggeffects on the
fitted object. Keep the estimand explicit: slopes on x_wp
are within-person associations; x_bp
captures between-person differences in level.
# install.packages(c("marginaleffects", "ggeffects")) # if needed
x <- ild_center(x, x)
fit <- ild_lme(y ~ x_wp + x_bp + (1 | id), data = x, warn_uncentered = FALSE)
# Example (syntax may vary by package version):
# marginaleffects::plot_predictions(fit, condition = "x_wp")
# marginaleffects::plot_predictions(fit, condition = "x_bp")
# ggeffects::ggpredict(fit, terms = "x_wp") # then plot() or ggplot2 layervignette("tidyILD-workflow", package = "tidyILD"),
vignette("ild-decomposition-and-spacing", package = "tidyILD"),
?ild_plot, ?ild_autoplot.