Skip to contents

nomo_run() is an orchestrator, not an automatic scale-decider.

Its job is to make the staged workflow easier to reproduce while preserving the package’s central rule:

Evidence may flow automatically. Consequential decisions do not.

This walkthrough uses nomo_demo_network, a simulated validation study with three constructs (Agency, Persistence, and Social desirability), an observed Performance outcome, and two administration groups. See ?nomo_demo_network.

A fresh run

scales <- list(
  Agency = c("ag1", "ag2", "ag3", "ag4"),
  Persistence = c("pe1", "pe2", "pe3", "pe4"),
  SocialDesirability = c("sd1", "sd2", "sd3")
)

run <- nomo_run(
  data = nomo_demo_network,
  scales = scales,
  settings = list(factors = list(seed = 2026))
)

run
#> <nomo_run> Guided workflow
#> Status: PAUSED | Mode: teaching | Sample design: same sample
#> Exploratory N = 800 | Confirmatory N = 800 | Scales: 3
#> Completed: screen -> factors | Next: efa
#> 
#> Key evidence
#>   - Item audit: 11 items; flags: none
#>   - Parallel analysis suggests: Agency 1, Persistence 1, SocialDesirability 1
#> 
#> Researcher decision required: efa (Agency, Persistence, SocialDesirability)
#>   Reason: The EFA factor count changes the fitted model. Retention evidence
#>   can inform that choice, but it does not authorize the pipeline to choose for
#>   the researcher.
#>   Options: Inspect the full `nomo_factors` result, compare plausible
#>   neighboring solutions when appropriate, and supply a positive integer for
#>   each scale.
#>   Consequence: No EFA is fitted until an explicit researcher factor-count
#>   decision is supplied.
#>   - Agency: Parallel analysis currently suggests 1 factor; the retained
#>     plausible set is 1. The pipeline has not adopted a factor count.
#>   - Persistence: Parallel analysis currently suggests 1 factor; the retained
#>     plausible set is 1. The pipeline has not adopted a factor count.
#>   - SocialDesirability: Parallel analysis currently suggests 1 factor; the
#>     retained plausible set is 1. The pipeline has not adopted a factor count.
#>   Example: decisions = list(factor_count = c(Agency = <integer>, Persistence =
#>   <integer>, SocialDesirability = <integer>))
#> 
#> No later stage has been run automatically while this consequential decision is
#> unresolved.

The initial run audits each scale’s items and computes factor-retention evidence. It then pauses before EFA. The factor count is not silently copied from parallel analysis.

nomo_table(run, "requests")
#> # A tibble: 3 × 8
#>   id                  stage scope observation reason options consequence example
#>   <chr>               <chr> <chr> <chr>       <chr>  <chr>   <chr>       <chr>  
#> 1 factor_count:Agency efa   Agen… Parallel a… The E… Inspec… No EFA is … decisi…
#> 2 factor_count:Persi… efa   Pers… Parallel a… The E… Inspec… No EFA is … decisi…
#> 3 factor_count:Socia… efa   Soci… Parallel a… The E… Inspec… No EFA is … decisi…

Each decision request separates:

  • Observation — what the evidence shows;
  • Reason — why a researcher decision is required;
  • Options — what can defensibly happen next;
  • Consequence — what the choice changes.

Resume with an explicit factor count

run <- nomo_run(
  resume = run,
  decisions = list(
    factor_count = list(
      value = c(Agency = 1, Persistence = 1, SocialDesirability = 1),
      rationale = paste(
        "Each scale was written to measure one construct, and the",
        "retention evidence was reviewed before choosing one factor."
      )
    )
  )
)

run
#> <nomo_run> Guided workflow
#> Status: PAUSED | Mode: teaching | Sample design: same sample
#> Exploratory N = 800 | Confirmatory N = 800 | Scales: 3
#> Completed: screen -> factors -> efa | Next: cfa
#> 
#> Key evidence
#>   - Item audit: 11 items; flags: none
#>   - Parallel analysis suggests: Agency 1, Persistence 1, SocialDesirability 1
#>   - EFA item flags: none
#> 
#> Researcher decision required: cfa (measurement_model)
#>   Reason: CFA syntax encodes consequential choices about item retention,
#>   factor membership, cross-loadings, and correlated residuals; these cannot be
#>   chosen silently.
#>   Options: Inspect the EFA evidence and theory, then supply a prespecified
#>   lavaan measurement model (or `nomo_model()` object).
#>   Consequence: The CFA will use the same sample unless a new workflow is
#>   started with a holdout/external design. Same-sample confirmation must remain
#>   labeled as such.
#>   - measurement_model: EFA has completed for every supplied scale. No
#>     confirmatory measurement model has been constructed or fitted.
#>   Example: decisions = list(cfa_model = list(value = model, rationale =
#>   "Prespecified measurement model"))
#> 
#> No later stage has been run automatically while this consequential decision is
#> unresolved.

The completed screening and factor-retention objects are reused. EFA is fitted using the explicit factor-count decision, with the retention stage’s correlation and modeling context retained. The workflow then pauses before CFA model specification.

Confirmatory model handoff

run <- nomo_run(
  resume = run,
  decisions = list(
    cfa_model = list(
      value = nomo_model(scales),
      rationale = "Prespecified three-construct measurement model."
    )
  )
)

run
#> <nomo_run> Guided workflow
#> Status: PAUSED | Mode: teaching | Sample design: same sample
#> Exploratory N = 800 | Confirmatory N = 800 | Scales: 3
#> Completed: screen -> factors -> efa -> cfa -> reliability -> validity
#> Next: measurement_review
#> 
#> Key evidence
#>   - Item audit: 11 items; flags: none
#>   - Parallel analysis suggests: Agency 1, Persistence 1, SocialDesirability 1
#>   - EFA item flags: none
#>   - CFA: CFI 0.996, RMSEA 0.020, SRMR 0.021; loading flags: none
#>   - Reliability: omega 0.729 to 0.849
#>   - Validity: convergent flags 1 review, 0 concern; separation flags none
#> 
#> Researcher decision required: measurement_review (measurement_model)
#>   Reason: Invariance and nomological-network interpretations inherit the
#>   measurement model. Continuing downstream is therefore a researcher decision,
#>   not a fit-index side effect.
#>   Options: Choose `proceed` to retain this prespecified model for configured
#>   downstream branches, or choose `revise` to stop here and continue with
#>   `nomo_revise()`, which records a substantively justified revised model and
#>   keeps this workflow as its parent.
#>   Consequence: Proceeding does not declare the model valid and does not remove
#>   any review flags. Revising triggers no automatic parameter freeing, item
#>   deletion, or respecification.
#>   - measurement_model: CFA converged and reliability/validity evidence was
#>     computed. Across these components, 0 concern and 1 review log entries are
#>     retained.
#>   Example: decisions = list(measurement_model = list(value = "proceed",
#>   rationale = "Evidence reviewed; model retained for the planned analyses."))
#> 
#> No later stage has been run automatically while this consequential decision is
#> unresolved.

nomo_run() does not translate the EFA into CFA syntax. The researcher owns the confirmatory model; nomo_model() simply writes the simple-structure syntax for the scales that were already declared.

Once supplied, the pipeline computes:

nomo_cfa()
  |
  +-- nomo_reliability()
  |
  +-- nomo_validity()

and pauses again.

Why pause after measurement evidence?

A model can converge and still contain evidence that deserves review. Reliability or AVE can look strong while construct separation or local CFA evidence remains strained. Therefore the pipeline does not automatically carry the model into invariance or structural theory tests.

nomo_table(run, "requests")
#> # A tibble: 1 × 8
#>   id                stage   scope observation reason options consequence example
#>   <chr>             <chr>   <chr> <chr>       <chr>  <chr>   <chr>       <chr>  
#> 1 measurement_model measur… meas… CFA conver… Invar… Choose… Proceeding… "decis…

The researcher chooses either measurement_model = "proceed" or measurement_model = "revise". Choosing revise does not trigger an automated modification-index search, parameter freeing, or item deletion; the current workflow remains an auditable record. To carry a revision forward with its reasoning attached, use nomo_revise(), shown in Revising with a recorded lineage below.

Optional invariance and network branches

Future-stage settings can be added at a pause without recomputing completed stages.

h <- nomo_hypotheses(
  "Agency -> Persistence" = positive(min = .20),
  "Agency <-> SocialDesirability" = negligible(within = c(-.15, .15)),
  "Agency -> Performance" = positive()
)

run <- nomo_run(
  resume = run,
  settings = list(
    invariance = list(
      group = "group",
      levels = c("configural", "metric", "scalar"),
      localize = TRUE
    ),
    network = list(
      hypotheses = h
    )
  )
)

Then continue explicitly:

run <- nomo_run(
  resume = run,
  decisions = list(
    measurement_model = list(
      value = "proceed",
      rationale = "Measurement evidence reviewed before planned downstream tests."
    )
  )
)

run
#> <nomo_run> Guided workflow
#> Status: COMPLETE | Mode: teaching | Sample design: same sample
#> Exploratory N = 800 | Confirmatory N = 800 | Scales: 3
#> Completed: screen -> factors -> efa -> cfa -> reliability -> validity ->
#>   invariance -> network
#> Next: none
#> 
#> Key evidence
#>   - Item audit: 11 items; flags: none
#>   - Parallel analysis suggests: Agency 1, Persistence 1, SocialDesirability 1
#>   - EFA item flags: none
#>   - CFA: CFI 0.996, RMSEA 0.020, SRMR 0.021; loading flags: none
#>   - Reliability: omega 0.729 to 0.849
#>   - Validity: convergent flags 1 review, 0 concern; separation flags none
#>   - Invariance: completed configural -> metric -> scalar
#>   - Network: 3 hypotheses; 3 concordant
#> 
#> All requested stages are complete or explicitly marked not requested. No
#> hidden item deletion, model respecification, parameter freeing, or validity
#> verdict was performed. summary(x) shows the stages and decisions, and
#> nomo_report(x) archives the evidence.
nomo_table(run, "stages")
#> # A tibble: 8 × 3
#>   stage       status    detail                                                  
#>   <chr>       <chr>     <chr>                                                   
#> 1 screen      completed Candidate items audited exactly as supplied; no data or…
#> 2 factors     completed Factor-retention evidence computed; no factor count was…
#> 3 efa         completed EFA fitted using explicit researcher factor-count decis…
#> 4 cfa         completed Researcher-specified CFA estimated; the model was not r…
#> 5 reliability completed Reliability evidence computed from the retained CFA mod…
#> 6 validity    completed Convergent/discriminant evidence computed; no valid/inv…
#> 7 invariance  completed Requested invariance evidence computed; diagnostics did…
#> 8 network     completed Theory-specified network evidence computed without a on…

The completed component objects remain available for direct inspection:

nomo_table(run$results$invariance, "fit")[, c("level", "cfi", "rmsea", "delta_cfi")]
#> # A tibble: 3 × 4
#>   level        cfi  rmsea delta_cfi
#>   <chr>      <dbl>  <dbl>     <dbl>
#> 1 configural 0.995 0.0205  NA      
#> 2 metric     0.993 0.0233  -0.00195
#> 3 scalar     0.974 0.0442  -0.0193

nomo_table(run$results$network, "hypotheses")[, c(
  "relation", "estimate", "ci_lower", "ci_upper", "concordance"
)]
#> # A tibble: 3 × 5
#>   relation                      estimate ci_lower ci_upper concordance
#>   <chr>                            <dbl>    <dbl>    <dbl> <chr>      
#> 1 Agency -> Persistence          0.458     0.389    0.526  concordant 
#> 2 Agency <-> SocialDesirability  0.00773  -0.0794   0.0948 concordant 
#> 3 Agency -> Performance          0.389     0.325    0.454  concordant

The invariance branch retains its diagnostics without automatically releasing constraints (see Measurement invariance for the ag3 intercept). The network branch uses explicit hypotheses and does not create a single nomological-validity score.

Prespecified one-call workflow

Researchers who have already made the consequential decisions — for example in a preregistration — can supply them together. mode = "research" gives a more compact presentation of the same statistical behavior:

run_prespecified <- nomo_run(
  data = nomo_demo_network,
  scales = scales,
  mode = "research",
  decisions = list(
    factor_count = c(Agency = 1, Persistence = 1, SocialDesirability = 1),
    cfa_model = nomo_model(scales),
    measurement_model = "proceed"
  ),
  settings = list(
    factors = list(seed = 2026),
    network = list(hypotheses = h)
  )
)

run_prespecified
#> <nomo_run> Guided workflow
#> Status: COMPLETE | Mode: research | Sample design: same sample
#> Exploratory N = 800 | Confirmatory N = 800 | Scales: 3
#> Completed: screen -> factors -> efa -> cfa -> reliability -> validity ->
#>   network
#> Next: none
#> 
#> Key evidence
#>   - Item audit: 11 items; flags: none
#>   - Parallel analysis suggests: Agency 1, Persistence 1, SocialDesirability 1
#>   - EFA item flags: none
#>   - CFA: CFI 0.996, RMSEA 0.020, SRMR 0.021; loading flags: none
#>   - Reliability: omega 0.729 to 0.849
#>   - Validity: convergent flags 1 review, 0 concern; separation flags none
#>   - Network: 3 hypotheses; 3 concordant
#> 
#> Requested workflow complete. summary(x) shows the stages and decisions;
#> nomo_table(x, "recipe") maps the components.

This is still not hidden automation: every consequential decision was explicit before the run began.

Revising with a recorded lineage

Suppose the measurement evidence prompts a change. nomo_revise() creates a child workflow that keeps the parent as its documented ancestor, instead of starting an unrelated run:

revised <- nomo_revise(
  run,
  cfa_model = paste(
    "Agency =~ ag1 + ag2 + ag3 + ag4",
    "Persistence =~ pe1 + pe2 + pe3 + pe4",
    "SocialDesirability =~ sd1 + sd2 + sd3",
    "ag1 ~~ ag2",
    sep = "\n"
  ),
  rationale = paste(
    "Items ag1 and ag2 use nearly identical wording, so their residual",
    "association plausibly exceeds what the common factor explains."
  ),
  origin = "post_hoc"
)

revised
#> <nomo_run> Guided workflow
#> Status: PAUSED | Mode: teaching | Sample design: same sample
#> Exploratory N = 800 | Confirmatory N = 800 | Scales: 3
#> Completed: screen -> factors -> efa -> cfa -> reliability -> validity
#> Next: measurement_review
#> Revisions: 1 (post-hoc); see nomo_table(x, "lineage")
#> 
#> Key evidence
#>   - Item audit: 11 items; flags: none
#>   - Parallel analysis suggests: Agency 1, Persistence 1, SocialDesirability 1
#>   - EFA item flags: none
#>   - CFA: CFI 0.995, RMSEA 0.021, SRMR 0.021; loading flags: none
#>   - Reliability: omega 0.729 to 0.848
#>   - Validity: convergent flags 1 review, 0 concern; separation flags none
#> 
#> Researcher decision required: measurement_review (measurement_model)
#>   Reason: Invariance and nomological-network interpretations inherit the
#>   measurement model. Continuing downstream is therefore a researcher decision,
#>   not a fit-index side effect.
#>   Options: Choose `proceed` to retain this prespecified model for configured
#>   downstream branches, or choose `revise` to stop here and continue with
#>   `nomo_revise()`, which records a substantively justified revised model and
#>   keeps this workflow as its parent.
#>   Consequence: Proceeding does not declare the model valid and does not remove
#>   any review flags. Revising triggers no automatic parameter freeing, item
#>   deletion, or respecification.
#>   - measurement_model: CFA converged and reliability/validity evidence was
#>     computed. Across these components, 0 concern and 1 review log entries are
#>     retained.
#>   Example: decisions = list(measurement_model = list(value = "proceed",
#>   rationale = "Evidence reviewed; model retained for the planned analyses."))
#> 
#> No later stage has been run automatically while this consequential decision is
#> unresolved.

The child reruns the staged evidence with the revised model and pauses at the measurement review, so the revised evidence is inspected before any downstream branch runs. The parent object is unchanged and remains a complete record.

nomo_table(revised, "lineage")[, c(
  "revision", "change_type", "origin", "rationale", "comparison"
)]
#> # A tibble: 1 × 5
#>   revision change_type origin   rationale                             comparison
#>      <int> <chr>       <chr>    <chr>                                 <chr>     
#> 1        1 model       post_hoc Items ag1 and ag2 use nearly identic… Chi-Squar…

Because a revision is a claim that one model is preferable to another, nomo_revise() compares them with nomo_compare():

nomo_table(revised$revision_comparison, "comparisons")[, c(
  "model", "relation", "chisq_diff", "df_diff", "p_value", "delta_cfi"
)]
#> # A tibble: 1 × 6
#>   model   relation         chisq_diff df_diff p_value delta_cfi
#>   <chr>   <chr>                 <dbl>   <dbl>   <dbl>     <dbl>
#> 1 revised less_constrained     0.0105       1   0.918 -0.000333

Here the revision changes almost nothing (chi-square difference = 0.01, df = 1, p = 0.918; CFI changes by -0.0003). Once the common factor is accounted for, the residual association these two items were expected to share is close to zero, so the data give no reason to prefer the revised model over its parent. A revision is not automatically an improvement, and nomo_revise() does not choose: it records the attempt, its rationale, and the comparison, so keeping the parent model is as visible as adopting the revision.

The origin still matters. The change was prompted by inspecting these data, so the decision log records it as post hoc and says what follows from that:

cat(rev_log$consequence)
#> This revision was prompted by results, so it is recorded as post hoc. Data-driven respecification capitalizes on chance. The revision is evaluated on the same sample that motivated it. Confirm the revised model in independent data, for example with `nomo_split()` or a new sample.

Revisions chain. A revision of revised would carry two lineage rows, so the full path from the original model to the reported one stays visible in nomo_table(x, "lineage") and in the report’s revision-lineage section.

Starting from content review

Scale development begins before response data exist. The companion package contentvalidR handles content review: expert relevance panels, item sorts, and Delphi rounds. It ends in a handoff, which records the items carried forward, each held-back item with its reasons, and the rule that made each decision. nomologR takes the handoff itself, not a copied list of item names, so the reasons travel with the items.

The joint walkthrough for the two packages, One item set, both stages, follows one item set from content review in contentvalidR through this workflow.

In contentvalidR, a handoff is made from a fitted review. The chunk below is shown, not run:

fit <- contentvalidR::sort_validity(sorts)
handoff <- contentvalidR::content_handoff(
  fit,
  reverse_keyed = c("EF2", "TF2"),
  response_scale = c(1, 5)
)

nomologR does not depend on contentvalidR. This package ships the handoff that contentvalidR 0.7.0 produces for its walkthrough item sort, so the rest of this section runs without it:

handoff <- readRDS(
  system.file("extdata", "content-handoff-walkthrough.rds", package = "nomologR")
)
handoff$items
#>  [1] "EF1" "EF2" "EF3" "EF4" "EF6" "TF1" "TF2" "TF3" "TF4" "TF6"

Responses to those items, simulated here, with EF2 and TF2 worded in reverse:

set.seed(46)
n <- 400
ef <- rnorm(n)
tf <- 0.4 * ef + sqrt(1 - 0.4^2) * rnorm(n)
likert <- function(f) pmin(5, pmax(1, round(3 + 0.8 * f + rnorm(n, sd = 0.8))))
responses <- data.frame(
  sapply(paste0("EF", 1:6), function(i) likert(ef)),
  sapply(paste0("TF", 1:6), function(i) likert(tf))
)
responses$EF2 <- 6 - responses$EF2
responses$TF2 <- 6 - responses$TF2

Passing the handoff as items screens only the carried items:

screened <- nomo_screen(responses, items = handoff, effort = TRUE)
screened$items
#>  [1] "EF1" "EF2" "EF3" "EF4" "EF6" "TF1" "TF2" "TF3" "TF4" "TF6"

review_log <- nomo_table(screened, "decision_log")
cat(review_log$observation[review_log$object %in% c("content_review", "EF5", "TF5")],
    sep = "\n")
#> Items and their construct membership came from content review in contentvalidR 0.7.0 (workflow: item-sort; carry rule: Supported; method: Anderson-Gerbing Psa/Csv with Howard-Melloy exact inference), not from these data.
#> 10 of 12 reviewed items were carried and 2 held back. Status counts: Review 2, Supported 10.
#> EF5 was held back by content review: status "Review", recommendation "Review".
#> TF5 was held back by content review: status "Review", recommendation "Review".
#> Content review declared reverse-keyed item(s) EF2, TF2, on a 1 to 5 response scale.

EF5 and TF5 were held back by the item sort. They are not analyzed, and nothing here reinstates them. The log quotes their status and recommendation in contentvalidR’s own words. The keying declared at content review reached the careless-responding indices without being retyped. An item is never treated as forward keyed because keying was undeclared, and a response scale is never inferred from the data.

Passed as scales, the handoff defines a guided run. Its design log records that the item membership came from content review, not from these data:

run_reviewed <- nomo_run(
  responses,
  scales = handoff,
  settings = list(factors = list(seed = 46))
)
run_reviewed$scales
#> $EF
#> [1] "EF1" "EF2" "EF3" "EF4" "EF6"
#> 
#> $TF
#> [1] "TF1" "TF2" "TF3" "TF4" "TF6"

design <- run_reviewed$decision_log
design[design$source == "content_review", c("id", "scope")]
#> # A tibble: 5 × 2
#>   id                  scope 
#>   <chr>               <chr> 
#> 1 content_review      scales
#> 2 held_back:EF5       EF    
#> 3 held_back:TF5       TF    
#> 4 scale_definition:EF EF    
#> 5 scale_definition:TF TF

A report from this run opens with a content-review section, so the archive starts where the validity argument starts.

Some reviews have no construct mapping, such as an expert relevance panel rating a single item set. A handoff from one of those can be screened, but a guided run refuses it. The run needs scales, and nomologR does not invent construct membership. A handoff from a later contentvalidR release, with a schema version this release does not read, is refused with both package versions named.

Reproducibility and provenance

nomo_table(run, "decisions")
#> # A tibble: 10 × 10
#>    id      stage scope observation reason options consequence decision rationale
#>    <chr>   <chr> <chr> <chr>       <chr>  <chr>   <chr>       <chr>    <chr>    
#>  1 sample… desi… samp… 800 rows a… Sampl… Contin… Later CFA … "same_s… ""       
#>  2 scale_… desi… Agen… Scale `Age… Item … Review… Screening,… "ag1, a… ""       
#>  3 scale_… desi… Pers… Scale `Per… Item … Review… Screening,… "pe1, p… ""       
#>  4 scale_… desi… Soci… Scale `Soc… Item … Review… Screening,… "sd1, s… ""       
#>  5 factor… efa   Agen… Parallel a… The E… Inspec… A 1-factor… "1"      "Each sc…
#>  6 factor… efa   Pers… Parallel a… The E… Inspec… A 1-factor… "1"      "Each sc…
#>  7 factor… efa   Soci… Parallel a… The E… Inspec… A 1-factor… "1"      "Each sc…
#>  8 cfa_mo… cfa   meas… EFA has co… CFA s… Inspec… The CFA wi… "Agency… "Prespec…
#>  9 measur… meas… meas… CFA conver… Invar… Choose… Proceeding… "procee… "Measure…
#> 10 workfl… work… pipe… All reques… The p… Inspec… No additio… "comple… ""       
#> # ℹ 1 more variable: source <chr>
nomo_table(run, "settings")
#> # A tibble: 8 × 3
#>   stage       configured setting_names            
#>   <chr>       <lgl>      <chr>                    
#> 1 screen      FALSE      ""                       
#> 2 factors     TRUE       "seed"                   
#> 3 efa         FALSE      ""                       
#> 4 cfa         FALSE      ""                       
#> 5 reliability FALSE      ""                       
#> 6 validity    FALSE      ""                       
#> 7 invariance  TRUE       "group, levels, localize"
#> 8 network     TRUE       "hypotheses"
nomo_table(run, "recipe")
#> # A tibble: 14 × 6
#>    stage       scope           function_name data_role status researcher_control
#>    <chr>       <chr>           <chr>         <chr>     <chr>  <chr>             
#>  1 screen      Agency          nomo_screen() explorat… compl… candidate item me…
#>  2 factors     Agency          nomo_factors… explorat… compl… retention evidenc…
#>  3 efa         Agency          nomo_efa()    explorat… compl… explicit `factor_…
#>  4 screen      Persistence     nomo_screen() explorat… compl… candidate item me…
#>  5 factors     Persistence     nomo_factors… explorat… compl… retention evidenc…
#>  6 efa         Persistence     nomo_efa()    explorat… compl… explicit `factor_…
#>  7 screen      SocialDesirabi… nomo_screen() explorat… compl… candidate item me…
#>  8 factors     SocialDesirabi… nomo_factors… explorat… compl… retention evidenc…
#>  9 efa         SocialDesirabi… nomo_efa()    explorat… compl… explicit `factor_…
#> 10 cfa         measurement_mo… nomo_cfa()    confirma… compl… explicit `cfa_mod…
#> 11 reliability measurement_mo… nomo_reliabi… confirma… compl… evidence computed…
#> 12 validity    measurement_mo… nomo_validit… confirma… compl… evidence computed…
#> 13 invariance  configured_bra… nomo_invaria… confirma… compl… requested through…
#> 14 network     configured_bra… nomo_network… same sam… compl… requested through…
head(nomo_table(run, "component_log"), 10)
#> # A tibble: 10 × 12
#>    pipeline_component pipeline_scope stage   object  metric      value reference
#>    <chr>              <chr>          <chr>   <chr>   <chr>       <dbl> <chr>    
#>  1 factors            Agency         factors correl… corre… NA         Indicato…
#>  2 factors            Agency         factors cases   pairw…  8   e+  2 Minimum …
#>  3 factors            Agency         factors correl… kmo     8.21e-  1 0.60/0.5…
#>  4 factors            Agency         factors correl… bartl…  1.89e-279 Supporti…
#>  5 factors            Agency         factors retent… paral…  1   e+  0 Common-f…
#>  6 factors            Agency         factors retent… paral…  1   e+  0 Agreemen…
#>  7 factors            Agency         factors retent… map_o…  1   e+  0 Velicer …
#>  8 factors            Agency         factors retent… map_r…  1   e+  0 Velicer …
#>  9 factors            Agency         factors retent… ekc     1   e+  0 Braeken …
#> 10 factors            Agency         factors retent… reten…  3   e+  0 Converge…
#> # ℹ 5 more variables: severity <chr>, observation <chr>, recommendation <chr>,
#> #   decision <chr>, rationale <chr>

The guided object retains:

  • source sample roles;
  • supplied scale membership;
  • component settings;
  • explicit decisions and rationales;
  • complete component result objects;
  • outstanding decision requests;
  • component decision and evidence logs;
  • the sequence of resume calls.

This structure feeds the reproducible report described in Archiving a nomologR workflow.

Research basis

Staged scale development with explicit decisions follows guidance such as Clark and Watson (1995, 2019), Hinkin (1998), and Boateng et al. (2018). Recording decisions and rationales responds to evidence that undisclosed analytic flexibility undermines measurement claims (Simmons, Nelson, & Simonsohn, 2011; Flake, Pek, & Hehman, 2017; Flake & Fried, 2020). Full references are in ?nomo_run and the research basis article.