ArchR官网教程学习笔记10:ArchR的call peak

系列回顾:
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
                         |               
   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
                                              
   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
             
   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
                            |              
       [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
                
       [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”的新矩阵。这是另一个保留名称的矩阵,类似于GeneScoreMatrixTileMatrix。如前所述,每个ArchRProject对象只能有一个峰集和一个峰矩阵。当然,你可以创建数量不限、名称不同的自定义特征矩阵,但PeakMatrix是保留给ArchRProject中存储的峰集派生的insertion counts矩阵的。

> getAvailableMatrices(projHeme5)
[1] "GeneIntegrationMatrix" "GeneScoreMatrix"       "PeakMatrix"           
[4] "TileMatrix"

你可能感兴趣的:(ArchR官网教程学习笔记10:ArchR的call peak)