有一类变量,你永远没法直接观测到它,但你能通过问卷里那一堆题目的得分,间接推断它的存在。这就是隐变量(latent variable)。比如你想测“工作满意度”,问卷里设计了五六道题分别问待遇、氛围、晋升、领导关系,可你真正关心的其实不是每一道题的分数,而是那个隐藏在背后、把这五六道题串起来的抽象概念。R 语言里处理这类问题,最顺手也最主流的工具就是 lavaan 包。这篇文章我会按实际项目里最常见的流程来讲:先解释隐变量分析到底解决什么问题,再给出可直接运行的 lavaan 建模代码,然后讲怎么判断模型好坏、怎么应付建模过程中那些让人头疼的报错,最后聊一点进阶玩法——结构方程模型、二阶因子、多组比较前的测量不变性检验。内容偏实操,适合正在写论文、做问卷研究、或者刚接触结构方程模型但被教程绕晕的同学。
1. 隐变量问题要从“为什么不能直接算总分”讲起
1.1 问卷测的到底是哪一个“看不见的变量”
先想一个问题:一份量表有 8 道题,你拿到的原始数据是每个被试在这 8 道题上的打分。很多人的第一反应是“把这 8 道题加总,或者算个平均分,当作这个维度的得分”。这个做法直观,但在方法学上站不住脚。因为你在做加法的那一刻,就默认了一个非常强的假设:这 8 道题对这个潜变量的贡献是相等的,每道题都是 1 个单位的权重。可现实里几乎不可能是这样——有些题目区分度就是高,有些题目就是含糊,有些题目可能还掺着其他东西。
隐变量分析换了一个思路:我承认这 8 道题背后有一个共同的东西,但每道题和那个东西的关系强度是不同的,需要通过数据估计出来。这个“关系强度”在因子分析里叫因子载荷(factor loading),在项目反应理论里叫区分度参数。你可以这么理解:体温计不能直接测“发烧”,它只能测温度,再用温度去推断发烧与否。问卷题目也是一样,它们只是隐变量的“外在读数”。
这个转变很重要,因为它直接改变了你的分析目的。从“算个总分交差”变成“检验这些题目是否真的在测同一个构念、每道题贡献有多大、这个构念在不同群体之间是否可比较”。后面这些才是隐变量分析真正能回答的问题。
1.2 测量模型才是隐变量分析的地基
用 R 做隐变量分析,绝大多数情况下跑的是验证性因子分析(CFA)和结构方程模型(SEM)。CFA 属于测量模型的部分,它解决的是“题目和潜变量之间的关系是否如理论预期”。SEM 则在测量模型之上再加一层结构模型,解决的是“潜变量和潜变量之间有没有因果关系或相关关系”。
这两层必须分清楚。我见过不少项目,一上来就直接写结构模型,把问卷题目当成普通显变量去做回归,结果拟合指标一塌糊涂,还以为是自己假设错了。实际上更可能是测量模型本身就没建好,题目和构念的关系根本没被验证过,后面的一切都是空中楼阁。
所以我的建议是:拿到数据后第一步永远先跑 CFA,把每个潜变量的测量模型单独验证一遍,确认载荷、信度、拟合度都过关了,再谈结构模型。这个过程就像盖房子先打地基,看起来慢,实际上是最省事的路径。
1.3 什么时候该用隐变量分析,什么时候是过度设计
不是所有带“变量”字眼的问题都需要隐变量分析。如果你的核心变量是可直接观测的客观指标,比如年龄、收入、销售额、反应时间,那就直接用显变量建模,没必要绕一圈。隐变量分析真正适用的场景是:核心构念无法直接测量、必须通过多个指标间接获得,并且你有一定的理论预期结构。
另一种常见场景是处理测量误差。显变量回归假设自变量没有测量误差,但问卷数据几乎不可能满足这个假设。隐变量模型的好处在于,它把测量误差从真实分数中分离出来,估计的是潜变量之间的净关系。这也是为什么同样一批数据,用 SEM 跑出来的路径系数往往比普通回归更接近理论预期——因为普通回归把测量误差和真实效应混在一起了。你要记住一个判断标准:如果核心变量在理论上必须通过多题测量,那就别偷懒用总分代替,老老实实做隐变量分析。
2. lavaan 建模前的数据准备与模型语法
2.1 环境准备、数据结构和缺失值处理
R 里做隐变量分析,首选是 lavaan 包,安装和加载都很简单:
install.packages("lavaan") library(lavaan)如果你后面要做测量不变性检验,强烈建议同时装上 semTools,它是一个专门配合 lavaan 做辅助分析的包,很多函数能省掉你手写循环的麻烦。
install.packages("semTools") library(semTools)数据格式上,lavaan 接受 data.frame 或矩阵,变量名最好别带特殊字符,别用中文名做变量名——不是不行,是后面写模型语法的时候容易出编码问题,纯英文变量名最省心。样本量方面,经验法则是每个潜变量至少有 3 个观测指标,样本量不低于 200,或者满足“每个自由参数对应至少 5 个样本”的粗略标准。我用一个 4 因子、每个因子 4 题、共 16 题的模型试过,200 个样本跑 CFA 能出结果,但标准误偏大,模型也容易不稳定,到 300 以上会舒服很多。
缺失值处理这块,lavaan 默认是列表删除(listwise deletion),也就是说只要某个变量有缺失,整行数据都会被丢掉。样本量大的时候问题不大,但样本本身不多的项目千万别用默认。建议在 cfa() 函数里显式指定 missing = "fiml",全称是 Full Information Maximum Likelihood,它会利用所有可用的数据信息来估计参数,比插补法更稳定,也不会引入额外的随机性。
fit <- cfa(model, data = mydata, missing = "fiml")2.2 lavaan 的模型语法怎么读
lavaan 的模型语法用公式描述变量关系,核心就四个符号,掌握它们基本上就能读能写绝大多数模型。
第一个是=~,读作“由……测量”,用来定义潜变量和观测指标的关系。左边是潜变量名,右边是题目变量,比如anxiety =~ q1 + q2 + q3 + q4表示焦虑这个潜变量由 q1 到 q4 四道题测量。这是最基础也最重要的一行,因为它直接定义了你的测量模型。
第二个是~,用来定义回归关系,也就是结构模型的部分。比如depression ~ anxiety表示抑郁对焦虑做回归,估计的是焦虑对抑郁的影响路径。
第三个是~~,用来定义协方差。默认情况下 lavaan 会让所有潜变量之间自由相关,但如果你想让某些误差项相关(这在问卷数据里很常见,比如两道措辞相近的题),就得显式写q1 ~~ q2。
第四个是1*,用来固定参数。在 CFA 里通常会给每个潜变量的第一个指标设定载荷为 1,目的是给潜变量一个度量尺度。lavaan 会自动完成这件事,但你也可以在语法里手动指定,比如anxiety =~ 1*q1 + q2 + q3 + q4。
2.3 一个完整可跑的 CFA 示例
我用一个模拟的“工作压力”和“工作倦怠”双因子数据举个例子,模型和数据生成逻辑如下:两个潜变量各有 4 道题,每题在对应因子上载荷 0.7 左右,两因子相关 0.5。你可以直接复制这段代码跑一遍,跑通之后再换成自己的数据。
set.seed(123) n <- 300 # 生成两个潜变量 stress <- rnorm(n, mean = 0, sd = 1) burnout <- 0.5 * stress + sqrt(1 - 0.5^2) * rnorm(n) # 生成观测指标:真实分数 + 测量误差 q1 <- 0.7 * stress + sqrt(1 - 0.7^2) * rnorm(n) q2 <- 0.75 * stress + sqrt(1 - 0.75^2) * rnorm(n) q3 <- 0.65 * stress + sqrt(1 - 0.65^2) * rnorm(n) q4 <- 0.7 * stress + sqrt(1 - 0.7^2) * rnorm(n) q5 <- 0.7 * burnout + sqrt(1 - 0.7^2) * rnorm(n) q6 <- 0.8 * burnout + sqrt(1 - 0.8^2) * rnorm(n) q7 <- 0.65 * burnout + sqrt(1 - 0.65^2) * rnorm(n) q8 <- 0.75 * burnout + sqrt(1 - 0.75^2) * rnorm(n) mydata <- data.frame(q1, q2, q3, q4, q5, q6, q7, q8) # 定义 CFA 模型 model <- ' stress =~ q1 + q2 + q3 + q4 burnout =~ q5 + q6 + q7 + q8 ' # 拟合 fit <- cfa(model, data = mydata) summary(fit, fit.measures = TRUE, standardized = TRUE)跑完之后,summary 会输出一堆内容。你要重点看三部分:模型是否收敛、每个题目的载荷是否显著且方向正确、整体拟合指标是否达到可接受门槛。只要这三项没问题,这个测量模型就算立住了。
2.4 参数估计方法怎么选
lavaan 默认用最大似然估计(ML),它在数据近似正态时表现很好。但问卷数据很少真的正态——尤其李克特 5 点或 7 点量表,本质上是有序分类变量,只是大家在实证里经常当作连续变量处理。样本量大、题目多的时候,ML 一般也够用,参数估计偏差不大,主要问题出在标准误和卡方统计量上。
这时候有两个替代选择。一个是 MLR,也就是最大似然估计加稳健标准误(robust standard errors),它对非正态和一定程度的缺失都更稳健,而且会输出一个校正后的卡方值。另一个是 WLSMV,专门用于处理有序分类数据,比如二分类或者 4 点、5 点的李克特题,它基于多分格相关矩阵估计,处理分类变量的表现比 ML 好很多。
我的经验是:如果你的题目是 7 点及以上的连续感量表,数据分布不是特别偏,用 MLR 就足够了;如果题目是 3 点、4 点、5 点这种明显分类感强的量表,用 WLSMV 更稳。估计方法在函数里指定即可:
fit_mlr <- cfa(model, data = mydata, estimator = "MLR") fit_wlsmv <- cfa(model, data = mydata, estimator = "WLSMV")3. 模型评估:拟合度指标与信效度的实际判读
3.1 拟合度指标的阈值真的像教科书说的那样死板吗
模型跑出来之后,最关心的就是“这个模型好不好”。lavaan 会在 summary 里给出很多指标,但实际判断主要看这几个:卡方检验、CFI、TLI、RMSEA、SRMR。
卡方检验的逻辑和普通回归不一样:它的原假设是“模型隐含的协方差矩阵和观测到的协方差矩阵没有差异”。所以你反而希望 p 值不显著(p > 0.05),说明模型和数据之间没有显著差异。但卡方对样本量极其敏感,样本一大,模型再好也容易显著,所以现在基本都搭配其他拟合指标一起看。
CFI 和 TLI 是增量拟合指标,衡量你的模型比最烂的基线模型好多少。一般标准是 0.90 以上可以接受,0.95 以上算不错。RMSEA 是近似误差指标,0.08 以下可以接受,0.05 以下算优秀,超过 0.10 基本说明模型结构有问题。SRMR 看的是残差大小,0.08 以下较好。
不过我想说一句实操经验:千万不要因为某个指标差一点点就疯狂修改模型。拟合指标是参考,不是法律。如果 CFI 是 0.886,RMSEA 是 0.075,整体方向对、载荷都显著、理论上也说得通,这个模型是可以用的,只需要在论文或报告里如实报告各指标数值,并说明“接近但未完全达到传统阈值”。通过不断添加误差相关来硬凑拟合指标,制造出漂亮的数字,这种做法在方法学上被称为“事后模型修改”,属于数据驱动而不是理论驱动,风险很高,我不建议这么做。
3.2 载荷、AVE、CR:从模型输出到信效度判断
拟合指标衡量的是整体模型,信效度看的是每个潜变量内部的质量。CFA 出来之后,你要做的第一件事是看标准化载荷(std.all)。一个合格的题目,标准化载荷至少要大于 0.5,理想状态是大于 0.7。载荷太低意味着这道题和它要测的构念关系太弱,这就解释了为什么不能随便用总分加总——一道载荷只有 0.3 的题,你把它和其他 0.7 的题等权相加,实际上是在往总分里掺噪声。
接着算两个常用指标:组合信度(CR,Composite Reliability)和平均方差抽取量(AVE,Average Variance Extracted)。CR 相当于传统 Cronbach's alpha 的现代升级版,衡量潜变量内部一致性,建议大于 0.7。AVE 衡量潜变量能解释题目方差的比例,建议大于 0.5。可以直接用 lavInspect 提取标准化载荷,然后手动计算:
std_loadings <- lavInspect(fit, what = "std")$lambda # stress 因子的载荷向量 loadings_stress <- std_loadings[c("q1", "q2", "q3", "q4"), "stress"] # 组合信度 sum_load <- sum(loadings_stress) CR_stress <- sum_load^2 / (sum_load^2 + sum(1 - loadings_stress^2)) # 平均方差抽取量 AVE_stress <- mean(loadings_stress^2)如果 AVE 达不到 0.5,优先检查是不是有某道题载荷特别低。是,就考虑删除;不是,就看是不是整体载荷都不高,那可能说明这个构念的测量质量本身需要重新审视。
3.3 模型修订要遵循什么底线
模型拟合不好时,诱人的做法是通过修改指标(modification indices)逐个添加误差相关。lavaan 可以输出 MI:
modificationIndices(fit, sort = TRUE, maximum.number = 10)MI 的作用是告诉你:如果允许某两个变量之间自由相关,模型卡方会下降多少。但我要提醒你,MI 排名第一的项不一定有理论依据。两个题目措辞很像、内容有重叠,所以误差相关,这在心理学问卷里能解释;但如果你加了一个完全解释不通的相关,比如“性别测量题和工作压力测量题的误差相关”,那你只是为了凑指标,模型已经失去了理论意义。
我给自己定的底线是三条:第一,每个修正都必须有实质性解释,至少是“这两题措辞相近、可能存在共同方法因素”这种程度;第二,每次只加一个参数,重新跑模型,看指标变化,而不是一次性加五六个;第三,修正后载荷和 CR 不能明显变差,整体模型必须仍然可解释。守住这三点,模型修订就是合理的事后完善,而不是数据挖掘。
4. 实操中反复出现的坑与排查思路
4.1 模型不收敛:先看报错信息再怀疑人生
新手跑 lavaan 最常见的遭遇是输出里出现 warning,模型不收敛。lavaan 的警告信息其实给得很具体,但很多人一看英文报错就慌了,直接上网搜一段模棱两可的答案贴上。实际上你只需要先看 warning 最后一行提到什么。
如果提到 “could not compute standard errors” 或者 “the model may not be identified”,多半是模型识别有问题,也就是自由参数太多,数据信息量不够。最常见原因有两个:一个是某个因子只用了 2 道题甚至 1 道题来测量,模型很容易不稳定;另一个是潜变量之间没有足够的约束,导致参数无法唯一确定。解决办法要么增加指标,要么简化模型,要么在语法里手动固定一些参数。
如果提到 “convergence failed” 或者 “iteration limit reached”,通常不是模型语法错了,而是初始值不合适或者数据太糟糕。可以尝试改变估计方法,或者增加迭代次数:
fit <- cfa(model, data = mydata, control = list(iter.max = 2000))我碰过一次很典型的情况:样本只有 120,4 个因子各有 3 道题,怎么跑都不收敛。后来发现是因为数据里有两道题几乎完全相关(r = 0.97),本质上是冗余题目,相当于在模型里塞了两个几乎一样的指标,导致信息矩阵奇异。删掉一道之后,模型立刻收敛。所以遇到不收敛,先检查相关矩阵,看看有没有极端高相关或者完全共线性的题目。
4.2 Heywood case:载荷大于 1,方差为负,都是信号
Heywood case 是指标准化载荷超过 1,或者残差方差为负,这是一个明确的反常信号,说明模型估计出了问题。很多人第一次看到输出里出现“vartheta”为负,或者标准化载荷 1.02,第一反应是数据错了,其实更有可能是模型的某个部分太过勉强。
我遇到过的原因主要有三类。第一类是样本量过小,每因子题目又少,参数估计不稳定,尤其是只有 2 道题的因子,出现 Heywood case 的概率极高。第二类是题目之间有极端的局部依赖,比如一道题的措辞明显是另一道题的重复,误差项高度相关,导致载荷被推高。第三类是潜变量之间的相关太高(超过 0.85),说明两个因子在测量上几乎没有区分,实际可能是一个因子被硬拆成了两个。
处理方式不是看到负方差就删题,而是回头看数据质量。如果你用的是真实的问卷数据,先检查是否有反向题忘记反转——反向题没反转时,它和其他题目的关系是负的,因子模型会把它的误差方差推到边界。如果确认数据没问题但模型仍然出 Heywood case,可以考虑用 lavaan 的 bounds 参数对参数范围做约束,但这只是临时补救,根本解法还是调整模型结构。
4.3 载荷为负、量纲不一致、反向题未处理
载荷为负看着吓人,但通常不是模型出错,而是题目方向和处理逻辑的问题。问卷里经常有反向计分题,比如测焦虑的量表里有一道“我感觉很放松”,如果你直接把它和其他正向题一起放进模型,这道题的载荷就可能是负的。部分新手看到负载荷会以为是模型坏了,其实只需要在数据清洗阶段把反向题重新编码即可。
一个更隐蔽的问题是指变量量纲不一致。比如一个潜变量里有两道题是 5 点李克特,另一道题是百分制评分,或者一道题测的是反应时间(毫秒),另一道题是主观打分。这类变量放进同一个因子模型,载荷会因为量纲差异变得很难解释。要么先做标准化,要么干脆不要让量纲差异太大的题目测同一个因子。实际项目里我几乎不会遇到百分制和 5 点量表混合测同一个构念的情况,但如果你的数据是拼凑来的,一定要提前检查。
4.4 一个因子只有两道题:能不能救
问卷设计时计划三个指标,但实际筛完题之后发现某个因子只剩下两道有效题,这是常见情况。两个指标在模型识别上是可以跑出结果的,前提是你把这个因子和其他因子的相关约束住,或者固定它的载荷。但我要提醒你,双因子模型极其容易 Heywood case,而且参数解释要很谨慎——因为只有两个指标时,你实际上无法充分验证这个潜变量的结构效度。
我的建议是:如果在项目早期发现某个因子只剩两道题,优先回看问卷设计,看有没有其他题目能在理论上归入这个因子。实在没有,可以改走两条路:一是把这个潜变量当作单指标潜变量处理,在结构模型中固定其测量误差;二是直接放弃隐变量处理,把这两道题合成一个平均值,作为显变量进入分析,但论文里要坦白说明这一局限。
4.5 非正态数据、极端偏态数据怎么办
除了前面提到的 MLR 和 WLSMV,还有一个实际问题:极端偏态的数据连 WLSMV 都救不了。比如绝大多数人打 5 分,打分分布在一端堆成墙,这时候不管用什么估计方法,测量模型的估计都会非常不稳定。原因是题目几乎不提供区分信息,因子模型无从估计协方差。
遇到这种情况,第一步是看题目本身是不是出了问题,比如措辞导致社会称许性效应,几乎所有被试都选择高分。第二步是考虑把极端偏态的题目二分化处理(0-1 化),再用 WLSMV。第三步是如果只有一两道题这样,干脆删除,别舍不得——极端偏态的题目放进模型里,对整体拟合的破坏远比少一道题大。我实际碰到过一份数据,一个 12 题的量表里有两道题偏态系数超过 3,删掉之后 RMSEA 从 0.09 降到 0.06,其他指标也全部改善。
5. 从测度到结构:隐变量回归与完整 SEM
5.1 结构模型到底在做什么
测量模型过关之后,就可以在它上面加结构路径。结构方程模型的核心是估计潜变量之间的回归关系,用 lavaan 写也很直观。比如你想验证“工作压力”对“工作倦怠”有正向影响,语法只需要在 CFA 模型里加一行:
model_sem <- ' # 测量模型 stress =~ q1 + q2 + q3 + q4 burnout =~ q5 + q6 + q7 + q8 # 结构模型 burnout ~ stress ' fit_sem <- sem(model_sem, data = mydata) summary(fit_sem, fit.measures = TRUE, standardized = TRUE)这里的burnout ~ stress就是结构路径,估计出的是一个带测量误差校正的回归系数。和普通线性回归相比,最大的区别是:普通回归假设自变量 stress 没有测量误差,这在问卷数据里几乎不可能成立;SEM 则通过测量模型把 stress 的真实分数分离出来,再估计它对 burnout 的影响。这就是为什么 SEM 跑出来的路径系数往往比普通回归更干净。
解释路径系数时,建议默认看标准化系数,这样可以在同一模型内比较不同路径的相对强度。标准化路径系数 0.2 在社科研究里已经算中等偏有效果,0.5 以上算很强,期望值不要被理工科的相关系数标准带跑偏了。
5.2 二阶因子模型:当你的构念还有子维度
有些量表的理论结构不是平铺的因子,而是“子因子之上还有一个更上位的构念”。比如“工作倦怠”包含“情绪耗竭”“去个性化”“成就感低落”三个子维度,而你想用数据验证这三个子维度共同指向一个二阶因子“工作倦怠”。这种结构在 lavaan 里实现起来很直接:把一阶因子的载荷作为测量指标,再让二阶因子去负荷一阶因子。
model_higher <- ' # 一阶因子 ee =~ q1 + q2 + q3 dp =~ q4 + q5 + q6 pa =~ q7 + q8 + q9 # 二阶因子 burnout =~ ee + dp + pa ' fit_higher <- cfa(model_higher, data = mydata) summary(fit_higher, fit.measures = TRUE, standardized = TRUE)在这个模型里,二阶因子对一阶因子的载荷反映的是“每个子维度在多大程度上体现上位构念”。如果某个一阶因子在二阶因子上的载荷过低(比如低于 0.5),说明这个子维度虽然独立存在,但它和上位构念的关系并不紧密,这时就要考虑它在整个理论框架里的位置是否合适。
二阶模型的拟合判断标准和一阶 CFA 完全一致。要注意的是,二阶模型在识别条件上要求至少三个一阶因子,因为只有三个一阶因子时才能给二阶因子提供足够的测量信息。两个一阶因子的二阶模型在数学上等价于一阶模型,只是参数化方式不同,没必要硬写。
5.3 多隐变量并存:相关 vs 因果
处理多个潜变量时,还要想清楚你是在做相关分析还是因果分析。如果只是考察构念之间的关系强度,比如“工作压力”和“工作满意度”的相关,那在 CFA 模型里让两个因子自由相关即可,lavaan 默认就是在潜变量之间估计协方差。如果你想做因果路径,就必须有足够的理论依据支撑你写下那条方向性的箭头——是从压力指向倦怠,还是从倦怠指向压力?SEM 只能基于你指定的方向估计系数,它本身不能证明因果方向。
我在实际项目里遇到太多人问“SEM 能不能证明 A 导致 B”。答案是不能,SEM 配横截面数据只能支持“A 和 B 存在相关性”且“这种相关性在特定模型结构下表现为路径系数显著”。要谈因果,至少需要纵向数据、实验设计或者强理论框架支持的准实验条件。这个底线想清楚,写结论时就不会给自己挖坑。
6. 多组比较前必做的测量不变性检验
6.1 为什么要先验证“两组的题目在测同一个东西”
如果你想比较男性和女性在工作压力上的均值差异,或者比较两个年级学生的倦怠水平,很多人会直接把 CFA 模型分别跑一次,然后比较各自的得分均值。这在方法学上是不完整的。因为因子均值比较隐含一个前提:两组的被试对题目的理解方式相同,测量工具在两组中具有相同的意义。这个前提在方法学上叫“测量不变性”(measurement invariance)。
你可以这样理解:尺子刻度不一致,你就不能比较两个人的身高。问卷也是同理——如果男性被试在答这道题时理解的是“工作强度”,而女性被试理解的是“工作压力”,那直接用原始分比较就是拿两把不同的尺子量身高。测量不变性检验就是为了确认尺子刻度是否一致。
6.2 四步递进检验:形态、载荷、截距、残差
标准的测量不变性检验分四步,严格程度逐级递增。第一步是形态不变性(configural),也就是两组的因子结构相同,但不限制任何参数相等。第二步是载荷不变性(metric),要求因子载荷跨组相等,这意味着题目和潜变量的关系强度在两组中相同。第三步是截距不变性(scalar),要求题目的截距也相等,这一步通过之后,潜变量的均值比较才有意义。第四步是残差不变性(strict),要求题目残差方差也相等,这一步非常严格,实务中很少要求全部达标,通常做到第三步就能支持均值比较。
semTools 包提供了一个封装好的函数,可以一次跑完四步:
library(semTools) fit_meas_inv <- measurementInvariance( model = model, data = mydata, group = "gender" )输出会给你每一步的模型拟合结果,并自动帮你做了相邻模型之间的卡方差异检验。判断规则是:每一步的拟合指标变化量不能过大,一般看 ΔCFI 不要超过 0.01,ΔRMSEA 不要超过 0.015。如果这个条件满足,就认为加入跨组约束没有显著恶化模型,当前这一步的不变性成立。
6.3 结果怎么解读,以及过了和没过分别怎么办
如果载荷不变性检验通过,说明两组被试对题目的理解结构基本一致,可以放心比较潜变量之间的相关或路径系数。如果截距不变性通过,就可以进一步比较潜变量均值。如果某个步骤失败,比如载荷不变性不成立,那问题就麻烦一点,说明某些题目的载荷在两组中存在差异。
这个时候先不要急着放弃。看 modification indices 或者逐个释放部分题目,做部分测量不变性(partial invariance):也就是允许有问题的题目载荷跨组自由估计,但要确保至少有两个(最好三个)题目的载荷跨组相等,这样才能保证因子稳定的度量尺度。部分测量不变性在实证研究中是被接受的,但报告里必须清楚说明哪几道题存在差异、放开了哪几个参数、这种做法的依据是什么。
我在实际项目里遇到最多的情况是:载荷不变性普遍能过,但截距不变性经常出问题——通常是某一两道反向题在不同群体中的截距差异大。这往往和措辞理解有关,本质上是题目本身的问题。如果你的量表中还有反向题,建议优先检查是不是它们导致了截距差异。处理方式要么删除,要么在后续分析中把它们从总分里剔除。多组比较这件事,最大的价值就是逼你重新审视测量工具本身的质量,而不是想当然地拿一个总分去比较不同群体的差异。