Pomoc w modelowaniu SEM (OpenMx, polycor)

10

Mam wiele problemów z jednym zestawem danych, do którego próbuję zastosować SEM.

Przypuszczamy istnienie 5 ukrytych czynników A, B, C, D, E ze wskaźnikami odpowiednio. A1 do A5 (czynniki uporządkowane), B1 do B3 (ilościowo), C1, D1, E1 (wszystkie trzy ostatnie czynniki uporządkowane, z tylko 2 poziomami dla E1. Interesują nas kowariancje między wszystkimi czynnikami.

Próbowałem OpenMxto zrobić. Oto kilka moich prób:

  • Najpierw próbowałem użyć macierzy progów dla wszystkich uporządkowanych czynników, ale konwergencja nie powiodła się.

  • Postanowiłem użyć korelacji polichorycznych / poliserialnych zamiast surowych danych z funkcją hetcorz biblioteki polycor(planowałem załadować próbkę, aby uzyskać przedziały ufności). Nie zbiega się również!

  • Próbowałem ograniczyć się do osób z pełnymi danymi, to też się nie udaje!

Moje pierwsze pytanie brzmi: czy istnieje naturalny sposób interpretacji tych niepowodzeń?

Moje drugie pytanie brzmi: co powinienem zrobić?

Edycja: dla przyszłych czytelników, którzy mogą napotkać ten sam problem , po przejrzeniu kodu funkcji w polycor... rozwiązaniem jest po prostu użycie hetcor()z opcją std.err=FALSE. To daje oszacowania bardzo podobne do tych, które podał StasK. Brakuje mi teraz czasu, aby lepiej zrozumieć, co się tutaj dzieje! Odpowiedzi na poniższe pytania dość dobrze odpowiedział StasK.

Mam inne pytania, ale przede wszystkim tutaj jest adres URL z plikiem RData zawierającym ramkę danych L1zawierającą tylko pełne dane: data_sem.RData

Oto kilka wierszy kodów wskazujących awarię 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

Ale nadal mogę obliczyć korelację lub macierz kowariancji w bardzo brudny sposób, biorąc pod uwagę moje uporządkowane czynniki jako zmienne ilościowe:

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

Oto fragment OpenMxkodu wraz z moim kolejnym pytaniem: czy następujący model jest poprawny? Nie za dużo darmowych parametrów?

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

I ostatnie pytanie. W tym modelu (zapomnijmy na chwilę o nieodpowiednim sposobie obliczania macierzy korelacji) uruchamiam OpenMx:

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

wśród podsumowań jest to:

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 

Dopasowanie wydaje się bardzo złe, pomimo ogromnej liczby parametrów. Co to znaczy? Czy to oznacza, że ​​powinniśmy dodać kowariancje między zmiennymi przejawionymi?

Wielkie dzięki z góry za wszystkie twoje odpowiedzi, powoli wariuję ...

Elvis
źródło

Odpowiedzi:

10

Musiałeś odkryć błąd polycor, który chciałbyś zgłosić Johnowi Foxowi. Wszystko działa dobrze w Stata przy użyciu mojego polychoricpakietu:

    . 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

Dla zmiennych ukrytych, które są mierzone za pomocą jednego wskaźnika ( C, D, E), trzeba naprawić wariancji wskaźnika w ciągłej wersji tego, jak inaczej skala zmienna ukryta nie został zidentyfikowany. Biorąc pod uwagę, że w przypadku odpowiedzi binarnych / porządkowych, i tak jest on ustalony na 1 za pomocą (porządkowych) linków typu probit, prawdopodobnie oznacza to, że musiałbyś postulować, że twoje utajenie jest równoważne obserwowanemu wskaźnikowi, lub musisz postulować znormalizowane ładowanie . Zasadniczo sprawia to, że Twój model jest równoważny modelowi CFA, w którym masz ukryte czynniki A i B zmierzone odpowiednio za pomocą {A1-A5, C1, D1, E1} i {B1-B3, C1, D1, E1}.

StasK
źródło
Wielkie dzięki za poświęcenie czasu na wypróbowanie tego! Więc: czy ktoś ma alternatywę do zasugerowania obliczenia tych korelacji w R?
Elvis
ZAja=αjaZA+ϵZAjaZAjaϵαja
Elvis
W przypadku czynników z jednym wskaźnikiem rzeczy są po prostu najgorsze ...! W rzeczywistości C1, D1, E1 są sumą kilku zmiennych; były takie, kiedy dostałem dane, poprosiłem o cały zestaw danych, ponieważ myślałem, że to jest lepsze, ale w pewnym momencie wróciłem do sum, ponieważ nic nie działało dobrze ... Jeśli mogę znaleźć sposób na obliczenie te korelacje z R użyję pełnego zestawu danych.
Elvis
Okej, teraz, kiedy myślę, że lepiej, myślę, że rozumiem.
Elvis