---
title: "semboottools"
output: rmarkdown::html_vignette
vignette: >
  %\VignetteIndexEntry{semboottools}
  %\VignetteEngine{knitr::rmarkdown}
  %\VignetteEncoding{UTF-8}
---

```{r, include = FALSE}
knitr::opts_chunk$set(
  collapse = TRUE,
  comment = "#>"
)
```

# Overview

This vignette demonstrates how to form bootstrapping confidence intervals and examining bootstrap estimates in SEM using semboottools.

```{r setup}
library(semboottools)
library(lavaan)
```

# Example: Simple Mediation Model

We use a simple mediation model with a large sample (N = 1000).

This model includes: A predictor x, A mediator m, An outcome y.

Indirect effect (ab) and total effect (total) defined.

```{r}
# Set seed for reproducibility
set.seed(1234)

# Generate data
n <- 1000
x <- runif(n) - 0.5
m <- 0.20 * x + rnorm(n)
y <- 0.17 * m + rnorm(n)
dat <- data.frame(x, y, m)

# Specify mediation model in lavaan syntax
mod <- '
  m ~ a * x
  y ~ b * m + cp * x
  ab := a * b
  total := a * b + cp
'
```
## Fit the Model with Bootstrapping

```{r}
fit <- sem(mod, data = dat, fixed.x = FALSE)
summary(fit, ci = TRUE)
# Ensure bootstrap estimates are stored
fit <- store_boot(fit) 
```

## Form Bootstrap CIs for Standardized Coefficients

```{r}
# Basic usage: default settings
# Compute standardized solution with percentile bootstrap CIs
std_boot <- standardizedSolution_boot(fit)
print(std_boot)
```

## Form Bootstrap CIs for for Unstandardized Cofficients

'parameterEstimates_boot()' computes bootstrap CIs, standard errors, and optional asymmetric p-values for unstandardized parameter estimates, including both free and user-defined parameters.

It requires bootstrap estimates stored via store_boot(), supports percentile and bias-corrected CIs, and outputs bootstrap SEs as the standard deviation of estimates.

```{r}
# Basic usage: default settings
# Compute unstandardized solution with percentile bootstrap CIs
est_boot <- parameterEstimates_boot(fit)

# Print results
print(est_boot)
```


## Visualize Bootstrap Estimates

To examine the distribution of bootstrap estimates, two functions are available:

-   `hist_qq_boot()`\
    For histogram + normal QQ-plot of **one parameter**.

-   `scatter_boot()`\
    For scatterplot matrix of **two or more parameters**.

### Histogram and QQ Plot: `hist_qq_boot()`

```{r, fig.width = 6, fig.height = 3, fig.align='center'}
# For estimates of user-defined parameters,
hist_qq_boot(fit, "ab", standardized = FALSE)
# For estimates in standardized solution,
hist_qq_boot(fit, "ab", standardized = TRUE)
```

### Scatterplot Matrix: `scatter_boot()`

```{r}
# standardized solution
scatter_boot(fit, c("a", "b", "ab"), standardized = TRUE)
# unstandardized solution
scatter_boot(fit, c("a", "b", "ab"), standardized = FALSE)
```