@@ -597,3 +597,78 @@ lavaan_param_values(
597597 lav_col,
598598 lav_group,
599599)
600+
601+ """
602+ lavaan_model(partable::ParameterTable)
603+
604+ Generate lavaan model definition from a `partable`.
605+ """
606+ function lavaan_model (partable:: ParameterTable )
607+ latent_vars = Set (partable. variables. latent)
608+ observed_vars = Set (partable. variables. observed)
609+
610+ variance_defs = Dict {Symbol, IOBuffer} ()
611+ latent_dep_defs = Dict {Symbol, IOBuffer} ()
612+ latent_regr_defs = Dict {Symbol, IOBuffer} ()
613+ observed_regr_defs = Dict {Symbol, IOBuffer} ()
614+
615+ model = IOBuffer ()
616+ for (from, to, rel, param, value, free) in zip (
617+ partable. columns. from,
618+ partable. columns. to,
619+ partable. columns. relation,
620+ partable. columns. param,
621+ partable. columns. value_fixed,
622+ partable. columns. free,
623+ )
624+ function append_param (io)
625+ if free
626+ @assert param != :const
627+ param == Symbol (" " ) || write (io, " $param * " )
628+ else
629+ write (io, " $value * " )
630+ end
631+ end
632+ function append_rhs (io)
633+ if position (io) > 0
634+ write (io, " + " )
635+ end
636+ append_param (io)
637+ write (io, " $to " )
638+ end
639+
640+ if from == Symbol (" 1" )
641+ write (model, " $to ~ " )
642+ append_param (model)
643+ write (model, " 1\n " )
644+ else
645+ if rel == :↔
646+ variance_def = get! (() -> IOBuffer (), variance_defs, from)
647+ append_rhs (variance_def)
648+ elseif rel == :→
649+ if (from ∈ latent_vars) && (to ∈ observed_vars)
650+ latent_dep_def = get! (() -> IOBuffer (), latent_dep_defs, from)
651+ append_rhs (latent_dep_def)
652+ elseif (from ∈ latent_vars) && (to ∈ latent_vars)
653+ latent_regr_def = get! (() -> IOBuffer (), latent_regr_defs, from)
654+ append_rhs (latent_regr_def)
655+ else
656+ observed_regr_def = get! (() -> IOBuffer (), observed_regr_defs, from)
657+ append_rhs (observed_regr_def)
658+ end
659+ end
660+ end
661+ end
662+ function write_rules (io, defs, relation)
663+ vars = sort! (collect (keys (defs)))
664+ for var in vars
665+ write (io, String (var), " " , relation, " " )
666+ write (io, String (take! (defs[var])), " \n " )
667+ end
668+ end
669+ write_rules (model, latent_dep_defs, " =~" )
670+ write_rules (model, latent_regr_defs, " ~" )
671+ write_rules (model, observed_regr_defs, " ~" )
672+ write_rules (model, variance_defs, " ~~" )
673+ return String (take! (model))
674+ end
0 commit comments