【基于R语言群体遗传学】-8-代际及时间推移对于变异的影响

news2024/11/28 18:39:07

上一篇博客,我们学习了在非选择下,以二项分布模拟遗传漂变的过程:【基于R语言群体遗传学】-7-遗传变异(genetic variation)-CSDN博客

那么我们之前有在代际之间去模拟,那么我们就想知道,遗传变异随着时间的推移,会发生什么样的变化,我们今天进行探讨:


遗传漂变的基准实证研究之一是由早期遗传学对于果蝇的研究提供的。在五十年代,彼得·布里进行了一个令人惊讶的费力实验,让超过100个小型果蝇群体独立进化,这些果蝇具有突变眼色表型,持续了二十代。他以50%的频率开始计算每组16只果蝇,携带两个bw(“棕色”)等位基因,这使纯合子个体呈现出鲜艳的红橙色眼睛,而杂合子个体则可以通过明显较浅的橙色眼睛来区分。不携带bw75等位基因(bw/bw纯合子)的果蝇会表现出白色眼睛。为了保持种群大小不变,每一代都从上一代的后代中随机抽取一组新的16只果蝇,作为下一代的父母。通过观察眼睛颜色,布里统计了超过100个重复实验中bw75拷贝数随时间的变化,而且整个过程做了两次!

在我们查看布里的数据之前,让我们首先以一种新的方式可视化我们之前的模拟,以便我们可以更容易地进行比较,然后再使用我们模拟的数据和布里的数据可视化进行比较:

# 设置群体大小
N <- 16

# 可能的等位基因数量范围(从0到2倍群体大小)
possible <- 0:(2*N)

# 初始化一个矩阵x,用于存储概率值,初始时所有概率为0
x <- matrix(c(rep(0,2*N+1)), ncol=2*N+1, byrow=T)

# 在矩阵x的中心位置(即N+1的位置)设置概率为1,代表起始状态
x[N+1] <- 1

# 初始化一个空向量P,用于存储二项分布的概率
P <- NULL 

# 计算每个可能的等位基因数量的二项分布概率,并存储在P中
for(i in possible){
  P <- c(P,dbinom(possible, size=2*N, prob=i/(2*N)))
}

# 将P转换为矩阵Q,每行对应一个可能的等位基因数量的所有概率
Q <- matrix(P, ncol=2*N+1, byrow=T)

# 计算初始状态下的概率分布R
R <- x %*% Q 

# 将初始概率分布赋值给Prob
Prob <- R

# 初始化代数计数器g
g <- rep(1,ncol(R))

# 循环直到达到第19代
while(g[1]<19){
  # 更新概率分布R
  R <- R %*% Q
  # 将新的概率分布添加到Prob矩阵中
  Prob <- rbind(Prob,R)
  # 代数计数器加1
  g <- g+1
}  

# 使用persp函数绘制概率分布的三维图
persp(x = 1:g[1], # 代数范围
      y = possible, # 可能的等位基因数量
      z = Prob, # 概率矩阵
      theta = 60, phi = 20, # 视图旋转角度
      xlab = 'Generations', ylab = 'Number of alleles', # x轴和y轴标签
      zlab = 'Probability', # z轴标签
      shade = 0.3 # 表面阴影强度
)

# 加载popgenr包中的果蝇数据集
library('popgenr')
data(fly)

# 使用相同的参数绘制实际观测数据的图
persp(x = 1:g[1],
      y = possible,
      z = fly[-1,], 
      theta = 60, phi = 20,
      xlab = 'Generations', ylab = 'Number of alleles',
      zlab = 'Observations', # z轴标签改为'Observations'
      shade = 0.3
)

观察这两个图,我们应该看到bw75等位基因的行为与我们假设的A等位基因的二项式抽样模型非常相似。在模拟和实验结束时,我们看到最高峰出现在最左侧的“灭绝”状态(零个A/bw75等位基因)和最右侧的“固定”状态(与位点一样多的A/bw75等位基因)。这表明,如果没有其他力量作用于单个等位基因,随着时间的推移,每一个新的变体要么消失,要么不再是明显的变体,因为它成为了位点上的唯一等位基因。中央峰在广泛的概率范围内的衰减应该让人想起物理学中的热扩散(激发了中性理论的“扩散近似”);然而,频率为零和一的吸收边界最终是概率集中的地方。 那么为什么我们应该在种群内观察到任何水平的遗传变异呢?突变率当然是一个因素,但我们已经看到,新的变体几乎在出现时就很有可能消失。所以,让我们考虑一些原因,为什么看似中性的等位基因会在种群中持续存在。我们之前看到种群大小可以影响单个等位基因的固定和灭绝概率。让我们再次可视化这种效应,但这次同时观察多个不同的模拟。我们将根据种群大小和它们的起始频率,使用rbinom随机抽取每一代的等位基因数量:

我们分别对于10个的群体、100个群体及1000个群体进行模拟:

par(mfrow=c(2,2))
# 初始化等位基因频率
init_p <- 0.05

# 设定模拟的代数
gen <- 100

# 设定重复实验的次数
reps <- 10

# 生成一系列颜色,用于区分不同的重复实验
colors <- rainbow(reps)

# 设定群体大小
N <- 100

# 创建一个空白的绘图区域,设置x轴和y轴的范围及标签
plot(x=NULL, y=NULL, xlim=c(1, gen), ylim=c(0,1),
     xlab="Generations", ylab="Allele frequency")

# 对于每次重复实验
for(i in 1:reps){
  # 初始化等位基因频率
  p <- init_p
  # 对于每一代(除了第一代)
  for(j in 1:(gen-1)){
    # 使用二项分布模拟等位基因的传递
    a <- rbinom(n=1, size=2*N, prob=p[j])
    # 计算新的等位基因频率
    f <- a/(2*N)
    # 更新等位基因频率向量
    p <- c(p,f)
  }
  # 在图中画出这一重复实验的等位基因频率变化轨迹
  lines(x=1:gen, y=p, lwd=2, col=colors[i])
}

随着种群规模的增大,等位基因似乎会在更长的时间内持续存在。然而,也尝试改变这个模拟中的世代数(Gen)。生物体的世代时间可能有很大的不同:在我们人类漫长一代的时间里,你可能会看到几百代、几千代或更多的果蝇。如果你让它们运行1,000代,而不是100代,较大的种群与较小的种群相比如何?随着时间的推移,变异的丧失几乎是肯定的,但种群大小和世代时间等因素显著影响我们预期等位基因在种群中丧失的速度。 最后,这里有一个遗传漂变的模拟,它跟踪不同的轨迹,并在完成时对它们进行平均。你可以调整起始频率和种群大小,虽然个体轨迹遍布各处,但最终用粗黑线绘制的平均值基本保持不变。

# 初始化等位基因频率
init_p <- 0.25

# 设定模拟的代数
gen <- 100

# 设定重复实验的次数
reps <- 500

# 生成一系列颜色,用于区分不同的重复实验
colors <- rainbow(reps)

# 设定群体大小
N <- 100

# 创建一个空白的绘图区域,设置x轴和y轴的范围及标签
plot(x=NULL, y=NULL, xlim=c(1, gen), ylim=c(0,1),
     xlab="Generations", ylab="Allele frequency")

# 初始化一个空矩阵Freq,用于保存每次重复实验的等位基因频率
Freq <- NULL

# 对于每次重复实验
for(i in 1:reps){
  # 初始化等位基因频率
  p <- init_p
  # 对于每一代(除了第一代)
  for(j in 1:(gen-1)){
    # 使用二项分布模拟等位基因的传递
    a <- rbinom(n=1, size=2*N, prob=p[j])
    # 计算新的等位基因频率
    f <- a/(2*N)
    # 更新等位基因频率向量
    p <- c(p,f)
  }
  # 将这次重复实验的等位基因频率保存到Freq矩阵中
  Freq <- rbind(Freq, p)
  # 在图中画出这一重复实验的等位基因频率变化轨迹
  lines(x=1:gen, y=p, lwd=2, col=colors[i])
}

# 计算所有重复实验的平均等位基因频率,并在图中以黑色线条画出
lines(1:gen, colMeans(Freq), lwd=2, col="black")

下一篇博客我们将学习变异的量化,及群体规模的模拟。

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Java版Flink使用指南——安装Flink和使用IntelliJ制作任务包

大纲 安装Flink操作系统安装JDK安装Flink修改配置启动Flink测试 使用IntelliJ制作任务包新建工程Archetype 编写测试代码打包测试 参考资料 在《0基础学习PyFlink》专题中&#xff0c;我们熟悉了Flink的相关知识以及Python编码方案。这个系列我们将使用相对主流的Java语言&…

SQL Server 2022 中的 Tempdb 性能改进非常显著

无论是在我的会话中还是在我写的博客中&#xff0c;Tempdb 始终是我的话题。然而&#xff0c;当谈到 SQL Server 2022 中引入的重大性能变化时&#xff0c;我从未如此兴奋过。他们解决了我们最大的性能瓶颈之一&#xff0c;即系统页面闩锁并发。 在 SQL Server 2019 中&#x…

python函数和c的区别有哪些

Python有很多内置函数&#xff08;build in function&#xff09;&#xff0c;不需要写头文件&#xff0c;Python还有很多强大的模块&#xff0c;需要时导入便可。C语言在这一点上远不及Python&#xff0c;大多时候都需要自己手动实现。 C语言中的函数&#xff0c;有着严格的顺…

【pyhton学习】深度理解类和对象

&#x1f3ac; 鸽芷咕&#xff1a;个人主页 &#x1f525; 个人专栏: 《C干货基地》《粉丝福利》 ⛺️生活的理想&#xff0c;就是为了理想的生活! 文章目录 一、一切皆对象1.1 对象的概念1.2 如何创建类对象1.3 类型检测 二、属性与方法2.1 如何查看属性与方法2.2 属性和方法…

14-39 剑和诗人13 - 顶级大模型测试分析和建议

​​​​​ 随着对高级语言功能的需求不断飙升&#xff0c;市场上涌现出大量语言模型&#xff0c;每种模型都拥有独特的优势和功能。然而&#xff0c;驾驭这个错综复杂的生态系统可能是一项艰巨的任务&#xff0c;开发人员和研究人员经常面临选择最适合其特定需求的模型的挑战。…

SpringBoot新手快速入门系列教程七:基于一个低配centoos服务器,如何通过宝塔面板部署一个SpringBoot项目

1&#xff0c;如何打包一个项目 通过IDEA自带的命令行&#xff0c;执行 ./gradlew clean build 2&#xff0c;检查生成的JAR文件 进入 build/libs 目录&#xff0c;你应该会看到一个类似 helloredis-0.0.1-SNAPSHOT.jar 的文件。 3&#xff1a;运行生成的JAR文件 你可以使…

【工具】豆瓣自动回贴软件

转载请注明出处&#xff1a;小锋学长生活大爆炸[xfxuezhagn.cn] 如果本文帮助到了你&#xff0c;欢迎[点赞、收藏、关注]哦~ 相比于之前粗糙丑陋的黑命令框版本&#xff0c;这个版本新增了UI界面&#xff0c;从此可以不需要再挨个去翻配置文件了。 另外&#xff0c;升级了隐藏浏…

Java基础(六)——继承

个人简介 &#x1f440;个人主页&#xff1a; 前端杂货铺 ⚡开源项目&#xff1a; rich-vue3 &#xff08;基于 Vue3 TS Pinia Element Plus Spring全家桶 MySQL&#xff09; &#x1f64b;‍♂️学习方向&#xff1a; 主攻前端方向&#xff0c;正逐渐往全干发展 &#x1…

Blazor SPA 的本质是什么以及服务器端渲染如何与 Blazor 的新 Web 应用程序配合使用

Blazor 通常被称为单页应用程序 (SPA) 框架。当我第一次开始使用 Blazor 时&#xff0c;我对 SPA 的含义、组件如何为 SPA 架构做出贡献以及所有这些如何与交互性联系在一起感到困惑。 今天&#xff0c;我将解答大家可能关心的三个问题&#xff1a; 什么是 SPA&#xff1f;了…

A Threat Actors 出售 18 万名 Shopify 用户信息

BreachForums 论坛成员最近发布了涉及 Shopify 的重大数据泄露事件。 据报道&#xff0c;属于近 180,000 名用户的敏感数据遭到泄露。 Shopify Inc. 是一家总部位于安大略省渥太华的加拿大公司。 开发和营销同名电子商务平台、Shopify POS 销售点系统以及专用于企业的营销工…

文心一言最常用的20条指令及指令说明,含增强指令

下面是20条文心一言的指令及其说明&#xff0c;每条指令尽量简洁明了&#xff0c;以便在有限的字数内提供尽可能多的信息。以下是这些指令及其说明&#xff1a; 1. 查询天气 指令&#xff1a;今天北京的天气怎么样&#xff1f;说明&#xff1a;此指令用于查询特定城市&#xf…

24西安电子科技大学经济与管理学院—考研录取情况

24西安电子科技大学—经理与管理学院—考研录取统计 01、经理与管理学院各个方向 02、24经济与管理近三年复试分数线对比 1、经管院24年院线相对于23年院线普遍下降2-15分&#xff0c;个别专业上涨4-10分。 2、经管院应用经济学2024年院线350分&#xff1b;管理科学与工程院线…

用kimi实现一键实体识别与关系抽取

实体识别与关系抽取是自然语言处理&#xff08;NLP&#xff09;中的两个重要任务&#xff0c;通常被视为知识图谱构建的基础技术。 实体识别&#xff08;Named Entity Recognition, NER&#xff09;&#xff1a; 实体识别的目标是从文本中识别出具有特定意义的实体&#xff0…

Java.lang.Thread类和Java的主线程

一.Java.lang.Thread类 支持多线程编程 常用方法 二.主线程 ◆Java程序启动时&#xff0c;一个线程立即随之启动&#xff0c;通常称之为程序的主线程 ◆main()方法即为主线程入口 ◆产生其他子线程的线程 ◆必须最后完成执行&#xff0c;因为它执行各种关闭动作 示例 使用…

Vben:表格的表头和表格的内容对不齐,以及解决方法

文章目录 一、问题描述二、解决方法 一、问题描述 基于Vue-Vbne-admin框架进行前端开发的时候&#xff0c;调用表格useTable函数实现表格之后&#xff0c;发现表格的表头和表格的内容对不齐。如下图所示。针对这种情况&#xff0c;本文记录了解决方法。 调用的模块如下&#x…

centos7部署mysql8.0

1.安装MySQL的话会和MariaDB的文件冲突&#xff0c;所以需要先卸载掉MariaDB。查看是否安装mariadb rpm -qa | grep mariadb 2. 卸载mariadb rpm -e --nodeps 查看到的文件名 3.下载MySQL安装包 MySQL官网下载地址: MySQL :: Download MySQL Community Serverhttps://dev.mys…

AE界面讲解

目录 菜单栏 快捷工具栏 项目窗口 合成窗口 选项面板 时间线面板 菜单栏 快捷工具栏 切换工具的方式&#xff1a;按住Alt键&#xff0c;点击要切换的工具选项&#xff0c;就可以快速切换同一个工具子菜单下的其他工具 项目窗口 用来存放项目的区域 合成窗口 用于预览视…

TEE RPMB的简介以及开发流程

思考: 如何开发一个TA? sdk又是什么?开发一个TA的流程是怎样的?How to do?有关TA的签名介绍TEE开发Secure driver介绍RPMB的简介以及开发流程共享内存的最大限制是什么?TA的栈内存/堆内存又有哪些限制TA都支持哪些密码学算法?TA都可以使用哪些存储接口?分别都存放在了哪…

【面向就业的Linux基础】从入门到熟练,探索Linux的秘密(十一)-git(3)

Git是目前最流行的版本控制系统之一&#xff0c;在现代软件开发中扮演着重要的角色。它能够有效地跟踪文件变化、协作开发&#xff0c;并存储项目的历史记录。本文的目的是向读者介绍Git的基本概念和工作原理&#xff0c;帮助初学者快速上手使用Git&#xff0c;并帮助有经验的开…

leetcode每日一题-3101 交替子数组计数

暴力遍历&#xff1a;看起来像是回溯,实际上就是递归 class Solution { private:long long _res 0; public:long long countAlternatingSubarrays(vector<int>& nums) {backtrack(nums, 0);return _res;}void backtrack(vector<int>& nums, long long st…