本文介绍了基序发现问题和中间字符串问题。
引言:DNA调控元件
我们知道,DNA调控元件往往是一段相似的DNA序列。理想情况下这些序列完全一致,比如下面这样:

图片引自《生物信息学算法导论》
但实际上,这些序列不会完全一样,总会有若干位点发生“变异”,从而不同,比如下面这样:

图片引自《生物信息学算法导论》
如果给定一组DNA序列(暂且假定它们长度相等),那么如何找出这些相似的序列呢?由此可以引出两个问题,即基序发现问题和中间字符串问题。
一、基序发现问题
要说明基序是什么,首先介绍一下序列剖面(Profile)。
假设给定ttt条长度为nnn的DNADNADNA序列,我们为其中每条序列选择一个起点si (i=1,2,...,t)s_i \ (i=1,2,...,t)si (i=1,2,...,t),截取该序列中以sis_isi为起点的长度为lll的一个序列,称为一条lll-元组序列。那么这ttt个lll-元组序列就构成了一个t×lt \times lt×l的联配矩阵(alignment matrix),统计该矩阵的每一列中各个碱基出现次数,则构成了一个新的4×l4 \times l4×l的矩阵,称为剖面矩阵(profile matrix)。剖面矩阵各列最大值对应的碱基放到一起构成了一条长度为lll的序列,称为共有序列(consensus)。
比如下图中t=7,l=8t=7, l=8t=7,l=8,序列剖面(Profile)就是一个4×84 \times 84×8的一个矩阵:

图片引自《生物信息学算法导论》
接下来我们给出一系列符号定义,以便下文的讨论:
我们将这ttt条长度为nnn的序列记为DNADNADNA;
定义s⃗={s1,s2,...,st}, 1≤si≤n−l+1, for (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×lt \times lt×l的剖面矩阵;
将剖面矩阵P(s⃗)\boldsymbol{P}(\boldsymbol{\vec{s}})P(s)中第jjj列的最大值记为MP(s⃗)(j), for (j=1,2,...,l)M_{\boldsymbol{P}(\boldsymbol{\vec{s}})}(j), \ for \ (j=1,2,...,l)MP(s)(j), for (j=1,2,...,l);
将共有序列的得分记为Score(s⃗,DNA)=∑j=1lMP(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)argmaxs⃗ Score(s⃗,DNA)\underset{\boldsymbol{\vec{s}}}{\mathrm{argmax}} \, Score(\boldsymbol{\vec{s}},DNA) \tag{1.1}sargmaxScore(s,DNA)(1.1)
也就是说我们要计算得到:
(1.2)maxs⃗ Score(s⃗,DNA)\underset{\boldsymbol{\vec{s}}}{\max} \, Score(\boldsymbol{\vec{s}},DNA) \tag{1.2}smaxScore(s,DNA)(1.2)
二、中间字符串问题
同样地,要讲清楚中间字符串问题,我们首先给出一些符号:
将一个lll-元组序列vvv和一个以sis_isi为起始位点的lll-元组序列的
汉明距离记为dH(v,si)d_H(v, s_i)dH(v,si),表示这两个序列中不相同位点的数目;
将一个lll-元组序列vvv以及一组分别以s⃗={s1,s2,...,st}\boldsymbol{\vec{s}} = \{s_1,s_2,...,s_t\}s={s1,s2,...,st}作为起始位点的lll-元组序列的总汉明距离表示为dH(v,s⃗)=∑i=1tdH(v,si)d_H(v,\boldsymbol{\vec{s}}) = \displaystyle \sum_{i=1}^t d_H(v,s_i)dH(v,s)=i=1∑tdH(v,si);
将一个lll-元组序列与一组DNADNADNA序列的任意起始位点的总汉明距离的最小值记为TotalDistance(v,DNA)=mins⃗ dH(v,s⃗)TotalDistance(v,DNA) = \underset{\boldsymbol{\vec{s}}}{\min} \, d_H(v,\boldsymbol{\vec{s}})TotalDistance(v,DNA)=smindH(v,s)。
那么,中间字符串用上述符号表示就是要找到:
(2.1)argminv mins⃗ dH(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)minv mins⃗ dH(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)maxs⃗ Score(s⃗,DNA)=maxs⃗ ∑j=1lMP(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)也可以做变换。我们再给出一些符号,假定:
lll-元组序列v={v1,v2,...,vl}v = \{v_1,v_2,...,v_l\}v={v1,v2,...,vl}
第一部分涉及到的t×lt \times lt×l阶的联配矩阵为As⃗ijA_{\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)来判断碱基xxx和碱基yyy是否相同,即:
S(x,y)={1,if x=y0,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)来判断碱基xxx和碱基yyy是否不同,即:
D(x,y)={0,if x=y1,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
那么:
minv mins⃗ dH(v,s⃗)=mins⃗ minv dH(v,s⃗)=mins⃗ minv∑i=1tdH(v,si)=mins⃗ minv∑i=1t∑j=1lD(As⃗ij,vj)=mins⃗ minv∑j=1l∑i=1tD(As⃗ij,vj)=mins⃗∑j=1lminvj∑i=1tD(As⃗ij,vj)=mins⃗∑j=1lminvj [t−∑i=1tS(As⃗ij,vj)]=mins⃗∑j=1l[t−maxvj∑i=1tS(As⃗ij,vj)]=mins⃗∑j=1l[t−MP(s⃗)(j)]=lt−maxs⃗∑j=1lMP(s⃗)(j)=lt−maxs⃗ Score(s⃗,DNA)\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)
上式中ltltlt是常数。这样,我们就可以看出基序发现问题和中间字符串问题在求解上其实是一回事。
小结
本文内容基于《生物信息学算法导论》,笔者所作的工作就是将算法推导过程补充详细。至于实现代码,我们会在后续文章中讨论。
(公众号:生信了)
128


基序发现和中间字符串问题&spm=1001.2101.3001.11974&articleId=99722355&d=1&t=3&u=61530133ab7342c79191d3e05938e178)

被折叠的 条评论
为什么被折叠?



