R version 4.2.1 (2022-06-23) -- "Funny-Looking Kid" Copyright (C) 2022 The R Foundation for Statistical Computing Platform: aarch64-apple-darwin20 (64-bit) R is free software and comes with ABSOLUTELY NO WARRANTY. You are welcome to redistribute it under certain conditions. Type 'license()' or 'licence()' for distribution details. R is a collaborative project with many contributors. Type 'contributors()' for more information and 'citation()' on how to cite R or R packages in publications. Type 'demo()' for some demos, 'help()' for on-line help, or 'help.start()' for an HTML browser interface to help. Type 'q()' to quit R. > set.seed(789) > require("semtree") Loading required package: semtree Loading required package: OpenMx OpenMx may run faster if it is compiled to take advantage of multiple cores. > data(lgcm) > > lgcm$agegroup <- ordered(lgcm$agegroup, labels=c("young","old") ) > lgcm$training <- as.factor(lgcm$training) > lgcm$noise <- as.factor(lgcm$noise) > > # LOAD IN OPENMX MODEL. > # A SIMPLE LINEAR GROWTH MODEL WITH 5 TIME POINTS FROM SIMULATED DATA > > manifests <- names(lgcm)[1:5] > lgcModel <- mxModel("Linear Growth Curve Model Path Specification", + type="RAM", + manifestVars=manifests, + latentVars=c("intercept","slope"), + # residual variances + mxPath( + from=manifests, + arrows=2, + free=TRUE, + values = c(1, 1, 1, 1, 1), + labels=c("residual1","residual2","residual3","residual4","residual5") + ), + # latent variances and covariance + mxPath( + from=c("intercept","slope"), + connect="unique.pairs", + arrows=2, + free=TRUE, + values=c(1, 1, 1), + labels=c("vari", "cov", "vars") + ), + # intercept loadings + mxPath( + from="intercept", + to=manifests, + arrows=1, + free=FALSE, + values=c(1, 1, 1, 1, 1) + ), + # slope loadings + mxPath( + from="slope", + to=manifests, + arrows=1, + free=FALSE, + values=c(0, 1, 2, 3, 4) + ), + # manifest means + mxPath( + from="one", + to=manifests, + arrows=1, + free=FALSE, + values=c(0, 0, 0, 0, 0) + ), + # latent means + mxPath( + from="one", + to=c("intercept", "slope"), + arrows=1, + free=TRUE, + values=c(1, 1), + labels=c("meani", "means") + ), + mxData(lgcm,type="raw") + ) > > > # TREE CONTROL OPTIONS. > # TO OBTAIN BASIC/DEFAULT SMETREE OPTIONS, SIMPLY TPYE THE FOLLOWING: > > controlOptions <- semtree.control(method = "naive") > controlOptions$alpha <- 0.05 > > # RUN TREE. > > tree <- semtree(model=lgcModel, data=lgcm, control = controlOptions) ✔ Tree construction finished [took less than a second]. > > # RERUN TREE WITH MODEL CONSTRAINTS. > # MODEL CONSTRAINTS CAN BE ADDED BY IDENTIFYING THE PARAMETERS TO BE > # CONSTRAINED IN EVERY NODE. ONLY UNCONSTRAINED PARAMETERS ARE THEN > # TESTED AT EACH NODE FOR GROUP DIFFERENCES. IN THIS EXAMPLE THE MODEL > # RESIDUALS ARE CONSTRAINED OVER THE NODES. > > constraints <- semtree.constraints(global.invariance = names(omxGetParameters(lgcModel))[1:5]) > > treeConstrained <- semtree(model=lgcModel, data=lgcm, control = controlOptions, + constraints=constraints) ❯ Global Constraints: residual1 residual2 residual3 residual4 residual5 ❯ Freely Estimated Parameters: vari cov vars meani means ✔ Tree construction finished [took less than a second]. > > # SEE PLOT. > # THE PLOT FUNCTION WILL SHOW ALL FREE PARAMETERS AT EACH TERMINAL NODE. > # THIS CAN CREATE UNREADABLE FIGURES FOR MODELS WITH MANY FREE PARAMETERS. > > plot(tree) > > summary(tree) SEMtree Summary Template model: Total Sample Size: 400 Number of nodes: 5 Number of leaf nodes: 3 Free Parameters: 10 ( residual1 residual2 residual3 residual4 residual5 vari cov vars meani means ) > > summary(treeConstrained) SEMtree Summary Template model: Total Sample Size: 400 Number of nodes: 5 Number of leaf nodes: 3 Free Parameters: 5 ( vari cov vars meani means ) > > print(tree) SEMtree with numbered nodes |-[1] agegroup > young [N=400 LR=1258.08, df=10] | |-[2] TERMINAL [N=200] | |-[3] training in [ 0 ] [N=200 LR=40.85, df=10] | | |-[4] TERMINAL [N=100] | | |-[5] TERMINAL [N=100] > > parameters(tree) 2 4 5 residual1 0.068 0.048 0.042 residual2 0.049 0.069 0.049 residual3 0.043 0.053 0.053 residual4 0.055 0.039 0.063 residual5 0.037 0.048 0.011 vari 0.082 0.104 0.085 cov -0.011 0.028 -0.044 vars 0.499 0.674 1.629 meani 5.017 1.941 2.005 means -0.142 -0.494 -1.084 > > parameters(tree, leafs.only=FALSE) 1 2 3 4 5 residual1 0.052 0.068 0.045 0.048 0.042 residual2 0.058 0.049 0.059 0.069 0.049 residual3 0.047 0.043 0.053 0.053 0.053 residual4 0.052 0.055 0.051 0.039 0.063 residual5 0.036 0.037 0.030 0.048 0.011 vari 2.410 0.082 0.095 0.104 0.085 cov 0.477 -0.011 -0.017 0.028 -0.044 vars 0.973 0.499 1.239 0.674 1.629 meani 3.496 5.017 1.973 1.941 2.005 means -0.466 -0.142 -0.789 -0.494 -1.084 > > treeSub <- subtree(tree, startNode=3) > > if (!is.null(treeSub)) + plot(treeSub) > > toTable(tree) agegroup training [1,] "UNKNOWN" "" [2,] "UNKNOWN" "not 0" [3,] "UNKNOWN" "0" > > > controlOptions <- semtree.control(method = "fair") > > tree2 <- semtree(lgcModel, lgcm, control=controlOptions) ✔ Tree construction finished [took less than a second]. > > > controlOptions <- semtree.control(method = "score") > tree3 <- semtree(lgcModel, lgcm, control=controlOptions) ❯ Model was not run. Estimating parameters now. Running Linear Growth Curve Model Path Specification with 10 parameters Beginning initial fit attempt Running Linear Growth Curve Model Path Specification with 10 parameters Lowest minimum so far: 3946.79931515404 Solution found Solution found! Final fit=3946.7993 (started at 12364.579) (1 attempt(s): 1 valid, 0 errors) Start values from best fit: 0.0517425500974165,0.057996464842973,0.0467583755756157,0.0520836958577161,0.0361130739855864,2.41004053260765,0.477157340565657,0.973042383133384,3.49639424449095,-0.465977315382569 ✔ Tree construction finished [took less than a second]. > > proc.time() user system elapsed 4.179 0.104 4.327