2013-08-26 68 views
0

我目前正在比較兩個基因列表,目的是找到兩個列表之間的重疊基因。哈希鍵的鬆散匹配?

此刻,我的基因的名字存儲爲一個哈希鍵兩個列表(blast1和BLAST2),並找到鑰匙(基因)同時存在於兩個哈希值:

輸入1:

XLOC_000157_6.21019:12.8196,_Change:1.04564,_p:0.04915,_q:0.999592  99.66 gi|475392713|dbj|AB759708.1|_Xenopus_laevis_PhyHd_mRNA_for_phytanoyl-CoA_dioxygenase_like_protein,_complete_cds 
XLOC_000159_636.025:343.104,_Change:-0.890436,_p:0.00575,_q:0.999592 99.47 gi|9909981|emb|AJ278067.1|_Xenopus_laevis_mRNA_for_putative_XIRG_protein 
XLOC_000561_31.1018:14.9273,_Change:-1.05905,_p:0.0073,_q:0.999592  91.57 gi|165973401|ref|NM_001113689.1|_Xenopus_(Silurana)_tropicalis_cytokine_inducible_SH2-containing_protein_(cish),_mRNA 

指定用於第一個基因列表...

$input1 = $ARGV[0]; 
open my $blast1, '<', $input1 or die $!; 

my $results1 = 0; 
my (@blast1ID, @blast1_info, @percent_id, @split); 
while (<$blast1>) { 
    chomp; 
    @split = split('\t'); 
    push @blast1_info, $split[0]; 
    push @percent_id, $split[1]; 
    push @blast1ID, $split[2]; 
    $results1++; 
} 

print "$results1 blast hits in '$input1'\n"; 

push @{$blast1{$blast1ID[$_]} }, [ $blast1_info[$_], $percent_id[$_] ] for 0 .. $#blast1ID; 

輸入2:

XLOC_000561_31.1018:14.9273,_Change:-1.05905,_p:0.0073,_q:0.999592  91.57 gi|165973401|ref|NM_001113689.1|_Xenopus_(Silurana)_tropicalis_cytokine_inducible_SH2-containing_protein_(cish),_mRNA 
XLOC_000679_57.3461:29.2637,_Change:-0.970585,_p:0.03645,_q:0.999592 85.13 gi|51704135|gb|BC081195.1|_Xenopus_laevis_hypothetical_protein_LOC446937,_mRNA_(cDNA_clone_IMAGE:6640116),_partial_cds 
XLOC_000766_10.699:6.33756,_Change:-0.755473,_p:0.0384,_q:0.999592  99.04 gi|195972824|ref|NM_001130940.1|_Xenopus_laevis_interleukin_6_signal_transducer_(gp130,_oncostatin_M_receptor)_(il6st),_mRNA 

指定爲第2個基因的列表

$input2 = $ARGV[1]; 
open my $blast2, '<', $input2 or die $!; 

my $results2 = 0; 
my (@blast2ID, @blast2_info, @percent_id); 
while (<$blast2>) { 
    chomp; 
    @split = split('\t'); 
    push @blast2_info, $split[0]; 
    push @percent_id, $split[1]; 
    push @blast2ID, $split[2]; 
    $results2++; 
} 
print "$results2 blast hits in '$input2'\n"; 

push @{$blast2{$blast2ID[$_]} }, [ $blast2_info[$_], $percent_id[$_] ] for 0 .. $#blast2ID; 

查找鍵同時存在於兩個哈希值(基因):

my $intersect_count = 0; 
for my $key (sort keys %blast1) { 
    if (exists $blast1{$key} && $blast2{$key}) { 
     $intersect_count++; 
      for my $part1 (@ { $blast1{$key} }) { 
       ($hit1, $percent_id1) = @$part1; 
      } 
      for my $part2 (@ { $blast2{$key} }) { 
       ($hit2, $percent_id2) = @$part2; 
      } 
    push @intersect, "$key\tC1:$hit1 [$percent_id1]\tC2:$hit2 [$percent_id2]\n";    
    push @intersecting_list, "$key";     
    } 
} 

上面的代碼會發現一個基因是存在於兩個列表:

gi|165973401|ref|NM_001113689.1|_Xenopus_(Silurana)_tropicalis_cytokine_inducible_SH2-containing_protein_(cish),_mRNA 

我的問題是我該如何適應這個基因,輸出中包含相似的名稱?比如我希望看到:

gi|186928837|ref|NM_005982.3|_Homo_sapiens_SIX_homeobox_1_(SIX1),_mRNA 

找到一個匹配:

gi|154142326|ref|NM_001100275.1|_Xenopus_(Silurana)_tropicalis_SIX_homeobox_1_(six1),_mRNA 

有什麼建議?

+0

'NM_005982.3' * like *'NM_001100275.1'如何?你想只匹配最初的兩個字符嗎? – Borodin

+0

不 - 這是一件困難的事情 - 我試圖在基因名稱上匹配 - 例如'SIX_homeobox_1_(SIX1)'和'SIX_homeobox_1_(six1)'。 – fugu

+1

那麼,如果你想要獨立匹配基因名稱的* end *,那就沒問題了。有沒有像最後一個* 4 *字段(用下劃線分隔),總是必須匹配的部分?你必須以某種方式定義「相似」。 – Borodin

回答

2

有兩種策略可以使用

  1. 提取要使用實際的鍵,然後是精確匹配。

    原始密鑰的某些部分可能對您沒有任何用處 - 刪除它們。根據輸入,您可能還想要進行Unicode規範化,並執行大小寫摺疊。

    在你的情況下,

    gi|186928837|ref|NM_005982.3|_Homo_sapiens_SIX_homeobox_1_(SIX1),_mRNA 
    gi|154142326|ref|NM_001100275.1|_Xenopus_(Silurana)_tropicalis_SIX_homeobox_1_(six1),_mRNA 
    

    公用密鑰可能看起來像

    gi|ref|nm_00|_six_homeobox_1_(six1),_mrna 
    
  2. 破除哈希值,並計算所有可能的記錄之間的相似性指數。想知道這樣的指數,你可能想看看Levenstein edit distance。然後,您可以將特定邊界內的所有其他記錄視爲匹配。這相當昂貴,但可能會產生更好的結果。

我不知道你的問題域,所以我不能提出任何好的建議。


您的代碼存在一些問題,特別是在查找匹配時。它看起來像它應該是相同的:

my $intersect_count = 0; 
for my $key (sort keys %blast1) { 
    if (exists $blast2{$key}) { 
     $intersect_count++; 
     my ($hit1, $percent_id1) = @{ $blast1{$key}[-1] }; 
     my ($hit2, $percent_id2) = @{ $blast2{$key}[-1] }; 
     push @intersect, "$key\tC1:$hit1 [$percent_id1]\tC2:$hit2 [$percent_id2]\n"; 
     push @intersecting_list, $key; 
    } 
} 

差異:

  1. exists $blast1{$key} && $blast2{$key}被解析爲exists($blast1{$key}) && $blast2{$key},甚至是愚蠢的,因爲我們知道,$blast1{$key}存在:我們剛剛通過keys獲取吧!
  2. 在循環數組並將每個項目分配給變量時,變量將保留最後一項的值。即my $y; for my $x (@xs) { $y = $x }相當於my $y = $xs[-1],但效率較低。
+0

這是一個夢幻般的答案,我擔心的是一個不可能的問題。我一定會考慮Levenstein的編輯距離。您是否介意詳細闡述您在關鍵查找中所做的修改? – fugu

+1

@FlyingFrog我編輯了我的答案,並對我的修改進行了一些解釋。我不建議你實際使用萊文斯坦距離。這對平滑拼寫錯誤(或點突變)等是很有用的。您將不得不設計自己的度量標準,但Levenstein可能是其中的一部分。第一步是當兩個鍵比較相等時爲自己明確定義。 – amon