2. PCoA 数学原理:从距离矩阵到主坐标的推导过程与几何意义

好,咱们进入第二讲。在讲PCoA之前,我想先问一个问题:为什么主成分分析(PCA)在批次效应检测中有时不好使?

很简单。PCA要求输入是原始数据矩阵,它默认数据是连续的、线性的、具备欧氏空间结构。但生物信息学的距离度量常常是非欧的——比如Bray-Curtis距离、Jaccard距离、UniFrac距离。你没法直接把一个距离矩阵塞进PCA。

所以我们需要一个更普遍的方法:PCoA(主坐标分析)。它不管你的距离是怎么算的,只要有个距离矩阵,它就能给你找出一组“主坐标”,让样本在新的低维空间中尽量保持原来的距离关系。说白了,PCoA是把任意形式的距离翻译成坐标。

我个人习惯把PCoA看作“距离矩阵的翻译官”。它不关心你是用哪种距离尺子量的,只关心距离关系本身。下面,我带你一步步拆开这个翻译过程。

2.1 核心逻辑:从相异性到坐标

PCoA的输入是一个 \( n \times n \) 的距离矩阵 \( D \),其中 \( D_{ij} \) 是样本 i 和 j 之间的距离。输出是 \( n \times k \) 的坐标矩阵 \( X \),k通常是2或3,用来画图。

整个过程可以浓缩为三步:

  1. 平方与中心化:将距离矩阵转化为内积矩阵 G。
  2. 特征值分解:对 G 做特征值分解,得到特征值和特征向量。
  3. 降维取坐标:选前 k 个最大的特征值对应的特征向量,组成主坐标。

听起来不复杂,对吧?但每一步都有坑。我以前踩过一个坑,就是忘记对距离矩阵做“双中心化”直接做分解,结果画出来的图完全对不上样本的真实距离。嗯,这里要注意。

要点速记:PCoA的目标是在低维空间保持样本间距离关系不变。它与PCA的区别在于输入——PCA用原始数据,PCoA用距离矩阵。

2.2 第一步:把距离变成内积

你可能会问:我们明明有距离,为什么还要转换成内积?

因为距离矩阵不能直接做特征值分解——它不满足“正定”或“半正定”性质。而内积矩阵可以。你想想看,做特征值分解天生就是对内积矩阵设计的。

转换过程如下:

1. 对原始距离矩阵 D 的每个元素取平方
   D_sq[i][j] = D[i][j]²

2. 对 D_sq 做“双中心化”
   设 J = I - (1/n) * 1*1ᵀ
   则 G = -0.5 * J * D_sq * J

这个矩阵 G 就是我们要的内积矩阵。它的几何意义是:在某个高维的“嵌入空间”中,样本 i 和 j 的点积。

这里有一点很关键:双中心化操作保证了 G 的行和与列和均为零。为什么?因为只有这样,后续的特征向量才能代表偏离中心的坐标,而不是把整个点云整体平移。

推导精髓:PCoA的精妙之处在于——它并不真正知道样本在原始空间中的坐标,但它通过距离矩阵反推出了样本在“隐式欧氏空间”中的位置。这是“MDS(多维缩放)家族”最漂亮的数学技巧之一。

2.3 第二步:特征值分解

得到内积矩阵 G 之后,剩下的工作就和PCA的后半段一模一样了。

对 G 做特征值分解:
   G = V * Λ * Vᵀ

其中:
   Λ = diag(λ₁, λ₂, ..., λₙ),λ₁ ≥ λ₂ ≥ ... ≥ λₙ
   V 的每一列是特征向量

这里注意,特征值有可能出现负数——这在PCA里不会发生,但PCoA会。为什么?因为我们的距离矩阵可能对应一个“非欧几里得”空间。比如Bray-Curtis距离在某些情况下无法被完美嵌入到欧氏空间。

负特征值的处理方式:

  • 如果负特征值的绝对值很大——你选的距离度量可能不适合做PCoA
  • 如果负特征值很小(接近零)——忽略它们,只取正的特征值
  • 在实践中,如果前两三个特征值占总特征值和的80%以上,负特征值基本不影响结果
避坑指南:我曾经在单细胞群落分析中使用Jaccard距离做PCoA,结果发现第4个特征值是 -0.32。当时我怀疑代码写错了,后来才知道这是非欧距离的“常态”。最终我改用平方Jaccard距离才把负特征值压了下去。所以记得检查你的特征值符号分布。

2.4 第三步:提取主坐标

我们只取前 k 个最大的特征值及其特征向量:

主坐标矩阵 X 的每一行是一个样本的 k 维坐标:
   X = V_k * sqrt(Λ_k)

其中:
   V_k 是前 k 个特征向量组成的 n×k 矩阵
   Λ_k 是前 k 个特征值组成的 k×k 对角矩阵

这里的 \( \text{sqrt}(Λ_k) \) 很关键——它把内积重新缩放回距离单位。不要省略它,否则你的坐标尺度就是内积尺度而非距离尺度,画出来的散点图会看起来“变瘦”。

我个人习惯在提取主坐标后,再算一遍各样本在新空间的欧氏距离,与原始距离矩阵做一次对比校验。如果两张图的点间距离一致性大于0.95,我就对当前结果有信心了。

2.5 几何意义:PCoA到底做了什么?

从几何角度看,PCoA本质上是在做这么一件事:

  1. 隐式恢复:从距离矩阵出发,恢复出样本在“某个欧氏空间”中的坐标
  2. 最紧拟合:在这个恢复出的空间中,找到最能解释距离信息的 k 个方向
  3. 正交投影:把样本投影到这 k 个方向上,得到主坐标

你可以这么理解:假设原来每个样本有100个看不见的维度,你只知道它们之间的相互距离。PCoA帮你在保持距离结构的基础上,用2维或3维把这100维的“形态”大致勾画出来。这是一个非常强的降维能力,但它也有代价——只保留距离,丢失了原始变量的可解释性。

举个具体的例子:样本A和样本B的Bray-Curtis距离是0.3,样本B和C的距离是0.8。PCoA找到的坐标空间中,A和B的欧氏距离接近0.3,B和C接近0.8——但你不能说“PCoA的PC1轴代表丰度差异”,因为轴没有变量标签。

这就是PCoA和PCA的根本不同:PCA的轴是有数学含义的(方差最大方向),PCoA的轴只保证距离。

经验之谈:在我的实际项目中,PCoA的PC1和PC2经常可以完美分离批次。有次做16S rRNA数据,样本技术重复的Jaccard距离非常小,PCoA图上一看,重复点几乎叠在一起。所以我建议,每次拿到距离矩阵后,先跑一次PCoA看看有没有明显的批次结构,这比任何统计检验都直观。

2.6 知识结构总览

下面这张SVG图把PCoA的完整流程串起来了。从距离矩阵到主坐标,每一步的输入输出和关键操作都标出来了。

PCoA 从距离矩阵到主坐标的完整流程 PCoA 核心流程:从距离矩阵到主坐标 距离矩阵 D n × n, 任意距离度量 元素平方 + 双中心化 D² → G = -½ J D² J 内积矩阵 G 半正定(或近似) 特征值分解 G = V Λ Vᵀ 筛选前k个特征值/向量 取 λ₁≥λ₂≥...≥λₖ,对应 Vₖ 主坐标矩阵 X X = Vₖ · sqrt(Λₖ) ⚠️ 关键注意点 • 双中心化是核心步骤,不能跳过 • 负特征值表示非欧距离残留 • 缩放因子 sqrt(λ) 是坐标还原必须

2.7 PCoA与PCA的对比总结

我经常在项目里被问到:PCoA和PCA到底什么关系?能不能画完PCoA再画PCA?这里我用一个表格把它们的区别理清楚。

对比维度 PCA PCoA
输入数据 原始特征矩阵 (n × p) 相异性/距离矩阵 (n × n)
数学基础 协方差矩阵的特征分解 双中心化距离矩阵的特征分解
距离类型限制 必须是欧氏距离 任意距离度量(Bray-Curtis, Jaccard, UniFrac等)
输出主成分含义 变量方向的线性组合(可解释特征贡献) 无量纲坐标,不直接对应原始变量
批次效应图特点 展示基于方差的分离,批次与主变量混杂时不易分离 展示基于距离的分离,批次差异明显时更直观
计算复杂度 O(n·p²) 一般取决于特征数 p O(n³) 因为要对 n×n 矩阵分解,当 n 很大(>10⁴)时较慢

从这张表你能看出来——PCoA是PCA的泛化版本。如果直接把欧氏距离矩阵丢进PCoA,得到的结果和PCA几乎一样(只是坐标旋转上有差别,但相对位置关系完全保留)。

2.8 什么时候用PCoA?

我个人的判断标准很简单:

  • 如果你手头是原始丰度表,且批次效应主要来自技术变异——我会先用PCA快速预览
  • 如果你手头只有距离矩阵(比如从Qiime导出的beta多样性结果)——只能用PCoA
  • 如果你的数据存在高比例的双零(比如微生物组数据中很多样本和物种都是零)——用Bray-Curtis距离+PCoA效果远好于PCA
  • 如果你想以图示方式检验批次效应,不关心主成分的生物学含义——PCoA更自由

在实践中,PCoA的图上如果同一个批次的样本聚成一团,而不同批次的样本明显分开,这就说明需要做批次校正了。至于校正方法,我们后面的章节会讲。

一句话总结:PCoA让你在不知道原始坐标的情况下,用距离还原出最好的低维分布。它不关心变量,只关心距离。当批次效应体现在样本间的距离结构上,PCoA几乎总能把它揪出来。