跳转到内容

序列、字符串与坐标系统

快速概览

生物序列(DNA, RNA, 蛋白质)在计算层面上被抽象为有限字母表上的字符串。理解这一抽象以及随之而来的坐标系统约定,是所有后续算法(如比对、组装)的物理基础。

  • 掌握 DNA 的四字符字母表 {A, C, G, T} 及其双链互补特性
  • 理解"反向互补" (Reverse Complement) 在测序数据处理中的核心地位
  • 区分 0-based 与 1-based、半开区间与闭区间等坐标约定
  • 认识字符串抽象如何将生物学问题转化为计算几何与模式匹配问题
所属板块 基础与数学

对象层、坐标系统、coverage 与概率图模型的共同语言。

阅读目标 帮助建立阅读上下文

先判断这页与你当前问题的关系,再决定是否深入展开。

建议前置 先建立相关基础对象与方法直觉

建议先建立相关基础对象与方法直觉,再进入本页。

在计算机眼里,复杂的生物大分子被简化为线性排列的字符。这一抽象是生物信息学所有后续计算的基础——比对、组装、变异检测、Motif 搜索,归根结底都是字符串操作。

DNA 字符串
字母表 $Sigma = {A, C, G, T}$。长度可从几百 bp(Reads)到几百 Mb(染色体)。人类基因组约 $3 imes 10^9$ bp。
RNA 字符串
字母表 $Sigma = {A, C, G, U}$。RNA 中的 U(尿嘧啶)取代了 DNA 中的 T(胸腺嘧啶)。通常代表转录后的信息片段,如 mRNA、tRNA、rRNA。
蛋白质字符串
字母表 $Sigma$ 包含 20 种标准氨基酸(单字母编码:A, C, D, E, F, G, H, I, K, L, M, N, P, Q, R, S, T, V, W, Y)。蛋白质的性质很大程度上取决于氨基酸序列。

生物序列并非均匀的同质字符串,而是具有内部层次结构的:

基因组(Genome, ~3 Gb)
└── 染色体(Chromosome, ~50-250 Mb)
└── 基因(Gene, ~1-100 kb)
└── 外显子(Exon, ~50 bp - 几 kb)
└── 密码子(Codon, 3 bp)
└── 碱基(Nucleotide, 1 bp)

理解这种层次结构对于设计高效的索引和搜索算法至关重要。例如,在进行全基因组比对时,通常先在染色体级别定位,再在基因级别精细比对,而非直接在碱基级别进行暴力搜索。

DNA 和 RNA 链具有极性(Polarity)。核苷酸通过磷酸二酯键连接,化学方向决定了信息流的走向:

  • 5’ 端:磷酸基团端,通常写在序列的左侧。
  • 3’ 端:羟基端,通常写在序列的右侧。

在生物信息学中,除非特别说明,字符串默认按 5’ 端到 3’ 端的顺序存储。这一约定是所有比对算法和搜索算法的隐含前提。

DNA 聚合酶只能沿 5’ 到 3’ 方向合成新链,这一生物学事实深刻影响了测序技术的设计和数据处理的方式。

由于 DNA 是双链且反向平行的,理解反向互补操作是处理测序数据的基本功。

对于序列 S=5’-ATGC-3’S = \text{5'-ATGC-3'}

  1. 互补(Complement):按 A-T, G-C 配对规则得到 3'-TACG-5'
  2. 反向(Reverse):将字符串前后颠倒,得到 5'-GCAT-3'

用数学符号表示:给定序列 S=s1s2snS = s_1 s_2 \cdots s_n,其反向互补序列 SrcS^{rc} 为:

Src=snsn1s1S^{rc} = \overline{s_n} \cdot \overline{s_{n-1}} \cdots \overline{s_1}

其中 si\overline{s_i} 表示 sis_i 的互补碱基(A=T\overline{A}=T, T=A\overline{T}=A, G=C\overline{G}=C, C=G\overline{C}=G)。

在搜索 Motif 或比对 Reads 时,必须同时考虑原始序列及其反向互补链,因为测序仪可能从任何一条链上读取信息。这意味着:

  • 双链搜索:在参考基因组上搜索时,通常需要同时搜索正链和反链(反向互补),然后将结果合并。
  • Read 比对:比对器(如 BWA、Bowtie2)会自动尝试将 Read 同时比对到正链和反链,取得分更高的结果。
  • k-mer 索引:构建 de Bruijn 图或 k-mer 索引时,通常约定使用字典序较小的 k-mer 作为规范形式(Canonical k-mer),以避免正反链的重复计数。

在实际的测序数据中,并非所有位置都能被明确识别为 A、C、G 或 T。IUPAC(国际纯粹与应用化学联合会)定义了一套扩展编码来表示不确定的碱基:

符号含义说明
AA腺嘌呤
CC胞嘧啶
GG鸟嘌呤
TT胸腺嘧啶
NA/C/G/T任意碱基(Unknown)
RA/G嘌呤(Purine)
YC/T嘧啶(Pyrimidine)
SG/C强氢键(3 个氢键)
WA/T弱氢键(2 个氢键)
KG/T酮基(Keto)
MA/C氨基(Amino)
BC/G/T非 A
DA/G/T非 C
HA/C/T非 G
VA/C/G非 T

在参考基因组中,N 通常表示未测序或无法确定的区域(如着丝粒、端粒等高度重复区域)。

3. 坐标系统:生物信息学的”巨坑”

Section titled “3. 坐标系统:生物信息学的”巨坑””

不同工具和文件格式对位置的计数规则不同,这常导致 Off-by-one(差一) 错误。坐标系统的混淆是生物信息学初学者最常遇到的陷阱之一。

维度 0-based (零基) 1-based (一基)
**起始编号** 从 0 开始计算 从 1 开始计算
**区间表示** 通常为半开区间 $[start, end)$ 通常为闭区间 $[start, end]$
示例格式 BED, BAM (内部), Python 索引 VCF, GFF, SAM (文本列), R (Bioconductor)
**长度计算** $end - start$ $end - start + 1$

除了起始编号的差异,区间端点的包含性也不同:

  • 半开区间 [start,end)[start, end):包含 startstart,不包含 endend。Python 风格,BED 格式使用。
  • 闭区间 [start,end][start, end]:同时包含 startstartendend。VCF、GFF 格式使用。

对于序列 ACTG

  • 0-based 半开区间 系统中:
    • 第一个碱基 A 的位置是 0
    • 区间 [0, 2) 代表 AC(位置 0 和 1)
    • 区间长度为 20=22 - 0 = 2
  • 1-based 闭区间 系统中:
    • 第一个碱基 A 的位置是 1
    • 区间 [1, 2] 代表 AC(位置 1 和 2)
    • 区间长度为 21+1=22 - 1 + 1 = 2

注意:同一个生物学区间在这两种系统中的数值表示不同。BED 格式中的 [0, 100) 和 GFF 格式中的 [1, 100] 实际上代表的是同一个区域。

文件格式坐标系统区间类型说明
BED0-based半开 [start,end)[start, end)UCSC 系列工具使用
GFF/GTF1-based[start,end][start, end]基因注释标准格式
VCF1-based单点变异位点坐标
SAM1-based闭(文本列)POS 列从 1 开始
BAM0-based半开(内部)BAM 二进制内部使用 0-based
GenBank1-based[start,end][start, end]NCBI 序列格式

在编写脚本处理不同格式的数据时,坐标转换是几乎不可避免的。以下是常见的转换规则:

  • BED 到 GFFstartGFF=startBED+1start_{GFF} = start_{BED} + 1endGFF=endBEDend_{GFF} = end_{BED}
  • GFF 到 BEDstartBED=startGFF1start_{BED} = start_{GFF} - 1endBED=endGFFend_{BED} = end_{GFF}
  • SAM POS 到 BAM 0-basedpos0based=posSAM1pos_{0based} = pos_{SAM} - 1

许多数据处理事故(如提取了错误的基因组区域、统计了错误长度的区间)都可以追溯到坐标系统的混淆。建议在项目中统一使用一种坐标约定,并在格式转换时显式处理差异。

一旦序列被视为字符串,我们就能借用计算机科学中数十年的研究成果来解决生物信息学问题。

字符串问题生物信息学应用经典算法
子串匹配在基因组中寻找 Motif 或引物位置KMP, Boyer-Moore, Rabin-Karp
编辑距离衡量两条序列之间的变异(替换、插入、缺失)Levenshtein DP, Needleman-Wunsch
最长公共子序列(LCS)寻找两条序列的最长相似区域DP, Hirschberg
后缀数组 / 后缀树构建全基因组索引,实现快速搜索Ukkonen 算法, SA-IS
哈希与索引在 30 亿碱基的基因组中实现秒级搜索最小完美哈希, Bloom Filter
正则表达式在序列中搜索模式(如 PROSITE 蛋白质模式)NFA/DFA 匹配

字符串算法在测序分析中的角色

Section titled “字符串算法在测序分析中的角色”

现代测序分析流程中的几乎所有步骤都依赖于字符串算法:

  1. Read 比对:使用基于后缀数组或 Burrows-Wheeler Transform (BWT) 的索引,将数百万条 Reads 映射到参考基因组上。BWA、Bowtie2 等工具的核心就是高效的字符串索引和搜索。
  2. 基因组组装:将 Reads 拼接为更长的 Contig。基于 de Bruijn 图的组装方法本质上是对所有 k-mer(长度为 kk 的子串)的图论处理。
  3. 变异检测:比较比对后的序列与参考序列,识别替换、插入、缺失等变异。这本质上是字符串差分的分析。
  4. Motif 搜索:在 DNA 或蛋白质序列中寻找保守的模式。PWM(位置权重矩阵)模型就是对字符串模式的概率化描述。

虽然生物序列可以被视为字符串,但它们有一些普通字符串不具备的特殊性质:

  • 大规模:人类基因组约 30 亿字符,远超普通字符串算法的典型输入规模。这要求算法具有极高的空间和时间效率。
  • 近似匹配:生物序列中的变异意味着我们需要处理”近似匹配”(允许少量错配),而非精确匹配。这大大增加了问题的复杂度。
  • 双链性:DNA 的双链性质要求同时考虑正向和反向互补,使搜索空间加倍。
  • 重复序列:基因组中大量重复序列(如 Alu 元件、LINE 元件)导致许多子串在基因组中出现多次,使比对和组装面临歧义性挑战。

编辑距离(Levenshtein Distance)衡量将一个字符串转换为另一个字符串所需的最少编辑操作次数。在生物信息学中,这对应于两条序列之间的最小变异量。

三种基本编辑操作:

操作符号生物学含义典型代价
替换(Substitution)sisjs_i \to s_j单核苷酸变异(SNV)取决于评分矩阵
插入(Insertion)插入一个字符相对于参考序列的插入变异空位罚分
删除(Deletion)删除一个字符相对于参考序列的缺失变异空位罚分

编辑距离可以通过动态规划在 O(nm)O(nm) 时间内计算,其中 nnmm 是两条序列的长度。这是 Needleman-Wunsch 和 Smith-Waterman 比对算法的数学基础。

k-mer 是长度为 kk 的子串。k-mer 分析是现代基因组分析的基础工具:

  • k-mer 频谱:统计所有 k-mer 的出现频率,可以估计基因组大小、检测污染和评估覆盖度。
  • k-mer 索引:将所有 k-mer 及其位置存储在哈希表中,实现 O(1)O(1) 的种子查找。
  • de Bruijn 图:以 k-mer 为边、(k1)(k-1)-mer 为顶点构建图,是基因组组装的核心数据结构。

一条长度为 nn 的序列包含 nk+1n - k + 1 个重叠的 k-mer(步长为 1),或 n/k\lfloor n/k \rfloor 个不重叠的 k-mer(步长为 kk)。

  • 基因组组装:将大量短 Reads 拼接为完整的基因组序列,核心挑战在于处理重复序列和测序错误。
  • 序列比对:将 Reads 或 contigs 映射到参考基因组上,是变异检测、RNA-seq 定量等分析的基础步骤。
  • 变异检测:通过比较样本序列与参考序列,识别单核苷酸变异(SNV)、插入缺失(Indel)和结构变异(SV)。
  • 基因注释:在基因组序列上标注基因、外显子、调控元件等功能区域的位置。