Path analysis

1. I've built a simple model with Onyx with no latent variables, a constant, one endogenous observed variable and two exogenous observed variables, with one path each from the exogenous variables and constant to the endogenous variable, to see how Onyx may be used for (eventually, simultaneous) regression equations with only observed variables. I created a data set with random values for the two exogenous variables and defined the endogenous variable as the sum of the constant and the sum of the products of coefficient and exogenous variable (Y=const + b1X1 + b2X2). I used 200 observations.
The estimates of all coefficients was accurate, but the fit measures seem off - particularly for such a simple model. Chi-square is 541.05, RMSEA 0.95, CFI 0.70, and TLI 0.41. Only SRMR suggests a good fit (0.02). Are there any reasons for this?
2. In other models with no latents - though with far fewer observations - several fit measures were reported as NaN; TLI turned out negative. What might cause this to happen?
3. Also, at least two text books calculate df as k(k+1)/2 - p where k = # variables and p = # parameters estimated. As I understand it, k(k+1)/2 = number of knowns = number of covariances + the number of correlations. Onyx seems to add k to the formula while reporting observed statistics. What is the reason?
Thanks for your help.
Onyx, raw data, fit statistics, ref models
library(OpenMx)
data(myFADataRaw, package="OpenMx")
manifests = paste0("x", 1:3)
myData = myFADataRaw[, manifests]
m1 <- mxModel("m1", type="RAM",
manifestVars = manifests,
mxPath(c("x1", "x2"), to = "x3"), # manifest causes
mxPath(manifests, arrows = 2), # manifest residuals
mxPath("one", to = manifests), # manifest means
mxData(myData, type = "raw")
)
m1 = mxRun(m1)
omxGraphviz(m1)
The missing fit indices are because OpenMx doesn't compute reference models for raw data by default.
The easiest solution to this is to update to OpenMx 2.0 beta (release version expected soon), and add a call to mxRefModels()
ref = mxRefModels(m1, run=TRUE)
summary(m1, refModels = ref)
Summary of m1
free parameters:
name matrix row col Estimate Std.Error
1 m1.A[3,1] A x3 x1 0.3865221 0.04235861
2 m1.A[3,2] A x3 x2 0.3512717 0.04178546
3 m1.S[1,1] S x1 x1 0.9952729 0.06294587
4 m1.S[2,2] S x2 x2 1.0228462 0.06468862
5 m1.S[3,3] S x3 x3 0.5331745 0.03372066
6 m1.M[1,1] M 1 x1 2.9879508 0.04461535
7 m1.M[1,2] M 1 x2 3.0113429 0.04522920
8 m1.M[1,3] M 1 x3 0.7734044 0.11269218
observed statistics: 1500
estimated parameters: 8
degrees of freedom: 1492
-2 log likelihood: 3951.288
saturated -2 log likelihood: 3693.424
number of observations: 500
chi-square: X2 ( df=1 ) = 257.8639, p = 5.013631e-58
Information Criteria:
| df Penalty | Parameters Penalty | Sample-Size Adjusted
AIC: 967.2876 3967.288 NA
BIC: -5320.9077 4001.004 3975.612
CFI: 0.5415045
TLI: -0.3754866
RMSEA: 0.716748 [95% CI (0.6304896, 0.8057941)]
OpenMx version number: 2.0.0.3952
The lack of fit suggests that your manifests have covariances you have not modelled. For instance in this case, adding
m2 <- mxModel(m1, name="m2", mxPath("x1", "x2", arrows = 2) )
m2 = mxRun(m2)
mxCompare(m2,m1
summary(m2)
Gives dramatically better fit...
χ²(1491) = 0, p < 0.001; CFI = 1; TLI = 1; RMSEA = 0
For Onyx help, you should post a link to this question in the Onyx forum... (look in forms for the Onyx group).
Cheers,
tim
Log in or register to post comments
In reply to Onyx, raw data, fit statistics, ref models by tbates
Onyx, raw data, fit statistics, ref models
Log in or register to post comments