Инвариантный по времени предиктор наклона и перехвата в модели кривой скрытого роста в OpenMx

Я пытаюсь выяснить, как правильно добавить предиктор наклона и перехват в модели кривой скрытого роста в пакете OpenMx для R.

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

Что бы я добавил, чтобы включить не зависящий от времени предиктор наклона и перехвата? В MPlus я бы написал i on male; и я бы получил оценку пути от переменной пола до скрытого перехвата. Чтобы сделать то же самое в OpenMx, я бы просто добавил эту спецификацию пути? Нужно ли мне переопределить какие-либо значения по умолчанию, чтобы я не оценивал дисперсию или средний путь для этой переменной манифеста (или так я делаю)?

Для удобства ниже приведен код простой кривой роста и то, что я добавил для предиктора. Однако, когда я добавляю предиктор, я получаю ошибку "ковариационная матрица не является положительно определенной". Это то, что я вижу в реальных данных.

Примечание: этот вопрос кросс-опубликован на форуме OpenMx.

myLongitudinalData=data.frame(x1=rnorm(100),
                              x2=rnorm(100),
                              x3=rnorm(100),
                              x4=rnorm(100),
                              x5=rnorm(100),
                              male=round(runif(100,0,1)))
require(OpenMx)

growthCurveModel <- mxModel("Linear Growth Curve Model Path Specification",
                            type="RAM",
                            mxData(
                              myLongitudinalData,
                              type="raw"
                            ),
                            manifestVars=c("x1","x2","x3","x4","x5"),
                            latentVars=c("intercept","slope"),
                            # residual variances
                            mxPath(
                              from=c("x1","x2","x3","x4","x5"),
                              arrows=2,
                              free=TRUE,
                              values = c(1, 1, 1, 1, 1),
                              labels=c("residual","residual","residual","residual","residual")
                            ),
                            # latent variances and covariance
                            mxPath(
                              from=c("intercept","slope"),
                              arrows=2,
                              connect="unique.pairs",
                              free=TRUE,
                              values=c(1, 1, 1),
                              labels=c("vari", "cov", "vars")
                            ),
                            # intercept loadings
                            mxPath(
                              from="intercept",
                              to=c("x1","x2","x3","x4","x5"),
                              arrows=1,
                              free=FALSE,
                              values=c(1, 1, 1, 1, 1)
                            ),
                            # slope loadings
                            mxPath(
                              from="slope",
                              to=c("x1","x2","x3","x4","x5"),
                              arrows=1,
                              free=FALSE,
                              values=c(0, 1, 2, 3, 4)
                            ),
                            # manifest means
                            mxPath(
                              from="one",
                              to=c("x1", "x2", "x3", "x4", "x5"),
                              arrows=1,
                              free=FALSE,
                              values=c(0, 0, 0, 0, 0)
                            ),
                            # latent means
                            mxPath(
                              from="one",
                              to=c("intercept", "slope"),
                              arrows=1,
                              free=TRUE,
                              values=c(1, 1),
                              labels=c("meani", "means")
                            )
) # close model

growthCurveFit <- mxRun(growthCurveModel)

summary(growthCurveFit)

Моя попытка добавить предиктор - я добавляю переменную пола в переменные манифеста, а затем создаю определение пути от нее к скрытым переменным (внизу):

growthCurveModel2 <- mxModel("Linear Growth Curve Model Path Specification",
                            type="RAM",
                            mxData(
                              myLongitudinalData,
                              type="raw"
                            ),
                            manifestVars=c("x1","x2","x3","x4","x5","male"),
                            latentVars=c("intercept","slope"),
                            # residual variances
                            mxPath(
                              from=c("x1","x2","x3","x4","x5"),
                              arrows=2,
                              free=TRUE,
                              values = c(1, 1, 1, 1, 1),
                              labels=c("residual","residual","residual","residual","residual")
                            ),
                            # latent variances and covariance
                            mxPath(
                              from=c("intercept","slope"),
                              arrows=2,
                              connect="unique.pairs",
                              free=TRUE,
                              values=c(1, 1, 1),
                              labels=c("vari", "cov", "vars")
                            ),
                            # intercept loadings
                            mxPath(
                              from="intercept",
                              to=c("x1","x2","x3","x4","x5"),
                              arrows=1,
                              free=FALSE,
                              values=c(1, 1, 1, 1, 1)
                            ),
                            # slope loadings
                            mxPath(
                              from="slope",
                              to=c("x1","x2","x3","x4","x5"),
                              arrows=1,
                              free=FALSE,
                              values=c(0, 1, 2, 3, 4)
                            ),
                            # manifest means
                            mxPath(
                              from="one",
                              to=c("x1", "x2", "x3", "x4", "x5"),
                              arrows=1,
                              free=FALSE,
                              values=c(0, 0, 0, 0, 0)
                            ),
                            # latent means
                            mxPath(
                              from="one",
                              to=c("intercept", "slope"),
                              arrows=1,
                              free=TRUE,
                              values=c(1, 1),
                              labels=c("meani", "means")
                            ),
                            mxPath(
                              from="male",
                              to=c("intercept", "slope"),
                              arrows=1,
                              free=TRUE,
                              values=c(1,1),
                              labels=c("iOnMale", "sOnMale"))
) # close model

growthCurveFit2 <- mxRun(growthCurveModel2)

summary(growthCurveFit2)

1 ответ

Я полагаю, что я понял это - необходимо указать дисперсию предиктора и пути средней структуры, в соответствии с этой диаграммой из книги Sline Kline (2011):Модель LGC с двумя предикторами

В MPlus я думаю, что по умолчанию для регрессии скрытого наклона и перехвата на предикторе является установка среднего пути к структуре на 0 и пути отклонения на 1. Я не уверен на 100% в этом, но это дало мне идентичный параметризация и очень похожие оценки. Итак, я добавил этот фрагмент ко второй модели выше:

                         #Predictor mean structure
                         mxPath(
                           from="one",
                           to="male",
                           arrows=1,
                           free=FALSE,
                           values = 0
                         ),
                         #Predictor Variance
                         mxPath(
                           from="male",
                           arrows=2,
                           free=FALSE,
                           values = 1
                         )

Клайн, РБ (2011). Принципы и практика моделирования структурных уравнений. Гилфорд пресс.

Другие вопросы по тегам