如何使用`blavaan`处理缺失数据?贝叶斯SEM缺失值处理实践问询
blavaan 贝叶斯SEM缺失值处理最优实践
所有方案均基于*缺失随机(MAR)*假设,这也是FIML、多重插补等主流缺失值处理方法的通用前提。
方案1:优先选择JAGS后端(零额外预处理成本)
- 直接保留数据中的NA值,调用
bsem()时指定参数backend = "jags"即可 - 底层逻辑:JAGS会自动将缺失值作为额外的模型参数进行抽样,属于开发者推荐的「缺失值与模型联合建模」方案,效果等价于lavaan的
missing = "FIML",不需要做任何额外的数据处理。
方案2:必须使用Stan后端时的两种落地方法
方法A:使用blavaan内置全信息似然方案
- 该方案的似然逻辑与lavaan FIML完全一致,效果有理论保障
- 预处理操作步骤:
- 统计所有样本的缺失数据模式,按模式对样本排序,提升Stan的计算效率
- 为每个样本生成观测变量的位置索引,标记哪些变量是有观测值的
- 将处理后的数据、索引参数一同传入
bsem(),指定backend = "stan"即可
开发者官方说明:我们的Stan模型采用“全信息”似然法(如Wothke 2000),该似然函数与
lavaan等采用最大似然估计的SEM软件处理缺失数据时所用的似然函数完全一致。使用该方案时向Stan传输前的数据预处理环节会增加额外工作量:需要对每个样本的观测值建立索引,同时按缺失数据模式对样本排序以提升计算效率。理论上Stan也可直接对缺失值进行抽样(即“插补”),但目前该功能暂未实现。
方法B:前置多重插补
- 如果不想自己写预处理代码,可以先使用
mice、Amelia等包对原始数据做多重插补,生成5-10套完整的插补数据集 - 对每套插补数据集分别运行
bsem(),最后按照贝叶斯参数合并规则合并多套模型的结果即可,可靠性与前两种方案无显著差异。
不推荐的操作
- 除了列表删除外,也不推荐使用单值插补(比如均值插补、中位数插补),会低估参数标准误,影响结果可靠性。
内容的提问来源于stack exchange,提问作者Michael Wu
相关产品推荐
相关产品推荐

