首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >检测范围重叠- MATLAB

检测范围重叠- MATLAB
EN

Stack Overflow用户
提问于 2015-06-17 10:34:49
回答 2查看 1.1K关注 0票数 1

我有一个脚本,目的是检测沿着染色体的基因之间的差距,这些间隙的坐标,并为这个缺口指定一个类别。

它以这种格式接受一个输入文件:

代码语言:javascript
复制
Chr     start   finish  dir
chrI    335     649     +
chrI    538     792     +
chrI    1807    2169    -
chrI    2480    2707    +
chrI    7235    9016    -
chrI    10091   10399   +
chrI    11565   11951   -
chrI    12046   12426   +
chrI    13363   13743   -
chrI    21566   21850   +
chrI    22395   22685   -
chrI    24000   27968   -
chrI    31567   32940   +
chrI    33448   34701   +

剧本:

代码语言:javascript
复制
k = 0;
for i=1:(length(start)-1)
    if start(i+1)<finish(i)
        continue
    else
    end
    k = k+1;
    IGR(k,1) = finish(i)+1;
    IGR(k,2) = start(i+1)-1;
    if dir{i}=='+' && dir{i+1}=='-'
        type{k,1} = 'Convergent';
    end
    if dir{i}=='+' && dir{i+1}=='+'
        type{k,1} = 'Tandem';
    end
    if dir{i}=='-' && dir{i+1}=='+'
        type{k,1} = 'Divergent';
    end
    if dir{i}=='-' && dir{i+1}=='-'
        type{k,1} = 'Tandem';
    end
end

这对上面的输入很有效,但是如果超过2个基因重叠,则确定相邻基因是否重叠if start(i+1)<finish(i)的检查失败。当输入数据按start排序时,下面的输入无法正确工作,因此它无法检测到第三个基因重叠于第一个基因,只有当基因2和3重叠时才进行检查。

代码语言:javascript
复制
chrII   280     2658    -
chrII   646     1128    +
chrII   2582    2899    -
chrII   2997    5009    -
chrII   5790    6125    +
chrII   7605    7733    -

期望的输出是系统检测基因1-3相互重叠,从而忽略它们--基因3和基因4之间的第一个间隙被检测到:

红色区块代表了我试图检测到的区域,同时忽略了重叠的基因(因为它们不会产生缝隙)。蓝色块显示chrII开始时的每个单独的基因。

有没有人有更有力的方法来检查重叠的建议?

编辑

我的完整输入文件中有按染色体排序的基因,即:

代码语言:javascript
复制
Chr     start   finish  dir
chrI    335     649     +
chrI    538     792     +
chrI    1807    2169    -
chrI    2480    2707    +
chrI    7235    9016    -
chrII   280     2658    -
chrII   646     1128    +
chrII   2582    2899    -
chrII   2997    5009    -
chrII   5790    6125    +
chrII   7605    7733    -

任何检测重叠的方法都不能跨越染色体边界,一旦chrI结束,chrII开始,就必须更新过程,使chrI上的最后一个基因不能与chrII上的第一个基因进行检测。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2015-06-17 10:59:31

将脚本的第3行更改为

代码语言:javascript
复制
if start(i+1)<max(finish(1:i))

使用第二组示例数据,我得到以下输出:

代码语言:javascript
复制
2900-2996: Tandem
5010-5789: Divergent
6126-7604: Convergent

这就是你想要的?

巴勒

票数 1
EN

Stack Overflow用户

发布于 2015-06-17 10:48:54

从您的问题中,我假设您已经在两个向量中得到了每个范围的开始值和结束值:

代码语言:javascript
复制
start = [ 280
          646
          2582
          2997
          5790
          7605 ];
finish = [ 2658
           1128 
           2899
           5009
           6125
           7733 ];

现在,的两个范围重叠当且仅当每个区域在完成之前就开始了。所以

代码语言:javascript
复制
overlap = bsxfun(@lt, start(:), finish(:).'); %'// or @le to include equality
overlap = overlap & overlap.';

给出一个正方形对称矩阵overlap,使得overlap(m,n)1如果距离mn重叠。您可能希望删除对角线(范围显然与其本身重叠,但这并不有趣):

代码语言:javascript
复制
overlap(1:numel(start)+1:end) = 0;

对于示例输出,结果是

代码语言:javascript
复制
overlap =
     0     1     1     0     0     0
     1     0     0     0     0     0
     1     0     0     0     0     0
     0     0     0     0     0     0
     0     0     0     0     0     0
     0     0     0     0     0     0

这告诉您范围1和2重叠,也范围1和3重叠(注意,范围2和3不重叠)。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/30889024

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档