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