Reading Identification off the Diagram
Hsiu-Ting Yu
2026-09-28
Source:vignettes/umg-identification.Rmd
umg-identification.RmdBecause a well-formed UMG determines a likelihood, several necessary conditions for identification can be read from the picture before any estimation is attempted. The functions in this vignette operationalise that idea. None of them replaces a formal identification analysis; each catches a routine error at the drawing board, where errors are cheapest to fix.
Scaling marks for latent variables
Every latent continuous random vertex must have its scale fixed.
umg_check_scaling() reports the mechanism detected for
each.
umg_check_scaling(umg_factor("F", paste0("y", 1:4))) # marker loading
#> vertex scaled via location_fixed
#> 1 F TRUE marker loading FALSE
umg_check_scaling(umg_esem("F1", paste0("y", 1:4))) # fixed variance
#> vertex scaled via location_fixed
#> 1 F1 TRUE fixed variance FALSEA latent vertex reported as "none" is the single most
common specification error in latent variable modelling, surfaced as a
missing mark rather than a nonconvergence.
The counting rule
umg_count_parameters() applies the classical t-rule,
comparing free parameters against the distinct pieces of information the
observed variables supply. A non-negative df is necessary,
not sufficient.
umg_count_parameters(umg_factor("F", paste0("y", 1:6)))
#> $data_information
#> [1] 21
#>
#> $free
#> $free$loadings_regressions
#> [1] 5
#>
#> $free$covariances
#> [1] 0
#>
#> $free$variances
#> [1] 7
#>
#> $free$means
#> [1] 0
#>
#>
#> $free_total
#> [1] 12
#>
#> $df
#> [1] 9
#>
#> $applicable
#> [1] TRUELabel switching
Mixture and latent class models are identified only up to a permutation of the classes.
umg_labelswitching(umg_mixture(umg_growth(4), c("I", "S")))
#> [1] "c"Conditional independence and d-separation
umg_dsep() reads a conditional-independence claim off
the diagram. Covariance edges are treated as latent common causes (the
projection of an acyclic directed mixed graph onto a DAG).
med <- umg_mediation(direct = FALSE)
umg_dsep(med, "X", "Y") # FALSE: connected through M
#> [1] FALSE
umg_dsep(med, "X", "Y", given = "M") # TRUE: blocked by the mediator
#> [1] TRUEThe implied independencies of the model (its testable implications) are enumerated under the local Markov property:
umg_implied_ci(umg_mediation(direct = FALSE))
#> x y given
#> 1 X Y MA single summary
umg_identify() collects these readings into one
printable object.
umg_identify(umg_factor("F", paste0("y", 1:6)))
#> UMG identification summary
#> --------------------------
#> Latent scaling: 1 latent continuous vertex(es); all scaled
#> Counting rule: 21 data moments, 12 free parameters, df = 9
#> Implied conditional independencies (observed): 0
#> Note: necessary conditions only; not a formal identification proof.