Skip to contents

Algorithm Overview

The EFA-Boosting algorithm is an iterative optimization procedure designed to find the optimal item configuration for exploratory factor analysis models. It combines multiple fit indices into an adaptive composite score that adjusts based on model complexity and sample size.

How It Works

Step 1: Initial Model Fit

The algorithm starts by fitting an initial EFA model with all items using the package’s internal EFA engine, which fits the efa() block syntax of lavaan with the requested estimator and rotation.

Step 2: Problem Detection

At each iteration, the algorithm checks for:

  1. Heywood cases: Factor loadings > 1.0
  2. Near-Heywood cases: Factor loadings > 0.95
  3. Cross-loadings: Items loading on multiple factors above the threshold
  4. Low loadings: Items with loadings below the minimum threshold
  5. Interfactor correlations: Correlations > 0.85 between factors

Step 3: Item Removal Strategy

Two search strategies are available:

Greedy Search (Default)

Removes one problematic item at a time based on priority: 1. Heywood cases 2. Near-Heywood cases 3. Cross-loadings 4. Lowest adaptive fit contribution

Evaluates all possible combinations of removing 1 to global_max_remove items simultaneously, selecting the combination that produces the best adaptive composite fit.

Step 4: Adaptive Fit Calculation

The composite fit is calculated as:

Composite = (w_RMSEA × RMSEA_norm) + (w_SRMR × SRMR_norm) + (w_CFI × CFI_inv)

Where weights are adapted based on df × N following Kenny & McCoach (2003) and Shi et al. (2019).

Step 5: Convergence

The algorithm stops when: - All fit targets are met (RMSEA, SRMR, CFI) - Minimum items per factor constraint is reached - Maximum iterations exceeded - No improvement possible

Usage Examples

Basic Usage

library(OptimalFactor)

result <- efa_boosting(
  data = Data_Personality,
  name_items = "item",
  n_factors = 5,
  verbose = TRUE
)

Advanced Configuration

result <- efa_boosting(
  data = Data_Personality,
  name_items = "item",
  n_factors = 5,
  rotation = "oblimin",
  target_RMSEA = 0.05,
  target_SRMR = 0.05,
  target_CFI = 0.95,
  min_loading = 0.40,
  cross_loading_threshold = 0.32,
  min_items_per_factor = 3,
  global_search = TRUE,
  global_max_remove = 3,
  verbose = TRUE
)

With AI Analysis

result <- efa_boosting(
  data = Data_Personality,
  name_items = "item",
  n_factors = 5,
  use_gpt = TRUE,
  gpt_model = "gpt-4o-mini",
  verbose = TRUE
)

# Print AI analysis
print_conceptual_analysis(result$conceptual_analysis)

Parameters

Parameter Default Description
data - Data frame with items
name_items - Prefix of item columns
n_factors - Number of factors to extract
rotation “oblimin” Rotation method
target_RMSEA 0.06 Target RMSEA value
target_SRMR 0.06 Target SRMR value
target_CFI 0.95 Target CFI value
min_loading 0.40 Minimum acceptable loading
cross_loading_threshold 0.32 Cross-loading threshold
min_items_per_factor 3 Minimum items per factor
global_search FALSE Enable global search
global_max_remove 2 Max items in global search
use_gpt FALSE Enable AI analysis
verbose TRUE Print progress

Output

The function returns a list containing:

  • final_structure: Final factor loadings matrix
  • fit_indices: Final fit indices
  • removed_items: List of removed items with reasons
  • iteration_history: Details of each iteration
  • conceptual_analysis: AI analysis (if enabled)