【基于R语言群体遗传学】-6-表型计算等位基因频率、最大似然估计方法

到目前为止,我们主要讨论了等位基因和基因型频率,以及我们如何可以从一个推断出另一个。但是,如果我们不知道等位基因频率,只知道种群中存在哪些表型呢?如果我们足够幸运,知道哪些表型对应哪些基因型,我们可以很容易地估计等位基因频率!

前面的内容可以先看我之前的博客内容:群体遗传学_tRNA做科研的博客-CSDN博客

从表型计算等位基因频率

让我们考虑不同的血型作为一个简单的例子。人类通常只能有四种主要的血型:A、B、AB和O。这些血型中的每一个都对应于带有等位基因a、b或i的某种基因型:我们通过下表看一下不同血型对应的基因型

血型ABOAB
基因型aa或者aibb或者bi只能是ii只能是ab

假设我们感兴趣的是找出a、b和i等位基因的比例。我们将使用先前确定的样本个体的血型(表型)(Nikolic等人,2010)我们样本中的表型比例可以通过将每种血型的数量除以个体总数(N)来找到:

AB <- 5
A <- 30
B <- 7
O <- 36
(N <- AB + A + B + O)
A/N
#[1] 0.3846154
B/N
#[1] 0.08974359
AB/N
#[1] 0.06410256
O/N
#[1] 0.4615385

所以,大约38%的样本具有A型血表型,约9%为B型血,仅约6%为AB型血,而大约46%为O型血。这似乎并没有告诉我们太多关于a、b和i等位基因本身的总体频率,但找到表型比例是一个很好的第一步。还记得基于哈代-温伯格比例的预期基因型计算吗?我们已经知道O型血只能有ii基因型,根据哈代-温伯格预测,我们期望ii基因型的数量应该是基础i等位基因频率的平方值(p²i)。因此,假设的i等位基因频率(pi)就是ii基因型总比例的平方根:

(Pi <- sqrt(O/N))

请注意,我们只是从关注O型血表型开始,虽然A型和B型血表型也包含一定比例的i等位基因作为ai和bi杂合子,但我们理论上预期的ii纯合子数量不会受到另外两个等位基因“隐藏”i等位基因作为杂合子这一事实的影响。

请记住,我们假设哈代-温伯格假设的所有条件都在起作用(例如,等位基因的完全随机关联),因此理论比例仍然成立。因此,现在至少我们知道在我们的样本中,i等位基因的预期等位基因频率约为68%。这为我们开始计算a和b等位基因的频率提供了一个起点。我们可以在这里建立同样的方程,看看我们如何得到基因型aa、ai(A型血表型)和ii(O型血表型)的所有个体的频率。 因此,如果我们想求解我们的血型等位基因频率的方程,我们再次假设它是由哈代-温伯格比例正确表示的,我们需要pa以及pi。我们通过计算A型和O型的所有情况的基因型频率进行计算推导:

可以推为:

并且因为我们知道这个值仅仅是样本中A型和O型血型的总比例,我们可以使用我们已经收集到的表型值来找到它。

这样我们就从表型数据中计算得到了a的等位基因频率,同样的方式,我们也可以得到b的等位基因频率:我们通过R语言进行计算

(Pa <- sqrt((A+O)/N)-Pi)
(Pb <- sqrt((B+O)/N)-Pi)

现在我们把三个基因频率进行加和:

Pa + Pb + Pi
#[1] 0.9829837

我们发现合起来是一个不足1的数,但是很接近1

问题在于,表型频率与真正的哈代-温伯格预测相比略有偏差,我们在解决等位基因频率时,没有充分考虑到这种“张力”,而是独立于整体逐步进行的。为了帮助说明,这里是我们基于等位基因频率估计得出的AB杂合子的预测数量。 在哈代-温伯格原理下,如果等位基因频率分别为p和q,则AB血型的预期频率应该是2pq。然而,如果实际观察到的AB血型频率与这个预期值有所偏差,这可能表明存在一些违反哈代-温伯格原理假设的条件,比如非随机交配、自然选择、基因漂变或突变等。 当我们分别独立地计算每个等位基因频率时,我们可能没有充分考虑这些因素对整体等位基因频率分布的影响。因此,尽管我们可以使用表型频率来估计等位基因频率,但如果这些频率不完全符合哈代-温伯格平衡的预期,我们的估计就可能不够准确。 为了更全面地考虑这些“张力”,我们可能需要采用更复杂的统计方法或模型,这些方法能够同时考虑所有等位基因和表型频率之间的关系,以及可能影响这些频率的其他遗传和进化因素。这样,我们才能更准确地理解和解释观察到的遗传变异,并在必要时调整我们的等位基因频率估计。

最大似然估计

N*2*Pa*Pb
#[1] 2.368042

然而,观察到的数量是这个值的两倍多。我们可以做得更好,编写一个算法来修改这些估计值,使其基于整个观察数据集的同时达到最大似然解。 在这种情况下,最大似然估计(MLE)是一种非常有用的方法。MLE的目标是找到一组参数值,使得在给定这些参数值的情况下,观察到当前数据集的概率最大化。在遗传学中,这意味着我们要找到一组等位基因频率,使得观察到的表型频率最有可能出现。 为了实现这一点,我们可以构建一个似然函数,该函数将观察到的表型频率与由特定等位基因频率预测的表型频率之间的差异作为输入。然后,我们可以使用优化算法(如梯度下降法)来调整等位基因频率,直到似然函数达到最大值。 这个过程通常涉及到以下几个步骤:

1. 根据观察到的表型频率初始化等位基因频率的估计值。

2. 构建似然函数,该函数衡量在给定当前等位基因频率估计值的情况下,观察到的表型频率出现的概率。

3. 使用优化算法(如梯度下降法)调整等位基因频率估计值,以最大化似然函数。

4. 重复步骤3,直到似然函数收敛到一个最大值,或者达到预定的迭代次数。

通过这种方式,我们可以得到一组更准确的等位基因频率估计值,这些估计值能够更好地反映整个数据集的信息,而不仅仅是单独的表型频率。这种方法有助于我们更准确地理解和解释遗传数据,特别是在表型频率不完全符合哈代-温伯格平衡预期的情况下,我们进行一个简单的例子,更为精准及复杂的例子看下面一节。

# 安装并加载必要的包
if (!requireNamespace("MASS", quietly = TRUE))
  install.packages("MASS")
library(MASS)

# 定义似然函数
likelihood <- function(freqs, obs_freqs) {
  p_A <- freqs[1]^2 + 2 * freqs[1] * freqs[3]
  p_B <- freqs[2]^2 + 2 * freqs[2] * freqs[3]
  p_AB <- 2 * freqs[1] * freqs[2]
  p_O <- freqs[3]^2
  
  # 计算似然值
  like <- prod(dbinom(obs_freqs, rep(1, length(obs_freqs)), c(p_A, p_B, p_AB, p_O)))
  return(like)
}

# 观察到的表型频率
obs_freqs <- c(0.38, 0.09, 0.06, 0.46)

# 初始化等位基因频率估计值
initial_freqs <- c(0.3, 0.2, 0.5)

# 使用优化算法寻找最大似然解
opt_freqs <- optim(par = initial_freqs, fn = likelihood, obs_freqs = obs_freqs, method = "BFGS")$par

# 输出结果
print(opt_freqs)

期望值最大化算法(expectation maximization algorithm)

算法是一个大多数人熟悉但难以轻易定义的术语。这个词实际上来源于九世纪数学家Muh .ammad ibn Mūsā al-Khwārizmı(拉丁化的al-Khwārizmı被称为“Algorismus”)的名字,他也给我们带来了“代数”这个词(阿拉伯语中的al-jabr意味着“重新连接”或“完成”)。一个非常简单的定义是,算法就是一系列按特定顺序执行的操作。算法在大多数定量学科中非常标准,最近机器学习的算法类型已被应用于群体遗传学推断。机器学习最近在许多数据分析领域成为了一个热门话题,并经常被视为一种全新的方法。然而,许多传统使用的方法与机器学习的概念完全相同;也就是说,不断更新信息以得出更准确的结论。其中一种实现这一目标的方法被称为期望最大化(EM)算法。 之前,在我们的血型示例中,我们能够计算出在给定样本大小并假设我们处于哈代-温伯格平衡的情况下,我们会预期看到哪些基因型。

# 计算基因型频率 Paa
Paa <- A * (Pa^2 / (Pa^2 + 2 * Pa * Pi))
# 输出 Paa 的值
print(Paa)

# 计算基因型频率 Pai
Pai <- A * (2 * Pa * Pi / (Pa^2 + 2 * Pa * Pi))
# 输出 Pai 的值
print(Pai)

# 计算基因型频率 Pbb
Pbb <- B * (Pb^2 / (Pb^2 + 2 * Pb * Pi))
# 输出 Pbb 的值
print(Pbb)

# 计算基因型频率 Pbi
Pbi <- B * (2 * Pb * Pi / (Pb^2 + 2 * Pb * Pi))
# 输出 Pbi 的值
print(Pbi)

# 计算基因型频率 Pii,这里直接赋值为常数O
Pii <- O
# 输出 Pii 的值
print(Pii)

# 计算基因型频率 Pab,这里直接赋值为常数AB
Pab <- AB
# 输出 Pab 的值
print(Pab)

现在我们可以通过哈代温伯格频率重新推算等位基因频率:

# 计算Pa的值
Pa <- ((2 * Paa) + Pai + Pab) / (2 * N)
Pa

# 计算Pb的值
Pb <- ((2 * Pbb) + Pbi + Pab) / (2 * N)
Pb

# 计算Pi的值
Pi <- ((2 * Pii) + Pai + Pbi) / (2 * N)
Pi

再通过我们重新计算的等位基因频率去反推基因型频率:
 

# 计算Paa的值
Paa <- A * (Pa^2 / (Pa^2 + 2 * Pa * Pi))
Paa

# 计算Pai的值
Pai <- A * (2 * Pa * Pi / (Pa^2 + 2 * Pa * Pi))
Pai

# 计算Pbb的值
Pbb <- B * (Pb^2 / (Pb^2 + 2 * Pb * Pi))
Pbb

# 计算Pbi的值
Pbi <- B * (2 * Pb * Pi / (Pb^2 + 2 * Pb * Pi))
Pbi

然后我们可以一次又一次地重新估计等位基因频率,直到我们收敛到等位基因频率的最大似然值。

现在我们可以开始重新编写实际的函数来帮助我们进行最大似然估计。

# 清除工作空间
rm(list = ls())

# 初始化变量
# AB: AB血型个体数量
# A: A血型个体数量
# B: B血型个体数量
# O: O血型个体数量
# N: 总个体数量
# Pi: O血型基因频率
# Pa: A血型基因频率
# Pb: B血型基因频率
# Pi0, Pa0, Pb0: 上一次迭代的基因频率
# counter: 迭代次数
AB <- 5
A <- 30
B <- 7
O <- 36
N <- AB + A + B + O
Pi <- sqrt(O / N)
Pa <- sqrt((A + O) / N) - Pi
Pb <- sqrt((B + O) / N) - Pi
Pi0 <- 0
Pa0 <- 0
Pb0 <- 0
counter <- 0

# 定义EM函数
# 该函数使用期望最大化(EM)算法来估计基因频率
EM <- function(Pi, Pa, Pb){
  # 当基因频率的变化小于一定阈值时停止迭代
  while((round(Pi0, 12) != round(Pi, 12)) ||
        (round(Pa0, 12) != round(Pa, 12)) ||
        (round(Pb0, 12) != round(Pb, 12))){
    Pi0 <- Pi
    Pa0 <- Pa
    Pb0 <- Pb
    
    # 根据上一次迭代的基因频率计算新的基因频率
    Paa <- A * (Pa0^2 / (Pa0^2 + 2 * Pa0 * Pi0)) # A血型个体的AA基因型频率
    Pai <- A * (2 * Pa0 * Pi0 / (Pa0^2 + 2 * Pa0 * Pi0)) # A血型个体的AO基因型频率
    Pbb <- B * (Pb0^2 / (Pb0^2 + 2 * Pb0 * Pi0)) # B血型个体的BB基因型频率
    Pbi <- B * (2 * Pb0 * Pi0 / (Pb0^2 + 2 * Pb0 * Pi0)) # B血型个体的BO基因型频率
    Pii <- O # O血型个体的OO基因型频率
    Pab <- AB # AB血型个体的AB基因型频率
    
    # 更新基因频率
    Pa <- ((2 * Paa) + Pai + Pab) / (2 * N)
    Pb <- ((2 * Pbb) + Pbi + Pab) / (2 * N)
    Pi <- ((2 * Pii) + Pai + Pbi) / (2 * N)
    
    # 增加迭代次数
    counter <- counter + 1
  }
  
  # 返回最终的基因频率和迭代次数
  return(c(paste("Pi =", Pi, ", Pa =", Pa, ", Pb=", Pb, ", Number of loops =", counter)))
}

# 调用EM函数
EM(Pi, Pa, Pb)
c(Pi, Pa, Pb) # Our initial estimates

 可以得到估计完后和为1。

即使我们有任意的起始等位基因频率,比如pi = pa = pb = 1/3,算法仍然应该快速收敛到这些相同的值。到目前为止,我们主要关注的是固定时间点的数据集,并且主要是将等位基因频率的样本与基于无限大的理论种群的预测进行比较。在下一篇博客中,我们将开始研究有限种群以及随时间变化的等位基因频率。

谢谢大家的点赞关注收藏!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/774624.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

网络-calico问题分析

项目场景&#xff1a; calico-node日志提示 Failed to auto-detect host MTU - no interfaces matched the MTU interface pattern. To use auto-MTU, set mtuifacePattern to match your hosts’s interfaes. 同时&#xff0c;cali开头网卡的mtu是1440大小 原因分析&#xff…

扁鹊三兄弟的启示,探寻系统稳定的秘诀

一、稳定性的重要性 1. 公司收益的角度 从公司收益的视角审视&#xff0c;系统不稳定可能会引发直接损失。例如&#xff0c;当系统突然出现故障导致交易中断时&#xff0c;可能造成交易款项的紊乱、资金的滞留或损失&#xff0c;这不但会阻碍当前交易的顺利完成&#xff0c;还…

web安全的会议室管理系统-计算机毕业设计源码50331

目 录 摘要 1 绪论 1.1 开发背景与意义 1.2国内外研究现状 1.3 相关技术、工具简介 1.3.1 MySQL数据库的介绍 1.3.2 B/S架构的介绍 1.3.3 Java语言 1.3.4 SpringBoot框架 1.4论文结构与章节安排 2 会议室管理系统需求分析 2.1 可行性分析 2.1.1 技术可行性分析 2…

【Redis】真行,原来是这样啊! --Redis自动序列化和手动序列化的区别(存储结构、内存开销,实际写法)

对于Redis有两种序列化和反序列化的方式&#xff0c; 方式一&#xff1a; 一种是通过 注入RedisTemplate 对象&#xff0c;找个对象&#xff0c;通过配置类进行一定的配置&#xff0c;使得使用RedisTemplate 对象时&#xff0c;便会使用配置的那些键、值的序列化方式&#xff…

深度学习Week19——学习残差网络和ResNet50V2算法

文章目录 深度学习Week18——学习残差网络和ResNet50V2算法 一、前言 二、我的环境 三、论文解读 3.1 预激活设计 3.2 残差单元结构 四、模型复现 4.1 Residual Block 4.2 堆叠Residual Block 4.3. ResNet50V2架构复现 一、前言 &#x1f368; 本文为&#x1f517;365天深度学…

昇腾910B部署Qwen2-7B-Instruct进行流式输出【pytorch框架】NPU推理

目录 前情提要torch_npu框架mindsport框架mindnlp框架 下载模型国外国内 环境设置代码适配&#xff08;非流式&#xff09;MainBranch结果展示 代码适配&#xff08;流式&#xff09; 前情提要 torch_npu框架 官方未适配 mindsport框架 官方未适配 mindnlp框架 官方适配…

add_metrology_object_generic 添加测量模型对象。找两条直线,并计算两条线的夹角和两个线的总长度,转换成毫米单位

*添加测量模型对象 *将测量对象添加到测量模型中 *算子参数&#xff1a; *    MeasureHandle&#xff1a;输入测量模型的句柄&#xff1b; *    Shape&#xff1a;输入要测量对象的类型&#xff1b;默认值&#xff1a;‘circle’&#xff0c;参考值&#xff1a;‘circl…

淘宝扭蛋机小程序:打造新的扭蛋体验

扭蛋机行业近年来发展非常迅速&#xff0c;呈现出了明显的增长势头&#xff0c;深受年轻消费者的青睐。当下在消费市场中&#xff0c;年轻人占据了很大的份额&#xff0c;这也推动了扭蛋机市场的发展。如今&#xff0c;扭蛋机也正在向多个方向发展&#xff0c;不再局限于线下扭…

如何利用代理IP打造热门文章

作为内容创作者&#xff0c;我们都知道&#xff0c;有时候地理限制和访问障碍可能会成为我们获取新鲜素材和优质信息的障碍。使用代理IP&#xff0c;正是突破这些限制的好方法&#xff01; 1. 无缝获取全球视野 如果你还在苦恼看不到其他地区的热点文章&#xff0c;你可以尝试…

保障信息资产:ISO 27001信息安全管理体系的重要性

在当今数字化和全球化的时代&#xff0c;信息安全已经成为企业成功和持续发展的关键因素之一。随着信息技术的快速发展和互联网的普及&#xff0c;企业面临着越来越多的信息安全威胁和挑战&#xff0c;如数据泄露、网络攻击、恶意软件等。为了有效应对这些威胁&#xff0c;企业…

docker集群部署主从mysql

搭建一个mysql集群&#xff0c;1主2从&#xff0c;使用docker容器 一、创建docker的mysql镜像 下次补上&#xff0c;因为现在很多网络不能直接pull&#xff0c;操作下次补上。 二、创建mysql容器 创建容器1 docker run -it -d --name mysql_1 -p 7001:3306 --net mynet --…

Astro新前端框架首次体验

Astro新前端框架首次体验 1、什么是Astro Astro是一个静态网站生成器的前端框架&#xff0c;它提供了一种新的开发方式和更好的性能体验&#xff0c;帮助开发者更快速地构建现代化的网站和应用程序。 简单来说就是&#xff1a;Astro这个是一个网站生成器&#xff0c;可以直接…

生成式人工智能如何改变软件开发:助手还是取代者?

生成式人工智能如何改变软件开发&#xff1a;助手还是取代者&#xff1f; 生成式人工智能&#xff08;AIGC&#xff09;正在引领软件开发领域的技术变革。从代码生成、错误检测到自动化测试&#xff0c;AI工具在提高开发效率的同时&#xff0c;也引发了对开发者职业前景的讨论…

标贝语音识别在智能会议系统的应用案例

语音识别是指将语音信号转换成文本或者其他数字信号形式的过程&#xff0c;随着人工智能在人们日常工作生活中的普及&#xff0c;语音识别技术也被广泛的应用在智能家居、智能会议、智能客服、智能驾驶等领域&#xff0c;以语音识别技术在智能会议系统中的应用为例&#xff0c;…

【读点论文】基于二维伽马函数的光照不均匀图像自适应校正算法

基于二维伽马函数的光照不均匀图像自适应校正算法 摘 要:提出了一种基于二维伽马函数的光照不均匀图像自适应校正算法.利用多尺度高斯函数提取出场景的光照分量,然后构造了一种二维伽马函数,并利用光照分量的分布特性调整二维伽马函数的参数,降低光照过强区域图像的亮度值,提高…

服务器U盘安装Centos 7时提示Warning:/dev/root does not exist

这是没有找到正确的镜像路径导致的&#xff0c;我们可以在命令行输入ls /dev看一下有哪些盘符 像图中红色圈起来的就是我插入U盘的盘符&#xff0c;大家的输几盘可能做了多个逻辑盘&#xff0c;这种情况下就可以先将U盘拔掉再ls /dev看一下和刚才相比少了那两个盘符&#xff0c…

Redis高级篇之最佳实践

Redis高级篇之最佳实践 今日内容 Redis键值设计批处理优化服务端优化集群最佳实践 1、Redis键值设计 1.1、优雅的key结构 Redis的Key虽然可以自定义&#xff0c;但最好遵循下面的几个最佳实践约定&#xff1a; 遵循基本格式&#xff1a;[业务名称]:[数据名]:[id]长度不超过…

空调计费系统是什么,你知道吗

空调计费系统是一种通过对使用空调的时间和能源消耗进行监测和计量来进行费用计算的系统。它广泛应用于各种场所&#xff0c;如家庭、办公室、商场等&#xff0c;为用户提供了方便、准确的能源使用管理和费用控制。 可实现功能 智能计费&#xff1a;中央空调分户计费系统通过智…

光电液位传感器在宠物洗澡机的应用

光电液位传感器在宠物洗澡机中的应用&#xff0c;为洗澡机的智能化管理提供了重要支持和保障。这种先进的传感技术不仅提升了设备的操作便捷性&#xff0c;还大幅度提高了洗澡过程的安全性和效率。 宠物洗澡机作为宠物护理的重要设备&#xff0c;其水位的控制至关重要。光电液…

SD16S1Y 符合GB2312标准16X16点阵汉字库芯片IC

一般概述 SD16S1Y是一款内含16x16点阵的汉字库芯片&#xff0c;支持GB2312国标简体汉字(含有国家信标委 合法授权)、ASCII字符。排列格式为竖置横排。用户通过字符内码&#xff0c;利用本手册提供的方法计算出 该字符点阵在芯片中的地址&#xff0c;可从该地址连续读出字…