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, orSTRONG REVIEW, neverDELETE. The references live innomo_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, andSTRONG REVIEWfor loadings;info,review, andconcernfor 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
psychorlavaanobject (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
- From item audit to exploratory structure — screening, factor retention, and EFA.
- From CFA to a defensible measurement model — confirmatory fit, reliability, and convergent and discriminant evidence.
- Measurement invariance — comparability across groups, localized strain, and researcher-controlled partial invariance.
- Theory-specified nomological networks — predictions, equivalence regions, and replication.
- Guided workflow — the stages combined with explicit decisions.
-
From content review to empirical
screening — the items a
contentvalidRreview carried forward, screened, including where the two stages disagree. - 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},
#> }