Nothing
grmforest() gains tree_fun and tree_args arguments so one forest engine
serves both trees. The default (tree_fun = grmtree) grows a cross-sectional
GRM forest exactly as before; tree_fun = longitudinal_grmtree with
tree_args = list(n_items = ...) grows a longitudinal GRM forest for
response-shift detection. varimp() detects the tree type and scores
out-of-bag respondents with the appropriate marginal likelihood, the
two-occasion correlated-factor likelihood for longitudinal forests, so the
same varimp() call ranks covariates for either forest.longitudinal_grmtree() now freely estimates the follow-up latent variance
(previously fixed to 1), so the two-factor model captures change in trait
dispersion across occasions as well as in the mean. The variance remains a
structural parameter held out of the split test.grmforest() now runs reliably in parallel (n_cores > 1) on all platforms,
including PSOCK/Windows workers, and results are identical regardless of the
number of cores. Out-of-bag membership is stored as row indices, and forests
can be grown in chunks and combined with c().grmforest() coerces character partitioning variables to factors, avoiding
tree failures on such covariates.varimp() now scores out-of-bag respondents with the marginal (latent-
integrated) log-likelihood using the correct GRM parameterization, and
averages paired within-tree permutation differences.grmfit() no longer computes standard errors during fitting, which removes a
chol() failure on hard resamples and speeds up tree/forest construction;
results are unchanged.longitudinal_grmtree() to the ITEM parameters
(measurement invariance) and not include the structural parameters.rs_characterize(). Item-level tests now run
only in nodes with omnibus response shift detected after the across-node
adjustment (RS_detected), instead of the unadjusted p-value, so no item rows
are produced for nodes that are not significant family-wise. The shift type is
now read from the estimated item-parameter changes (occasion-general
discrimination and thresholds) rather than a magnitude cut-point: a
significant item is always classified as recalibration, reprioritization, or
both, the "Significant (small effect)" label is removed, and the effect-size
magnitude is reported separately in a new RS_magnitude column.plot_rs_tree() and
plot_rs_heatmap(). Both now display p-values in fixed notation (e.g.
"p < 0.001") rather than scientific notation, label the latent parameters as
"Mean shift (T2)" and "Cor(T1, T2)", spell out the response-shift types in
full, and restrict the RS-type legend to Recalibration, Reprioritization,
Both, and None (the effect-size annotation is no longer shown as a shift
type).varimp() scores out-of-bag respondents with the marginal (latent-integrated)
log-likelihood and averages paired within-tree permutation differences;
out-of-bag membership is stored as row indices and forests can be combined
with c().longitudinal_grmtree() for response shift (RS) detection in
patient-reported outcome measures (PROMs) measured at two time points. The
method embeds a constrained two-factor longitudinal graded response model
within model-based recursive partitioning to identify patient subgroups whose
longitudinal measurement model differs.rs_characterize(), with a print() method, for Phase 2 response shift
characterization. Within each terminal node it performs an omnibus likelihood
ratio test (constrained vs unconstrained model) and, where significant,
item-level tests that classify each item as recalibration, reprioritization,
or both. Supports hierarchical p-value correction both across nodes
(global_p_adjust) and within nodes (p_adjust).prepare_longitudinal_data() to construct the wide-format response
matrix required by longitudinal_grmtree() from separate baseline and
follow-up item columns.threshpar_longitudinal_grmtree(), discrpar_longitudinal_grmtree(),
itempar_longitudinal_grmtree(), fscores_longitudinal_grmtree(), and
latentpar_longitudinal_grmtree().plot() method for longitudinal_grmtree objects (threshold region
plots showing the unique items), and two response shift visualizations,
plot_rs_tree() and plot_rs_heatmap().generate_node_scores_dataset() now supports both cross-sectional
(grmtree) and longitudinal (longitudinal_grmtree) trees, and merges node
assignments and factor scores back onto the original data frame.grmtree_long_data dataset (longitudinal MOS-SS emotional
domain, two time points) for examples, tests, and the new vignette.grmtree.control() (Holm, Benjamini-Hochberg, Benjamini-Yekutieli, Hochberg,
and Hommel). The previous implementation reduced each node to its minimum
p-value before applying the adjustment, which collapsed the within-node
multiplicity across covariates. The internal .adjust_and_prune_tree() now
collects all covariate-by-node p-values, applies the adjustment globally, and
then prunes non-significant nodes. This properly accounts for both within-node
(multiple covariates) and across-node (multiple splits) multiplicity.This is the first official release of the grmtree package, providing methods
for fitting and analyzing graded response model (GRM) trees and forests.
grmtree() for fitting tree-based graded response models.grmforest() for building forests of GRM trees.print() and plot() methods for GRM tree/forest objects.Any scripts or data that you put into this service are public.
Add the following code to your website.
For more information on customizing the embed code, read Embedding Snippets.