Lavaan模型估计失败求助:sem()运行报错原因排查
关于lavaan包sem()函数模型估计失败的问题排查
问题描述
使用lavaan包的sem()函数时,最初仅用少量潜变量和单一回归模型可正常运行,后续新增变量后模型运行失败;即使移除新增变量,仍出现如下报错:
Warning message: lavaan->lav_lavaan_step11_estoptim(): Model estimation FAILED! Returning starting values
数据样例
dput(head(data2)) structure(list(everlied = c(0, 0, 0, 0, 0, 0), Buswebsite = c(3, 1, 4, 1, 3, 3), BusFacebookpage = c(3, 2, 4, 2, 3, 3), periodicals = c(3, 2, 4, 3, 3, 3), internetsearch = c(3, 4, 4, 2, 4, 4), googlebuslisting = c(3, 5, 5, 3, 3, 3), internetdiscussforum = c(3, 3, 4, 4, 3, 4), consumerratingssite = c(3,4, 5, 2, 4, 4), friends = c(5, 4, 5, 3, 4, 5), family = c(5, 5, 5, NA, 4, 5), doctors = c(4, 4, 5, 3, 4, 4), politicians = c(3,1, 1, 3, 1, 1), salespeople = c(3, 2, 1, 3, 2, 1), like = c(3, 2, 2, 3, 2, 1), newimmigrants = c(3, 3, 2, 2, 3, 1), businessowners = c(3, 2, 2, 3, 3, 1), celebrities = c(3, 3, 1, 2, 3, 1), commercialactors = c(3, 2, 1, 2, 3, 1), religious = c(4, 4, 4, 2, 4, 1), socmediainfluencers = c(3, 3, 1, 4, 3, 1), teachers = c(4, 4, 4, 3, 4, 1), gender = c(0, 0, 0, 1, 0, 0), age = c(5, 5, 3, 3, 3, 2), education = c(4, 2, 3, 4, 5, 3), income = c(3, 2, 2, 2, 3, 4), region = c(3, 3, 7, 7, 3, 7)), row.names = c(NA, -6L), class = c("tbl_df", "tbl", "data.frame"))
模型设置与代码
观测因变量like为有序分类(Likert量表),人口统计学变量为分类变量,其余变量也为有序分类。模型代码如下:
model <- ' person =~ family + friends demographic =~ age + gender + income + education + region instit =~ doctors+politicians+religious+businessowners soc =~ salespeople + celebrities + commercialactors + socmediainfluencers + newimmigrants info =~ Buswebsite + BusFacebookpage + periodicals + internetsearch + googlebuslisting + internetdiscussforum + consumerratingssite like ~ person + demographic + instit + soc + info ' model_out <- sem(model, data=dat2)
可能的原因及解决办法
潜变量测量模型合理性问题
demographic潜变量存在逻辑错误:age、gender、income等人口统计学变量是直接观测的显变量,并非潜变量的指标,强行打包会导致测量模型无法识别或拟合极差。这是核心问题之一,即使移除后续新增变量,这个结构错误依然会导致模型失败。建议直接将这些变量作为显变量放入回归方程,而非构建潜变量。- 检查其他潜变量的指标相关性:比如
instit、soc的指标是否属于同一构念,可先计算指标间的相关矩阵,若相关性极低,说明潜变量结构不成立,需调整指标或删除该潜变量。
变量类型与估计方法不匹配
- 所有有序分类变量未指定正确的处理方式:默认
sem()使用连续变量的ML估计,不适合Likert量表数据。需指定estimator = "WLSMV"(适合有序分类数据的加权最小二乘法),同时设置ordered = c("Buswebsite", "BusFacebookpage", ..., "like")(列出所有有序变量),或直接用ordered = TRUE标记所有变量为有序(如果全部都是的话)。
- 所有有序分类变量未指定正确的处理方式:默认
模型识别与收敛问题
- 尝试调整优化器参数:默认优化器可能无法处理复杂模型,可设置
optim.method = "BFGS"或iter.max = 1000增加迭代次数,给优化过程更多收敛空间。 - 确认潜变量识别:lavaan默认固定第一个指标载荷为1来识别潜变量,若存在异常,可手动固定载荷或潜变量方差(比如
person =~ 1*family + friends)。
- 尝试调整优化器参数:默认优化器可能无法处理复杂模型,可设置
数据问题
- 处理缺失值:样本中存在NA,可先用
na.omit(dat2)删除缺失值测试,或针对有序变量使用missing = "pairwise"结合WLSMV估计。 - 检查类别频数:比如
region的类别7,若整体样本中该类别频数极低,会导致协方差矩阵奇异,需合并类别或剔除对应样本。
- 处理缺失值:样本中存在NA,可先用
内容的提问来源于stack exchange,提问作者Shawn B
相关产品推荐
相关产品推荐

