Pritikin, Rappaport & Neale (2017). Liklihood-based confidence intervals for a parameter with an upper or lower bound

Posted on
No user picture. Sparty Joined: 04/27/2015

I read the article in Structural Equation Modeling Journal. I would like to try to replicate your findings. Would it be possible to obtain a copy of your script?

Replied on Wed, 08/16/2017 - 12:54
Picture of user. bwiernik Joined: Jan 30, 2014

Related question: If I just add an mxCI() call to model with a bounded parameter, will OpenMx appropriately select the SLSQP optimizer automatically, or do I need to specify this? Secondly, if a parameter has both a lower and upper bound (e.g., an estimate of an R squared value in a standardized regression model), does any appropriate adjustment for the CI currently exist?

Replied on Wed, 08/16/2017 - 13:46
Picture of user. jpritikin Joined: May 23, 2012

In reply to by bwiernik

> If I just add an mxCI() call to model with a bounded parameter, will OpenMx appropriately select the SLSQP optimizer automatically, or do I need to specify this?

You need to specify the optimizer.

> Secondly, if a parameter has both a lower and upper bound (e.g., an estimate of an R squared value in a standardized regression model), does any appropriate adjustment for the CI currently exist?

In this case, no adjustment is implemented.

Replied on Fri, 08/18/2017 - 12:36
Picture of user. AdminRobK Joined: Jan 24, 2014

In reply to by bwiernik

Concerning SLSQP, you do indeed need to select the optimizer yourself. The simplest way to do that is, of course, with mxOption(NULL,"Default optimizer","SLSQP"), which (unless you're using a custom compute plan) will cause SLSQP to be used for both the primary optimization (for the point estimates) and the secondary optimizations to find the confidence limits.

Now, suppose you want to use SLSQP for confidence limits, but use a different optimizer (NPSOL, say) for the primary optimization. One way to accomplish that is:

mxOption(NULL,"Default optimizer","NPSOL")
myModel <- mxRun(myModel, intervals=FALSE)
mxOption(NULL,"Default optimizer","SLSQP")
#omxParallelCI() is named for its not-yet-implemented behavior of parallelizing over the quantities in mxCI() argument 'reference':
myModelPCI <- omxParallelCI(myModel)

Another way to accomplish it is by a custom compute plan:

plan <- omxDefaultComputePlan(intervals=TRUE)
plan$steps$GD$engine <- "NPSOL"
plan$steps$CI$plan$engine <- "SLSQP"
plan$steps$CI$constraintType <- "ineq"

Then, include plan in your MxModel object, just as you would, say, an MxAlgebra.

If you're concerned about more than one parameter bound, or about implicit bounds arising from the choice of parameterization, consider using bootstrap CIs, via mxBootstrap(). The default behavior is to compute and report bias-corrected quantile intervals, which, like profile-likelihood intervals, are bound- and constraint-respecting, "transformation-respecting" under change-of-parameter, and not required to be asymmetric. Note that the default coverage probability of bootstrap CIs is 50%; if you want wider coverage probability, use more than the default 200 bootstrap replications (I recommend 1000 at bare minimum for 95% CIs.