结构方程模型拟合时出现奇异矩阵错误求助
问题描述
此前在R语言中使用lavaan包,通过极大似然法处理缺失值分析结构方程模型时运行完全正常。更换电脑重装R后,执行含missing = "ML"的模型拟合后,调用summary()触发如下奇异矩阵错误:
Error in solve.default(X[[i]], ...) : Lapack routine dgesv: system is exactly singular: U[13,13] = 0
移除missing = "ML"参数采用列表删除法时,模型可正常运行,但会剔除不愿排除的样本,需解决该问题。
报错的方法1(含缺失值极大似然估计)
模型定义:
sem.model <- '# Measurement Model: Variable1 =~ Item1 + Item2 + Item3 Variable2 =~ Item4 + Item5 + Item6 Variable3 =~ Item7 + Item8 + Item9 + Item10 Variable4 =~ Item11 Variable5 =~ Item12 # Structural Model outcomevariable ~ Variable1 + Variable2 + Variable3 + Variable4 + Variable5 + Item13 + Item14 + Item15 + Item16 + Item17 + Item18'
拟合模型无报错:
sem.model.fit <- sem(model = sem.model, data = dataSRL, estimator = "MLR", missing = "ML")
调用summary()触发错误:
summary(sem.model.fit, fit.measures = TRUE, standardized = FALSE, rsquare = TRUE, modindices = TRUE)
正常运行的方法2(列表删除法)
模型定义同上,拟合时移除缺失值处理参数:
sem.model.fit <- sem(model = sem.model, data = dataSRL, estimator = "MLR")
调用summary()可正常运行:
summary(sem.model.fit, fit.measures = TRUE, standardized = FALSE, rsquare = TRUE, modindices = TRUE)
原因分析与解决办法
为何方法2可正常运行?
列表删除法会直接移除所有含缺失值的样本,仅保留完全无缺失的数据集。此时计算的协方差/相关矩阵是满秩的,不存在线性依赖问题,因此模型拟合和后续的summary()都能正常执行。而missing = "ML"采用全信息极大似然(FIML)保留所有样本,基于多组缺失模式计算的信息矩阵可能出现线性相关,导致奇异矩阵无法求逆。
解决办法
1. 修复单指标潜变量的识别问题
模型中Variable4 =~ Item11是单指标潜变量,FIML下这种设定极易引发识别问题:
- 显式固定因子载荷为1,并将误差方差设为0(单指标无需误差项),修改模型代码:
sem.model <- '# Measurement Model: Variable1 =~ Item1 + Item2 + Item3 Variable2 =~ Item4 + Item5 + Item6 Variable3 =~ Item7 + Item8 + Item9 + Item10 Variable4 =~ 1*Item11 # 固定载荷为1 Item11 ~~ 0*Item11 # 固定误差方差为0 Variable5 =~ Item12 # Structural Model outcomevariable ~ Variable1 + Variable2 + Variable3 + Variable4 + Variable5 + Item13 + Item14 + Item15 + Item16 + Item17 + Item18' - 或直接用
Item11替代Variable4放入结构方程,删除该单指标潜变量。
2. 检查变量间的线性依赖
FIML模式下,部分变量可能在缺失数据的子集中出现完全线性相关:
- 运行
cov(dataSRL, use = "pairwise.complete.obs")查看成对完整样本的协方差矩阵,排查是否存在完全相关的变量。 - 检查
Item13至Item18等直接纳入结构方程的观测变量,是否与某个潜变量的指标存在完全线性关系。
3. 核对lavaan版本差异
重装R后可能安装了不同版本的lavaan,新版本的FIML算法对模型识别的校验更严格:
- 运行
packageVersion("lavaan")查看当前版本,对比此前正常运行的版本。若为版本问题,可降级至旧版本:install.packages("devtools") devtools::install_version("lavaan", version = "你的旧版本号")
4. 强化模型识别约束
显式固定所有潜变量的第一个因子载荷为1,避免默认识别规则在FIML下出现冲突:
sem.model <- '# Measurement Model: Variable1 =~ 1*Item1 + Item2 + Item3 Variable2 =~ 1*Item4 + Item5 + Item6 Variable3 =~ 1*Item7 + Item8 + Item9 + Item10 Variable4 =~ 1*Item11 Item11 ~~ 0*Item11 Variable5 =~ 1*Item12 # Structural Model outcomevariable ~ Variable1 + Variable2 + Variable3 + Variable4 + Variable5 + Item13 + Item14 + Item15 + Item16 + Item17 + Item18'
内容的提问来源于stack exchange,提问作者Antonia
相关产品推荐
相关产品推荐

