You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

在R中用lavaan做路径分析遇方差差异过大及报错求助

问题描述

我正在处理一份SPSS数据文件,其中离散缺失值被设为-999。我觉得这是我用R做路径分析时出现错误的原因,该怎么解决?要在SPSS里处理还是可以在R里完成?缩放处理会影响结果吗?我统计学基础弱,请像给大一心理学本科生解释一样讲解决方案。

错误信息

Error in Sigma.inv * sample.cov : non-conformable arrays
In addition: Warning messages:
1: In lav_data_full(data = data, group = group, cluster = cluster, :
lavaan WARNING: some observed variances are (at least) a factor 1000 times larger than others; use varTable(fit) to investigate
2: In lavaan(model, data = Conspiracies) : lavaan WARNING:
Model estimation FAILED! Returning starting values.

我的代码

library(haven)
Conspiracies <- read_sav('Baseless_Beliefs.sav')
library(lavaan)

# Specify the model
model <- '
  # Exogenous variables
  Individualizing ~~ Binding
  
  # Mediators
  mean_vhnb ~ Individualizing + Binding
  mean_se ~ Individualizing + Binding
  mean_spd1 ~ Individualizing + Binding
  
  # Outcome variables
  ConsControversies ~ mean_vhnb + mean_se + mean_spd1
  Pseudoscience ~ mean_vhnb + mean_se + mean_spd1
  ClassicCoverup ~ mean_vhnb + mean_se + mean_spd1
  Magicalthinking ~ mean_vhnb + mean_se + mean_spd1
  
 #estimating the covariance of residuals for outcome
 ConsControversies ~~ Pseudoscience + ClassicCoverup + Magicalthinking
 Pseudoscience ~~ ClassicCoverup + Magicalthinking
 ClassicCoverup ~~ Magicalthinking
'

fit<-lavaan(model,data=Conspiracies)

summary(fit,fit.measures=TRUE)
summary(fit,fit.measures=TRUE,standardized=TRUE,rsquare=TRUE)
parameterEstimates(fit)
fitMeasures(fit)
modificationIndices(fit)
解决方案

一、先把-999换成R能识别的缺失值

SPSS和R都能处理,推荐直接在R里搞定,不用来回导文件:

  • 执行下面的代码,把数据里所有等于-999的数值换成NA(R默认的缺失值标记):
# 将所有-999替换为R识别的缺失值NA
Conspiracies[Conspiracies == -999] <- NA
  • 为啥要换?因为lavaan包会把-999当成正常数据计算,比如你原本的变量是1-5的计分,突然混进一堆-999,会导致这个变量的方差变得特别大(比其他变量大1000倍那种),方差差距太大就会让模型算崩溃,这就是你看到警告和报错的核心原因。

二、检查变量方差(可选但建议做)

处理完缺失值后,运行下面的代码查看每个变量的方差,确认没有异常大的数值:

# 先重新拟合模型,再查看变量统计信息
fit <- lavaan(model, data = Conspiracies)
varTable(fit)
# 或者直接看数据的描述统计
summary(Conspiracies)

如果还有方差特别大的变量,可能是变量计分范围差太多(比如一个是0-100,另一个是1-5),这时候可以考虑标准化。

三、关于缩放(标准化)的疑问

  • 标准化不会改变变量之间的关系方向和显著性(比如谁影响谁、这个影响是不是真的存在),只会把系数转换成标准化值,方便你比较不同变量的影响大小。
  • 如果变量计分范围差异大,标准化后模型更容易跑通,结果也更直观。
  • 标准化的两种方式:
    1. 拟合模型时直接设置参数(推荐,不用改原始数据):
    fit <- lavaan(model, data = Conspiracies, std.lv = TRUE)
    
    1. 提前标准化整个数据集:
    # 只标准化数值型变量
    num_vars <- sapply(Conspiracies, is.numeric)
    Conspiracies[num_vars] <- scale(Conspiracies[num_vars])
    

四、重新运行模型

处理完缺失值和标准化(如果需要)后,再执行你原来的拟合代码,模型应该就能正常运行并输出结果了。

内容的提问来源于stack exchange,提问作者T_sardines

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.27 19:09:52