在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),这时候可以考虑标准化。
三、关于缩放(标准化)的疑问
- 标准化不会改变变量之间的关系方向和显著性(比如谁影响谁、这个影响是不是真的存在),只会把系数转换成标准化值,方便你比较不同变量的影响大小。
- 如果变量计分范围差异大,标准化后模型更容易跑通,结果也更直观。
- 标准化的两种方式:
- 拟合模型时直接设置参数(推荐,不用改原始数据):
fit <- lavaan(model, data = Conspiracies, std.lv = TRUE)- 提前标准化整个数据集:
# 只标准化数值型变量 num_vars <- sapply(Conspiracies, is.numeric) Conspiracies[num_vars] <- scale(Conspiracies[num_vars])
四、重新运行模型
处理完缺失值和标准化(如果需要)后,再执行你原来的拟合代码,模型应该就能正常运行并输出结果了。
内容的提问来源于stack exchange,提问作者T_sardines

