估算PCA的缺失值


23

我使用该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

我想知道是否可以NAcenterscale设置为时将这些值设置为特定的数值,TRUE以便该prcomp()函数起作用并且不会删除包含NA的行,而且也不会影响PCA分析的结果。

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

有人能想到解决该问题的好方法吗?


8
您的问题不是PCA问题,而是更广泛的缺失价值补偿问题。如果您不熟悉它,请阅读一下。您有很多机会:(1)按列表删除个案,或(2)成对删除,或(3)用均值或中位数替换缺失。或(4)用随机选择的有效值代替(热甲板方法)。或通过(5)相互回归(有或没有加噪声)方法或更好的(6)EM方法估算缺失。
ttnphns 2012年

正如评论和答案所显示的那样,获得良好答案的关键是解释这些NA值的含义:“缺失”的原因是什么?
ub

2
我认为“ pcaMethods”软件包可以解决您的问题(此处
ToNoY 2014年

Answers:


22

实际上,有一个很好的方法来处理间隙矩阵-您可以分解从数据构造的协方差矩阵该矩阵由共享值比例缩放:CXn

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

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

但是,这种方法存在一些问题,因为协方差矩阵不再是半正定的,特征/奇异值趋于膨胀。在Beckers和Rixen(2003)中可以找到对这些问题的很好的综述,他们还提出了一种最佳插值缺失间隙的方法-DINEOF(数据插值经验正交函数)。我最近写了一个执行DINEOF函数,它似乎确实是一种更好的方法。您可以直接在数据集上执行DINEOF ,然后将插值的数据集用作的输入。Xprcomp

更新资料

在空白数据集上进行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。


(+1)这对我来说似乎是宝贵的贡献,因为它是一个新颖的想法。我很久以前就问过一个类似的问题,该问题非常相似:在审查数据时(而不是缺失的情况下)如何估计协方差矩阵?如果您对此情况有任何想法,我将很高兴答复!
ub

感谢@whuber-我相信这种方法也有很多优点。即使您对内插值不感兴趣,该方法也比描述数据集的EOF / PC更好-例如,通过算法将重构数据与原始数据之间的误差降至最低。
马克·马克(Marc)在

@whuber-关于审查数据-这超出了我的专业知识范围,有趣的是,几周前,我朝这个方向提出了一个问题(您对此发表了评论!)。我的直觉是,应该用低于检测极限的随机值填充零,该随机值近似于观测值的分布。我将研究您的帖子中引用的一些文献-这确实是一个非常有趣的话题。
马克·马克(Marc)在

@whuber-您可能对以下论文感兴趣,该论文描述了类似于稀疏数据的迭代协方差矩阵拟合过程:Bien,Jacob和Robert J. Tibshirani。“协方差矩阵的稀疏估计。” Biometrika 98.4(2011):807-820。
2013年

谢谢@马克。不幸的是,审查和空余是两个不同的问题,有着不同的关注点。
ub

6

我的建议取决于丢失多少数据以及为什么丢失数据。但这确实与PCA无关。如果丢失的数据非常少,那么您所做的事情就无关紧要。用中位数代替不是很理想,但是如果没有太多遗漏,则与更好的解决方案并没有太大不同。您可以尝试同时进行中位替换和按列表删除来进行PCA,并查看结果是否存在重大差异。

接下来,如果还有更多数据丢失,则应考虑数据是随机完全丢失,随机丢失还是随机丢失。我会建议在前两种情况下进行多次插补,而在第三种情况下有时会建议使用多次插补-除非数据因其NMAR状态而严重失真,否则我认为多次插补比列表删除要好(宾夕法尼亚州立大学的Joe Schafer做过关于丢失数据的大量工作-我记得他的一些工作,即使在某些NMAR情况下,多重插补也能很好地工作)。但是,如果数据是MCAR或MAR,则可以证明多重插补的属性。

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


1

没有正确的解决方案。必须指定向量中的每个坐标以获得正确的主成分集。如果缺少坐标,并用某个推定值代替,您将得到结果,但这将取决于推定值。因此,如果对推算值有两个合理的选择,则不同的选择将给出不同的答案。


3
我只是搜索了PCA和丢失的数据,发现:4.2 SIMCA如何处理丢失的数据?简而言之,NIPALS算法使用最小二乘拟合对缺失点进行插值,但是缺失数据对模型没有影响。连续迭代通过简单地将分数和该点的负载相乘来完善缺失值。对于丢失数据,存在许多不同的方法,例如估计,但是它们通常会收敛到相同的解决方案。如果数据是随机分布的,则可以接受丢失的数据。丢失数据的系统块是有问题的。
user969113 2012年

1
我不知道您的意思对模型没有影响。坐标缺失值的任何选择都会影响主成分。
Michael R. Chernick

1

最近一篇评论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)
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.