Почему я получаю отрицательные отклонения в OpenMx?
Я знаком с R, но новичок в моделировании структурных уравнений (SEM) и пакете . Я пытаюсь смоделировать некоторые данные, а затем построить модель SEM (которая, как я знаю, неоптимальна) в формате . Если вам интересно, вот коды, хотя я не думаю, что это необходимо, так как мой вопрос о выводе довольно технический. Итак, если вы хотите, просто перейдите к выводу, который я представляю ниже. Сначала я имитирую данные, используя
simsem
упаковка
loading<-matrix(0,8,3)
loading[1:3,1]<-c('ca1','ca2','ca3')
loading[4:6,2]<-c('ca4','ca5','ca6')
loading[7:8,3]<-c('ca7','ca8')
lodValues<-matrix(0,8,3)
lodValues[1:3,1]<-0.6
lodValues[4:6,2]<-0.7
lodValues[7:8,3]<-0.85
matLoadings<-bind(loading,lodValues)
error.cor<-matrix(0,8,8)
diag(error.cor)<-1
residuo<-binds(error.cor)
latent.cor.fix<-matrix(NA,3,3)
diag(latent.cor.fix)<-1
latent.cor.free<-c("","-0.45","0","-0.45","","0","0","0","")
cor.latente<-binds(latent.cor.fix,latent.cor.free)
modelo<-model(LY=matLoadings,RPS=cor.latente,RTE=residuo,modelType="CFA")
summary(modelo)
dados<-generate(modelo,250)
library(plyr)
dados<-rename(dados,c('y1'='copulas','y2'='tempoPar','y3'='filhotes','y4'='tempoCui',
'y5'='alimentação','y6'='alarme','y7'='dist','y8'='latencia'))
sexo<-c(rep(1,125),rep(2,125))
dados<-data.frame(dados,sexo)
attach(dados)
В основном это моделирует данные с 9 измеряемыми переменными (8 непрерывными и 1 категориальной с 2 уровнями (пол)). Первые 3, нагрузка на фактор один. Переменные с 4 по 6 нагружают фактор 2, а переменные 7 и 8 нагружают фактор 3. Факторы 1 и 2 имеют отрицательную корреляцию, фактор 3 не связан ни с одним другим. Бинарные данные (пол) ни с чем не коррелируют. Все идет нормально. Но здесь начинается сложная часть. я буду использовать
OpenMx
запустить модель SEM, в которой факторы 1 и 2 коррелируют, фактор 3 также коррелирует с 1 и 2, а пол также коррелирует с факторами 1 и 2 [я знаю, что модель неверна, но это именно то, что я хочу]. Вот код:
manifest=c('copulas','tempoPar','filhotes','tempoCui','alimentação',
'alarme','dist','latencia','sexo')
manifestcont=c('copulas','tempoPar','filhotes','tempoCui','alimentação',
'alarme','dist','latencia')
manifestCopula=c('copulas','tempoPar','filhotes')
manifestCuidado=c('tempoCui','alimentação','alarme')
manifestBold=c('dist','latencia')
latent=c("PropCopula","Cuidado","Boldness")
dados$sexo<-mxFactor(dados$sexo,levels=c(1,2))
modelo<-mxModel(manifestVars=manifest,latentVars=latent,type='RAM',
mxData(dados,type='raw'),
mxPath(from=manifestcont,arrows=2,values=c(1,1,1,1,1,1,1,1)),
mxPath(from="PropCopula",to=manifestCopula,values=c(0.5,0.5,0.5)),
mxPath(from="Cuidado",to=manifestCuidado,values=c(0.5,0.5,0.5)),
mxPath(from="Boldness",to=manifestBold,values=c(0.5,0.5)),
mxPath(from="PropCopula",to="Cuidado",arrows=2,values=0.5),
mxPath(from="Boldness",to=c("PropCopula","Cuidado"),values=c(0.5,0.5)),
mxPath(from="sexo",to=c("PropCopula","Cuidado"),values=c(0.5,0.5)),
mxPath(from="sexo",arrows=2,free=F,values=1),
mxPath(from="one",to="sexo",arrows=1,free=F,values=0),
mxPath(from=latent,arrows=2,free=F,values=c(1,1,1)),
mxThreshold(vars="sexo",nThresh=1,free=T,values=0),
mxCI(c("A[10,9]","A[11,9]","S[10,11]","A[10,12]","A[11,12]")))
mxOption(NULL,"Default optimizer", "NPSOL")
ativar<-mxRun(modelo,intervals=T)
summary(ativar,refModels=mxRefModels(ativar,run=T))
Я считаю, что мой код полностью правильный, но когда я анализирую вывод, мои оценки отклонений измеренных переменных отличаются от исходных отклонений переменных. Это может быть просто модель неправильно оценивает параметры, но иногда возникают даже отрицательные отклонения. Вот начало вывода.
free parameters:
name matrix row col Estimate
1 untitled10.A[10,9] A PropCopula sexo 0.1626987569
2 untitled10.A[11,9] A Cuidado sexo -0.0700114910
3 untitled10.A[1,10] A copulas PropCopula 0.5439766716
4 untitled10.A[2,10] A tempoPar PropCopula 0.6468552595
5 untitled10.A[3,10] A filhotes PropCopula 0.5442606676
6 untitled10.A[4,11] A tempoCui Cuidado 0.7325549432
7 untitled10.A[5,11] A alimentação Cuidado 0.6759625135
8 untitled10.A[6,11] A alarme Cuidado 0.6887856140
9 untitled10.A[7,12] A dist Boldness 0.3121049580
10 untitled10.A[8,12] A latencia Boldness 2.1025288414
11 untitled10.A[10,12] A PropCopula Boldness 0.0762317301
12 untitled10.A[11,12] A Cuidado Boldness 0.0198797935
13 untitled10.S[1,1] S copulas copulas 0.7634290659
14 untitled10.S[2,2] S tempoPar tempoPar 0.5785406293
15 untitled10.S[3,3] S filhotes filhotes 0.6433677420
16 untitled10.S[4,4] S tempoCui tempoCui 0.4869136162
17 untitled10.S[5,5] S alimentação alimentação 0.5822295519
18 untitled10.S[6,6] S alarme alarme 0.4728346723
19 untitled10.S[7,7] S dist dist 0.8710079267
20 untitled10.S[8,8] S latencia latencia -3.4849845371
21 untitled10.S[10,11] S PropCopula Cuidado -0.4196223050
Как видно, дисперсия латенсии (20-й параметр) отрицательна. Это происходит со многими различными переменными в разных симуляциях, которые я запускал. Может кто-нибудь, пожалуйста, дайте мне подсказку, почему это происходит?