Ayuda con el modelado SEM (OpenMx, polycor)

10

Tengo muchos problemas con un conjunto de datos al que estoy tratando de aplicar SEM.

Suponemos la existencia de 5 factores latentes A, B, C, D, E, con indicadores resp. A1 a A5 (factores ordenados), B1 a B3 (cuantitativo), C1, D1, E1 (los tres últimos factores ordenados, con solo 2 niveles para E1. Estamos interesados ​​en las covarianzas entre todos los factores.

Traté de usar OpenMxpara hacerlo. Estos son algunos de mis intentos:

  • Primero intenté usar matrices de umbrales para todos los factores ordenados, pero la convergencia falló.

  • Decidí usar correlaciones policóricas / poliséricas en lugar de datos sin procesar, con la función hetcorde la biblioteca polycor( planeé arrancar la muestra para obtener intervalos de confianza). ¡Tampoco converge!

  • Traté de restringir a las personas con datos completos, ¡también falla!

Mi primera pregunta es: ¿hay una forma natural de interpretar estos fracasos?

Mi segunda pregunta es: ¿qué debo hacer?

Editar: para futuros lectores que puedan encontrar el mismo problema , después de revisar el código de las funciones en polycor... la solución es simplemente usar hetcor()con la opción std.err=FALSE. Esto da estimaciones muy similares a las que dio StasK. ¡Ahora me falta tiempo para comprender mejor lo que está sucediendo aquí! StasK ha respondido bastante bien a las siguientes preguntas.

Tengo otras preguntas, pero antes que nada, aquí hay una url con un archivo RData que contiene un marco de datos que L1contiene solo los datos completos: data_sem.RData

Aquí algunas líneas de códigos que muestran la falla de hetcor.

> require("OpenMx")
> require("polycor")
> load("data_sem.RData")
> hetcor(L1)
Erreur dans cut.default(scale(x), c(-Inf, row.cuts, Inf)) : 
  'breaks' are not unique
De plus : Il y a eu 11 avis (utilisez warnings() pour les visionner)
> head(L1)
   A1 A2 A3 A4 A5       B1       B2       B3 C1 D1 E1
1   4  5  4  5  7 -0.82759  0.01884 -3.34641  4  6  1
4   7  5  0  4  6 -0.18103  0.14364  0.35730  0  1  0
7   7  5  7  6  9 -0.61207 -0.18914  0.13943  0  0  0
10  5  5 10  7  3 -1.47414  0.10204  0.13943  2  0  0
11  7  5  8  9  9 -0.61207  0.06044 -0.73203  0  2  0
12  5  5  9 10  5  0.25000 -0.52192  1.44662  0  0  0

Pero aún puedo calcular una correlación o una matriz de covarianza de una manera muy sucia, considerando mis factores ordenados como variables cuantitativas:

> Cor0 <- cor(data.frame(lapply(L1, as.numeric)))

Aquí hay un OpenMxcódigo junto con mi siguiente pregunta: ¿es correcto el siguiente modelo? ¿No hay demasiados parámetros libres?

manif <- c("A1","A2","A3","A4","A5", "B1","B2","B3", "C1", "D1", "E1");

model1 <- mxModel(type="RAM",
        manifestVars=manif, latentVars=c("A","B","C","D","E"),
        # factor variance
        mxPath(from=c("A","B","C","D","E"), arrows=2, free=FALSE, values = 1),
        # factor covariance
        mxPath(from="A", to="B",  arrows=2, values=0.5),
        mxPath(from="A", to="C",  arrows=2, values=0.5),
        mxPath(from="A", to="D",  arrows=2, values=0.5),
        mxPath(from="A", to="E",  arrows=2, values=0.5),
        mxPath(from="B", to="C",  arrows=2, values=0.5),
        mxPath(from="B", to="D",  arrows=2, values=0.5),
        mxPath(from="B", to="E",  arrows=2, values=0.5),
        mxPath(from="C", to="D",  arrows=2, values=0.5),
        mxPath(from="C", to="E",  arrows=2, values=0.5),
        mxPath(from="D", to="E",  arrows=2, values=0.5),
        # factors → manifest vars
        mxPath(from="A", to=c("A1","A2","A3","A4","A5"), free=TRUE, values=1),
        mxPath(from="B", to=c("B1","B2","B3"), free=TRUE, values=1),
        mxPath(from="C", to=c("C1"), free=TRUE, values=1),
        mxPath(from="D", to=c("D1"), free=TRUE, values=1),
        mxPath(from="E", to=c("E1"), free=TRUE, values=1),
        # error terms
        mxPath(from=manif, arrows=2, values=1, free=TRUE),
        # data
        mxData(Cor0, type="cor",numObs=dim(L1)[1])
       );

Y una última pregunta. Con este modelo (olvidemos por un momento la forma inapropiada en que se calcula la matriz de correlación), ejecuto OpenMx:

> mxRun(model1) -> fit1
Running untitled1 
> summary(fit1)

entre el resumen, esto:

observed statistics:  55 
estimated parameters:  32 
degrees of freedom:  23 
-2 log likelihood:  543.5287 
saturated -2 log likelihood:  476.945 
number of observations:  62 
chi-square:  66.58374 
p:  4.048787e-06 

El ajuste parece muy malo, a pesar de la gran cantidad de parámetros. Qué significa eso? ¿Eso significa que deberíamos agregar covarianzas entre variables manifiestas?

Muchas gracias de antemano por todas sus respuestas, poco a poco me estoy volviendo loco ...

Elvis
fuente

Respuestas:

10

Debe haber descubierto un error en el polycorque desea informar a John Fox. Todo funciona bien en Stata usando mi polychoricpaquete:

    . polychoric *

    Polychoric correlation matrix

               A1          A2          A3          A4          A5          B1          B2          B3          C1          D1          E1
   A1           1
   A2   .34544812           1
   A3   .39920225   .19641726           1
   A4   .09468652   .04343741   .31995685           1
   A5   .30728339   -.0600463   .24367634   .18099061           1
   B1   .01998441  -.29765985   .13740987   .21810968   .14069473           1
   B2  -.19808738   .17745687  -.29049459  -.21054867   .02824307  -.57600551          1
   B3   .17807109  -.18042045   .44605383   .40447746   .18369998   .49883132  -.50906364           1
   C1  -.35973454  -.33099295  -.19920454  -.14631621  -.36058235   .00066762  -.05129489  -.11907687           1
   D1   -.3934594  -.21234022  -.39764587  -.30230591  -.04982743  -.09899428   .14494953   -.5400759   .05427906           1
   E1  -.13284936   .17703745  -.30631236  -.23069382  -.49212315  -.26670382   .24678619  -.47247566    .2956692   .28645516           1

Para las variables latentes que se miden con un solo indicador ( C, D, E), que debe arreglar la varianza del indicador en la versión continua de la misma, ya que de lo contrario no se identifica la escala de la variable latente. Dado que con respuestas binarias / ordinales, se fija de todos modos a 1 con enlaces de tipo probit (ordinal), probablemente significa que tendría que postular que su latente es equivalente al indicador observado, o debe postular la carga estandarizada . Básicamente, esto hace que su modelo sea equivalente a un modelo CFA donde tiene factores latentes A y B medidos con {A1-A5, C1, D1, E1} y {B1-B3, C1, D1, E1}, respectivamente.

StasK
fuente
¡Muchas gracias por tomarse el tiempo de probar esto! Entonces: ¿alguien tiene una alternativa que sugerir para calcular estas correlaciones en R?
Elvis
UNAyo=αyoUNA+ϵUNAyoUNAyoϵαyo
Para factores con un solo indicador, ¡las cosas son peores ...! De hecho, C1, D1, E1 son la suma de varias variables; eran así cuando me proporcionaron los datos, pedí todo el conjunto de datos porque pensé que era preferible, pero en algún momento volví a las sumas ya que nada funcionaba bien ... Si puedo encontrar una manera de calcular estas correlaciones con R usaré el conjunto de datos completo.
Elvis
Bien, ahora que lo pienso mejor, creo que lo entiendo.
Elvis