partial_invariance: Partial Measurement Invariance Testing

View source: R/partial_invariance.R

partial_invarianceR Documentation

Partial Measurement Invariance Testing

Description

Given a failed invariance level, uses a greedy score-test loop (lavTestScore + group.partial) to identify and free the minimum set of non-invariant equality constraints needed to restore acceptable fit (DCFI >= -0.010). Downstream invariance levels are then re-tested under the same partial constraints.

Usage

partial_invariance(
  inv,
  level,
  max_free = 10L,
  delta_cfi_cutoff = -0.01,
  verbose = TRUE
)

Arguments

inv

An esem_invariance object from esem_invariance.

level

Character. The invariance level to partially free: "strong" or "strict". Partial weak invariance is not defined for ESEM: the rotated loading block is constrained across groups as a unit, so no single loading can be freed.

max_free

Integer. Maximum parameters to free before stopping. Default 10. Byrne et al. (1989) recommend freeing the minimum number – in practice >5 rarely recovers invariance.

delta_cfi_cutoff

Numeric. Stopping criterion: loop stops when DCFI >= this value. Default -0.010 (Cheung & Rensvold, 2002).

verbose

Logical. Print progress messages. Default TRUE.

Value

An object of class "esem_partial_invariance" with:

$freed_params

Data frame: round, label, group_name, score (LM), delta_cfi (baseline-relative), converged.

$partial_fit

esem_fit at level with freed params.

$downstream

Named list of esem_fit for levels above target.

$downstream_lrt

lavTestLRT() comparisons among downstream.

$table

Combined fit table (original + partial + downstream).

$converged

Logical: did DCFI pass cutoff?

$group_partial

Character vector: final group.partial labels.

What can be released

ESEM and B-ESEM loadings rotate as a block, so partial configural and partial weak invariance do not exist. Partial strong releases intercepts (continuous items) or thresholds (ordered items); partial strict releases residual variances. Constraints are released one at a time, largest score test first (van de Schoot, Lugtig & Hox, 2012). An intercept or threshold is released only if every factor the item belongs to keeps at least two items with invariant intercepts/thresholds (Byrne, Shavelson & Muthen, 1989), and a warning is issued when more than 20\ added at that level are released (Dimitrov, 2010). The search is data driven: report every released parameter. On ordered items the search keeps at least one threshold per item invariant (Millsap & Yun-Tein, 2004); an item's last threshold can be released by hand through esem_invariance(..., group.partial = "item|t1"), which then fixes the item's residual variance at 1 in every group. A partial refit that fits worse than the full model (a lavaan local optimum) is retried from simple starting values.

See Also

esem_invariance


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