重生之我在剑桥大学学习单细胞RNA-seq分析——5. scRNA-seq数据的基本质量控制 (QC) 和探索(2)

5.2 数据可视化与降维
5.2.1 简介
在本章中,我们将继续使用上一章生成的过滤后的Tung数据集。我们将探索可视化数据的不同方式,以便评估质控步骤后表达矩阵发生的变化。scater包提供了几个非常有用的函数来简化可视化。
单细胞RNA测序的一个重要方面是消除批次效应。批次效应是在处理过程中添加到样本中的技术噪音。例如,如果两组样品是在不同的实验室中准备的、甚至在同一实验室的不同日期准备的,那么我们可能会观察到同时处理的样品之间有更大的相似性。在最坏的情况下,批次效应可能会被误认为是真正的生物变异。Tung的数据使我们能够以可控的方式探索这些问题,因为样本处理方式的一些突出的方面已被记录下来。理想情况下,我们希望看到来自同一个体的批次聚集在一起,并且每个个体对应不同的组。<
让我们创建另一个SingleCellExperiment对象umi.qc,删除不必要的低表达基因和低质量的细胞。

> umi.qc <- umi[! rowData(umi)$discard,! colData(umi)$discard]

5.2.2 PCA作图
全览数据的最简单方法是使用主成分分析对其进行转换,然后可视化前两个主成分。
主成分分析(PCA)是一种统计过程,它将一组观测值转换为一组线性不相关(正交)的变量,称为主成分(PC)。主成分的数量小于或等于原始变量的数量。
从数学上来说,PC对应于协方差矩阵的特征向量。特征向量按特征值排序,以便第一个主成分尽可能多地解释数据中的变异性,并且每个后续PC在与前一个PC正交的前提下依次具有最高的方差。<

PCA降维示意图

5.2.2.1 QC前
如果没有进行对数变换或标准化,PCA图就无法按重复或个体分离数据集。测序深度具有重要影响——具有大量高表达基因的样本(细胞)主导着PC:

> umi <- runPCA(umi, exprs_values = "counts")
> dim(reducedDim(umi, "PCA"))
[1] 864  50
> plotPCA(umi, colour_by = "batch", size_by = "detected", shape_by = "individual")
Tung数据的PCA图(原始counts)

通过对数变换,我们均衡了高表达和低表达基因之间的巨大差异,并看到细胞按重复、个体和测序深度分组。当重新运行PCA时,umi中的reducedDim对象将被覆盖。

> umi <- runPCA(umi, exprs_values = "logcounts_raw")
> dim(reducedDim(umi, "PCA"))
[1] 864  50
> plotPCA(umi, colour_by = "batch", size_by = "detected", shape_by = "individual")
Tung数据的PCA图(非标准化logcounts)

显然,对数变换对我们的数据是有益的——它减少了第一个主成分的方差并且分离了一些生物学效应。此外,它使表达值的分布更加正常。在以下分析和章节中,将默认使用logcounts_raw
但是,仅进行对数转换不足以解释细胞之间的技术误差(例如测序深度)。因此,请不要使用logcounts_raw进行下游分析,而是使用SingleCellExperiment对象的logcounts,它不仅进行了对数转换,还按文库大小进行了归一化(例如CPM归一化)。在课程中,我们仅将logcounts_raw用于演示目的。
5.2.2.2 QC后
使用umi.qc数据而不是umi进行与上述相同的分析:

> umi.qc <- runPCA(umi.qc, exprs_values = "logcounts_raw")
> dim(reducedDim(umi.qc, "PCA"))
[1] 670  50
> plotPCA(umi.qc, colour_by = "batch", size_by = "detected", shape_by = "individual")
Tung数据的PCA图(非标准化logcounts,QC过滤后)

与上图相比,经过QC后,NA19098.r2(橙色圆)细胞不再形成异常值组。
默认情况下,scater仅使用变异最大的前500个基因来计算PCA,可以通过ntop参数来调整。
5.2.3 tSNE图
用于可视化scRNA-seq数据的替代方法是tSNE图。tSNE(t-Distributed Stochastic Neighbor Embedding)将降维结果(例如PCA)与最近邻网络上的随机游走相结合来将高维数据(即示例的14,154维表达矩阵)映射到二维空间,同时保留细胞之间的局部距离。与PCA相比,tSNE是一种随机算法,这意味着在同一数据集上多次运行该方法将产生不同的结果。由于算法的非线性和随机性,tSNE难以直观地解释。为了确保可重复性,我们在以下代码中指定了随机数生成器的“种子”,以便我们始终获得相同的结果。
5.2.3.1 QC前

> set.seed(123456)
> umi <- runTSNE(umi, exprs_values = "logcounts_raw", perplexity = 130)
> plotTSNE(umi, colour_by = "batch", size_by = "detected", shape_by = "individual")
Tung数据的tSNE图

5.2.3.2 QC后

> set.seed(123456)
> umi.qc <- runTSNE(umi.qc, exprs_values = "logcounts_raw", perplexity = 130)
> plotTSNE(umi.qc, colour_by = "batch", size_by = "detected", shape_by = "individual")
Tung数据的tSNE图

解释PCA和tSNE图通常具有挑战性,并且由于随机性和非线性性质,它们不太直观。在这个例子中,很明显它们产生了类似的图像。对比上面的PCA图,再次清楚地表明,经过QC过滤后NA19098.r2样本不再是异常值。
此外,tSNE要求提供一个困惑度(perplexity)参数,该参数反映了用于构建最近邻网络的最近邻数量,高困惑度会创建一个密集的网络,使细胞聚集在一起,而低困惑度会使网络变得更加稀疏,从而使细胞群彼此分离。scater使用默认的困惑度,即总细胞数除以五(向下取整)。
可以在http://distill.pub/2016/misread-tsne/阅读有关使用tSNE的更多信息。最近的一篇题为《The art of using t-SNE for single-cell transcriptomics》的文章讨论了tSNE和UMAP之间的异同,文章发现大多数观察到的差异是由于初始化造成的,并在可视化不同大小的scRNA-seq数据集时给出了参数调整的建议。

往期内容:
重生之我在剑桥大学学习单细胞RNA-seq分析——4. 使用Bioconductor进行scRNA-seq分析(1)
重生之我在剑桥大学学习单细胞RNA-seq分析——4. 使用Bioconductor进行scRNA-seq分析(2)
重生之我在剑桥大学学习单细胞RNA-seq分析——5. scRNA-seq数据的基本质量控制 (QC) 和探索(1)

©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容