检测中频范围重叠-MATLAB

检测中频范围重叠-MATLAB,matlab,Matlab,我有一个脚本,目的是检测染色体上基因之间的间隙,这些间隙的坐标,并为间隙指定一个类别 它采用以下格式的输入文件: Chr start finish dir chrI 335 649 + chrI 538 792 + chrI 1807 2169 - chrI 2480 2707 + chrI 7235 9016 - chrI 10091 10399 + chrI 1

我有一个脚本,目的是检测染色体上基因之间的间隙,这些间隙的坐标,并为间隙指定一个类别

它采用以下格式的输入文件:

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   +
脚本:

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
期望的结果是系统检测到基因1-3彼此重叠,从而忽略它们——在基因3和4之间检测到第一个间隙:

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

有人对检查重叠的更可靠的方法有什么建议吗

编辑

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

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上的第一个基因进行检查

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

start = [ 280
          646
          2582
          2997
          5790
          7605 ];
finish = [ 2658
           1128 
           2899
           5009
           6125
           7733 ];
现在,两个范围重叠,当且仅当其中一个范围在另一个范围完成之前开始时。所以

overlap = bsxfun(@lt, start(:), finish(:).'); %'// or @le to include equality
overlap = overlap & overlap.';
给出一个正方形对称矩阵
重叠
,这样
重叠(m,n)
在范围
m
n
重叠时为
1
。您可能希望删除对角线(一个范围显然与其自身重叠,但这并不有趣):

示例输出的结果是

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不重叠)。

将脚本的第三行更改为

if start(i+1)<max(finish(1:i))
这就是你想要的


Balle

这似乎对单个染色体很有效,但当试图处理完整输入时(参见编辑),它会中断并在
IGR
type
中产生的值远远小于正确值。假设数据首先在
chr
上排序,然后在
开始
上排序,您可以添加一个初始测试,检查当前的
chr
是否与上次的测试不同。如果它发生了变化,通过将itequal设置为发生变化的
i
,记住当前位置(比如我们称之为
index\u of_last\u chromose\u end
)。然后,if语句将读取
if开始(i+1)有趣的方法!我正在努力决定如何最好地将它合并到for循环中的脚本中,有什么建议吗?如果我理解正确,要在循环中使用它,在每次迭代
I
时,您需要一行我的
重叠
矩阵,即
I
-第四行。因此,您可以在循环外预计算
overlap
,然后在循环内使用类似
if any(overlap(i,1:i-1))
,或
if any(overlap(i,i+1))
,根据您想要检查的内容,任何一个仍然会为chrII数据生成不正确的结果,
IGR
中的第一个条目应该是
2900 2906
,但它是
1129 2581
。我在OP中添加了一个图表,希望澄清重叠检测的要求。
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
if start(i+1)<max(finish(1:i))
2900-2996: Tandem
5010-5789: Divergent
6126-7604: Convergent