refine_rotation: Refine B-ESEM Rotation Using Mplus Solution as Warm Start

View source: R/reliability.R

refine_rotationR Documentation

Refine B-ESEM Rotation Using Mplus Solution as Warm Start

Description

The bifactor target rotation criterion surface has many local minima. R and Mplus sometimes converge to different ones, leading to different partitioning of variance between G and specific factors (while fit indices remain identical because they are rotation-invariant).

Usage

refine_rotation(results)

Arguments

results

An esem_comparison_pipeline object from run_comparison that includes Mplus results (results$mplus_results must be non-NULL).

Details

This function uses orthogonal Procrustes rotation to compute the rotation matrix \mathbf{T} that maps R's unrotated loading matrix toward the Mplus STDYX solution, then evaluates whether the target criterion at that \mathbf{T} is lower than R's best random-start criterion. If so, the better rotation is adopted. This is methodologically sound because:

  1. The same published criterion function is still being minimised.

  2. Procrustes only provides a well-informed starting point; the final solution is the converged GPArotation::targetT optimum from that start.

  3. The approach is analogous to Mansolf and Reise's (2016) recommendation to use Schmid-Leiman solutions as warm starts.

Value

The same results object with fit_besem updated if a better rotation was found, otherwise unchanged. A message reports whether the criterion improved. The comparison_table is also updated.

References

Mansolf, M., and Reise, S. P. (2016). Exploratory bifactor analysis: The Schmid-Leiman orthogonalization and Jennrich-Bentler analytic rotations. Multivariate Behavioral Research, 51(5), 698–717.

Examples

## Not run: 
# Requires run_comparison() results that include a Mplus rotation reference
# (results$mplus_results non-NULL), so a licensed Mplus install is needed.
results <- run_comparison(spec, mplus_folder = tempfile("mplus_"))
results <- refine_rotation(results)
omega   <- compute_omega(results)
print(omega)

## End(Not run)


bifactory documentation built on Oct. 28, 2026, 1:06 a.m.