# Delta parameterization of ordinal veriables

ordinal variable’s scale and location. The two most common seem to be *delta* parameterization (fixing total means and total variances to 0 and 1) and *theta* parameterization (fixing residual means and residual variances to 0 and 1).

Theta parameterization, if my understanding is correct, is fairly easy to implement. It is only a matter of fixing residual means and variances of the indicators to 0 and 1, respectively, as [described in the documentation](https://vipbg.vcu.edu/vipbg/OpenMx2/docs//OpenMx/latest/Ordinal_Path.html). However, it is unclear to me how I would create an mxAlgebra with delta parameterization according to these equations in OpenMx. Some code examples would be appreciated.

Total variance set to equal 1

$$

\theta_{ii} = \sigma_{i}^{2\*} - \Lambda_{i} \Psi^{\*} \Lambda_{i}^{T} \bigg\rvert_{\sigma_i^{2\*}=1} = 1 - \Lambda_{i} \Psi^{\*} \Lambda_{i}^{T}

$$

Total means set to 0?

$$

\mu_{ij}^{\*} = v_{ij} + \Lambda_i\alpha_j^{\*}\bigg\rvert_{\mu_{ij}^{\*}=0}

$$

where ν_ij is the intercept for variable i in row j, Λ_i is the row vector of Λ for variable i, and Θ_ii is the diagonal element of Θ that estimates the residual variance of variable i.

## Attached

The big picture is you will generally use nonlinear constraints (

`mxConstraint()`

) to make the total mean and variance zero and one, respectively. To do this without writing the algebra for the model-implied means and covariances yourself, you can refer to the model-implied (i.e., expected) means and covariance as outlined below.thetaMod2 <- mxModel(thetaMod,

# Create 'empty' matrices to refer to means and covs

mxMatrix('Full', nrow=1, ncol=length(mv), name='emean'),

mxMatrix('Symm', nrow=length(mv), ncol=length(mv), name='ecov'),

# Refer to the 'empty' matrices in expectattion

mxExpectationRAM(A='A', S='S', F='F', M='M', thresholds='Thresholds',

expectedMean='emean', expectedCovariance='ecov'),

# Create matrices for constrained values

mxMatrix(type='Zero', nrow=1, ncol=length(mv), name='Z'),

mxMatrix(type='Unit', nrow=length(mv), ncol=1, name='I'),

# Constrain means and variances

mxConstraint(emean == Z, name='mcon'),

mxConstraint(diag2vec(ecov) == I, name='vcon'),

# Add data

mxData(type='raw', ds),

# Add fit function

mxFitFunctionML())

Hopefully, this helps!

Log in or register to post comments