R语言用隐马尔可夫Profile HMM模型进行生物序列分析和模拟可视化

本文开发和应用用于生物序列分析的隐马尔可夫模型和HMM。

由Kaizong Ye,Sherry Deng撰写

它包含多个和成对序列比对、模型构建和参数优化、文件导入/导出、实现条件序列概率的前向、后向和 Viterbi 算法、基于树的序列加权和序列模拟的功能。

隐马尔可夫模型 (HMM) 是计算生物学中许多最重要任务的基础,包括多序列比对、基因组注释以及越来越多的序列数据库搜索。

最初是为语音识别算法开发的,由于计算能力的进步使得完全概率分析代替启发式近似成为可能,因此它们在分子生物学领域的应用急剧增加。

×

在日常生活当中,我们总是希望根据当前天气的情况来预测未来天气情况,和上面的交通灯的例子不同,我们不能依靠现有知识确定天气情况的转移,但是我们还是希望能得到一个天气的模式。一种办法就是假设这个模型的每个状态都只依赖于前一个的状态,这个假设被称为马尔科夫假设,这个假设可以极大简化这个问题。显然,这个假设也是一个非常糟糕的假设,导致很多重要的信息都丢失了。

  当涉及到天气的时候,马尔科夫假设描述为,假设如果我们知道之前一些天的天气信息,那么我们就能预测今天的天气。当然,这个例子也是有些不合实际的。但是,这样一个简化的系统可以有利于我们的分析,所以我们通常接受这样的假设,因为我们知道这样的系统能让我们获得一些有用的信息,尽管不是十分准确的。

  谈到 HMM,首先简单介绍一下马尔可夫过程 (Markov Process),它因俄罗斯数学家安德烈·马尔可夫而得名,代表数学中具有马尔可夫性质的离散随机过程。该过程中,每个状态的转移只依赖于之前的 n 个状态,这个过程被称为1个 n 阶的模型,其中 n 是影响转移状态的数目。最简单的马尔科夫过程就是一阶过程,每一个状态的转移只依赖于其之前的那一个状态。注意这和确定性系统不一样,因为这种转移是有概率的,而不是确定性的。

  马尔可夫链是随机变量 X1, … , Xn 的一个数列。这些变量的范围,即他们所有可能取值的集合,被称为“状态空间”,而 Xn  的值则是在时间 的状态。如果 Xn+1 对于过去状态的条件概率分布仅是 X的一个函数,则

  这里 为过程中的某个状态。上面这个恒等式可以被看作是马尔可夫性质

  马尔可夫链的在很多应用中发挥了重要作用,例如,谷歌所使用的网页排序算法(PageRank)就是由马尔可夫链定义的。


在这里,我们展示了  用于在 R 环境中分析隐藏马尔可夫模型

隐马尔可夫模型

隐马尔可夫模型是一个序列或一组序列的概率数据生成机制。

它由 _状态_网络描绘,其值特定于每个状态。这些状态由一组互连的 _转换概率_遍历,其中包括保持在任何给定状态的概率以及转换到每个其他连接状态的概率。

Durbin et al (1998) 第 3.2 章给出了一个简单 HMM 的例子。一个假想的赌场有两个骰子,一个公平的,一个加权的。公平骰子从字母表 {1, 2, 3, 4, 5, 6} 中以相等的概率发出(每个 1/6)。加权骰子掷出“6”的概率为 0.5,而其他 5 个的概率为 0.1。如果庄家有公平骰子,他可能会在每次掷骰后以 0.05 的概率偷偷切换到装好的骰子,留下 95% 的机会保留公平骰子。或者,如果他有加权的骰子,他将以 0.1 的概率切换回公平骰子,或者更有可能以 0.9 的概率保留加权骰子。

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

### 定义转移概率矩阵A

diamnsames(A) <- lidst(from = sdtatases, to = statddes)

### 定义概率矩阵 E

dimnsdamesas(E) <- aslist(sdtateass = stasdates\[-1\])

### 创建 HMM 对象

图 1:不诚实赌场示例的简单隐马尔可夫模型。 plot 方法将转换概率描述为加权线。在这个例子中没有模拟开始/结束状态。

对于一系列观察到的掷骰,我们可以使用维特比算法建立最可能的隐藏状态序列(包括最有可能发生骰子切换的时间)。在 Durbin 等人 (1998) 第 3.2 章给出的示例中,观察到的 300 次滚动的序列为:

一些可观察到的 6 簇表明加载的骰子在某个阶段出现了,但是骰子切换是什么时候发生的呢?在下面的代码中,Viterbi 算法用于在给定模型的情况下找到最可能的隐藏状态序列。

 c("Fd", "La")\[mastch(namdes(casasinao), c("Fsair", "Loasadded"))\]

### 找到预测路径

viat1 <- Vitedsbi(xasd)

预测 <- c("Fa", "aL")\[vist1$dpaath + 1\]

### 注意输出维特比对象的路径元素是一个整数向量

将预测路径与实际隐藏序列进行比较,Viterbi 算法并不遥远:


Python用时变马尔可夫区制转换(Markov regime switching)自回归模型分析经济时间序列

阅读文章


我们还可以使用 forward 和/或 backward 算法计算给定模型的序列的完整概率和后验概率:

casasino.dspost <asd- posterassdior(xa, asdcasino)

plot(1:300, saseq(0, 1, lasdength.ouast = 300)


随时关注您喜欢的主题


图 2:300 次掷骰子的后验状态概率。

 这条线显示了骰子在每次掷骰时都是公平的后验概率,而灰色矩形显示了使用加载骰子的实际周期。有关详细信息,请参见 Durbin 等人 (1998) 第 3.2 章。

从序列数据中导出 HMM

从一组训练序列构建HMM 。

以下代码从我们的单个掷骰子序列及其已知状态路径(存储为序列的“名称”属性)中派生出一个简单的 HMM。

yajd <- dergsiveHMhM(lissffgtd(cadsfihnos), logshasdpfgace = FALSE)

plosgt(y, teagghxteasfdxp = 1.5)



### 可选择将转换概率添加为文本

tedhsaxt(xda = 0.02, yad = 0.5, ladbelass = roasdund(ya$Aa\["Fasir", "Fadir"\], 2))

如图 所示,转换概率显示为加权线,发射概率显示为水平灰色条。

图 3:从 300 次掷骰子序列派生的简单 HMM。 

尽管训练数据仅由一个序列组成,但这似乎与实际模型相当接近。人们通常会从许多此类序列的列表中导出 HMM(因此输入参数是列表而不是向量的原因),但为清楚起见,此示例已简化。

HMM隐马尔可夫模型

Profile HMM马尔可夫模型是标准 HMM 的扩展,其中转移概率是 _特定于位置的_。也就是说,它们可以在序列中的每个点发生变化。这些模型通常比其简单的 HMM 模型具有更多的参数,但对于序列分析可能非常强大。Profile HMM 的前身通常是多序列比对。

图 4 将上面列出的三种状态类型分别显示为圆形、菱形和矩形。这些状态由图中的加权线所示的转移概率链接。

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

data(gloasdbins)

gldobinasds

位置特定模式包括在位置 1 观察到“V”和在位置 3 观察到“A”或“G”的高概率。

以下代码从 globin 数据派生出 HMM 轮廓并绘制模型:

glsosdbgnss.PsdHMMf <- divfgsesPHMM(glns, resiufes = "AMaIsdfNO", pdfntss = "Laplsaace")

图 4:源自部分珠蛋白序列比对的轮廓 HMM。 

匹配状态显示为矩形,插入状态显示为菱形,删除状态显示为圆形。灰色水平条表示模型中每个位置的字母表(在本例中为氨基酸字母表)中每个残基的发射概率。删除状态中的数字只是模型模块编号,而插入状态中的数字是在下一个发射周期保持在当前插入状态的概率。在必要时对线进行加权和定向,以反映状态之间的转换概率。大的“B”和“E”标签分别代表静默开始和结束状态。

我们可以通过计算该序列在模型中的最优路径来证明这一点,同样使用维特比算法:

padaath <- Vitferbi(glsdosbinsd.PsHMM, glodbdins\["GsLB1d_GLYsDI", \])$patdh

pdatsh

Viterbi 对象的“路径”元素是一个整数向量,其元素取值为 0(“删除”)、1(“匹配”)或 2(“插入”)。路径可以更直观地表示为字符而不是索引,如下所示:

c("D", "M", "I")\[pgatsh + 1\]

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

序列模拟

为了模拟随机变化的数据。例如,以下代码模拟了来自小珠蛋白 HMM 的 10 个随机序列的列表:

siasdm <- ldist(lfenhgsth = 10)

suppressWarffnings(RNGvghjerhhjion("3.5.0"))

k

for(i in 1:10) shim\[\[i\]\] <- genkerate(globihhgkjknks.PHhMM, size = 20)

sihmg

模型训练

使用 Baum Welch 或 Viterbi 训练算法优化模型参数train两者都是迭代细化算法;前者不依赖于多序列比对,但通常比后者慢得多。通过指定并行处理的“cores”参数,可以进一步加快 Viterbi 训练操作。训练算法的最佳选择通常取决于问题的性质和可用的计算资源。

以下代码使用 Baum Welch 算法在上一步中模拟的序列训练小珠蛋白轮廓 HMM。

glosf.sdPHjMlM <- trdaisn(glogbfhhjins.PHMM, sigm, metjghodh= "BaughmghWelch", 

                       dk'lelt;aLL = 0.01, sejqweig;lhklkjts = NULL)

该操作需要 7 次期望最大化迭代才能收敛到指定的 delta 对数似然阈值 0.01。

序列比对

使用上述 迭代模型训练方法,可以生成高质量的多序列比对。然后以通常的方式将序列与模型对齐以产生对齐。

在最后一个示例中,我们将解构原始珠蛋白对齐并使用原始 PHMM 作为指导重新对齐序列。

globdins <- unaffalign(globgsins)

align(globinjjs, model = globinhs.PHsgMM, seqwjeighjts = NULL, resjidues = "AMINO")

请注意,列名显示了沿模型的渐进位置,以及预测插入状态已发出残基的位置(例如序列 7 的第 4 和第 5 个残基)。

参考

德宾、理查德、肖恩·埃迪、安德斯·克罗和格雷姆·米奇森。1998. _生物序列分析:蛋白质和核酸的概率模型_。剑桥:剑桥大学出版社。


可下载资源

关于作者

Kaizong Ye拓端研究室(TRL)的研究员。

本文借鉴了作者最近为《R语言数据分析挖掘必知必会 》课堂做的准备。

​非常感谢您阅读本文,如需帮助请联系我们!

 
QQ在线咨询
售前咨询热线
15121130882
售后咨询热线
0571-63341498

关注有关新文章的微信公众号


永远不要错过任何见解。当新文章发表时,我们会通过微信公众号向您推送。

技术干货

最新洞察

This will close in 0 seconds