重生之我在剑桥大学学习单细胞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)

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 214,444评论 6 496
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 91,421评论 3 389
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 160,036评论 0 349
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 57,363评论 1 288
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 66,460评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,502评论 1 292
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,511评论 3 412
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,280评论 0 270
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,736评论 1 307
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,014评论 2 328
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,190评论 1 342
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,848评论 5 338
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,531评论 3 322
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,159评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,411评论 1 268
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,067评论 2 365
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,078评论 2 352

推荐阅读更多精彩内容