Adding thresholds to model using umxThresholdMatrix

Posted on
No user picture. lf-araujo Joined: 11/25/2020
Hi all,

I am trying to add ordinal variables to the mrdoc model. I can't understand the proper way of setting this up using umxThresholdsMatrix. It seems OpenMx is complaining about the autonaming of the parameters:


Error: The thresholds matrix associated with the expectation function in m
odel 'MZ' contains column names and the expectation function has specified
non-identical threshnames.

Here is the MWE:


library(umx)
library(dplyr)
library(ggplot2)

data(docData)

mzData = subset(docData, zygosity %in% c("MZFF", "MZMM")) %>%
# remove all with B in the name
select(-contains("B"), -zygosity) %>%
mutate(varA1_T1 = cut_number(varA1_T1, 4, ordered_result=T),
varA1_T2 = cut_number(varA1_T2, 4, ordered_result = T)
)

# same for dz

dzData = subset(docData, zygosity %in% c("DZFF", "DZMM")) %>%
# remove all with B in the name
select(-contains("B"), -zygosity) %>%
mutate(varA1_T1 = cut_number(varA1_T1, 4, ordered_result=T),
varA1_T2 = cut_number(varA1_T2, 4, ordered_result = T)
)

top = mxModel("top",
umxMatrix("BE", type = "Full",nrow=3, ncol = 3,
labels = c(NA, "g2", "b1",
"g1", NA, "b2",
NA, NA, NA),
free = c(FALSE, FALSE, TRUE,
TRUE, FALSE, TRUE,
FALSE, FALSE, FALSE)),
umxMatrix('I', type='Iden', nrow= 3,ncol= 3 ),
umxMatrix('F', type='Full', nrow=5, ncol=6, free=FALSE,
values=c(1,0,0,0,0,0,
0,1,0,0,0,0,
0,0,1,0,0,0,
0,0,0,1,0,0,
0,0,0,0,1,0)),
umxMatrix('LY', type='Full',nrow=3, ncol = 3, free = FALSE, values = diag(3),
labels = NA),
umxMatrix('A', type='Symm', nrow=3,ncol = 3,
labels=c("ab2","abraas",NA,
"abraas","as2",NA,
NA,NA,"x2"),
free=c(TRUE,TRUE,FALSE,
TRUE,TRUE,FALSE,
FALSE,FALSE,TRUE)),
umxMatrix('C', type='Symm',nrow=3, ncol = 3,
labels =c("cb2","cbrccs",NA,
"cbrccs","cs2",NA,
NA,NA,NA),
free=c(TRUE,TRUE,FALSE,
TRUE,TRUE,FALSE,
FALSE,FALSE,FALSE)),
umxMatrix('E', type='Symm', nrow=3, ncol = 3,
labels =c("eb2",NA,NA,
NA,"es2",NA,
NA,NA,NA),
free= c(TRUE,FALSE,FALSE,
FALSE,TRUE,FALSE,
FALSE,FALSE,FALSE)),
umxMatrix('dzmu', type='Full', nrow=1, ncol=6, free=TRUE, values= 0, labels=c('muPh1','muPh2','muPS1','muPh1','muPh2','muPS1')),
mxAlgebra('mzmu', expression = dzmu%*%t(F)),
mxAlgebra('A_' , expression = solve(I - BE)%&%A),
mxAlgebra('C_' , expression = solve(I - BE)%&%C),
mxAlgebra('E_' , expression = solve(I - BE)%&%E),
mxAlgebra('SPh' , expression = A_ + C_ + E_),
mxAlgebra('Smz_', expression = rbind(
cbind(SPh, A_+C_),
cbind(A_+C_, SPh))),
mxAlgebra('Sdz', expression=rbind(
cbind(SPh, .5%x%A_+C_),
cbind(.5%x%A_+C_, SPh))),
mxAlgebra('Smz', expression= F%&%Smz_)
)

tymz <- umxThresholdMatrix(mzData, fullVarNames = c("varA1_T1", "varA1_T2"),
sep = "_T", method ="allFree")
tydz <- umxThresholdMatrix(dzData, fullVarNames = c("varA1_T1", "varA1_T2"),
sep = "_T", method ="allFree")

MZ = mxModel("MZ",
mxData(mzData[1:6], type="raw"),
mxExpectationNormal(covariance = "top.Smz",means = "top.mzmu", dimnames =colnames(mzData[1:5]), thresholds="threshMat"),
tymz,
mxFitFunctionML()
)

DZ = mxModel("DZ",
mxData(dzData[1:6], type="raw"),
mxExpectationNormal(covariance = "top.Sdz",means = "top.dzmu", dimnames =colnames(mzData[1:6]),thresholds="threshMat"),
tydz,
mxFitFunctionML()
)

model = mxModel("mrdoc", top, MZ, DZ, mxFitFunctionMultigroup(c("MZ","DZ") ))
model <- omxAssignFirstParameters(model)

out <- mxRun(model)
summary(out)

- What am I missing there?

Replied on Fri, 06/09/2023 - 09:24
Picture of user. AdminRobK Joined: 01/24/2014

I discussed this with OP. The problem is that the column names passed to `umxThresholdMatrix()` do not match the dimnames passed to `mxExpectationNormal()`.