本节摘要:基因组不是只靠点突变积累的收藏册:整段重复让基因获得"备份后自由",转座子把序列搬来搬去,而水平基因转移(HGT)干脆绕过生殖谱系直接交换 DNA。本节讲重复-分化-亚功能化的路径、转座子与基因组的军备竞赛,以及 HGT 如何让微生物的演化史从树变成网,并给出基因家族扩张的模拟与 HGT 信号的检测思路。
一次不等交换或一次全基因组加倍,就能让一个基因拥有两份拷贝。此后三条路:
血红蛋白基因簇是教科书级的现场:胚胎型与成体型珠蛋白的分化,本质是重复拷贝把发育时序切分承包。嗅觉受体、细胞色素 P450 的大规模扩张走的是同一条路。进化创新的主流不是发明新零件,而是复制旧零件后让其中一份跑偏。
| 结局 | 相对概率 | 分子特征 |
|---|---|---|
| 假基因化 | 高 | 一份快速累积无义突变,dN/dS 趋近 1 |
| 亚功能化 | 中 | 两份分担原有表达域,序列都保守 |
| 新功能化 | 低但影响大 | 一份出现加速进化片段,dN/dS 局部 > 1 |
基因组的中段往往一大半是重复序列,其中相当比例是转座子——能复制或剪切自身再插入新位点的"可移动元件"。对宿主而言它们像寄生(插入破坏基因、诱发重排),但长期看也是创造力的来源:约几百个人类基因的调控区里有转座子搬来的启动子片段;免疫系统的 V(D)J 重组机制,起源就与转座酶同源。宿主则以 DNA 甲基化与小 RNA 系统压制转座活性——一场持续数亿年的分子军备竞赛。
细菌不热衷于"世系纯净":转化(捡环境 DNA)、转导(病毒捎带)、接合(细胞间管道)三条通道让基因跨物种流动。后果有二:其一,抗生素耐药基因能在完全无关的菌种间传播,医学上最要命的进化事件几乎都是 HGT 快递的;其二,深层的系统发育信号被搅浑——用不同基因建树会得到不同的拓扑,因为各基因各有各的转移史。生命之树在微生物端更像一丛交织的网,只是网里仍有一致的主干信号(核糖体蛋白等保守基因)。
检测 HGT 的基本思路是组成与系统发育的不一致:一个基因的 GC 含量、密码子偏好明显偏离宿主基因组背景,或它的树与宿主的树拓扑冲突,就怀疑是"搬来的"。屏幕上可以这样玩最小版:
import random def gene_family_evolution(n_genes=1, birth=0.06, loss=0.05, dup_size=2, gens=200, seed=0): """基因家族按 birth(重复)/loss(丢失)随机演化,看家族大小分布""" rng = random.Random(seed) sizes = [n_genes] history = [list(sizes)] for _ in range(gens): new = [] for fam in sizes: n = fam if rng.random() < birth * fam: # 任一拷贝都可能重复 n += dup_size - 1 if rng.random() < loss * fam and n > 0: n -= 1 new.append(n) sizes = new or [0] history.append(list(sizes)) return history[-1] rng = random.Random(0) finals = [] for trial in range(300): finals.append(gene_family_evolution(seed=trial).count(1) + 2 * gene_family_evolution(seed=trial).count(2)) print("300 次模拟的最终拷贝数分布(前20个样本):", finals[:20]) print(f"平均拷贝数 {sum(finals)/len(finals):.2f}")
birth 略大于 loss 时家族倾向于缓慢扩张并伴随大量丢失——真实基因组里基因家族大小的分布(少数巨型家族 + 大量单拷贝)正是这种随机生灭过程的指纹。
import random def gc_content(seq): g_or_c = sum(c in "GCgc" for c in seq) return g_or_c / max(len(seq), 1) def scan_composition_anomaly(genome_gc_windows, threshold=0.08): """滑窗 GC 与全基因组均值差超过阈值即标记""" mean = sum(genome_gc_windows) / len(genome_gc_windows) flags = [i for i, g in enumerate(genome_gc_windows) if abs(g - mean) > threshold] return mean, flags rng = random.Random(7) genome = [rng.gauss(0.38, 0.02) for _ in range(80)] # 宿主背景 AT 富集 genome[41:46] = [rng.gauss(0.62, 0.03) for _ in range(5)] # 塞入 GC 富集岛 mean, flags = scan_composition_anomaly(genome) print(f"全基因组 GC 均值 {mean:.3f}, 异常窗口编号: {flags}")
输出会稳定点名第 41–45 号窗口——那段 GC 岛就是"刚搬进来的外源基因"的粗粒化替身。真实流程(如用密窗口扫描 + 数据库比对推断来源)只是这个游戏的工业化版本。
💡 关键直觉:把基因组想成"自产零件 + 外购零件"的混合仓库。点突变改零件,重复加库存,转座子挪货架,HGT 直接从隔壁仓库进货——四种过程的时间平均,就是我们今天看到的基因组。
下一节把"两两比较"升维到"多序列建树"——生命之树的绘制现场。