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 OpenMx
to 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ą
hetcor
z bibliotekipolycor
(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 L1
zawierają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 OpenMx
kodu 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ę ...