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

2023-11-13

利用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(杂合)。
在这里插入图片描述

五大参数说明

状态集

MM MZ ZZ
1 2 0

观测集

m z
1 0

初始分布

MM MZ ZZ
0.4 0.2 0.4

状态转移概率矩阵

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

MM MZ ZZ
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

输出概率矩阵

z m
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
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

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

随机推荐

  • 试题 C: 刷题统计

    题目链接 点击跳转 题目描述 小明决定从下周一开始努力刷题准备蓝桥杯竞赛 他计划周一至周五每天做 a 道题目 周六和周日每天做 b 道题目 请你帮小明计算 按照计划他将在第几天实现做题数大于等于 n 题 输入格式 输入一行包含三个整数 a
  • 系统资源占用高排查手段

    1 cpu高排查思路 1 top d 1每秒打印进程所占cpu资源 然后再按h显示线程占用 2 strace跟踪strace p 线程号 会打印该线程主要做什么操作 2 io高排查思路 lsof是一个展现的是当前系统所有进程 不是线程 打开
  • 端午过后公司面了一个字节来的要求月薪23K,明显感觉他背了很多面试题...

    最近有朋友去字节面试 面试前后进行了20天左右 包含4轮电话面试 1轮笔试 1轮主管视频面试 1轮hr视频面试 据他所说 80 的人都会栽在第一轮面试 要不是他面试前做足准备 估计都坚持不完后面几轮面试 其实 第一轮的电话面试除了一些常规的
  • Redis数据结构——QuickList、SkipList、RedisObjective

    承接上文 本文主要介绍QuickList SkipList RedisObjective 四 Redis数据结构 QuickList 问题1 ZipList虽然节省内存 但申请内存必须是连续空间 如果内存占用较多 申请内存效率很低 怎么办
  • ObjectArx 学习笔记(一)--入口函数acrxEntryPoint

    参考资料 AutoCAD 2000 ARX二次开发实例精粹 1 Arx程序的初始化 新建完工程之后 Arx程序的初始化在acrxEntryPoint 函数的AcRx kInitAppMsg事件中 或该事件调用的函数中进行 例如InitApp
  • 【PS】高低频磨皮

    一 原理 将皮肤纹理的信息储存在高频的图层中 将皮肤颜色的信息储存在低频的图层中 从而分开皮肤的颜色和纹理 达到快速修复皮肤的效果 二 步骤 1 建立高低频图层 2 低频图层 3 高频图层 图像 应用图像 混合模式改为线性光
  • 以http协议实现onvif协议并完成对IPC摄像头的监控

    文章目录 目录 文章目录 前言 1实现http连接 2 获取设备编码参数 3 设置摄像头相关参数 总结 前言 因为工作上的原因 需要接入IPC摄像头 实现监控功能 因而开始了对于IPC摄像头的学习之路 因为要做到通用 所以目光直接锁定了on
  • python爬虫增加多线程获取数据

    Python爬虫应用领域广泛 并且在数据爬取领域处于霸主位置 并且拥有很多性能好的框架 像Scrapy Request BeautifuSoap urlib等框架可以实现爬行自如的功能 只要有能爬取的数据 Python爬虫均可实现 数据信息
  • 国产数据库产品清单

    01 提到国产数据库 圈儿内的朋友多数会说出国产数据库 四大家族 达梦 金仓 南大 神通 那么除了这四家 你还是否还了解其他的国产数据库产品 随着国内信息技术的快速发展 以及近几年去 O 的强势浪潮 在国内各数据库厂商的不断努力下 国产数据
  • 区块链实验室(14) - 编译FISCO-BCOS

    FISCO BCOS是一种区块链平台 与Hyperledger和Ethereum有些不同 详见FISCO BCOS 区块链 编译FISCO BCOS源码的目的是修改或者新增其中功能模块 进行对比实验 验证新想法 新创意的效果 编译的步骤很简
  • SQLi-Labs 学习笔记(Less 41-50)

    点击打开链接 Less 41 基于错误的POST型单引号字符型注入 先打开网页查看 Welcome Dhakkan 与之前讲的Less 40的区别 plain view plain copy sql SELECT FROM users WH
  • WPF性能优化经验总结

    原文地址 WPF性能优化经验总结 痴鸟 博客园 WPF性能优化一 Rendering Tier 1 根据硬件配置的不同 WPF采用不同的Rendering Tier做渲染 下列情况请特别注意 因为在这些情况下 即使是处于Rendering
  • 服务器添加网卡

    原因 因为网络原因服务器需要添加网卡 1 确定主板卡槽 是否可以添加网卡 2 命令ip a 查看现有网卡 3 命令 cd etc sysconfig network scripts 查看文件列表 enpls0 网卡对应文件ifcfg enp
  • 建模杂谈系列215 ADBS Update V3

    说明 本来在完成这次量化实验之前不想再改版 但想想至少还有3个ADBS要在本次中完成 算下来改所花的时间还是少于因为不改而做的额外配置 所以还是改 本次升级要解决几个问题 1 Redis Var的配置化管理 2 Worker 的命令行配置
  • 达芬奇17新功能及安装教程

    说起视频剪辑处理软件 除了知名的pr备受大家喜爱 但DaVinci Resolve也不甘示弱 又名达芬奇 这是一款集剪辑 调色 专业音频后期制作于一身的电脑视频处理软件 不仅拥有简洁明了 美观新颖的主界面 还直接划分了编辑 修剪 时间线 片
  • Mysql存储引擎

    目录 一 前言 二 存储引擎 1 InnoDB存储引擎 1 1 简介 1 2 优势 1 3 使用方法 1 4 性能 2 MyISAM存储引擎 2 1 优势 2 2 使用方法 2 3 性能 3 MEMORY存储引擎 4 MyISAM 三 比较
  • 用pip在pycharm里安装mysql_即使正确安装了pip和MySQL连接器,我也无法在Pycharm上连接到MySQL...

    我已经正确地安装了mysql连接器 命令提示符甚至显示安装成功 但是由于某些原因Pycharm在安装连接器时显示了错误 在 编码器从这里开始Collecting mysqlconnector Using cached https files
  • centos7安装弱口令破解工具hydra

    1 下载压缩包 wget https github com vanhauser thc thc hydra archive master zip 2 安装gcc和解压命令 yum y install gcc libssh devel ope
  • Linux环境部署:开启电脑虚拟化

    学习目标 开启电脑虚拟化 查看笔记本是否支持虚拟化 进入BIOS 开启VT 开启电脑虚拟化 查看笔记本是否支持虚拟化 进入BIOS 参考以下按键 开机时按住对应的键进入BIOS 组装机以主板分 华硕按F8 Intel按F12 其他品牌按ES
  • 【生信算法】利用HMM纠正测序错误(Viterbi算法的python实现)

    利用HMM纠正测序错误 Viterbi算法的python实现 问题背景 对两个纯系个体M和Z的二倍体后代进行约 0 05x的低覆盖度测序 以期获得后代个体的基因型 即后代中哪些片段分别来源于M和Z 已知 后代中基因型为MM MZ 杂合 和Z