
在现代科研中,我们经常会面对这样的数据:一个实验只有几十个样本,却同时测量了几十、几百甚至上千个变量。例如,代谢组学可能同时检测数百种代谢物,转录组实验可以获得成千上万个基因的表达数据,医学研究也可能同时记录患者的年龄、血压、血脂、血糖、炎症指标等多个变量。
问题在于,变量数量越多,数据结构就越难直接观察。研究者即使把数据输入统计软件,也很难从一个几十列、几百列甚至上万列的数据表中直观看出:哪些样本比较相似?哪些样本可能形成不同的群组?哪些变量贡献最大?实验组与对照组是否存在整体上的差异?
PCA(Principal Component Analysis,主成分分析)就是解决这类问题的重要工具之一。
它的核心思想并不复杂:把原始数据中大量彼此相关的变量,重新组合成少数几个新的综合变量,也就是“主成分”(Principal Components, PCs),然后利用这些主成分尽可能多地保留原始数据中的变异信息。
因此,PCA既可以用于降维(dimensionality reduction),也可以用于探索性数据分析(exploratory data analysis)和数据可视化。在很多研究中,我们最终看到的“PCA图”,实际上就是把高维数据投影到了PC1和PC2构成的二维空间中。

(原始三维数据集。红色、蓝色、绿色箭头分别表示第一、第二和第三主成分的方向。图源:towards data science)

(主成分分析后,数据从三维降维到二维,得到的散点图。图源:towards data science)
需要特别注意的是:PCA是一种无监督方法。它在计算主成分时并不知道哪些样本属于病例组、对照组、治疗组或不同物种。因此,PCA图中的组别颜色通常只是研究者为了方便观察而添加的分组信息,并不是PCA根据组别计算出来的。
PCA到底是什么?
假设一个研究有 (n) 个样本和 (p)个变量,可以把数据表示为一个矩阵:
[
X=
\begin{bmatrix}
x_{11}&x_{12}&\cdots&x_{1p}\
x_{21}&x_{22}&\cdots&x_{2p}\
\vdots&\vdots&\ddots&\vdots\
x_{n1}&x_{n2}&\cdots&x_{np}
\end{bmatrix}
]
每一行代表一个样本,每一列代表一个变量。
例如,在一项代谢组学研究中,行可能是不同患者,列可能是 glucose、cholesterol、lactate、citrate 等代谢物。
如果变量之间存在较强的相关性,那么很多变量实际上携带的是相互重叠的信息。PCA希望寻找一组新的坐标轴,把这些原始变量重新组合起来。
第一主成分PC1是数据中能够解释最大变异的方向;第二主成分PC2是在与PC1正交的条件下,能够解释剩余最大变异的方向;PC3继续解释剩余变异,以此类推。
因此:
PC1 → 解释最多的变异
PC2 → 在PC1之外解释第二多的变异
PC3 → 在前两个主成分之外继续解释更多变异
依次类推。
从数学上看,PCA得到的是原始变量的线性组合。例如:
[
PC1=a_1X_1+a_2X_2+\cdots+a_pX_p
]
其中(a_1,a_2,\ldots,a_p)是相应变量在PC1中的系数。这些系数通常与我们所说的 loadings(载荷)密切相关。
PCA最重要的特点是,不同主成分之间彼此正交,因此在经典PCA框架下,它们是不相关的。通过保留前几个主成分,就可以用较低维度的数据近似表示原始高维数据。
PCA的历史:从Pearson到Hotelling
PCA并不是近年来随着生物信息学兴起的新方法。
它的历史可以追溯到20世纪初。1901年,英国统计学家 Karl Pearson 在论文《On Lines and Planes of Closest Fit to Systems of Points in Space》中研究了这样一个几何问题:如果有大量分布在高维空间中的数据点,应该如何寻找一条最能够代表这些点的直线或平面?

从几何角度来看,这个问题与现代PCA中的第一主成分和低维投影具有直接联系。
1933年,美国统计学家 Harold Hotelling 对这一思想进行了进一步发展,将其建立为更加系统的统计方法,并提出了“principal components”这一术语。Hotelling的方法从最大化方差的角度定义主成分,这也成为今天教科书中PCA数学推导的重要基础。
因此,通常认为PCA的早期历史主要与 Pearson(1901)和Hotelling(1933)联系在一起。
值得注意的是,在电子计算机出现之前,处理高维数据的特征值、特征向量等计算非常困难。因此,PCA真正大规模进入实际应用,与20世纪中后期计算能力的发展密切相关。后来它逐渐被应用到气象学、生态学、心理测量、化学计量学、图像分析、基因组学和机器学习等领域。
今天,PCA已经成为多变量统计分析中最经典、应用最广泛的方法之一。
PCA为什么能够“降维”?
理解PCA最简单的方法,是想象一个二维数据集。
假设我们测量100个人的身高和体重。将身高作为X轴、体重作为Y轴后,100个样本可能形成一个明显倾斜的椭圆形数据云。
虽然我们有两个变量,但这两个变量并不是完全独立的。身高较高的人往往也更重,因此两个变量携带了一部分重复信息。
如果我们沿着数据云最长的方向画一条新坐标轴,那么绝大多数数据点都可以比较好地投影到这条线上。
这条轴就是PC1。
如果PC1已经解释了数据中95%的变异,那么原来的两个变量就可以在很多探索性分析中近似用一个维度来表示。
PCA真正做的事情,就是把这个思想从二维推广到几十维、几百维甚至更高维。
例如,一个数据集原本有100个变量,PCA可能发现:
- PC1解释35%的变异;
- PC2解释20%的变异;
- PC3解释12%的变异;
- PC4解释8%的变异。
那么前4个主成分已经解释了75%的总体变异。
这时,我们就可以把原来的100维数据投影到PC1–PC2、PC1–PC3等低维空间中,从而获得直观的二维或三维图形。
这也是为什么PCA经常被用于高维数据可视化。
PCA中最重要的几个概念
主成分(Principal Component)
主成分是原始变量经过线性组合后得到的新变量。
PC1并不是某一个原始变量,而是所有变量按照不同权重组合出来的一个新轴。
例如:
[
PC1=0.52X_1+0.48X_2-0.11X_3+0.67X_4
]
其中每个变量对应的系数反映了它对这个主成分的贡献方向和大小。
特征值(Eigenvalue)
每一个主成分都有一个对应的特征值。
特征值可以理解为该主成分所解释的变异量。
如果:
[
\lambda_1=5.2
]
[
\lambda_2=2.8
]
那么PC1解释的数据变异大于PC2。
如果使用的是标准化后的数据,并且有10个变量,那么总方差通常可以表示为10,PC1解释的方差比例大致为:
[
\frac{5.2}{10}=52%
]
这就是为什么PCA图的坐标轴经常写成:
PC1 (52.0%)
PC2 (28.0%)
括号里的百分比就是对应主成分解释的方差比例。
载荷(Loadings)
Loadings是解释PCA结果时最重要的指标之一。
简单来说,载荷反映原始变量与主成分之间的关系。
如果某个变量在PC1上的loading较大,说明这个变量与PC1之间具有较强关系。
例如:

那么可以认为Gene A和Gene B主要与PC1相关,而Gene C和Gene D主要与PC2相关。
但需要注意,loading的正负号本身并没有绝对意义。PCA的坐标轴可以整体翻转,因此PC1的正方向和负方向并不是具有固定生物学意义的“正面”和“负面”。
科研论文中更重要的是观察变量之间的相对关系,而不是机械地解释“正号代表增加、负号代表减少”。
Scores(得分)
如果loading告诉我们“变量如何构成主成分”,那么score则告诉我们“每个样本在主成分空间中的位置”。
因此:
Loading主要描述变量。
Score主要描述样本。
PCA散点图中每一个点通常就是一个样本的score。
如果两个样本在PCA图中距离较近,说明它们在当前主成分空间中的整体特征比较相似;如果距离较远,则说明它们的整体多变量特征存在较大差异。
PCA分析前为什么经常要标准化?
这是实际做PCA时非常重要的一步。
假设一个研究有两个变量:
- 年龄:20–80岁;
- 收入:2,000–200,000元。
如果直接进行PCA,收入的数值尺度远大于年龄,它可能对协方差矩阵产生非常大的影响。
这时候,研究者通常需要考虑标准化。
最常见的方法是Z-score:
[
Z=\frac{X-\mu}{\sigma}
]
即减去变量的均值,再除以标准差,使变量变成均值为0、标准差为1。
标准化后,不同变量可以在相对一致的尺度上参与PCA。
但这里有一个重要原则:
不是所有PCA都必须标准化。
如果所有变量本身使用相同单位,并且变量尺度具有明确的实际意义,直接使用协方差矩阵可能是合理的。
如果变量单位、数量级差异很大,使用相关矩阵或先进行标准化通常更加合适。
因此,在论文Methods中最好明确说明:
The data were centered and scaled before principal component analysis.
而不要简单写一句:
PCA was performed.
因为是否标准化可能会明显影响PCA结果。
需要特别注意的是,不同软件对PCA的默认处理并不完全一样。例如,scikit-learn的PCA会进行中心化,但默认不会自动进行feature scaling,因此研究者如果需要标准化,应在PCA之前单独进行处理。
什么情况下适合使用PCA?
PCA特别适合以下几类科研问题。
高维数据探索
当变量数量较多,而研究者希望快速了解整体数据结构时,PCA非常有价值。
例如:
- 转录组数据;
- 代谢组数据;
- 蛋白质组数据;
- 微生物组数据;
- 临床多指标数据;
- 环境监测数据;
- 多维表型数据。
变量之间存在相关性
PCA尤其适合变量之间存在明显相关性的情况。例如血压、BMI、腰围、血脂等变量可能携带一定程度的共同信息。PCA可以把这些高度相关的信息压缩到少数几个综合维度中。
希望观察样本整体结构
例如研究者想知道:肿瘤组织与正常组织的整体分子特征是否存在差异?或者:不同处理组的代谢谱是否出现明显分离?PCA可以作为非常有价值的第一步探索工具。
什么情况下不应该只依赖PCA?
PCA非常有用,但它并不是“万能的分组分析方法”。最常见的误区就是:“PCA图中两个组分开了,所以两组存在显著差异。”这个结论通常是不严谨的。PCA是无监督方法,其目标是解释总体方差,而不是最大化组间差异。因此,如果组间差异只存在于低方差方向,那么即使两个组确实存在重要差异,PC1和PC2也可能看不出来。
反过来,PCA图出现明显分离,也不一定代表这种分离具有统计学意义或生物学意义。因此,PCA更适合作为探索性分析,而不是单独作为组间假设检验。如果研究问题明确是“不同组是否存在差异”,通常还需要根据研究设计采用适当的统计方法。
PCA图到底怎么看?
科研论文中最常见的PCA图一般是PC1–PC2散点图。
下图来自一项代谢组学研究。研究者通过PCA比较不同葡萄糖处理条件下细胞的整体代谢特征。图中横轴为PC1,纵轴为PC2,每个点代表一个样本,不同颜色和符号代表不同处理条件。可以看到,不同处理组在PCA空间中呈现出不同程度的聚集和分离,这正是科研论文中最常见的PCA score plot形式。
(以上图片,来自scientific reports上论文:Metabolomic Changes of Human Proximal Tubular Cell Line in High Glucose Environment)

这项研究分析了90份血浆样本,将正常糖耐量(NGT)、2型糖尿病(T2D)和糖尿病肾病(T2D-DN)三个群体绘制在PC1–PC2空间中。也就是说,读者可以非常直观地看到三个医学研究群体如何分布在PCA图中。
看样本点之间的距离
每一个点通常代表一个样本。
距离较近的样本,在当前主成分空间中的整体特征比较相似;距离较远则意味着整体特征存在更明显差异。
如果同一组样本聚集在一起,说明该组内部具有较强的一致性。
如果某个样本远离其他样本,则需要进一步检查它是否属于:
- 真正的生物学差异;
- 技术批次问题;
- 样本处理异常;
- 测量错误;
- 极端值。
看不同组是否分离
如果实验组集中在PC1的右侧,对照组集中在左侧,可以说明两组样本在PC1所代表的主要变异方向上存在明显差异。
但是,不应该直接把这种视觉上的分离描述为“统计学显著”。
更加严谨的写法是:
PCA revealed a clear separation between the treatment and control groups.
而不是:
PCA demonstrated a statistically significant difference between the two groups.
后一句需要额外的统计检验支持。
看PC1和PC2解释了多少变异
这是判断PCA图信息量的重要指标。
如果:
PC1 = 65%
PC2 = 20%
那么二维图解释了85%的总体变异,通常具有较好的代表性。
但如果:
PC1 = 18%
PC2 = 12%
那么PC1–PC2只解释30%的变异。
此时图中显示的结构只是整个数据结构的一部分,不能把二维图当成完整数据结构。
Scree Plot:如何决定保留几个主成分?
如果变量较多,仅凭PC1和PC2并不足以判断应该保留多少个主成分。
这时可以绘制 Scree Plot(碎石图)。
横轴是主成分编号,纵轴是对应的特征值或解释方差。
通常会看到前几个主成分的解释能力下降较快,随后逐渐趋于平缓。
这个“拐点”可以作为判断保留多少个主成分的参考。
例如:
PC1:40%
PC2:25%
PC3:15%
PC4:8%
PC5:4%
PC6:3%
……
如果PC4以后解释的变异已经明显下降,那么研究者可能重点关注前几个主成分。
不过,“看到拐点就机械地保留拐点之前的PC”并不是唯一标准。实际研究中还可以结合累计解释方差、研究目的以及其他方法综合判断。Scree plot本身主要是辅助判断工具。
Biplot:同时观察样本和变量
PCA还有一种非常重要的图叫 Biplot(双标图)。
普通PCA score plot主要告诉我们样本的位置。
Biplot则试图同时展示:
- 样本;
- 变量。
因此,它能够回答一个更深入的问题:
“为什么这些样本会在PCA图上分开?”
例如,如果某一组样本位于PC1正方向,而某些变量的loading箭头也指向PC1正方向,那么可以进一步推测这些变量与该组样本的特征模式相关。
变量箭头之间的夹角也可以提供关于变量关系的直观信息。在经典biplot解释中,变量向量之间的角度与其相关结构存在联系,但具体解释需要考虑biplot所采用的缩放方式。
因此,不能简单地说:
“两个箭头越近,两个变量的表达量越高。”
更准确的说法应该是:
在相应的PCA投影和缩放方式下,两个变量呈现较强的正相关结构。
案例:代谢组学中的PCA
假设我们进行一项代谢组学实验。
研究对象包括:
- 10个健康对照样本;
- 10个疾病组样本;
- 每个样本检测200种代谢物。
原始数据就是:
20个样本 × 200个代谢物
直接观察这张表几乎无法理解样本之间的整体关系。
研究者首先对数据进行适当的数据预处理,例如根据数据特点进行变换、缺失值处理,并在需要时进行中心化和标准化。
随后进行PCA。
假设得到:
- PC1:38.5%
- PC2:21.4%
- PC3:10.2%
那么PC1和PC2已经解释了:
[
38.5%+21.4%=59.9%
]
的总体变异。
如果绘制PC1–PC2图之后发现,健康组大多聚集在左侧,而疾病组大多位于右侧,那么可以初步说明两组样本在代谢谱整体结构上存在明显差异。
但这还不是故事的终点。
进一步观察loading,可以发现:
- Metabolite A对PC1具有较高正loading;
- Metabolite B同样具有较高正loading;
- Metabolite C具有较高负loading。
那么研究者就可以进一步分析这些代谢物是否与疾病状态、代谢通路或相关生物学机制有关。
这就体现了PCA真正的价值:
从“很多变量” → “少数主成分” → “观察样本结构” → “寻找驱动这种结构的变量”。
PCA在转录组学中的应用
在RNA-seq等高维表达数据中,PCA也非常常见。
例如:
研究者有:
- Control 1–6;
- Treatment 1–6。
经过表达矩阵预处理后进行PCA。
如果Control样本集中在一起,而Treatment样本集中在另一侧,研究者可以通过PCA快速观察:
- 两组样本整体表达模式是否存在差异;
- 生物学重复之间是否具有较好一致性;
- 是否存在明显离群样本;
- 是否可能存在batch effect;
- 哪些主要变异方向与实验处理相关。
因此,在RNA-seq差异表达分析中,PCA往往不是最终分析,而是帮助研究者检查数据质量和整体结构的探索性步骤。
PCA还可以用于发现批次效应
这是PCA在实验研究中特别实用的一个场景。
假设研究中有两个实验批次:
Batch 1:
- Control A
- Treatment A
Batch 2:
- Control B
- Treatment B
如果PCA结果发现样本主要按照Batch 1和Batch 2分开,而不是按照Control和Treatment分开,那么研究者就需要警惕:
batch effect(批次效应)可能比实验处理本身造成了更大的变异。
这时候,PCA就不仅仅是一张“漂亮的图”,而成为数据质量控制的重要工具。
当然,PCA本身不能证明存在batch effect,它只能提示一个值得进一步调查的模式。
研究者还需要结合实验设计、批次信息以及后续统计分析进行判断。
PCA具体怎么画?
PCA可以通过R、Python、SPSS、Origin、GraphPad Prism以及许多专业组学软件完成。不同软件界面不同,但基本流程高度一致。
第一步:整理数据矩阵
最基本的数据结构是:

一般情况下:
行 = 样本
列 = 变量
这是进行PCA时首先需要明确的问题。
第二步:检查数据质量
正式PCA之前,需要检查:
- 缺失值;
- 极端值;
- 数据分布;
- 不同变量的量纲;
- 是否存在明显的批次效应;
- 样本数量是否合理。
PCA对异常值可能比较敏感,因此不能把PCA当成数据质量检查的替代品。
第三步:决定是否进行变换和标准化
如果不同变量量纲差异明显,可以考虑standardization。
对于组学数据,还可能需要根据具体数据类型进行log transformation、归一化等处理。
这里不能简单套用一种“万能预处理流程”,而应该根据数据生成机制和研究领域确定。
第四步:计算PCA
从数学角度来看,PCA可以通过协方差矩阵或相关矩阵的特征值分解实现,也可以通过奇异值分解(Singular Value Decomposition,SVD)实现。
现代统计软件通常会使用SVD等数值方法完成计算。
例如,scikit-learn中的PCA就是通过SVD框架实现的。
第五步:查看解释方差
获得PC1、PC2、PC3……之后,需要查看每个主成分解释的方差比例。
例如:

此时PC1+PC2解释61.7%的变异。
第六步:绘制Score Plot
最常见的是:
PC1 vs PC2
每一个点代表一个样本。
可以按照实验组进行颜色或形状编码,例如:
- Control;
- Treatment;
- Disease;
- Healthy。
这样可以直观观察不同样本群体之间的整体结构。
第七步:进一步绘制Loading Plot或Biplot
如果希望知道:
“哪些变量造成了这种分离?”
就需要进一步查看loading。
这一步对于科研解释尤其重要。
只给出一张PCA散点图,而完全不分析loadings,往往只能回答“样本是否呈现某种结构”,却不能很好地回答“这种结构由什么变量驱动”。
R语言绘制PCA的基本思路
如果使用R进行PCA,最经典的方法之一是prcomp()。
例如:
pca <- prcomp(data, center = TRUE, scale. = TRUE)
summary(pca)
plot(pca$x[,1], pca$x[,2],
xlab = "PC1",
ylab = "PC2")
其中:
center = TRUE表示进行中心化;
scale. = TRUE表示进行标准化。
之后可以根据实验组添加颜色、标签和置信椭圆等元素。
在正式论文中,通常还需要进一步优化字体、点形状、图例、坐标轴和注释,使其满足期刊的图表规范。
Python如何进行PCA?
Python中可以使用scikit-learn。
基本流程是先标准化,再进行PCA:
from sklearn.preprocessing import StandardScaler
from sklearn.decomposition import PCA
X_scaled = StandardScaler().fit_transform(X)
pca = PCA(n_components=2)
X_pca = pca.fit_transform(X_scaled)
print(pca.explained_variance_ratio_)
explained_variance_ratio_可以用来查看PC1、PC2分别解释了多少方差。
需要注意,scikit-learn中的PCA本身会进行中心化,但不会默认把每个变量缩放到单位方差,因此如果研究设计需要标准化,应在PCA前明确使用StandardScaler等方法。
如何判断一张PCA图画得好不好?
一张适合论文发表的PCA图,不只是“能看到几个点”。至少应该注意以下几个方面。
首先,坐标轴应该明确标注PC1和PC2,并给出解释方差比例。
其次,不同实验组应该具有清晰、统一的视觉编码,并提供完整图例。
第三,如果使用置信椭圆(confidence ellipse),应该明确其统计含义,而不是把椭圆简单当成“组别范围”。
第四,样本名称、组别、批次等信息应该根据研究目的合理标注,避免标签重叠。
第五,如果存在离群样本,不应该为了让图片“更好看”而随意删除。是否剔除样本必须有明确的实验或统计依据。
PCA分析中最常见的几个误区
误区一:PCA分开了,就说明组间差异显著
这是最常见的错误。
PCA主要描述总体变异结构,不是传统意义上的组间显著性检验。
因此,PCA分离可以作为探索性证据,但不能单独代替统计检验。
误区二:PC1就是“最重要的变量”
PC1不是一个变量,而是多个变量的线性组合。
“PC1最重要”真正指的是:
PC1解释了最大的总体方差。
这和“某个变量最重要”不是同一个概念。
误区三:PC1解释率越高越好
PC1解释60%的变异并不意味着分析一定比PC1只解释30%的分析“更好”。
解释方差取决于数据本身的结构。
研究者真正需要关注的是:这些主成分是否能够帮助回答研究问题。
误区四:PCA图上的距离就是原始数据中的真实距离
PCA图通常只是把高维数据投影到二维空间。
因此,二维图中的距离并不能完全代表原始高维空间中的所有关系。
尤其当PC1和PC2只解释了较低比例的总体变异时,更不能过度解读二维图。
误区五:忽略数据预处理
不同的数据标准化、变换方式可能得到不同的PCA结构。
因此,论文中应该明确说明:
- 数据是否中心化;
- 是否标准化;
- 使用协方差矩阵还是相关矩阵;
- 是否进行了log transformation;
- 缺失值如何处理。
这些信息直接影响结果的可重复性。
PCA与其他降维方法有什么区别?
PCA并不是唯一的降维方法。
例如常见的方法还有:
t-SNE(t-distributed Stochastic Neighbor Embedding)
更加关注局部邻域结构,经常用于高维生物信息学数据可视化。
UMAP(Uniform Manifold Approximation and Projection)
可以较好地保留局部结构,同时在一定程度上兼顾全局结构,因此近年来在单细胞数据分析中非常常见。
MDS(Multidimensional Scaling)
主要从样本之间的距离或相似性出发寻找低维表示。
这些方法的目标并不完全相同。
PCA最大的优势在于:数学结构清晰、计算快速、结果容易解释,而且是一种经典的线性降维方法。
因此,在面对高维数据时,PCA通常仍然是非常值得首先尝试的方法之一。
PCA、聚类和机器学习不要混为一谈
科研文章中经常同时看到:
PCA + clustering
但这两个方法解决的是不同问题。
PCA:
“数据整体结构是什么样的?”
聚类:
“哪些样本可以被划分为相似的群体?”
分类模型:
“已知组别之后,能否预测一个新样本属于哪个组?”
因此,PCA可以作为聚类或机器学习之前的数据探索和可视化工具,但它本身并不是聚类算法,也不是分类器。
如何在论文中报告PCA?
一篇规范的论文至少应该交代:
数据是什么
例如:
PCA was performed on the normalized metabolite abundance matrix.
数据如何预处理
例如:
The variables were mean-centered and scaled to unit variance before PCA.
使用了哪些主成分
例如:
The first two principal components were used for visualization.
解释了多少变异
例如:
PC1 and PC2 explained 38.5% and 21.4% of the total variance, respectively.
发现了什么
例如:
Samples from the treatment group showed a distinct distribution from those in the control group.
如果PCA只是探索性分析,还应避免把视觉上的分离直接写成“statistically significant”。
学习资料
对于希望深入理解PCA原理的科研人员,可以进一步阅读Jolliffe的经典专著 Principal Component Analysis;

对于实际数据分析,可以参考NIST关于Principal Components的统计说明以及scikit-learn的PCA官方文档。PCA综述文章则适合进一步理解biplot、SVD以及不同PCA变体。
