nlpsem provides tools for fitting linear and nonlinear longitudinal models
within the structural equation modeling (SEM) framework. The package is built
on top of OpenMx and is designed for settings where the trajectory shape is
nonlinear and may be intrinsically nonlinear rather than a simple
reparameterization of a linear growth model.
nlpsem is a statistical software and measurement-methods asset. It supports nonlinear longitudinal modeling, latent growth and latent change models, mixture modeling, multivariate longitudinal processes, multiple-group comparisons, and psychometric/measurement-science workflows in R.
For AI evaluation roles, the package is relevant because repeated AI behavior across prompts, models, seeds, raters, and deployment conditions can be studied with the same measurement mindset used for longitudinal human-development and latent-process modeling: define the measurement occasions, model systematic variation, quantify reliability, and separate signal from instability.
This repository demonstrates:
OpenMx
The methods implemented in this package are described in:
Liu, J. (2025). Examination of nonlinear longitudinal processes in the framework of structural equation modeling: The R package nlpsem. Behavior Research Methods. https://doi.org/10.3758/s13428-025-02596-4
The same measurement-science principles used for longitudinal human-development modeling also inform evaluation of AI system behavior over prompts, models, seeds, raters, and deployment conditions. In both settings, the central questions are how behavior changes across repeated conditions, which sources of variation are meaningful, and how much confidence a reviewer should place in an observed pattern.
The package supports four broad longitudinal modeling settings:
getLGCM(): latent growth curve modelsgetLCSM(): latent change score modelsgetTVCmodel(): models with time-varying covariatesgetMGM(): multivariate growth and change modelsgetMediation(): longitudinal mediation modelsgetMGroup(): multiple-group modelsgetMIX(): longitudinal mixture modelsgetSummary(): model fit summary across one or more fitted modelsgetEstimateStats(): p-values and confidence intervalsgetFigure(): trajectory plotsgetLRT(): likelihood ratio tests for nested modelsgetIndFS(): individual factor scoresgetPosterior(): posterior class probabilities for mixture modelsgetLatentKappa(): agreement between latent class assignmentsFor latent growth curve models, nlpsem supports:
"LIN")"QUAD")"EXP")"JB")"BLS")For latent change score models, nlpsem supports:
"NonP")"QUAD")"EXP")"JB")Negative exponential, Jenss-Bayley, and bilinear spline models can be fit in
their intrinsically nonlinear forms by setting intrinsic = TRUE.
If the package is available on CRAN:
install.packages("nlpsem")
To install the development version from GitHub:
# install.packages("remotes")
# remotes::install_github("Veronica0206/nlpsem")
install.packages("nlpsem", repos = c('https://veronica0206.r-universe.dev', 'https://cloud.r-project.org'))
library(nlpsem)
mxOption(model = NULL, key = "Default optimizer", "CSOLNP", reset = FALSE)
data("RMS_dat")
RMS_dat0 <- RMS_dat
# Re-baseline the measurement occasions
baseT <- RMS_dat0$T1
for (i in 1:9) {
RMS_dat0[[paste0("T", i)]] <- RMS_dat0[[paste0("T", i)]] - baseT
}
# Fit a bilinear spline LGCM with a fixed knot
Math_BLS <- getLGCM(
dat = RMS_dat0,
t_var = "T",
y_var = "M",
curveFun = "BLS",
intrinsic = FALSE,
records = 1:9,
paramOut = TRUE
)
# Inspect estimates
printTable(Math_BLS)
Version 0.4 keeps the modeling scope of version 0.3 while substantially improving robustness, usability, and documentation.
Highlights include:
EXP,
JB, and BLS
paramOut = TRUE
testthat test suite and cleaner CRAN-facing documentationSee NEWS.md for a more comprehensive summary of changes from version 0.3.
The package includes an overview vignette and scenario-specific example vignettes:
vignette("nlpsem_overview")vignette("getLGCM_examples")vignette("getLCSM_examples")vignette("getTVCmodel_examples")vignette("getMGM_examples")vignette("getMediation_examples")vignette("getMGroup_examples")vignette("getMIX_examples")GPL (>= 3)