蚜虫包装介绍

肖恩·威尔金森

2017-06-23


摘要

蚜虫是开发的R包隐马尔可夫模型和轮廓HMM在生物学中的应用序列分析。它包含多个和成对的函数序列比对、模型构建和参数优化、文件导入/导出,执行正向、反向和Viterbi基于树的条件序列概率算法加权和序列模拟。该软件包有多种包括数据库搜索、基因发现和注释的用途,系统发育分析和序列分类。

介绍

隐马尔可夫模型(HMM)是许多最重要任务的基础在计算生物学中,包括多序列比对、基因组注释,以及越来越多的序列数据库搜索。原来为语音识别算法开发,它们在自从计算能力使全面概率分析成为可能启发式近似。这一转变的先驱是两个团体由Anders Krogh和Sean Eddy领导,他们各自的软件包SAM和HMMER公司支撑了基于HMM的生物信息分析已有二十多年的历史。

在这里,我们展示了蚜虫用于分析的包R环境中的轮廓隐马尔可夫模型(R核心团队2017)。该包包含用于开发、打印、导入和导出标准和概要HMM,以及转发的实现,计算完全和最优的反向和维特比算法条件序列概率。该软件包还具有多个产生高质量比对的序列比对工具通过介绍HMM培训。

“蚜虫”包装

###依赖项蚜虫包的设计目的是与生成的“DNAbin”和“AAbin”对象类型结合使用使用包裹(帕拉迪斯,Claude和Strimmer,2004年;Paradis 2012)。这些对象类型,在比特级编码方案中表示的序列是优先于标准字符类型序列以最大化内存和速度效率。虽然我们建议使用沿着蚜虫,它不是必需的,因此列在程序包的“建议”部分,而不是“进口”部分描述。实际上,任何标准ASCII字符序列都是支持,制作蚜虫适用于其他应用在生物序列分析之外。然而,应该注意如果DNA和/或氨基酸序列作为特征向量输入,函数可能无法识别模糊码,因此不能保证正确对待他们。

为了最大化速度,低级动态编程函数(包括向前、向后、Viterbi和最大值后部算法)用C++编写,链接到Rcpp包裹(Eddelbuettel和Francois,2011年).这些功能的R版本也用于调试、实验和代码解释。此套餐也依赖于开放ssl包裹(Ooms 2016)用于顺序和对齐使用MD5哈希算法进行比较。

###类两个主要对象类,“HMM”(隐马尔可夫模型)使用蚜虫函数deriveHMM和derivePHMM。这些对象是由发射和过渡组成的列表概率矩阵(元素名为“E”和“A”),非强制性可以包括背景发射和过渡矢量的元素概率(分别为“qe”和“qa”)和其他模型元数据包括“名称”、“描述”、“大小”(模型)和“字母表”(由型号)。类“DPA”(动态编程数组)的对象也包括由Viterbi和正向/反向函数生成。这些是主要是为了简洁的控制台呈现而创建的。

###HMM和PHMM功能将在全文中进行更详细的解释以下部分使用蚜虫将函数打包到展示其效用。这些例子是从Durbin等人(1998),鼓励用户有关的理论和应用的更深入的解释,请参阅这些模型。尽可能提供书籍章节号易于参考。

隐马尔可夫模型

隐马尔可夫模型是一种概率数据生成机制用于一个序列或一组序列。它由以下网络描述状态每个从有限字母表根据一组发射概率,其值为特定于每个州。这些状态通过互连进行遍历一套,共套转移概率,包括概率保持任何给定状态,并转换为其他连接状态。

Durbin等人(1998)第3.2章。一个虚构的赌场有两个骰子,一个公平,一个加权。公平的骰子从具有相等概率的字母{1,2,3,4,5,6}(每个为1/6残留物)。用加载骰子掷“6”的概率为0.5,其余五个残基的平均值为0.1。如果经销商已经公平的骰子,他可能会秘密切换到加载的骰子每次掷骰后的概率为0.05,留下95%的机会保留公平的骰子。或者,如果他有加载的骰子,他会以0.1或更大的概率切换回公平骰子,以0.9的概率保留加载的骰子。

这个例子可以用一个简单的两状态隐马尔可夫表示模型。以下代码手动构建并绘制“HMM”对象。

图书馆(“蚜虫”)
状态<- c(c)(“开始”,“公平”,“已加载”)
残留物<- 粘贴(1:6)
###定义转移概率矩阵A
<- 矩阵(c(c)(0,0,0,0.99,0.95,0.1,0.01,0.05,0.9),nrow公司= )
数据名(A)<- 列表(来自=州,至=状态)
###定义排放概率矩阵E
E类<- 矩阵(c(c)(代表(1/6,6),代表(1/10,5),1/2),nrow公司= 2,旁观者= 真的)
数据名(E)<- 列表(状态=状态[-1],残留物=残留物)
###创建HMM对象
x个<- 结构(列表(A类=A、,E类=E) ,类= “HMM”)
###绘制模型
情节(x,文本导出= 1.5)
###可选地将转换概率添加为文本
文本(x个= 0.02,年= 0.5,标签= "0.95")
文本(x个= 0.51,年= 0.5,标签= "0.90")
文本(x个= 0.5,年= 0.9,标签= "0.05")
文本(x个= 0.5,年= 0.1,标签= "0.10")

图1:不诚实赌场的简单隐马尔可夫模型例子。情节。HMM方法描述了过渡概率作为加权线,排放概率作为水平灰色条。本例中没有建模开始/结束状态;然而,这可以通过在转换矩阵的第一行和第一列,并传递“begin=TRUE”绘图。隐马尔可夫模型.

对于一系列观察到的滚动,我们可以确定最可能的隐藏状态的序列(包括骰子最可能切换的时间发生)。在Durbin et给出的示例中(1998)第3.2章,观察到的300卷的顺序为:

##  31511624644664424531132163116415213362514454363165 ##  66265666666511664531326512456366646316366631623264 ##  55236266666625151631222555441666566563564324364131 ##  51346514635341112641462625335636616366646623253441 ##  36616611632525624622552652522664353533362331216253 ##  64414432335163243633665562566662632666612355245242

一些6的可观察簇表明,加载的骰子出现在某个阶段,但骰子开关是什么时候发生的?下面的代码使用维特比算法查找最可能的隐藏状态序列给出了模型。

数据(赌场)
###实际路径存储在序列的names属性中
实际的<- c(c)(“F”,“我”)[比赛(姓名(赌场),c(c)(“公平”,“已加载”))]
###查找预测路径
维生素1<- 维特比(x,赌场)
预测<- c(c)(“F”,“L”)[维生素1$路径+ 1]
###注意,输出Viterbi对象的path元素是一个整数向量
###将1添加到路径将从C/C++转换为R的索引样式

将预测的路径与实际的隐藏序列进行比较维特比算法就在眼前:

##实际的FFFFFFFFffFFFFFF##预测的FFFFFFFF## ##实际LLLLLLLLLL##预测LLLLLLLLLL## ##实际LLLLLLLLL FFFFFFFF FFFFF LLLLLLLL FFFFFFF##预测的LLLLLLLLLL FFFFFFFFffFFFFFF## ##实际的FFFFFFFFffFFFFFFFSFFFFFF LLLLLLLLLL FFFFFFff##预测的FFFFFFFF## ##实际FFFFFFFF##预测的FFFFFFFF## ##实际FFFFFFFFffFFFFFFF LLLLLLLLLL LLLLLL FFFFFF##预测的FFFFFFFFffFFFFFF LLLLLLLLLL FFFFFFF

我们还可以计算使用向前地和/或向后的算法:

赌场立柱<- 后面的(x,赌场)
情节(1:300,序列(0,1,输出长度= 300),类型= “n”,xlab公司= “卷号”,
     伊拉布= “骰子公平的后验概率”)
开始<- 哪一个(c(c)(“L”,实际)== “F” & c(c)(实际,“F”)== “L”)
末端<- 哪一个(c(c)(“F”,实际)== “L” & c(c)(实际,“L”)== “F”)- 1
对于(i)在里面 1:6)矩形(开始[i],0,结束[i],1,科尔= “灰色”,边界= )
线(1:300,赌场.邮政[1, ])

图2:300骰子的后验状态概率卷。线表示骰子的后验概率每次滚动时都很公平,而灰色矩形表示实际周期加载的骰子正在被使用。参见Durbin等人(1998)第3.2章了解更多详细信息。

从序列数据导出HMM

这个蚜虫包的功能衍生HMM用于通过一系列训练构建HMM序列。下面的代码从我们的单个骰子序列以其已知状态路径滚动(存储为“名称”序列的属性)。

<- 衍生HMM(列表(赌场),日志空间= 错误的)
情节(年),文本导出= 1.5)

###可选地将转换概率添加为文本
文本(x个= 0.02,年= 0.5,标签= (年)$A类[“公平”,“公平”],2))
文本(x个= 0.51,年= 0.5,标签= (年)$A类[“已加载”,“已加载”],2))
文本(x个= 0.5,年= 0.9,标签= (年)$A类[“公平”,“已加载”],2))
文本(x个= 0.5,年= 0.1,标签= (年)$A类[“已加载”,“公平”],2))

图3:从300个骰子序列派生出的简单HMM卷。如图1所示,转移概率如下所示加权线和发射概率为水平灰条。

尽管事实如此,这似乎与实际模型相当接近训练数据只包含一个序列。有人会通常从许多这样的序列列表中导出HMM(因此输入参数是一个列表而不是向量),但这个示例是简化以清晰明了。

轮廓隐马尔可夫模型

剖面隐马尔可夫模型是标准HMM的扩展,其中发射和跃迁概率为位置具体的也就是说,它们可以沿顺序。这些模型的参数通常比简单的HMM对等项,但对于序列来说可能非常强大分析。剖面HMM的前体通常是多序列对齐。路线中的每一列通常(但不总是)由模型中的一个内部位置或“模块”表示,每个由三种状态组成的模块:

图4显示了上面列出的三种状态类型,即圆形菱形和矩形。这些州通过过渡联系在一起概率在图中显示为加权线。

考虑以下氨基酸序列的小部分比对Durbin等人(1998)第5.3章:

数据(珠蛋白)
珠蛋白
##            [,1] [,2] [,3] [,4] [,5] [,6] [,7] [,8] [,9] [,10]##HBA_HUMAN“V”“G”“A”“-”“H”“A“G””“E”“Y”##HBB_HUMAN“V”“-”“-“”-“”N“”V“”D“”E“”V##MYG_PHYCA“V”、“E”、“A”、“-”“D”、“V”“A”“G”“H”##GLB3_CHITP“V”“K”“G”“-”“-”“-”“-”“-”“-”“D”##GLB5_PETMA“V”“Y”“S”-“”-“T”“Y“”E“”T“”S“”##LGB2_LUPLU“F”“N”“A”“-”“-“N””“I”“P”“K”“H”##GLB1_GLYDI“I”“A”“G”“A“D”“N”“G“A”、G“V”

特定位置的模式包括观察到位置1为“V”,位置3为“A”或“G”。制表时频率——增加伪计数也是谨慎的,因为没有特定过渡或发射类型不排除它发生在另一个(未观察到的)序列中的可能性。伪计数可以是拉普拉斯数(每个发射和跃迁加一个类型)、背景(调整拉普拉斯伪计数以反映从整个路线获得的背景频率),或用户定义的,它可以包括更复杂的伪计数方案,例如Dirichlet混合物(Durbin等人。1998).
derivePHMM函数的默认选项是“background”。

下面的代码从珠蛋白数据导出一个轮廓HMM打印模型:

珠蛋白。PHMM公司<- 衍生产品HMM(珠蛋白,残留物= “阿米诺”,假计数= “拉普拉斯”)
##应用统一序列权重
情节(珠蛋白.PHMM)

图4:来自部分珠蛋白序列的HMM剖面对齐。匹配状态显示为矩形、插入状态作为菱形,删除作为圆的状态。灰色水平条表示字母表中每个残留物的发射概率(在本例中为氨基酸字母表)在模型中的每个位置。删除状态中的数字只是模型模块编号,而处于插入状态的是下一个发射周期的当前插入状态。行是加权的在必要时指示,以反映状态。大的“B”和“E”标签代表的是无声的开始和最终状态。

注意,只有8个内部模块(不包括begin和结束状态),而路线有10列。这个衍生产品HMM功能已确定(使用最大值后部算法)没有足够的残差信息在路线的第4列和第5列中,以保证将其分配给内部模型中的模块。相反,对齐中的最后一个序列(GLB1_GLYDI)被认为已在位置处进入插入状态3保持两个排放循环(排放“A”和“D”)在模块4中转换到匹配状态之前。我们可以通过以下方式展示再次通过模型计算该序列的最佳路径使用维特比算法:

路径<- 维特比(珠蛋白.PHMM,珠蛋白[“GLB1_GLYDI”, ])$路径
路径
##  [1] 1 1 1 2 2 1 1 1 1 1

Viterbi对象的“path”元素是一个整数向量元素的值为0(“delete”)、1(“match”)或2(“insert”)。这个路径可以更直观地表示为字符而不是索引如下:

c(c)(“D”,“M”,“我”)[路径+ 1]
##[1]“M”“M”

注意,向每个路径元素添加1只是为了转换从C/C++索引样式(从0开始)到R的样式。

序列无需对齐即可生成配置文件HMM功能衍生产品HMM可以选择获取未对齐的列表序列,在这种情况下,最长的序列被用作创建一个初步的概要HMM,并对模型进行迭代训练使用Baum Welch或Viterbi训练的序列表算法(参见下面的模型训练部分)。

文件I/O

配置文件HMM可以导出为HMMER v3格式的文本文件(http://www.hmmer.org/)使用函数写入HMM例如,小珠蛋白可以通过运行以下命令导出概要文件HMM写PHMM(globins.PHMM)类似地,HMMER v3文本文件可以作为类“PHMM”的对象用函数解析为R读取PHMM.

序列模拟

为了模拟具有随机变化的数据蚜虫包的功能生成使用方法HMM和PHMM对象。序列使用递归生成模型内的转移和排放概率。那里是两个强制参数,一个模型(对象类“HMM”或“PHMM”)和“size”参数,指定序列的最大长度(这可以防止在insert-insert时发生溢出情况转移概率相对较高)。例如下面的代码模拟了小珠蛋白轮廓HMM:

模拟<- 列表(长度= 10)
禁止显示警告(RNG版本("3.5.0"))
设置种子(9999)
对于(i)在里面 1:10)模拟[[i]]<- 生成(珠蛋白.PHMM,尺寸= 20)
模拟
##$长度##I I I M I M M M D M M I M##“Y”“A”“I”“S”“K”“V”“R”“Y”## ## [[2]]##M月M月M日D月M日##H“E”“H”“A”“I”“-”“S”“E”## ## [[3]]##M M I M M D M##“Y”、“K”、“F”、“G”、“V”、“I”、“-”、“Y”## ## [[4]]##M M I I M M M M M M M M##C、M、E、D、S、A、S、G、M、G、K## ## [[5]]##年月日年月日##“V”“-”“-”“-”“-”“-”“-”“S”## ## [[6]]##M M I M D D D D##“F”“N”“I”“M”“-”“-## ## [[7]]##我我我我我##“G”“M”“N”“C”“G”## ## [[8]]##我我我我##“V”“H”“N”“A”“K”## ## [[9]]##年月日年月日##“Y”“-”“-“-”## ## [[10]]##M M M D D M M M M##“D”“L”“G”“-”“I”“C”“H”

请注意,名称属性指定每个残留物的状态从发出,间隙符号从删除状态发出。如果这些不需要间隙,可以按如下方式消除:

模拟<- 重叠地(模拟,功能(s) 秒[姓名(s)!= “D”])
模特培训

这个蚜虫软件包提供功能火车使用Baum优化模型参数韦尔奇或维特比训练算法。两者都是迭代细化算法;前者不依赖于多序列比对但通常比后者慢得多。维特比训练通过为指定“cores”参数,可以进一步加快操作速度并行处理。训练算法的最佳选择将通常取决于问题的性质和计算可用资源。有关更多信息,请参见Durbin等人(1998)标准HMM的第3.3章和6.5适用于型材HMM。

以下代码使用使用Baum Welch在前一步中模拟的序列算法。

球蛋白2.PHMM<- 火车(球蛋白.PHMM,sim,方法= “鲍姆韦尔奇”,
                       增量= 0.01,序列权重= 无效的)
##迭代1对数似然=-244.2442##迭代2对数似然=-226.6468##迭代3对数似然=-220.4567##迭代4对数似然=-216.7471##迭代5对数似然=-214.2664##迭代6对数似然=-212.5519##迭代7对数似然=-211.3709##迭代8对数似然=-210.5676##迭代9对数似然=-210.0423##迭代10对数似然=-209.7105##迭代11对数似然=-209.4912##迭代12对数似然=-209.3357##迭代13对数似然=-209.2219##迭代14对数似然=-209.1379##迭代15对数似然=-209.0752##迭代16对数似然=-209.0272##迭代17对数似然性=-208.9891##迭代18对数似然=-208.9575##迭代19对数似然=-208.9305##迭代20对数似然=-208.9068##迭代21对数似然=-208.8859##迭代22对数似然=-208.8672##迭代23对数似然=-208.8506##迭代24对数似然性=-208.836##迭代25对数似然=-208.8231##迭代26对数似然=-208.8118##迭代27对数似然=-208.8021##27次EM迭代后达到收敛阈值

如反馈所示(可通过设置“安静”关闭反馈=TRUE“),此操作需要7次期望最大化迭代收敛到指定的delta对数似然阈值0.01。

序列对齐

这个蚜虫包装可以用来生产使用迭代模型的高质量多序列比对上述培训方法。功能排列作为它的主要参数是作为“DNAbin”对象的序列列表“AAbin”对象或字符序列列表。类的对象“PHMM”可以作为可选的辅助参数传递给函数(“模型”),在这种情况下,序列仅与模型对齐生成对齐矩阵。如果“模型”为NULL,则为初步模型首先使用上面概述的“种子”序列方法派生,然后使用Baum Welch或Viterbi训练模型训练算法(指定通过“方法”参数)。这个然后以通常的方式将序列与模型对齐以生成路线。注意,如果输入中只有两个序列列表排列函数将执行两两对齐没有剖面HMM(Smith-Waterman或Needleman-Unch对齐)。

在最后一个例子中,我们将解构原始珠蛋白使用原始PHMM作为指南。

球蛋白<- 未分配的(珠蛋白)
排列(珠蛋白,模型=珠蛋白。PHMM公司,序列权重= 无效的,残留物= “阿米诺”)
##1 2 3 I 4 5 6 7 8##HBA_HUMAN“V”“G”“A”“-”“-”“H”“A”“G”“E”“Y”##HBB_HUMAN“V”“-”“-“”-“”N“”V“”D“”E“”V##MYG_PHYCA“V”、“E”、“A”、“-”“D”、“V”“A”“G”“H”##GLB3_CHITP“V”“K”“G”“-”##GLB5_PETMA“V”“Y”“S”-“”-“T”“Y“”E“”T“”S“”##LGB2_LUPLU“F”“N”“A”“-”“-”“N”“I”“P”“K”“H”##GLB1_GLYDI“I”“A”“G”“A“D”“N”“G“A”、G“V”

请注意,列名显示沿模型和预计插入物排放残留物的位置状态(例如序列7的第4和第5个残基)。

进一步阅读

这个包是根据Durbin中描述的算法编写的(1998)这本书提供了一个深入的为所有用户解释隐马尔可夫模型和概要HMM熟悉程度。包中的许多示例和数据集直接源自文本,它是这个包裹。也有优秀的资源可供这些人使用希望在R环境之外使用概要文件HMM。蚜虫软件包通过以下方式保持与HMMER软件套件的兼容性文件输入和输出函数readPHMM和writePHMM。那些进一步鼓励有兴趣的人查看SAM软件包,它还具有一整套功能和教程。

致谢

该软件由新西兰惠灵顿维多利亚大学开发,由卢瑟福基金会博士后研究资助新西兰皇家学会奖学金。

工具书类

Durbin、Richard、Sean Eddy、Anders Krogh和Graeme Mitchison。1998生物序列分析:概率蛋白质和核酸模型剑桥:剑桥大学出版社。
Eddelbuettel、Dirk和Romain Francois。2011Rcpp:无缝的R和C++集成.” 统计软件杂志40 (8): 1–18.https://www.jstatsoft.org/v40/i08/.
噢,杰伦。2016openssl:工具包基于OpenSSL的加密、签名和证书包裹。https://cran.r-project.org/package=openssl.
伊曼纽尔·帕拉迪斯。2012分析R的系统发育和进化第二版。纽约:斯普林格。
Paradis、Emmanuel、Julien Claude和Korbinian Strimmer。2004APE:系统发育和进化分析用R语言.” 生物信息学20: 289–90.https://doi.org/10.1093/bioinformatics/btg412.
R核心团队。2017R: 语言和统计计算环境.”奥地利维也纳:R统计计算基础。https://cran.r-project.org/.