Hilfe bei der SEM-Modellierung (OpenMx, Polycor)

10

Ich habe viele Probleme mit einem Datensatz, auf den ich SEM anwenden möchte.

Wir nehmen die Existenz von 5 latenten Faktoren A, B, C, D, E mit Indikatoren bzw. A1 bis A5 (geordnete Faktoren), B1 bis B3 (quantitativ), C1, D1, E1 (alle letzten drei geordneten Faktoren mit nur 2 Ebenen für E1. Wir sind an Kovarianzen zwischen allen Faktoren interessiert.

Ich habe versucht, dies OpenMxzu tun. Hier sind einige meiner Versuche:

  • Ich habe zuerst versucht, Schwellenwertmatrizen für alle geordneten Faktoren zu verwenden, aber die Konvergenz ist fehlgeschlagen.

  • Ich entschied mich, polychrone / polyserielle Korrelationen anstelle von Rohdaten mit der Funktion hetcoraus der Bibliothek zu verwenden polycor(ich plante, das Beispiel zu booten , um Konfidenzintervalle zu erhalten). Es konvergiert auch nicht!

  • Ich habe versucht, mich auf Personen mit vollständigen Daten zu beschränken, es schlägt auch fehl!

Meine erste Frage lautet: Gibt es eine natürliche Möglichkeit, diese Fehler zu interpretieren?

Meine zweite Frage ist: Was soll ich tun ???

Bearbeiten: Für zukünftige Leser, die möglicherweise auf dasselbe Problem stoßen , nachdem sie den Code der Funktionen in polycor... durchgearbeitet haben, besteht die Lösung einfach darin, sie hetcor()mit der Option zu verwenden std.err=FALSE. Dies ergibt Schätzungen, die denen von StasK sehr ähnlich sind. Mir fehlt jetzt die Zeit, besser zu verstehen, was hier los ist! Die folgenden Fragen wurden von StasK ziemlich gut beantwortet.

Ich habe andere Fragen, aber vor allem ist hier eine URL mit einer RData-Datei, die einen Datenrahmen enthält L1, der nur die vollständigen Daten enthält: data_sem.RData

Hier einige Codezeilen, die den Ausfall von anzeigen 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

Aber ich kann immer noch eine Korrelation oder eine Kovarianzmatrix auf sehr schmutzige Weise berechnen, wenn ich meine geordneten Faktoren als quantitative Variablen betrachte:

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

Hier ist ein Teil des OpenMxCodes zusammen mit meiner nächsten Frage: Ist das folgende Modell korrekt? Nicht zu viele freie Parameter?

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

Und noch eine letzte Frage. Mit diesem Modell (vergessen wir für einen Moment die unangemessene Art und Weise, wie die Korrelationsmatrix berechnet wird) führe ich OpenMx aus:

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

in der Zusammenfassung ist dies:

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 

Die Passform scheint trotz der Vielzahl von Parametern sehr schlecht zu sein. Was bedeutet das? Bedeutet das, dass wir Kovarianzen zwischen Manifestvariablen hinzufügen sollten?

Vielen Dank im Voraus für all Ihre Antworten, ich werde langsam verrückt ...

Elvis
quelle

Antworten:

10

Sie müssen einen Fehler entdeckt haben polycor, den Sie dem John Fox melden möchten. In Stata läuft alles gut mit meinem polychoricPaket:

    . 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

Für die latenten Variablen , die mit einem einzigen Indikatoren gemessen werden ( C, D, E), müssen Sie die Varianz des Indikators in der kontinuierlichen Version zu beheben, da sonst das Ausmaß der latenten Variablen nicht identifiziert wird. Angesichts der Tatsache, dass bei binären / ordinalen Antworten bei (ordinalen) Probit-Links ohnehin 1 festgelegt ist, bedeutet dies wahrscheinlich, dass Sie postulieren müssen, dass Ihre Latente dem beobachteten Indikator entspricht, oder dass Sie die standardisierte Belastung postulieren müssen . Dies macht Ihr Modell im Wesentlichen zu einem CFA-Modell, bei dem latente Faktoren A und B mit {A1-A5, C1, D1, E1} bzw. {B1-B3, C1, D1, E1} gemessen werden.

StasK
quelle
Vielen Dank, dass Sie sich die Zeit genommen haben, dies zu versuchen! Also: Hat jemand eine Alternative, um diese Korrelationen in R zu berechnen?
Elvis
Ai=αiA+ϵAiAiϵαi
Elvis
Für Faktoren mit einem einzigen Indikator sind die Dinge einfach am schlimmsten ...! Tatsächlich sind C1, D1, E1 die Summe mehrerer Variablen; Sie waren so, als mir die Daten zur Verfügung gestellt wurden. Ich fragte nach dem gesamten Datensatz, da ich es für vorzuziehen hielt, aber irgendwann wechselte ich wieder zu den Summen, da nichts gut funktionierte ... Wenn ich einen Weg finden kann, zu berechnen Für diese Korrelationen mit R verwende ich den vollständigen Datensatz.
Elvis
Okay, jetzt, wo ich es besser finde, denke ich, dass ich es verstehe.
Elvis