问题描述
我目前正在 Lavaan 中运行 SEM 分析,但遇到了一些问题。在运行完整的 sem 之前,我打算运行一个 CFA 来复制我正在使用的这个措施完成的心理测试。该测量有 24 个项目,它们构成 5 个子量表(潜在变量),这些子量表又加载到总的“高阶”因子上。我尝试以两种不同的方式估计这个模型:(1)一个五因子模型(没有高阶因子),其中所有 5 个子量表都允许相关;(2)一个具有 TOTAL 潜在变量的高阶模型最多 5 个量表。
第一个模型有五个相关的潜在因素(FNR、FOB...FAA),方差固定为 1。该模型无误差地收敛并拟合数据。只要我不指定构成 FTOTAL 潜在变量的子量表(FNR、FOB ..)是相关的,第二个模型也有效。但是,如果我指定这些子量表是相关的(#Residual correlations 部分),模型仍然运行但给我错误“lavaan 警告:无法计算标准错误!信息矩阵无法反转。这可能是一个症状型号未确定。”如果我从模型 2 中删除残差相关性,则模型运行时不会出错。两者的 R 代码如下:
Model1 <- "
#Measurements model
FNR =~ FNR1 + FNR2 + FNR3 +FNR4 +FNR5
FOB =~ FOB1 + FOB2 +FOB3 +FOB4
FDS =~ FDS1 +FDS2 +FDS3 + FDS4 + FDS5
FNJ =~ FNJ1 + FNJ2 + FNJ3 +FNJ4 + FNJ5
FAA =~ FAA1 + FAA2 +FAA3 + FAA4 +FAA5
#Residual correlations
FAA ~~ FNJ + FOB + FDS + FNR
FNR ~~ FNJ + FOB+ FDS
FNJ ~~ FOB + FDS
FOB ~~ FDS
"
fit5factor <- sem(Model1,data=SEMDATA,std.lv=TRUE)
Model2 <- "
#Measurements model
FNR =~ FNR1 + FNR2 + FNR3 +FNR4 +FNR5
FOB =~ FOB1 + FOB2 +FOB3 +FOB4
FDS =~ FDS1 +FDS2 +FDS3 + FDS4 + FDS5
FNJ =~ FNJ1 + FNJ2 + FNJ3 +FNJ4 + FNJ5
FAA =~ FAA1 + FAA2 +FAA3 + FAA4 +FAA5
FTOTAL =~ FNR + FOB + FDS + FNJ+ FAA
#Residual correlations
FAA ~~ FNJ + FOB + FDS + FNR
FNR ~~ FNJ + FOB+ FDS
FNJ ~~ FOB + FDS
FOB ~~ FDS
"
fitTotal <- sem(Model2,std.lv=TRUE)
这是我第一次使用 SEM,我不确定我做错了什么。指定这些构成 FTOTAL 潜在变量的子量表允许相关是否不合适?我从文献中了解到,这是应该如何指定第二个模型(五个因素相关),因为在第一个模型中五个方面是相关的。然而,也许事实并非如此,我应该在没有相关性的情况下运行模型 2,但我想了解这样做的理由,以及为什么这不合适。
在此先感谢大家的帮助。
解决方法
您不需要指定一阶因子之间的相关性。 lavaan
的默认选项会将它们关联起来。如果不想关联它们,您可以使用 orthogonal=T
函数内的 cfa()
。
Model1 <- "
#Measurements model
FNR =~ FNR1 + FNR2 + FNR3 +FNR4 +FNR5
FOB =~ FOB1 + FOB2 +FOB3 +FOB4
FDS =~ FDS1 +FDS2 +FDS3 + FDS4 + FDS5
FNJ =~ FNJ1 + FNJ2 + FNJ3 +FNJ4 + FNJ5
FAA =~ FAA1 + FAA2 +FAA3 + FAA4 +FAA5
"
fit5factor <- sem(Model1,data=SEMDATA,std.lv=TRUE)
关于层次结构,一阶因素之间没有相关性,因为它们上有相同的潜在(即二阶)负载:
Model2 <- "
#Measurements model
FNR =~ FNR1 + FNR2 + FNR3 +FNR4 +FNR5
FOB =~ FOB1 + FOB2 +FOB3 +FOB4
FDS =~ FDS1 +FDS2 +FDS3 + FDS4 + FDS5
FNJ =~ FNJ1 + FNJ2 + FNJ3 +FNJ4 + FNJ5
FAA =~ FAA1 + FAA2 +FAA3 + FAA4 +FAA5
FTOTAL =~ FNR + FOB + FDS + FNJ+ FAA
"
fitTotal <- sem(Model2,std.lv=TRUE)
如果它解决了您的问题,请将其标记为已解决。