使用R在较大的基因组区间上交叉覆盖较小的基因组区间数据

3
我可以帮助您翻译以下内容,这是关于IT技术的:

我想在R中求两个基因组区间的交集。我还想获取较小区间对大区间的覆盖率统计信息。

大区间数据是一个像这样的数据框....

Chr  Start     End       Name         Val    Strand
chr7 145444998 146102295 CCDS5889.1   0      +
chr7 146102406 146167735 CCDS5889.1   0      +
chr7 146167929 146371931 CCDS5889.1   0      +

超过200万行的较小间隔如下所示。

Chr  Start     End       Name         Val    Strand PhyloP   
chr7 145444386 145444387 CCDS5889.1   0      +      0.684764
chr7 145444387 145444388 CCDS5889.1   0      +      0.684764
chr7 145444388 145444389 CCDS5889.1   0      +      0.684764
chr7 145444389 145444390 CCDS5889.1   0      +      0.684764

数据帧中第二列(起始时间)和第三列(结束时间)包含间隔数据。

情况类似于

Large Interval:    [-----]   [-----]     [--------------]   [-------------------]
Small Interval: |||  ||||  |||||||||||  ||||||||   ||||  || |||||||||   ||    ||||||||
  1. 我想知道每个大间隔被小间隔覆盖的时间长度。
  2. 另外,我希望将每个大间隔相交的 $PhyloP 值关联起来,以便将来进行绘图时进行访问。

展示一下你目前已经完成了什么,以及你卡在哪里了。 - Roman Luštrik
1个回答

2
Bioconductor的IRanges和GenomicRanges包有findOverlapscountOverlapscoverage和其他基于区间的函数,旨在执行这些操作。您可以使用GRanges函数来表示上面每个subject(“较大区间”)和query(“较小区间”)对象。请参见安装说明和vignettes,例如,browseVignettes("GenomicRanges")
稍微详细一些,这是您的数据。
sdf <- read.table(textConnection(
"Chr  Start     End       Name         Val    Strand
chr7 145444998 146102295 CCDS5889.1   0      +
chr7 146102406 146167735 CCDS5889.1   0      +
chr7 146167929 146371931 CCDS5889.1   0      +"), header=TRUE)

qdf <- read.table(textConnection(
"Chr  Start     End       Name         Val    Strand PhyloP   
chr7 145444386 145444387 CCDS5889.1   0      +      0.684764
chr7 145444387 145444388 CCDS5889.1   0      +      0.684764
chr7 145444388 145444389 CCDS5889.1   0      +      0.684764
chr7 145444389 145444390 CCDS5889.1   0      +      0.684764"), header=TRUE)

在这里,我们将它们转换为GRanges,并找到查询和主体之间的交集。
library(GenomicRanges)
subj <-
    with(sdf, GRanges(Chr, IRanges(Start, End), Strand, Val=Val))
query <-
    with(qdf, GRanges(Chr, IRanges(Start, End), Strand, Val=Val,
                      PhyloP=PhyloP, names=Name))
intersect(query, subj)

这里的答案并不是很令人兴奋。
> intersect(query, subj)
GRanges with 0 ranges and 0 elementMetadata values
     seqnames ranges strand |

seqlengths
 chr7
   NA

为了更加有用,这里是一个查询,可以覆盖您的整个区域。
tiles <- successiveIRanges(rep(100, 950), 900, 145444998)
query <- GRanges("chr7", tiles, "+")

我们找到相交的范围,确定每个相交范围重叠的主题,并总结重叠范围的宽度。
int <- intersect(query, subj)
tapply(int, subjectHits(findOverlaps(int, subj)),
       function(x) sum(width(x)))

意为“导致”。
    1     2     3 
65800  6500 20400 

1
谢谢您的帮助,非常有用。如果查询不是区间而只是主题内的单个点,该如何执行相同的操作呢?比如说:“chr7 145444386 CCDS5889.1 0 + 0.684764”。 - user645600
另外,我如何对映射到每个较大主题间隔的查询间隔中的“PhyloP”值进行探索性分析(例如,箱形图、平均值等)? - user645600
1
对于单个点,请将它们视为宽度为1的区间GRanges(“chr7”,IRanges(145444386,width = 1)),或者视为实际点GRanges(“chr7”,IRanges(145444386,width = 0))。不确定您关于PhyloP的确切含义; olap = findOverlaps(query, subject)返回一个对象,您可以使用它来索引查询和主题,例如 tapply(values(query)[["PhyloP"]] [queryHits(olap)],subjectHits(olap),sum) - Martin Morgan

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接