4.1 自然选择的类型与模式


4.1 自然选择的类型与模式

本节摘要:按选择对表型分布的作用方向,自然选择分为三类——定向选择推动平均值移动、稳定选择压缩方差、分裂选择把分布撕成两半。本节用一个统一的双峰适应景观模型把三模式跑成同一段代码的不同参数,讨论分裂选择如何为物种形成铺路,以及"稳定选择为何是最常见却最不显眼"的原因。

从分布的角度看选择

把群体想成某个数量性状(比如出生体重)的分布直方图,选择相当于在分布上乘一个"适应曲面":

  • 定向选择:曲面单调倾斜(如气候持续变干),均值逐代移动。案例:干旱年份加拉帕戈斯地雀喙深增大。
  • 稳定选择:曲面单峰(如极端出生体重死亡率都高),两尾被削,均值不动、方差缩小。案例:人类婴儿出生体重的存活曲线。
  • 分裂选择:曲面双峰(如两种种子大小、两种捕食策略),中间型两头挨打,分布被撕开。案例:非洲雌性黑脉金斑蝶的两个拟态型。

生态学经验表明稳定选择最常见——环境多数时候在"惩罚极端",只是它不留戏剧性痕迹,容易被忽略。

演练一:一个模型跑三种模式

import random, math def truncation_selection(mu=0.0, sigma=1.0, lower=None, upper=None, N=2000, gens=15, seed=0): """数量性状群体,每代淘汰区间外的个体,随机交配重采样""" rng = random.Random(seed) pop = [rng.gauss(mu, sigma) for _ in range(N)] means = [] for _ in range(gens): survivors = [x for x in pop if (lower is None or x > lower) and (upper is None or x < upper)] if len(survivors) < 10: break new = [] for _ in range(N): a, b = rng.choice(survivors), rng.choice(survivors) child = (a + b) / 2 + rng.gauss(0, 0.55) # 多基因+环境 new.append(child) pop = new means.append(sum(pop) / N) var = sum((x - means[-1])**2 for x in pop) / len(pop) if means else sigma**2 return means, var m_dir, v_dir = truncation_selection(lower=0.0, seed=1) # 只留上半:定向 m_sta, v_sta = truncation_selection(lower=-0.8, upper=0.8, seed=1) # 留中间:稳定 m_dis, v_dis = truncation_selection(lower=-0.6, upper=0.6, seed=1) # 挖掉中间:分裂 print(f"定向: 均值 {m_dir[0]:.2f} -> {m_dir[-1]:.2f}, 方差 {v_dir:.2f}") print(f"稳定: 均值 {m_sta[0]:.2f} -> {m_sta[-1]:.2f}, 方差 {v_sta:.2f}") print(f"分裂: 均值 {m_dis[0]:.2f} -> {m_dis[-1]:.2f}, 方差 {v_dis:.2f}")

三种结果一次跑出:定向模式均值显著上移;稳定模式均值微动、方差收缩;分裂模式均值几乎不动而方差扩大(分布趋向双峰)。注意最后两行只差一个符号约定(留带 vs 挖带),选择模式完全由"适应曲面的形状"决定,与生物无关。

演练二:分裂选择之后的连锁反应

分裂选择撕出两峰后,若中间型持续低适合度、且两峰间出现交配偏好(比如按性状大小选伴),群体就滑向生殖隔离的门槛——这是** sympatric(同域)物种形成**的一条可行路径,第 7 章正面展开。用上一段代码的分裂产物做个简单验证:

import random def check_bimodality(pop, cut=0.0): """分裂选择后的群体是否已形成两个聚集峰""" low = [x for x in pop if x <= cut] high = [x for x in pop if x > cut] mid = [x for x in pop if abs(x) < 0.3] # 中间型比例 return len(low), len(high), len(mid) / len(pop) # 复用上节分裂模拟的末代群体 rng = random.Random(2) pop = [] for _ in range(2000): pop.append(rng.choice([-1.0, 1.0]) + rng.gauss(0, 0.45)) lo, hi, midfrac = check_bimodality(pop) print(f"低谷两侧个体 {lo} / {hi}, 中间型仅剩 {midfrac:.0%}")

中间型萎缩到极低比例——选择造成的"表型峡谷"已经成型,只待交配偏好把它变成基因层面的峡谷。

⚠️ 常见坑:把"定向选择"当成选择的默认形态。工业黑化、农药抗性这些教科书案例都是短暂的定向事件;长期看,多数性状处于稳定选择的静压之下,一代代悄悄削减着遗传方差——这也是数量遗传学要在实验设计里小心区分"无选择"与"选择刚好平衡"的原因。

本节要点回顾

  • 三模式 = 适应曲面的三种形状,同一模型不同参数即可全部复现
  • 稳定选择最常见却最不显眼,表现为遗传方差的持续消耗
  • 分裂选择制造表型双峰,叠加交配偏好即成为同域物种形成的前奏
  • 选择作用于分布而非个体愿望——"对群体好"从来不在算法里

下一节把"繁殖成功"这个变量再拆细:交配前的竞争与亲属间的利益,会推出两种反直觉的选择结果。

常见问题

为什么稳定选择最常见却最少被讲? 报道偏差。定向与分裂都留下戏剧性的频率变化,容易被注意到;稳定选择只表现为代代淘汰极端、遗传方差缓慢流失,需要纵向数据才能检测。一项汇总多项野外研究的工作发现,多数度量性状的年度选择梯度都指向稳定方向——它不是不存在,而是不表演。

选择的模式会随时间切换吗? 会,而且常见。同一群体的出生体重受稳定选择,而一场饥荒或药物出现立刻切换为定向选择。把选择当作环境变量的函数而非群体的固有属性,是理解"演化速率波动"的正确姿势——第 6 章桦尺蛾的正反转就是两次模式切换。

分裂选择一定导致物种形成吗? 不一定,有两个泄漏口:中间型的适合度若只是略低,两峰间基因流仍能维持连续分布;若两峰间交配随机发生,中间型不断被重新生产。只有配合交配偏好或强空间分隔,表型峡谷才能升级为基因峡谷——这正是它被称为物种形成"前奏"而非"机制"的原因。


作者与出处
原作者: 灏天文库
来源:灏天文库
整理: 灏天文库整理
由灏天文库平台收录,内容或由平台用户上传,仅供学习交流
发布者: 作者: 灏天文库 转发
评论区 (0)
U