OpenMx
OpenMx copied to clipboard
Return RMSEA and TLI of NA from summary when not available
Currently, OpenMx returns RMSEA=0 and TLI=1 when we don't have the information to compute these. This behavior is confusing to users.
Note: @tbates some packages like umx might depend on this confusing behavior. Be advised that it will change in the near future.
Hi @mhunter1 is there a test model? then i can check easily? Pretty sure umx will just be passing through the obtained values, and it's fairly bullet proof about getting NAs when a value is expected, so shouldn't break anything
@tbates Here are more details and an example.
The misleading behavior of summary() appears to be isolated to non-RAM, and non-LISREL models. summary() for any model that has raw data, mxExpectationNormal(), and no saturated model gives 0 and 1 for RMSEA and TLI, respectively. When this issue is closed, summary() will return NA for these fit statistics in this situation. See below for an example of a model that shows the current, misleading behavior.
library(OpenMx)
# Simulate some data
x=rnorm(1000, mean=0, sd=1)
y= 0.5*x + rnorm(1000, mean=0, sd=1)
tmpFrame <- data.frame(x, y)
tmpNames <- names(tmpFrame)
# Define the matrices
M <- mxMatrix(type = "Full", nrow = 1, ncol = 2, values=c(0,0),
free=c(TRUE,TRUE), labels=c("Mx", "My"), name = "M")
S <- mxMatrix(type = "Full", nrow = 2, ncol = 2, values=c(1,0,0,1),
free=c(TRUE,FALSE,FALSE,TRUE), labels=c("Vx", NA, NA, "Vy"),
name = "S")
A <- mxMatrix(type = "Full", nrow = 2, ncol = 2, values=c(0,1,0,0),
free=c(FALSE,TRUE,FALSE,FALSE), labels=c(NA, "b", NA, NA),
name = "A")
I <- mxMatrix(type="Iden", nrow=2, ncol=2, name="I")
# Define the expectation
expCov <- mxAlgebra(solve(I-A) %*% S %*% t(solve(I-A)), name="expCov")
expFunction <- mxExpectationNormal(covariance="expCov", means="M",
dimnames=tmpNames)
# Choose a fit function
fitFunction <- mxFitFunctionML()
# Define the model
tmpModel <- mxModel(model="exampleModel", M, S, A, I,
expCov, expFunction, fitFunction,
mxData(observed=tmpFrame, type="raw"))
# Fit the model and print a summary
tmpModelOut <- mxRun(tmpModel)
st <- summary(tmpModelOut)
st$RMSEA
# [1] 0
st$TLI
# [1] 1