# ---------------------------------------------------------------------------------------------------------------------- # Program: twoACEvc.R # Author: Hermine Maes; adapted for the exercise by Lucia Colodro Conde # Date: 01 04 2018 # # Twin Bivariate ACE model to estimate causes of variation across multiple groups # Matrix style model - Raw data - Continuous data # -------|---------|---------|---------|---------|---------|---------|---------|---------|---------|---------|---------| # Load Libraries & Options rm(list=ls()) library(OpenMx); library(umx) library(psych); library(polycor) source("miFunctions.R") # Create Output filename <- "mulACEvc" sink(paste(filename,".Ro",sep=""), append=FALSE, split=TRUE) # ---------------------------------------------------------------------------------------------------------------------- # PREPARE DATA # Load Data data(GFF) baseNames <- c("gff", "hap", "sat", "AD", "SOMA", "SOC") testData <- umx_scale_wide_twin_data(baseNames, suffix = "_T", data = GFF) # Select Variables for Analysis vars <- ??? # list of variables names nv <- ? # number of variables ntv <- nv*2 # number of total variables selVars <- paste(vars,c(rep("_T1",nv),rep("_T2",nv)),sep="") # Select Data for Analysis mzData <- subset(testData, zyg_6grp == "MZFF", selVars) dzData <- subset(testData, zyg_6grp == "DZFF", selVars) # Generate Descriptive Statistics colMeans(mzData,na.rm=TRUE) colMeans(dzData,na.rm=TRUE) cov(mzData,use="complete") cov(dzData,use="complete") cor(mzData,use="complete") cor(dzData,use="complete") # Set Starting Values svMe <- ??? # start value for means svPa <- .2 # start value for path coefficient svPe <- .5 # start value for path coefficient for e # ---------------------------------------------------------------------------------------------------------------------- # PREPARE MODEL # Create Algebra for expected Mean Matrices meanG <- mxMatrix( type="Full", nrow=1, ncol=ntv, free=TRUE, values=svMe, labels=labVars("mean",vars), name="meanG" ) # Create Matrices for Variance Components covA <- mxMatrix( type="Symm", nrow=nv, ncol=nv, free=TRUE, values=valDiag(svPa,nv), labels=labLower("VA",nv), name="VA" ) covC <- mxMatrix( type="Symm", nrow=nv, ncol=nv, free=TRUE, values=valDiag(svPa,nv), labels=labLower("VC",nv), name="VC" ) covE <- mxMatrix( type="Symm", nrow=nv, ncol=nv, free=TRUE, values=valDiag(svPe,nv), labels=labLower("VE",nv), name="VE" ) # Create Algebra for expected Variance/Covariance Matrices in MZ & DZ twins covP <- mxAlgebra( expression= VA+VC+VE, name="V" ) covMZ <- mxAlgebra( expression= VA+VC, name="cMZ" ) covDZ <- mxAlgebra( expression= 0.5%x%VA+ VC, name="cDZ" ) expCovMZ <- mxAlgebra( expression= rbind( cbind(V, cMZ), cbind(t(cMZ), V)), name="expCovMZ" ) expCovDZ <- mxAlgebra( expression= rbind( cbind(V, cDZ), cbind(t(cDZ), V)), name="expCovDZ" ) # Create Data Objects for Multiple Groups dataMZ <- mxData( observed=mzData, type="raw" ) dataDZ <- mxData( observed=dzData, type="raw" ) # Create Expectation Objects for Multiple Groups expMZ <- mxExpectationNormal( covariance="expCovMZ", means="meanG", dimnames=selVars ) expDZ <- mxExpectationNormal( covariance="expCovDZ", means="meanG", dimnames=selVars ) funML <- mxFitFunctionML() # Create Model Objects for Multiple Groups pars <- list( meanG, covA, covC, covE, covP ) modelMZ <- mxModel( pars, covMZ, expCovMZ, dataMZ, expMZ, funML, name="MZ" ) modelDZ <- mxModel( pars, covDZ, expCovDZ, dataDZ, expDZ, funML, name="DZ" ) multi <- mxFitFunctionMultigroup( c("MZ","DZ") ) # Create Algebra for Standardization matI <- mxMatrix( type="Iden", nrow=nv, ncol=nv, name="I" ) invSD <- mxAlgebra( expression=solve(sqrt(I*V)), name="iSD" ) # Calculate genetic and environmental correlations corA <- mxAlgebra( expression=solve(sqrt(I*VA))%&%VA, name ="rA" ) #cov2cor() corC <- mxAlgebra( expression=solve(sqrt(I*VC))%&%VC, name ="rC" ) corE <- mxAlgebra( expression=solve(sqrt(I*VE))%&%VE, name ="rE" ) corP <- mxAlgebra (expression=solve(sqrt(I*V)) %*% V %*% solve(sqrt(I*V)), name="rP") # Create Algebra for Variance Components rowUV <- rep('UV',nv) colUV <- rep(c('VA','VC','VE'),each=nv) estUV <- mxAlgebra( expression=cbind(VA,VC,VE), name="UV", dimnames=list(rowUV,colUV) ) rowSV <- rep('SV',nv) colSV <- rep(c('SA','SC','SE'),each=nv) estSV <- mxAlgebra( expression=cbind(VA/V,VC/V,VE/V), name="SV", dimnames=list(rowSV,colSV) ) # Create Confidence Interval Objects ciUV <- mxCI( c("UV") ) ciSV <- mxCI( c("SV") ) # Build Model with Confidence Intervals calc <- list( matI, invSD, corA, corC, corE, corP,estUV, estSV, ciUV, ciSV ) modelACE <- mxModel( "twoACEvc", pars, modelMZ, modelDZ, multi, calc ) # ---------------------------------------------------------------------------------------------------------------------- # RUN MODEL # Run ACE Model fitACE <- mxRun( modelACE, intervals=F ) sumACE <- summary( fitACE ) # Compare with Saturated Model #mxCompare( fitSAT, fitACE ) # Print Goodness-of-fit Statistics & Parameter Estimates fitGofs(fitACE) fitEsts(fitACE) # Print Covariance & Correlation Matrices fitACE$VA$values fitACE$VC$values fitACE$VE$values fitACE$rA$result fitACE$rC$result fitACE$rE$result fitACE$rP$result fitACE$matrices$VA fitACE$algebras$SV