---
title: "Introduction to PLSsemEngine"
author: "Manuel Soto Pérez"
output: rmarkdown::html_vignette
vignette: >
  %\VignetteIndexEntry{Introduction to PLSsemEngine}
  %\VignetteEngine{knitr::rmarkdown}
  %\VignetteEncoding{UTF-8}
---

```{r setup, include=FALSE}
knitr::opts_chunk$set(
  collapse = TRUE,
  comment = "#>",
  echo = TRUE
)

```

## Professional PLS-SEM Workflow with PLSsemEngine

This vignette demonstrates how to estimate a reflective PLS-SEM model using **PLSsemEngine**. The package provides a transparent and modular workflow for composite-based Mode A estimation.

## 1. Data Generation
To demonstrate the workflow, we first generate a synthetic dataset (N = 300) with a typical Service Marketing structure.

```{r}
library(PLSsemEngine)
set.seed(123)

# Helper function for data simulation
simulate_example_data <- function(n) {
  Service_Quality <- rnorm(n)
  Customer_Satisfaction <- 0.6 * Service_Quality + rnorm(n, sd = 0.6)
  Customer_Loyalty <- 0.55 * Customer_Satisfaction + 0.25 * Service_Quality + rnorm(n, sd = 0.6)
  
  latent_to_item <- function(latent, loading) {
    x <- loading * latent + rnorm(length(latent), sd = sqrt(1 - loading^2))
    x <- scale(x)
    as.numeric(cut(x, breaks = quantile(x, probs = seq(0, 1, length.out = 8)), 
                   labels = 1:7, include.lowest = TRUE))
  }
  
  data.frame(
    SQ1 = latent_to_item(Service_Quality, 0.82), SQ2 = latent_to_item(Service_Quality, 0.78), SQ3 = latent_to_item(Service_Quality, 0.74),
    CS1 = latent_to_item(Customer_Satisfaction, 0.80), CS2 = latent_to_item(Customer_Satisfaction, 0.76), CS3 = latent_to_item(Customer_Satisfaction, 0.72),
    CL1 = latent_to_item(Customer_Loyalty, 0.81), CL2 = latent_to_item(Customer_Loyalty, 0.77), CL3 = latent_to_item(Customer_Loyalty, 0.73)
  )
}

simulated_data <- simulate_example_data(300)
```

## 2. Model Specification
The engine uses native R structures (lists and formulas) to define the model.

```{r}
# Define reflective blocks
measurement_model <- list(
  Service_Quality = c("SQ1", "SQ2", "SQ3"),
  Customer_Satisfaction = c("CS1", "CS2", "CS3"),
  Customer_Loyalty = c("CL1", "CL2", "CL3")
)

# Define structural paths using formulas
structural_model <- list(
  Customer_Satisfaction ~ Service_Quality,
  Customer_Loyalty ~ Customer_Satisfaction + Service_Quality
)
```

## 3. Execution
The pls_sem() function executes the core algorithm, bootstrap, and predictive evaluation.

```{r}
model <- pls_sem(
  data = simulated_data,
  measurement_model = measurement_model,
  structural_model = structural_model,
  nboot = 100, # Using 100 for speed in this vignette
  k = 5
)
```

## 4. Results Inspection
The results are organized into descriptive tables that match the manuscript's structure.

```{r}
# Measurement Model
model$measurement_model

# Discriminant Validity
model$discriminant_validity

# Structural Model
model$structural_model
```

## 5. Interpretation

Factor loadings above 0.70 indicate acceptable indicator reliability. 
Structural path coefficients can be interpreted as standardized effects between constructs.


## 6. Advanced Features
To address reviewer feedback, we include global fit indices and a bridge to CB-SEM.

```{r}
# Global Model Fit (SRMR, d_ULS, d_G)
model$diagnostics$global_fit

# Export to lavaan syntax
export_lavaan_syntax(measurement_model, structural_model)
```