问题描述
我熟悉 R,但对结构方程建模 (SEM) 和 OpenMx
包相当陌生。
我正在尝试模拟一些数据,然后在 OpenMx
中构建一个 SEM 模型(我知道这是次优的)。如果您感兴趣,这里是代码,尽管我认为没有必要,因为我的问题是关于 OpenMx
输出的技术性问题。所以,如果你愿意,只需跳到我在下面展示的输出。
首先,我使用 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,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)
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","","")
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 个,加载因子 1。变量 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','latencia')
manifestCopula=c('copulas','filhotes')
manifestCuidado=c('tempoCui','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)),mxPath(from="PropCopula",to=manifestCopula,values=c(0.5,0.5,0.5)),mxPath(from="Cuidado",to=manifestCuidado,mxPath(from="Boldness",to=manifestBold,to="Cuidado",values=0.5),to=c("PropCopula","Cuidado"),mxPath(from="sexo",free=F,values=1),mxPath(from="one",to="sexo",arrows=1,values=0),mxPath(from=latent,mxThreshold(vars="sexo",nThresh=1,free=T,mxCI(c("A[10,9]","A[11,"S[10,11]","A[10,12]",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
如您所见,“latencia”(第 20 个参数)的方差为负。在我运行的不同模拟中,许多不同的变量都会发生这种情况。 有人可以告诉我为什么会发生这种情况吗?
解决方法
暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!
如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。
小编邮箱:dio#foxmail.com (将#修改为@)