【生信算法】利用HMM纠正测序错误(Viterbi算法的python实现)

news2024/11/6 9:39:45

利用HMM纠正测序错误(Viterbi算法的python实现)

问题背景

对两个纯系个体M和Z的二倍体后代进行约~0.05x的低覆盖度测序,以期获得后代个体的基因型,即后代中哪些片段分别来源于M和Z。已知:

  1. 后代中基因型为MM、MZ(杂合)和ZZ的比例是0.4:0.2:0.4;(初始概率)

  2. 直接通过测序结果判断单个位点的基因型的错误率为3%;(输出概率)

  3. 测序获得的M和Z之间的多态性位点相互之间距离恰好一致,重组率均为0.01。(转移概率)

有一个后代的一段染色体,测序获得的109个位点的基因型依次为:

1111111011111101111111000000001000000001000001000000000000001011001010101010111111101111111111101111111011111

其中1表示MM,0表示ZZ。由于低覆盖度测序,杂合位点只能测到其中一个等位基因,因此表现为MM或ZZ。

请构建隐马科夫模型,并推断这段序列各位点真正的基因型。

参考结果:

1111111111111111111111000000000000000000000000000000000000002222222222222222111111111111111111111111111111111

其中1表示MM,0表示ZZ,2表示MZ(杂合)。
在这里插入图片描述

五大参数说明

状态集

MMMZZZ
120

观测集

mz
10

初始分布

MMMZZZ
0.40.20.4

状态转移概率矩阵

重组率表示重组型配子占总配子数的比例,MM→MZ和MM→ZZ加起来应为重组率。
二者在重组类型中的比例则是通过初始分布得到的,即MM:MZ:ZZ=2:1:2。
故相较于论文中转移概率矩阵,调整后如下:

MMMZZZ
MM 1 − R 1-R 1R R 3 \frac{R}{3} 3R 2 R 3 \frac{2R}{3} 32R
MZ R 2 \frac{R}{2} 2R 1 − R 1-R 1R R 2 \frac{R}{2} 2R
ZZ 2 R 3 \frac{2R}{3} 32R R 3 \frac{R}{3} 3R 1 − R 1-R 1R

https://doi.org/10.1073/pnas.1005931107

输出概率矩阵

zm
MM E E E 1 − E 1-E 1E
MZ 1 2 \frac{1}{2} 21 1 2 \frac{1}{2} 21
ZZ 1 − E 1-E 1E E E E

代码实现

参数设置

import numpy as np

# 转移概率矩阵
A = [[0.99, 0.02 / 3, 0.01 / 3],
     [0.01 / 2, 0.99, 0.01 / 2],
     [0.02 / 3, 0.01 / 3, 0.99]]
# 行列为 MM MZ ZZ
# 输出概率矩阵
B = [[0.03, 0.97],
     [0.5, 0.5],
     [0.97, 0.03]]
# 行为 MM MZ ZZ, 列为 z m
# 初始状态分布
initp = [0.4, 0.2, 0.4]
# 对应着 MM MZ ZZ
# 状态数和状态名
S = 3
S_name = ['1', '2', '0']
# 观察序列
Y = '1111111011111101111111000000001000000001000001000000000000001011001010101010111111101111111111101111111011111'

viterbi实现

# viterbi实现
# 向前计算
Probability = []
Position = []
Position.append([0, 0, 0])
first = []
for i in range(len(initp)):
    first.append(initp[i] * B[i][int(Y[i])])

Probability.append(first)
for i in range(1, len(Y)):
    ProbabilityTemp = []  # 用来存放每一层观察值对应的三种状态概率值
    GetPosition = []
    for j in range(S):
        ProbabilityTemp.append((np.max(np.array(Probability[i - 1]) * np.array(A[j]))) * B[j][int(Y[i])])
        GetPosition.append(np.argmax(np.array(Probability[i - 1]) * np.array(A[j])))
    Probability.append(ProbabilityTemp)
    Position.append(GetPosition)
traceback_idx = np.argmax(np.array(Probability[-1]))
path = [S_name[traceback_idx]]

for i in range(len(Y) - 2, -1, -1):
    path.append(S_name[traceback_idx])
    traceback_idx = Position[i][traceback_idx]
print('程序输出如下:')
print((''.join(path))[::-1])
print('参考答案如下:')
print('1111111111111111111111000000000000000000000000000000000000002222222222222222111111111111111111111111111111111')
程序输出如下:
1111111111111111111111000000000000000000000000000000000000002222222222222222111111111111111111111111111111111
参考答案如下:
1111111111111111111111000000000000000000000000000000000000002222222222222222111111111111111111111111111111111

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

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

相关文章

C++ 内存管理

由于C++需要程序员自己完成堆区的内存回收,因此有可能存在内存泄漏的风险。而Java、Python不需要程序员去考虑内存泄漏的问题,虚拟机都做了内存管理。只要可以跨平台的编程语言都需要做内存对齐,C++、Java、Python都是一样的。内存的定义 程序运行时所需的内存空间分为 固定…

什么是知识,什么是知识图谱,有什么作用,有哪些应用领域?

知识图谱可以帮助机器理解世界,提高人工智能模型的性能。它还可以用于数据挖掘、信息检索、问答系统和语义搜索等领域,提高系统的准确性和可理解性。知识图谱的建模方式和技术也可以用于生物信息学和社交网络分析等领域。 知识图谱背景 在给出知识图谱…

【踩坑笔记】STM32 HAL库+泥人W5500模块

1.HAL库与标准库转换 泥人提供的模块收发程序 HAL库下的收发(这里只提供部分接口,其它同样改发): 下边这条是标准库自带的函数,这里只用来和HAL库转换 改完之后,想验证自己的驱动改好没有,…

时序建模的主要流程

一、收集、预处理数据 收集:使用R包TSA的数据集,描述数据的基本统计特征【均值、方差、原始时序图】数据预处理:因为数据来源可靠,故针对数据预处理只做空缺值检查,其基本检测方法如下: 根据时间起点与时间…

nodejs+vue095设计学生选课成绩管理系统

目 录 目 录 III 1绪论 1 1.1课题研究的背景与意义 1 1.2 国内外研究现状和发展趋势 1 1.3课题研究的内容 2 2 关键技术介绍 3 前端技术:nodejsvueelementui 前端:HTML5,CSS3、JavaScript、VUE 1、 node_modules文件夹(有npn ins…

古典乐器网页设计成品 大学生音乐网站制作模板 大学生静态音乐HTML网页源码 dreamweaver网页作业 简单网页课程成品

🎉精彩专栏推荐 💭文末获取联系 ✍️ 作者简介: 一个热爱把逻辑思维转变为代码的技术博主 💂 作者主页: 【主页——🚀获取更多优质源码】 🎓 web前端期末大作业: 【📚毕设项目精品实战案例 (10…

单链表---对传参为双指针的理解

​​​​​​​​​​​ 上一篇中我们提到了单链表头指针的创建 如果链表为空时,头指针为NULL。接下来要实现节点的插入和删除。 在链表头部插入新节点,因此头指针指向的地址也应发生改变,即指向新节点的地址,因为在此时新节点就是…

消息队列之 Kafka + EFLFK集群部署

目录 介绍 Zookeeper 概述 Zookeeper 定义 Zookeeper 工作机制 Zookeeper 特点 Zookeeper 数据结构 Zookeeper 应用场景 Zookeeper 选举机制 部署 Zookeeper 集群 操作过程(3台服务器操作相同) 消息队列概述 为什么需要消息队列(M…

C#语言实例源码系列-实现电脑显示器的各种设置

专栏分享点击跳转>Unity3D特效百例点击跳转>案例项目实战源码点击跳转>游戏脚本-辅助自动化点击跳转>Android控件全解手册 👉关于作者 众所周知,人生是一个漫长的流程,不断克服困难,不断反思前进的过程。在这个过程中…

ARM S5PV210 汇编实现时钟设置代码详解

一、时钟设置的步骤分析 第1步:CLK_SRC寄存器的设置分析 先选择不使用 PLL。让外部 24MHz 原始时钟直接过去,绕过 APLL 那条路。 CLK_SRC 寄存器其实是用来设置 MUX 开关的。在这里先将该寄存器设置为全 0,主要是 bit0 和bit4 设置为 0&am…

安全智能分析技术白皮书 数据共享

数据共享 定义内涵 数据共享 是指在多个用户或多个程序之间遵循一定规则共同享用数据,并进行各种操作、运算和分析的一种技术。数据共享包括数据发布、接口、交换等内容。 技术背景 随着数字经济成为拉动全球经济增长的新引擎,大数据成为经济中重要的…

聊聊零拷贝?

什么是零拷贝 零拷贝是指计算机在执行IO操作的时候,CPU不需要将数据从一个存储区复制到另一个存储区,进而减少上下文切换以及CPU拷贝的时间,这是一种IO操作优化技术 零拷贝不是没有拷贝数据,而是减少用户态,内核态的…

【Python】sklearn中的K-Means聚类

文章目录初步认识初值选取小批初步认识 k-means翻译过来就是K均值聚类算法,其目的是将样本分割为k个簇,而这个k则是KMeans中最重要的参数:n_clusters,默认为8。 下面做一个最简单的聚类 import numpy as np import matplotlib.…

Python基础语法之学习print()函数

在AI时代,编程已不是程序猿、攻城狮的专属属性,而是一个工具,或是一种技巧,本质上跟Word、PPT没啥区别。如果大家现在想掌握一门编程技能的话,那一定是 Python, 因为它既简洁高效,又能快速入门上手。本文将…

JavaWeb语法三:线程不安全问题的原因和解决方案

目录 1.线程的状态 2.线程不安全的原因 2.1:原子性 2.2: 可见性 2.3:有序性 3.解决线程不安全问题 3.1:synchronized 3.1.1:互斥 3.1.2:可重入 3.2:volatile关键字 3.3:w…

傻白入门芯片设计,盘点GPU业界的大佬(十五)

在PC个人电脑时代,英特尔(Inter)是无可争议的芯片巨头,凭借着X86架构在数据中心CPU中的压倒性地位,一度垄断全球90%的市场份额。然而在人工智能时代,以英伟达(NVIDIA)为首的GPU、AI芯…

大学生心里健康

开发工具(eclipse/idea/vscode等): 数据库(sqlite/mysql/sqlserver等): 功能模块(请用文字描述,至少200字): 网站前台:关于我们、联系信息文章信息、咨间师信息、服务信息、测试信息 管理员功能: 1、管理关…

[激光原理与应用-60]:激光器 - 光学 - 光的四大理论框架与其层次:几何光学、波动光学、电磁光学、电子光学

目录 第1章 光的四大理论框架与层次 第2章 光的四大理论各自的特点 2.1 几何光学(粒子性)》光学特征 2.2 波动光学(波动性) 2.3 电磁光学(电学性) 2.4 量子光学(能量) 第1章 光…

【信管4.2】定义范围与WBS

定义范围与WBS上次课程已经说过,今天的内容是非常重要的,可以说是整个范围管理的核心内容。因此,也请各位打醒十二分精神,一起来学习这两个非常重要的过程吧。定义范围定义范围, 是指定项目和产品详细描述的过程&#…

Canvas库 KonvaJS入门 2坐标体系总结

Canvas库 KonvaJS入门 2坐标体系总结一、 准备环境二、konvasJS坐标基本使用演示1. 按坐标放置控件2. 移动group3. 父元素 scale 变化4. 子元素scale变化5. 旋转一、 准备环境 KonvaJS的几个属性值与坐标都有关系,有时候不容易分清坐标如何计算,本文作个…