【基于R语言群体遗传学】-2-模拟基因型(simulating genotypes)

书接上文,我们昨天讨论了遗传的哈代温伯格比例:

【基于R语言群体遗传学】-1-哈代温伯格基因型比例-CSDN博客

接下来,如果我们能够模拟一个过程并观察模拟结果与我们预期的是否相符,这通常有助于指导我们对这个过程的直观感觉。让我们来模拟哈代-温伯格基因型比例。首先,我们将创建一个等位基因列表,用于组成一个种群。

allele <- c(rep("A",2), rep("a",8))
allele

接下来,我们创建一个矩阵来记录种群中个体的等位基因。我们从一个变量popsize开始,最初设置为100,稍后我们可以轻松地更改它以模拟不同的人口规模。 然后,我们使用matrix()函数创建一个100行(由nrow = popsize定义)和两列(ncol = 2,二倍体)的矩阵,并将其保存为pop。

popsize <- 100
pop <- matrix(nrow=popsize, ncol=2)

每一行对应一个个体两列代表每个位点的两个副本,我们将在其中记录该个体的等位基因。 现在,我们将使用R的内置sample函数随机选择等位基因来构成我们的个体基因型。

for(i in 1:popsize){
  pop[i,1] <- sample(allele,1)
  pop[i,2] <- sample(allele,1)
}
pop

我们得到一个不是特别规范的100个个体的基因型随机数据模拟,里面有杂合及纯合。

我们通过循环得到A和a的计数,并计算A的frequency和a的frequency

#A frequency
Acount <- 0
for(i in 1:popsize){
  if(pop[i,1]=="A"){
    Acount <- Acount+1
  }
  if(pop[i,2]=="A"){
    Acount <- Acount+1
  }
}
AFreq <- Acount/(popsize*2)

我们计算得到A的frequency为0.375,大家可能有所不同,但是都会在这附近。现在,我们将通过再次遍历矩阵并计算杂合子出现的频率以及A/A纯合子出现的频率来计算基因型频率。

Hcount <- 0
AAcount <- 0
for(i in 1:popsize){
  if(pop[i,1]=="A"){
    if(pop[i,2]=="a"){
      Hcount <- Hcount+1
    }else{
      AAcount <- AAcount+1
    }
  }
  if(pop[i,1]=="a"){
    if(pop[i,2]=="A"){
      Hcount <- Hcount+1
    }
  }
}
HetFreq <- Hcount/(popsize)
AAFreq <- AAcount/(popsize)
print(c(AFreq, HetFreq, AAFreq))

现在,让我们将这些模拟的频率与所有三种基因型(A/A、A/a和a/a)的p^2、2p(1-p)和(1-p)^2预测一起绘制出来。以下命令将使用plot()函数绘制这些点。并添加曲线进行拟合:
 

# 绘制第一个图形
plot(AFreq, HetFreq, xlab="allele frequency", ylab="",
     ylim=c(0, 1), xlim=c(0, 1), col="blue")

# 在同一个图形上添加第二个图形,不覆盖第一个图形
par(new=TRUE)
plot(AFreq, AAFreq, xlab="", ylab="", ylim=c(0, 1), xlim=c(0, 1), col="green")

# 在同一个图形上添加第三个图形,不覆盖前两个图形
par(new=TRUE)
plot(AFreq, 1-AAFreq-HetFreq, xlab="",
     ylab="genotype frequency", ylim=c(0, 1), xlim=c(0, 1),
     col="red")

# 设置点的样式,使其变大并实心
points(AFreq, HetFreq, pch=16, cex=2, col="blue") # 蓝色实心点
points(AFreq, AAFreq, pch=16, cex=2, col="green") # 绿色实心点
points(AFreq, 1-AAFreq-HetFreq, pch=16, cex=2, col="red") # 红色实心点

# 在同一个图形上添加三条曲线
curve(2*x*(1-x), 0, 1, add=TRUE, ylab=NULL, lwd=2, ylim=c(0, 1), col="darkblue")
curve(x**2, 0, 1, add=TRUE, ylab=NULL, lwd=2, ylim=c(0, 1), col="darkgreen")
curve((1-x)**2, 0, 1, add=TRUE, ylab=NULL, lwd=2, ylim=c(0, 1), col="darkred")

# 添加文本标签
text(0.5, 0.7, "Aa", col = "blue")
text(0.9, 0.7, "AA", col = "green")
text(0.1, 0.7, "aa", col = "red")

我们通常对许多点的分布感兴趣。让我们修改代码,让它运行一些重复实验并同时绘制它们。每次我们运行模拟时,我们都会抽取一个新的等位基因频率,因此我们运行的重复实验次数越多,我们将看到的等位基因频率范围就越广。

AFreq <- numeric()
HetFreq <- numeric()
AAFreq <- numeric()
replicates <- 10
for (j in 1:replicates) {
  # Randomly sample alleles for each individual
  pop[, 1:2] <- t(replicate(popsize, sample(allele, 2)))
  
  # Count the number of 'A' alleles
  Acount <- sum(pop == "A")
  
  # Calculate the frequency of 'A' alleles
  AFreq[j] <- Acount / (popsize * 2)
  
  # Count the number of heterozygotes and AA homozygotes
  genotypes <- apply(pop, 1, function(ind) {
    if (all(ind == "A")) {
      "AA"
    } else if (any(ind == "A")) {
      "Het"
    } else {
      "aa"
    }
  })
  
  # Calculate the frequencies of heterozygotes and AA homozygotes
  HetFreq[j] <- sum(genotypes == "Het") / popsize
  AAFreq[j] <- sum(genotypes == "AA") / popsize
}

我们如此得到一系列点,然后进行可视化:

plot(AFreq, HetFreq, xlab="allele frequency",ylab = "",
     ylim=c(0, 1), xlim=c(0, 1), col="blue")
par(new=TRUE)
plot(AFreq, AAFreq,  xlab="", ylab = "", ylim=c(0, 1), xlim=c(0, 1), col="green")
par(new=TRUE)
plot(AFreq, 1-AAFreq-HetFreq,xlab = "",
     ylab="genotype frequency", ylim=c(0, 1), xlim=c(0, 1),
     col="red")
# 绘制第一个图形
plot(AFreq, HetFreq, xlab="allele frequency", ylab="",
     ylim=c(0, 1), xlim=c(0, 1), col="blue")

# 在同一个图形上添加第二个图形,不覆盖第一个图形
par(new=TRUE)
plot(AFreq, AAFreq, xlab="", ylab="", ylim=c(0, 1), xlim=c(0, 1), col="green")

# 在同一个图形上添加第三个图形,不覆盖前两个图形
par(new=TRUE)
plot(AFreq, 1-AAFreq-HetFreq, xlab="",
     ylab="genotype frequency", ylim=c(0, 1), xlim=c(0, 1),
     col="red")

# 在同一个图形上添加三条曲线
curve(2*x*(1-x), 0, 1, add=TRUE, ylab=NULL, lwd=2, ylim=c(0, 1), col="darkblue")
curve(x**2, 0, 1, add=TRUE, ylab=NULL, lwd=2, ylim=c(0, 1), col="darkgreen")
curve((1-x)**2, 0, 1, add=TRUE, ylab=NULL, lwd=2, ylim=c(0, 1), col="darkred")

# 添加文本标签
text(0.5, 0.7, "Aa", col = "blue")
text(0.9, 0.7, "AA", col = "green")
text(0.1, 0.7, "aa", col = "red")

目前为止,这些模拟是通过从原始的“等位基因”列表(总共十个中有两个“A”)中以p = 0.2为中心抽样等位基因频率来运行的。然而,我们可以修改代码,使其在整个可能的等位基因频率范围内运行。我们使用runif

p <- runif(1)
for(i in 1:popsize){ #Randomly sample alleles
  pop[i,1] <- sample(allele,1)
  pop[i,2] <- sample(allele,1)
}
for(i in 1:popsize){
  if(runif(1)<p){
    pop[i,1] <- "A"
  }else{
    pop[i,1] <- "a"
  }
  if(runif(1)<p){
    pop[i,2] <- "A"
  }else{
    pop[i,2] <- "a"
  }
}

当然 大家可以通过改变种群大小去看看差异

下一章将讲解R语言计算等位基因频率相关的内容,欢迎大家点赞收藏。

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

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

相关文章

工业读码器与商用扫码器的区别

条码二维码在数字信息化应用越来越广泛&#xff0c;扫码器成为了数据收集和处理的重要工具&#xff0c;无论是工厂生产和物流包裹朔源追踪&#xff0c;还是商场超市扫码收银和餐饮娱乐等场景&#xff0c;均能看到扫码器的辅助&#xff0c;市场上的扫码器种类繁多&#xff0c;在…

C++修饰符类型

一、存储类运算符 auto&#xff08;自动存储类&#xff0c;但在现代C中&#xff0c;它通常用于自动类型推导&#xff09; register&#xff08;建议编译器将变量存储在寄存器中&#xff0c;但现代编译器通常忽略此关键字&#xff09; static&#xff08;静态存储类&#xff…

AD20使用操作Part2

元件的放置 在原理图界面&#xff0c;在右下角&#xff0c;Panels 选择Components 在自己元件库直接拖过来&#xff0c;放到原理图。 器件的复制和对齐 双击边缘&#xff0c;更改为A3纸 画方格&#xff0c;把元件给规划&#xff1a;放置——绘图工具——线 Shift空格&am…

【linux网络(七)】数据链路层详解

&#x1f493;博主CSDN主页:杭电码农-NEO&#x1f493;   ⏩专栏分类:Linux从入门到精通⏪   &#x1f69a;代码仓库:NEO的学习日记&#x1f69a;   &#x1f339;关注我&#x1faf5;带你学更多操作系统知识   &#x1f51d;&#x1f51d; Linux网络 1. 前言2. 认识MAC…

Android --- 新电脑安装Android Studio 使用 Android 内置模拟器电脑直接卡死,鼠标和键盘都操作不了

新电脑安装Android Studio 使用 Android 内置模拟器电脑直接卡死&#xff0c;鼠标和键盘都操作不了 大概原因就是,初始化默认Google的安卓模拟器占用的RAM内存是2048&#xff0c;如果电脑的性能和内存一般的话就可能卡死&#xff0c;解决方案是手动修改安卓模拟器的config文件&…

运营商如何通过PCDN技术提高用户服务?

着互联网的快速发展&#xff0c;用户对网络速度和质量的要求越来越高。为了满足这些需求&#xff0c;内容分发网络(CDN)成为了关键的基础设施。而在CDN技术中&#xff0c;PCDN(PersonalCDN)作为一种新兴的技术&#xff0c;为运营商和用户提供了新的解决方案。本文将重点介绍PCD…

RuoYi-Vue项目后端增加自己的模块,要注意的点,只看我这一片就够了。

若依版本&#xff1a; RuoYi-Vue: &#x1f389; 基于SpringBoot&#xff0c;Spring Security&#xff0c;JWT&#xff0c;Vue & Element 的前后端分离权限管理系统&#xff0c;同时提供了 Vue3 的版本 背景&#xff1a; 后端想自己增加一个模块&#xff0c;但是包路径…

聊聊 golang 的 map

1、哈希表 哈希表是一个很常见的数据结构&#xff0c;用来存储无序的 key/value 对&#xff0c;给定的 key 可以在 O(1) 时间复杂度内查找、更新或删除对应的 value。 设计一个好的哈希表&#xff0c;需要着重关注两个关键点&#xff1a;哈希函数、冲突处理。 1.1 哈希函数 …

文件上传漏洞---Pyload

文章目录 前言一、pandas是什么&#xff1f;二、使用步骤 1.引入库2.读入数据总结 前言 本文重点从靶场案例分析文件上传漏洞常见的Pylod&#xff0c;本文演示靶场upload-labs 一.文件类型---Pyload 不同的文件对应不同的文件类型&#xff0c;后端代码通过限制特定的文件类型…

【C++】C++指针在线程中调用与受保护内存空间读取方法

引言 在C的多线程编程中&#xff0c;正确地管理内存和同步访问是确保程序稳定性和安全性的关键。特别是当涉及到指针在线程中的调用时&#xff0c;对受保护内存空间的访问必须谨慎处理&#xff0c;以防止数据竞争、死锁和内存损坏等问题。本文将详细探讨C指针在线程中调用时如何…

提升入住率|智慧酒店解决方案,打造有温度的居住体验!

近年来&#xff0c;智慧酒店被越来越多的人关注&#xff0c;由生物识别、物联网技术和互联网技术融合产生的智慧酒店解决方案&#xff0c;不仅可以提升顾客在酒店的入住体验&#xff0c;还可以帮助酒店降低运营成本&#xff0c;这也让越来越的酒店选择了智慧酒店的赛道&#xf…

c++读取文件时出现中文乱码

原因&#xff1a;UTF-8格式不支持汉字编码 解决&#xff1a;改成ANSI&#xff0c;因为ANSI编码支持汉字编码

新款奔驰GLE350升级原厂空气悬挂系统有哪些功能

奔驰 GLE350 升级原厂空气悬挂带来了一系列显著的优势和功能&#xff1a; 1. 舒适性提升 • 能够根据不同的路况和驾驶模式自动调节悬挂硬度和高度&#xff0c;有效过滤路面颠簸&#xff0c;为驾乘者提供更加平稳、舒适的行驶体验。 2. 行驶高度调节 • 驾驶者可以手动或自…

明日周刊-第14期

不好意思又拖更了哈哈哈。不过赶在7月的第一天&#xff0c;打算更新一下。建党节&#xff0c;值得纪念的一天。 文章目录 一周热点资源分享言论歌曲推荐 一周热点 国内科技新闻 深中通道建成通车 时间&#xff1a;2024年6月30日 内容&#xff1a;深圳至中山跨江通道正式建成开…

【06】SpringBoot与Web开发

1、基于Restful风格的接口 RestController RequestMapping("/demo") public class DemoController {GetMapping("/hello")public String getHello(){return "SpringBoot HelloWorld! 123";}GetMapping("/{id}")public User getUser(P…

【支撑文档】系统安全保证措施(word原件)

软件安全保证措施word 软件所有全套资料获取进主页或者本文末个人名片直接。

图形的搭建

例一&#xff1a; 输入描述&#xff1a; 多组输入&#xff0c;一个整数&#xff08;2~20&#xff09;&#xff0c;表示输出的行数&#xff0c;也表示组成“X”的反斜线和正斜线的长度。 输出描述&#xff1a; 针对每行输入&#xff0c;输出用“*”组成的X形图案。 示例一&…

【C语言】19.预处理详解

文章目录 1.预定义符号2.#define定义常量3.#define定义宏4.带有副作用的宏参数5.宏替换的规则6.宏函数的对比7.#和##7.1 #运算符7.2 ## 运算符 8.命名约定9.#undef10.命令行定义11.条件编译12.头文件的包含12.1 头⽂件被包含的⽅式12.1.1 本地⽂件包含12.1.2 库⽂件包含 12.2 嵌…

基于协同过滤的航空票务推荐系统的设计与实现(飞机票推荐系统)

&#x1f497;博主介绍&#x1f497;&#xff1a;✌在职Java研发工程师、专注于程序设计、源码分享、技术交流、专注于Java技术领域和毕业设计✌ 温馨提示&#xff1a;文末有 CSDN 平台官方提供的老师 Wechat / QQ 名片 :) Java精品实战案例《700套》 2025最新毕业设计选题推荐…

鸿蒙OS开发者高级学习第2课:自由流转(含习题答案)

自由流转两种形态&#xff1a;相继使用&#xff08;跨端迁移&#xff09;&#xff1b;同时使用&#xff08; 多端协同&#xff09; 习题&#xff1a;