The hardware and bandwidth for this mirror is donated by dogado GmbH, the Webhosting and Full Service-Cloud Provider. Check out our Wordpress Tutorial.
If you wish to report a bug, or if you are interested in having us mirror your free-software or open-source project, please feel free to contact us at mirror[@]dogado.de.

Reading Identification off the Diagram

Hsiu-Ting Yu

2026-10-14

Because 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          FALSE

A 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] TRUE

Label 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] TRUE

The 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     M

A 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.

These binaries (installable software) and packages are in development.
They may not be fully stable and should be used with caution. We make no claims about them.
Health stats visible at Monitor.