【基于R语言群体遗传学】-5-扩展到两个以上等位基因及多基因位点

我们现在继续对于群体遗传学进行统计建模,书接上回,我们讨论了孤雌生殖的物种违反哈代温伯格遗传比例的例子,那我们现在来看多于两个等位基因的情况的计算。

如果没有看过之前文章的同学,可以先去看一下之前的文章:

群体遗传学_tRNA做科研的博客-CSDN博客

多等位基因情况

到目前为止,我们一直专注于一个双等位基因(bi-allelic)系统,其中一个等位基因的频率表示为p,另一个等位基因的频率表示为(1-p)。然而,基因型预测可以很容易地扩展到超过两个等位基因。由于我们总是假设完全随机交配,我们理论上预期的纯合子数量仍然将等于p²,无论我们考虑多少个等位基因。一组j个等位基因的预期纯合率会是每个等位基因频率平方的和

p1 <- 0.2
p2 <- 0.3
p3 <- 0.5
sum(sapply(c(p1,p2,p3),function(x) x^2))

假设我们有三个等位基因频率,p1、p2和p3,并希望计算总体预期的纯合子基因型频率

这给了我们一个总体的纯合子基因型频率为38%。然后我们可以相当容易地得到一个预期的杂合子频率:

多位点情况

接下来让我们读取一个来自东地中海地区阿勒颇松(Pinus halepensis)的真实多采样等位基因数据集,整理这些数据,并计算我们预期的以及观察到的杂合子频率(改编自Gershberg等人,2016)。使用popgenr包,安装请看前面的博客:

基因型中的数据都来自微卫星。微卫星是由短重复的核苷酸组成特征的DNA片段。这类遗传标记因其高度变异(即具有高突变率)而常用于研究。让我们用str()函数来了解一下数据:

library("popgenr")
data(genotypes)
str(genotypes)

我们可以看到这个数据框有181个观测值(行)和20列。其中十八列代表不同的位点,每个独特的数字是一个不同的等位基因,前两列是每个样本的个体ID($ID)和种群分配($Pop)。我们想要编写一个迭代代码来遍历数据集进行计算;为了简化这个过程,我们先对数据进行一些简化处理。

rownames(genotypes) <- genotypes$ID
genotypes <- genotypes[,-c(1,2)]

根据这个数据集的设置,每个个体有两列,代表在一棵采样的二倍体松树中一个位点的两个拷贝。让我们计算数据集中位点的总数。对数据框使用length()函数应该只返回列的数量。由于每个位点由两列表示,我们可以将其除以2得到采样的位点总数: 

(num.loci <- (length(genotypes))/2)

现在我们知道我们正在处理九个不同的位点。接下来我们需要弄清楚每个位点实际上有多少个等位基因。我们将使用for循环来为每个位点进行等位基因计数。、

Hom_exp <- NULL
Het_exp <- NULL
Hom_obs <- NULL
Het_obs <- NULL
for(n in 1:(num.loci)){ # 对于每一个基因座
  current <- n*2-1 # 计算当前基因座的起始位置
  locus <- c(genotypes[,current],genotypes[,current+1]) # 获取当前基因座的两个等位基因
  alleles <- unique(locus) # 获取该基因座的所有独特等位基因
  alleles <- alleles[alleles!=-1] # 移除非等位基因标记(例如缺失数据标记为-1)
  p_allele <- NULL # 初始化等位基因频率向量
  for(a in 1:length(alleles)){ # 对于每个独特的等位基因
    p_allele <- c(p_allele,
                  sum(alleles[a]==locus)/sum(locus!=-1)) # 计算等位基因频率
  }
    Hom_exp <- c(Hom_exp, sum(sapply(p_allele,
                                   function(x) x^2))) # 期望纯合子频率是每个等位基因频率的平方和
    obs <- 0 # 初始化观察到的纯合子计数
  for(i in 1:length(genotypes[,current])){ # 对于当前基因座的每个个体
    if(genotypes[i, current]!=-1){ # 如果等位基因不是缺失数据
      if(genotypes[i, current]==genotypes[i,current+1]){ # 如果两个等位基因相同
        obs <- obs+1 # 增加纯合子计数
      }
    }
  }
  Hom_obs <- c(Hom_obs,obs/(sum(locus!=-1)/2)) # 观察到的纯合子频率是纯合子计数除以有效等位基因总数的一半
}

在R语言中,极少数会使用繁琐的循环,但是为了处理这里的数据我们不得不这样做,所以这也是为什么我们课题组会使用Java进行计算,我简述一下这个代码的意思:我们写一个循环遍历每个基因座(locus)--内部循环计算每个等位基因的频率--计算期望纯合子频率--计算观察到的纯合子频率:

现在要找到预期和观察到的杂合子频率,我们只需从频率的总和中减去我们的纯合子频率:

Het_exp <- 1- Hom_exp
Het_obs <- 1- Hom_obs

让我们绘制这九个位点的观察到的杂合度频率与预期杂合度频率的对比图,看看它们之间的关系如何。我们将从简单地使用plot绘制Het_obs和Het_exp开始,然后绘制一条回归线。我们将使用lm(线性模型)函数来估计数据集之间的线性关系(最小二乘线性回归)

# 绘制观测值与期望值的散点图
plot(Het_obs, Het_exp)

# 添加线性回归线
abline(lm(Het_exp ~ Het_obs))

# 进行线性回归分析并打印摘要
reg <- summary(lm(Het_exp ~ Het_obs))
print(reg)

# 提取并打印决定系数(r-squared)
rr <- reg$r.squared
rrlabel <- paste("r-squared =", round(rr, digits = 3))
text(0.6, 0.2, rrlabel)

# 提取并打印P值
pv <- reg$coefficients[2, 4]
pvlabel <- paste("P-value =", pv)
text(0.6, 0.15, pvlabel)

查看我们的图,我们应该看到一个很好的验证,即哈代-温伯格预测可以扩展到多个位点,在这种情况下,它在预测广泛的杂合性值方面表现得相当好。 

下一篇博客我们将讲述血液型及血液等位基因频率的内容,欢迎大家点赞关注!

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

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

相关文章

1.2 ROS2安装

1.2.1 安装ROS2 整体而言&#xff0c;ROS2的安装步骤不算复杂&#xff0c;大致步骤如下&#xff1a; 准备1&#xff1a;设置语言环境&#xff1b;准备2&#xff1a;启动Ubuntu universe存储库&#xff1b;设置软件源&#xff1b;安装ROS2&#xff1b;配置环境。 请注意&…

多模态图像生成的突破:Image Anything一种无需训练的智能框架

多模态图像生成是内容创作领域的热点技术&#xff0c;尤其在媒体、艺术和元宇宙等领域。该技术旨在模拟人类的想象力&#xff0c;将视觉、文本和音频等多种模态属性相关联&#xff0c;以生成图像。早期的方法主要侧重于单一模态输入的图像生成&#xff0c;例如基于图像、文本或…

240703_昇思学习打卡-Day15-K近邻算法实现红酒聚类

KNN(K近邻)算法实现红酒聚类 K近邻算法&#xff0c;是有监督学习中的分类算法&#xff0c;可以用于分类和回归&#xff0c;本篇主要讲解其在分类上的用途。 文章目录 KNN(K近邻)算法实现红酒聚类算法原理数据下载数据读取与处理模型构建--计算距离模型预测 算法原理 KNN算法虽…

Mac单机游戏推荐:星际争霸母巢之战 for Mac v1.16.1汉化版

星际争霸母巢之战 for Mac是一款深受玩家的即时战略游戏&#xff0c;延续了原版《星际争霸》的剧情&#xff0c;并加入了新的游戏单位、科技、地图样式、背景音乐及平衡性调整。《星际争霸》与其它的即时战略类型游戏。 下载地址&#xff1a;点击下载 与原作相同&#xff0c;《…

一图胜千言|用Python搞定统计结果展示!

分享一份原创Python可视化教程&#xff1a;530张图形8000行代码&#xff0c;轻松搞定统计结果展示&#xff0c;部分如下&#xff0c; 每类图表包含详细代码详细代码注释&#xff0c;多达8000行代码&#xff0c;例如&#xff0c; 如何加入学习&#xff1f; &#x1f447;&#…

免费分享:2022年全国地铁站点数据(附下载方法)

数据简介 2022年全国地铁站点数据不仅反应我国城市交通网络的日益完善&#xff0c;也为城市规划、公共交通优化、商业布局、应急响应及智慧城市建设提供了宝贵的数据支持与参考&#xff0c;助力城市发展与居民生活质量的全面提升。 数据属性 数据名称&#xff1a;全国地铁站点…

Java同步包装器

通过 Collections.synchronizedList() 方法将一个普通的 ArrayList 包装成了线程安全的 List&#xff1a; import java.util.*;public class SynchronizedWrapperExample {public static void main(String[] args) {// 创建一个非线程安全的 ArrayListList<String> list…

python gdal 压缩栅格数据

1 压缩方法LZW 使用 LZW&#xff08;Lempel-Ziv-Welch&#xff09;&#xff0c;主要对图像数据压缩&#xff0c;可逆 2 代码 函数gdal_translate()&#xff1a;转换栅格的不同格式 我们使用的数据是GTiff格式的数据 GTiff – GeoTIFF File Format — GDAL documentation 参…

MySQL安装与环境配置

1.打开安装程序 2.默认配置&#xff0c;如下二三图 3.配置密码 4.等待安装完毕 5.检查 6.配置环境变量 7.从控制台登录检测

STM32F1+HAL库+FreeTOTS学习4——任务挂起与恢复

STM32F1HAL库FreeTOTS学习4——任务挂起与恢复 任务挂起和恢复的API介绍代码实现 上一期我们学习了FreeRTOS中任务创建的两种方法&#xff0c;这一期我们学习任务的挂起和恢复。 任务挂起和恢复的API介绍 在 &#xff1a;STM32F1HAL库FreeTOTS学习1——FreeRTOS入门 的学习中&…

苹果电脑虚拟机运行Windows Mac环境安装Win PD19虚拟机 parallels desktop19虚拟机安装教程免费密钥激活

在如今多元的数字时代&#xff0c;我们经常需要在不同的操作系统环境下进行工作和学习。而对于 Mac 用户来说&#xff0c;有时候需要在自己的电脑上安装 Windows 操作系统&#xff0c;以体验更多软件及功能&#xff0c;而在 Mac 安装 Windows 虚拟机是常用的一种操作。下面就来…

Python28-5 k-means算法

k-means 算法介绍 k-means 算法是一种经典的聚类算法&#xff0c;其目的是将数据集分成 ( k ) 个不同的簇&#xff0c;每个簇内的数据点尽可能接近。算法的基本思想是通过反复迭代优化簇中心的位置&#xff0c;使得每个簇内的点与簇中心的距离之和最小。k-means 算法的具体步骤…

【FFmpeg】avformat_find_stream_info函数

【FFmpeg】avformat_find_stream_info 1.avformat_find_stream_info1.1 初始化解析器&#xff08;av_parser_init&#xff09;1.2 查找探测解码器&#xff08;find_probe_decoder&#xff09;1.3 尝试打开解码器&#xff08;avcodec_open2&#xff09;1.4 读取帧&#xff08;re…

嵌入式Linux之Uboot简介和移植

uboot简介 uboot 的全称是 Universal Boot Loader&#xff0c;uboot 是一个遵循 GPL 协议的开源软件&#xff0c;uboot是一个裸机代码&#xff0c;可以看作是一个裸机综合例程。现在的 uboot 已经支持液晶屏、网络、USB 等高级功能。 也就是说&#xff0c;可以在没有系统的情况…

创建kobject

1、kobject介绍 kobject的全称是kernel object&#xff0c;即内核对象。每一个kobject都会对应系统/sys/下的一个目录。 2、相关结构体和api介绍 2.1 struct kobject // include/linux/kobject.h 2.2 kobject_create_and_add kobject_create_and_addkobject_createkobj…

开源自动化热键映射工具autohotkey十大用法及精选脚本

AutoHotkey&#xff08;AHK&#xff09;是一款功能强大的热键脚本语言工具&#xff0c;它允许用户通过编写脚本来自动化键盘、鼠标等设备的操作&#xff0c;从而极大地提高工作效率。以下是AutoHotkey的十大经典用法&#xff0c;这些用法不仅解放了用户的双手&#xff0c;还展示…

字节码编程ASM之插桩方法调用记录

写在前面 源码 。 正式开始之前&#xff0c;先分享一个让人”悲伤“的真实的故事。 那是一个风和日丽的周六的下午&#xff0c;俺正在开开心心的打着羽毛球&#xff0c;突然接到了来自于最不想联系的那个人&#xff08;没错&#xff0c;这个人就是我的领导&#xff01;&#x…

QT Creator生成uml类图

先说方法&#xff0c;使用Doxygen工具&#xff0c;笔者用的虚拟机linux系统下的qt5.7&#xff0c;没找到自带的uml生成类的工具。 1、Doxygen 安装 在 Ubuntu 系统中&#xff0c;执行下面命令安装 doxygen 和 graphviz 软件包。 sudo apt install graphviz # 用于生成代码…

等保2.0 实施方案之信息软件验证要求

一、等保2.0背景及意义 随着信息技术的快速发展和网络安全威胁的不断演变&#xff0c;网络安全已成为国家安全、社会稳定和经济发展的重要保障。等保2.0&#xff08;即《信息安全技术 网络安全等级保护基本要求》2.0版本&#xff09;作为网络安全等级保护制度的最新标准&#x…

Gradle学习-5 发布二进制插件

注&#xff1a;以下示例基于Gradle8.0 1、发布插件 复制一分 buildSrc&#xff0c;执行命令行&#xff0c;生成一个新目录 leon-gradle-plugin cp -rf buildSrc leon-gradle-plugin在 leon-gradle-plugin 目录下的 build.gradle 中引入maven plugins{// 引用 Groovy 插件&…