检测中频范围重叠-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