系列回顾:
ArchR官网教程学习笔记1:Getting Started with ArchR
ArchR官网教程学习笔记2:基于ArchR推测Doublet
ArchR官网教程学习笔记3:创建ArchRProject
ArchR官网教程学习笔记4:ArchR的降维
ArchR官网教程学习笔记5:ArchR的聚类
ArchR官网教程学习笔记6:单细胞嵌入(Single-cell Embeddings)
ArchR官网教程学习笔记7:ArchR的基因评分和Marker基因
ArchR官网教程学习笔记8:定义与scRNA-seq一致的聚类
ArchR官网教程学习笔记9:ArchR的伪批量重复
call peak是ATAC-seq数据分析中最基本的过程之一。因为每个细胞的scATAC-seq数据本质上是二进制的(可接近或不可接近),所以我们不能在单个细胞的基础上call peak。出于这个原因,我们在前一章中定义了细胞群,通常是clusters。此外,我们创建了伪批量重复,以允许我们评估call peak的再现性。
(一)迭代重叠峰合并
我们首先要介绍的是 a strategy for iterative overlap peak merging in 2018. 其他合并peak的策略里有些关键问题我们也会在下面谈到。
(1)固定宽度的峰 vs 可变宽度的峰
我们使用501-bp固定宽度的峰,因为它们使下游计算更加容易,因为峰长度不需要标准化。此外,ATAC-seq的绝大多数峰宽度小于501-bp。使用可变宽度的峰也使得从多个样本合并call peak变得困难。一般来说,我们并不认为使用可变宽度的峰带来的潜在好处大于其成本。更广泛地说,大多数分析对于使用的峰集或峰样式是稳定的。
下面,我们使用具有不同峰的几个细胞类型的示例来说明这些峰合并方法之间的差异。
(2)使用bedtools merge
合并原始peak overlap
原始峰重叠(Raw peak overlap)是指取任何相互重叠的峰,并将它们合并成一个更大的峰。在这个方案中,daisy-chaining成为了一个大问题,因为没有直接重叠的峰被包含在同一个更大的峰中,因为它们被一个共享的内部峰连接。这种方法的另一个问题是,如果你想要跟踪峰的顶点,你要么为每个新的合并的峰选择一个新的顶点,要么用每个峰的所有顶点。通常,这种峰合并方法是使用bedtools合并命令实现的。
(3)使用bedtools cluster
重叠clusters
clusters重叠是指从聚集在一起peaks中选出一个“赢家”。通常使用bedtools cluster
命令来完成,然后在每个cluster中保留最显著的峰。根据我们的经验,这会导致忽略附近较小的峰。
(4)ArchR中的迭代重叠
迭代重叠消除避免了上述问题。峰的重要性排在第一位。保留最显著峰,并将与最显著峰直接重叠的任何峰从进一步分析中去除。然后,对于剩余的峰,重复这个过程,直到不再存在多于的峰为止。这就避免了daisy-chaining,并且仍然允许使用固定宽度的峰。
(5)比较peak calling的方法
比较所有这些peak calling的方法,可以直接显示最终峰集的明显差异。我们的观点是,迭代重叠峰合并过程产生了最好的峰集。
(6)在ArchR中这些是如何工作的呢?
迭代重叠峰合并过程以分层的方式执行,以最佳地保留细胞类型特异的峰。
想象这样一种情况,你有3种细胞类型,A, B和C,每种细胞类型有3次伪批量重复。ArchR使用一个名为addReproduciblePeakSet()
的函数来执行这个迭代重叠峰值合并过程。首先,ArchR将分别为每个伪批量重复call peak。然后,ArchR将分析来自单个细胞类型的所有伪批量重复,执行迭代重叠去除的第一次迭代。值得注意的是,ArchR使用峰的标准化显著性度量来比较不同样本间peak的显著性。这是因为的MACS2显著性与测序深度成比例,所以峰显著性不能立即在样本间进行比较。在第一次迭代之后,ArchR检查伪批量重复中每个峰的重现性,并且只保留那些通过重现性参数阈值的峰。在这个过程的最后,我们将为3种细胞类型(A、B和C)分别设置一个合并的峰集。
然后,我们重复这个步骤来合并A、B和C的峰集。为了做到这一点,我们重新normalize不同细胞类型的峰的显著性,并执行迭代重叠去除。这样做的最终结果是一个固定宽度峰的合并峰集。
(7)如果我不喜欢这个迭代重叠峰合并过程呢?
迭代重叠峰合并过程是由ArchR通过addReproduciblePeakSet()
实现的,但是你也可以通过ArchRProj <- addPeakSet()
使用你自己的峰集。
(二)使用Macs2进行call peak
如上所述,我们使用addReproduciblePeakSet()
函数在ArchR中生成一个可重复的峰集。默认情况下,ArchR尝试使用MACS2 call peaks。然而,ArchR也实现了它自己的本地peak caller,它可以在MACS2无法安装时使用(例如,我们没有成功地在Windows上安装MACS2)——这种备选call peaks方法将在下一节中描述。
要使用MACS2 call peaks,ArchR必须能够找到MACS2可执行文件。首先,ArchR查看PATH环境变量。如果不成功,ArchR将尝试确定你是否安装了带有pip或pip3的MACS2。如果这两个都不成功,ArchR将放弃并提供一个错误消息。如果你安装了MACS2, ArchR找不到它,你应该通过pathToMacs2
参数给addReproduciblePeakSet()
函数提供路径。
这一步我是在Linux系统里运行的,因为我的windows系统实在是不给力,无法找到macs2的路径,所以我只好在linux系统里重新运行了一遍,包括前面的所有章节。
> pathToMacs2 <- findMacs2() #find the path of macs2
Searching For MACS2..
Not Found in $PATH
Not Found with pip
Not Found with pip3
Error in findMacs2() :
Could Not Find Macs2! Please install w/ pip, add to your $PATH, or just supply the macs2 path directly and avoid this function!
#这里显示找不到MACS2路径,实际上我是安装了MACS2的
如果ArchR找不到路径,你可以指定路径给它:
> projHeme4 <- addReproduciblePeakSet(
ArchRProj = projHeme4,
groupBy = "Clusters2",
pathToMacs2 = "/home/yanfang/Downloads/Anaconda/Anaconda_install/bin/macs2"
)
#运行成功会有下面的提示:
ArchR logging to : ArchRLogs/ArchR-addReproduciblePeakSet-58eb1b1ff90-Date-2020-11-24_Time-23-00-04.log
If there is an issue, please report to github with logFile!
2020-11-24 23:00:05 : Peak Calling Parameters!, 0.01 mins elapsed.
Group nCells nCellsUsed nReplicates nMin nMax maxPeaks
B B 432 428 2 174 254 150000
CD4.M CD4.M 639 610 2 110 500 150000
CD4.N CD4.N 1279 552 2 52 500 150000
CLP CLP 384 384 2 84 300 150000
Erythroid Erythroid 732 666 2 166 500 150000
GMP GMP 1201 849 2 349 500 150000
Mono Mono 2579 1000 2 500 500 150000
NK NK 874 786 2 286 500 150000
pDC pDC 300 290 2 137 153 145000
PreB PreB 358 358 2 40 318 150000
Progenitor Progenitor 1473 658 2 158 500 150000
2020-11-24 23:00:06 : Batching Peak Calls!, 0.011 mins elapsed.
2020-11-24 23:00:06 : Batch Execution w/ safelapply!, 0 mins elapsed.
2020-11-24 23:10:39 : Identifying Reproducible Peaks!, 10.577 mins elapsed.
2020-11-24 23:11:09 : Creating Union Peak Set!, 11.073 mins elapsed.
Converged after 6 iterations!
Plotting Ggplot!
2020-11-24 23:11:14 : Finished Creating Union Peak Set (140865)!, 11.147 mins elapsed.
找到MACS2的路径后,我们就可以用MACS2创建一个可重复的合并峰集。为了避免细胞数量很少的伪批量重复产生的偏差,我们可以通过peaksPerCell
参数为每个细胞call的峰数量的上限提供一个cutoff。这可以防止细胞数量很少的clusters里大量低质量的峰影响合并峰集。还有许多其他参数可以在addReproduciblePeakSet()
中调整,请尝试?addReproduciblePeakSet
以获得更多信息。
每个ArchRProject对象只能包含一个峰集。因此,我们将addReproduciblePeakSet()
的输出分配给我们想要的ArchRProject。如果您想尝试使用不同的峰集,则必须保存ArchRProject的一个副本,从而也复制Arrow files。虽然这会使用更多的磁盘存储空间,但考虑到Arrow files的结构和Arrow files中峰值矩阵信息的存储,这是不可避免的。
要将这个峰集作为GRanges对象,我们使用getPeakSet()
函数。这个峰集包含每个峰产生的组的注释。但是,这些注释并不意味着只在该组中被call,而是说明注释的组对该call peak具有最高的标准化意义。
> getPeakSet(projHeme4)
GRanges object with 140865 ranges and 12 metadata columns:
seqnames ranges strand | score replicateScoreQuantile
<Rle> <IRanges> <Rle> | <numeric> <numeric>
Mono chr1 752495-752995 * | 27.3149 0.865
CD4.N chr1 757871-758371 * | 5.55037 0.835
CD4.N chr1 762690-763190 * | 17.9242 0.977
GMP chr1 773670-774170 * | 4.90925 0.513
B chr1 801006-801506 * | 15.2793 0.685
... ... ... ... . ... ...
NK chrX 154807254-154807754 * | 4.84969 0.403
Mono chrX 154840907-154841407 * | 3.66286 0.376
Mono chrX 154841994-154842494 * | 12.6809 0.747
NK chrX 154862043-154862543 * | 13.8961 0.525
GMP chrX 154996991-154997491 * | 4.90925 0.513
groupScoreQuantile Reproducibility GroupReplicate distToGeneStart
<numeric> <numeric> <character> <integer>
Mono 0.737 2 Mono._.scATAC_BMMC_R1 10156
CD4.N 0.541 2 CD4.N._.scATAC_PBMC_R1 4780
CD4.N 0.917 2 CD4.N._.scATAC_PBMC_R1 30
GMP 0.176 2 GMP._.scATAC_CD34_BMMC_R1 10948
B 0.418 2 B._.scATAC_PBMC_R1 10925
... ... ... ... ...
NK 0.13 2 NK._.scATAC_BMMC_R1 35117
Mono 0.081 2 Mono._.scATAC_PBMC_R1 1464
Mono 0.512 2 Mono._.scATAC_BMMC_R1 377
NK 0.253 2 NK._.scATAC_PBMC_R1 19670
GMP 0.176 2 GMP._.scATAC_CD34_BMMC_R1 154618
nearestGene peakType distToTSS nearestTSS GC idx
<character> <character> <integer> <character> <numeric> <integer>
Mono LINC00115 Distal 10156 uc001aau.3 0.485 1
CD4.N LINC00115 Distal 4780 uc001aau.3 0.5609 2
CD4.N LINC01128 Promoter 30 uc021oeh.1 0.6966 3
GMP LINC01128 Intronic 10741 uc021oeh.1 0.4571 4
B FAM41C Distal 10925 uc021oei.1 0.4371 5
... ... ... ... ... ... ...
NK TMLHE Intronic 35117 uc004cin.3 0.499 3405
Mono TMLHE Intronic 1464 uc004cin.3 0.4391 3406
Mono TMLHE Intronic 377 uc004cin.3 0.6148 3407
NK TMLHE Distal 19670 uc004cin.3 0.4251 3408
GMP TMLHE Distal 209 uc004cin.3 0.5449 3409
-------
seqinfo: 23 sequences from an unspecified genome; no seqlengths
(三)使用TileMatrix进行call peak
如前所述,ArchR还实现了它自己的peak caller。虽然我们已经用MACS2对这个peak caller进行了基准测试,并且性能非常相似,但除非绝对必要,我们不建议使用这个peak caller。
ArchR自身的peak caller call的是500-bp TileMatrix
上的峰,我们通过peakMethod
参数向addReproduciblePeakSet()
说明我们希望使用这个peak caller。请注意,我们没有将输出存储到projHeme4对象中,因为我们不打算保留这个峰集,并且此分析仅用于说明目的。存储到ArchRProject对象中会覆盖之前已经存储在projHeme4中的峰集。
> projHemeTmp <- addReproduciblePeakSet(
ArchRProj = projHeme4,
groupBy = "Clusters2",
peakMethod = "Tiles",
method = "p"
)
> getPeakSet(projHemeTmp)
GRanges object with 271847 ranges and 9 metadata columns:
seqnames ranges strand | mlog10p Group distToGeneStart
<Rle> <IRanges> <Rle> | <numeric> <Rle> <integer>
[1] chr1 752500-752999 * | 6.939 Mono 10152
[2] chr1 758000-758499 * | 3.185 CD4.N 4652
[3] chr1 758500-758999 * | 1.03 NK 4152
[4] chr1 762000-762499 * | 2.409 NK 652
[5] chr1 762500-762999 * | 23.286 NK 152
... ... ... ... . ... ... ...
[271843] chrX 154842000-154842499 * | 6.121 CLP 372
[271844] chrX 154842500-154842999 * | 5.545 CD4.M 126
[271845] chrX 154862000-154862499 * | 2.325 NK 19626
[271846] chrX 154862500-154862999 * | 1.362 Progenitor 20126
[271847] chrX 154997000-154997499 * | 2.075 Progenitor 154626
nearestGene peakType distToTSS nearestTSS GC idx
<character> <character> <integer> <character> <numeric> <integer>
[1] LINC00115 Distal 10152 uc001aau.3 0.484 1
[2] LINC00115 Distal 4652 uc001aau.3 0.552 2
[3] LINC00115 Distal 4152 uc001aau.3 0.56 3
[4] LINC00115 Promoter 652 uc001aau.3 0.574 4
[5] LINC00115 Promoter 152 uc001aau.3 0.684 5
... ... ... ... ... ... ...
[271843] TMLHE Intronic 372 uc004cin.3 0.612 6496
[271844] TMLHE Promoter 126 uc004cin.3 0.554 6497
[271845] TMLHE Distal 19626 uc004cin.3 0.43 6498
[271846] TMLHE Distal 20126 uc004cin.3 0.42 6499
[271847] TMLHE Distal 201 uc004cin.3 0.542 6500
-------
seqinfo: 23 sequences from an unspecified genome; no seqlengths
(四)比较两种peak calling的方法
将上面的两种peak calling进行比较。
首先,我们检查macs2的call peak与tilematrix的call peak重叠的百分比:
> length(subsetByOverlaps(getPeakSet(projHeme4), getPeakSet(projHemeTmp))) / length(getPeakSet(projHeme4))
[1] 0.9710006
相反,我们看tilematrix的call peak与macs2的call peak重叠的百分比:
> length(subsetByOverlaps(getPeakSet(projHemeTmp), getPeakSet(projHeme4))) / length(getPeakSet(projHemeTmp))
[1] 0.7472328
如果我们将峰的宽度扩大(1000-bp的峰而不是500-bp的峰),macs2的峰重叠的百分比不会发生太大变化:
> length(subsetByOverlaps(resize(getPeakSet(projHeme4), 1000, "center"), getPeakSet(projHemeTmp))) / length(getPeakSet(projHeme4))
[1] 0.9752671
但是tilematrix的call peak与MACS2重叠的比例增加了:
> length(subsetByOverlaps(getPeakSet(projHemeTmp), resize(getPeakSet(projHeme4), 1000, "center"))) / length(getPeakSet(projHemeTmp))
[1] 0.8220985
(五)添加Peak矩阵
现在我们可以保存projHeme4了。这个ArchRProject包含了MACS2合并峰集。
> saveArchRProject(ArchRProj = projHeme4, outputDirectory = "Save-ProjHeme4", load = FALSE)
为了为下游分析做准备,我们创建一个名为projHeme5的新ArchRProject,并向其添加一个新的矩阵,其中包含在新的合并峰集中的insertion counts。
> projHeme5 <- addPeakMatrix(projHeme4)
现在我们可以看到,projHeme5中添加了一个名为“PeakMatrix”的新矩阵。这是另一个保留名称的矩阵,类似于GeneScoreMatrix
和TileMatrix
。如前所述,每个ArchRProject对象只能有一个峰集和一个峰矩阵。当然,你可以创建数量不限、名称不同的自定义特征矩阵,但PeakMatrix是保留给ArchRProject中存储的峰集派生的insertion counts矩阵的。
> getAvailableMatrices(projHeme5)
[1] "GeneIntegrationMatrix" "GeneScoreMatrix" "PeakMatrix"
[4] "TileMatrix"
网友评论