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

news/2024/11/18 0:20:11/

利用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
MM1−R1-R1RR3\frac{R}{3}3R2R3\frac{2R}{3}32R
MZR2\frac{R}{2}2R1−R1-R1RR2\frac{R}{2}2R
ZZ2R3\frac{2R}{3}32RR3\frac{R}{3}3R1−R1-R1R

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

输出概率矩阵

zm
MMEEE1−E1-E1E
MZ12\frac{1}{2}2112\frac{1}{2}21
ZZ1−E1-E1EEEE

代码实现

参数设置

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.ppmy.cn/news/4199.html

相关文章

华为机试真题 Java 实现【开放日活动】【2022.11 Q4 新题】

目录 题目 思路 考点 Code 题目 题目描述 某部门开展Family Day开放日活动,其中有个从桶里取球的游戏,游戏规则如下:有N个容量一样的小桶等距排开,且每个小桶都默认装了数量不等的小球, 每个小桶装的小球数量记录在数组 bucketBallNums 中,游戏开始时,要求所有桶的小球…

【10秒在圣诞节做出温馨的圣诞树】

🤵‍♂️ 个人主页老虎也淘气 个人主页 ✍🏻作者简介:Python学习者 🐋 希望大家多多支持我们一起进步!😄 如果文章对你有帮助的话, 欢迎评论 💬点赞👍🏻 收藏…

MySQL表的约束

为防止数据表中插入错误的数据,MySQL定义了一些维护数据库完整性的规则,即表的约束。常用的约束分为五种:默认约束、非空约束、主键约束、唯一约束和外键约束 目录 默认约束 非空约束 唯一约束 主键约束 自动增长 默认约束 默认约束用…

Linux文件权限概念

目录 前言 1、Linux 文件属性 1.1、档案类型权限 1.2、连结数 1.3、档案拥有者 1.4、档案所属群组 1.5、档案容量 1.6、档案最后被修改的时间 1.7、档名(文件名) 2、如何改变文件属性和权限 2.1、改变所属群组, chgrp 2.2、改变档案拥有者, c…

DockerCompose部署系列:搭建Graylog日志环境

# 拉取镜像 docker pull elasticsearch:7.12.0 docker pull graylog/graylog:4.3.6 docker pull mongo:4.2# 创建网络 docker network create mynetwork# 配置三个文件,es,mogo,graylog vi dockercompose-es.yml version: 3 services:elasticsearch:image: elastics…

【数据结构Note6】-图-知识总结(图存储+BFS+DFS+最小生成树+最短路径+拓扑+逆拓扑)

文章目录6.1 图的定义及性质6.1.1 无向图和有向图6.1.2 简单图和多重图6.1.3 图的相关概念6.1.3.1 顶点的度6.1.3.2 顶点和顶点的关系6.1.3.3 子图6.1.3.4 连通分量6.1.3.5 强连通分量6.1.3.6 生成树6.1.3.7 生成森林6.1.3.8 边的权、带权图/网6.1.3.9 几种特殊的图6.2 图的存储…

leetcode1785:构成特定和需要添加的最少元素(12.16每日一题)

题目表述&#xff1a; 给你一个整数数组 nums &#xff0c;和两个整数 limit 与 goal 。数组 nums 有一条重要属性&#xff1a;abs(nums[i]) < limit 。 返回使数组元素总和等于 goal 所需要向数组中添加的 最少元素数量 &#xff0c;添加元素 不应改变 数组中 abs(nums[i…

【Linux】进程间通信

目录 一、进程间通信背景 1、进程间通信的理解 2、进程间通信的目的 3、进程间的必要性 二、管道 1、什么是管道 2、匿名管道 3、命名管道 4、管道通信的特点 三、System V IPC 1、共享内存 2、进程互斥 总结 一、进程间通信背景 1、进程间通信的理解 进程运行具…