重生之我在剑桥大学学习单细胞RNA-seq分析——4. 使用Bioconductor进行scRNA-seq分析(1)

问题
如何将单细胞数据导入 R?
不同类型的数据/信息(例如细胞信息、基因信息等)是如何存储和操作的?
如何获得细胞和基因的基本汇总指标并相应地过滤数据?
如何直观地探索这些指标?
学习目标:
了解单细胞数据如何存储在Bioconductor SingleCellExperiment对象中。
从处理后的scRNA-seq count数据创建一个SingleCellExperiment对象。
访问SingleCellExperiment对象的不同部分,例如rowDatacolDataanalysis
从矩阵中获取几个汇总指标,以汇总跨细胞或基因的信息。
通过构建逻辑向量并使用[运算符对对象进行子集化,将基本过滤器应用于数据。
直接从存储在SingleCellExperiment对象中的数据生成基本的数据可视化。

在本章中,我们将开始对分析中使用到的核心包进行实际介绍。
我们将使用芝加哥大学Yoav Gilad实验室中来自三个不同个体(Tung et al. 2017)的诱导多能干细胞数据集。实验在Fluidigm C1平台上进行,使用唯一分子标识符(UMI)进行定量。数据文件位于工作目录中的data/tung文件夹中。原始文件位于GEO中GSE77288(GSE77288_molecules-raw-single-per-sample.txt.gz)。

注意:
这些数据缺少以下几点:
稀疏矩阵。由于使用的是tung数据集,因此我们只得到一个常规矩阵。如果我们决定使用10x数据集,那么引入它可能会更容易。
rowData - 没有包含任何基因注释,尽管也可以轻松地包含它,例如有关哪些基因是核基因或线粒体基因的信息。

4.1 scRNA-seq分析软件包
有几种软件包(或软件“生态”)可用于单细胞分析。在本课程中,我们将重点介绍Bioconductor项目中的一组软件包。
Bioconductor是专为生物分析开发的R软件包库。它拥有一系列出色的scRNA-seq分析软件包,这些软件包在《使用Bioconductor进行单细胞分析》一书中进行了总结。Bioconductor的优点在于它对包提交有严格的要求,包括在每个平台上的安装以及带有教程的完整文档,解释如何使用该包。Bioconductor还鼓励使用标准数据结构/类和编码风格/命名约定,以便理论上可以将包和分析组合成大型流程或工作流。具体来说,对于scRNA-seq,使用的标准数据对象称为SingleCellExperiment,我们将在本节中详细了解它。
Seurat是另一个流行的R软件包,它使用自己的数据对象Seurat。Seurat软件包包含大量函数和出色的文档。由于其受欢迎程度,如今其他几个软件包也与Seurat对象兼容。虽然这不是本课程的重点,但我们有一个部分说明了使用此包的分析工作流程:使用Seurat分析scRNA-seq。
Scanpy是一个流行的scRNA-seq分析的python包,它将数据存储在名为AnnData的对象中。与Seurat和Bioconductor类似,开发人员可以为与AnnData包兼容的主包编写扩展,从而允许社区扩展其功能。
虽然我们主要关注Bioconductor包,但我们将在本课程中学习的概念适用于其他替代方案,主要变化的是所使用的确切语法。
4.2 SingleCellExperiment对象
表达数据通常存储在定量后的特征x细胞表达矩阵中。在scRNA-seq分析中,我们通常从count矩阵开始分析,代表每个细胞中特征的read/UMI的数量,特征可以是基因、异构体或外显子等。通常,分析是在基因层面进行的,这也是我们在本课程中将重点关注的。
除了定量矩阵之外,还可能有每个基因的信息(例如它们的基因组位置、它们属于哪种基因、它们的长度等)以及细胞的信息(例如,其来源组织、患者捐赠者、处理批次、疾病状况、治疗暴露等)。
我们还可以根据原始count数据生成其他矩阵,例如标准化count矩阵。最后,由于单细胞实验数据维度非常高,我们经常采用降维技术来捕捉较低维度数据中的主要变化。
SingleCellExperiment(简称SCE)是一个以同步方式存储所有这些信息的对象。可以通过特殊函数访问该对象的不同部分:

  • 可以通过assayassays函数来访问一个或多个表达矩阵。
  • 可以使用rowData函数获取有关基因的信息。
  • 可以通过colData函数访问有关细胞的信息。

其中一些数据存储在具有相似名称的插槽中,可以通过@运算符访问,但使用访问器函数被认为是一种更好的编程风格。

SingleCellExperiment对象。特征(例如基因、异构体或外显子)存储为行,其元数据位于rowData中。细胞以列的形式存储,其元数据存储在colData中。表达矩阵存储在assay中。细胞的降维投影存储在reducedDim中。

4.2.1 创建SCE对象
测试数据下载地址:https://singlecellcourse.cog.sanger.ac.uk/index.html?shared=data/
首先,根据数据创建一个SingleCellExperiment对象。data/tung中有两个文件:

  • counts.txt—— 一个制表符分隔的文本文件,包含每个基因/细胞的基因计数。
  • annotation.txt—— 带有细胞注释的制表符分隔的文本文件。

使用read.table()函数将它们读入R:

> tung_counts <- read.table("data/tung/molecules.txt", sep = "\t")
> tung_annotation <- read.table("data/tung/annotation.txt", sep = "\t", header = TRUE)

现在可以使用同名函数创建一个SingleCellExperiment对象:

> library(SingleCellExperiment)
> tung <- SingleCellExperiment(
  assays = list(counts = as.matrix(tung_counts)),
  colData = tung_annotation
)
> rm(tung_counts, tung_annotation)

如果我们打印该对象的内容,我们将得到一些有用的信息:<

> tung
class: SingleCellExperiment 
dim: 19027 864 
metadata(0):
assays(1): counts
rownames(19027): ENSG00000237683 ENSG00000187634 ... ERCC-00170
  ERCC-00171
rowData names(0):
colnames(864): NA19098.r1.A01 NA19098.r1.A02 ... NA19239.r3.H11
  NA19239.r3.H12
colData names(5): individual replicate well batch sample_id
reducedDimNames(0):
altExpNames(0):
  • 共有19027个基因(行)和864个细胞(列)。
  • 有一个名为“counts”的assay。
  • 提供了一些基因名称(“rownames”)和细胞名称(“colnames”)的预览。
  • 没有基因元数据(“rowData”为空)。
  • 可以看到细胞的一些元数据(“colData”)。

要访问SCE对象的不同部分,可以使用以下访问器函数:

命名Assay
我们可以随意给assay取名。不过,需要遵循一些惯例:

  • counts:原始计数数据,例如特定基因的read数或转录本数。
  • normcounts:与原始计数具有相同尺度的标准化值。例如,counts除以以1为中心的细胞特定尺度因子。
  • logcounts:对数转换计数或类似计数的值。在大多数情况下,定义为对数转换的normcounts,例如使用以2为底的对数和伪计数1。
  • cpm:每百万计数。这是每个细胞中每个基因的read数,除以每个细胞的文库大小(以百万为单位)。
  • tpm:每百万转录本数。这是每个细胞中每个基因的转录本数除以该细胞中的转录本总数(以百万为单位)。

每个assay都有一个函数访问,可以使用counts()函数访问“counts” assay。以下两个操作是等效的:

counts(tung)
assay(tung, "counts")

如上所创建的SingleCellExperiment对象适用于任何场景,只要我们有一个可以读取到文件中的计数矩阵。当然,要读取常用工具cellranger(用于处理10x Chromium数据)的输出,DropletUtils包中有一个专用函数,它简化了导入数据的过程。以下是示例用法:<

> library(DropletUtils)
> sce <- read10xCounts("data/pbmc_1k_raw")
> sce <- read10xCounts("data/pbmc_1k_filtered")

4.2.2 修改SCE对象
要修改SCE对象的某些部分,我们可以使用<-赋值运算符,以及我们想要修改的对象的部分。例如,要创建一个新的assay:assay(sce, "name_of_new_assay") <- new_matrix。下表总结了其他用例。
举个例子,对计数数据进行一个简单的转换,即取以2为底的对数并加上伪计数1(否则 log(0) = -Inf):

> assay(tung, "logcounts") <- log2(counts(tung) + 1)

因为我们将assay命名为“logcounts”,这是常规的名称之一,所以我们可以使用专用函数来访问它:

> logcounts(tung)[1:10, 1:4]
                NA19098.r1.A01 NA19098.r1.A02 NA19098.r1.A03 NA19098.r1.A04
ENSG00000237683       0.000000       0.000000       0.000000              1
ENSG00000187634       0.000000       0.000000       0.000000              0
ENSG00000188976       2.000000       2.807355       1.000000              2
ENSG00000187961       0.000000       0.000000       0.000000              0
ENSG00000187583       0.000000       0.000000       0.000000              0
ENSG00000187642       0.000000       0.000000       0.000000              0
ENSG00000188290       0.000000       0.000000       0.000000              0
ENSG00000187608       1.000000       3.000000       0.000000              2
ENSG00000188157       1.584963       2.000000       1.584963              2
ENSG00000237330       0.000000       0.000000       0.000000              0

以下是修改SCE对象中数据的其他方法的总结:

往期内容:
重生之我在剑桥大学学习单细胞RNA-seq分析——3. 单细胞分析中的R/Bioconductor简介(1)
重生之我在剑桥大学学习单细胞RNA-seq分析——3. 单细胞分析中的R/Bioconductor简介(2)
重生之我在剑桥大学学习单细胞RNA-seq分析——3. 单细胞分析中的R/Bioconductor简介(3)
重生之我在剑桥大学学习单细胞RNA-seq分析——3. 单细胞分析中的R/Bioconductor简介(4)

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

推荐阅读更多精彩内容