如何在lavaan中获取聚类数据的标准化残差?
问题:聚类SEM模型无法生成标准化残差
使用lavaan拟合带cluster参数的聚类数据SEM模型时,调用lavResiduals()或指定标准化类型的residuals()会触发错误:
Fehler in Q %*% ACOV.obs[[g]] : verlangt numerische/komplexe Matrix/Vektor-Argumente
(中文翻译:错误:需要数值/复数矩阵/向量参数)
用lavaan内置Demo.twolevel数据可复现该问题:无cluster参数的模型能正常输出标准化残差,但加入cluster参数校正标准误后,仅能获取未标准化残差,无法生成标准化残差或残差的校正标准误。
测试代码
无cluster参数的正常模型
library(lavaan) model <- ' fw =~ y1 + 1*y2 + y3 fw ~ x1 + x2 + x3 ' fit3 <- sem(model, data = Demo.twolevel) summary(fit3, standardized=TRUE, fit.measures = TRUE) # 正常输出标准化残差及z值、标准误 lavResiduals(fit3, zstat = TRUE, se = TRUE)
带cluster参数的出错模型
library(lavaan) model <- ' fw =~ y1 + 1*y2 + y3 fw ~ x1 + x2 + x3 ' fit3c <- sem(model, data = Demo.twolevel, cluster = "cluster") summary(fit3c, standardized=TRUE, fit.measures = TRUE) # 触发错误 lavResiduals(fit3c, zstat = TRUE, se = TRUE) # 仅能返回未标准化残差 residuals(fit3c, type= "cor.bentler")
环境:R 4.2.0,lavaan 0.6-17
需求:获取该聚类模型的标准化残差,或至少拿到残差的校正标准误以手动计算(公式:标准化残差 = 未标准化残差 / 校正标准误)
解决方法
目前lavaan的lavResiduals()对带cluster的多层SEM支持有限,无法直接生成标准化残差,可按以下步骤手动计算:
1. 提取未标准化残差
先获取协方差残差矩阵:
# 提取未标准化协方差残差 unstd_cov_resid <- residuals(fit3c, type = "cov")$cov
2. 获取残差的校正标准误
通过lavInspect()提取聚类校正后的观测变量渐近协方差矩阵,再从中计算残差的标准误:
# 提取观测变量的渐近协方差矩阵(已聚类校正) acov_obs <- lavInspect(fit3c, "acov.obs") # 残差的标准误是渐近协方差矩阵对角线元素的平方根 resid_se <- sqrt(diag(acov_obs)) # 将标准误转为与残差矩阵维度匹配的矩阵 resid_se_mat <- matrix(resid_se, nrow = nrow(unstd_cov_resid), ncol = ncol(unstd_cov_resid), byrow = FALSE)
3. 计算标准化残差
用未标准化残差除以对应的校正标准误:
# 得到标准化协方差残差 std_cov_resid <- unstd_cov_resid / resid_se_mat
补充:获取相关尺度的标准化残差
如果需要基于相关矩阵的标准化残差,可以先提取未标准化相关残差,再重复上述标准误计算逻辑,或从协方差标准化结果推导:
# 提取未标准化相关残差 unstd_cor_resid <- residuals(fit3c, type = "cor.bentler")$cor # 相关残差的标准误计算需基于相关矩阵的渐近协方差,转换逻辑略复杂 # 也可从协方差标准化残差推导:将协方差残差除以变量标准差的乘积后再标准化
注:该问题属于lavaan旧版本的功能限制,后续版本可能会优化对聚类模型残差标准化的支持。
内容的提问来源于stack exchange,提问作者Marcus P
相关产品推荐
相关产品推荐

