如何用lavaan复现Friedman(2008)的复杂CFA模型?
针对Friedman(2008)双因子CFA模型拟合问题的解答
1. 两种方法的适用性
cfa():完全适合。你要复现的是单水平双因子CFA模型,cfa()是lavaan中专门用于验证性因子分析的函数,只要模型设定正确,就能直接拟合目标模型。sem()的level语法:不适合。level语法是用于拟合多水平SEM模型的(比如嵌套数据:学生→班级),而Friedman(2008)的模型是单水平结构,不需要用到多水平设置,这个方向从一开始就错了。
2. cfa()无法计算标准误的原因及模型可信度
- 核心问题是模型未识别,导致标准误无法计算。未识别的常见原因:
- 参数约束不足:双因子模型需要明确约束:每个潜变量至少固定1个载荷为1(lavaan默认会固定每个因子的第一个载荷为1,但如果你的模型设定中存在参数冗余或约束缺失,比如未限制特定因子与共同因子、特定因子之间的相关性,就会导致识别失败)。
- 参数数量超过观测信息:9个观测变量的协方差矩阵有45个独立元素,若自由估计的参数数量超过45,会出现负自由度,直接导致模型未识别。
- 未识别模型的参数估计完全不可信,因为存在无数组参数都能拟合当前数据,结果没有统计意义。
3. sem()中cluster参数的设置
cluster参数仅用于嵌套/分层数据(比如同一被试的重复测量数据、被试嵌套在群体中),需要指定聚类变量(如班级ID、被试ID)。但你的目标模型是单水平CFA,模拟数据若为独立被试的单条记录,完全不需要设置cluster参数,用sem()拟合单水平模型和cfa()的逻辑一致,只是cfa()更针对性。
4. 最优方法及修改方案
优先使用cfa(),语法更简洁且适配CFA场景,需要做以下修改:
- 正确设定双因子模型语法:明确每个观测变量的载荷关系,同时约束因子间的相关性(双因子模型的标准设定是共同因子与特定因子、特定因子之间不相关),示例语法如下:
# 假设9个变量中,var1-3属于更新任务,var4-6属于转换任务,var7-9仅加载到共同因子 friedman_model <- ' # 共同因子 common =~ var1 + var2 + var3 + var4 + var5 + var6 + var7 + var8 + var9 # 更新特定因子 updating_specific =~ var1 + var2 + var3 # 转换特定因子 shifting_specific =~ var4 + var5 + var6 # 关键约束:因子间不相关 common ~~ 0*updating_specific common ~~ 0*shifting_specific updating_specific ~~ 0*shifting_specific ' - 确保模型识别:lavaan默认会固定每个因子的第一个载荷为1,满足识别要求;若你手动调整了载荷固定方式,需保证每个潜变量至少有1个固定载荷。
- 检查模拟数据的生成逻辑:生成数据时要严格匹配双因子结构,比如按照设定的载荷、因子方差、残差方差生成,避免数据本身不符合模型导致的拟合问题。
内容的提问来源于stack exchange,提问作者jbrimm2004
相关产品推荐
相关产品推荐

