Compute condition number of information matrix
[openmx:openmx.git] / models / nightly / 3LatentMultiRegWithContinuousModerator-c.R
1 # ---------------------------------------------------------------------
2 # Program: 3LatentMultiRegWithModerator100521.R
3 #  Author: Steven M. Boker
4 #    Date: Sat May 22 11:13:51 EDT 2010
5 #
6 # This program tests variations on a latent variable multiple regression
7 #    using a standard RAM.
8 #
9 # ---------------------------------------------------------------------
10 # Revision History
11 #    -- Sat May 22 11:13:51 EDT 2010
12 #      Created 3LatentMultiRegWithModerator100521.R.
13 #
14 # ---------------------------------------------------------------------
15
16 # ----------------------------------
17 # Read libraries and set options.
18
19 library(OpenMx)
20
21 options(width=100)
22
23 # ---------------------------------------------------------------------
24 # Data for multiple regression of F3 on F1 and F2 with moderator variable Z.
25
26 numberSubjects <- 1000
27 numberIndicators <- 12
28 numberFactors <- 3
29
30 set.seed(10)
31
32 fixedBMatrixF <- matrix(c(.4, .2), 2, 1, byrow=TRUE)
33 randomBMatrixF <- matrix(c(.3, .5), 2, 1, byrow=TRUE)
34 XMatrixF <- matrix(rnorm(numberSubjects*2, mean=0, sd=1), numberSubjects, 2)
35 UMatrixF <- matrix(rnorm(numberSubjects*1, mean=0, sd=1), numberSubjects, 1)
36 Z <- matrix(rnorm(numberSubjects, mean=0, sd=1), nrow=numberSubjects, ncol=2)
37
38 XMatrix <- cbind(XMatrixF, XMatrixF %*% fixedBMatrixF + (XMatrixF*Z) %*% randomBMatrixF + UMatrixF)
39
40 BMatrix <- matrix(c( 1, .6, .7, .8,  0,  0,  0,  0,  0,  0,  0,  0,
41                      0,  0,  0,  0,  1, .5, .6, .7,  0,  0,  0,  0,
42                      0,  0,  0,  0,  0,  0,  0,  0,  1, .7, .6, .5), numberFactors, numberIndicators, byrow=TRUE)
43 UMatrix <- matrix(rnorm(numberSubjects*numberIndicators, mean=0, sd=1), numberSubjects, numberIndicators)
44 YMatrix <- XMatrix %*% BMatrix + UMatrix
45
46 cor(cbind(XMatrix,Z[,1]))
47
48 dimnames(YMatrix) <- list(NULL, paste("X", 1:numberIndicators, sep=""))
49
50 latentMultiRegModerated1 <- cbind(YMatrix,Z=Z[,1])
51
52 round(cor(latentMultiRegModerated1), 3)
53 round(cov(latentMultiRegModerated1), 3)
54
55 latentMultiRegModerated1[,'Z'] <- latentMultiRegModerated1[,
56 'Z'] - mean(latentMultiRegModerated1[,'Z'])
57
58 numberFactors <- 3
59 numberIndicators <- 12
60 numberModerators <- 1
61 indicators <- paste("X", 1:numberIndicators, sep="")
62 moderators <- c("Z")
63 totalVars <- numberIndicators + numberFactors + numberModerators
64
65 # ----------------------------------
66 # Build an orthogonal simple structure factor model
67
68 latents <- paste("F", 1:numberFactors, sep="")
69
70 uniqueLabels <- paste("U_", indicators, sep="")
71 meanLabels <- paste("M_", latents, sep="")
72 factorVarLabels <- paste("Var_", latents, sep="")
73
74 latents1 <- latents[1]
75 indicators1 <- indicators[1:4]
76 loadingLabels1 <- paste("b_F1", indicators[1:4], sep="") 
77 latents2 <- latents[2]
78 indicators2 <- indicators[5:8]
79 loadingLabels2 <- paste("b_F2", indicators[5:8], sep="") 
80 latents3 <- latents[3]
81 indicators3 <- indicators[9:12]
82 loadingLabels3 <- paste("b_F3", indicators[9:12], sep="") 
83
84 # ----------------------------------
85 # Create model with both direct and moderated paths
86
87
88 threeLatentWithModerator <- mxModel("threeLatentWithModerator",
89     type="RAM",
90     manifestVars=c(indicators),
91     latentVars=c(latents, "dummy1"),
92     mxPath(from=latents1, to=indicators1, 
93            arrows=1, connect="all.pairs",
94            free=TRUE, values=.2, 
95            labels=loadingLabels1),
96     mxPath(from=latents2, to=indicators2, 
97            arrows=1, connect="all.pairs",
98            free=TRUE, values=.2, 
99            labels=loadingLabels2),
100     mxPath(from=latents3, to=indicators3, 
101            arrows=1, connect="all.pairs",
102            free=TRUE, values=.2, 
103            labels=loadingLabels3),
104     mxPath(from=latents1, to=indicators1[1], 
105            arrows=1, 
106            free=FALSE, values=1),
107     mxPath(from=latents2, to=indicators2[1], 
108            arrows=1, 
109            free=FALSE, values=1),
110     mxPath(from=latents3, to=indicators3[1], 
111            arrows=1, 
112            free=FALSE, values=1),
113     mxPath(from=indicators, 
114            arrows=2, 
115            free=TRUE, values=.8, 
116            labels=uniqueLabels),
117     mxPath(from=latents,
118            arrows=2, 
119            free=TRUE, values=.8, 
120            labels=factorVarLabels),
121     mxPath(from=c("F1","F2"),to="F3",
122            arrows=1, 
123            free=TRUE, values=.2, labels=c("b11", "b12")),
124     mxPath(from="F1",to="F2",
125            arrows=1, 
126            free=TRUE, values=.1, labels=c("cF1F2")),
127     mxPath(from=c("F1","F2"),to="dummy1",
128            arrows=1, 
129            free=TRUE, values=.2, labels=c("b21", "b22")),
130     mxPath(from="dummy1",to="F3",
131            arrows=1, 
132            free=FALSE, labels="data.Z"),
133     mxPath(from="one", to=indicators, 
134            arrows=1, free=FALSE, values=0),
135     mxPath(from="one", to=c(latents), 
136            arrows=1, free=TRUE, values=.1, 
137            labels=meanLabels),
138     mxData(observed=latentMultiRegModerated1, type="raw")
139     )
140
141 threeLatentWithModeratorOut <- mxRun(threeLatentWithModerator)
142