昨天刷着手机,看到一篇结论吸引人的文章:“全因死亡率和成人身高呈U型曲线,男性174cm和女性158cm的风险最低(临界性显著)(Li et al., 2021) ”。这篇文章使用了Meta分析,整合了欧洲、美洲和中国总计超过2亿个个体的数据,从非线性的角度解释了以往研究中身高-全因死亡率令人困惑、互相矛盾的关系,指出这种困惑可能是由于非线性的关系。身高-全因死亡率为U型曲线,并且这种关系在大多数亚组分析中均显著。尽管研究中承认了目前样本、证据和理论上的不足,但同样强调了结果(U型曲线)的鲁棒性。幸运的是,该研究的过程和目的和今天的主题无关,我们只需要这篇文章的结果,也就是这张图:

Li et al., 2022。通过使用受限三次样条和比较全因死亡率的预测相对风险点估计值,模拟成人身高与全因死亡率之间的非线性剂量反应关联(A,欧洲男性研究的汇总结果;B,欧洲女性研究的汇总成果;C,亚洲男性研究的汇集结果;D,亚洲女性研究的汇集成果)。
我发现,图中欧洲和亚洲U型曲线最低点所对应的身高,似乎比人口统计报告中的身高要低一些。很快,我意识到一个矛盾的点。如果低于目前平均值的身高能在全生命阶段带来好处,那么身高应该被选择,人群的平均身高最终应该接近生存率最优的,但平均身高似乎比这个值高得多。这可能存在几种可能(1)平均身高事实上接近生存率最优的值,没有显著差异;(2)调查没有在每个分层上进行,其它因素比如营养介导了这种关系;(3)较高的身高确实提高了死亡率,但同时提高了繁殖成功率或能产生更多后代。也就是所谓的拮抗多效性假说,也是我今天想介绍的重点。
拮抗多效性(Antagonistic Pleiotropy)假说是进化生态学中的一个重要概念,用于解释对生物存在明显负效应的基因在进化中仍然得以保留的情况(Mitteldorf, 2019; Williams, 1957)。其核心理论是,在生命中或生命后期对生物体有害的基因,因为有助于繁殖成功而抵消了其不利影像,或其在生命后期才产生负作用而不受选择压力的影响。该理论最出名的成果是解释了衰老的问题。控制衰老的基因是保守的(Guarente & Kenyon, 2000),意味着永生在进化中不受支持,而一个永生、永远保持繁殖期的个体的好处是显而易见的——可以产生无限多的后代。拮抗多效性假说解释了这种矛盾,生命前期帮助繁殖的基因在生命后期造成了个体的死亡(Williams, 1957)。大量与衰老有关的疾病被认为通过这种途径维持,比如亨廷顿舞蹈病、囊性纤维化和镰刀型贫血病(Carter & Nguyen, 2011)。亨廷顿舞蹈病通常在30-45岁,繁殖年龄之后发病,表现为不受控制的运动和较低的预期寿命,然而其患者的生育能力显著增加(Shokeir, 1975),并且在生命的早期,致病的蛋白反而促进了患者大脑的发育(Neema et al., 2024)。还有一些性状通过帮助繁殖得以保留。女性的促卵泡生成素促进卵泡的成熟,帮助月经和排卵。但在绝经后仅仅使得总胆固醇和低密度脂蛋白胆固醇增加,提高了心血管疾病如动脉粥样化的发生风险(Chu et al., 2003)。另一个例子是绵羊角的大小由一个基因所控制,大角有助于在发情期保卫雌性配偶,但消耗能量较大,存活率低;小角在性竞争中处劣势,但存活率较高。这两种等位基因由此实现了平衡(Johnston et al., 2013)。拮抗多效性理论还可以从经济学的角度理解,在一个随时可能关闭的交易市场中(死亡可能是外源性的),即时兑现比长期持有收益更高。

Johnston et al., 2013。不同基因型雄性绵羊的繁殖成功率、存活率和适合度,以大角羊为基准。
值得注意的是,越来越多的证据表明,拮抗多效性假说是不完善的。许多控制衰老的基因没有发现任何好处(若假设这些基因有未发现潜在的好处,会使得假说不可证伪,失去科学性)。秀丽隐杆线虫的一种突变体,进行生殖腺切除加上daf-2 RNA处理后,不仅寿命达到了正常个体的近5倍,同时保持了相当高的活力,而不是预测中较低的代谢水平(Arantes-Oliveira et al., 2003)。这可能是因为在秀丽隐杆线虫中,只存在早期繁殖与晚期繁殖的权衡,繁殖总数与寿命没有权衡(Anderson et al., 2011)。在自然选择中,延长寿命或延缓衰老的基因同样可以受到正向的选择,这是拮抗多效性假说没有注意到的(Yin et al., 2017)。在另一方面,突变积累假说和近中性假说也能解释衰老和有害基因的保留。若有害基因只在生命的晚期发挥作用,或者在繁殖结束前的负面影响很小,那么就有可能被遗传漂变所固定(P.B. Medawar, 1957; TOMOKO OHTA 1973)。更真实的情况也许是,拮抗多效性、突变积累在生物体中同时存在,不同基因的固定方式存在差异。
理解了拮抗多效性,回到开头的例子,就不难理解可能(3)。客观上看,缺少一种维持人类种群平均身高高于最佳的健康身高的动力。主观上,社会的审美对身高是有追求的,比如“高富帅”。当然,不能满足于主观上的逻辑联系,应该进一步地用定量的关系进行验证。幸运的是,中国家庭追踪调查(CFPS)提供了这样的数据,包括来自同一个体的年龄、身高和婚姻状况。接下来,我将尝试用一个建立在可能(3)假设上的简单的模型的结果,对比CFPS的数据。希望从这个例子中,可以加深对拮抗多效性的理解。
模型的假设如下:(1)身高和死亡率呈U型曲线,并和配偶几率线性正相关;(2)身高由遗传因素决定,环境影响很小。为了避免融合遗传,设定雄性子代的身高略高于父母的平均值,而雌性子代的身高更多地由母亲决定;(3)每个个体只在全生命阶段繁殖一次;(4)个体随机交配,交配概率只和身高有关。模型流程如下:(1)初始化种群,并使得男女比为1;(2)根据身高,计算死亡率,判断个体能否进入繁殖阶段;(3)根据身高,计算配偶几率,判断个体能否参与配偶;(4)在参与配偶的个体中有放回抽样,两两配对,繁殖出两个子代,男女各一; (3)回到步骤(2),迭代至种群平均身高稳定。模型的参数从统计数据中获得,人类种群的男性平均身高设定为170.6cm,女性平均身高设定为158.6。身高-相对死亡率关系从Li et al., 2021中获得,男性身高每偏离170cm一厘米,相对死亡率提高8%;女性每偏离155cm一厘米,相对死亡率提高0.3%。
x
import numpy as npimport pandas as pdimport matplotlib.pyplot as pltfrom scipy import statsfrom scipy.stats import linregressimport statsmodels.api as smimport statsmodels.formula.api as smf
# ConstantsMEAN_HEIGHT_MEN = 170.6MEAN_HEIGHT_WOMEN = 158.6AGE_RANGE = (40, 70)SIMULATION_ITERATIONS = 2000POPULATION_SIZE = 10000
def simulate(K=0.0004): """Simulates the effect of height on mating success and survival.""" Hm = np.random.normal(MEAN_HEIGHT_MEN, 5, POPULATION_SIZE) Hw = np.random.normal(MEAN_HEIGHT_WOMEN, 5, POPULATION_SIZE)
def death_probability(height, is_male=True): base_height = MEAN_HEIGHT_MEN if is_male else MEAN_HEIGHT_WOMEN return 6e-2 * (1 + abs(base_height - height) * (8e-2 if is_male else 3e-3))
male_heights = [] female_heights = []
for _ in range(SIMULATION_ITERATIONS): # Survival to reproductive age Hm = Hm[np.random.random(POPULATION_SIZE) > death_probability(Hm, True)] Hw = Hw[np.random.random(POPULATION_SIZE) > death_probability(Hw, False)]
# Mating probability Pm = 0.5 + K * (Hm - MEAN_HEIGHT_MEN) Pw = 0.5 + K * (Hw - MEAN_HEIGHT_WOMEN) # Select mates Hm = Hm[np.random.random(len(Hm)) < Pm] Hw = Hw[np.random.random(len(Hw)) < Pw]
# Sample next generation Hm = np.random.choice(Hm, POPULATION_SIZE, replace=True) Hw = np.random.choice(Hw, POPULATION_SIZE, replace=True)
# Reproduction b = MEAN_HEIGHT_WOMEN / MEAN_HEIGHT_MEN / 2 Hm = (Hm + Hw) * (0.5 / (b + 0.5)) + np.random.normal(0, 1, POPULATION_SIZE) # 加白噪声防止融合效应 Hw = (Hm * b + 0.5 * Hw) + np.random.normal(0, 1, POPULATION_SIZE)
male_heights.append(np.mean(Hm)) female_heights.append(np.mean(Hw))
plot_simulation_results(male_heights, female_heights) return calculate_error(male_heights, female_heights)
def plot_simulation_results(male_heights, female_heights): """Plots the simulation results for male and female heights over iterations.""" plt.plot(male_heights, label='Men') plt.plot(female_heights, label='Women') plt.legend() plt.show()
def calculate_error(male_heights, female_heights): """Calculates the average error of the last 500 iterations from the mean height.""" return (abs(np.mean(male_heights[-500:]) - MEAN_HEIGHT_MEN) + abs(np.mean(female_heights[-500:]) - MEAN_HEIGHT_WOMEN))
def run_simulations(): """Runs multiple simulations with varying K values and plots the results.""" k_values = np.arange(0, 1e-3, 1e-4) all_k_lst = []
for _ in range(10): k_lst = [simulate(k) for k in k_values] plt.scatter(range(len(k_lst)), k_lst) plt.axhline(0) plt.show() all_k_lst.extend(k_lst)
analyze_simulation_results(k_values, all_k_lst)
def analyze_simulation_results(k_values, all_k_lst): """Analyzes the simulation results using a quadratic regression model.""" data = pd.DataFrame({ 'k': np.tile(k_values, 10), 'output': all_k_lst, 'k_squared': np.tile(k_values, 10)**2 })
model = smf.ols(formula='output ~ k + k_squared', data=data).fit() print(model.summary())
predictions = model.get_prediction(data[['k', 'k_squared']]) pred_summary = predictions.summary_frame(alpha=0.05) plot_regression_analysis(data, model, pred_summary)
def plot_regression_analysis(data, model, pred_summary): """Plots the regression analysis results including confidence intervals.""" sorted_data = data.copy() sorted_data['ci_lower'] = pred_summary['mean_ci_lower'] sorted_data['ci_upper'] = pred_summary['mean_ci_upper'] sorted_data = sorted_data.sort_values('k')
fig, ax = plt.subplots(figsize=(10, 6)) ax.scatter(sorted_data['k'], sorted_data['output'], color='blue', alpha=0.6, label='Simulation abs-error') x_fit = sorted_data['k'] y_fit = model.predict(sorted_data[['k', 'k_squared']]) ax.plot(x_fit, y_fit, color='red', linestyle='--', linewidth=2, label='Quadratic Fit') ax.fill_between(x_fit, sorted_data['ci_lower'], sorted_data['ci_upper'], color='red', alpha=0.1, label='95% Confidence Interval') ax.axhline(0, color='black', linewidth=0.5) ax.set_title('') ax.set_xlabel('K values') ax.set_ylabel('Simulate abs-error') ax.grid(True) ax.legend() plt.savefig("1.jpg", dpi=300) plt.show()
def analyze_cfps_data(file_path="cfps2020person_202112.dta"): """Analyzes CFPS data to find the relationship between height and marriage rate.""" res = pd.read_stata(file_path) married = res.qea0 height = res.qp101 index = res.qp101.isna() | (res.qp101 == '缺失') | (res.qp101 == '拒绝回答') | (res.qp101 == '不知道') | (res.qea0 == '没有有效数据') married = ~(married[~index] == '未婚') height = np.array(height[~index], dtype=float) age = np.array(res.age[~index], dtype=float) valid_indices = (age > AGE_RANGE[0]) & (age < AGE_RANGE[1]) married = married[valid_indices] height = height[valid_indices]
marriage_rates = [np.sum((height > n) & (height < n + 2) & married) / np.sum((height > n) & (height < n + 2)) for n in range(161, 180)] x = np.arange(161, 180) slope, intercept, r_value, p_value, std_err = linregress(x, marriage_rates) df = len(x) - 2 t_value = stats.t.ppf(1 - 0.05/2, df) margin_of_error = t_value * std_err confidence_interval = (slope - margin_of_error, slope + margin_of_error)
plot_cfps_results(x, marriage_rates, slope, intercept, confidence_interval)
def plot_cfps_results(x, y, slope, intercept, confidence_interval): """Plots the CFPS data analysis results including the linear fit and confidence interval.""" plt.scatter(x, y, color='blue', alpha=0.6, label='Data Points') fit_line = slope * x + intercept plt.plot(x, fit_line, color='red', linestyle='--', linewidth=2, label=f'Fit Line (Slope: {slope:.4f})') plt.title('CFPS Marriage Rate vs Height (40-70 years old)') plt.xlabel('Height (cm)') plt.ylabel('Marriage Rate') plt.grid(True) text_str = f'Slope: {slope:.5f}\n95% CI: [{confidence_interval[0]:.4f}, {confidence_interval[1]:.4f}]' plt.text(np.min(x), np.max(y), text_str, fontsize=12, verticalalignment='top', bbox=dict(facecolor='white', alpha=0.5)) plt.savefig("2.jpg", dpi=300) plt.show()
if __name__ == "__main__": run_simulations() analyze_cfps_data()模型结果显示,当参数K(相对平均身高每1cm提高的配偶几率)在0.0003-0.0004附近时,配偶几率的提高可以抵消较高身高提高的死亡率影响,维持在平均身高附近稳定。当K过小时,性选择的好处不足以平衡死亡率的影响;同理,当K过大时,性选择的好处远超过死亡率的害处,将身高维持在了超过现有平均身高的水平。在CFPS数据40-70岁人群中,身高-婚配率拟合直线的斜率为0.00039(95CI为-0.00021~0.00100),和K基本在一个数量级上。模型和观测的结果没有太大的出入,也就是说,每长高1cm,平均提高了约万分之三到万分之四的配偶几率。人类种群中较高的平均身高可能是由性选择的好处维持的。

模拟中K值与绝对误差的关系,越接近0则平衡时种群的平均身高越接近实际平均身高

中国家庭追踪调查40-70岁人群中,身高和已婚比例的关系。选择这个群体主要是因为该年龄群身高和婚姻状况均已经稳定。
总结:拮抗多效性作为进化生态学中的解释有害基因维持的重要假说,认为当基因的有利影响大于有害影响时,可以被选择。越来越多的遗传学和分子证据,为拮抗多效性假说带来了机遇和挑战。模型分析表明,每长高1cm,个体的配偶几率大约提高万分之三到万分之四,这样的性选择好处足以维持比理论上最健康身高略高的平均身高。CFPS数据也支持了这一点,显示出相似的身高-婚配率关系。这说明在人类社会中,性选择的压力可能在塑造人类平均身高方面扮演了一个重要角色。
参考文献:
Anderson, J. L., Reynolds, R. M., Morran, L. T., Tolman-Thompson, J., & Phillips, P. C. (2011). Experimental Evolution Reveals Antagonistic Pleiotropy in Reproductive Timing but Not Life Span in Caenorhabditis elegans. JOURNALS OF GERONTOLOGY SERIES A-BIOLOGICAL SCIENCES AND MEDICAL SCIENCES, 66(12), 1300–1308. https://doi.org/10.1093/gerona/glr143
Arantes-Oliveira, N., Berman, J. R., & Kenyon, C. (2003). Healthy Animals with Extreme Longevity. Science, 302(5645), 611–611. https://doi.org/10.1126/science.1089169
Carter, A. J., & Nguyen, A. Q. (2011). Antagonistic pleiotropy as a widespread mechanism for the maintenance of polymorphic disease alleles. BMC Medical Genetics, 12(1), 160. https://doi.org/10.1186/1471-2350-12-160
Chu, M. C., Rath, K. M., Huie, J., & Taylor, H. S. (2003). Elevated basal FSH in normal cycling women is associated with unfavourable lipid levels and increased cardiovascular risk. Human Reproduction, 18(8), 1570–1573. https://doi.org/10.1093/humrep/deg330
Guarente L., & Kenyon C. (2000). Genetic pathways that regulate ageing in model organisms. Nature, 408(6809), 255–262. https://doi.org/10.1038/35041700
Johnston, S. E., Gratten, J., Berenos, C., Pilkington, J. G., Clutton-Brock, T. H., Pemberton, J. M., & Slate, J. (2013). Life history trade-offs at a single locus maintain sexually selected genetic variation. Nature, 502(7469), 93–95. https://doi.org/10.1038/nature12489
Li, Q., Liu, Y., Sun, X., Li, H., Cheng, C., Liu, L., Liu, F., Zhou, Q., Guo, C., Tian, G., Qie, R., Han, M., Huang, S., Li, L., Wang, B., Zhao, Y., Ren, Y., Zhang, M., Hu, D., … Lu, J. (2021). Dose–response association between adult height and all-cause mortality: A systematic review and meta-analysis of cohort studies. European Journal of Public Health, 31(3), 652–658. https://doi.org/10.1093/eurpub/ckaa213
Mitteldorf, J. (2019). What Is Antagonistic Pleiotropy? Biochemistry (Moscow), 84(12–13), 1458–1468. https://doi.org/10.1134/S0006297919120058
Neema, M., Schultz, J. L., Langbehn, D. R., Conrad, A. L., Epping, E. A., Magnotta, V. A., & Nopoulos, P. C. (2024). Mutant Huntingtin Drives Development of an Advantageous Brain Early in Life: Evidence in Support of Antagonistic Pleiotropy. ANNALS OF NEUROLOGY, 96(5), 1006–1019. https://doi.org/10.1002/ana.27046
Shokeir, M. H. (1975). Investigation on Huntington’s disease in the Canadian Prairies. II. Fecundity and fitness. Clinical Genetics, 7(4), 349–353. https://doi.org/10.1111/j.1399-0004.1975.tb00341.x
Williams, G. C. (1957). Pleiotropy, Natural Selection, and the Evolution of Senescence. Evolution, 11(4), 398–411. https://doi.org/10.1111/j.1558-5646.1957.tb02911.x
Yin, J.-A., Gao, G., Liu, X.-J., Hao, Z.-Q., Li, K., Kang, X.-L., Li, H., Shan, Y.-H., Hu, W.-L., Li, H.-P., & Cai, S.-Q. (2017). Genetic variation in glia–neuron signalling modulates ageing rate. Nature, 551(7679), 198–203. https://doi.org/10.1038/nature24463