WEBSITE: https://r-ega.net

## Changes in version 2.0.8

+ FIX: issue with dynamic memory allocation in `polychoric_matrix.c` during CRAN's install of the package

+ ADD: `cosine` similarity added as a default for `auto.correlate` and 'corr' arguments


## Changes in version 2.0.7

+ FIX: mixed data with missing data in `network.predictability`

+ ADD: `frobenius` norm to compare networks

+ ADD: `network.compare` function to test for differences in network structures using three different metrics (Frobenius Norm, Jensen-Shannon Similarity, total network strength)

+ ADD: a general function called `information` to compute several information theory measures

+ UPDATE: default 'loading.method' for `net.loads` has been changed to "revised" moving forward -- the previous default in versions <= 2.0.6 can be obtained using "original"

+ UPDATE: `invariance` handles more than 2 groups (plots up to 4 groups pairwise)

+ UPDATE: added 'signed' argument in `jsd` to allow for signed or absolute networks to be used in computations (includes downstream functions: `infoCluster`)

+ UPDATE: NEWS is now formatted in markdown

+ UPDATE: `network.predictability` uses R-squared and mean absolute error (MAE) for all node predictions

+ INTERNAL: `network.generalizabilty` was moved to be internal (needs some work yet)

+ INTERNAL: signs for `net.loads` uses the first eigenvector of the target network (rather than the custom `obtain_signs` function)


## Changes in version 2.0.6

+ FIX: bug when using `na.data = "listwise"` in standard `cor()` function

+ FIX: update to revised network loadings signs: `net.loads(..., loading.method = "experimental")`

+ FIX: bug in argument 'returnAllResults' for `EBICglasso.qgraph`

+ FIX: bug when passing additional non-`dimensionStability` arguments into `bootEGA`

+ FIX: bug when printing `hierEGA` summary from `bootEGA`

+ UPDATE: colors in `itemStability` plots will match colors of `hierEGA` plot

+ UPDATE: `network.predictability` uses empirical inverse variances (rather than network-implied)

+ UPDATE: R-squared in `continuous_accuracy` helper uses Pearson's correlation squared


## Changes in version 2.0.5

+ FIX: 'stroke' parameter in `hierEGA` that broke with {ggplot2} update

+ ADD: `network.predictability` to predict new data based on a network

+ ADD: `network.generalizability` to estimate network generalizability to new data (leverages `network.predictability`)

+ UPDATE: new loadings (`net.loads(..., loading.method = "experimental")`) have been added to resolve issues in original loadings (e.g., signs, cross-loadings, standardization) 

+ UPDATE: `plot.bootEGA` will output `itemStability` plot by default

+ UPDATE: `dimensionStability` output now included in `bootEGA` as output `$stability`

+ UPDATE: 'rotate' argument added to `infoCluster` plot to allow for different angle of dendrogram

+ DEPENDENCY: {fungible} is now 'IMPORTS' over 'SUGGESTS' for dependency in new loadings

+ DEPRECATED: `typicalStructure` and `plot.typicalStructure` have been deprecated to `FALSE`


## Changes in version 2.0.4

+ FIX: plotting for `infoCluster` when there are grey lines involved (or not)

+ FIX: pass of multiple passes of `resolution_parameter` causing an error in {igraph} 2.0.0 for `EGA.fit` (see issue #148)

+ ADD: `community.compare` to perform permutation test to determine statistical significance of cluster similarity

+ UPDATE: moved `reindex_memberships` to helpers

+ UPDATE: `reindex_memberships` used in `community.homogenize`


## Changes in version 2.0.3

+ FIX: freed `edge.*` arguments in `compare.EGA.plots` to allow full customization

+ UPDATE: optimizations for speed and memory in `ergoInfo` and `boot.ergoInfo`

+ DEPENDENCY: swapped out {ggdendro} for {dendextend}


## Changes in version 2.0.2

+ FIX: ties for max gain in `TMFG`

+ FIX: continuous variables with few categories that are treated as ordinal in `polychoric.matrix`

+ FIX: character input for `structure` is now accepted

+ ADD: website pointing to different data check errors added to error output (hopefully, makes errors more understandable)

+ UPDATE: `corr = "cor_auto"` now performs `qgraph::cor_auto` in favor of legacy; previous behavior starting at 2.0.0 was t+ deprecate `"cor_auto"` in favor of `"auto"`; default remains `corr = "auto"`

+ UPDATE: `compare.EGA.plots` outputs `$all` and `$individual` for the plots

+ UPDATE: when `structure` is supplied for `invariance`, then configural check is skipped (structure is assumed to be invariant)

+ UPDATE: added data generation for `model = "BGGM"` and `uni.method = "expand"` in `community.unidimensional`

+ DEPENDENCY: {BGGM} has been removed until dependency chain on CRAN can be resolved


## Changes in version 2.0.1

+ updated the polychoric C code to avoid out-of-bounds access errors


## Changes in version 2.0.0

+ MAJOR REFACTOR: the update to version 2.0.0 includes many major changes that are designed to improve the speed, reliability, and reproducibility of {EGAnet}. The goal of these changes are to eliminate common errors and streamline the code in the package to prevent future error cases. There are several function additions that are provided to facilitate modular use of the {EGAnet} package

+ INTERNALS: function-specific internal functions and S3methods are now located in their respective .R files rather than elsewhere (e.g., "utils-EGAnet.R")

+ SWAP: internal script usage of "utils-EGAnet.R" depracated for "helper.R" functions that are used across the package (no visible changes for the user)

+ NOTE: default objective function for Leiden algorithm is set to "modularity"

+ NOTE: default for Louvain unidimensional method is set to single-shot *unless* argument "consensus.method" or "consensus.iter" is specified

+ ADD: stricter `*apply` functions that are roughly equivalent to `*apply` but have stricter inputs/outputs (uses `vapply` as foundation; often, slightly faster)

+ ADD: `community.consensus` to apply the Consensus Clustering approach introduced by Lancichnetti & Fortunato (2012). Currently only available for the Louvain algorithm

+ ADD: `community.detection` to apply community detection algorithms as a standalone function

+ ADD: convenience function to convert an {igraph} object to a standard matrix (`igraph2matrix`)

+ ADD: `modularity` to compute standard (absolute values) and signed modularity (implemented in C)

+ ADD: `polychoric.matrix` to compute categorical correlations (implemented in C); handles missing data ("pairwise" or "listwise") as well as empty cells in the joint frequency table (see documentation: `?polychoric.matrix`)

+ ADD: `auto.correlate` now computes all correlations internally and no longer depends on external functions; categorical correlations are C based and bi/polyserial correlations are a simplified and vectorized version of {polycor}'s `polyserial`; substantial computational gains (between 10-25x faster than previous use of {qgraph}'s `cor_auto`)

+ ADD: `network.estimation` to handle all network estimation in {EGAnet}; *includes* Bayesian GGM from {BGGM} for more seamless incorporation of BEGA

+ ADD: `community.unidimensional` to apply different unidimensional community detection approaches; makes unidimensional community detection more modular and flexible

+ ADD: basic (internal) function to handle all network plots to keep changes centralized to a single function; extends flexbility to handle all {GGally}'s `ggnet2` arguments

+ ADD: implemented reproducible parametric bootstrapping and random sampling (see <https://github.com/hfgolino/EGAnet/wiki/Reproducibility-and-PRNG> for more details)

+ ADD: implemented reproducible resampling bootstrapping and random sampling (see <https://github.com/hfgolino/EGAnet/wiki/Reproducibility-and-PRNG> for more details)

+ ADD: reproducible bootstrapping with seed setting that does *not* affect R's seed and RNG (user's seed will not be affected and will not affected bootstrapping seeds)

+ ADD: `community.homogenize` as a core function rather than internal (previously `homogenize.membership`); about 2.5x faster than the original version

+ ADD: `convert2tidygraph` for `ggraph` and `tidygraph` support -- thanks to Dominique Makowski!

+ ADD: "multilevel" plotting support for `hierEGA` (only used when `scores = "network"` since factor scores don't directly align with EGA detected dimensions)

+ ADD: internal functions `shuffle` and `shuffle_replace` to replace `sample` with and without replacement; performed in C and allows seed setting independent of R (about 2-3x faster)

+ ADD: xoshiro256++ PRNG for higher quailty random number generation, permutation, and resampling (~2x faster than `runif` and `sample`); based in C

+ ADD: Ziggurat method for random normal generation over top xoshiro256++ (2-5x faster than `rnorm`); based in C

+ ADD: configural invariance was added to `invariance` (see Details section)

+ ADD: `genTEFI` to compute the Generalized Total Entropy Fit Index solely; `tefi` serves as a general function to compute TEFI for all `*EGA` classes

+ REMOVE: `signed.louvain` until reproducibility can be sorted

+ REMOVE: `methods.section` and `utils-EGAnet.methods.section` to avoid space issues in ./R directory (1MB)

+ UPDATE: `EBICglasso.qgraph` and `TMFG` were optimized; `TMFG` is now 2x faster

+ UPDATE: `TMFG` can now directly estimate a GGM with the argument 'partial = TRUE'; implements the Local-Global Inversion method from Barfuss et al. (2016)

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

+ UPDATE: `EGA.estimate` and `EGA` core functions have been updated for seamless use with more basic functions `network.estimation` and `community.*` functions

+ UPDATE: S3method updates for `EGA.estimate` and `EGA` to provide estimation information

+ UPDATE: `EGA.fit` updated to be compatiable with all updates to `EGA.estimate` (other optimizations were implemented such as direct communtiy detection application and unique solution finding)

+ UPDATE: `tefi` updated with several checks (slightly slower for correlation matrix but much faster with raw data; includes data/matrix checks)

+ UPDATE: `entropyFit` uses more effective vectorization (about 5-7x faster)

+ UPDATE: `Embed` and `glla` made to be more efficient and includes an internal `glla_setup` function to avoid the same matrix calculations for every participant in a sample for `dynEGA`

+ UPDATE: `riEGA` updated to be compatiable with all lower-level updates (slightly faster)

+ UPDATE: `wto` updated to be fully vectorized (about 12x faster)

+ UPDATE: `totalCor` and `totalCorMat` updated to be fully vectorized (about 10x faster)

+ UPDATE: implemented internal `fast.data.frame` for more efficient data frame initialization when all values in data frame are the same

+ UPDATE: `bootEGA` allows flexibility to add any arguments from any `EGA*` functions; much faster due to optimizations across all functions ("resampling" is nearly as fast as "parametric")

+ UPDATE: support for `EGA.fit` and `riEGA` added to `bootEGA` (support for `hierEGA` will be coming soon...)

+ UPDATE: `itemStability` has been updated and runs about 2.5x faster due to `community.homogenize`; S3methods were added; greater flexibility available in plotting but not much support (e.g., error checking) yet

+ UPDATE: `dimensionStability` has been updated and maintains speed gains from `itemStability`

+ UPDATE: `dynEGA.ind.pop` now calls `dynEGA` with `level = c("individual", "population")`; legacy `dynEGA.ind.pop` class is maintained across ergodicity functions

+ UPDATE: `ergoInfo` is about 2x faster

+ UPDATE: `jsd` received several internal functions to expedite procedures in `infoCluster` and `jsd.ergoInfo`

+ UPDATE: `net.loads` now includes 'loading.method' argument to allow for reproducibility with "BRM" implementation (and version 1.2.3); "experimental" implementation includes rotations alternative signs and cross-loading computation (potential future default)

+ UPDATE: `net.scores` is much simpler (internally) and quicker; seamlessly integrates with `net.loads`

+ UPDATE: `compare.EGA.plots` is faster, more flexible, and more reliable for comparing two or more plots

+ UPDATE: `hierEGA` is faster and has new S3 methods

+ UPDATE: S3 plotting for `invariance`

+ UPDATE: `hierEGA` + `bootEGA` integration for `itemStability` and `dimensionStability` (includes full S3 methods)

+ UPDATE: `UVA` supports legacy of inital conception in Christensen, Golino, and Silvia (EJP, 2020) but will no longer fix bugs related to: manual variable selection, "adapt" or "alpha" methods (warnings will be thrown)

+ UPDATE: streamlined `UVA` (about 4x faster); fixed bugs related to reverse coding issues 

+ UPDATE: `tefi` now handles all `EGA*` function objects including `hierEGA` which computes generalized TEFI

+ UPDATE: documentation for all functions have been thoroughly revised to provide better instruction on how to use functions and their expected inputs

+ DEPENDENCY: removed {network} because it is no longer used for plotting; switched {sna} to IMPORTS rather than SUGGESTS

+ DEPENDENCY: removed {rstudioapi} from 'Suggests' because it was used in `colortext` and used in the package

+ DEPENDENCY: removed {matrixcalc} because it was only used for trace of a matrix (own internal function is used)

+ DEPENDENCY: {future} and {future.apply} are used for parallelization (better integration); includes internal function to check for available memory to not break in big data cases

+ DEPENDENCY: {progress} and {progressr} are used for progress bars (in parallelization)

+ DEPENDENCY: removed {psychTools} from 'Suggests' which was only used in examples

+ DEPENDENCY: removed {rmarkdown} from 'Suggests' since it wasn't being used across the package


## Changes in version 1.2.5.1

+ FIX: cross-loading bug in `net.loads` was leading to problems when there were negative cross-loadings

+ FIX: added `psych::factor.scores` scoring methods in `net.scores`

+ ADD: `signed.louvain` to estimate the Signed Louvain algorithm (implemented in C)


## Changes in version 1.2.5

+ ADD: `most_common_tefi` method for `EGA` analyses


## Changes in version 1.2.4

+ REMOVE: `residualEGA` has been removed in favor of `riEGA` (removes {OpenMx} dependency)

+ ADD: rotations to `net.loads` and `net.scores`

+ UPDATE: `hierEGA` only outputs specified output (no longer outputs all possible consensus methods and scores combinations -- should be much faster)


## Changes in version 1.2.3

+ FIX: many bug fixes related to latest update; functions have largely returned to stable status

+ UPDATE: Mac and Linux parallelizations have been optimized

+ UPDATE: documented examples are more efficient for CRAN checks


## Changes in version 1.2.1

+ FIX: `bootEGA` read of bootstrap data (was not calling from `datalist` in `do.call` leading to perfect item stability)

+ FIX: number of possible colors expanded to 70 (increased from 40)


## Changes in version 1.2.0

+ FIX: hex codes used in EGA plots

+ FIX: `ordered = TRUE` for categorical data in *lavaan* CFAs

+ UPDATE: consesnsus clustering is now used with Louvain in `EGA`

+ UPDATE: print/summary S3methods have been standardized

+ ADD/UPDATE: `boot.ergoInfo` has achieved functional working order. Results can be trusted to suggest whether dynamic data possess the ergodic property

+ ADD: information theoretic clustering algorithm for dynamic data is available in `infoCluster`

+ REMOVE: "alpha" and "adapt" options in `UVA` (removes {fitdistrplus} dependency)

+ REMOVE: {qgraph} plots are no longer available

+ ADD: `convert2igraph` is now a core function

+ ADD: Jensen-Shannon Divergence `jsd` for determining (dis)similarity between network strcutures

+ ADD: `riEGA`, `EGA.fit`, and `hierEGA` functionality to `bootEGA`

+ ADD: `hierEGA` functionality to `itemStability` and `dimensionStability`

+ UPDATE: "louvain" algorithm used as default for unidimensionality check in `EGA`

+ INTERNAL: cleaned up `EGA` and `EGA.estimate`; streamlined code; no user facing differences


## Changes in version 1.1.0

+ FIX: CRAN note when `if(class(object))`. Replaced by `if(is(object))`.

+ FIX: bug in `EGA.estimate` when using the TMFG network method. The resulting EGA plot did not have the correct node names.

+ FIX: bug in `UVA` when trying to use sum score (`reduce.method = "sum"`) in automated procedure

+ ADD: measurement `invariance` function for testing differences in network loadings between groups

+ UPDATE: `itemStability` now has a parameter `structure` in which the user can specify a given structure to test its stability.

+ ADD: `riEGA` implementing random-intercept EGA for wording effects

+ ADD: `hierEGA` implementing hierarchical EGA

+ FIX: consensus clustering for the Louvain algorithm

+ ADD: `louvain` algorithm with added optimization option using `tefi`


## Changes in version 1.0.0

+ FIX: bug within the bootEGA function for `type = "resampling"`.

+ UPDATE: default undimensionality adjustment has changed to leading eigenvalue (see Christensen, Garrido, & Golino, 2021 <https://doi.org/10.31234/osf.io/hz89e>). Previous unidimensionality adjustment in versions <= 0.9.8 can be applied using `uni.method = "expand"`

+ UPDATE: default `UVA` was changed `type = "threshold"`

+ UPDATE: `UVA` is now automated using `auto = TRUE`

+ DEFUNCT: `dimStability` will no longer be supported. Instead, use `dimensionStability`

+ REVAMP: `itemStability` has been recoded. Now includes error checking and more readable code

+ FIX: bug for plotting NA communities

+ FIX: bug for changing edge size in 'GGally' plotting

+ UPDATE: S3Methods for `EGA.fit` plotting

+ FIX: plotting parameters for `bootEGA`

+ FIX: redundancy output for adhoc check in `UVA`

+ FIX: latent variable with non-space separated entries in `UVA` (`reduce.method = "latent"`)

+ UPDATE: `UVA` was added to `methods.section`

+ UPDATE: neural network weights in `LCT` (now only tests for factor or small-world network models)

+ UPDATE: citations

+ UPDATE: added `seed` argument for `bootEGA` to reproduce results

+ FIX: bug for Rand index in `itemStability`


## Changes in version 0.9.8

+ UPDATE: Unidimensional check in `EGA` expands a correlation matrix (rather than generating variables; much more efficient)

+ ADD: `color_palette_EGA` New EGA palettes for plotting `ggnet2` EGA network plots (see `?color_palette_EGA`)

+ ADD: `UVA` or Unique Variable Analysis operates as a comprehensive handling of variable redundancy in multivariate data (see `?UVA`)

+ DEFUNCT: `node.redundant`, `node.redundant.names`, and `node.redundant.combine` will be defunct in next version. Please use `UVA`

+ ADD: a new function to compute a parametric Bootstrap Test for the Ergodicity Information Index (see `?boot.ergoInfo`)

+ ADD: basic Shiny functionality (`EGA` only)

+ ADD: a new function to compute a Monte-Carlo Test for the Ergodicity Information Index (see `?mctest.ergoInfo`)

+ ADD: a new function to compute the Ergodicity Information Index (see `?ergoInfo`)

+ UPDATE: new plotting scheme using *network* and *GGally* packages

+ ADD: a function to produce an automated Methods section for several functions (see `?methods.section`)

+ UPDATE: `bootEGA` now implements the updated `EGA` algorithm

+ UPDATE: ega.wmt data (unidimensional)

+ UPDATE: `itemStability` plot defaults ("GGally" color scheme) and examples (manipulating plot)

+ ADD: total correlation (see `?totalCor` and `totalCorMat`)

+ ADD: correlation argument (corr) for `EGA`, `bootEGA`, and `UVA`

+ FIX: *GGally* color palette when more than 9 dimensions


## Changes in version 0.9.7

+ UPDATE: `LCT` neural network weights were updated (parametric relu activation function)

+ FIX: naming in `EGA`

+ FIX: output network matrix in `EGA` when data are input

+ UPDATE: citation version

+ UPDATE: `node.redundant` now provides a full plot of redundancies detected, descriptive statistics including the critical value, central tendency descriptive statistics, and the distribution the significant values were determined from (thanks to Luis Garrido for the suggestion!)


## Changes in version 0.9.6

+ UPDATE: `LCT` updated with neural network implementation


## Changes in version 0.9.5

+ ADD: loadings comparison test function added (see `LCT`)

+ FIX: named community memberships in `itemStability` and `dimStability`

+ UPDATE: `plot`, `print`, and `summary` methods all moved into single .R files (no effect on user's end)

+ UPDATE: `net.scores` global score is improved and computes scores very close to CFA scores

+ FIX: additional argument calls for `EGA.estimate` (and `EGA` by extension)

+ UPDATE: message from `EGA.estimate` (and `EGA` by extension) reports both 'gamma' and 'lambda.min.ratio' arguments

+ FIX: upper quantile output from `bootEGA`

+ FIX: minor bugs in `node.redundant`, `itemStability`, and `net.loads`


## Changes in version 0.9.4

+ MAJOR UPDATE: `dimStability` now computes proportion of exact dimension replications rather than items that replicate within dimension (this latter information can still be found in the output of `itemStability` under $mean.dim.rep)

+ FIX: `net.loads` for when dimensions equal one or the number of nodes in the network

+ FIX: naming typo with characters in `itemStability`

+ FIX: NAs in `dimStability`

+ FIX: weights of network in unidimensional structure of `EGA` are the same as multidimensional structure

+ UPDATE: Added a new function to simulate dynamic factor models `simDFM`

+ UPDATE: added internal functions for `net.loads` (see `utils-net.loads`)

+ FIX: ordering of names in `itemStability`

+ FIX: handling of NA communities in `net.loads`

+ UPDATE: Added output of the average replication of items in each dimension for `itemStability`

+ UPDATE: Revised 'Network Scores' vignette

+ UPDATE: `net.loads` functionality (cleaned up code)

+ UPDATE: S3Methods for `net.loads`

+ FIX: `net.scores` negative loadings corrected


## Changes in version 0.9.3

+ New function and print, summary and plot methods: dynEGA

+ New functions: Embed and glla


## Changes in version 0.9.2

+ UPDATE: add latent variable scores comparison to `net.scores` vignette

+ UPDATE: `node.redundant.combine` sets loadings equal to 1 when there are only two variables when the argument type = "latent"; warning also added from type = "sum"

+ FIX: `node.redundant` alpha types bug

+ updated `itemStability` (bug fixes)

+ updated `node.redundant.combine` (bug fixes, latent variable option)

+ major bug fix in `net.loads`: corrected loadings greater than 1 when there were many negative values

+ added `EGA.estimate` to clean up `EGA` code and allow for future implementations of different network estimation methods and community detection algorithms

+ updated `EGA` functionality: message for 'gamma' value used and `EGA.estimate` compatiability

+ removed *iterators* dependency

+ ordering and name fix in `net.loads`

+ auto-adjusts y-axis label size for `itemStability` plot based on number of nodes or length of node names

+ `net.loads` adjusted for larger values using absolute values and applying the sign afterwards

+ reverse coding update in `net.loads`

+ `node.redundant.combine` bug fix for reverse coding latent variables

+ added Louvain community detection to all EGA functions in *EGAnet*

+ functionality updates to `node.redundant`

+ swapped arguments 'type' and 'method' in the `node.redundant` function (fixed examples in other node.redundant functions)

+ updated citation


## Changes in version 0.9.0

+ updated list of dependencies

+ added ORCiDs in Description file

+ corrected ordering of `net.loads` output

+ corrected standard error in `bootEGA`

+ citation update

+ added function `dimStability` to compute dimensional stability

+ added a series of functions for `node.redundant`, which facilitates detecting and combining redundant nodes in networks

+ updated the EGA.fit function, so now a correlation matrix can be used as well.


## Changes in version 0.8.0

+ 'bootEGA' now computes time until bootstrap is finished

+ new functions 'cmi', 'pmi' and 'residualEGA' added: 'cmi' computes conditional mutual information, 'pmi' computes partial mutual information and residual EGA computes an EGA network controlling for wording effects

+ new dataset 'optimism' added

+ documentation and functionality for several functions updated


## Changes in version 0.7.0

+ fixed 'EGA' bug in 'bootEGA' function; updated 'bootEGA' documentation; added progress messages

+ migrated 'net.scores' and 'net.loads' from 'NetworkToolbox' to 'EGAnet' package

+ functions 'itemConfirm' and 'itemIdent' have been merged into a single function called, 'itemStability'

+ fixed item ordering in 'itemStability' output so dimensions are from least to greatest, the colors match the original community vector input, and updated average standardized network loadings to the 'net.loads' function

+ added datasets 'ega.wmt' and 'boot.wmt' for quick user-friendly examples (also removed all '\donttest')

+ added package help page

+ added package load message

+ updated 'itemStability' algorithm (now can accept any number of 'orig.wc') and enforced '0' to '1' bounds on plot
