You are here

Multivariate model with positive and negative correlations

6 posts / 0 new
Last post
Ell's picture
Ell
Offline
Joined: 11/26/2015 - 11:14
Multivariate model with positive and negative correlations

Hi,

I am running a trivariate ACE Cholesky model where trait 1 and 2 are positively correlated, but trait 3 is negatively correlated with 1 and 2. The problem is that when I run the model, the upperbound CI's for the phenotypic correlation due to a, c and e is over 1 for some estimates (e.g. MZM.h2[1,3] ubound= 1.14034072)

I have 3 other similar analyses with different traits, with similar correlations and the same problem.

Any ideas how to fix this?

Thank you very much!

# -------------------------------------------------------------------------------------------------
# Specify Cholesky ACE Decomposition
# -------------------------------------------------------------------------------------------------
 
# To create Labels for Lower Triangular Matrices
aLabs <- paste("a", do.call(c, sapply(seq(1, nv), function(x){ paste(x:nv, x,sep="") })), sep="")
cLabs <- paste("c", do.call(c, sapply(seq(1, nv), function(x){ paste(x:nv, x,sep="") })), sep="")
eLabs <- paste("e", do.call(c, sapply(seq(1, nv), function(x){ paste(x:nv, x,sep="") })), sep="")
 
# Matrices  to store a, c, and e Path Coefficients
pathA   <- mxMatrix( type="Lower", nrow=nv, ncol=nv, free=T, values=4, labels=aLabs,name="a" )
pathC   <- mxMatrix( type="Lower", nrow=nv, ncol=nv, free=c(T,F,F,T,F,T), values=c(1,0,0,1,0,1),labels=cLabs, lbound=0, ubound=NA, name="c" )
pathE   <- mxMatrix( type="Lower", nrow=nv, ncol=nv, free=T, values=4, labels=eLabs, name="e" )
 
# Algebra for expected Means 
 
MeanM       <-mxMatrix(type="Full", nrow=1, ncol=ntv, free=T, values=1 , labels=c("Mm11", "Mm21", "Mm31","Mm11", "Mm21", "Mm31"), name="ExpMeanM")
MeanF       <-mxMatrix(type="Full", nrow=1, ncol=ntv, free=T, values=1, labels=c("Fm11", "Fm21","Fm31", "Fm11", "Fm21","Fm31"), name="ExpMeanF")
MeanOS  <-mxMatrix(type="Full", nrow=1, ncol=ntv, free=T, values=1, labels=c("Mm11", "Mm21", "Mm31","Fm11", "Fm21","Fm31"), name="ExpMeanOS")
 
# Matrices generated to hold A, C, and E computed Variance Components
covA    <- mxAlgebra( expression=a %*% t(a), name="A" )
covC    <- mxAlgebra( expression=c %*% t(c), name="C" ) 
covE    <- mxAlgebra( expression=e %*% t(e), name="E" )
 
# Algebra to compute standardized variance components
covP    <- mxAlgebra( expression=A+C+E, name="V" )
StA <- mxAlgebra( expression=A/V, name="h2")
StC <- mxAlgebra( expression=C/V, name="c2")
StE <- mxAlgebra( expression=E/V, name="e2")
 
# Algebra to compute Phenotypic, A, C & E correlations
matI    <- mxMatrix( type="Iden", nrow=nv, ncol=nv, name="I")
rph <- mxAlgebra( expression= solve(sqrt(I*V)) %*% V %*% solve(sqrt(I*V)), name="Rph")
rA  <- mxAlgebra( expression= solve(sqrt(I*A)) %*% A %*% solve(sqrt(I*A)), name="Ra" )
rC  <- mxAlgebra( expression= solve(sqrt(I*C)) %*% C %*% solve(sqrt(I*C)), name="Rc" )
rE  <- mxAlgebra( expression= solve(sqrt(I*E)) %*% E %*% solve(sqrt(I*E)), name="Re" )
 
covMZM  <- mxAlgebra( expression= rbind  ( cbind(A+C+E , A+C),
                                           cbind(A+C , A+C+E)),     name="ExpCovMZM" )
covDZM  <- mxAlgebra( expression= rbind  ( cbind(A+C+E       , 0.5%x%A+C),
                                           cbind(0.5%x%A+C , A+C+E)),  name="ExpCovDZM" )
covMZF  <- mxAlgebra( expression= rbind( cbind(A+C+E , A+C),
                                           cbind(A+C , A+C+E)),     name="ExpCovMZF" )
covDZF  <- mxAlgebra( expression= rbind( cbind(A+C+E       , 0.5%x%A+C),
                                           cbind(0.5%x%A+C , A+C+E)),  name="ExpCovDZF" )
covDZOS <- mxAlgebra( expression= rbind( cbind(A+C+E       , 0.5%x%A+C),
                                           cbind(0.5%x%A+C , A+C+E)),  name="ExpCovDZOS" )
 
# Data objects for Multiple Groups
dataMZM <-mxData(observed=mzmData, type="raw")
dataDZM <-mxData(observed=dzmData, type="raw")
dataMZF <-mxData(observed=mzfData, type="raw")
dataDZF <-mxData(observed=dzfData, type="raw")
dataDZOS    <-mxData(observed=dzosData, type="raw")
 
# Objective objects for Multiple Groups
objMZM  <- mxExpectationNormal(covariance="ExpCovMZM", means="ExpMeanM", dimnames=selVars)
objDZM  <- mxExpectationNormal(covariance="ExpCovDZM", means="ExpMeanM", dimnames=selVars)
objMZF  <- mxExpectationNormal(covariance="ExpCovMZF", means="ExpMeanF", dimnames=selVars)
objDZF  <- mxExpectationNormal(covariance="ExpCovDZF", means="ExpMeanF", dimnames=selVars)
objDZOS <- mxExpectationNormal(covariance="ExpCovDZOS", means="ExpMeanOS", dimnames=selVars)
 
fitFunction <- mxFitFunctionML()
 
# Combine Groups
pars     <-list(pathA, pathC, pathE, covA, covC, covE, covP, StA, StC, StE,matI, rph, rA, rC, rE,fitFunction)
 
modelMZM <-mxModel(pars, MeanM, covMZM, dataMZM, objMZM, name="MZM")
modelDZM <-mxModel(pars, MeanM, covDZM, dataDZM, objDZM, name="DZM")
modelMZF <-mxModel(pars, MeanF, covMZF, dataMZF, objMZF,  name="MZF")
modelDZF <-mxModel(pars, MeanF, covDZF, dataDZF, objDZF, name="DZF")
modelDZOS <-mxModel(pars, MeanM, MeanF, MeanOS, covDZOS, dataDZOS, objDZOS,name="DZOS")
 
minus2ll<- mxAlgebra( expression=MZM.objective + DZM.objective + MZF.objective + DZF.objective + DZOS.objective, name="m2LL" )
 
obj <- mxFitFunctionAlgebra( "m2LL" )
 
ci1         <- mxCI (c ('MZM.h2[1,1]','MZM.h2[2,2]','MZM.h2[3,3]','MZM.c2[1,1]','MZM.c2[2,2]','MZM.c2[3,3]',
                'MZM.e2[1,1]','MZM.e2[2,2]','MZM.e2[3,3]'))                      #a2, c2, e2
ci2         <- mxCI (c ('MZM.Rph[1,2]', 'MZM.Rph[1,3]','MZM.Rph[2,3]'))                 # rPh
ci3     <- mxCI (c ('MZM.Ra[1,2]', 'MZM.Ra[1,3]','MZM.Ra[3,2]',
                'MZM.Rc[1,2]','MZM.Rc[1,3]','MZM.Rc[3,2]',
                'MZM.Re[1,2]','MZM.Re[1,3]','MZM.Re[3,2]'))              #rA, rC, rE
 
ci5     <-mxCI (c('MZM.h2[1,2]','MZM.h2[1,3]','MZM.h2[2,3]','MZM.c2[1,2]','MZM.c2[1,3]','MZM.c2[2,3]',
                'MZM.e2[1,2]','MZM.e2[1,3]','MZM.e2[2,3]'))                  # rph due to A,C,E (%)
 
CholAceModel<- mxModel( "CholACE", pars, modelMZM, modelDZM, modelMZF, modelDZF, modelDZOS, minus2ll, obj,ci1,ci2,ci3,ci5)
 
 
#---------------------------------------------------------------------------------------------------------------------
# RUN Cholesky Decomposition ACE Model
 
CholAceFit  <- mxRun(CholAceModel, intervals=T)
(CholAceSum   <- summary(CholAceFit))

OUT PUT:
Summary of CholACE

free parameters:
name matrix row col Estimate Std.Error A lbound ubound
1 a11 a 1 1 4.205001e+00 0.4512848
2 a21 a 2 1 1.912439e+00 0.3111661
3 a31 a 3 1 -1.294262e+00 0.2762099
4 a22 a 2 2 1.370645e+00 0.4425790
5 a32 a 3 2 -9.997835e-01 0.4921637
6 a33 a 3 3 -1.409512e+00 0.8254633
7 c11 c 1 1 1.015753e+00 1.3711636 0
8 c22 c 2 2 -4.529173e-13 1.0553574 0!
9 c33 c 3 3 1.000354e+00 0.8782109 ! 0
10 e11 e 1 1 5.105396e+00 0.1506051
11 e21 e 2 1 5.557607e-01 0.1884338
12 e31 e 3 1 -1.812631e-01 0.1744390
13 e22 e 2 2 3.473323e+00 0.1324603
14 e32 e 3 2 -6.184976e-01 0.1714142
15 e33 e 3 3 3.132411e+00 0.1334209
16 Mm11 MZM.ExpMeanM 1 rEOE1 -1.706490e-02 0.2070563
17 Mm21 MZM.ExpMeanM 1 rNeuro1 -2.181607e-02 0.2019051
18 Mm31 MZM.ExpMeanM 1 rExtra1 -4.209456e-02 0.2002149
19 Fm11 MZF.ExpMeanF 1 rEOE1 3.887317e-02 0.1791824
20 Fm21 MZF.ExpMeanF 1 rNeuro1 -1.335770e-03 0.1586503
21 Fm31 MZF.ExpMeanF 1 rExtra1 2.600313e-02 0.1569875

confidence intervals:
lbound estimate ubound note
MZM.h2[1,1] 2.237774e-01 3.948746e-01 0.48066135
MZM.h2[2,2] 1.655729e-01 3.091246e-01 0.40500087
MZM.h2[3,3] 9.902937e-02 2.933637e-01 0.45343557
MZM.c2[1,1] 1.622543e-21 2.304111e-02 0.14867725
MZM.c2[2,2] 1.145429e-26 1.145429e-26 0.10657173 !!!
MZM.c2[3,3] 0.000000e+00 6.297918e-02 0.22569071
MZM.e2[1,1] 5.193389e-01 5.820843e-01 0.65408871
MZM.e2[2,2] 5.949989e-01 6.908754e-01 0.79387528
MZM.e2[3,3] 5.465646e-01 6.436571e-01 0.75100534
MZM.Rph[1,2] 3.335501e-01 3.841715e-01 0.43199250
MZM.Rph[1,3] -2.935708e-01 -2.387245e-01 -0.18176681
MZM.Rph[2,3] -4.114417e-01 -3.612849e-01 -0.30900866
MZM.Ra[1,2] 6.118084e-01 8.128044e-01 1.00000000
MZM.Ra[1,3] -1.000000e+00 -5.994647e-01 -0.34234354
MZM.Ra[3,2] -1.000000e+00 -7.570034e-01 -0.48455014
MZM.Rc[1,2] 0.000000e+00 0.000000e+00 0.00000000 !!!
MZM.Rc[1,3] 0.000000e+00 0.000000e+00 0.00000000 !!!
MZM.Rc[3,2] 0.000000e+00 0.000000e+00 0.00000000 !!!
MZM.Re[1,2] 5.435395e-02 1.579986e-01 0.25785609
MZM.Re[1,3] -1.626099e-01 -5.667960e-02 0.05022950
MZM.Re[3,2] -3.019891e-01 -1.999256e-01 -0.09445959
MZM.h2[1,2] 5.677666e-01 7.391920e-01 0.90848317
MZM.h2[1,3] 5.834506e-01 8.546718e-01 1.14034072
MZM.h2[2,3] 4.318567e-01 6.309834e-01 0.82191707
MZM.c2[1,2] 0.000000e+00 0.000000e+00 0.00000000 !!!
MZM.c2[1,3] 0.000000e+00 0.000000e+00 0.00000000 !!!
MZM.c2[2,3] 0.000000e+00 0.000000e+00 0.00000000 !!!
MZM.e2[1,2] 9.151570e-02 2.608080e-01 0.43223321
MZM.e2[1,3] -1.403418e-01 1.453282e-01 0.41655169
MZM.e2[2,3] 1.780829e-01 3.690166e-01 0.56814336

observed statistics: 5178
estimated parameters: 21
degrees of freedom: 5157
fit value ( -2lnL units ): 31565.78
number of observations: 1446
Information Criteria:
| df Penalty | Parameters Penalty | Sample-Size Adjusted
AIC: 21251.785 31607.78 NA
BIC: -5959.417 31718.59 31651.88

AdminRobK's picture
Offline
Joined: 01/24/2014 - 12:15
MxAlgebra "h2"

Your MxAlgebra with Mxname "h2" is defined as A/V, which is the additive-genetic covariance matrix elementwise divided by the total phenotypic covariance matrix. The diagonals of h2 are the narrow-sense heritabilities of the three traits. The off-diagonals of h2 can be greater than 1, as they're neither correlations nor proportions. I don't know of any meaningful interpretation of those off-diagonals, other than the rather literal "ratio of two traits' genetic covariance to their total phenotypic covariance." Edit: Actually, they'd be interpretable as bivariate heritabilities under other circumstances; see Prof. Neale's post below.

There seems to be some confusion in the OpenMx user base about this. See two recent threads, http://openmx.psyc.virginia.edu/thread/3969 and http://openmx.psyc.virginia.edu/thread/4134 .

Ell's picture
Ell
Offline
Joined: 11/26/2015 - 11:14
Thank you Rob. Re " I don't

Thank you Rob. Re " I don't know of any meaningful interpretation of those off-diagonals, other than the rather literal "ratio of two traits' genetic covariance to their total phenotypic covariance." My understanding is that those off-diagonals can be interpreted as the proportion of phenotypic correlations between two traits due to their correlating genetic/shared/nonshared environments. These add up to 1(which are usually presented as percentage), and I have never seen CIs for this statistics to be over 1 or under -1, in the published articles where they report this stat. So I don't understand why my analysis is showing a CI over 1. Am I doing something wrong? Any ideas how I can fix this so that the CI is not over 1 or under -1. Maybe this happens to other people, but no one talks about it?

AdminRobK's picture
Offline
Joined: 01/24/2014 - 12:15
My understanding is that
My understanding is that those off-diagonals can be interpreted as the proportion of phenotypic correlations between two traits due to their correlating genetic/shared/nonshared environments.

OK, now that I think about it, that interpretation may be correct. Nonetheless, the values of the off-diagonals are not bounded to the interval [0,1]. Suppose we have two phenotypes with a genetic covariance of -5.0, a shared-environmental covariance of 1.5, and a non-shared environmental covariance of 1.0. The phenotypic covariance will then be -5 + 1.5 + 1 = -2.5. The off-diagonal for additive genetics would then be -5/-2.5 = 2.0; for the shared environment, 1.5/-2.5 = -0.6; for the non-shared environment, 1/-2.5 = -0.4. Nothing about this scenario is implausible, and yet not a single one of the off-diagonals falls within the interval [0,1]. In your case, two of the three phenotypic correlations are negative; consider the substantive interpretability of a proportion of a whole, when the "whole" can be negative.

If the phenotypic correlation were positive, things might "look saner," but there's still no guarantee that all those off-diagonals will fall in [0,1]. Suppose we have two phenotypes with a genetic covariance of 5.0, a shared-environmental covariance of 1.5, and a non-shared environmental covariance of -1.0. The phenotypic covariance will then be 5 + 1.5 - 1 = 5.5. The off-diagonal for additive genetics would then be 5/5.5 = approx 0.909; for the shared environment, 1.5/5.5 = approx 0.272; for the non-shared environment, -1/5.5 = approx -0.182.

I think it's the negative correlations that are really throwing you off. It might be possible to force all of your phenotypes to be positively correlated if you reflect ("reverse-score") trait 3. Then, in the resulting paper/talk, make sure your reader/audience understands that trait 3 is reflected, e.g. if trait 3 is extraversion, then when reflected, it would be introversion.

AdminNeale's picture
Offline
Joined: 03/01/2013 - 14:09
Proportion is not the right term

The background of proportion is really in a ratio, the proportion of two positive quantities. When the quantities can contain mixtures of positive and negative components, the proportion (sometimes known as "bivariate heritability" - another problematic quantity when signs are mixed) becomes meaningless. In these circumstances I prefer to describe the contribution of each component to the phenotypic correlation. So a phenotypic correlation might be made up of .2 due to A, .2 due to C and -.3 due to E, giving a phenotypic correlation of .1

Ell's picture
Ell
Offline
Joined: 11/26/2015 - 11:14
Thank you both for the

Thank you both for the responses. It makes more sense now.