Deeper Dives

UVA

Before a network is estimated at all, it’s worth asking whether any items are redundant with one another — measuring such similar content that they behave more like duplicates than distinct variables. UVA (Unique Variable Analysis) checks for exactly this using the weighted topological overlap (wto), and is usually the first step of an EGA workflow (see the full EGA workflow for how it fits alongside EGA and bootEGA). This workflow looks at UVA on its own, in more depth.

We’ll use the depression dataset: item-level responses to the Beck Depression Inventory (BDI), Beck Anxiety Inventory (BAI), and Athens Insomnia Scale (Insomnia) — three related but conceptually distinct symptom checklists that are exactly the kind of self-report items where redundant wording tends to creep in.

# Load {EGAnet}
library(EGAnet)

# Obtain item-level columns from the three scales
items <- grep("^BDI[0-9]+$|^BAI[0-9]+$|^Insomnia[0-9]+$", colnames(depression), value = TRUE)
dep_items <- depression[, items]

Checking for Redundancy

dep_uva <- UVA(data = dep_items)

# Print results
dep_uva
Variable pairs with wTO > 0.30 (large-to-very large redundancy)

    node_i    node_j   wto
 Insomnia4 Insomnia5 0.359
     BAI12     BAI13 0.307

----

Variable pairs with wTO > 0.25 (moderate-to-large redundancy)

 node_i node_j  wto
  BAI11  BAI15 0.26

----

Variable pairs with wTO > 0.20 (small-to-moderate redundancy)

    node_i    node_j   wto
 Insomnia2 Insomnia3 0.227
     BDI18     BDI19 0.212
      BAI5     BAI16 0.201
     BAI20     BAI21 0.200

UVA flags three tiers of overlap. At the top, Insomnia4Insomnia5 (wTO = 0.359) and BAI12BAI13 (wTO = 0.307) clear the “large-to-very large” band; BAI11BAI15 (wTO = 0.26) clears “moderate-to-large.” A handful of other pairs sit just below the default 0.25 cut-off and are left alone. All three come from within a single scale rather than across scales — which makes sense, since items written to tap the same construct are the ones most likely to end up saying the same thing twice.

Resolving Redundancy

By default, UVA automatically reduces the data: for each redundant doublet, it keeps whichever variable has the lower maximum wto to everything else, and removes the other.

dep_uva$keep_remove
$keep
[1] "BAI13"     "BAI15"     "Insomnia4"

$remove
[1] "BAI11"     "BAI12"     "Insomnia5"

BAI11, BAI12, and Insomnia5 are dropped; BAI13, BAI15, and Insomnia4 are kept in their place. Note that this is a statement about redundancy, not quality — the removed item isn’t a worse question, it’s just carrying information that its partner already captures. The reduced data is available directly from the output:

dim(dep_uva$reduced_data)
[1] 574  47

47 items remain, down from the original 50. This reduced set — not the original 50 items — is what should move forward into EGA: estimating a network on data with unresolved redundancy risks pulling near-duplicate items into their own artificial “wastebasket” community that reflects shared wording rather than a real dimension.