Python如何实现生成随机DNA序列,原理及方法是什么
Admin 2022-08-04 群英技术资讯 520 次浏览
对于DNA序列,一阶马尔科夫链可以理解为当前碱基的类型仅取决于上一位碱基类型。如图1所示,一条序列的开端(由B开始)可能是A、T、G、C四种碱基(且可能性相同,均为0.25),若序列的某一位是A,则下一位碱基是A、T、G、C的概率分别为0.25、0.20、0.20、0.20,下一位无碱基(即序列结束,状态为E)的概率为0.15。
图1 DNA序列的一阶马尔科夫链
以下代码运行于Jupyter Notebook (Python 3.7);代码功能是随机生成一定数量的DNA序列,统计序列长度并绘制分布图。若希望显示随机生成的序列,将代码# print(''.join(Seq))前的#删除即可。
import numpy import random import seaborn as sns import matplotlib.pyplot as plt # 状态空间 states = ["A","G","C","T","E"] # 可能的事件序列 transitionName = [["AA","AG","AC","AT","AE"], ["GA","GG","GC","GT","GE"], ["CA","CG","CC","CT","CE"], ["TA","TG","TC","TT","TE"],] # 概率矩阵(转移矩阵) transitionMatrix = [[0.25,0.20,0.20,0.20,0.15], [0.20,0.25,0.20,0.20,0.15], [0.20,0.20,0.25,0.20,0.15], [0.20,0.20,0.20,0.25,0.15]] def RandomDNAs(Num): max_len = 0 i = 0 Seq = [] #创建列表(Seq)用于添加碱基,以组成DNA序列 Len = [] #创建列表(Len)用于记录每条生成序列的长度 while i != Num: Base = ["A","G","C","T"] START = random.choice(Base) #随机从碱基中选择一个作为序列的起始碱基 Seq.append(START) #将起始碱基添加至Seq中 while START != "E": if START == "A": change = numpy.random.choice(transitionName[0],p=transitionMatrix[0]) #以transitionMatrix矩阵第一行的概率分布随机抽取transitionName第一行包含的事件 if change == "AA": START = "A" #如果转移状态是AA(即A碱基接下来的碱基是A,则将起始碱基设为A) elif change == "AG": START = "G" elif change == "AC": START = "C" elif change == "AT": START = "T" elif change == "AE": START = "E" elif START == "G": change = numpy.random.choice(transitionName[1],p=transitionMatrix[1]) if change == "GA": START = "A" elif change == "GG": START = "G" elif change == "GC": START = "C" elif change == "GT": START = "T" elif change == "GE": START = "E" elif START == "C": change = numpy.random.choice(transitionName[2],p=transitionMatrix[2]) if change == "CA": START = "A" elif change == "CG": START = "G" elif change == "CC": START = "C" elif change == "CT": START = "T" elif change == "CE": START = "E" elif START == "T": change = numpy.random.choice(transitionName[3],p=transitionMatrix[3]) if change == "TA": START = "A" elif change == "TG": START = "G" elif change == "TC": START = "C" elif change == "TT": START = "T" elif change == "TE": START = "E" if START != "E": Seq.append(START) #如果状态转移后不为End(E),则将转移后的碱基加到Seq序列中 i += 1 Len.append(len(Seq)) if len(Seq) > max_len: max_len = len(Seq) #print(''.join(Seq)) Seq.clear() plt.hist(numpy.array(Len), bins=max_len, edgecolor="white") # 显示横轴标签 plt.xlabel("DNA Sequence Length") # 显示纵轴标签 plt.ylabel("Frequency") # 显示图标题 plt.title("Histogram of frequency distribution of DNA sequence length") plt.show() print("DNA序列的最大长度为:",max_len) print("DNA序列长度的众数为:",max(Len, key=Len.count)) %matplotlib notebook #若未使用Jupyter Notebook,此句不需要 RandomDNAs(1000) #1000表示随机生成1000条序列
从以下4个序列长度分布统计可以看到,随着随机生成的序列数量增多,序列长度分布愈发集中,且长度为1bp的序列占比最多且逐渐增加。
图2 10,000条DNA序列的序列长度分布统计
10,000条DNA序列的序列中
DNA序列的最大长度为: 65
DNA序列长度的众数为: 1
图3 100,000条DNA序列的序列长度分布统计
100,000条DNA序列的序列中
DNA序列的最大长度为: 71
DNA序列长度的众数为: 1
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:mmqy2019@163.com进行举报,并提供相关证据,查实之后,将立刻删除涉嫌侵权内容。
猜你喜欢
这篇文章主要介绍了pytorch实现简单全连接层的操作,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
Python使用类(class)和对象(object),进行面向对象(object-oriented programming,简称OOP)的编程。面向对象的最主要目的是提高程序的重
这篇文章给大家分享的是Django模板中两个变量运算的实现,文中示例代码介绍的非常详细,对大家学习和理解Django模板中的变量运算有一定的帮助,感兴趣的朋友接下来一起跟随小编看看吧。
文本主要给大家分享使用python怎么实现整数反转,下面分享了实现思路以及几种实现整数反转的方法,感兴趣的朋友可以参考,下面我们就一起来看看python实现整数反转要怎么做吧!
短期目前旨在爬取所有新闻门户网站的新闻,每个门户网站爬虫开箱即用,并自动保存到同目录下的 csv/excel 文件中,禁止将所得数据商用。
成为群英会员,开启智能安全云计算之旅
立即注册Copyright © QY Network Company Ltd. All Rights Reserved. 2003-2020 群英 版权所有
增值电信经营许可证 : B1.B2-20140078 粤ICP备09006778号 域名注册商资质 粤 D3.1-20240008