ChIPseeker | 详解annotatePeak的三种注释方式

序 言

  ChIPseeker用来注释peak确实很方便,也内置了不少的可视化函数可以用来展示结果。ChIPseeker基于annotatePeak函数做注释虽然使用起来很简单,但在其内部却存在着三种独立的注释方式,分别为nearest gene annotationgenomic annotationflankDistance。下面咱们就来具体看看这三种注释方式分别是什么,以及哪些参数可以控制其行为。

nearest gene annotation

  该注释与其他软件理念一致,就是根据距离寻找与peak的最近基因,距离的计算依据是TSS,即注释结果中的distanceToTSS列。该注释方式其实是由内部的getNearestFeatureIndicesAndDistances函数完成,涉及到的参数如下:

Description:

     get index of features that closest to peak and calculate distance

Usage:

     getNearestFeatureIndicesAndDistances(
       peaks,
       features,
       sameStrand = FALSE,
       ignoreOverlap = FALSE,
       ignoreUpstream = FALSE,
       ignoreDownstream = FALSE,
       overlap = "TSS"
     )

  annotatePeak函数注释时会调用getNearestFeatureIndicesAndDistances函数,所以annotatePeak里面那些同名的参数会被getNearestFeatureIndicesAndDistances使用。也就是说,这些参数会影响nearest gene annotation的注释结果。这些参数在软件里面都有相应的解释,这里就不再赘述了。不过,ignoreOverlapoverlap这两个参数有点不好理解,为了搞清楚其对结果会有什么影响,就去扒拉了一下源码,其中涉及到这两参数的代码如下:

if (!ignoreOverlap && overlap == "all") {
    overlap_hit <- findOverlaps(peaks, unstrand(features))
}
features <- resize(features, width = 1)
... ...
... ...
if (!ignoreOverlap) {
    if (overlap == "all") {
        hit <- overlap_hit
        if (length(hit) != 0) {
            qh <- queryHits(hit)
            hit.idx <- getFirstHitIndex(qh)
            hit <- hit[hit.idx]
            peakIdx <- queryHits(hit)
            featureIdx <- subjectHits(hit)
            index[peakIdx] <- featureIdx
            distance_both_end <- data.frame(start = start(peaks[peakIdx]) -
              start(features[featureIdx]), end = end(peaks[peakIdx]) -
              start(features[featureIdx]))
            distance_idx <- apply(distance_both_end, 1, function(i) which.min(abs(i)))
            distance_minimal <- distance_both_end[, 1]
            distance_minimal[distance_idx == 2] <- distance_both_end[distance_idx ==
              2, 2]
            distanceToTSS[peakIdx] <- distance_minimal *
              ifelse(strand(features[featureIdx]) == "+",
                1, -1)
        }
    }
    hit <- findOverlaps(peaks, unstrand(features))
    if (length(hit) != 0) {
        qh <- queryHits(hit)
        hit.idx <- getFirstHitIndex(qh)
        hit <- hit[hit.idx]
        peakIdx <- queryHits(hit)
        featureIdx <- subjectHits(hit)
        index[peakIdx] <- featureIdx
        distanceToTSS[peakIdx] <- 0
    }
}

  从上面的代码可以看出,overlap参数受ignoreOverlap影响,如果ignoreOverlap设定为true,无论overlap设定为TSS或是all结果都一样。ignoreOverlap默认值为false,从上面的代码可以看出overlap设定为TSS或者all改变了peak寻找overlap区域的规则,设为TSS时是以转录起始位点为依据,而设为all是以整个基因区域为依据,故此时改变overlap的参数会影响注释的结果。注释结果中geneChrgeneStartgeneEndgeneLengthgeneStrandgeneIdtranscriptIddistanceToTSSENSEMBLSYMBOLGENENAME这些列都属于该注释方式,其中最后三列取决于有没有提供annoDb参数。

genomic annotation

  该注释方式为直接寻找与peak有overlap的基因组区域,即基因组内定义的不同功能区域,分别为Promoter5UTR3UTRExonIntronDownstreamIntergenic。这个注释方式是由内部的getGenomicAnnotation函数完成,涉及到的参数如下:

Description:

     get Genomic Annotation of peaks

Usage:

     getGenomicAnnotation(
       peaks,
       distance,
       tssRegion = c(-3000, 3000),
       TxDb,
       level,
       genomicAnnotationPriority,
       sameStrand = FALSE
     )

  distance参数是由nearest gene annotation计算出的peakTSS距离,这个参数可以忽略。这里的参数都很容易理解,就不再解释了。annotatePeak函数里面的assignGenomicAnnotation参数直接控制了是否做这个注释,默认包含这个结果,设置为false结果中就没有annotation这一列了。如下所示:

peakanno <- annotatePeak(peak, TxDb=txdb, assignGenomicAnnotation=F, verbose=F)

head(as.data.frame(peakanno))
  seqnames  start    end width strand                V4  V5 V6       V7
1     chr1 177887 178346   460      * macs2/spi1_peak_1  63  .  5.02370
2     chr1 502490 502734   245      * macs2/spi1_peak_2 114  .  8.47362
3     chr1 816135 816585   451      * macs2/spi1_peak_3 687  . 27.23509
4     chr1 817259 817655   397      * macs2/spi1_peak_4  30  .  4.25229
5     chr1 825329 825528   200      * macs2/spi1_peak_5  42  .  4.87237
6     chr1 906748 907307   560      * macs2/spi1_peak_6 113  .  6.11296
        V8       V9 V10 geneChr geneStart geneEnd geneLength geneStrand
1  8.41215  6.35401 169       1    182696  184174       1479          1
2 13.72868 11.49205 159       1    494464  502508       8045          2
3 71.78964 68.76992 193       1    817371  819837       2467          1
4  4.98931  3.09637 270       1    817371  819837       2467          1
5  6.17494  4.21122  51       1    825138  849592      24455          1
6 13.58947 11.36661 157       1    917370  918534       1165          2
     geneId      transcriptId distanceToTSS
1 102725121 ENST00000624431.2         -4350
2 100132287 ENST00000440038.7             0
3    400728 ENST00000326734.2          -786
4    400728 ENST00000326734.2             0
5    643837 ENST00000624927.3           191
6 100130417 ENST00000432961.1         11227

flankDistance

  该注释从peak的角度出发寻找上下游某个范围内的所有基因,由内部的getAllFlankingGene函数完成,下面是该函数的参数定义:

function (peak.gr, features, level = "transcript", distance = 5000)

  从上面的定义可知,用户可以用来控制结果的参数为leveldistance,参数的意义也很好理解。如果需要这个注释,将annotatePeak的参数addFlankGeneInfo设为true即可,结果就会多出flank_txIdsflank_geneIdsflank_gene_distances三列信息。

peakanno <- annotatePeak(peak, TxDb=txdb, addFlankGeneInfo=T, verbose=F)

head(as.data.frame(peakanno),3)
  seqnames  start    end width strand                V4  V5 V6       V7
1     chr1 177887 178346   460      * macs2/spi1_peak_1  63  .  5.02370
2     chr1 502490 502734   245      * macs2/spi1_peak_2 114  .  8.47362
3     chr1 816135 816585   451      * macs2/spi1_peak_3 687  . 27.23509
        V8       V9 V10        annotation geneChr geneStart geneEnd geneLength
1  8.41215  6.35401 169 Distal Intergenic       1    182696  184174       1479
2 13.72868 11.49205 159  Promoter (<=1kb)       1    494464  502508       8045
3 71.78964 68.76992 193  Promoter (<=1kb)       1    817371  819837       2467
  geneStrand    geneId      transcriptId distanceToTSS
1          1 102725121 ENST00000624431.2         -4350
2          2 100132287 ENST00000440038.7             0
3          1    400728 ENST00000326734.2          -786
                                            flank_txIds
1                                     ENST00000624431.2
2 ENST00000440038.7;ENST00000423728.6;ENST00000616311.5
3                                     ENST00000326734.2
                  flank_geneIds flank_gene_distances
1                     102725121                -4350
2 100132287;100132287;100132287        0;-3315;-3514
3                        400728                    0

结 语

  ChIPseeker的三种注释之间相互独立,所以结果就会出现信息不对称的现象,比如annotation注释到的转录本或基因可能与geneIdtranscriptId列不同。ChIPseeker做注释虽然很简单,但其中还是有不少的细节需要注意以便更准确地理解结果。关于ChIPseeker的应用这里并没有详细的介绍,网络上也有不少这方面的帖子可供参考,不过之前也写过一篇个性化注释的帖子,感兴趣的可以戳这里:[个性化ChIPseeker注释peak结果]。以上内容为个人理解,仅供参考。

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

推荐阅读更多精彩内容