tbates / umx

Making Structural Equation Modeling (SEM) in R quick & powerful
https://tbates.github.io/
44 stars 17 forks source link

umxLav2RAM lavaanMode = "lavaan" weirdness? #197

Closed lf-araujo closed 2 years ago

lf-araujo commented 2 years ago

Dear Tim,

I came across a strange behaviour while trying to convert a lavaan model to RAM. In the model specification:

library(umx)
model <- "
  # random intercepts
  xir =~  1*X1 + 1*X2  + 1*X3 +1*X4
  yir =~  1*Y1 + 1*Y2 + 1*Y3 + 1*Y4

  # crosslaged
  Y2 ~ 0.1*X1
  X2 ~ 0.5*Y1
  Y3 ~ 0.1*X2
  X3 ~ 0.5*Y2
  Y4 ~ 0.1*X3
  X4 ~ 0.5*Y3

  # instrument
  X1 + X2 + X3 + X4  ~ 0.05*PGSx
  Y1 + Y2 + Y3 + Y4  ~ 0.1*PGSy

  # innovations
  innoX1 =~ 1*X1
  innoX2 =~ 1*X2
  innoX3 =~ 1*X3
  innoX4 =~1*X4
  innoY1 =~1*Y1
  innoY2 =~1*Y2
  innoY3 =~1*Y3
  innoY4 =~1*Y4

  X2  ~ 0.4*innoX1
  X3  ~ 0.3*innoX2
  X4 ~ 0.3*innoX3
  Y2  ~ 0.3*innoY1
  Y3  ~ 0.3*innoY2
  Y4 ~ 0.3*innoY3

  # correlations
  xir ~~ 0.5*yir

  #means
  X1 ~ 1
  X2 ~ 1
  X3 ~ 1
  X4 ~ 1
  Y1 ~ 1
  Y2 ~ 1
  Y3 ~ 1
  Y4 ~ 1

  # variances
  innoX1 ~~ 1*innoX1
  innoX2 ~~ 1*innoX2
  innoX3 ~~ 1*innoX3
  innoX4 ~~ 1*innoX4
  innoY1 ~~ 1*innoY1
  innoY2 ~~ 1*innoY2
  innoY3 ~~ 1*innoY3
  innoY4 ~~ 1*innoY4
"

Now when we look at the A matrix free values:

 m1 <- umxLav2RAM(model, lavaanMode = "lavaan", autoRun = F, printTab = F)
  manifests <- m1$manifestVars
  latents <- m1$latentVars
  allVariables <- c(manifests, latents)

  Afree <- matrix(m1@matrices$A@free, ncol = length(allVariables))

It is all set to FALSE, when in fact it should look more like the following, no?

> Afree
         Y2    X2    Y3    X3    Y4    X4    X1    Y1  PGSx  PGSy   xir   yir innoX1 innoX2 innoX3 innoX4 innoY1 innoY2 innoY3 innoY4
 [1,] FALSE FALSE FALSE FALSE FALSE FALSE  TRUE FALSE FALSE  TRUE FALSE FALSE  FALSE  FALSE  FALSE  FALSE   TRUE  FALSE  FALSE  FALSE
 [2,] FALSE FALSE FALSE FALSE FALSE FALSE FALSE  TRUE  TRUE FALSE FALSE FALSE   TRUE  FALSE  FALSE  FALSE  FALSE  FALSE  FALSE  FALSE
 [3,] FALSE  TRUE FALSE FALSE FALSE FALSE FALSE FALSE FALSE  TRUE FALSE FALSE  FALSE  FALSE  FALSE  FALSE  FALSE   TRUE  FALSE  FALSE
 [4,]  TRUE FALSE FALSE FALSE FALSE FALSE FALSE FALSE  TRUE FALSE FALSE FALSE  FALSE   TRUE  FALSE  FALSE  FALSE  FALSE  FALSE  FALSE
 [5,] FALSE FALSE FALSE  TRUE FALSE FALSE FALSE FALSE FALSE  TRUE FALSE FALSE  FALSE  FALSE  FALSE  FALSE  FALSE  FALSE   TRUE  FALSE
 [6,] FALSE FALSE  TRUE FALSE FALSE FALSE FALSE FALSE  TRUE FALSE FALSE FALSE  FALSE  FALSE   TRUE  FALSE  FALSE  FALSE  FALSE  FALSE
 [7,] FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE  TRUE FALSE FALSE FALSE  FALSE  FALSE  FALSE  FALSE  FALSE  FALSE  FALSE  FALSE
 [8,] FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE  TRUE FALSE FALSE  FALSE  FALSE  FALSE  FALSE  FALSE  FALSE  FALSE  FALSE
 [9,] FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE  FALSE  FALSE  FALSE  FALSE  FALSE  FALSE  FALSE  FALSE
[10,] FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE  FALSE  FALSE  FALSE  FALSE  FALSE  FALSE  FALSE  FALSE
[11,] FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE  FALSE  FALSE  FALSE  FALSE  FALSE  FALSE  FALSE  FALSE
[12,] FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE  FALSE  FALSE  FALSE  FALSE  FALSE  FALSE  FALSE  FALSE
[13,] FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE  FALSE  FALSE  FALSE  FALSE  FALSE  FALSE  FALSE  FALSE
[14,] FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE  FALSE  FALSE  FALSE  FALSE  FALSE  FALSE  FALSE  FALSE
[15,] FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE  FALSE  FALSE  FALSE  FALSE  FALSE  FALSE  FALSE  FALSE
[16,] FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE  FALSE  FALSE  FALSE  FALSE  FALSE  FALSE  FALSE  FALSE
[17,] FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE  FALSE  FALSE  FALSE  FALSE  FALSE  FALSE  FALSE  FALSE
[18,] FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE  FALSE  FALSE  FALSE  FALSE  FALSE  FALSE  FALSE  FALSE
[19,] FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE  FALSE  FALSE  FALSE  FALSE  FALSE  FALSE  FALSE  FALSE
[20,] FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE  FALSE  FALSE  FALSE  FALSE  FALSE  FALSE  FALSE  FALSE

With TRUE in the paths specified to be estimated.

mcneale commented 2 years ago

I think the Lavaan syntax you are using implicitly fixes parameters when, e.g., 1*X1 is used. Changing the code to the following at least freed up some of the elements of m1@matrices$A@free - which are correctly loaded into Afree. library(umx) model <- "

random intercepts

xir =~ X1 + X2 + X3 + X4 yir =~ 1Y1 + 1Y2 + 1Y3 + 1Y4

crosslaged

Y2 ~ 0.1X1 X2 ~ 0.5Y1 Y3 ~ 0.1X2 X3 ~ 0.5Y2 Y4 ~ 0.1X3 X4 ~ 0.5Y3

instrument

X1 + X2 + X3 + X4 ~ 0.05PGSx Y1 + Y2 + Y3 + Y4 ~ 0.1PGSy

innovations

innoX1 =~ 1X1 innoX2 =~ 1X2 innoX3 =~ 1X3 innoX4 =~1X4 innoY1 =~1Y1 innoY2 =~1Y2 innoY3 =~1Y3 innoY4 =~1Y4

X2 ~ innoX1 X3 ~ innoX2 X4 ~ innoX3 Y2 ~ innoY1 Y3 ~ innoY2 Y4 ~ innoY3

correlations

xir ~~ 0.5*yir

means

X1 ~ 1 X2 ~ 1 X3 ~ 1 X4 ~ 1 Y1 ~ 1 Y2 ~ 1 Y3 ~ 1 Y4 ~ 1

variances

innoX1 ~~ 1innoX1 innoX2 ~~ 1innoX2 innoX3 ~~ 1innoX3 innoX4 ~~ 1innoX4 innoY1 ~~ 1innoY1 innoY2 ~~ 1innoY2 innoY3 ~~ 1innoY3 innoY4 ~~ 1innoY4 "

And I note that code and /code (inside less-than and greater-than chevrons) gets weirdly formatted on github.

lf-araujo commented 2 years ago

Thanks, ok, not a bug. The lavaan switch is not compatible with setting starting values with the 0.0*var syntax.

Edit For future reference in case other users come across this. The syntax start(0.3)*var seems to set the starting value whilst keeping the parameter free to be estimated.