# ACE RAM model with ordinal manifest

I've been trying everything to get an ordinal manifest working in RAM models but I can't get it done. Also, didn't find anything online about this, as most examples have matrix specification. Would be very appreciated to get some help. Besides from the solution below, I have also tried every possible way with mxthreshold and umxthresholdmatrix.

obesityLevels = c('normal', 'obese')

cutPoints = quantile(twinData[, "bmi1"], probs = .2, na.rm = TRUE)

twinData$obese1 = cut(twinData$bmi1, breaks = c(-Inf, cutPoints, Inf), labels = obesityLevels)

twinData$obese2 = cut(twinData$bmi2, breaks = c(-Inf, cutPoints, Inf), labels = obesityLevels)

# Step 2: Make the ordinal variables into umxFactors (ordered, with the levels found in the data)

selVars = c("obese1", "obese2")

twinData[, selVars] = umxFactor(twinData[, selVars])

#tmp = umxThresholdMatrix(twinData, selDVs = selVars, sep = "", verbose = TRUE)

```
```tmp = umx_make_twin_data_nice(data=twinData, sep="", zygosity="zygosity", numbering=1:2)

tmp = umx_scale_wide_twin_data(varsToScale= c("wt", "ht"), sep= "_T", data= tmp)

mzData = subset(tmp, zygosity %in% c("MZFF", "MZMM"))

dzData = subset(tmp, zygosity %in% c("DZFF", "DZMM"))

latents = c("A1", "C1", "E1", "A2", "C2", "E2")

manifests = c("obese_T1", "obese_T2")

latVariances <- mxPath( from=latents, arrows=2,

free=FALSE, values=1 )

manifestsVariances <- mxPath( from=manifests, arrows=2,

free=FALSE, values=1 )

# means of latent variables

latMeans <- mxPath( from="one", to=latents, arrows=1,

free=FALSE, values=0 )

# means of observed variables

obsMeans <- mxPath( from="one", to=manifests, arrows=1,

free=F, values=0, labels="mean" )

# path coefficients for twin 1

pathAceT1 <- mxPath( from=c("A1","C1","E1"), to="obese_T1", arrows=1,

free=TRUE, values = 1, label=c("a","c","e") )

# path coefficients for twin 2

pathAceT2 <- mxPath( from=c("A2","C2","E2"), to="obese_T2", arrows=1,

free=TRUE, values = 1, label=c("a","c","e") )

# covariance between C1 & C2

covC1C2 <- mxPath( from="C1", to="C2", arrows=2,

free=FALSE, values=1 )

# covariance between A1 & A2 in MZ twins

covA1A2_MZ <- mxPath( from="A1", to="A2", arrows=2,

free=FALSE, values=1 )

# covariance between A1 & A2 in DZ twins

covA1A2_DZ <- mxPath( from="A1", to="A2", arrows=2,

free=FALSE, values=.5 )

paths <- list( latVariances, latMeans, obsMeans,

pathAceT1, pathAceT2, covC1C2, manifestsVariances )

dataMZ <- mxData(observed=mzData, type = "raw")

dataDZ <- mxData(observed=dzData, type = "raw")

#threshold <- mxThreshold(vars=c("obese_T1", "obese_T2"), nThresh=c(1), free = T)

threshold <- mxMatrix("Full", nrow=1, ncol=2, byrow=T, name="thresh",

dimnames = list(c(), manifests),

free = c(T, T),

values = c(-.8, -.8),

)

expect <- mxExpectationRAM(A="A", S="S", F="F", M="M", thresholds = "thresh")

fitfunction = mxFitFunctionML()

modelMZ <- mxModel(model="MZ", type="RAM", manifestVars=manifests,

latentVars=latents, paths, covA1A2_MZ, dataMZ, threshold, expect, fitfunction)

modelDZ <- mxModel(model="DZ", type="RAM", manifestVars=manifests,

latentVars=latents, paths, covA1A2_DZ, dataDZ, threshold, expect, fitfunction)

obj <- mxFitFunctionMultigroup(c("MZ", "DZ"))

modelACE <- mxModel("ACE", modelMZ, modelDZ, obj)

`fitACE <- mxRun(modelACE)`

I have tried fixing the threshold across twins and zygosity, but to no avail. The results either are extremely high estimates for the paths with high SEs, or they are just plainly wrong (if compared to umx results). Help is great appreciated,

thank you

## variances don't add up

f1 <- umxACEv(selDVs='obese', sep="_T", dzData=dzData, mzData=mzData)

you can inspect the content of the model and find such a constraint,

f1$top$constrain_Bin_var_to_1

Log in or register to post comments

## Thank you for your reply. I

A <- mxAlgebra( expression=a*a, name="A" )

C <- mxAlgebra( expression=c*c, name="C" )

E <- mxAlgebra( expression=e*e, name="E" )

V <- mxAlgebra( expression=A+C+E, name="V" )

a2 <- mxAlgebra( expression=A/V, name="a2")

c2 <- mxAlgebra( expression=C/V, name="c2")

e2 <- mxAlgebra( expression=E/V, name="e2")

constraint <- mxConstraint(V == 1, name = "constraintbinary")

`modelACE <- mxModel("ACE", modelMZ, modelDZ, obj, A, C, E, V, a2, c2, e2, constraint)`

This addition is successful in constraining the variance to one. However, results are still vastly wrong and the standard errors can't be estimated. You mentioned freeing variances. I have tried that to no avail. Is there anything else to do? Thank you

P.S. the model is easily replicable as it's simply the twinData dataset in umx/OpenMx

Log in or register to post comments

## I got it working now. In

This is the working script:

latents = c("A1", "C1", "E1", "A2", "C2", "E2")

manifests = c("obese_T1", "obese_T2")

latVariances <- mxPath( from=latents, arrows=2,

free=F, values=1)

#manifestsVariances <- mxPath( from=manifests, arrows=2,

# free=F, values=1 )

# means of latent variables

latMeans <- mxPath( from="one", to=latents, arrows=1,

free=FALSE, values=0 )

# means of observed variables

obsMeans <- mxPath( from="one", to=manifests, arrows=1,

free=F, values=0, labels="mean" )

# path coefficients for twin 1

pathAceT1 <- mxPath( from=c("A1","C1","E1"), to="obese_T1", arrows=1,

free=TRUE, values = 1, label=c("a","c","e"), values=.5)

# path coefficients for twin 2

pathAceT2 <- mxPath( from=c("A2","C2","E2"), to="obese_T2", arrows=1,

free=TRUE, values = 1, label=c("a","c","e"), values=.5 )

# covariance between C1 & C2

covC1C2 <- mxPath( from="C1", to="C2", arrows=2,

free=FALSE, values=1 )

# covariance between A1 & A2 in MZ twins

covA1A2_MZ <- mxPath( from="A1", to="A2", arrows=2,

free=FALSE, values=1 )

# covariance between A1 & A2 in DZ twins

covA1A2_DZ <- mxPath( from="A1", to="A2", arrows=2,

free=FALSE, values=.5 )

paths <- list( latVariances, latMeans, obsMeans,

pathAceT1, pathAceT2, covC1C2 )

dataMZ <- mxData(observed=mzData, type = "raw")

dataDZ <- mxData(observed=dzData, type = "raw")

threshold <- mxThreshold(vars=c("obese_T1", "obese_T2"), nThresh=c(1, 1), free = T, labels = "true")

modelMZ <- mxModel(model="MZ", type="RAM", manifestVars=manifests,

latentVars=latents, paths, covA1A2_MZ, dataMZ, threshold)

modelDZ <- mxModel(model="DZ", type="RAM", manifestVars=manifests,

latentVars=latents, paths, covA1A2_DZ, dataDZ, threshold)

obj <- mxFitFunctionMultigroup(c("MZ", "DZ"))

A <- mxAlgebra( expression=a*a, name="A" )

C <- mxAlgebra( expression=c*c, name="C" )

E <- mxAlgebra( expression=e*e, name="E" )

V <- mxAlgebra( expression=A+C+E, name="V" )

a2 <- mxAlgebra( expression=A/V, name="a2")

c2 <- mxAlgebra( expression=C/V, name="c2")

e2 <- mxAlgebra( expression=E/V, name="e2")

constraint <- mxConstraint(V == 1, name = "constraintbinary")

modelACE <- mxModel("ACE", modelMZ, modelDZ, obj, A, C, E, V, a2, c2, e2, constraint)

`fitACE <- mxRun(modelACE)`

Log in or register to post comments

In reply to I got it working now. In by Leo

## nice job

You are accounting for the error variance in the E component. There is no additional error variance to account for or estimate.

Log in or register to post comments

In reply to nice job by jpritikin

## Thank you for your helpful

Log in or register to post comments

## This is my script: I have

mzData = subset(tmp, zygosity %in% c("MZFF", "MZMM"))

dzData = subset(tmp, zygosity %in% c("DZFF", "DZMM"))

latents = c("A1", "C1", "E1", "A2", "C2", "E2", "A3", "C3", "E3", "A4", "C4", "E4")

manifests = c("wt_T1", "obese_T1", "wt_T2", "obese_T2")

latVariances <- mxPath( from=c("A2", "C2", "E2", "A4", "C4", "E4"), arrows=2,

free=T, labels = c("A11", "C11", "E11", "A11", "C11", "E11"))

latVariances2 <- mxPath( from=c("A1", "C1", "E1", "A3", "C3", "E3"), arrows=2,

free=T, labels = c("A21", "C21", "E21", "A21", "C21", "E21"))

#manifestsVariances <- mxPath( from=c("obese_T1", "obese_T2"), arrows=2,

# free=F, values=1 )

# means of latent variables

latMeans <- mxPath( from="one", to=latents, arrows=1,

free=FALSE, values=0 )

# means of observed variables

obsMeans <- mxPath( from="one", to=c("obese_T1", "obese_T2"), arrows=1,

free=F, values=0, labels="mean" )

obsMeans2 <- mxPath( from="one", to=c("wt_T1", "wt_T2"), arrows=1,

free=T, values=0, labels="mean2" )

# path coefficients for twin 1

pathAceT1 <- mxPath( from=c("A1","C1","E1"), to="obese_T1", arrows=1,

free=F, values = 1)

# path coefficients for twin 2

pathAceT2 <- mxPath( from=c("A3","C3","E3"), to="obese_T2", arrows=1,

free=F, values = 1)

# path coefficients for twin 1

pathAceT1_2 <- mxPath( from=c("A2","C2","E2"), to="wt_T1", arrows=1,

free=F, values = 1)

# path coefficients for twin 2

pathAceT2_2 <- mxPath( from=c("A4","C4","E4"), to="wt_T2", arrows=1,

free=F, values = 1)

# covariance between C1 & C2

covC1C2 <- mxPath( from="C1", to="C3", arrows=2,

free=FALSE, values=1 )

# covariance between A1 & A2 in MZ twins

covA1A2_MZ <- mxPath( from="A1", to="A3", arrows=2,

free=FALSE, values=1 )

# covariance between A1 & A2 in DZ twins

covA1A2_DZ <- mxPath( from="A1", to="A3", arrows=2,

free=FALSE, values=.5 )

# covariance between C1 & C2

covC1C2_2 <- mxPath( from="C2", to="C4", arrows=2,

free=FALSE, values=1 )

# covariance between A1 & A2 in MZ twins

covA1A2_MZ_2 <- mxPath( from="A2", to="A4", arrows=2,

free=FALSE, values=1 )

# covariance between A1 & A2 in DZ twins

covA1A2_DZ_2 <- mxPath( from="A2", to="A4", arrows=2,

free=FALSE, values=.5 )

### gen cov

covA1 <- mxPath(from = "A1", to = "A2", arrows=2, free = T, labels = "covA", lbound = 0, ubound = 1)

covA2 <- mxPath(from = "A3", to = "A4", arrows=2, free = T, labels = "covA", lbound = 0, ubound = 1)

covC1 <- mxPath(from = "C1", to = "C2", arrows=2, free = T, labels = "covC", lbound = 0, ubound = 1)

covC2 <- mxPath(from = "C3", to = "C4", arrows=2, free = T, labels = "covC", lbound = 0, ubound = 1)

covE1 <- mxPath(from = "E1", to = "E2", arrows=2, free = T, labels = "covE", lbound = 0, ubound = 1)

covE2 <- mxPath(from = "E3", to = "E4", arrows=2, free = T, labels = "covE", lbound = 0, ubound = 1)

paths <- list( latVariances, latVariances2, latMeans, obsMeans, obsMeans2,

pathAceT1, pathAceT2, covC1C2,

pathAceT1_2, pathAceT2_2, covC1C2_2,

covA1, covA2, covC1, covC2, covE1, covE2)

dataMZ <- mxData(observed=mzData, type = "raw")

dataDZ <- mxData(observed=dzData, type = "raw")

threshold <- mxThreshold(vars=c("obese_T1", "obese_T2"), nThresh=c(1, 1), free = T, labels = "true")

modelMZ <- mxModel(model="MZ", type="RAM", manifestVars=manifests,

latentVars=latents, paths, covA1A2_MZ, covA1A2_MZ_2, dataMZ, threshold)

modelDZ <- mxModel(model="DZ", type="RAM", manifestVars=manifests,

latentVars=latents, paths, covA1A2_DZ, covA1A2_DZ_2, dataDZ, threshold)

obj <- mxFitFunctionMultigroup(c("MZ", "DZ"))

constraint <- mxConstraint(A21+C21+E21 == 1, name = "constraintbinary")

constraint2 <- mxConstraint(A11+C11+E11 == 1, name = "constraintbinary2")

modelACE <- mxModel("ACE", modelMZ, modelDZ, obj)

fitACE <- mxRun(modelACE)

summary(fitACE)

# in umxacev?

blub = umxACEv(name = "blub", selDVs = c("wt", "obese"), mzData = mzData, dzData = dzData, sep = "_T")

umxSummary(blub, showRg = T, std = F)

Log in or register to post comments

## I have been continuously

In a first step I just want to replicate this:

test = umxACEv(name= "bla", selDVs = c("pop0100_w1", "pop0100_w3"), mzData = mzData, dzData = dzData, sep = "_T")

which works excellently.

What I think I can understand is the following:

- mean is not fixed

- variance is not fixed

- first two thresholds are fixed but third one is estimated

- paths from latents to manifests are fixed at 1

So I have tried integrating this, as well as trying different combinations, but they all results either in bogus results or errors. I have tried estimating paths, fixing means, fixing variance, different thresholds and combinations thereof but nothing is working. Any ideas?

Here is the code: Thank you very much

ordDVs = c("pop0100_w1_T1", "pop0100_w1_T2", "pop0100_w3_T1", "pop0100_w3_T2")

cgr2[, ordDVs] = umxFactor(cgr2[, ordDVs])

# subset MZ DZ data

mzData = subset(cgr2, zyg0102w1 == 1)

dzData = subset(cgr2, zyg0102w1 == 2)

manifests = c("pop0100_w1_T1", "pop0100_w1_T2", "pop0100_w3_T1", "pop0100_w3_T2")

latents = c("A1", "C1", "E1", "A2", "C2", "E2", "A3", "C3", "E3", "A4", "C4", "E4")

latVariances <- mxPath( from=c("A2", "C2", "E2", "A4", "C4", "E4"), arrows=2,

free=T, values = 1, labels = c("A11", "C11", "E11", "A11", "C11", "E11"))

latVariances2 <- mxPath( from=c("A1", "C1", "E1", "A3", "C3", "E3"), arrows=2,

free=T, values = 1, labels = c("A22", "C22", "E22", "A22", "C22", "E22"))

# means of latent variables

latMeans <- mxPath( from="one", to=latents, arrows=1,

free=FALSE, values=0 )

# means of observed variables

obsMeans <- mxPath( from="one", to=c("pop0100_w1_T1", "pop0100_w1_T2"), arrows=1,

free=T, values=0, labels="mean" )

obsMeans2 <- mxPath( from="one", to=c("pop0100_w3_T1", "pop0100_w3_T2"), arrows=1,

free=T, values=0, labels="mean2" )

# path coefficients for twin 1

pathAceT1 <- mxPath( from=c("A1","C1","E1"), to="pop0100_w1_T1", arrows=1,

free=F, values = 1)

# path coefficients for twin 2

pathAceT2 <- mxPath( from=c("A3","C3","E3"), to="pop0100_w1_T2", arrows=1,

free=F, values = 1)

# path coefficients for twin 1

pathAceT1_2 <- mxPath( from=c("A2","C2","E2"), to="pop0100_w3_T1", arrows=1,

free=F, values = 1)

# path coefficients for twin 2

pathAceT2_2 <- mxPath( from=c("A4","C4","E4"), to="pop0100_w3_T2", arrows=1,

free=F, values = 1)

# covariance between C1 & C2

covC1C2 <- mxPath( from="C1", to="C3", arrows=2,

free=FALSE, values=1 )

# covariance between A1 & A2 in MZ twins

covA1A2_MZ <- mxPath( from="A1", to="A3", arrows=2,

free=FALSE, values=1 )

# covariance between A1 & A2 in DZ twins

covA1A2_DZ <- mxPath( from="A1", to="A3", arrows=2,

free=FALSE, values=.5 )

# covariance between C1 & C2

covC1C2_2 <- mxPath( from="C2", to="C4", arrows=2,

free=FALSE, values=1 )

# covariance between A1 & A2 in MZ twins

covA1A2_MZ_2 <- mxPath( from="A2", to="A4", arrows=2,

free=FALSE, values=1 )

# covariance between A1 & A2 in DZ twins

covA1A2_DZ_2 <- mxPath( from="A2", to="A4", arrows=2,

free=FALSE, values=.5 )

### gen cov

covA1 <- mxPath(from = "A1", to = "A2", arrows=2, free = T, labels = "covA")

covA2 <- mxPath(from = "A3", to = "A4", arrows=2, free = T, labels = "covA")

covC1 <- mxPath(from = "C1", to = "C2", arrows=2, free = T, labels = "covC")

covC2 <- mxPath(from = "C3", to = "C4", arrows=2, free = T, labels = "covC")

covE1 <- mxPath(from = "E1", to = "E2", arrows=2, free = T, labels = "covE")

covE2 <- mxPath(from = "E3", to = "E4", arrows=2, free = T, labels = "covE")

paths <- list( latVariances, latVariances2, latMeans, obsMeans, obsMeans2,

pathAceT1, pathAceT2, covC1C2,

pathAceT1_2, pathAceT2_2, covC1C2_2,

covA1, covA2, covC1, covC2, covE1, covE2)

dataMZ <- mxData(observed=mzData, type = "raw")

dataDZ <- mxData(observed=dzData, type = "raw")

threshold <- mxThreshold(vars=c("pop0100_w1_T1", "pop0100_w1_T2"), nThresh=c(3, 3), free = c(F, F, T),

labels = c("true1", "true2", "true3"), values = c(-0.33, 1.36, 2),

lbound = c(NA, 0.01, 0.01))

threshold2 <- mxThreshold(vars=c("pop0100_w3_T1", "pop0100_w3_T2"), nThresh=c(3, 3), free = c(F, F, T),

labels = c("true4", "true5", "true6"), values = c(-0.8, 1.5, 3),

lbound = c(NA, 0.01, 0.01))

modelMZ <- mxModel(model="MZ", type="RAM", manifestVars=manifests,

latentVars=latents, paths, covA1A2_MZ, covA1A2_MZ_2, dataMZ, threshold, threshold2)

modelDZ <- mxModel(model="DZ", type="RAM", manifestVars=manifests,

latentVars=latents, paths, covA1A2_DZ, covA1A2_DZ_2, dataDZ, threshold, threshold2)

obj <- mxFitFunctionMultigroup(c("MZ", "DZ"))

#constraint <- mxConstraint(A11+C11+E11 == 1, name = "constraintordinal")

#constraint2 <- mxConstraint(A22+C22+E22 == 1, name = "constraintordinal2")

modelACE <- mxModel("ACE", modelMZ, modelDZ, obj)

fitACE <- mxRun(modelACE)

`summary(fitACE)`

Log in or register to post comments

In reply to I have been continuously by Leo

## put constraints into model

Edit: well, I guess that doesn't apply if you're trying to identify the model by fixing thresholds. If you're going to fix two of the thresholds, you can freely estimate both the means and the variances of the ordinal phenotypes. Also, when people fix two thresholds, they usually fix them to 0 and 1 (but that's arbitrary).

Specifically what "bogus results or errors" are you getting?

Log in or register to post comments

In reply to put constraints into model by AdminRobK

## Hi Rob,

thanks for your reply.

I'm aware that I have to put the mxconstraints into the actual mxmodel, they were just leftovers from a previous version. I have tried two versions:

1. Fixing means to zero and variance of the latents to 1, as well as putting one mxconstraint for each variable in place and estimating all thresholds freely.

2. Estimating variance and means freely and fixing the first two tresholds as well as fixing the paths from latents to manifests to one. As far as I can tell, this is the way umxacev does it?

Method 2 produces the error message "In model 'ACE' Optimizer returned a non-zero status code 5. The Hessian at the solution does not appear to be convex. See ?mxCheckIdentification for possible diagnosis (Mx status RED). "

mxcheckidentification:

> fitACE <- mxRun(modelACE)

Running ACE with 13 parameters

Warning message:

In model 'ACE' Optimizer returned a non-zero status code 5. The Hessian at the solution does not appear to be convex. See ?mxCheckIdentification for possible diagnosis (Mx status RED).

> mxCheckIdentification(modelACE)

Model is not locally identified

$status

[1] FALSE

$jacobian

A22 C22 E22 covA A11 covC C11 covE E11 mean mean2 true3 true6

MZ.cov1_1 1 1 1 0 0 0 0 0 0 0 0 0 0

MZ.cov2_1 0 0 0 0 0 0 0 0 0 0 0 0 0

MZ.cov3_1 0 0 0 1 0 1 0 1 0 0 0 0 0

MZ.cov4_1 0 0 0 0 0 0 0 0 0 0 0 0 0

MZ.cov2_2 1 1 1 0 0 0 0 0 0 0 0 0 0

MZ.cov3_2 0 0 0 0 0 0 0 0 0 0 0 0 0

MZ.cov4_2 0 0 0 1 0 1 0 1 0 0 0 0 0

MZ.cov3_3 0 0 0 0 1 0 1 0 1 0 0 0 0

MZ.cov4_3 0 0 0 0 0 0 0 0 0 0 0 0 0

MZ.cov4_4 0 0 0 0 1 0 1 0 1 0 0 0 0

MZ.mean1 0 0 0 0 0 0 0 0 0 1 0 0 0

MZ.mean2 0 0 0 0 0 0 0 0 0 1 0 0 0

MZ.mean3 0 0 0 0 0 0 0 0 0 0 1 0 0

MZ.mean4 0 0 0 0 0 0 0 0 0 0 1 0 0

MZ.thr1_1 0 0 0 0 0 0 0 0 0 0 0 0 0

MZ.thr2_1 0 0 0 0 0 0 0 0 0 0 0 0 0

MZ.thr3_1 0 0 0 0 0 0 0 0 0 0 0 1 0

MZ.thr1_2 0 0 0 0 0 0 0 0 0 0 0 0 0

MZ.thr2_2 0 0 0 0 0 0 0 0 0 0 0 0 0

MZ.thr3_2 0 0 0 0 0 0 0 0 0 0 0 1 0

MZ.thr1_3 0 0 0 0 0 0 0 0 0 0 0 0 0

MZ.thr2_3 0 0 0 0 0 0 0 0 0 0 0 0 0

MZ.thr3_3 0 0 0 0 0 0 0 0 0 0 0 0 1

MZ.thr1_4 0 0 0 0 0 0 0 0 0 0 0 0 0

MZ.thr2_4 0 0 0 0 0 0 0 0 0 0 0 0 0

MZ.thr3_4 0 0 0 0 0 0 0 0 0 0 0 0 1

DZ.cov1_1 1 1 1 0 0 0 0 0 0 0 0 0 0

DZ.cov2_1 0 0 0 0 0 0 0 0 0 0 0 0 0

DZ.cov3_1 0 0 0 1 0 1 0 1 0 0 0 0 0

DZ.cov4_1 0 0 0 0 0 0 0 0 0 0 0 0 0

DZ.cov2_2 1 1 1 0 0 0 0 0 0 0 0 0 0

DZ.cov3_2 0 0 0 0 0 0 0 0 0 0 0 0 0

DZ.cov4_2 0 0 0 1 0 1 0 1 0 0 0 0 0

DZ.cov3_3 0 0 0 0 1 0 1 0 1 0 0 0 0

DZ.cov4_3 0 0 0 0 0 0 0 0 0 0 0 0 0

DZ.cov4_4 0 0 0 0 1 0 1 0 1 0 0 0 0

DZ.mean1 0 0 0 0 0 0 0 0 0 1 0 0 0

DZ.mean2 0 0 0 0 0 0 0 0 0 1 0 0 0

DZ.mean3 0 0 0 0 0 0 0 0 0 0 1 0 0

DZ.mean4 0 0 0 0 0 0 0 0 0 0 1 0 0

DZ.thr1_1 0 0 0 0 0 0 0 0 0 0 0 0 0

DZ.thr2_1 0 0 0 0 0 0 0 0 0 0 0 0 0

DZ.thr3_1 0 0 0 0 0 0 0 0 0 0 0 1 0

DZ.thr1_2 0 0 0 0 0 0 0 0 0 0 0 0 0

DZ.thr2_2 0 0 0 0 0 0 0 0 0 0 0 0 0

DZ.thr3_2 0 0 0 0 0 0 0 0 0 0 0 1 0

DZ.thr1_3 0 0 0 0 0 0 0 0 0 0 0 0 0

DZ.thr2_3 0 0 0 0 0 0 0 0 0 0 0 0 0

DZ.thr3_3 0 0 0 0 0 0 0 0 0 0 0 0 1

DZ.thr1_4 0 0 0 0 0 0 0 0 0 0 0 0 0

DZ.thr2_4 0 0 0 0 0 0 0 0 0 0 0 0 0

DZ.thr3_4 0 0 0 0 0 0 0 0 0 0 0 0 1

`$non_identified_parameters`

[1] "A22" "C22" "E22" "covA" "A11" "covC" "C11" "covE" "E11"

Log in or register to post comments

## umxTwinMaker umxACE umxACEv

1. You're trying to implement an ACE model in path specification.

2. You're struggling with thresholds.

In answer to 1, The `umxTwinMaker` function is really helpful for this; You just describe the model for one twin, and the relationship between the twins (defaults mostly work for this) and you get back a two-group twin model implementing the proper paths connecting twins in a pair and differences in relationships between pairs. It's great!

ordinal variables and thresholds introduce a handful of things to handle, with different decisions to be made for binary, ordinal, continuous, the thresholds matrix, offsets matrix, algebras, and implications to keep straight for constrained latent variables in the model that will map out to your thresholds. Additional concerns about modelling covariates on the means etc. etc. Can give head aches.

umxACE and umxACEv take care of all of this for you.

Log in or register to post comments

In reply to umxTwinMaker umxACE umxACEv by tbates

## Hi Tim,

thank you and umx is very much appreciated. Need to understand the backend, though, before publishing anything.

Log in or register to post comments

In reply to Hi Tim, by Leo

## xmuRAM2Ordinal umxThresholdMatrix

Log in or register to post comments