Changes in version 0.0.8

+ ADD: `simulate_hierarchical_factors` simulates data from a hierarchical (second-order) factor model, where variables load onto lower-order factors and lower-order factors load onto higher-order factors; the lower-order factors' residual (disturbance) structure can be set directly via `off_disturbances`/`off_disturbances_range` (only their *off-diagonal*, correlated-disturbance elements are settable — the diagonal is always rescaled to unit variance, since any unexplained variance is normalized away regardless) or left to be implied instead by supplying a target `lower_correlations`/`lower_correlations_range` matrix

+ ADD: `print`/`summary` methods for `simulate_factors`/`simulate_hierarchical_factors` output, reporting loadings, correlations, disturbances, categories, and skew

+ FIX: `simulate_factors` could loop indefinitely when supplied `loadings`/`correlations` were jointly inadmissible; now errors after 1000 attempts with an informative message

+ INTERNAL: consolidated `@import`/`@importFrom` roxygen tags into a single package-level block in `latentFactoR.R`

+ INTERNAL: cleaned up and optimized code in `simulate_factors`

+ INTERNAL: random number generation moved to C

+ INTERNAL: cleaned up and optimized code in `add_cross_loadings`, `add_local_dependence`, `add_method_factors`, `add_population_error`, and `add_wording_effects` to match `simulate_factors` (uses C-based random number generation)

+ FIX: `add_cross_loadings` could error with "missing value where TRUE/FALSE needed" when a factor was randomly assigned zero cross-loadings (e.g., via `proportion_cross_loadings_range`)

+ FIX: `proportion_negative_range` in `add_method_factors` was documented but not implemented; it now works as documented

+ FIX: documentation in `simulate_factors` was missing the `continuous_data` return value and the `cross_loadings`/`categorical_limit` parameters list, and had the loadings matrix dimensions reversed

+ FIX: `simulate_factors`/`simulate_hierarchical_factors` misassigned per-variable `skew` values to the wrong columns whenever a full-length `skew` vector was supplied on a model mixing categorical and continuous variables

+ FIX: `simulate_factors`/`simulate_hierarchical_factors` ignored `loadings_range`/`correlations_range` (and the hierarchical equivalents) after the first retry attempt, so the admissibility retry loop could never actually resample those parameters

+ FIX: `add_cross_loadings` could error with "missing value where TRUE/FALSE needed" when `magnitude_cross_loadings` was supplied with length equal to `factors` (a documented, valid length)

+ FIX: `add_cross_loadings` now errors informatively (instead of crashing) when called on data with only one factor, since cross-loadings require at least two factors

+ FIX: `add_local_dependence` could error with "NAs are not allowed in subscripted assignments" when composed after `add_cross_loadings` had already consumed most of a factor's available variables

+ FIX: `add_cross_loadings`/`add_local_dependence`/`add_method_factors`/`add_wording_effects` incorrectly indexed `parameters$variables` when converting a raw-count `_range` argument (e.g. `proportion_cross_loadings_range`) into a proportion, which could silently misconvert the range or crash outright for a single-factor model

+ FIX: `add_local_dependence`/`add_method_factors` admissibility retry loops had no maximum-iteration guard and could loop indefinitely

+ FIX: `add_population_error` reused the first random population-error draw on every retry iteration instead of resampling, making `convergence_iterations` ineffective

+ FIX: `add_population_error` applied its CFA sign-indeterminacy correction globally across the whole loadings matrix instead of per-factor, which could corrupt an otherwise correctly-signed factor's loadings in multi-factor models

+ FIX: `ESEM` did not resolve its `estimator` argument via `match.arg`, so the documented default (omitting `estimator`) failed; `estimator` now defaults to `"MLR"`

+ FIX: `ESEM` built lavaan variable names with a hardcoded zero-padding width that mismatched the actual data column names for models with fewer than 10 or 100+ total variables

+ FIX: `NEST`/`factor_forest`/`estimate_dimensions` used base `isSymmetric()` (which requires matching row and column names) to detect correlation-matrix input; an unnamed but valid correlation matrix was misclassified as raw data, silently discarding a user-supplied `sample_size`

+ FIX: `NEST` could error with a non-conformable matrix multiplication when its internal rank-reduction step truncated below the requested number of factors

+ FIX: `EKC` returned `NA` instead of the maximum number of dimensions when every eigenvalue exceeded its reference value

+ FIX: `obtain_zipfs_parameters` could not recover `alpha < 1` due to a hardcoded search floor, despite `alpha < 1` being a documented, valid input to `data_to_zipfs`

+ FIX: `data_to_zipfs`'s zero-sum-column repair silently failed when the most-correlated donor column was itself all-zero

+ FIX: `factor_forest`'s downloaded model cache path used a Windows-style backslash separator, breaking cache detection (forcing re-download every call) on Linux/macOS

+ FIX: `factor_forest`'s eigenvalue-padding step could run backward and overwrite real eigenvalues for datasets with 80 or more variables

+ FIX: `simulate_factors` enforced a minimum of 2 variables per factor in code while documenting (and enforcing via `variables_range`) a minimum of 3

+ INTERNAL: removed dead/unreachable code (`error.report`, a duplicated `digits()` definition, a non-functional `.onload` typo) and added `URL`/`BugReports` to `DESCRIPTION`; `inst/CITATION` now derives its version/year from `DESCRIPTION` instead of a hardcoded string


Changes in version 0.0.7

+ FIX: error check for positive definite in `add_population_error`

+ FIX: correction when adding negative skew for continuous data (internal function: `skew_continuous`)

+ UPDATE: better ML population error in `add_population_error` (update from {bifactor})

+ UPDATE: some optimizations to `add_population_error` 

+ UPDATE: some optimiztaions to `NEST`


Changes in version 0.0.6

+ MOVE: `add_wording_effects` methods moved from `utils-latentFactoR` to `add_wording_effects-helpers` to facilitate ease of finding code (no observable changes to the user)

+ FIX: categories greater than 7 were not previously allowed (they are now)

+ FIX: correlations in `EKC` were not used appropriately and led to an error

+ UPDATE: switched on "Byte-Compile" (byte-compiles on our end and not when the user installs)


Changes in version 0.0.5

+ FIX: bug in skew when only providing 1 value

+ FIX: further correction to `EKC` (uses `cumsum(eigenvalues)` rather than `sum(eigenvalues)`)

+ ADD: `add_wording_effects` will add wording effects such as acquiescence, difficulty, random careless, straight line, or some combination of the four to a simulated factor model

+ ADD: `ESEM` to perform Exploratory Structural Equation Modeling using {lavaan} (allows wording effects to be estimated)

+ FIX: `factor_forest` uses raw data in `psych::fa.parallel` rather than correlation matrix

+ ADD: internal functions for computing effect sizes across conditions are included (see `simulation_helpers.R`)

+ ADD: skew in `add_local_dependence` is guaranteed to be same direction for locally dependent variables


Changes in version 0.0.4

+ FIX: correction to `EKC` (used `factor_forest`'s version of EKC which used reference values rather than eigenvalues); `EKC` uses eigenvalues whereas `factor_forest` uses reference (which was what the random forest model was trained on)

+ FIX: cross-loadings with population error are screened for communalities >= 0.80; communalities near 0.90 prior to population error would often get stuck and not converge

+ ADD: `skew` argument for continuous data


Changes in version 0.0.3

+ ADD: `add_population_error` will add population error, using {bifactor}, to a simulated factor model

+ ADD: `data_to_zipfs` to transform data to Zipf's distribution from `simulate_factors`

+ ADD: `obtain_zipfs_parameters` to obtain a dataset's best fitting Zipf's distribution parameters

+ ADD: `NEST` Next Eigenvalue Sufficiency Test to estimate dimensions

+ ADD: `estimate_dimensions` provides a single function to estimate dimensions using state-of-the-art methods: Exploratory Graph Analysis (EGA),
Exploratory Factor Analysis with out-of-sample prediction (FSPE), Next Eigenvalue Sufficiency Test (NEST), parallel analysis (PA), and Factor Forest


Changes in version 0.0.2

+ UPDATE: skews for categories now include 6 categories

+ UPDATE: available skew increments are now 0.05 (were 0.50 previously)

+ ADD: `add_local_dependence` will add local dependence between variables from a simulated factor model


Initial commit version 0.0.1
