前面的学习笔记里,对于scATAC-seq的分析,使用的是signac R包进行的。前几天在一次偶然的机会里,有幸和一个专门做生信的老外聊了聊(纽约某校的PI),从他那里听说ArchR是一个非常强大且值得学习的软件。那么既然专家都这么说了,那必须赶快学起来。我知道网上有关于ArchR的系列教程已经有人写过了,但还是决定自己跟着英文教程过一遍,加深印象~
ArchR是一个用于分析单细胞染色质可接近性数据(scATAC-seq)的功能齐全的R包套件。它能够用于处理数十万个单细胞,无需很大的内存或强大的电脑配置,与商业平台如10x Genomics Chromium系统可实现的实验规模保持同步。
这个官网(here)是一个完整的用户使用手册,是今年5月才更新过的。作者通过所能想到的所有例子来解释如何使用ArchR。还包括了一些关于scATAC -seq分析过程中重点的文档,例如降维和聚类。所有的章节都将使用相同造血细胞数据集Granja* et al. Nature Biotechnology 2019。每一章都将建立在前面的基础上,所以理想情况下你应该从头开始并按顺序执行所有的分析。需要说明的是,这个教程是在本地运行ArchR。(非服务器)
(一)ArchR的安装
安装ArchR:
# install ArchR
# make sure you already installed devtools and BiocManager
devtools::install_github("GreenleafLab/ArchR", ref="master", repos = BiocManager::repositories())
然后再安装ArchR的依赖包:
# install all of the ArchR dependencies
library(ArchR)
ArchR::installExtraPackages()
如果安装有问题,请参考:https://github.com/GreenleafLab/ArchR
(二)ArchR使用的初次了解
这一章将介绍如何将数据导入到ArchR里,并讲解如何创建ArrowFiles,这个是ArchR分析的基本单位。
(1)ATAC-seq的简要介绍
任何ATAC-seq实验最基本的组成部分都是一个“片段”。在ATAC-seq中,一个片段指的是由两次换位事件产生的可测序的DNA分子。该片段的每一端都使用paired-end进行测序。根据Tn5的插入偏移调整片段开始和结束的单碱基位置。就像已经报道的文献说的一样,Tn5转座酶以一种同源二聚体与DNA结合,在两个Tn5分子之间有9bp的DNA。因此,每个Tn5同源二聚体结合事件都会产生两个插入,间隔9bp。因此,“可接近”位点的实际中心点在Tn5二聚体的正中心,而不是每个Tn5插入的位置。考虑到这点,我们对每个Tn5插入应用一个偏移量,将正链插入事件调整+4 bp,将负链插入事件调整-5 bp。这与ATAC-seq最初描述时提出的定义是一致的。因此,在ArchR中,“fragments”指的是一组对象:包含染色体、偏移调整的单碱基染色体起始位置、偏移调整的单碱基染色体结束位置以及每个唯一细胞barcode ID对应的测序片段。类似地,“insertions”指的是可接近位点最中心的偏移调整后的单碱基位置。
(2)为什么要选择ArchR?
目前有很多的scATAC-seq分析软件可供使用,那么为什么选择ArchR呢?最主要的是ArchR提供了很多其他软件没有的功能:
此外,ArchR比其他可用工具更快,占用的内存更少,这是由于对数据结构和并行化方法进行了大量优化,而这些方法构成了ArchR软件的基础。当分析超过70,000个细胞时,其他工具需要高性能计算环境,需要内存超过128 GB 。
ArchR最初基于unix的笔记本电脑被设计出来的。对于中等大小的实验(少于100,000个细胞),ArchR的速度足够快,执行分析并可视化结果,使其能够以更深入和更具生物学意义的方式与数据交互。当然,对于较高的细胞数或喜欢使用服务器的用户,ArchR提供了导出可在服务器上生成后下载和使用的plot和projects。
目前,ArchR还没有在Windows上优化。它可以工作,但是ArchR中的并行化还没有在Windows中启用,所以上面提到的性能还无法转换。
(3)什么是Arrow file / ArchRProject?
在ArchR中,一个可分析项目的基本单元称为Arrow file。每个Arrow file存储与单个样本相关的所有数据(即元数据、可接近的片段和数据矩阵)。在创建期间和执行其他分析时,ArchR更新并编辑每个Arrow file,以包含额外的信息层。值得注意的是,对于ArchR来说,Arrow file实际上只是存储在磁盘上的外部文件的路径。更明确地说,Arrow file不是存储在内存中的R语言对象,而是存储在磁盘上的HDF5格式文件。因此,我们使用ArchRProject
对象将这些Arrow file关联到一个单独的分析框架中,该框架可以在R中被快速访问。这个ArchRProject
对象很小,并且存储在内存中。
某些操作可以直接在Arrow files上执行,而有些操作则需要在ArchRProject
上执行,反过来再更新每个相关的Arrow files。因为Arrow files存储为一个大的hdf5格式文件,ArchR中的get-er
函数通过与ArchRProject
交互来获取数据,而add-er
函数可以(i)直接向Arrow files添加数据,(ii)直接向ArchRProject添加数据,或者(iii)通过与ArchRProject交互向Arrow files添加数据。
(4)ArchR的输入文件格式
ArchR可以利用scATAC-seq数据的多种输入格式,最常见的格式是fragment文件和BAM文件。
fragment文件是tabix排序的文本文件,包含每个scATAC-seq片段和相应的细胞ID,每行一个片段。
BAM文件是二进制的tabix排序文件,包含每个scATAC-seq片段、原始序列、细胞barcode id和其他信息。
所使用的输入格式将取决于所使用的预处理流程使用的格式。例如,10x Genomics Cell Ranger软件返回fragment文件,而sci-ATAC-seq应用程序将使用BAM文件。ArchR使用“scanTabix”读取fragment文件,使用“scanBam”读取BAM文件。在此输入过程中,inputs被切分成chunk,每个input chunk 转换为压缩表格,包含每个片段的染色体,offset-adjusted(偏移调整的)染色体开始位置,offset-adjusted染色体末端的位置,和细胞barcode ID。这些被切分的片段存储在临时的HDF5-formatted文件里,保护内存使用量,同时保持快速访问每一个chunk。最后,所有与每个染色体相关联的chunks都被读取、组织和重写到一个名为“fragments”的单个HDF5组中的Arrow file中。这种预分块过程使ArchR能够高效地处理超大的输入文件,并降低内存使用率,从而实现并行处理。
(5)Getting Set Up
我们要做的第一件事是更改到我们想要的工作目录,设置我们想要使用的线程数量,并加载我们的基因和基因组注释。根据本地环境的配置,您可能需要修改addArchRThreads()
中使用的线程数。默认情况下,ArchR使用了可用线程总数的一半,但你可以根据需要手动调整。如果你使用的是Windows,可用的线程将自动设置为1,因为ArchR中的并行处理是基于unix的操作系统构建的。
首先,调用ArchR包:
> library(ArchR)
接下来,我们为ArchR设置默认的线程数。在每次新的R程序中必须要做的事情。我们建议将线程设置为可用内核总数的1/2到3/4。ArchR中的内存使用通常会随着线程数量的增加而增加,因此允许ArchR使用更多线程也就意味着要使用更多的内存。
> addArchRThreads(threads = 16) #比如我现在用的是windows,我想设置16线程,但是ArchR自动识别设备,并设置线程数为1
Detected windows OS, setting threads to 1.
Setting default number of Parallel threads to 1.
然后,我们设置基因组(用于注释)。如上所述,这也是你在每次新的R会话中必须要做的。当然,这个基因组版本必须与用于比对的基因组版本相匹配。对于本教程中使用的数据,我们将使用hg19基因组。
> addArchRGenome("hg19")
Setting default genome to Hg19.
ArchR需要基因和基因组注释来做一些事情,比如计算TSS富集分数、核苷酸含量和基因活性分数。因为我们的教程中的dataset使用已经与hg19参考基因组比对的scATAC-seq数据。但是,ArchR支持“hg19”、“hg38”、“mm9”和“mm10”,你可以使用createGeneAnnotation()
和createGenomeAnnotation()
函数创建自己的基因组和基因注释。
通过addArchRGenome()
函数向ArchR提供信息。这个函数告诉ArchR,对于当前会话中的所有分析,它应该使用与已定义的ArchRGenome
相关的genomeAnnotation
和geneAnnotation
。每个支持的基因组由以下内容组成:BSgenome
对象(定义了基因组坐标和每个染色体的序列),一个GRanges
对象(包含一组“黑名单”区域),一个TxDb
对象(定义了所有基因的位置和结构),和一个OrgDb
对象(提供了一个中央基因标识符,包含这个标识符之间和其他类型的标识符的mapping)。
在ArchR中,hg19基因组的预编版本使用BSgenome.Hsapiens.UCSC
,hg19 TxDb.Hsapiens.UCSC.hg19
,knownGene org.Hs.eg
,以及使用ArchR::mergeGR()
合并的黑名单(来自hg19 v2 blacklist regions和来自mitochondrial regions that show high mappability to the hg19 nuclear genome)。
(6)创建ArchRGenome
如上所述,ArchRGenome由基因组注释和基因注释组成。
要创建自定义基因组注释,我们使用createGenomeAnnotation()
。为此,你将需要以下信息:
1.一个
BSgenome
对象,它包含一个基因组的序列信息
(例如BSgenome.Hsapiens.UCSC.hg38
)。
2.一个GRanges
基因组范围对象,包含一组黑名单区域,将用于过滤不需要的区域。这不是必需的,但建议这样做。有关如何创建黑名单的信息,请参阅publication on the ENCODE blacklists。
这里,教程展示了如何从Drosophila melanogaster创建一个自定义基因组注释,有需要的童鞋可以自行按照教程构建,这里我就不翻译了~因为我只使用小鼠和人类基因组。官网代码见:here
(7)创建Arrow Files
再次提醒~这个教程使用的数据来自文章Granja* et al. Nature Biotechnology 2019里的造血细胞数据集。包括骨髓单核细胞(BMMC),外周血单核细胞(PBMC)和CD34+造血干细胞和祖细胞(CD34 BMMC)。
一旦我们有了fragment文件,给createArrowFiles()
提供文件的路径。在创建过程中,
创建期间,一些基本的元数据和矩阵被添加到每个Arrow file中,包括“TileMatrix”(包含在全基因组500bp bins的insertion counts),和“GeneScoreMatrix”(基于邻近基因启动子的insetion counts推断的基因表达量)。
示例数据使用getTutorialData()
下载:
> inputFiles <- getTutorialData("Hematopoiesis")
> inputFiles
scATAC_BMMC_R1
"HemeFragments/scATAC_BMMC_R1.fragments.tsv.gz"
scATAC_CD34_BMMC_R1
"HemeFragments/scATAC_CD34_BMMC_R1.fragments.tsv.gz"
scATAC_PBMC_R1
"HemeFragments/scATAC_PBMC_R1.fragments.tsv.gz"
现在我们开始创建Arrow Files,大概要花10-15分钟。对于每一个样品来说:
1.从input文件里读取可接近性 fragments
2.计算每个细胞的质量控制信息(如TSS富集分数和核小体信息)
3.根据质量控制参数过滤细胞
4.创建基因组范围内的TileMatrix(500bp的bin)
5.创建GeneScoreMatrix
> ArrowFiles <- createArrowFiles(
inputFiles = inputFiles,
sampleNames = names(inputFiles),
filterTSS = 4, #Don't set this too high because you can always increase later
filterFrags = 1000,
addTileMat = TRUE,
addGeneScoreMat = TRUE
)
#运行时会弹出很多东西:
#从弹出信息的前两行可以看出,上面的代码里有两个参数的名字已经更改了,但是也可以运行
filterFrags is no longer a valid input. Please use minFrags! Setting filterFrags value to minFrags!
filterTSS is no longer a valid input. Please use minTSS! Setting filterTSS value to minTSS!
Using GeneAnnotation set by addArchRGenome(Hg19)!
Using GeneAnnotation set by addArchRGenome(Hg19)!
ArchR logging to : ArchRLogs\ArchR-createArrows-3364659e77d1-Date-2020-11-17_Time-22-13-26.log
If there is an issue, please report to github with logFile!
2020-11-17 22:13:27 : Batch Execution w/ safelapply!, 0 mins elapsed.
Attempting to index HemeFragments/scATAC_BMMC_R1.fragments.tsv.gz as tabix..
2020-11-17 22:13:37 : (scATAC_BMMC_R1 : 1 of 3) Reading In Fragments from inputFiles (readMethod = tabix), 0.171 mins elapsed.
2020-11-17 22:13:37 : (scATAC_BMMC_R1 : 1 of 3) Tabix Bed To Temporary File, 0.174 mins elapsed.
......
2020-11-17 22:36:24 : (scATAC_PBMC_R1 : 3 of 3) Adding GeneScoreMatrix!, 22.962 mins elapsed.
2020-11-17 22:37:43 : (scATAC_PBMC_R1 : 3 of 3) Finished Creating Arrow File, 24.271 mins elapsed.
ArchR logging successful to : ArchRLogs\ArchR-createArrows-3364659e77d1-Date-2020-11-17_Time-22-13-26.log
现在我们看一下ArrowFiles对象,确认一下它确实是一个Arrow file路径的向量:
> ArrowFiles
[1] "scATAC_BMMC_R1.arrow" "scATAC_CD34_BMMC_R1.arrow" "scATAC_PBMC_R1.arrow"
(8)每个细胞的质量控制
scATAC-seq数据的严格质量控制是很重要的,首先就是要去掉低质量细胞。在ArchR里,考虑下面三个因素:
1.唯一核fragments的数量(没有比对到线粒体上的DNA)
2.信噪比。低信噪比通常是死细胞或者快死了的细胞,细胞会含有去染色质化的DNA,使得Tn5在基因组上随便切。
3.fragment大小的分布,由于核小体的周期性,我们希望fragment在147bp左右消失。
第一个指标是唯一的核fragments,这很简单:只有很少的可用的fragments的细胞不能提供足够的数据来进行有用的分析,因此应该被排除在外。
第二个度量标准,信噪比,被计算为TSS富集分数。传统的ATAC-seq分析使用这个TSS富集分数作为确定signal-to-background的标准工作流的一部分。我们和其他人发现TSS富集在大部分ATAC-seq和scac -seq测试的细胞类型中具有代表性。TSS富集评分指标的idea是,与其他基因组区域相比,由于与启动子结合的大型蛋白复合物,ATAC-seq数据在基因TSS区域普遍富集。通过观察以这些TSS区域为中心的每个bp的可接近性,我们可以看到相对于侧翼区域(在两个方向上1900-2000 bp远端)的局部富集。峰的富集(以TSS为中心)与侧翼区域的比值代表TSS富集分数。
传统上,对每个ATAC-seq样本计算每个碱基对的可接近性,然后使用此profile确定TSS富集分数。在scATAC-seq中,按细胞执行此操作相对较慢,且计算成本较高。为了精确地评估每个细胞的TSS富集评分,我们计算以每个单碱基TSS位置为中心的50 bp区域内的平均可接近性,并将其除以TSS侧翼位置的平均可接近性(+/- 1900 - 2000 bp)。这个近似值(R > 0.99)与原始方法高度相关,并且数值在量级上非常接近。
第三个度量标准,fragment大小分布,通常不那么重要,但是手工检查总是好的。由于DNA包裹核小体的方式,我们期望在我们的数据里看到fragment大小分布的周期性。出现这些“峰”和“谷”是因为片段必须跨越0,1,2个核小体(Tn5不能切断紧紧包裹在核小体周围的DNA)。
默认情况下,在ArchR中,通过过滤细胞被识别为TSS富集分数大于4和超过1000个唯一核片段的细胞。需要注意的是,TSS富集分数的实际数值取决于所使用的TSSs集。ArchR中的默认值是为人类数据设计的,在运行createArrowFiles()
时更改默认阈值是非常重要的。
在运行完上面的代码后,你的当前工作文件夹里会多出一个文件夹,叫QualityControl。包含每个样品的两个相关的图,第一个点图显示的是log10(unique nuclear fragments) vs TSS富集分数,并显示阈值;第二个图是fragment大小分布图:
比如我们打开第一个BMMC的结果来看:
现在我们已经准备整理这些Arrow files,后面将展示如何创建一个ArchRProject。