Solved – Can’t compute standard errors: the information matrix could not be inverted

identifiabilitystructural-equation-modeling

I am trying to compute a Structural equation model.
I have identified one model, in which I have included all the subscales simultaneously. However, when I try to look at the subscales separately, I get the following warning message for some of the subscales:

In lav_model_vcov(lavmodel = lavmodel2, lavsamplestats = lavsamplestats, :
lavaan WARNING:
Could not compute standard errors! The information matrix could
not be inverted. This may be a symptom that the model is not
identified.

My model looks at follows:

mod0= "extra =~ BFI1 + BFI6 + BFI11 + BFI16
   vertr =~ BFI2 + BFI7 + BFI12 + BFI17
   gewis =~ BFI3 + BFI8 + BFI13 + BFI18
   nerot =~ BFI4 + BFI9 + BFI14 + BFI19
   offen =~ BFI5 + BFI10+ BFI15 + BFI20 + BFI21
   func  =~ SF36_3a + SF36_3b +SF36_3c + SF36_3d + SF36_3e +SF36_3f +SF36_3g + SF36_3h + SF36_3i + SF36_3j
   lim   =~ SF36_4a +SF36_4b + SF36_4c + SF36_4d
   emot  =~ SF36_5a + SF36_5b + SF36_c5 
   socfunc =~ SF36_6 + SF36_10
   pain    =~ SF36_7 + SF36_8
   vitality =~ SF36_9a +SF36_9e + SF36_9g + SF36_9i
   mental =~ SF36_9b + SF36_9c + SF36_9d +SF36_9f +SF36_9h
   genhealth =~ SF36_11a + SF36_11b + SF36_11c + SF36_11d"`

When I try to estimate the subscales separately:

Physical functioning

mod_func = "func =~ SF36_3a + SF36_3b +SF36_3c + SF36_3d + SF36_3e +SF36_3f +SF36_3g + SF36_3h + SF36_3i + SF36_3j "
res_func = cfa(mod_func, data =d0)
summary(res_func, standardized =TRUE)

—Role limitations

mod_lim = "lim =~ SF36_4a +SF36_4b + SF36_4c + SF36_4d"
res_lim = cfa(mod_lim, data = d0)
summary(res_lim, standardized =TRUE)

— Emotional functioning

mod_emo = "emot  =~ SF36_5a + SF36_5b + SF36_c5"
res_emo = cfa(mod_emo, data = d0)
summary(res_emo, standardized = TRUE)

— Social functioning

mod_socfunc = "socfunc =~ SF36_6 + SF36_10"
res_socfunc = cfa(mod_socfunc, data =d0)
summary(res_socfunc, standardized =TRUE)

—- pain

mod_pain = "pain =~ SF36_7 + SF36_8"
res_pain = cfa(mod_pain, data = d0)
summary (res_pain, standardized =TRUE)

—- Vitality

mod_vitality = " vitality =~ SF36_9a +SF36_9e + SF36_9g + SF36_9i"
res_vitality = cfa(mod_vitality, data =d0)
summary(res_vitality, standardized =TRUE)

—- mental health

mod_mental = " mental =~ SF36_9b + SF36_9c + SF36_9d +SF36_9f +SF36_9h"
res_mental = cfa(mod_mental, data = d0)
summary (res_mental, standaridzed =TRUE)

— General Health

mod_genhealt ="genhealth =~ SF36_11a + SF36_11b + SF36_11c + SF36_11d"
res_genhealth = cfa(mod_genhealt, data =d0)
summary(res_genhealth, standardized =TRUE)

For the subscales Pain and social functioning, I get the warning message:
Warning messages:

1: In lav_model_vcov(lavmodel = lavmodel2, lavsamplestats = lavsamplestats,  :
  lavaan WARNING:
    Could not compute standard errors! The information matrix could
    not be inverted. This may be a symptom that the model is not
    identified.
2: In lav_object_post_check(object) :
  lavaan WARNING: some estimated ov variances are negative

Also, when I try to estimate an orthogonal model using
res = cfa(mod0_orth, orthogonal = TRUE, data = d0) I get the warning message:

1: In lav_model_vcov(lavmodel = lavmodel2, lavsamplestats = lavsamplestats, :
lavaan WARNING:
Could not compute standard errors! The information matrix could
not be inverted. This may be a symptom that the model is not
identified.

2: In lav_object_post_check(object) :
lavaan WARNING: some estimated ov variances are negative

I do not get the warning, when I estimate the unorthogonal model.

Any help would be very much appreciated.

Best Answer

You don't have enough information fit a single factor model when you only have two measured variables.

I think of it like this. This model:

mod_pain = "pain =~ SF36_7 + SF36_8"

Wants to estimate two parameters. A loading for each of the measured variables. How much information are you giving it to do that with? One covariance.

So you have 1 (covariance) - 2 (parameters to estimate) = -1 df.

The same thing will happen with an orthogonal model.

If you really want to estimate this, you can do it by constraining the loadings to be equal.

mod_pain = "pain =~ a*SF36_7 + a*SF36_8"

Now your model has 0 df, so it's just identified. It's not an interesting model, it doesn't tell you anything you didn't already know, and you have to add in a constraint that yo have no evidence for.

Any SEM textbook should cover model identification. Most would recommend that you check your model is identified before you run it, because it is possible that the program doesn't realize. One of the best references for identification rules is Bollen's book 'structural equations with latent variables.' However, model identification is hard.

In addition, it's possible for a model to be empirically non-identified. A model would be identified with some data, but it is not identified with other data.

Here's something that covers your exact issue: https://m-clark.github.io/sem/sem.html#issues-in-sem