Skip to contents

Who nomologR is for

nomologR is written for three audiences:

  • graduate students (master’s and doctoral) who are learning scale development and construct validation and need to understand why each analysis is performed, not only how to run it;
  • faculty and advisors who teach measurement and want output that explains its own reasoning; and
  • researchers who need a defensible, reproducible record of how a measure was evaluated.

The package coordinates established engines — psych, EFAtools, lavaan, and semTools — and adds a teaching layer: diagnostics framed as evidence, explanations tied to the methodological literature, and a record of every consequential researcher decision.

The question behind every stage

At each step, nomologR tries to help answer one question:

What does this result tell me about the claim that these observations measure the construct I say they measure, and what should I investigate next?

The package flags, explains, and documents. It never silently deletes items, respecifies models, or declares a scale “valid.”

The workflow at a glance

Stage Question it answers Functions Walkthrough
1. Item and data audit What do the items and responses look like? nomo_screen() From item audit to exploratory structure
2. Dimensionality How many latent dimensions deserve investigation? nomo_factors() From item audit to exploratory structure
3. Exploratory structure What does a requested factor solution look like? nomo_efa() From item audit to exploratory structure
4. Confirmatory measurement model Does a prespecified model reproduce the data, and where is there strain? nomo_model(), nomo_split(), nomo_cfa() From CFA to a defensible measurement model
5. Reliability and construct-validity evidence How precise are scores, and are constructs distinguishable? nomo_reliability(), nomo_validity() From CFA to a defensible measurement model
6. Generalizability Is the construct measured comparably across groups? nomo_invariance(), nomo_partial() Measurement invariance
7. Nomological network Does the construct relate to others as theory predicted? nomo_hypotheses(), nomo_network() Theory-specified nomological networks
Guided workflow How do the stages fit together with explicit decisions? nomo_run() Guided workflow
Starting from content review What does empirical evidence add to an expert review of the items? nomo_screen() and nomo_run() with a contentvalidR handoff From content review to empirical screening
Reporting How do I archive the evidence and decisions? nomo_report(), nomo_table() Archiving a workflow

Teaching datasets

The examples and walkthroughs use simulated datasets whose population models are documented. Because the truth is known, you can check what the package reports against what actually generated the data — something real data never allow.

Dataset Design What it teaches
nomo_demo_continuous Two correlated factors, five candidate items each, 500 cases A cross-loading item (a5), a weak item (b5), and a small amount of missing data
nomo_demo_ordinal The same latent responses cut into five ordered categories Polychoric correlations, WLSMV estimation, and ordinal reliability
nomo_demo_network Three constructs, an observed outcome, two administration groups, 800 cases Theory-specified predictions, equivalence regions, replication, and a known source of scalar non-invariance
nomo_demo_walkthrough Twelve items an expert panel reviewed in contentvalidR, two facets, two cohorts, 400 cases Items that pass content review and fail empirically, and the reverse; reverse-worded items; a cohort difference

See ?nomo_demo_continuous, ?nomo_demo_ordinal, ?nomo_demo_network, and ?nomo_demo_walkthrough for the full population models.

A first look

An item audit describes the data without changing it:

scr <- nomo_screen(nomo_demo_continuous)
scr
#> <nomo_screen> Item and data audit
#> Cases: 500 | Candidate items: 10
#> Items with missing responses: 2 | Constant: 0 | All missing: 0
#> Relationship diagnostics: 10 eligible items | 10 item-rest estimates
#> Response concentration flags: 0 | Near-zero variance: 0
#> Decision log: 3 info, 1 review, 0 concern
#> No rows or items were removed or modified.

Factor-retention evidence triangulates several criteria rather than trusting a single rule:

fac <- nomo_factors(nomo_demo_continuous, seed = 2026)
fac
#> <nomo_factors> Factor-retention evidence
#> Cases: 500 | Items: 10 | Correlation: pearson
#> Criterion set: core | Available methods: 3 | Families: 2 | Skipped: 1
#> Parallel analysis (percentile): 2 | MAP TR2/TR4: 2/2 | KMO: 0.874
#> All 2 available criterion families (3 methods) point to 2 factors. Related
#> methods within a family are grouped before concordance is summarized; this is
#> strong converging evidence for investigating that solution, not proof of
#> dimensionality. 1 requested method was not evaluated; see criterion status for
#> the documented reason.

The population model for these data has two factors, and the retention evidence points to investigating two. Notice the wording: the evidence supports investigating a two-factor solution; it does not prove that the scale “has” two factors.

How to read nomologR output

  • Observation, reason, options, consequence. Recommendations state what was found, why it may matter, what defensible choices exist, and what each choice changes downstream.
  • Reference values are prompts, not verdicts. Familiar numbers such as a loading of .40 or a CFI of .95 flag evidence for review. Items receive KEEP, REVIEW, or STRONG REVIEW, never DELETE. The references live in nomo_defaults(), and changing them is a visible researcher choice.
  • One flag wording on screen. Printed output, plots, and reports use one flag wording: “review”, then “concern”, and no flag when no reference fired (a plot legend calls that “none”). The returned tables keep each analysis’s own values (KEEP, REVIEW, and STRONG REVIEW for loadings; info, review, and concern for evidence), so code that filters on them is unaffected.
  • Historical methods are labeled. Techniques you will meet in published work — eigenvalues greater than one, coefficient alpha, the Fornell–Larcker comparison — are shown as context where useful, qualified, and kept separate from contemporary evidence.
  • Engine results are never hidden. Every result keeps the underlying psych or lavaan object (usually in $fit) for direct inspection.
  • Decisions are recorded. Each result carries a decision log, and nomo_run() records the researcher’s decisions and rationales across stages.

A suggested learning path

  1. From item audit to exploratory structure — screening, factor retention, and EFA.
  2. From CFA to a defensible measurement model — confirmatory fit, reliability, and convergent and discriminant evidence.
  3. Measurement invariance — comparability across groups, localized strain, and researcher-controlled partial invariance.
  4. Theory-specified nomological networks — predictions, equivalence regions, and replication.
  5. Guided workflow — the stages combined with explicit decisions.
  6. From content review to empirical screening — the items a contentvalidR review carried forward, screened, including where the two stages disagree.
  7. Archiving a workflow — a reproducible report.

Throughout, the research basis article explains where each method came from, what the contemporary literature recommends, and what nomologR implements. Every function’s help page lists its references.

Where nomologR is heading

The next release, v1.0.0, is planned together with contentvalidR, which covers the content-review stage before this package’s. At 1.0.0 both packages’ interfaces become stable, and the handoff between them becomes a supported contract. Larger extensions, such as ESEM, IRT, and longitudinal invariance, are candidates for later 1.x releases. See the roadmap and the v1.0.0 milestone.

Citing nomologR

citation("nomologR")
#> To cite nomologR in publications, please use:
#> 
#>   Uhalt J (2026). _nomologR: Guided Scale Development and Construct
#>   Validation_. R package version 0.9.0,
#>   <https://github.com/JUhalt/nomologR>.
#> 
#> A BibTeX entry for LaTeX users is
#> 
#>   @Manual{,
#>     title = {nomologR: Guided Scale Development and Construct Validation},
#>     author = {Joshua Uhalt},
#>     year = {2026},
#>     note = {R package version 0.9.0},
#>     url = {https://github.com/JUhalt/nomologR},
#>   }