R中缺失数据的完整信息最大似然

机器算法验证 r 最大似然 缺失数据
2022-01-19 10:31:45

背景:带有一些缺失数据的层次回归。

问题:如何使用全信息最大似然 (FIML) 估计来解决 R 中的缺失数据?有没有你会推荐的包,典型的步骤是什么?在线资源和示例也会非常有帮助。

PS:我是一名社会科学家,最近开始使用 R。多重插补是一种选择,但我真的很喜欢像 Mplus 这样的程序如何优雅地使用 FIML 处理丢失的数据。不幸的是,Mplus 目前似乎没有在分层回归的背景下比较模型(如果您知道这样做的方法,请告诉我!)。我想知道R中是否有类似的东西?非常感谢!

2个回答

这个答案的功劳归功于@Joshua,当我在 Google+ 上将这个问题发布到R 和统计社区时,他给出了一个很棒的答案。我只是在下面粘贴他的答案。

对于运行回归(没有潜在变量建模),请阅读我在引用文本后输入的注释。

在所有可用数据上使用最大似然法处理缺失数据(所谓的 FIML)是一种非常有用的技术。然而,有许多复杂性使得以一般方式实施具有挑战性。考虑一个简单的线性回归模型,预测一些来自年龄、性别和职业类型的连续结果。在OLS中,你不用担心年龄、性别、职业的分布,只关心结果。通常对于分类预测变量,它们是虚拟编码 (0/1)。要使用 ML,需要对所有具有缺失的变量进行分布假设。到目前为止,最简单的方法是多元正态 (MVN)。如果您不按照自己的方式声明变量的类型(例如,分类),这就是例如 Mplus 将默认执行的操作。在我给出的简单示例中,您可能想假设,年龄为正常,性别为伯努利,工作类型为多项式。后者很棘手,因为您实际上拥有的是几个二进制变量,但您不想将它们视为伯努利。这意味着您不想使用虚拟编码变量,您需要使用实际的分类变量,以便 ML 估计器可以正确使用多项式,但这反过来意味着需要将虚拟编码过程构建到模型中,而不是数据。再一次让生活变得复杂。此外,连续变量和分类变量的联合分布计算起来并不简单(当我在 Mplus 中遇到这样的问题时,它很快就开始崩溃和挣扎)。最后,您确实非常理想地指定了缺失数据机制。在 SEM 风格、FIML、所有变量本质上都取决于所有其他变量,但这不一定是正确的。例如,也许年龄不是性别和职业类型的函数,而是它们之间的相互作用。交互对于焦点结果可能并不重要,但如果它对年龄缺失很重要,那么它也必须在模型中,不一定是感兴趣的实质性模型,而是缺失数据模型。

lavaan 将 ML 用于 MVN,但目前我认为分类数据选项是有限的(再次来自 SEM 领域,这是标准的)。多重插补一开始似乎不太优雅,因为它明确了 FIML 背后的许多隐藏假设(例如每个变量的分布假设和每个变量缺失的预测模型)。但是,它为您提供了很多控制权并明确地考虑了每个变量的分布,并且每个变量的最佳缺失数据机制都很有价值。

我越来越相信贝叶斯模型是处理缺失数据的方法。原因是它们在包含每个变量的分布方面非常灵活,允许许多不同类型的分布,并且可以轻松地将预测变量上的缺失数据引入的可变性合并到整体模型估计中(这是多重插补的技巧,你然后必须以某种方式组合结果)。当然,这些方法并不是最简单的,并且可能需要大量的培训和时间才能使用。

所以这并不能真正回答你的问题,而是解释了为什么处理缺失的完全通用框架很棘手。在协方差矩阵的 semutils 包中,我在下面使用 lavaan 来使用 ML。我这样做是因为我假设方差协方差矩阵无论如何您都在使用连续变量,因此我假设我的用户已经为他们的数据假设了 MVN。

这意味着如果所有缺失的变量都是连续的,lavaan结构方程建模 (SEM) 包是 R 中用于 FIML 的一个不错的包。

现在回到我最初的问题。我的目的是在运行线性回归时对缺失有一个神奇的修复。我所有的缺失变量都很好且连续。因此,我开始以两种方式进行分析:

  • 多重插补的常用方法
  • 在 SEM 风格中使用 FIML 与 lavaan。

通过以 SEM 风格进行回归,我错过了很多东西。两种样式都给出了相似的系数和 R 平方,但在 SEM 样式中,我没有得到回归的显着性检验(带有 df 的典型 F 值),而是得到了没有帮助的拟合指数,因为我已经用完了所有学位的自由。此外,当一个模型的 R2 大于另一个模型时,我无法找到一种方法来比较差异是否显着。此外,以通常的方式进行回归可以访问大量非常宝贵的回归假设测试。有关此问题的更详细答案,请参阅@StasK很好地回答的我的另一个问题

所以结论似乎是 lavaan 是 R 中 FIML 的一个不错的包,但 FIML 的使用取决于统计假设和正在进行的分析类型。就回归(没有潜在变量建模)而言,将其排除在 SEM 程序之外并使用多重插补可能是明智之举。

有两种处理丢失数据/记录的主要方法。您要么删除具有缺失值的整行观察值,要么找到生成此缺失值的方法。如果您采用第一种方法,那么您最终可能会丢失大量数据。在第二种方法中,您必须找到一种“聪明”的方法来生成这些缺失数据,以使新数据集的参数估计与观察到的数据集的参数估计没有太大区别。

第二种方法称为数据插补,有几个 R 包可以做到这一点。其中之一称为 mclust,您需要的函数称为 imputeData。该函数使用 EM(期望最大化)算法来估计数据集中未观察到的部分的参数,给定观察到的部分。一旦找到参数,就会生成新的数据点。缺失数据、观测数据和整个数据集的分布假设假设为高斯分布。

希望这个解释可以帮助你实现你想要做的事情