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()