是否应该在进行 PCA 之前删除高度相关的变量?

机器算法验证 相关性 主成分分析
2022-01-15 21:31:17

我正在阅读一篇论文,其中作者在进行 PCA 之前由于与其他变量的高度相关性而丢弃了几个变量。变量总数约为 20。

这有什么好处吗?这对我来说似乎是一种开销,因为 PCA 应该自动处理这个问题。

4个回答

这阐述了@ttnphns 在评论中提供的有见地的提示。

相邻的几乎相关的变量增加了它们共同的潜在因素对 PCA 的贡献。 我们可以从几何上看到这一点。考虑 XY 平面中的这些数据,显示为点云:

散点图

几乎没有相关性,协方差大致相等,并且数据居中:PCA(无论如何进行)将报告两个大致相等的分量。

现在让我们输入第三个变量Z等于Y加上少量的随机误差。的相关矩阵(X,Y,Z)除了在第二和第三行和列之间(YZ):

(1.0.03440180.0460760.03440181.0.9418290.0460760.9418291.)

在几何上,我们几乎垂直地移动了所有原始点,将前一张图片从页面平面中提升出来。这个伪 3D 点云试图用侧面透视图来说明提升(基于不同的数据集,尽管生成方式与以前相同):

3D 绘图

这些点最初位于蓝色平面中,并被提升到红点。原本的Y轴指向右侧。由此产生的倾斜也将点沿 YZ 方向拉伸,从而使它们对方差的贡献加倍。因此,这些新数据的 PCA 仍将识别两个主要主成分,但现在其中一个的方差将是另一个的两倍。

中的一些模拟证实了这种几何期望R为此,我通过第二次、第三次、第四次和第五次创建第二个变量的近共线副本​​来重复“提升”过程,并命名它们X2通过X5. 这是一个散点图矩阵,显示了最后四个变量如何很好地相关:

散点图矩阵

PCA 是使用相关性完成的(尽管对于这些数据并不重要),使用前两个变量,然后是三个,...,最后是五个。我使用主成分对总方差的贡献图来显示结果。

主成分分析结果

最初,对于两个几乎不相关的变量,贡献几乎相等(左上角)。在添加一个与第二个相关的变量之后——就像在几何插图中一样——仍然只有两个主要成分,一个现在是另一个的两倍。(第三个分量反映了缺乏完美的相关性;它测量了 3D 散点图中煎饼状云的“厚度”。)添加另一个相关变量后(X4),第一部分现在约占总数的四分之三;加上五分之一后,第一个成分几乎占总数的五分之四。在所有四种情况下,大多数 PCA 诊断程序都可能认为第二个之后的组件无关紧要;在最后一种情况下,某些程序可能会得出结论,只有一个主要成分值得考虑。

我们现在可以看到,丢弃被认为是衡量一组变量的相同潜在(但“潜在”)方面的变量可能是有好处的,因为包括几乎冗余的变量会导致 PCA 过分强调它们的贡献。这样的程序在数学上没有任何正确(或错误)的地方。这是基于分析目标和数据知识的判断。但应该非常清楚的是,搁置已知与其他变量密切相关的变量会对 PCA 结果产生重大影响。


这是R代码。

n.cases <- 240               # Number of points.
n.vars <- 4                  # Number of mutually correlated variables.
set.seed(26)                 # Make these results reproducible.
eps <- rnorm(n.vars, 0, 1/4) # Make "1/4" smaller to *increase* the correlations.
x <- matrix(rnorm(n.cases * (n.vars+2)), nrow=n.cases)
beta <- rbind(c(1,rep(0, n.vars)), c(0,rep(1, n.vars)), cbind(rep(0,n.vars), diag(eps)))
y <- x%*%beta                # The variables.
cor(y)                       # Verify their correlations are as intended.
plot(data.frame(y))          # Show the scatterplot matrix.

# Perform PCA on the first 2, 3, 4, ..., n.vars+1 variables.
p <- lapply(2:dim(beta)[2], function(k) prcomp(y[, 1:k], scale=TRUE))

# Print summaries and display plots.
tmp <- lapply(p, summary)
par(mfrow=c(2,2))
tmp <- lapply(p, plot)

我将进一步说明与@whuber 相同的过程和想法,但使用加载图,因为加载是 PCA 结果的本质。

这里是三三分析。首先,我们有两个变量,X1X2(在此示例中,它们不相关)。在第二个中,我们添加了X3这几乎是X2因此与它密切相关。在第三个中,我们仍然类似地添加了另外 2 个“副本”:X4X5.

然后,前 2 个主成分的载荷图就开始了。图上的红色尖峰表示变量之间的相关性,因此几个尖峰的一堆是发现紧密相关变量簇的地方。组件是灰线;组件的相对“强度”(其相对特征值大小)由线的权重给出。

在此处输入图像描述

可以观察到添加“副本”的两个效果:

  1. 成分 1 越来越强,成分 2 越来越弱。
  2. 组件的方向发生变化:起初,组件 1 位于中间X1X2; 正如我们添加的 X3X2组件 1 立即重新定位自己以跟随涌现的一堆变量;您可以肯定,在我们进一步向这组变量中添加了两个变量之后,组件 1 与那组密切相关的变量的关联变得更加无可争议。

我不会恢复道德,因为@whuber 已经做到了。


加法以下是回应@whuber 评论的一些图片。它是关于“可变空间”和“主体空间”之间的区别以及组件如何在这里和那里定位自己。提出了三个双变量 PCA:第一行分析r=0, 第二行分析r=0.62, 和第三行r=0.77. 左列是散点图(标准化数据),右列是加载图。

在散点图上,之间的相关性X1X2呈现为云的椭圆形。分量线和可变线之间的角度(其余弦)是相应的特征向量元素。所有三个分析中的特征向量都是相同的(因此所有 3 个图表上的角度都相同)。[但是,确实,与r=0 确切地说,特征向量(以及角度)在理论上是任意的;因为云是完美的“圆形”,任何穿过原点的正交线都可以作为两个组成部分,甚至X1X2可以选择线条本身作为组件。] 组件上的数据点(200 个对象)的坐标是组件分数,它们的平方和除以 200-1 是组件的特征值

在加载图上,点(向量)是变量;他们传播的空间是二维的(因为我们有 2 个点 + 原点),但实际上是一个减少的 200 维(主题数)“主题空间”。这里红色向量之间的角度(余弦)是r. 这些向量具有相同的单位长度,因为数据已经标准化。第一个组成部分是这个空间中的这样一个维度轴,它冲向点的过度积累;如果只有 2 个变量,它总是之间的平分线X1X2(但添加第三个变量无论如何都会使其偏转)。变量向量和分量线之间的角度(余弦)是它们之间的相关性,并且因为向量是单位长度并且分量是正交的,所以这只不过是坐标,加载组件上的平方载荷之和是其特征值(组件只是在此主题空间中定位自身以使其最大化)

在此处输入图像描述


加法2。另外上面我说的是“可变空间”和“主体空间”,好像它们像水和油一样不相容。我不得不重新考虑它,并且可能会说 -至少在我们谈论 PCA 时- 两个空间最终都是同构的,因此我们可以正确显示所有 PCA 细节 - 数据点、变量轴、分量轴、变量为点,- 在单个未失真的双图上。

下面是散点图(变量空间)和加载图(分量空间,即基因起源的主题空间)。可以在一个上显示的所有内容也可以在另一个上显示。图片是相同的,仅相对于彼此旋转了 45 度(并在此特定情况下反射)。那是变量 v1 和 v2 的 PCA(标准化,因此分析的是r)。图片上的黑线是以变量为轴;绿/黄线是作为轴的组件;蓝点是数据云(主题);红点是显示为点(向量)的变量。

在此处输入图像描述

如果没有您论文中的详细信息,我猜想这种丢弃高度相关变量的做法仅仅是为了节省计算能力或工作量。我看不出为什么 PCA 会“破坏”高度相关的变量的原因。将数据投射回 PCA 发现的碱基具有白化数据的效果(或将它们去相关)。这就是 PCA 背后的重点。

据我了解,相关变量是可以的,因为 PCA 输出的向量是正交的。