PCA 缺失值的插补

机器算法验证 r 主成分分析 缺失数据 数据插补
2022-01-24 07:02:55

我使用该prcomp()函数在 R 中执行 PCA(主成分分析)。但是,该函数中存在一个错误,导致该na.action参数不起作用。我在 stackoverflow 上寻求帮助那里的两个用户提供了两种处理NA价值的不同方式。然而,这两种解决方案的问题在于,当有一个NA值时,该行将被删除并且在 PCA 分析中不予考虑。我的真实数据集是一个 100 x 100 的矩阵,我不想仅仅因为它包含一个NA值而丢失一整行。

以下示例显示该prcomp()函数不返回第 5 行的任何主成分,因为它包含一个NA值。

d       <- data.frame(V1 = sample(1:100, 10), V2 = sample(1:100, 10), 
                      V3 = sample(1:100, 10))
result  <- prcomp(d, center = TRUE, scale = TRUE, na.action = na.omit)
result$x                                # $
d$V1[5] <- NA                           # $
result  <- prcomp(~V1+V2, data=d, center = TRUE, scale = TRUE, na.action = na.omit)
result$x

我想知道我是否可以将这些NA值设置为一个特定的数值 whencenterscale设置为TRUE以便prcomp()函数工作并且不会删除包含NA's 的行,但也不影响 PCA 分析的结果。

我考虑用NA单个列中的中值或非常接近 0 的值替换值。但是,我不确定这会如何影响 PCA 分析。

有人能想出解决这个问题的好方法吗?

4个回答

事实上,有一个有据可查的方法来处理 gappy 矩阵 - 你可以分解一个协方差矩阵从你的数据的数量缩放CXn

C=1nXTX,                Cjl=X.jY.l¯

然后通过最小二乘拟合扩展主要系数(如@user969113 所述)。这是一个例子

然而,这种方法存在几个问题,即协方差矩阵不再是半正定的,并且特征/奇异值趋于膨胀。Beckers 和 Rixen (2003)对这些问题进行了很好的回顾,他们还提出了一种优化插值缺失间隙的方法 - DINEOF(数据插值经验正交函数)。我最近编写了一个执行 DINEOF 的函数,这似乎是一个更好的方法。您可以直接在您的数据集上执行 DINEOF ,然后使用插值数据集作为.Xprcomp

更新

在 gappy 数据集上进行 PCA 的另一种选择是“递归减去经验正交函数”(Taylor 等人,2013 年)。它还纠正了最小二乘法中的一些问题,并且计算速度比 DINEOF 快得多。这篇文章在使用 PC 进行数据重建的准确性方面比较了所有三种方法。

参考

Beckers、Jean-Marie 和 M. Rixen。“来自不完整海洋学数据集的 EOF 计算和数据填充。” 大气和海洋技术杂志 20.12 (2003): 1839-1856。

Taylor, M.、Losch, M.、Wenzel, M. 和 Schröter, J. (2013)。关于使用从间隙数据导出的经验正交函数进行场重建和预测的灵敏度。气候杂志,26(22),9194-9205。

我的建议取决于丢失了多少数据以及丢失的原因。但这与 PCA 无关,真的。如果丢失的数据非常少,那么你做什么都没关系。用中位数代替并不理想,但如果没有太多遗漏,与更好的解决方案相差不大。您可以尝试使用中值替换和列表删除来进行 PCA,看看结果是否存在重大差异。

接下来,如果有更多的数据丢失,你应该考虑是完全随机丢失、随机丢失还是不随机丢失。我建议在前两种情况下进行多重插补,有时在第三种情况下进行多重插补——除非数据因其 NMAR 状态而高度扭曲,否则我认为多重插补会比列表删除更好(宾夕法尼亚州立大学的乔·谢弗(Joe Schafer)做了一个很多关于缺失数据的工作——我记得他的一些工作表明多重插补即使在某些 NMAR 案例中也很有效)。但是,如果数据是 MCAR 或 MAR,则可以证明多重插补的性质。

如果你决定使用 MI,需要注意的是要小心,因为 PCA 中组件的符号是任意的,数据中的微小变化可能会翻转符号。然后,当您进行 PCA 时,您会胡说八道。很久以前,我在 SAS 中制定了一个解决方案——这并不难,但需要小心。

最近一篇回顾 PCA 分析中处理缺失值的方法的论文是 Dray & Josse (2015) 的“缺失值的主成分分析:方法的比较调查”允许缺失值的两种最著名的 PCA 方法是 NIPALS 算法,在包的nipals功能中实现ade4,以及迭代 PCA(Ipca 或 EM-PCA),在包的imputePCA功能中实现missMDA该论文得出结论,Ipca 方法在最广泛的条件下表现最佳。

对于您的示例语法是:

对于 NIPALS :

library(ade4)
nipals(d[,c(1,2)])

对于 Ipca:

library(missMDA)
imputePCA(d[,c(1,2)],method="EM",ncp=1)

您可以通过不同的方式解决缺失值的问题。下面我将说明它们。

您应该使用包含 NA 值的变量的平均值或使用线性回归估算缺失值。

您应该使用missMDAand thenFactoMineRpcaMethods. 下面举个例子。

library(missMDA)
nPCs <- estim_ncpPCA(VIM::sleep)


Output 
nPCS$ncp
    3

completed_sleep <- imputePCA(VIM::sleep, ncp = nPCs$ncp, scale = TRUE)
PCA(completed_sleep$completeObs)

另一个例子是:

library(pcaMethods)
sleep_pca_methods <- pca(sleep, nPcs=2, method="ppca", center = TRUE)
imp_air_pcamethods <- completeObs(sleep_pca_methods)

如果您想深入了解PCA或 factoMiner 软件包,您应该访问其网站http://factominer.free.fr/