本文介绍了基序发现问题和中间字符串问题。
引言:DNA调控元件
我们知道,DNA调控元件往往是一段相似的DNA序列。理想情况下这些序列完全一致,比如下面这样:
图片引自《生物信息学算法导论》
但实际上,这些序列不会完全一样,总会有若干位点发生“变异”,从而不同,比如下面这样:
图片引自《生物信息学算法导论》
如果给定一组DNA序列(暂且假定它们长度相等),那么如何找出这些相似的序列呢?由此可以引出两个问题,即基序发现问题和中间字符串问题。
一、基序发现问题
要说明基序
是什么,首先介绍一下序列剖面
(Profile)。
假设给定
t
t
t条长度为
n
n
n的
D
N
A
DNA
DNA序列,我们为其中每条序列选择一个起点
s
i
(
i
=
1
,
2
,
.
.
.
,
t
)
s_i \ (i=1,2,...,t)
si (i=1,2,...,t),截取该序列中以
s
i
s_i
si为起点的长度为
l
l
l的一个序列,称为一条
l
l
l-元组序列
。那么这
t
t
t个
l
l
l-元组序列就构成了一个
t
×
l
t \times l
t×l的联配矩阵
(alignment matrix),统计该矩阵的每一列中各个碱基出现次数,则构成了一个新的
4
×
l
4 \times l
4×l的矩阵,称为剖面矩阵
(profile matrix)。剖面矩阵各列最大值对应的碱基放到一起构成了一条长度为
l
l
l的序列,称为共有序列(consensus)。
比如下图中
t
=
7
,
l
=
8
t=7, l=8
t=7,l=8,序列剖面(Profile)就是一个
4
×
8
4 \times 8
4×8的一个矩阵:
图片引自《生物信息学算法导论》
接下来我们给出一系列符号定义,以便下文的讨论:
我们将这 t t t条长度为 n n n的序列记为 D N A DNA DNA;
定义 s ⃗ = { s 1 , s 2 , . . . , s t } , 1 ≤ s i ≤ n − l + 1 , f o r ( i = 1 , 2 , . . . , t ) \boldsymbol{\vec{s}} = \{s_1,s_2,...,s_t\}, \ 1 \leq s_i \leq n-l+1, \ for \ (i=1,2,...,t) s={s1,s2,...,st}, 1≤si≤n−l+1, for (i=1,2,...,t)为起始位点向量
;
定义 P ( s ⃗ ) \boldsymbol{P}(\boldsymbol{\vec{s}}) P(s)为 t × l t \times l t×l的剖面矩阵
;
将剖面矩阵 P ( s ⃗ ) \boldsymbol{P}(\boldsymbol{\vec{s}}) P(s)中第 j j j列的最大值记为 M P ( s ⃗ ) ( j ) , f o r ( j = 1 , 2 , . . . , l ) M_{\boldsymbol{P}(\boldsymbol{\vec{s}})}(j), \ for \ (j=1,2,...,l) MP(s)(j), for (j=1,2,...,l);
将共有序列的得分
记为 S c o r e ( s ⃗ , D N A ) = ∑ j = 1 l M P ( s ⃗ ) ( j ) Score(\boldsymbol{\vec{s}}, DNA) = \displaystyle \sum_{j=1}^l M_{\boldsymbol{P}(\boldsymbol{\vec{s}})}(j) Score(s,DNA)=j=1∑lMP(s)(j)。
那么,基序发现问题用我们上面的符号表示就是要找到:
(1.1)
a
r
g
m
a
x
s
⃗
 
S
c
o
r
e
(
s
⃗
,
D
N
A
)
\underset{\boldsymbol{\vec{s}}}{\mathrm{argmax}} \, Score(\boldsymbol{\vec{s}},DNA) \tag{1.1}
sargmaxScore(s,DNA)(1.1)
也就是说我们要计算得到:
(1.2)
max
s
⃗
 
S
c
o
r
e
(
s
⃗
,
D
N
A
)
\underset{\boldsymbol{\vec{s}}}{\max} \, Score(\boldsymbol{\vec{s}},DNA) \tag{1.2}
smaxScore(s,DNA)(1.2)
二、中间字符串问题
同样地,要讲清楚中间字符串问题,我们首先给出一些符号:
将一个 l l l-元组序列 v v v和一个以 s i s_i si为起始位点的 l l l-元组序列的
汉明距离
记为 d H ( v , s i ) d_H(v, s_i) dH(v,si),表示这两个序列中不相同位点的数目;
将一个 l l l-元组序列 v v v以及一组分别以 s ⃗ = { s 1 , s 2 , . . . , s t } \boldsymbol{\vec{s}} = \{s_1,s_2,...,s_t\} s={s1,s2,...,st}作为起始位点的 l l l-元组序列的总汉明距离表示为 d H ( v , s ⃗ ) = ∑ i = 1 t d H ( v , s i ) d_H(v,\boldsymbol{\vec{s}}) = \displaystyle \sum_{i=1}^t d_H(v,s_i) dH(v,s)=i=1∑tdH(v,si);
将一个 l l l-元组序列与一组 D N A DNA DNA序列的任意起始位点的总汉明距离的最小值记为 T o t a l D i s t a n c e ( v , D N A ) = min s ⃗   d H ( v , s ⃗ ) TotalDistance(v,DNA) = \underset{\boldsymbol{\vec{s}}}{\min} \, d_H(v,\boldsymbol{\vec{s}}) TotalDistance(v,DNA)=smindH(v,s)。
那么,中间字符串用上述符号表示就是要找到:
(2.1)
a
r
g
m
i
n
v
 
min
s
⃗
 
d
H
(
v
,
s
⃗
)
\underset{v}{\mathrm{argmin}} \, \underset{\boldsymbol{\vec{s}}}{\min} \, d_H(v,\boldsymbol{\vec{s}}) \tag{2.1}
vargminsmindH(v,s)(2.1)
也就是说我们要计算得到:
(2.2)
min
v
 
min
s
⃗
 
d
H
(
v
,
s
⃗
)
\underset{v}{\min} \, \underset{\boldsymbol{\vec{s}}}{\min} \, d_H(v,\boldsymbol{\vec{s}}) \tag{2.2}
vminsmindH(v,s)(2.2)
三、两个问题是等价的
我们可以证明计算式子(1.2)和计算(2.2)是一回事。
首先,根据第一部分的定义,式(1.2)其实就是:
(3.1)
max
s
⃗
 
S
c
o
r
e
(
s
⃗
,
D
N
A
)
=
max
s
⃗
 
∑
j
=
1
l
M
P
(
s
⃗
)
(
j
)
\underset{\boldsymbol{\vec{s}}}{\max} \, Score(\boldsymbol{\vec{s}},DNA) =\underset{\boldsymbol{\vec{s}}}{\max} \, \displaystyle \sum_{j=1}^l M_{\boldsymbol{P}(\boldsymbol{\vec{s}})}(j) \tag{3.1}
smaxScore(s,DNA)=smaxj=1∑lMP(s)(j)(3.1)
而式(2.2)也可以做变换。我们再给出一些符号,假定:
l l l-元组序列 v = { v 1 , v 2 , . . . , v l } v = \{v_1,v_2,...,v_l\} v={v1,v2,...,vl}
第一部分涉及到的 t × l t \times l t×l阶的联配矩阵为 A s ⃗ i j A_{\boldsymbol{\vec{s}}}^{ij} Asij, 其中 i = 1 , 2 , . . . , t ;   j = 1 , 2 , . . . , l 。 i=1,2,...,t; \, j=1,2,...,l。 i=1,2,...,t;j=1,2,...,l。
定义 S ( x , y ) S(x, y) S(x,y)来判断碱基 x x x和碱基 y y y是否相同,即:
S ( x , y ) = { 1 , if x = y 0 , if x ≠ y S(x,y)= \begin{cases} 1, & \text {if $x = y$} \\ 0, & \text{if $x \neq y$} \end{cases} S(x,y)={1,0,if x=yif x̸=y
定义 D ( x , y ) D(x, y) D(x,y)来判断碱基 x x x和碱基 y y y是否不同,即:
D ( x , y ) = { 0 , if x = y 1 , if x ≠ y D(x,y)= \begin{cases} 0, & \text {if $x = y$} \\ 1, & \text{if $x \neq y$} \end{cases} D(x,y)={0,1,if x=yif x̸=y
那么:
min
v
 
min
s
⃗
 
d
H
(
v
,
s
⃗
)
=
min
s
⃗
 
min
v
 
d
H
(
v
,
s
⃗
)
=
min
s
⃗
 
min
v
∑
i
=
1
t
d
H
(
v
,
s
i
)
=
min
s
⃗
 
min
v
∑
i
=
1
t
∑
j
=
1
l
D
(
A
s
⃗
i
j
,
v
j
)
=
min
s
⃗
 
min
v
∑
j
=
1
l
∑
i
=
1
t
D
(
A
s
⃗
i
j
,
v
j
)
=
min
s
⃗
∑
j
=
1
l
min
v
j
∑
i
=
1
t
D
(
A
s
⃗
i
j
,
v
j
)
=
min
s
⃗
∑
j
=
1
l
min
v
j
 
[
t
−
∑
i
=
1
t
S
(
A
s
⃗
i
j
,
v
j
)
]
=
min
s
⃗
∑
j
=
1
l
[
t
−
max
v
j
∑
i
=
1
t
S
(
A
s
⃗
i
j
,
v
j
)
]
=
min
s
⃗
∑
j
=
1
l
[
t
−
M
P
(
s
⃗
)
(
j
)
]
=
l
t
−
max
s
⃗
∑
j
=
1
l
M
P
(
s
⃗
)
(
j
)
=
l
t
−
max
s
⃗
 
S
c
o
r
e
(
s
⃗
,
D
N
A
)
\begin{aligned} \underset{v}{\min} \, \underset{\boldsymbol{\vec{s}}}{\min} \, d_H(v,\boldsymbol{\vec{s}}) & = \underset{\boldsymbol{\vec{s}}}{\min} \, \underset{v}{\min} \, d_H(v,\boldsymbol{\vec{s}}) \\ & = \underset{\boldsymbol{\vec{s}}}{\min} \, \underset{v}{\min} \displaystyle \sum_{i=1}^t d_H(v, s_i) \\ & = \underset{\boldsymbol{\vec{s}}}{\min} \, \underset{v}{\min} \displaystyle \sum_{i=1}^t \sum_{j=1}^l D(A_{\boldsymbol{\vec{s}}}^{ij}, v_j) \\ & = \underset{\boldsymbol{\vec{s}}}{\min} \, \underset{v}{\min} \displaystyle \sum_{j=1}^l \sum_{i=1}^t D(A_{\boldsymbol{\vec{s}}}^{ij}, v_j) \\ & = \underset{\boldsymbol{\vec{s}}}{\min} \displaystyle \sum_{j=1}^l \underset{v_j}{\min} \sum_{i=1}^t D(A_{\boldsymbol{\vec{s}}}^{ij}, v_j) \\ & = \underset{\boldsymbol{\vec{s}}}{\min} \displaystyle \sum_{j=1}^l \underset{v_j}{\min} \, \Bigg[t - \sum_{i=1}^t S(A_{\boldsymbol{\vec{s}}}^{ij}, v_j) \Bigg] \\ & = \underset{\boldsymbol{\vec{s}}}{\min} \displaystyle \sum_{j=1}^l \Bigg[t - \underset{v_j}{\max} \sum_{i=1}^t S(A_{\boldsymbol{\vec{s}}}^{ij}, v_j) \Bigg] \\ & = \underset{\boldsymbol{\vec{s}}}{\min} \displaystyle \sum_{j=1}^l \Bigg[t - M_{\boldsymbol{P}(\boldsymbol{\vec{s}})}(j) \Bigg] \\ & = lt - \underset{\boldsymbol{\vec{s}}}{\max} \displaystyle \sum_{j=1}^lM_{\boldsymbol{P}(\boldsymbol{\vec{s}})}(j) \\ & = lt - \underset{\boldsymbol{\vec{s}}}{\max} \, Score(\boldsymbol{\vec{s}},DNA) \end{aligned}
vminsmindH(v,s)=sminvmindH(v,s)=sminvmini=1∑tdH(v,si)=sminvmini=1∑tj=1∑lD(Asij,vj)=sminvminj=1∑li=1∑tD(Asij,vj)=sminj=1∑lvjmini=1∑tD(Asij,vj)=sminj=1∑lvjmin[t−i=1∑tS(Asij,vj)]=sminj=1∑l[t−vjmaxi=1∑tS(Asij,vj)]=sminj=1∑l[t−MP(s)(j)]=lt−smaxj=1∑lMP(s)(j)=lt−smaxScore(s,DNA)
上式中 l t lt lt是常数。这样,我们就可以看出基序发现问题和中间字符串问题在求解上其实是一回事。
小结
本文内容基于《生物信息学算法导论》,笔者所作的工作就是将算法推导过程补充详细。至于实现代码,我们会在后续文章中讨论。
(公众号:生信了)