0
$\begingroup$

I am trying to specify a lavaan CFA that has some factors with three or more indicators, one factor with two indicators, and two factors with one indicator. For the single indicator factors, I tried to follow the advice previously posted to specify the variance of the observed variable to 0 so the latent variable will account for all of the variance in the observed variable. However, when I do so, I still get a covariance matrix that is not positive definite where the latent variance does not equal the variance for the single items. Is this still the correct way to specify single indicator factors or is there another way? I've created a reproducible example below.

Simulated data with a positive definite covariate matrix. library(MASS) mu <- c(2.5,3,3.1,3.5,2.1,1.5,2,4,4.2,4.5) Sigma <- matrix(.5, nrow=10, ncol=10) + diag(10)*.5 set.seed(1527) rawvars <- mvrnorm(n=200, mu=mu, Sigma=Sigma)

Convert latent responses to positive ordered categories (to create likert-type items).

i1 = findInterval(rawvars[,1], vec=c(-Inf,2,2.75,3.5,4.25,Inf)) i2 = findInterval(rawvars[,2], vec=c(-Inf,2,2.75,3.5,4.25,Inf)) i3 = findInterval(rawvars[,3], vec=c(-Inf,2,2.75,3.5,4.25,Inf)) i4 = findInterval(rawvars[,4], vec=c(-Inf,2,2.75,3.5,4.25,Inf)) i5 = findInterval(rawvars[,5], vec=c(-Inf,2,2.75,3.5,4.25,Inf)) i6 = findInterval(rawvars[,6], vec=c(-Inf,2,2.75,3.5,4.25,Inf)) i7 = findInterval(rawvars[,7], vec=c(-Inf,2,2.75,3.5,4.25,Inf)) i8 = findInterval(rawvars[,8], vec=c(-Inf,2,2.75,3.5,4.25,Inf)) i9 = findInterval(rawvars[,9], vec=c(-Inf,2,2.75,3.5,4.25,Inf)) i10 = findInterval(rawvars[,10], vec=c(-Inf,2,2.75,3.5,4.25,Inf)) df <- data.frame(cbind(i1,i2,i3,i4,i5,i6,i7,i8,i9,i10))

Confirm all items have small to moderate positive correlations.

> round(cor(df),2) i1 i2 i3 i4 i5 i6 i7 i8 i9 i10 i1 1.00 0.53 0.55 0.50 0.50 0.42 0.51 0.48 0.51 0.38 i2 0.53 1.00 0.51 0.48 0.39 0.45 0.42 0.50 0.55 0.40 i3 0.55 0.51 1.00 0.46 0.49 0.37 0.43 0.52 0.48 0.42 i4 0.50 0.48 0.46 1.00 0.34 0.43 0.35 0.50 0.42 0.42 i5 0.50 0.39 0.49 0.34 1.00 0.37 0.43 0.36 0.35 0.39 i6 0.42 0.45 0.37 0.43 0.37 1.00 0.34 0.38 0.39 0.32 i7 0.51 0.42 0.43 0.35 0.43 0.34 1.00 0.40 0.46 0.37 i8 0.48 0.50 0.52 0.50 0.36 0.38 0.40 1.00 0.39 0.35 i9 0.51 0.55 0.48 0.42 0.35 0.39 0.46 0.39 1.00 0.43 i10 0.38 0.40 0.42 0.42 0.39 0.32 0.37 0.35 0.43 1.00

Built model constraining two item factors to be equal and specifying the variance on the observed variables (i1 and i10) to 0.

> library(lavaan) fa.mod <- ' f1=~ i1 f2=~ i2 + i3 + i4 f3=~ i5 + i6 + i7 f4=~ ai8 + ai9 f5=~ i10 i1~~ 0*i1 i10~~ 0*i10'

Model fit was not positive definite and the latent variance does not equal the variance for the single items.

> fa.fit<- sem(fa.mod,data=df) Warning message: In lav_object_post_check(object) : lavaan WARNING: covariance matrix of latent variables is not positive definite; use inspect(fit,"cov.lv") to investigate.

> inspect(fa.fit,"cov.lv")
   f1    f2    f3    f4    f5   
f1 1.312                        
f2 0.755 0.766                  
f3 0.595 0.555 0.451            
f4 0.565 0.614 0.419 0.383      
f5 0.394 0.465 0.360 0.356 0.828

> summary(fa.fit,fit.measures=T,standardized=T)
lavaan (0.5-23.1097) converged normally after  39 iterations

  Number of observations                           200

  Estimator                                         ML
  Minimum Function Test Statistic               26.478
  Degrees of freedom                                28
  P-value (Chi-square)                           0.547

Model test baseline model:

  Minimum Function Test Statistic              760.907
  Degrees of freedom                                45
  P-value                                        0.000

User model versus baseline model:

  Comparative Fit Index (CFI)                    1.000
  Tucker-Lewis Index (TLI)                       1.003

Loglikelihood and Information Criteria:

  Loglikelihood user model (H0)              -2560.036
  Loglikelihood unrestricted model (H1)      -2546.797

  Number of free parameters                         27
  Akaike (AIC)                                5174.071
  Bayesian (BIC)                              5263.126
  Sample-size adjusted Bayesian (BIC)         5177.587

Root Mean Square Error of Approximation:

  RMSEA                                          0.000
  90 Percent Confidence Interval          0.000  0.051
  P-value RMSEA |z|)   Std.lv  Std.all
  f1 =~                                                                 
    i1                1.000                               1.146    1.000
  f2 =~                                                                 
    i2                1.000                               0.875    0.722
    i3                0.971    0.100    9.709    0.000    0.850    0.716
    i4                0.911    0.103    8.856    0.000    0.798    0.653
  f3 =~                                                                 
    i5                1.000                               0.671    0.633
    i6                0.736    0.106    6.947    0.000    0.494    0.579
    i7                0.911    0.121    7.551    0.000    0.612    0.641
  f4 =~                                                                 
    i8         (a)    1.000                               0.619    0.601
    i9         (a)    1.000                               0.619    0.646
  f5 =~                                                                 
    i10               1.000                               0.910    1.000

Covariances:
                   Estimate  Std.Err  z-value  P(>|z|)   Std.lv  Std.all
  f1 ~~                                                                 
    f2                0.755    0.107    7.053    0.000    0.753    0.753
    f3                0.595    0.091    6.517    0.000    0.774    0.774
    f4                0.565    0.078    7.250    0.000    0.797    0.797
    f5                0.394    0.079    4.996    0.000    0.378    0.378
  f2 ~~                                                                 
    f3                0.555    0.089    6.256    0.000    0.945    0.945
    f4                0.614    0.081    7.541    0.000    1.132    1.132
    f5                0.465    0.078    5.976    0.000    0.584    0.584
  f3 ~~                                                                 
    f4                0.419    0.065    6.430    0.000    1.008    1.008
    f5                0.360    0.065    5.515    0.000    0.589    0.589
  f4 ~~                                                                 
    f5                0.356    0.059    6.047    0.000    0.631    0.631

Variances:
                   Estimate  Std.Err  z-value  P(>|z|)   Std.lv  Std.all
   .i1                0.000                               0.000    0.000
   .i10               0.000                               0.000    0.000
   .i2                0.703    0.083    8.422    0.000    0.703    0.478
   .i3                0.688    0.081    8.498    0.000    0.688    0.488
   .i4                0.854    0.095    9.020    0.000    0.854    0.573
   .i5                0.673    0.079    8.547    0.000    0.673    0.599
   .i6                0.485    0.054    8.985    0.000    0.485    0.665
   .i7                0.536    0.063    8.467    0.000    0.536    0.589
   .i8                0.678    0.080    8.527    0.000    0.678    0.639
   .i9                0.535    0.068    7.899    0.000    0.535    0.583
    f1                1.312    0.131   10.000    0.000    1.000    1.000
    f2                0.766    0.137    5.608    0.000    1.000    1.000
    f3                0.451    0.099    4.561    0.000    1.000    1.000
    f4                0.383    0.075    5.133    0.000    1.000    1.000
    f5                0.828    0.083   10.000    0.000    1.000    1.000
$\endgroup$
0
$\begingroup$

ANSWERED

If anyone else has the same issue, here are some notes I've learned from the lavaan google group and experimenting.

  1. Someone pointed out that the warning went away if I increased the N in my example to 20000. So, the problem is not the syntax.

  2. As this post indicates, specifying the variance of the observed single indicator to 0 is not necessary and is now the default behavior of lavaan in the case of single indicator factors.

  3. The above issues made me realize that my actual model was likely misspecified. After checking the modification indices, I saw (which I should have known from prior analyses) that two items on separate factors were correlated. After allowing those two items to covary, the model worked fine.

Take away, if you think your syntax is correct, it's probably your model.

$\endgroup$

Your Answer

By clicking "Post Your Answer", you agree to our terms of service, privacy policy and cookie policy

Not the answer you're looking for? Browse other questions tagged or ask your own question.