Changes in Version 1.2.0 o NEW: standardized parameters for psychonetrics models, so that semPaths(mod, "std") now works. psychonetrics leaves the 'std' column of its parameter table empty, so the standardized solution is computed from the model-implied matrices: Var(eta) = (I - Beta)^-1 Sigma_zeta (I - Beta)^-T Sigma = Lambda Var(eta) Lambda' + Sigma_epsilon Loadings and regressions are rescaled by the ratio of the relevant standard deviations, (co)variances are divided by them, and intercepts by the variable's standard deviation (the lavaan std.all convention). This covers the 'cov', 'ggm', 'chol' and 'prec' parameterizations of both the lvm and varcov frameworks: for a GGM block psychonetrics forms Sigma_* = Delta (I - Omega)^-1 Delta, so the same expressions apply. Omega itself is by construction a matrix of partial correlations and is therefore reported unchanged as its own standardized value. o Fixed psychonetrics models with an empty GGM block (every omega fixed to zero, as for a default residual = "ggm") dropping their delta parameters with a "Dropped 10 parameter(s) with unsupported operator(s): ~/~" warning, and showing no variances for that block. The block's parameterization is now read from the full parameter table, before structurally-zero rows are removed. o Importing a psychonetrics model whose solution is improper (a non-positive model-implied variance) now warns and names the offending variables, instead of silently producing standardized values computed against a variance clamped to zero. o Fixed the regsem importer dropping no parameters for models using ':=', '==', '<' or '>': the filter tested 'object$op', and since a regsem object has no 'op' element R's partial matching silently resolved this to 'optim_fit', a number, making the whole test a constant. It now tests the lavaan parameter table, as the surrounding lines already did. Models without those operators are unaffected. o Documentation examples fixed: ?regsemplot called semPlotModel.regsem() directly, which is registered for S3 dispatch but never exported and so could not be called by a user; it now goes through the semPlotModel() generic. The multi-group example in ?semPaths downloaded a LISREL output file from sachaepskamp.com that is no longer available, and now shows equality constraints on a lavaan measurement-invariance model instead. o NEW: PLS-SEM support -- seminr (estimate_pls) and cSEM (csem) models import with reflective constructs as directed loadings and composite (mode B / formative) constructs as weight arrows into the construct o blavaan objects are imported natively (via lavaan-method inheritance) instead of overwriting their class; posterior means and standardized posterior solutions display as est/std o NEW: metaSEM stage-2 models (tssem2()/wls()) plot via metaSEM's meta2semPlot() bridge; stage-1 pooling objects error informatively o Documented and regression-tested umx compatibility (umxRAM models are MxRAMModels and import via the OpenMx importer) o NEW: lavaan.mi support -- pooled multiple-imputation fits display Rubin's-rules pooled estimates and pooled standardized solutions o NEW: piecewiseSEM support -- psem() models import their directed paths (with piecewiseSEM's standardized estimates) and correlated errors (x %~~% y) as bidirectional edges o NEW: psych support -- fa() (directed loadings, factor correlations for oblique rotations, uniqueness self-loops) and omega() (bifactor / Schmid-Leiman structure; pair with semPaths(..., bifactor = 'g', layout = 'tree2')); new 'cut' argument to omit small loadings. principal() was already supported o NEW: registerSemPlotImporter() lets other packages plug importers for their model classes into semPlotModel()/semPaths(); the new validateSemPlotModel() checks the semPlotModel contract and is run automatically by semPaths() o Added a regression test suite (tests/regression-tests.R) o sem, XML, lisrelToR, rockchalk and OpenMx are now optional (Suggests): each serves a single importer and is loaded on demand with an informative message when missing; installing semPlot is much lighter o semPaths() and semPlotModel() no longer crash on inline calls containing a '+' (e.g. semPaths(lm(y ~ x + z, data))); combining models with '+' now uses AST inspection of the unevaluated argument o Fixed the all-NA 'std' column for non-gaussian GLMs (fallback of the 1.1.8 standardize() fix) o semPaths(DoNotPlot=TRUE) no longer opens a graphics device; par(ask) and panelGroups/semCors layout() are restored exception-safely o semPlotModel.default now reports every importer's failure message instead of 'Object not recognized as SEM model' o glm importer classifies intercepts by exact name; semCors errors informatively for models without covariance matrices; semSyntax skips interaction terms with a warning o NEW: psychonetrics support (lvm and varcov frameworks, all cov/ggm/chol/ prec subtypes; multigroup). GGM blocks are displayed as undirected network edges, with delta scalings replaced by implied variances by default (delta argument: 'variance', 'ignore', 'show') o Undirected ('--') edges are now first-class: symmetric layout roles (defExo), curveAdjacent support (new default c('<->','--')), and a semSyntax guard o NEW: lavaan efa() output (efaList) can be plotted; select solutions with the 'which' argument o lavaan composites ('<~') import as directed edges into the composite and re-emit as '<~' in semSyntax (previously drawn as undirected placeholder edges) o Multilevel lavaan models (cluster=) now map level 1/2 onto Within/Between panels instead of silently conflating both levels in one diagram o The lavaan importer aligns parameterEstimates() with parTable() by key matching (robust across lavaan versions) and uses the maintained parTable()/lavNames() accessors o Combining models with '+' uses column-union binding, so models from different importers (e.g. lavaan + lm) can be combined Changes in Version 1.1.8 o Fixed DoNotPlot = TRUE causing an error in multigroup models (#50) o Fixed multigroup models with different variables per group crashing due to dimnames mismatch (#38) o Fixed logistic regression and other non-gaussian GLMs crashing due to standardize() (#43) o Fixed OpenMx models crashing with "replacement has length zero" for M matrix standardization (#35) o Fixed layoutSplit causing "logical subscript too long" error (#15) o Covariance matrices from lavaan now use lavTech with add.labels=TRUE for proper per-group naming Changes in Version 1.1.5 o Small change to a link used in an example Changes in Version 1.1.4 o Fixed issues with new lavaan version o Small fix for CRAN Changes in Version 1.1.3 o the 'ramModel' function now supports meanstructure with the 'M' argument. o Fixed an issue with lavaan Changes in Version 1.1.1 o regsem and cv_regsem support added, thanks to Myrthe Veenman and Jason Nak! Changes in Version 1.1 o Fixed a bug with lavaan input o Fixed a bug with OpenMx 2 input o The 'mplusStd' argument of semPlotModel can now be used to specify standardization of mplus models o Fixed a bug related to model constraints o Several updates to accomidate new CRAN checks Changes in Version 1.0.1 o Fixed a dependency related bug causing examples to crash. Changes in Version 1.0.0 New features: o Added the argument 'curveAdjacent' to also curve the covariances between two adjacent nodes as curved edges. o A frequently asked question is how to decrease the font size of edge labels. This can be done via the 'edge.label.cex' argument of the qgraph backend. But because this was not clear the argument now has been added to semPaths as well. The default is slightly smaller than the original qgraph default: 0.6 versus 1. o Added the argument 'cardinal' that controls which edges will be linked to cardinal sides of a node. With this argument the behavior of many path diagram drawing programs can be mirrored. o Added the 'equalizeManifests' argument to equalize the spacing between manifest variables in the 'tree1' layout. o Added the 'covAtResiduals' argument that controls if covariances should be linked to residuals rather than nodes themselves if style="lisrel" o Added the 'bifactor' argument to create bifactor layouts. Only supported with layouts 'tree2', 'tree3', 'circle2' and 'circle3'. o optimizeLatRes has been improved o Added 'optimizePoints' arguments that can be given a vector of radians residuals can optimize to if optimizeLatRes = TRUE. Changes: o The argument curvePivot now defaults to FALSE, causing covariances by default to once again be drawn by circular curved edges. o A list of usefull qgraph arguments that can be used in semPaths is now listed in the semPaths help page. o 'mixCols' renamed to 'inheritColor' o The color argument can now be assined a list for assignng specific colors to all manifests, latents or intercepts o Some improvements to 'semCors' Bug fixes: o Fixed a bug where using style='lisrel' did not correctly curve covariances between latents. o Fixed a bug where 'layoutSplit' resulted in a crash if there were only two connections in the structural model and "spring" layout was used. Changes in Version 0.3.3 o Lavaan model syntax is now supported as input o Numeric edge labels without using whatLabels argument are now correctly abbreviated o Several small fixes Changes in Version 0.3.2 o New features o Matrix model functionality: o Added 'semMatrixAlgebra' to easily perform matrix algebra on any semPlot input object. o Added 'modelMatrices' to obtain model matrices of LISREL, Mplus and RAM modeling frameworks of any input to semPlot. o Added 'exoVar' and 'exoCov' arguments that can be used to not display variances or covariances of truly exogenous variables (no incoming directed edges) o Added 'tree3' and 'circle3' layouts, based on Boker, S. M., McArdle, J. J., & Neale, M. (2002). An algorithm for the hierarchical organization of path diagrams and calculation of components of expected covariance. Structural Equation Modeling, 9(2), 174-194. o Major changes o Added edgeLabels and nodeLabels arguments to manually overwrite edge and node labels, in the order they appear in the RAM and Vars elements of the 'semPlotModel' that is created internally. In addition to the qgraph change that these can now be assigned lists including expressions it should now be easier to add Greek letters. o MplusAutomation is no longer imported but moved to suggests list. This makes sure that the Tcl/Tk interface is not loaded on loading semPlot and as a result makes sure that semPlot does not result in crashes on Mac computers where Tcl/Tk is not installed. o 'style' now defaults to "lisrel" if the input is a Lisrel model. o 'style="lisrel"' will now default exoVar to FALSE. o Changed the name of slot RAM to Pars in semPlotModel class. o Two-level multilevel structures is now supported o Currently this works for Mplus input only. o Only random intercepts are supported, not random slopes. o Thresholds are shown on the within level rather than the between level. o New arguments to semPaths: o Added argument thresholdSize to control the size of threshold bars o Added 'levels' argument. This argument can be used to control the spacing between levels (e.g., exogenous latents) of tree and circle layouts. o Added nDigits argument to control the number of digits used in rounding for labels. o Added 'centerLevels' argument for tree2 layout, to center horizontal levels. o Added 'panelGroups' argument to automatically create a panel plot of multiple group models. o The 'layoutSplit' argument can be used to split computing of layout between structural and measurment models. This is very useful in more complicated models where the structural part is best shown by using a spring layout. o Added the 'intAtSide' argument to control if intercepts should be plotted to the side of manifest nodes or at the bottom/top. Defaults only to FALSE if 'residuals=FALSE'. o Added 'nDigits' argument to control rounding of numeric values. o Minor changes o Thresholds are now plotted via qgraph o Changed argument threshold.color to thresholdColor o 'qgraph' is no longer on the depends list but imported instead. o 'as.expression' now defaults to "edges" if the input is a lisrel model. o 'semPlotModel' for lisrel modes can now use dots to send arguments to 'lisrelModel' o Added 'reduce' argument to lisrelModel that controls if variables that are named the same should be treated as the same variable. o Shape, width and height of manifest, latent and constant variables can now be set. o Mplus input now supports the | operator. o Bug fixes o Fixed a bug where numeric labels where abbreviated, causing erratic behavior on the labels. o Fixed a bug where models with single indicator latent variables caused an error. o Numerous small bugfixes and improvements o Fixed a bug where variable names in mplux models containing BY, WITH or ON caused unexpected behavior. o Assigning a matrix to the layout argument of semPaths will no longer cause a bunch or warnings. Changes in Version 0.3 o First submit to CRAN.