Помощь в моделировании SEM (OpenMx, polycor)

10

У меня много проблем с одним набором данных, к которому я пытаюсь применить SEM.

Мы предполагаем наличие 5 скрытых факторов A, B, C, D, E с показателями соотв. A1 - A5 (упорядоченные факторы), B1 - B3 (количественные), C1, D1, E1 (все три последних упорядоченных фактора, всего 2 уровня для E1. Нас интересуют ковариации между всеми факторами.

Я пытался использовать OpenMxдля этого. Вот несколько моих попыток:

  • Сначала я попытался использовать матрицы порогов для всех упорядоченных факторов, но сходимость не удалась.

  • Я решил использовать полихорические / полисериальные корреляции вместо необработанных данных с функцией hetcorиз библиотеки polycor(я планировал загрузить образец для получения доверительных интервалов). Это также не может сходиться!

  • Я пытался ограничить лиц с полными данными, это тоже не удается!

Мой первый вопрос: есть ли естественный способ интерпретировать эти неудачи?

Мой второй вопрос: что мне делать ???

Редактировать: для будущих читателей, которые могут столкнуться с той же проблемой , после просмотра кода функций в polycor... решение состоит в том, чтобы просто использовать hetcor()опцию std.err=FALSE. Это дает оценки, очень похожие на те, которые дал StasK. Мне не хватает времени, чтобы лучше понять, что здесь происходит! На приведенные ниже вопросы StasK очень хорошо ответил.

У меня есть другие вопросы, но прежде всего, вот URL с файлом RData, содержащим фрейм данных, L1содержащий только полные данные: data_sem.RData

Здесь несколько строк кодов, показывающих сбой 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

Но я все еще могу вычислить корреляцию или ковариационную матрицу очень грязным способом, рассматривая мои упорядоченные факторы как количественные переменные:

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

Вот фрагмент OpenMxкода вместе с моим следующим вопросом: правильна ли следующая модель? Не слишком много свободных параметров?

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

И последний вопрос. С помощью этой модели (давайте на минутку забудем, каким образом вычисляется корреляционная матрица), я запускаю OpenMx:

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

среди резюме это:

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 

Подгонка кажется очень плохой, несмотря на огромное количество параметров. Что это обозначает? Означает ли это, что мы должны добавить ковариации между переменными манифеста?

Заранее большое спасибо за все ваши ответы, я постепенно схожу с ума ...

Элвис
источник

Ответы:

10

Вы, должно быть, обнаружили ошибку polycor, о которой хотите сообщить Джону Фоксу. Все отлично работает в Stata, используя мой polychoricпакет:

    . 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

Для скрытых переменных, которые измеряются с помощью одного индикатора ( C, D, E), необходимо зафиксировать отклонение индикатора в непрерывной версии этого, поскольку в противном случае масштаб скрытой переменной не определены. Учитывая, что с бинарными / порядковыми ответами оно все равно устанавливается на 1 с (порядковыми) ссылками пробитного типа, это, вероятно, означает, что вам придется постулировать, что ваш латентный эквивалент эквивалентен наблюдаемому индикатору, или вы должны постулировать стандартизированную загрузку , По сути, это делает вашу модель эквивалентной модели CFA, в которой у вас есть скрытые факторы A и B, измеренные с помощью {A1-A5, C1, D1, E1} и {B1-B3, C1, D1, E1} соответственно.

Stask
источник
Большое спасибо, что нашли время, чтобы попробовать это! Итак: есть ли у кого-нибудь альтернатива для вычисления этих корреляций в R?
Элвис
Ai=αiA+ϵAiAiϵαi
Элвис
Для факторов с одним показателем вещи просто худшие ...! Фактически C1, D1, E1 являются суммой нескольких переменных; они были такими, когда мне предоставили данные, я попросил весь набор данных, так как думал, что это предпочтительнее, но в какой-то момент я переключился на суммы, поскольку ничего не получалось ... Если я смогу найти способ вычислить эти корреляции с R я буду использовать полный набор данных.
Элвис
Хорошо, теперь, когда я думаю, что это лучше, я думаю, я понимаю.
Элвис