Skip to content

Commit c3fa013

Browse files
Alexey Stukalovalyst
authored andcommitted
lavaan_model()
1 parent de790de commit c3fa013

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
@@ -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

Comments
 (0)