Ajuda com a modelagem SEM (OpenMx, polycor)

10

Estou com muitos problemas com um conjunto de dados ao qual estou tentando aplicar o SEM.

Supomos a existência de 5 fatores latentes A, B, C, D, E, com indicadores resp. A1 a A5 (fatores ordenados), B1 a B3 (quantitativo), C1, D1, E1 (todos os três últimos fatores ordenados, com apenas 2 níveis para E1. Estamos interessados ​​em covariâncias entre todos os fatores.

Eu tentei usar OpenMxpara fazer isso. Aqui estão algumas das minhas tentativas:

  • Tentei primeiro usar matrizes de limiares para todos os fatores ordenados, mas a convergência falhou.

  • Decidi usar correlações policóricas / polisseriais em vez de dados brutos, com a função hetcorda biblioteca polycor(planejei inicializar a amostra para obter intervalos de confiança). Também não converge!

  • Tentei restringir a indivíduos com dados completos, mas também falhou!

Minha primeira pergunta é: existe uma maneira natural de interpretar essas falhas?

Minha segunda pergunta é: o que devo fazer ???

Edit: para futuros leitores que pode encontrar o mesmo problema , depois de passar pelo código das funções em polycor... a solução é simplesmente para uso hetcor()com a opção std.err=FALSE. Isso fornece estimativas muito semelhantes às que o StasK forneceu. Agora não tenho tempo para entender melhor o que está acontecendo aqui! As perguntas abaixo foram muito bem respondidas pelo StasK.

Tenho outras perguntas, mas antes de qualquer coisa, aqui está um URL com um arquivo RData que contém um quadro de dados que L1contém apenas os dados completos: data_sem.RData

Aqui estão algumas linhas de códigos mostrando a falha do 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

Mas ainda posso calcular uma matriz de correlação ou covariância de uma maneira muito suja, considerando meus fatores ordenados como variáveis ​​quantitativas:

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

Aqui está um trecho de OpenMxcódigo junto à minha próxima pergunta: o modelo a seguir está correto? Não há muitos parâmetros livres?

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])
       );

E uma última pergunta. Com este modelo (vamos esquecer por um momento a maneira inadequada de calcular a matriz de correlação), eu corro o OpenMx:

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

Entre o resumo, este:

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 

O ajuste parece muito ruim, apesar do grande número de parâmetros. O que isso significa? Isso significa que devemos adicionar covariâncias entre variáveis ​​manifestas?

Muito obrigado antecipadamente por todas as suas respostas, estou lentamente ficando louco ...

Elvis
fonte

Respostas:

10

Você deve ter descoberto um bug no polycorqual gostaria de relatar ao John Fox. Tudo corre bem no Stata usando meu polychoricpacote:

    . 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 as variáveis latentes que são medidos com um único indicador ( C, D, E), você precisa corrigir a variação do indicador na versão contínua de que, caso contrário, a escala da variável latente não é identificada. Dado que, com respostas binárias / ordinais, ele é fixo de qualquer maneira com 1 com links do tipo probit (ordinal), provavelmente significa que você teria que postular que seu latente é equivalente ao indicador observado ou que você deveria postular o carregamento padronizado . Isso essencialmente torna seu modelo equivalente a um modelo CFA, no qual você tem os fatores latentes A e B medidos com {A1-A5, C1, D1, E1} e {B1-B3, C1, D1, E1}, respectivamente.

StasK
fonte
Muito obrigado por reservar um tempo para tentar isso! Então: alguém tem uma alternativa a sugerir para calcular essas correlações em R?
Elvis
Sobre os fatores, eu estava consciente de que algo estava escondido lá dentro - mas não tenho certeza ainda de entender completamente. No que escrevi, tenho relações como - exceto que esse é, de fato, uma politomia disso. Mesmo que não seja ordinal, mas quantitativo, como eu apenas dou correlações (nem mesmo covariância), não entendo como a escala dos pode ser recuperada. Quero dizer não apenas a variação de , mas também o valor de . No entanto, a fixação piora o ajuste! I entender melhor as coisas quando nos encaixamos dados brutos, mas infelizmente isso não ...Ai=αiA+ϵAiAiϵαi
Elvis
Por fatores com um único indicador, as coisas são piores ...! De fato C1, D1, E1 são a soma de várias variáveis; eles eram assim quando recebi os dados, solicitei todo o conjunto de dados como achava preferível, mas em algum momento retornei às somas, pois nada estava funcionando bem ... Se eu puder encontrar uma maneira de calcular essas correlações com R, usarei o conjunto de dados completo.
Elvis
Ok, agora que acho melhor, acho que entendi.
Elvis