1. 什么是PCA?

PCA(principal component analysis)中文称作主成分分析。是一种降维方法。在生物学数据中,每个样本都有成千上万个基因的测量指标,每个基因就是一个特征(也可称为维度),因此该数据就有成千上万个特征/维度。我们肉眼无法对那么高维度的数据进行直观的观察,挑选几个最重要的维度可以直观地考察样本之间最重要的区别,这几个最重要的维度就是“主成分”。

解读:

横坐标,第一主成分及贡献率:贡献率最高的主成分,贡献率是该主成分的方差在整体方差中的占比,占比越高,代表总体数据的权重越高。纵坐标,第二主成分及贡献率:贡献率次高的主成分。样本:样本在主成分空间中的位置,样本之间距离表示在主成分空间中的差异大小。如果样本之间聚集在一起,说明这些样本差异性小;反之样本之间距离越远,说明样本之间差异性越大。分组信息:根据实验需求设置的样本分组,在图中按不同颜色区分以明显看出不同组间的差别。样本分布的置信区间:圆圈表示95%置信区间内的样本分组。圆圈大小反映样本点分布集中程度,而圆圈之间的距离则体现了样本组之间的离散程度。

2. 如何理解PCA分析

为了更好地区分样本,挑选最重要主成分/维度的过程不是直接按现有的特征/维度去挑选,而是进行一些数学变换。我们用一个二维数据(人的身高和体重这两个特征)去理解这过程。下表是AI随机生成的3个男性和3个女性的身高和体重的数据:

我们想要在图上展示,可以通过身高体重的二维散点图进行展示,如A图。

同样,我们用PCA的方法处理这数据,得到B图:

比较散点图和PCA图,我们发现这两者只是做了空间变换,但相对空间位置是一样的。PCA图将大部分的差异集中在PC1中(99.6%的贡献度),而PC2中只有0.4%的贡献度。

把身高、体重等指标换成每个基因的表达量,就是我们常见的生物学数据。

理论上来说,n维的空间可以得到不超过n个主成分,但由于人类的视觉最多只能观察3维的数据,因此PCA一般只展示二维或三维的结果。

3. 绘图数据:

demo数据可以在这里下载BioLadder v2.0-生物信息在线分析云平台

3.1. 样本-基因表达量定量矩阵表数据

来源一般是搜库结果定量表。包含2个维度的数据,一般情况下,每一行是一个基因,每一列是一个样本。数值为基因在各个样本中的表达量。做PCA分析所需的数据一般是经过预处理的,且不能含有缺失值。

3.2. 分组信息

第一列是样本名,第二列是分组名字。

4. 绘制PCA图的方法

4.1. BioLadder v2.0 云平台在线分析绘图

BioLadder v2.0 是一个在线绘图平台,我们只需要上传数据,系统自动生成图表,不需要写代码,适合0代码基础的同学。网址:BioLadder v2.0-生物信息在线分析云平台

4.2. R语言绘制PCA图

喜欢自己写代码的同学,也附上R语言代码可供参考。

# 代码来源:https://www.r2omics.cn/

# 加载R包,没有安装请先安装 install.packages("包名")

library(ggplot2)

library(ggbiplot)

# ggbiplot包需要从github上下载

# install.packages("devtools")

# library(devtools)

# install_github("vqv/ggbiplot")

# 读取PCA数据文件

df = read.delim("https://www.r2omics.cn/res/demodata/PCA/data.txt",# 这里读取了网络上的demo数据,将此处换成你自己电脑里的文件

header = T, # 指定第一行是列名

row.names = 1 # 指定第一列是行名

)

df=t(df) # 对数据进行转置,如果想对基因分组则不用转置

# 读取样本分组数据文件

dfGroup = read.delim("https://www.r2omics.cn/res/demodata/PCA/sample.class.txt",

header = T,

row.names = 1

)

# PCA计算

pca_result <- prcomp(df,

scale=T # 一个逻辑值,指示在进行分析之前是否应该将变量缩放到具有单位方差

)

# 绘图

ggbiplot(pca_result,

var.axes=F, # 是否为变量画箭头

obs.scale = 1, # 横纵比例

groups = dfGroup[,1], # 添加分组信息,为分组文件的第一列

ellipse = T, # 是否围绕分组画椭圆

circle = F)+

geom_text( # geom_text一个在图中添加标注的函数

aes(label=rownames(df)), # 指定标注的内容为数据框df的行名

vjust=1.5, # 指定标记的位置,vjust=1.5 垂直向下1.5个距离。 负数为位置向上标记,正数为位置向下标记

size=2 # 标记大小

)+

theme_bw()