|
发表于 2022-7-21 12:05:17
|
查看: 3340 |
回复: 1
本帖最后由 生信喵 于 2022-7-22 17:41 编辑
一、数据降维
单细胞数据中包含很多细胞以及很多基因,是一个较大的数据集,维度较大,需要对数据进行降维。降维就是对原始数据进行特征提取,经常会得到高维度的特征向量。通过降维的方式来寻找数据内部的特性,提升特征表达能力,降低模型的训练成本。
数据降维的目的:数据降维,直观地好处是维度降低了,便于计算和可视化,其更深层次的意义在于有效信息的提取综合及无用信息的摈弃;
数据降维的方法:主要的方法是线性映射和非线性映射方法两大类。
线性降维方法主要包括主成分分析 PCA(Principal component analysis),LDA(Linear Discriminant Analysis),非线性包括 MDS(多维缩放)和 ISOMAP(等度量映射)等。
单细胞数据分析中常用的降维方法包括 PCA,以及 UMAP,tSNE。对多个细胞进行聚类分群。细胞亚群分类是 10X ScRNA-seq 数据分析的核心步骤,不同软件有不同的算法。因为10X ScRNA-seq 数据量大,数据结构复杂,对应的分群算法也比较复杂。
分群的基本原理就是利用基因表达量的信息,计算各个细胞间表达模式的差异度,然后基于一定的标准将所有细胞归为多个亚群(将差异度小于值的细胞归为一个亚群)。
二、PCA 与 tSNE 以及 UMAP 之间比较
PCA:
PCA 是线性降维的方法。以转录组数据为例,PC 的主要目的是从大量基因的表达量信息中,提取对整体基因表达量影响最大的效应(例如,实验处理效应,实验批次效应,异常样本效应等)。这些效应被称为主成分(PC),然后利用主成分绘图。PCA 分析就是将数据中大量基因的信息浓缩到少数几个变量(代表样本中的主要效应)中。而后,只要 2~3 个变量(命名为 PC1,PC2,PC3)就可以代表原来几万个基因含有的大部分信息。那么细胞之间表达量差异,就体现在 PC1、PC2 这些变量数值上的差异。
tSNE:
t-SNE (t-distributed Stochastic Neighbor Embedding)算法是用于降维的一种机器学习算法,由 Laurens van der Maaten 和 Geoffrey Hinton 在 2008 年提出来。t-SNE 是一种用于探索高维数据的非线性降维算法,非常适用于将高维数据降维到二维或者三维,再使用散点图等基
本图表进行可视化。
UMAP:
UMAP ,全称 Uniform Manifold Approximation and Projection,统一流形逼近与投影,是基于曼和几何代数据的理论框架结构构建的。在处理大数据集时,UMAP 优势明显,运行速度块,占用内存小。Etienne Becht 等人 2019 年在 Nature Biotechnology 上发表的一篇文章将其应用在生物学数据上并分析了 UMAP 在处理单细胞数据方面的应用和优势。UMAP 应该说是目前最好的降维算法了,现在的 10X 单细胞的降维图都选择了 UMAP,因为其能最大程度的保留原始数据的特征同时降低特征维数。
tSNE 与 UMAP 三维展示:https://pair-code.github.io/understanding-umap/
tSNE 与 UMAP 三维展示
三、为什么 tSNE 与 UMAP 更适合单细胞数据降维?
PCA 的方法侧重于去抓住样本中隐含的主要效应,从而让差异大的样本在图中呈现较远的距离。在常规 RNA-seq 项目中,一般样本不多,实验处理效应组合数通常不会超过 10 种(例如,2 类病人× 3 个时间点取样 = 6 种处理组合),因此每个实验处理效应在所有因素的总体效应中占比都比较大,属于效应比较大的因素。
另外,实验批次效应,离群样本等也属于比较大的效应。以上的效应都易于被 PCA 获取,因此 PCA 的方法可以良好地去展示常规 RNA-seq 项目中的处理效应、批次效应和离群样本。而单细胞测序,一次测序成千上万个细胞,可以区分出几十种细胞亚群,包括一些稀有的细胞,PCA 则无法对这些样本进行准确区分。
tSNE 算法就属于这种可以同时兼顾局部结构和全局结构的非线性降维可视化算法。
四、PCA 分析数据降维
PCA 分析数据准备,使用 ScaleData()进行数据归一化。进行一种线性转换,对每个基因进行转换,最终所有基因均值为 0,方差为 1。默认只是标准化高变基因(2000 个),速度更快,不影响 PCA 和分群,但影响热图的绘制。如果相对所有基因进行处理,可以通过 features选项修改。
- pbmc <- FindVariableFeatures(pbmc, selection.method = "vst", nfeatures = 22000)
- all.genes <- rownames(pbmc)
- all.genes
- #默认处理2000个基因,添加features对所有基因进行处理
- pbmc <- ScaleData(pbmc,features = all.genes)
- pbmc
- #同时过滤掉不想要的基因组
- # pbmc <- ScaleData(pbmc, vars.to.regress = "percent.mt")
复制代码
五、PCA 分析
- #PCA分析
- pbmc <- RunPCA(pbmc,features = VariableFeatures(object = pbmc))
- #输出前五个PCA结果
- print(pbmc[['pca']],dims = 1:5,nfeatures = 5)
复制代码
六、绘制 PCA
- #PCA可视化,Seurat提供三个函数VizDimReduction(), DimPlot(), DimHeatmap()
- VizDimLoadings(pbmc,dims = 1:2,reduction = "pca")
复制代码
前两个主成分中的基因
绘制 PCA 散点图
- DimPlot(pbmc,reduction = "pca" )
复制代码
第一主成分散点图
绘制两个主成分的热图
- DimHeatmap(pbmc,dims = 1:2,cells = 500,balanced = TRUE,)
复制代码
绘制多个主成分热图
- #绘制15个
- DimHeatmap(pbmc, dims = 1:15, cells = 500, balanced = TRUE)
复制代码
七、非线性降维
7.1 确定数据的分群个数
在进行分群之前,需要首先定义数据集分群个数,这里我们需要选择出主成分的数目,用于后续细胞分类。这里定义的“维度”并不代表细胞类型的数目,而是对细胞分类时需要用到的一个参数。
方法 1:Jackstraw 置换检验算法;重复取样(原数据的 1%),重跑 PCA,鉴定 p-value 较小的PC;计算‘null distribution’(即零假设成立时)时的基因 scores。
- #确定数据的分群个数,比较耗时
- pbmc <- JackStraw(pbmc,num.replicate = 100)
- pbmc <- ScoreJackStraw(pbmc,dims = 1:20)
复制代码 这里我们需要选择出主成分的数目,用于后续细胞分类。这里定义的“维度”并不代表细胞类型的数目,而是对细胞分类时需要用到的一个参数。
- JackStrawPlot(pbmc,dims = 1:15)
复制代码
JackStrawPlot
方法 2:肘部图(碎石图),基于每个主成分对方差解释率的排名。
分群个数这里选择 10,建议尝试选择多个主成分个数做下游分析,对整体影响不大;在选择此参数时,建议选择偏高的数字,些亚群很罕见,如果没有先验知识,很难将这种大小的数据集与背景噪声区分开来。
碎石图检验
JackStraw 和 Elbow 都可以决定数据的“维度”。但是 Elbow 比较直观,我们选择 Elbow 结果进行解读。可以看到,主成分(PC)12 到 15 之间,数据的标准差基本不再下降。所以我们需要在 12 到 15 之间进行选择,(官网的建议10),我们选取 15,即前 15 个主成分用于细胞的分类。
7.2 非线性降维
基于 PCA 空间中的欧氏距离计算 nearest neighbor graph,优化任意两个细胞间的距离权重(输入上一步得到的 PC 维数)。选择不同的 resolution 值可以获得不同的 cluster 数目,值越大 cluster 数目越多,默认值是 0.5。
- #细胞聚类
- pbmc <- FindNeighbors(pbmc,dims = 1:15)
复制代码 接着优化模型,resolution 参数决定下游聚类分析得到的分群数,对于 3K 左右的细胞,设为 0.4-1.2 能得到较好的结果(官方说明);如果数据量增大,该参数也应该适当增大。
- pbmc <- FindClusters(pbmc,resolution = 0.5)
复制代码 使用 Idents()函数可查看不同细胞的分群;
head(Idents(pbmc), 8)
|
本帖子中包含更多资源
您需要 登录 才可以下载或查看,没有账号?立即注册
|