Skip to content

Commit e1cd9e6

Browse files
Alexey Stukalovalyst
authored andcommitted
lavaan_model()
1 parent c01f8cc commit e1cd9e6

1 file changed

Lines changed: 75 additions & 0 deletions

File tree

src/frontend/specification/ParameterTable.jl

Lines changed: 75 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -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

Comments
 (0)