NPSOL returned a non-zero status code 6. The model does not satisfy the first-order optimality conditions to the required accur

1 reply [Last post]
Daria Henning's picture
Offline
Joined: 12/18/2013

Hi,

Finally I managed to fit a longitudinal one- factor model but now I received the following warning message:

NPSOL returned a non-zero status code 6. The model does not satisfy the first-order optimality conditions to the required accuracy, and no improved point for the merit function could be found during the final linesearch (Mx status RED)

As I am a beginner in OpenMX suggestions and any help is very welcome.
Thanks in advance!

############################################################
This is my code:
############################################################
## create observed covariance matrix

obsnames = c("extrT1","beneT1","conscT1","emostT1","imagT1",
"extrT2","beneT2","conscT2","emostT2","imagT2",
"extrT3","beneT3","conscT3","emostT3","imagT3")

obslabels = list (obsnames,obsnames)

values = c(
1.00,
-.05, 1.00,
-.00, .40, 1.00,
.46, .12, .14, 1.00,
.46, .12, .55, .39, 1.00,
.77, -.02, .06, .31, .36, 1.00,
-.15, .72, .28, .02, .01, -.03, 1.00,
-.07, .33, .79, .07, .43, .03, .41, 1.00,
.32, .10, .20, .70, .40, .43, .12, .19, 1.00,
.26, .09, .48, .29, .80, .39, .13, .57, .45, 1.00,
.31, .00, .11, .29, .29, .79, -.01, .07, .33, .24, 1.00,
-.05, .58, .25, -.04, -.01, -.04, .70, .33, .01, .08, .07, 1.00,
.05, .25, .64, -.01, .29, .07, .31, .75, .06, .41, .16, .51, 1.00,
.27, .07, .24, .58, -.04, .32, .05, .20, .66, .38, .44, .13, .14, 1.00,
.31, .09, .45, .29, .58, .34, .14, .51, .39, .79, .43, .22, .55, .49, 1.00)

SD = c(0.43,0.43,0.53,0.51,0.49,0.44,0.39,0.55,0.48,0.50,0.43,0.38,0.54,0.42,0.48)
akkercov = SEM_obsmatrix(lowtri=values,SD=SD,labels=obslabels)
akkercov

petrmeans = c(3.49,3.50,3.43,3.48,3.69,3.40,3.56,3.41,3.52,3.63,3.32,3.52,3.26,3.52,3.47)
names(petrmeans) = obsnames

akkercov = Matrix::nearPD(akkercov)$mat
akkercov=as.matrix(akkercov)
akkercov

factornames = c('PerTrait_1','PerTrait_2','PerTrait_3')
obslabels = list (obsnames, obsnames)
factorlabels = list (factornames, factornames)
lambdalabels = list (obsnames, factornames)
taulabels = list(obsnames,"Intercept")
kappalabels = list (factornames, "Factor mean")

## Fit a longitudinal one-factor model

title = " Factor model Personality traits at 3 timepoints"
obs = mxData(observed = akkercov, type = 'cov', means = petrmeans, numObs = 290)

## lambda matrix: factor loadings

matrixL = mxMatrix(
type = 'Full',
nrow = 15,
ncol = 3,

free = c(TRUE,FALSE,FALSE,
TRUE,FALSE,FALSE,
TRUE,FALSE,FALSE,
TRUE,FALSE,FALSE,
TRUE,FALSE,FALSE,
FALSE,TRUE,FALSE,
FALSE,TRUE,FALSE,
FALSE,TRUE,FALSE,
FALSE,TRUE,FALSE,
FALSE,TRUE,FALSE,
FALSE,FALSE,TRUE,
FALSE,FALSE,TRUE,
FALSE,FALSE,TRUE,
FALSE,FALSE,TRUE,
FALSE,FALSE,TRUE),

values = c (1,0,0,
1,0,0,
1,0,0,
1,0,0,
1,0,0,
0,1,0,
0,1,0,
0,1,0,
0,1,0,
0,1,0,
0,0,1,
0,0,1,
0,0,1,
0,0,1,
0,0,1),

labels = c("L11t1",NA,NA,
"L21t1",NA,NA,
"L31t1",NA,NA,
"L41t1",NA,NA,
"L51t1",NA,NA,
NA,"L11t2",NA,
NA,"L21t2",NA,
NA,"L31t2",NA,
NA,"L41t2",NA,
NA,"L51t2",NA,
NA,NA,"L11t3",
NA,NA,"L21t3",
NA,NA,"L31t3",
NA,NA,"L41t3",
NA,NA,"L51t3"),

byrow = TRUE,
name = 'L',
dimnames = lambdalabels)

## F matrix: contains variances and covariances of the common factors

matrixF = mxMatrix(
type = 'Symm',
nrow = 3,
ncol = 3,
free = c( FALSE,
TRUE,FALSE,
TRUE,TRUE,FALSE),

values = c( 1,
.5,1,
.5,.5,1),
byrow = TRUE,
name = 'F',
dimnames = factorlabels)

## Q matrix: contains variances of the residual factors

matrixQ = mxMatrix(
type = 'Symm',
nrow = 15,
ncol = 15,

free = c(TRUE,
FALSE,TRUE,
FALSE,FALSE,TRUE,
FALSE,FALSE,FALSE,TRUE,
FALSE,FALSE,FALSE,FALSE,TRUE,
TRUE,FALSE,FALSE,FALSE,FALSE,TRUE,
FALSE,TRUE,FALSE,FALSE,FALSE,FALSE,TRUE,
FALSE,FALSE,TRUE,FALSE,FALSE,FALSE,FALSE,TRUE,
FALSE,FALSE,FALSE,TRUE,FALSE,FALSE,FALSE,FALSE,TRUE,
FALSE,FALSE,FALSE,FALSE,TRUE,FALSE,FALSE,FALSE,FALSE,TRUE,
FALSE,FALSE,FALSE,FALSE,FALSE,TRUE,FALSE,FALSE,FALSE,FALSE,TRUE,
FALSE,FALSE,FALSE,FALSE,FALSE,FALSE,TRUE,FALSE,FALSE,FALSE,FALSE,TRUE,
FALSE,FALSE,FALSE,FALSE,FALSE,FALSE,FALSE,TRUE,FALSE,FALSE,FALSE,FALSE,TRUE,
FALSE,FALSE,FALSE,FALSE,FALSE,FALSE,FALSE,FALSE,TRUE,FALSE,FALSE,FALSE,FALSE,TRUE,
FALSE,FALSE,FALSE,FALSE,FALSE,FALSE,FALSE,FALSE,FALSE,TRUE,FALSE,FALSE,FALSE,FALSE,TRUE),

values = c(1,
0,1,
0,0,1,
0,0,0,1,
0,0,0,0,1,
.1,0,0,0,0,1,
0,.1,0,0,0,0,1,
0,0,.1,0,0,0,0,1,
0,0,0,.1,0,0,0,0,1,
0,0,0,0,.1,0,0,0,0,1,
0,0,0,0,0,.1,0,0,0,0,1,
0,0,0,0,0,0,.1,0,0,0,0,1,
0,0,0,0,0,0,0,.1,0,0,0,0,1,
0,0,0,0,0,0,0,0,.1,0,0,0,0,1,
0,0,0,0,0,0,0,0,0,.1,0,0,0,0,1),

byrow = TRUE,
name = 'Q',
dimnames = obslabels)

## matrix T: is a full matrix with intercepts, with rows equal to Nr of observed variables, and one column. All intercepts are free to be estimnated

matrixT = mxMatrix(
type = 'Full',
nrow = 15,
ncol = 1,

free = c(TRUE,TRUE,TRUE,TRUE,TRUE,TRUE,TRUE,TRUE,TRUE,TRUE,TRUE,TRUE,TRUE,TRUE,TRUE),

values = c(1,1,1,1,1,1,1,1,1,1,1,1,1,1,1),

labels = c("t11","t12","t13","t14","t15",
"t21","t22","t23","t24","t25",
"t31","t32","t33","t34","t35"),

byrow = TRUE,
name = 'T',
dimnames = taulabels)

##matrix K is a full matrix with common factor means

matrixK = mxMatrix(
type = 'Full',
nrow = 3,
ncol = 1,

free = c(FALSE,FALSE,FALSE),

values = c(0,0,0),
byrow = TRUE,
name = 'K',
dimnames = kappalabels)

conf = mxCI ("K",interval = .90)

algebraS = mxAlgebra(expression = L %*% F %*% t(L) + Q, name = 'S', dimnames = obslabels)
algebraM = mxAlgebra(expression = t(T + L%*%K), name = 'M', dimnames = list("mean",obsnames))

exp = mxMLObjective(covariance = 'S', means = 'M')

longmodel = mxModel(title,obs,
matrixL,matrixF,matrixQ,matrixT,matrixK,algebraS,algebraM,exp,conf)

longmodelOut = mxRun(longmodel, intervals = TRUE)

summary(longmodelOut)

mhunter's picture
Offline
Joined: 07/31/2009
Two general strategies

Hi Daria,

I know of two general strategies to alleviate mxStatus RED. First, try re-running the model from its previously estimated values.

modRun <- mxRun(yourModel)
# Gives mxStatus RED
 
modRunAgain <- mxRun(modRun)
# mxStatus RED is now gone

You'd want to be sure that the estimates are plausible. What counts as a plausible estimate depends on both your data and your model, so you'll need some degree of knowledge about both. In general, a mean estimate of a variable with values between 0 and 5 should not be 157.79. Similarly, check the standard errors. If some of them are NA or nan, then you may have an identification problem or the solution found by OpenMx might not be very good.

The second strategy is to adjust the starting values. Giving OpenMx starting values close to where you might parameters should be estimated can help enormously. Also, Tim Bates has recently posted about his helper functions to select starting values. Here's the thread:

http://openmx.psyc.virginia.edu/thread/2712