Releases: StructuralEquationModels/StructuralEquationModels.jl
Release list
v0.5.0
StructuralEquationModels v0.5.0
StructuralEquationModels.jl v0.5.0
This is a large, breaking release centered on a modular redesign of the model/type system to unify single models and collections/multigroup models.
Highlights
- a
Semis now a weighted sum of loss terms, each SEM loss bundling its own observed + implied parts. - New inference methods: CFI, p-values (z-test) and confidence intervals, parallel bootstrap.
- Multigroup χ²/RMSEA/estimates now match lavaan.
- Optimization backends (NLopt, Proximal) moved to package extensions.
- Data simulation, FIML mean structures, and efficient re-fitting via
replace_observed.
Breaking changes
- Type-system & evaluation overhaul.
SemOptimizerAPI refactor (#299).- Optimization backends are now extensions — you must
using NLopt/using ProximalAlgorithmsto enableengine = :NLopt/:Proximal(#228, #234). - Renames:
params/param_labels(#253, #257);df→dof(#254). - Multigroup fit statistics now use the per-group Wishart/GLS convention:
χ² = Σ_g (N_g−1)·F_g(new:nsamples_correcteddefault weighting;N−Gχ² multiplier for ML/WLS; matching RMSEA). Multigroup ML/WLS results now match lavaanwishart/GLS; single-group results are unchanged except ML RMSEA. FIML is unchanged.
New features
CFIfit measure (#313).- Inference: z-test p-values and normal-theory confidence intervals (#316).
- Bootstrap standard errors refactored, with optional parallel fitting (#314).
replace_observedfor collections (#266).
Bug fixes
- Multigroup fit-measure corrections (#311), RMSEA correction, and the χ² multiplier/weighting fix.
Merged pull requests:
- No-op code & docs cleanups (#245) (@alyst)
- build(deps): bump julia-actions/julia-format from 3 to 4 (#264) (@dependabot[bot])
- main into devel (#265) (@Maximilian-Stefan-Ernst)
- Replace observed collections (#266) (@Maximilian-Stefan-Ernst)
- build(deps): bump actions/github-script from 7 to 8 (#269) (@dependabot[bot])
- Main to devel (#278) (@Maximilian-Stefan-Ernst)
- build(deps): bump actions/checkout from 4 to 6 (#287) (@dependabot[bot])
- explicitely import types for extensions (#291) (@Maximilian-Stefan-Ernst)
- workaround for StenoGraph import (#294) (@Maximilian-Stefan-Ernst)
- Update partable syntax (#295) (@Maximilian-Stefan-Ernst)
- Update FormatCheck (#296) (@alyst)
- update concept figures (#297) (@Maximilian-Stefan-Ernst)
- Update action (#298) (@Maximilian-Stefan-Ernst)
- Refactor SemOptimizer API (#299) (@alyst)
- .gh/FormatCheck: run on pull_request (#302) (@Maximilian-Stefan-Ernst)
- Cleanup FIML, enhance em_mvn() (#303) (@alyst)
- Fiml meanstructure argument (#304) (@Maximilian-Stefan-Ernst)
- fix printing of Optim solution (#305) (@Maximilian-Stefan-Ernst)
- require StenoGraphs v0.5; closes #289 (#306) (@aaronpeikert)
- Update actions on devel (#307) (@Maximilian-Stefan-Ernst)
- remove unused Stenograph exports (#308) (@Maximilian-Stefan-Ernst)
- Update loss checks (#309) (@alyst)
- Update docstring for fit measures (#310) (@alyst)
- Cleanup fitmeasures mg (#311) (@Maximilian-Stefan-Ernst)
- Add CFI (#313) (@Maximilian-Stefan-Ernst)
- refactor bootstrap se and allow parallel fitting (#314) (@Maximilian-Stefan-Ernst)
- update to PrettyTable v3 (#315) (@Maximilian-Stefan-Ernst)
- Convergence, bootstrap, p-values (#316) (@Maximilian-Stefan-Ernst)
- Refactor Sem multi-group support (#317) (@alyst)
- build(deps): bump julia-actions/cache from 2 to 3 (#318) (@dependabot[bot])
- build(deps): bump codecov/codecov-action from 5 to 6 (#319) (@dependabot[bot])
- build(deps): bump actions/github-script from 8 to 9 (#320) (@dependabot[bot])
- build(deps): bump julia-actions/setup-julia from 2 to 3 (#323) (@dependabot[bot])
- build(deps): bump codecov/codecov-action from 6 to 7 (#325) (@dependabot[bot])
- Documentation and bugfixes for 0.5.0 (#329) (@Maximilian-Stefan-Ernst)
- Release 0.5.0 (#330) (@Maximilian-Stefan-Ernst)
- fix macos CI runs (#331) (@Maximilian-Stefan-Ernst)
Closed issues:
- se for WLS and FIML (#57)
- v0.4.1 (#261)
- v0.4.2 (#263)
sem_fit()was deprecated forfit()? (#267)- (in)equality constraints via StenoGraphs specification (#270)
- Status message for converged models (#273)
- Error (#274)
- Numerical precision of model-implied covariance matrix (#276)
- Simulate data from a model (#282)
StenoGraphshas to be loaded manually (#289)
v0.4.2
What's Changed
- remove deprecated tolerance options from
Optim.jl
v0.4.1
What's Changed
- Fix some outdated docstrings
- Remove unused code
v0.4.0
StructuralEquationModels v0.4.0
Breaking changes
The package now conforms to StatsAPI.jl (or throws an explanatory error message where it doesn't).
Merged pull requests:
- Rename params (#253) (@aaronpeikert)
- rename df => dof (#254) (@Maximilian-Stefan-Ernst)
- Release/v0.4.0 (#255) (@Maximilian-Stefan-Ernst)
- Rename params (#253) (#257) (@Maximilian-Stefan-Ernst)
Closed issues:
v0.3.0
StructuralEquationModels v0.3.0
Breaking changes
SemSpecificationobjects are now dispatched onSemOptimizeris not part of the model anymore, but passed tosem_fitNLoptandProximalAlgorithmsbackends are now supported via package extensions
Merged pull requests:
- Bump julia-actions/setup-julia from 1 to 2 (#179) (@dependabot[bot])
- Release 0.2.4 (#200) (@Maximilian-Stefan-Ernst)
- Cleanup Special Matrices code (#202) (@alyst)
- Refactor SEM Specification (#203) (@alyst)
- build(deps): bump julia-actions/cache from 1 to 2 (#204) (@dependabot[bot])
- build(deps): bump julia-actions/julia-format from 2 to 3 (#206) (@dependabot[bot])
- Cleanup Variables API (#207) (@alyst)
- Update workflows in devel (#209) (@Maximilian-Stefan-Ernst)
- dont allow fixed and labeled parameters (#210) (@Maximilian-Stefan-Ernst)
- Release/v0.3.0 (#211) (@Maximilian-Stefan-Ernst)
- Refactor objective/gradient/hessian evaluation (#214) (@alyst)
- Devel (#218) (@Maximilian-Stefan-Ernst)
- ParamsArray type (#219) (@alyst)
- build(deps): bump codecov/codecov-action from 4 to 5 (#220) (@dependabot[bot])
- Release/v0.3.0 (#224) (@Maximilian-Stefan-Ernst)
- Add data simulation function (#225) (@Maximilian-Stefan-Ernst)
- Devel (#226) (@Maximilian-Stefan-Ernst)
- Support optimization backends via package extensions (#228) (@alyst)
- Enhance SemObserved (#230) (@alyst)
- Switch to ProximalAlgorithms v0.7 (#234) (@alyst)
- Rename SemImply to SemImplied (#235) (@alyst)
- close #158 (#240) (@Maximilian-Stefan-Ernst)
- suppress uninformative warnings during package testing (#241) (@Maximilian-Stefan-Ernst)
- turn simplification of symbolic terms by default off (#244) (@Maximilian-Stefan-Ernst)
- Fix extensions (#246) (@Maximilian-Stefan-Ernst)
- Devel (#247) (@Maximilian-Stefan-Ernst)
- Documentation/0.3.0 (#248) (@Maximilian-Stefan-Ernst)
- Devel (#249) (@Maximilian-Stefan-Ernst)
- give macos some slack and format (#250) (@Maximilian-Stefan-Ernst)
Closed issues:
- Index into type-heterogenous tuples in for loops (#20)
- local testing only runs unit tests (#140)
- Update installation instructions in docs (#155)
- Multigroup SEM constructor (#157)
- rename
sem_summary(#158) - Is there a
copy(::ParameterTable)method? (#170) - v0.2.3 (#177)
- Variables/Parameters/Observations terminology & API Cleanup (#199)
- v0.2.4 (#201)
- New constructor for EnsembleParameterTable (#205)
- Fixed and Labeled loadings don't show up in the degrees of freedom. (#208)
- Add option to control the printed columns in
sem_summary(#213) - start_simple ignores keyword arguments (#216)
- Write a small wrapper function to sample from model parameters from normally distributed data (#223)
- Rename
swap_observed()toreplace_observed()(#232) - consistent naming: params (#238)
v0.2.4
Formatting/Refactoring
- The whole codebase is now formatted to follow a specific
JuliaFormatterstyle. - We now have
JuliaFormatterrunning in the tests as well as in each PR. - A lot of cosmetic cleanups and simplifications.
Testing
- Tests now give more specific feedback when failing.
Performance
- Linear algebra tweaks in objective/gradient/hessian computation.
- Optimizations in fabin 3 starting value computation.
- Optimizations in RAM Matrices construction.
What's Changed
- Main -> Devel by @Maximilian-Stefan-Ernst in #183
- CI: add julia-format action by @alyst in #182
- Reformat by @Maximilian-Stefan-Ernst in #191
- Apply reformatting to main branch by @Maximilian-Stefan-Ernst in #192
- Misc. fixes by @alyst in #196
- Misc.Fixes 2 by @alyst in #198
- Release 0.2.4 by @Maximilian-Stefan-Ernst in #200
Full Changelog: v0.2.3...v0.2.4
v0.2.3
StructuralEquationModels v0.2.3
Merged pull requests:
- Update CI (#165) (@alyst)
- Fix splatting (#167) (@alyst)
- Bump codecov/codecov-action from 2 to 4 (#171) (@dependabot[bot])
- Bump actions/checkout from 2 to 4 (#172) (@dependabot[bot])
- Bump actions/github-script from 5 to 7 (#173) (@dependabot[bot])
- main -> devel (#174) (@Maximilian-Stefan-Ernst)
- main -> devel (#175) (@Maximilian-Stefan-Ernst)
- fix local testing, fix nlopt constrained tests (#176) (@Maximilian-Stefan-Ernst)
Closed issues:
v0.2.2
StructuralEquationModels v0.2.2
Merged pull requests:
- Release/v0 2 0 (#145) (@Maximilian-Stefan-Ernst)
- Main -> Devel after release (#147) (@Maximilian-Stefan-Ernst)
- close #151 and add test for it (#152) (@Maximilian-Stefan-Ernst)
- Documentation/installation (#156) (@Maximilian-Stefan-Ernst)
- add DataFrames to docs dependencies (#162) (@Maximilian-Stefan-Ernst)
Closed issues:
- What types of models do not need an imply? (#108)
- CI fails mysteriously from time to time (#117)
- Release v0.2.0 (#122)
- Update installation instructions (#128)
- export
optimizerfield access method (#130) - TagBot file does not have an extension (#132)
- update to julia 1.9 (#139)
- Constant mean parameters do not work (#151)
- Release v0.2.1 (#153)
- Update installation instructions in docs (#155)
Major Release 0.2.0
What's Changed
- sync devel by @aaronpeikert in #135
- preview documentation PRs by @aaronpeikert in #137
- Feed main back into devel by @Maximilian-Stefan-Ernst in #143
- Feat small changes by @LeonieHagitte in #141
- Update loss.md by @brandmaier in #133
- not all commits on main have to be tagged by @Maximilian-Stefan-Ernst in #138
- Main -> Devel by @Maximilian-Stefan-Ernst in #144
- Release/v0 2 0 by @Maximilian-Stefan-Ernst in #145
New Contributors
- @LeonieHagitte made their first contribution in #141
Full Changelog: v0.1.0...v0.2.0
Initial Release v0.1.0
StructuralEquationModels v0.1.0
This is a package for Structural Equation Modeling.
It is still in development.
Models you can fit include
- Linear SEM that can be specified in RAM (or LISREL) notation
- ML, GLS and FIML estimation
- Ridge Regularization
- Multigroup SEM
- Sums of arbitrary loss functions (everything the optimizer can handle).
We provide fast objective functions, gradients, and for some cases hessians as well as approximations thereof.
As a user, you can easily define custom loss functions.
For those, you can decide to provide analytical gradients or use finite difference approximation / automatic differentiation.
You can choose to mix and match loss functions natively found in this package and those you provide.
In such cases, you optimize over a sum of different objectives (e.g. ML + Ridge).
This mix and match strategy also applies to gradients, where you may supply analytic gradients or opt for automatic differentiation or mix analytical and automatic differentiation.
You may consider using this package if:
- you want to extend SEM (e.g. add a new objective function) and need an extendable framework
- you want to extend SEM, and your implementation needs to be fast (because you want to do a simulation, for example)
- you want to fit the same model(s) to many datasets (bootstrapping, simulation studies)
- you are planning a study and would like to do power simulations
The package makes use of
- Symbolics.jl for symbolically precomputing parts of the objective and gradients to generate fast, specialized functions.
- SparseArrays.jl to speed up symbolic computations.
- Optim.jl and NLopt.jl to provide a range of different Optimizers/Linesearches.
- FiniteDiff.jl and ForwardDiff.jl to provide gradients for user-defined loss functions.
Registration
What's Changed
- Change interface of model building blocks to be method based by @Maximilian-Stefan-Ernst in #96
- Add documentation and docstrings, change type names by @Maximilian-Stefan-Ernst in #101
- Remove SemForwardDiff by @Maximilian-Stefan-Ernst in #104
- Revise introduction of the package by @aaronpeikert in #106
- registration triggers new release on GitHub/Zenodo by @aaronpeikert in #115
- reduce export footprint of StenoGraph by @aaronpeikert in #119
- fixed typo by @nickhaf in #125
New Contributors
Full Changelog: https://github.com/StructuralEquationModels/StructuralEquationModels.jl/commits/v0.1.0