OpenMx icon indicating copy to clipboard operation
OpenMx copied to clipboard

Return RMSEA and TLI of NA from summary when not available

Open mhunter1 opened this issue 3 years ago • 2 comments

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.

mhunter1 avatar Jun 24 '22 16:06 mhunter1

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 avatar Jun 24 '22 18:06 tbates

@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

mhunter1 avatar Jun 26 '22 02:06 mhunter1