You are here

New features in OpenMx v2.2

New Features Since 2.0.1

OpenMx has a number of new features available in version 2.2.x.

Perhaps most significantly, we have a new optimizer: SLSQP - An open source BFGS optimizer from the NLOPT collection. Our experience is that SLSQP performs similarly to NPSOL on unconstrained problems and outperforms it on some constrained problems. SLSQP is our new default optimizer.

As a result, OpenMx is now available on CRAN.

Note that CRAN binaries do not include NPSOL and uses only 1 CPU (i.e., CRAN binaries are not compiled with OpenMP enabled). To access NPSOL and parallel execution, continue to install OpenMx binaries from the OpenMx website: These are enabled to use multiple CPUs and include NPSOL.

OpenMx 2.2 includes major new data types and new model building methods:

  • WLS (weighted least square analysis)! HERE is an example for WLS.
  • LISREL MxModel type so paths can be given for RAM or LISREL. HERE is an example for LISREL.
  • GREML (genomic-relatedness-matrix restricted maximum likelihood), first implemented in GCTA, is now possible in OpenMx via a new expectation and fitfunction class. HERE is an example for GREML.

There are several additional helpful functions:

  • mxMI() Modification indicies for any single-group likelihood-based model.
  • mxGenerateData() Generate data based on a single-group RAM, LISREL, Normal, or State Space model.
  • mxGetExpected() Get the expected means, covariance, or thresholds from a RAM, LISREL, or Normal model.
  • mxCheckIdentification() Check the identification of single or multigroup, RAM, LISREL, Normal, or State Space model.
  • omxRMSEA() Get the RMSEA with confidence interval and test of approximate fit. Also, reported in mxSummary.
  • mxKalmanScores() Get the Kalman latent state scores from a state space model. It can also be adapted for non-ordinal factor scores.
  • mxFactorScores() Estimate latent variable scores from a LISREL factor model via several methods including maximum likelihood and for ordinal data.
  • mxAlgebraFromString() Construct an mxAlgebra from an R expression provided as a character string.

The new version also brings improvements to existing functions:

  • mxFitFunctionMultigroup() used to require "modelname.fitfunction", : now "modelname" will work too.
  • Definition variables work correctly with mxFitFunctionRow().
  • Confidence intervals are improved:
    • The parameter vector found at each confidence limit ("bound") is now available in mxSummary(verbose=T).
    • Large discrepancies between expected and obtained fits are now detected and will result in a confidence limit of NA. In this circumstance, the model is not sufficiently identified. Additional bounds on parameters may help.
    • When finding bounds of parameters (not algebras), SLSQP uses an analytic gradient for a part of the profile CI problem. This results in a substantial performance boost.
  • Improvements to CSOLNP. Note that CSOLNP should still be used with caution because it is known to have trouble with profile confidence intervals.
  • State space models have been extended to include continuous time. mxExpectationStateSpaceContinuousTime()
  • For unconstrained problems, more consistent detection of code red/6 (gradient not close enough to 0); note that this may cause models to throw code red/6 that did not do so in previous versions of OpenMx. Furthermore, for a local minimum (status code green/0), asymmetry in the gradient is flagged in the summary (column "A" in the free parameters table). Asymmetric gradients will likely result in inaccurate SEs. Hence, profile CIs are recommended in these cases.
  • Improvements to mxTryHard().
  • Improvements to the internal interface with NPSOL:
    • Care is taken such that the fit will never worsen in unconstrained problems.
    • NPSOL will make more effort to respect the feasibility tolerance in constrained problems.
  • Improved backward compatibility: objects produced under OpenMx v1.x and saved to .RData will now work with v 2.x in more instances.
  • For models with definition variables, mxRun() will return with MxAlgebras recomputed using the first row of data. Previously the MxAlgebra results depending on definition variables were inconsistent.
  • mxComputeEM() (Expectation-Maximization) and mxComputeNewtonRaphson() now respect box constraints and soft feasibility constraints.
  • For advanced users, the compute plan is now available for your inspection in model$compute after a model is returned by mxRun().

There are also several known issues with version 2.2.6 (the most recent binary release):

  • We were unable to test binaries on Mac OSX Snowleopard. If you currently run Snowleopard and would like to test and/or build binaries of OpenMx, please contact us.
  • SLSQP can get confused about whether it has infeasible starting values or is starting optimization at the minimum. This bug will be repaired in the next binary release.
  • Users may encounter unexpected behavior if they use definition variables in MxAlgebras outside the MxModel that contains the data containing those definition variables.
  • There is a serious bug in how the backend GREML fitfunction handles its analytic derivatives. We recommend not using such derivatives (i.e., do not use argument 'dV' to mxFitFunctionGREML()) until the next binary release, which will contain the necessary bug-fix, and will also be able to use multiple CPUs to calculate the derivatives.
  • WLS (weighted least squares) does not work with multigroup models (this is expected to work in subsequent releases).
  • WLS with continuous data does not work with missing data.
  • When used with joint ordinal-continuous data, WLS can produce biased parameter estimates; attempting to use WLS with such data in version 2.2.6 will throw a warning.
  • There is a bug when trying to do random effects in the Boker-Rand matrix fashion with state space models. This bug will be repaired in the next binary release.


I recently repaired another serious GREML bug. The bug-fix will be incorporated in the next binary release. I therefore recommend using mxFitFunctionML() instead of mxFitFunctionGREML() until the next binary release.

Alternately, advanced users can always build OpenMx from the source repository.