1. 程式人生 > >DNA特徵提取之序列組裝K-mer演算法

DNA特徵提取之序列組裝K-mer演算法

基因就像一本天書,裡面的字都是有A,T,C,G組成的。我們測序出來的大於幾百bp的小的序列,我們叫做reads。我們測序的結果中有上百萬條的reads,而這些reads的位置我們又不知道,我們只能根據他們重疊的部分來儘量還原他的原型。

k-mer是指將reads分成包含k個鹼基的字串,一般長短為m的reads可以分成m-k+1個k-mers。舉個例子吧:為了簡化,有這麼個reads(當然實際比這個長):AACTGACTGA.如果k-mer的k為3的話,我們可以將其切割為AAC  ACT  CTG  TGA GAC ACT CTG TGA。我們將這些k-mers放入計算機中拼接,假設第一個為TGA ,那麼下一個應該為GA-,.……

1 2 3 4 5 TGA  GAC ACT CTG TG????

基於這樣的思路,我們很快就發現了問題,下一個點可能有很多的選擇,或者沒有選擇
kmer_1

       我們需要找到Hamiltonian path,我們需要找到包含每個點的,但是隻包含一次。下影象不像我們小學之前做過的遊戲,遍歷每個點,但是每個點只能經過一次。

kmer_2

這是俄國一個我一個偉大的科學家William Hamilton的一個發明。

kmer3

但是又提出了一個假設,如果有兩條或多條的Hamiltonian path呢?如何才能知道其中的一條是DNA的序列呢
kmer4

我們上面提到的是3個鹼基為一個node,現在我們就只要其中的2個來作圖,然後將作出的圖中相同的node合併,

kmer5

這是兩種演算法思想,在Eulerian Path Problem中,visit every edge of the graph exactly once.
而在Hamiltonian Path Problem,visit every node exactly once.第一種演算法更好實現,所以我們接下來講關於Eulerian Path Problem的de Bruijin graphs。

在實際組裝基因的時候,我們知道的是reads和k-mers,通過這個我們來基於Eulerian Path Problem來構建de Bruijin graphs,然後找Eulerian Path。可是會有很多的de Bruijin graphs,或者一個de Bruijin graphs有幾個Eulerian Path。為了減少contigs,發明了read pair sequencing

kmer6

把很多拷貝的相同基因,尺寸隨意剪下為大的相同大小InsertLength片段。產生read-pairs:兩個reads來自每個片段的末尾。A paired k-mer就是兩個k-mer距離相隔d,
kmer7

根據我的實際使用經驗,如果你的read足夠長,覆蓋度足夠高,kmer設的越高越好。
但是實際情況是,測序的覆蓋度經常不夠,或者用早期的GA平臺測出來read長度只有35bp,或者為了節省成本,在mate-pair library(長片段insert的文庫,一般>2kb)測序時雙端只有70bp,甚至40bp之類的,情況比較複雜。

       一般來說,我儘量使用更高的kmer,如果我有100bp的pair-end,50bp的mate-pair,而且覆蓋度挺高,我就用到kmer=45左右,如果mate-pair只有40bp,kmer=35左右。如果mate-pair更短,只有35bp,kmer值就再降一點。

轉載:http://qinqianshan.com/k-mer-de-bruijin-graphs-based-on-algorithm-of-sequence-assembly/