问题
如何将单细胞数据导入 R?
不同类型的数据/信息(例如细胞信息、基因信息等)是如何存储和操作的?
如何获得细胞和基因的基本汇总指标并相应地过滤数据?
如何直观地探索这些指标?
学习目标:
了解单细胞数据如何存储在BioconductorSingleCellExperiment
对象中。
从处理后的scRNA-seq count数据创建一个SingleCellExperiment
对象。
访问SingleCellExperiment
对象的不同部分,例如rowData
、colData
和analysis
。
从矩阵中获取几个汇总指标,以汇总跨细胞或基因的信息。
通过构建逻辑向量并使用[
运算符对对象进行子集化,将基本过滤器应用于数据。
直接从存储在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)是一个以同步方式存储所有这些信息的对象。可以通过特殊函数访问该对象的不同部分:
- 可以通过
assay
或assays
函数来访问一个或多个表达矩阵。 - 可以使用
rowData
函数获取有关基因的信息。 - 可以通过
colData
函数访问有关细胞的信息。
其中一些数据存储在具有相似名称的插槽中,可以通过@
运算符访问,但使用访问器函数被认为是一种更好的编程风格。
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)