OpenMx version 2.7.9 is now available through CRAN and through our own package repository.
The most significant change between OpenMx v2.6 and v2.7 is that CSOLNP is now the on-load default optimizer. Use
mxOption() to switch optimizers, e.g.
mxOption(NULL,"Default optimizer","SLSQP") to switch to SLSQP (the default since OpenMx v2.2) or
mxOption(NULL,"Default optimizer","NPSOL") to switch to NPSOL (the only optimizer prior to v2.2 of OpenMx, and in classic Mx before it).
New features, performance improvements, and bug-fixes in OpenMx v2.7.9 include:
The character string "one" is now a reserved name in OpenMx, because RAM-type MxModels use a dummy variable of that name in their model for the mean vector. This means that using the name "one" for any object in an MxModel will now result in an error.
There is a new function,
mxAutoStart(), which automatically picks very good starting values for a variety of models.
Hidden-Markov models--which include static mixture models as a special case--can now be fitted in OpenMx through the new Hidden-Markov expectation.
Two minor bugs in
mxRefModels() have been repaired.
OpenMx now includes a flexible, options-rich implementation of the Nelder-Mead algorithm, a general-purpose derivative-free optimizer. It is intended for use when the gradient-descent optimizers have difficulty optimizing an MxModel involving ordinal data. Note that this optimizer's methods for handling MxConstraints are likely to be changed for the next version's release.
Rampart (OpenMx's multilevel SEM algorithm) now uses much less memory when working with large datasets.
summary() output for MxModel objects is now easier to read and more informative.
The documentation for
mxOption() now correctly explains how OpenMx's interface with NPSOL uses the "Feasibility tolerance" option.
With fitfunctions that can provide an analytic Hessian, it is now possible to provide NPSOL with an "internal" warm start by running a compute plan that places an MxComputeOnce step requesting the Hessian immediately before the MxComputeGradientDescent step that uses NPSOL.
mxEval() now works with expressions that reference elements of MxAlgebras and MxMatrices via square brackets.
Previously, if a free parameter's start value was zero, OpenMx would silently "nudge" the start value to 0.1. This behavior is now governed by mxOption "Nudge zero starts", the on-load default of which is "Yes".
mxFitFunctionWLS() now includes an internal standardization that allows the scale parameters for ordinal variables to be estimated. This allows any ML ordinal model to be estimated as a WLS model (unless it uses definition variables) by merely switching (1) the
mxFitFunctionWLS(), and (2) the
mxData(..., type='raw') with
Analyzing joint ordinal-and-continuous data with full-weighted WLS no longer triggers a warning message about bias. For details, see the documentation for
If there are missing observations (
NAs) in the dataset,
mxFactorScores() now requires the user to provide a value for its new argument,
minManifests, which sets a minimum count of non-
NA scores to be present for each data row, below which the function will not calculate factor-score estimates for that row. Note that this is a backwards-incompatible change in behavior.
There is a new function,
mxSE(), which calculates delta-method standard errors for arbitrary expressions, named entities, and algebras. Note that it requires that standard errors (really, a valid Hessian matrix) be available for the MxModel's free parameters.
mxRun() now prints non-persistent feedback messages about optimization progress.
Advanced users are now able to provide analytic constraint Jacobians to
mxConstraint() (but see the related "known issue" below). This feature is presently supported for NPSOL and SLSQP. Providing analytic Jacobians can significantly reduce the number of fitfunction evaluations that the optimizer needs to reach a solution.
Additional information about MxConstraints is now exported from the optimizer in the backed to the MxModel's 'output' slot. This feature is presently implemented for NPSOL and SLSQP. The additional diagnostics include the constraint function values and the corresponding Lagrange multipliers, the full constraint Jacobian, and the Hessian of the augmented Lagrangian at the solution.
A new function,
omxDefaultComputePlan(), which creates a "default" MxComputeSequence, has been implemented. This new function is intended for cases where the user wants to run an MxModel with the same compute plan that would ordinarily be generated automatically at runtime, except for a few changes.
New performance improvements have enabled RAM and LISREL MxModels to analyze continuous raw data almost as quickly as covariance-input data in many cases. The means matrix is also optimized more efficiently.
Evaluation of the GREML fitfunction's analytic derivatives is now much faster. Specifically, the computational effort involved is now load-balanced among multiple threads, and refactoring the code has eliminated unnecessary computational bottlenecks and has reduced memory demand.
Error reporting is much improved throughout OpenMx.
mxGenerateData() can now accept a dataframe as input instead of an MxModel, in which case it will return data based on a saturated multivariate-normal model.
mxGenerateData() is now compatible with joint ordinal-and-continuous datasets.
mxGenerateData() now approximates the missingness pattern of the original data. Note that this is a backwards-incompatible change in default behavior. The previous default behavior can be restored with argument
Diagnostics for confidence intervals are now displayed in the output of
summary() with argument
When evaluating raw-data row loglikelihoods in a row-wise parallel manner, OpenMx now dynamically balances the computational workload among multiple threads using empirical times elapsed.
Continuous-time state-space models now allow non-invertible ("drift" or "dynamics")
SLSQP now ignores inactive inequality constraints and extraneous equality constraints, and correctly reports when inequality constraints cannot be satisfied.
The Wu & Neale (2012) adjustment for parameters with upper or lower bounds has been implemented for confidence intervals, and is applied by default. Note that this is a backward-incompatible change in default behavior. To disable the adjustment, provide argument
mxRefModels() now correctly handles MxModels with a single-variable dataset.
mxTryHard() and its ilk now no longer compute the numerical Hessian and standard errors when there are MxConstraints in the model. This makes its behavior both consistent with
mxRun(), and correct in the general case, as OpenMx's numerical standard errors will not in general be valid in the presence of MxConstraints.
The following functions are now usable as part of MxAlgebras:
The documentation for
mxComputeGradientDescent() has been expanded and clarified.
The documentation for
mxFitFunctionR() now warns against defining the fitfunction with functions that call OpenMx's backend (most notably
omxMnor()), because doing so can crash R.
mxTryHard() et al. previously ignored the values of certain mxOptions if those options were set specifically to the MxModel being run, and instead used those options' globally set values. This bug has been repaired.
A bug involving
omxSetParameters() and global R option
mxCondenseMatrixSlots set to
TRUE has been repaired. This bug would have most likely manifested itself as mysterious errors at runtime involving the internal function 'setParametersMatrix'.
A number of known issues with the beta release of version 2.7 (which was v2.7.4) have been resolved for v2.7.9:
The most serious issue with the beta release of version 2.7 (v2.7.4) was its oversensitivity to start values. This issue has been resolved for v2.7.9.
Formerly, if an MxModel was using the default compute plan, then
mxRun() would silently override the values of mxOptions "Gradient step size", "Gradient iterations", and 'Function precision". The on-load default for these options is now the character string "Auto", which is automatically overridden with sensible numerical values at runtime, as in previous versions. However, if the user sets his/her own numerical values for these options prior to runtime, then
mxRun() will respect those user-supplied values.
For use in MxAlgebras, functions
pnbinom() have been replaced with
omxPnbinom(); these new functions are compatible with
Scores calculated by
mxKalmanScores() are now correct.
Several bugs in the sufficient-statistic optimization of Rampart (OpenMx's multilevel SEM algorithm) have been repaired.
Running an MxModel containing an MxAlgebra that uses
omxAllInt() no longer ends with an error if
omxAllInt() returns a probability of zero.
Running a FIML analysis with a dataset containing a large (>1000) number of endogenous variables no longer ends in an error.
Previously, using NPSOL or SLSQP to run an MxModel containing an MxConstraint that involved fixed parameters may have resulted in an error. This bug has been repaired.
mxGetExpected() on an MxModel containing submodels that refer to the container no longer results in an error.
An unnecessary and slow matrix-by-matrix multiplication is no longer carried out when the optimizer invokes the GREML fitfunction to obtain only the fitfunction value (and not any analytic derivatives).
Some known issues with v2.7.9 exist:
The conditions under which NPSOL expects the sign of an analytic constraint Jacobian to be positive versus negative are not simple. We expect that a future release of OpenMx will address this issue with clearer documentation and/or a streamlined backend interface with NPSOL.
When using SLSQP with an MxModel containing MxConstraints, OpenMx has no way of checking the optimality conditions of SLSQP's solution. Therefore, under such conditions, OpenMx will not return status code 5 or 6 when it actually should. This bug is expected to be repaired in a future release.
If an object of class 'MxRAMModel' is loaded from an .RData file before the OpenMx package is loaded into R's workspace, then the methods (e.g.,
summary()) defined for that class will not work.
On 32-bit Windows, relative to version 2.6, version 2.7 has more difficulty reaching the global fitfunction minimum with NPSOL in MxModels involving ordinal data.