Attachment | Size |
---|---|
Data | 408.97 KB |
Model | 60.46 KB |
forumscript.R | 2.28 KB |
Dear OpenMx-ers,
For my research, I am running a latent variable model with a structural regression between four latent variables that are all measured by a set of ordinal manifest variables. Attached is the dataset, a minimalized R-script and a screenshot of the structural model. Because the manifest variables are ordinal (3 or 4 categories) and highly skewed, I applied a threshold model and used WLS as an estimator. I have been able to successfully run the separate measurement models of each of the X, Y, and Z constructs. However, when I combine these models and add a structural regression between the latent constructs I receive the error message: "Error in t(jac0C) %*% W: Non-conformable arguments"
.
According to mxCheckIdentification() my model is correctly identified. I also used mxAutoStart() to improve the starting values, but this results in the error: "Error in dataThresh[, tName] : no 'dimnames' attribute for array"
.
Can you reproduce this problem? And do you know a solution?
Details:
OpenMx version: 2.7.17 [GIT v2.7.17]
R version: R version 3.2.3 (2015-12-10)
Platform: x86_64-apple-darwin13.4.0
MacOS: 10.11.6
Default optimiser: CSOLNP
NPSOL-enabled?: No
OpenMP-enabled?: No
Script:
forumdata<-read.table(file="forumdata.dat") xa.manifests=c("X1","X3","X6","X8","X10","X11","X14") xb.manifests=c("X2","X4","X5","X7","X9","X12","X13") y.manifests=c("Y1","Y2","Y3","Y4","Y5","Y6","Y7","Y8","Y9") z.manifests=c("Z1","Z2","Z3","Z4","Z5","Z6","Z7") manifests=c(xa.manifests,xb.manifests,y.manifests,z.manifests) # The model mod <- mxModel(name="model1",type="RAM", # Data mxDataWLS(forumdata,type="WLS"), # Specify variables manifestVars=manifests, latentVars=c("Xa","Xb","Y","Z"), # Means mxPath(from="one",to=manifests,arrows=1,free=T,values=0,labels=manifests), # Thresholds mxThreshold(vars=c(xa.manifests,xb.manifests),nThres=4,free=c(F,T,T,F),values=c(-.5,-.3,.3,.5)), mxThreshold(vars=y.manifests, nThres=3,free=c(F,T,F),values=c(-.5,0,.5)), mxThreshold(vars=z.manifests, nThres=3,free=c(F,T,F),values=c(-.5,0,.5)), # Residual variances mxPath(from=manifests, arrows=2,free=T,labels=paste("error",manifests)), # Factor loadings mxPath(from="Xa", to=xa.manifests,arrows=1,free=T,values=.8,labels=paste("loading",xa.manifests)), mxPath(from="Xb", to=xb.manifests,arrows=1,free=T,values=.8,labels=paste("loading",xb.manifests)), mxPath(from="Y", to=y.manifests, free=T, values=.8,labels=paste("loading",y.manifests)), mxPath(from="Z", to=z.manifests, free=T, values=.8,labels=paste("loading",z.manifests)), # Latent (co)variances mxPath(from=c("Xa","Xb"), arrows=2, connect="unique.pairs",free=c(F,T,F), values=c(1,.5,1),labels=c("varXa","covXab","varXb")), mxPath(from="Y", arrows=2, free=F, values=1, labels="varY"), mxPath(from="Z", arrows=2, free=F, values=1, labels="varZ"), mxPath(from="Y", to="Z", arrows=2, free=T, values=.5, labels=c("covYZ")), # Structural regression mxPath(from=c("Xa","Xb"), to="Y", arrows=1, free=c(T,T), values=c(-.05,.5), labels=c("b_Xa_Y","b_Xb_Y")), mxPath(from=c("Xa","Xb"), to="Z", arrows=1, free=c(T,T), values=c(-.05,.5), labels=c("b_Xa_Z","b_Xb_Z")), # Fit model with WLS fitFunction <- mxFitFunctionWLS() ) mxCheckIdentification(mod) mxAutoStart(mod) modrun<-mxRun(mod)
Hi Paul,
Thanks for sharing a full working example! That really help resolve issues like this. The problem seems to be related to the thresholds. More specifically, because the number of thresholds differs across items and
mxThresholds
build s a threshold matrix with zeros in it instead of NA for the thresholds that do not get used. On the development side, the team will need to discuss what the best fix for this is. In the meantime for you, you can just add a couple lines of code to get the model to run. Changeto
The added line puts NA in the last threshold for the items that only have values from 0 through 3, instead of the items that have values from 0 through 4.
Also, note that the
mxAutoStart
function does not modify the model, but rather returns a new model with starting values changed.But there appears to be a bug in
mxAutoStart
in that it does not work for WLS data. The method itself uses WLS, so I didn't conceive of anyone using it for WLS. It won't make anything much faster for WLS.Thanks Michael! Your solution solved my problem!
Just an update here: as of version 2.7.18 of OpenMx the original script will run without the added line that set some of the threshold values to NA.