Network Psychometrics in R

Estimating dimensionality
in multivariate data with network models.

EGAnet represents a set of measured variables as a network and estimates how many dimensions organize it. The package is built around reproducible code and visualizations suitable for publication.

> install.packages("EGAnet")
> library(EGAnet)
community.detection() · fig. 1

On CRAN and GitHub

CRAN downloads, total CRAN downloads, per month GitHub stars

The function map

Functions, organized by workflow stage.

From raw items to a finished network model, every stage of the EGA workflow is its own set of composable functions.

EGA Functions

EGA() · bootEGA() · dynEGA() · hierEGA() · riEGA()

Psychometric Functions

itemStability() · invariance() · net.loads() · UVA() · CFA()

EGM Functions

simEGM() — simulate from the Exploratory Graph Model

Information Theory

tefi() · entropyFit() · ergoInfo() · totalCor()

Version 2.5.0

What changed in this release.

UPDATE

node.shape (and its shape shortcut) now actually changes the node shape, instead of being validated but silently ignored in favor of a hardcoded solid-circle-with-hollow-border look. The same solid-inside/hollow-border style is preserved for any shape with a matching base R "hollow" pch counterpart (e.g., node.shape = 15 draws solid squares with hollow-square borders), and the default (node.shape = 19) renders identically to before. The five "fillable" pch codes (21:25) use their own built-in fill + border instead. The legend keys also now match each community's actual node shape (previously always a circle, regardless of node.shape)

FIX

label was colliding with ggnet2's own, differently-behaved native label argument, since {EGAnet}'s network plot.* methods now forward the full ggnet2 argument set. This caused custom node text passed via label to be drawn as a second, overlapping text layer on top of the original node names (rather than replacing them). ggnet2's own label mechanism is now always disabled in favor of {EGAnet}'s own label layer, and passing label directly now raises an informative warning pointing to node.label (the correct argument for custom node text) and label.size = 0 (to remove labels) instead of silently doing the wrong thing. label is intentionally *not* turned into an automatic shortcut for node.label, since composite plots (bootEGA, hierEGA, invariance, dynEGA.Group/.Individual, compare.EGA.plots) also forward arguments to ggpubr::ggarrange, which has its own unrelated labels (plural) argument for panel captions -- label vs. labels would be an easy typo to make and miss