---
title: "Exploring Factor Complexity with ESEM: Example 1"
output: rmarkdown::html_vignette
vignette: >
  %\VignetteIndexEntry{Exploring Factor Complexity with ESEM: Example 1}
  %\VignetteEngine{knitr::rmarkdown}
  %\VignetteEncoding{UTF-8}
---

```{r setup, include = FALSE}
knitr::opts_chunk$set(
  collapse = TRUE,
  comment = "#>"
)
library(facomplex)
library(lavaan)
library(psych)
if (!requireNamespace("psych", quietly = TRUE)) {
  knitr::opts_chunk$set(eval = FALSE)
}
if (!requireNamespace("lavaan", quietly = TRUE)) {
  knitr::opts_chunk$set(eval = FALSE)
}
```

# Example 1: Estimating Factor Complexity in an ESEM Solution

This example demonstrates a full workflow for estimating factor complexity in an Exploratory Structural Equation Modeling (ESEM) context using the `facomplex` package. We use a two-factor target rotation on a set of 12 items. This is a real data, about motivations for research in university teachers

## 1. Load the data

We start by loading the dataset `fullclean` which should contain the observed variables for the ESEM model, 12 items, 2 factors.

```{r}
data(fullclean)
```

## 2. Create a target matrix

We define the hypothesized factor structure using a target matrix. This matrix guides the target rotation by specifying which items are expected to load on each factor.

```{r}
INV.target <- matrix(0, 12, 2)
INV.target[1:6, 1] <- NA
INV.target[7:12, 2] <- NA
INV.target
```

## 3. Specify the ESEM model

Using `lavaan`, we define an ESEM model with exploratory factors `f1` and `f2`. All items load on both factors through exploratory syntax.

```{r}
INV.esem.model <- '
efa("efa1")*f1 + 
efa("efa1")*f2 =~ INV1 + INV4 + INV5 + INV7 + INV11 + INV12 + INV3 + INV6 + INV8 + INV9 + INV13 + INV14
'
```

## 4. Fit the ESEM model

We fit the model using the `sem()` function from `lavaan`, applying a target rotation based on our predefined matrix.

```{r}
INV.esem.fit <- sem(INV.esem.model,
                    data = fullclean,
                    ordered = FALSE,
                    estimator = "ulsmv",
                    rotation = "target",
                    rotation.args = list(target = INV.target,
                                         geomin.epsilon = 0.01, 
                                         rstarts = 30,
                                         algorithm = "gpa",
                                         std.ov = TRUE))
```

We examine the model fit and standardized solution:

```{r}
summary(INV.esem.fit, standardized = TRUE, fit.measures = TRUE)
```

## 5. Compute factor complexity indices

We now use the `facomplex` package to calculate various indices of factor complexity.

### Factor Simplicity Index (FSI)

The items grouped in both lists, within the `items_target` argument, are the expected items in their factors. The use of FSI to interpret its results at the factor level requires this prior knowledge of the items in their expected factors.

```{r}
simload(data = lavInspect(INV.esem.fit, what = "std")$lambda,
    items_target = list(f1 = c(1,2,3,4,5,6), 
                        f2 = c(7,8,9,10,11,12)))
```

### Hofmann’s Index

```{r}
Hofmann(data = lavInspect(INV.esem.fit, what = "std")$lambda)
```

### Bentler’s Simplicity Index (BSI)

```{r}
BSI(lavInspect(INV.esem.fit, what = "std")$lambda)
```

------------------------------------------------------------------------

This concludes **Example 1**. Additional examples will build upon these procedures to showcase different model structures, datasets, and complexity conditions.
