Aide à la modélisation SEM (OpenMx, polycor)

10

J'ai beaucoup de problèmes avec un ensemble de données auquel j'essaie d'appliquer SEM.

Nous supposons l'existence de 5 facteurs latents A, B, C, D, E, avec des indicateurs resp. A1 à A5 (facteurs ordonnés), B1 à B3 (quantitatifs), C1, D1, E1 (tous les trois derniers facteurs ordonnés, avec seulement 2 niveaux pour E1. Nous nous intéressons aux covariances entre tous les facteurs.

J'ai essayé de l'utiliser OpenMxpour le faire. Voici quelques-unes de mes tentatives:

  • J'ai d'abord essayé d'utiliser des matrices de seuils pour tous les facteurs ordonnés, mais la convergence a échoué.

  • J'ai décidé d'utiliser des corrélations polychoriques / polysériennes au lieu de données brutes, avec la fonction hetcorde la bibliothèque polycor(j'avais prévu d'amorcer l'échantillon pour obtenir des intervalles de confiance). Il ne parvient pas non plus à converger!

  • J'ai essayé de me limiter aux individus avec des données complètes, ça échoue aussi!

Ma première question est: existe-t-il un moyen naturel d'interpréter ces échecs?

Ma deuxième question est: que dois-je faire ???

Edit: pour les futurs lecteurs qui pourraient rencontrer le même problème , après avoir parcouru le code des fonctions en polycor... la solution est simplement à utiliser hetcor()avec l'option std.err=FALSE. Cela donne des estimations très similaires à celles fournies par StasK. Je manque de temps maintenant pour mieux comprendre ce qui se passe ici! StasK a répondu assez bien aux questions ci-dessous.

J'ai d'autres questions, mais avant tout, voici une URL avec un fichier RData contenant un bloc de données L1contenant uniquement les données complètes: data_sem.RData

Voici quelques lignes de codes montrant l'échec 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

Mais je peux toujours calculer une corrélation ou une matrice de covariance d'une manière très sale, en considérant mes facteurs ordonnés comme des variables quantitatives:

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

Voici un morceau de OpenMxcode avec ma question suivante: le modèle suivant est-il correct? Pas trop de paramètres 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])
       );

Et une dernière question. Avec ce modèle (oublions un instant la manière inappropriée de calculer la matrice de corrélation), je lance OpenMx:

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

parmi le résumé, ceci:

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 

L'ajustement semble très mauvais, malgré le grand nombre de paramètres. Qu'est-ce que ça veut dire? Cela signifie-t-il que nous devrions ajouter des covariances entre les variables manifestes?

Merci d'avance pour toutes vos réponses, je deviens lentement fou ...

Elvis
la source

Réponses:

10

Vous devez avoir découvert un bogue dans polycorlequel vous voudriez signaler au John Fox. Tout fonctionne bien dans Stata en utilisant mon polychoricpackage:

    . 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

Pour les variables latentes qui sont mesurées avec un seul indicateur ( C, D, E), vous devez corriger la variance de l'indicateur dans la version continue de celui - ci, sinon l'échelle de la variable latente n'est pas identifiée. Étant donné qu'avec les réponses binaires / ordinales, il est de toute façon fixé à 1 avec des liens de type probit (ordinaux), cela signifie probablement que vous devrez postuler que votre latence est équivalente à l'indicateur observé, ou vous devez postuler le chargement normalisé . Cela rend essentiellement votre modèle équivalent à un modèle CFA où vous avez des facteurs latents A et B mesurés avec {A1-A5, C1, D1, E1} et {B1-B3, C1, D1, E1}, respectivement.

StasK
la source
Merci beaucoup d'avoir pris le temps d'essayer! Donc: quelqu'un a-t-il une alternative à proposer pour calculer ces corrélations dans R?
Elvis
À propos des facteurs, j'étais conscient que quelque chose se cachait là-dedans - mais je ne suis pas sûr de bien comprendre. Dans ce que j'ai écrit, j'ai des relations comme - sauf que cet est en fait une polytomie de cela. Même si ce n'est pas ordinal, mais quantitatif, comme je ne donne que des corrélations (pas même de covariance), je ne sais pas comment l'échelle des peut être récupérée. Je veux dire non seulement la variance de , mais aussi la valeur de . Cependant, le réparer aggrave l'ajustement! Je comprends mieux les choses lorsque nous ajustons des données brutes, mais malheureusement cela échoue ...A i A i ϵ α iAi=αiA+ϵAiAiϵαi
Elvis
Pour les facteurs avec un seul indicateur, les choses sont tout simplement pires ...! En fait C1, D1, E1 sont la somme de plusieurs variables; ils étaient comme ça quand on m'a fourni les données, j'ai demandé l'ensemble des données car je pensais que c'était préférable mais à un moment donné je suis revenu sur les sommes car rien ne fonctionnait bien ... Si je peux trouver un moyen de calculer ces corrélations avec R je vais utiliser l'ensemble de données complet.
Elvis
D'accord, maintenant que je pense mieux, je pense que je comprends.
Elvis