# SEM, Binary and Categorical Data in independent variables

4 posts / 0 new
Offline
Joined: 02/23/2015 - 04:05
SEM, Binary and Categorical Data in independent variables
AttachmentSize
17.99 KB
2.95 KB
98.36 KB

The data set has (please see example diagram)
+ 3 continuous variables(X1, X2, X3) for a latent variable (intercept)
+ 3 mediators (one binary X8 and two categorical variables X6, X7)
+ 1 dependent variable (X4).

This coding was based on the post about Categorical Data in both independent and dependent variables https://openmx.ssri.psu.edu/thread/3883

When I run SEM.R model I have following error message.

Error in mxRAMObjective(A = "A", S = "S", M = "M", thresholds = "Threshold") :
argument 'F' is not a string (the name of the 'F' matrix)

When I delete #Threshold matrix from the SEM.R, I have the following error message.

Error: The following error occurred while evaluating the subexpression 'Linear Growth Curve Model Path Specification.I - Linear Growth Curve Model Path Specification.A' during the evaluation of 'expVars' in model 'Linear Growth Curve Model Path Specification' : non-conformable arrays

# Threshold matrix

mxMatrix(type = "Full", nrow = 1, ncol = 7, free = c(T, T, T, T, T, T, T),
values = c(-0.18173563, -1.27430357,-1.75717640, 0.37933827,-0.01542988, -0.82819033, -0.12312234), byrow = T, dimnames = list(c(), c("X1","X2","X3","X4","X6","X7","X8")),
name = "Threshold"),

# Means and covaraince matrix

mxRAMObjective(A="A", S="S", M="M", thresholds = "Threshold")

I know you are busy! But I will return you back! I appreciate your time!

Hyoshin,
University of Maryland

Offline
Joined: 04/19/2011 - 21:00
The first error you mention

The first error you mention is occurring because mxRAMObjective() needs a character string value for its argument F, which has no default. The character string you provide is supposed to be the name of the 'F' (filter) matrix in the MxModel. I think what you want to do instead is

mxRAMObjective(A="A", S="S", M="M", F="F", thresholds = "Threshold")

The second error you mention is occurring because your identity matrix "I" is 7x7, but your asymmetric-paths matrix "A" ends up being 8x8, since you have 7 manifest variables and 1 latent variable. Redefine "I" as

mxMatrix("Iden",8,8,name="I")

Further, I notice the 7th line of your script is

dataset$X7 <- mxFactor(dataset$X8, levels = c(0, 1), ordered = T);

I suspect you want to do

dataset$X8 <- mxFactor(dataset$X8, levels = c(0, 1), ordered = T);

You'll also need to provide X8 with thresholds, for instance,

mxThreshold(vars='X8', nThresh=1, values=1)

Finally, if you're using mxThreshold() in a RAM-type model, I'm not sure you need the thresholds matrix. I think you can simply adjust your objective to

mxRAMObjective(A="A", S="S", M="M", F="F", thresholds = "Thresholds")
Offline
Joined: 01/24/2014 - 12:15
Try this

This syntax, starting right after the dataset is loaded, appears to work:

vars <- c("X1","X2","X3","X4","X6","X7","X8");
dataset$X6 <- mxFactor(dataset$X6, levels = c(1, 2, 3), ordered = T);
dataset$X7 <- mxFactor(dataset$X7, levels = c(1, 2, 3), ordered = T);
dataset$X8 <- mxFactor(dataset$X8, levels = c(0, 1), ordered = T);
fmat <- diag(7)[c(4,5,7),]
growthCurveModel <- mxModel(
"Linear Growth Curve Model Path Specification",
type="RAM",
mxThreshold(vars='X6', nThresh=2, values=c(1, 3)),
mxThreshold(vars='X7', nThresh=2, values=c(1, 3)),
mxThreshold(vars='X8', nThresh=1, values=1),
mxData(dataset, type="raw"),
manifestVars=c("X1","X2","X3","X4","X6","X7","X8"),
latentVars=c("intercept"),
mxMatrix("Iden",8,8,name="I"), mxMatrix("Unit",3,1,name="u3"),
mxMatrix("Full",3,7,values=fmat,name="fmat"),
mxAlgebra(diag2vec(fmat%&%(F%&%(solve(I-A)%&%S))), name="expVars"),
mxConstraint(expVars==u3,name="Varcon"),
# latent variances and covariance
mxPath(from = "intercept", to = "X6", arrows = 2, values = 0, free = T, labels = "cov6"),
mxPath(from = "intercept", to = "X7", arrows = 2, values = 0, free = T, labels = "cov7"),
mxPath(from = "intercept", to = "X8", arrows = 2, values = 0, free = T, labels = "cov8"),
mxPath(from = c("X1","X2","X3","X4","X6","X7","X8"), arrows = 2, free = c(F, F, F, T, T, T, T), values = c(1,1,1,1,1,1,1), lbound=.01),
mxPath(from = "intercept", arrows = 2, free = T, values = 1, lbound=.01),

mxPath(from = "intercept", to=c("X1","X2","X3"), arrows=1, free=FALSE, values = 0, labels= c("a1","a2","a3")),
mxPath(from = c("intercept", "X6"), to = "X4", arrows = 1, values = 0, free = c(T,T), labels = c("i678", "b6")),
mxPath(from = c("intercept", "X7"), to = "X4", arrows = 1, values = 0, free = c(T,T), labels = c("i678", "b7")),
mxPath(from = c("intercept", "X8"), to = "X4", arrows = 1, values = 0, free = c(T,T), labels = c("i678", "b8")),
# manifest means
mxPath(
from="one",
to=c("X1","X2","X3","X4","X6","X7","X8"),
arrows=1,
free=FALSE,
values=c(0, 0, 0, 0, 0, 0, 0)
),
# latent means
mxPath(
from="one",
to=c("intercept"),
arrows=1,
free=TRUE,
values=c(0),
labels=c("meani")
),
#Means and covaraince matrix
mxRAMObjective(A="A", S="S", M="M", F="F", thresholds = "Thresholds")
) # close model

run <- mxRun(growthCurveModel, intervals=F)

You will want to adjust starting values, though.

Edit: In particular, note the extra parentheses in mxAlgebra(diag2vec(fmat%&%(F%&%(solve(I-A)%&%S))), name="expVars"). One needs to be careful about order-of-operations when using the quadratic product operator, %&%.

Offline
Joined: 02/23/2015 - 04:05
Thank you so much!

Please allow me to work on this. I will come back with good results.
I really appreciate both of you spending time for this problem. Hope you can get rewards and good lucks in your work!