The path specification for an ordinal model in the documentation constrains the residual variances for the ordinal variables to 1. I would like to instead constrain the total variance for the ordinal variables to 1. But I'm not sure how to accomplish this. When the total variance is constrained to 1, there residual variance is constrained to 1 minus the factor loading squared (the factor loadings are constrained to be between -1 and 1) as I understand it. I was able to accomplish this in the matrix model but would like to be able to do it in the path type model.
Hi Richard
You could extract the diagonal of the expected covariance matrix and use mxConstraint to equate this to a unit vector. You lose SE's when using mxConstraints, however. Here's an example:
Richard wants to know how to do it with path specification, though, and not matrix specification. I'm not sure, though, that there's a good way to do it with path specification that doesn't involve creating MxAlgebras and MxConstraints.
Also, with matrix specification, it's possible to do it without using MxConstraints,
though this is slightly more difficult to optimize, since the constraint is only implicit.
Another equivalent approach (same model fit) is simply to fix the residuals to a positive constant like 1. This has the effect of returning unstandardized thresholds and parameters etc. but standardized parameters can be returned for RAM models. That doesn't solve the threshold ordering problem, for which I don't see an alternative except the algebra. Might be good for threshold RAM models to do the ordering internally and automagically.
In the single-factor case, something you could do is as follows. Give parameter labels to the paths that represent your factor loadings and your unique ("residual") variances. Create an MxMatrix that also contains the factor loadings, by assigning its elements the same parameter labels that you gave the loading paths. Also create a diagonal MxMatrix that contains the unique variances, again by use of labels. Create an MxAlgebra that multiplies the matrix of loadings by its transpose, and adds that product to the diagonal matrix of uniquenesses. Finally, using
diag2vec()
, create an MxConstraint that sets the diagonal elements of the algebra's result to unity.You can probably see that the sort of constraint you're asking about isn't something that's easy to do with MxPath specification, which is probably why the example fixes the unique variances instead.