【转录因子结合位点预测-1】基于信念传播的kmerHMM模型(文献复现)

本文主要是介绍【转录因子结合位点预测-1】基于信念传播的kmerHMM模型(文献复现),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

文章目录

    • 一、简介
    • 二、文献来源
    • 三、文献工作流程梳理以及本文复现目标
    • 四、文献复现
      • 4.1 数据下载
      • 4.2 kmer的生成与过滤
      • 4.3 多序列比对
      • 4.4 序列编码与建模
      • 4.5 模型验证
    • 五、复现效果评估与优化方向

一、简介

在转录组学数据挖掘中,转录因子结合位点预测算是比较重要的一个研究方向。在这个专栏中,我们将从2013年的一篇文献开始,逐渐了解在转录因子结合位点预测方向的一些工作。

本文基于2013年在Nucleic Acids Research上发表的文献《基于信念传播的DNA模体解析》,通过下载相应的数据集进行文献复现,体会隐马尔可夫模型(HMM)在生物信息学中的作用。

值得注意的是,由于文章没有提供源码,并且文献不会告诉你全部的细节。于是,本文仅仅下载了一个数据集并且对文章的部分流程进行复现。不过,通过这种方式依然能够对该文献的工作有一定的了解。

二、文献来源

  • Ka-Chun Wong and others, DNA motif elucidation using belief propagation, Nucleic Acids Research, Volume 41, Issue 16, 1 September 2013, Page e153.
  • https://doi.org/10.1093/nar/gkt574

三、文献工作流程梳理以及本文复现目标

文献已经提供了Workflow,如下图所示:

Workflow
首先,对数据源进行解读:

  1. 文献是基于PBM数据来分析的。PBMProtein Binding Microarray,是一种类似DNA microarray的实验技术,与DNA microarray不同,PBM是研究蛋白和核酸探针的结合情况的,从而能够进一步探讨蛋白与序列结合的情况。如果使用的蛋白是转录因子,那么这个实验就是研究转录因子结合位点(一段序列)的,这一段序列就是“基序(Motif)”的一种。
  2. 文献首先基于PBM数据,该数据的组成有两列:第一列是核酸探针(包含引物序列)的序列情况,第二列是该探针所表现的信号强度(归一化后)。下图展示了一个数据集的情况:

在这里插入图片描述

接下来,对Workflow进行一些解读:

  1. 文献第一步,以长度为 k k k的窗口依次读取探针序列,如果探针的总长度为 L L L,那么对于每一个探针来说,就会生成 L − k + 1 L-k+1 Lk+1个“窗口”,即kmer。位于同一条探针上的kmer对应的信号强度应当相同。

  2. 文献第二步,由于不同的探针有可能产生相同的kmer,于是将相同kmer的不同信号强度放在一起。

  3. 文献第三步,在上一步汇总完成后,对于每一个kmer的一组信号强度,取其中位数的信号强度作为该kmer的信号强度。(第三步图中未体现,正文中提及)

  4. 文献第四步,在进行比对之前,先对kmer进行过滤。设样本的信号强度序列 { I 1 , I 2 , . . , I m } \{I_1,I_2,..,I_m\} {I1,I2,..,Im}的中位数为 m e d med med,中位数绝对偏差(MAD)为 m a d mad mad,那么对于每个kmer的信号强度 I k m e r I_{kmer} Ikmer,我们只保留这样的kmer:
    I k m e r > m e d + 4 ∗ m a d / 0.6745 I_{kmer}>med+4*mad/0.6745 Ikmer>med+4mad/0.6745
    并且称这样的kmer为“正kmer”(Positive kmer)。(第四步图中未体现,正文中提及)

m a d / 0.6745 mad/0.6745 mad/0.6745其实就是对信号强度序列的标准差的估计值。

  1. 文献第五步,对过滤得到的“正kmer”进行多重比对。
  2. 文献第六步,将比对后的结果作为HMM模型的输入,训练出模型的参数 θ \theta θ。文献使用了50个隐变量。
  3. 文献第七步(a),将训练好的模型进行验证。验证方法是,对新数据的每一条探针,生成 L − k + 1 L-k+1 Lk+1个长度为 k k k的kmer,使用模型预测生成每个kmer的概率,取最大的概率作为该条探针对转录因子的偏好性。最后,检验探针的偏好性与其信号强度的Spearman相关系数,就可以反映模型的有效性。
  4. 文献第七步(b),使用N-Max-Product算法找出最有可能的 N N N条隐状态路径,并输出对应的观测序列,作为对转录因子结合位点基序的预测。

本文的复现目标:基于转录因子Zif268PBM实验数据,使用Python实现上述第1~7(a)步的任务。

至于为什么不复现7(b)步,是因为发现复现效果与文献有较大出入,所以在此也不做展示。

四、文献复现

4.1 数据下载

本文主要基于转录因子Zif268PBM实验数据,可在Uniprobe上下载。

Zif268数据介绍(点击访问)

Zif268数据下载界面(点击访问)

下载得到一个zip文件,解压后找到里面的Zif268_deBruijn_v1.txtZif268_deBruijn_v2.txt,这两个文件就是我们需要处理的文件了,分别将其命名为Zif268_1.txtZif268_2.txt。我们将会以1号文件为训练集进行模型参数训练,并使用2号文件作为模型的验证数据集。

首先,我们需要导入相关的包:

import pandas as pd
import numpy as np
from hmmlearn import hmm
import matplotlib.pyplot as plt

接着,使用pandas包读入文件:

def read_file(path: str):"""读取文件生成Dataframe并预处理path: PBM文件路径"""f = pd.read_csv(path, sep="\t")f.columns = ['Seq', 'Intensity']f['Seq'] = f['Seq'].str.strip()f['Intensity'] = pd.to_numeric(f['Intensity'], errors='coerce')return f
f1 = read_file("Zif268_1.txt")
f2 = read_file("Zif268_2.txt")

这就完成了数据准备工作。

4.2 kmer的生成与过滤

接下来,我们需要对数据f1进行kmer的提取和过滤。

首先,我们定义探针长度为35(建模时不需要引物序列),kmer长度为8:

kmer_len = 8
probe_len = 35

之后依次读取kmer,并收集其对应的信号强度。收集完毕后,取中值作为该kmer的信号强度:

def probe2kmer(data: pd.DataFrame):"""将探针数据转换成kmerdata: 原始数据, 使用pandas数据框读取k: kmer的长度probe_len: 探针的长度"""# 生成kmer字典kmer_dict = {}for row in range(len(data)):seq = data['Seq'][row]val = data['Intensity'][row]if val != float("nan"):j = kmer_lenwhile j <= probe_len:kmer = seq[j-kmer_len:j]if kmer not in kmer_dict.keys():kmer_dict[kmer] = []kmer_dict[kmer].append(float(val))j += 1# 取信号中值for key, value in kmer_dict.items():kmer_dict[key] = np.median(value)return kmer_dict
kmer_dict = probe2kmer(f1)

值得注意的是,原数据里面有部分探针的信号强度为空,在上一步载入数据时,已经将其转化为nan了。遇到这种探针,本文的处理是将其抛弃,只保留有数值的kmer。

上述程序运行完毕后,我们就得到了kmer字典,其key为kmer序列,value为对应的信号强度。这一步获得的kmer数量是65536个。

接下来,我们需要过滤获得“正kmer”。在此之前,我们设计一个函数,用于获取数据框中某一列的中位数和MAD值:

def get_param(data: pd.DataFrame, name: str):"""返回数据框某一列的中位数及其中位数绝对偏差data: 原始数据的数据框name: 列名"""median_val = data[name].median()mad_val = (data[name] - data[name].median()).abs().median()return median_val, mad_val

这样就可以根据筛选规则来筛选“正kmer”了:

def pos_kmer(kmer_dict: dict, med: float, mad: float):"""kmer过滤为正kmerkmer_dict: kmer字典med: 所有信号的中位数mad: 所有信号的中位数绝对偏差"""kmer_pos = []for key, value in kmer_dict.items():if value > med+4*mad/0.6745:kmer_pos.append(key)return kmer_pos
med, mad = get_param(f1, "Intensity")
kmer_pos = pos_kmer(kmer_dict, med, mad)

最终我们获得了一个“正kmer”的列表,共计444个。

4.3 多序列比对

获得“正kmer”后,就需要进行多序列比对了。这里笔者并不打算使用Python接口去调用比对程序,而是将kmer列表输出后,手动去网站比对:

def output(data: list):"""将过滤的kmer列表输出为fasta"""f = open("./kmer.fasta", "w")n = 1for i in data:f.write(">Seq%d\n%s\n"%(n, i))n += 1f.close()
output(kmer_pos)

在这里插入图片描述

获得输出的fasta文件后,笔者使用ClustalOmega网站进行了多序列比对。

Clustal Omega (点击访问)

在比对时选择DNA序列,传入生成的fasta文件,其他参数保持默认,提交。获得比对文件后下载,命名为alignment.txt

在这里插入图片描述

  1. 对于文件后面的“8”,笔者认为可能是我提交的kmer的长度;
  2. 对于上述比对过程,可以使用biopython库里的接口完成,这里不阐述。

4.4 序列编码与建模

获得多重比对后,我们读取保留中间的序列部分,准备开始建立模型了:

align = open("alignment.txt").readlines()
align = [i.split("\t")[0].split(" ")[-1] for i in align]

读取时注意去掉标题和空行,只保留比对数据本身。

由于本次模型是离散型的隐马尔可夫模型,所以首先要对序列中出现的字符进行编码:

def labelencode(kmer_list: list):"""将kmer序列编码kmer_list: 由kmer组成的列表"""label = {'-': 0, 'A': 1, 'G': 2, 'C': 3, 'T': 4}obseq = []for i in kmer_list:seq = [label[j] for j in list(i)]obseq.append(seq)return np.array(obseq)
x = labelencode(align)

在这里插入图片描述

对于每一个kmer,我们生成对应的编码,并且需要转化为np.array的数据类型。

接下来就可以开始建模了。对于离散型的HMM模型,我们使用hmmlearn中的CategoricalHMM()函数进行建模,设定隐状态数量为50个(与文献一致),迭代次数为20次。

# 训练
model = hmm.CategoricalHMM(n_components=50, n_iter=20)
model.fit(x)

由于隐状态数量较多,所以训练耗时在13秒左右。

4.5 模型验证

已经获得模型了,接下来就使用f2数据集进行验证。

首先,我们需要计算每一条序列的偏好性:

def prefer_test(data: pd.DataFrame, model: hmm.CategoricalHMM):"""准备偏好测试data: 用于测试的原始数据model: 拟合的模型"""prob_list = []val_list = []n = 0for i in list(data['Seq']):kmer_list = [i[j:j+kmer_len] for j in range(probe_len-kmer_len+1)]temp_prob = [np.exp(model.score(labelencode([i]))) for i in kmer_list]temp_prob = [i for i in temp_prob if not np.isnan(i)]temp_prob.append(0)prob_list.append(max(temp_prob))if not np.isnan(data['Intensity'][n]):val_list.append(data['Intensity'][n])else:val_list.append(0)n += 1return prob_list, val_list
prob_list, val_list = prefer_test(f2, model)

代码中kmer_list用于存储每一条探针的所有kmer,并使用model.score()方法对每一条kmer打分。由于可能存在nan,所以我们只保留非nan的部分。同样地,对于不存在信号强度值的点,我们插入值0。

为了保证一条探针的偏好性存在,笔者特意为temp_prob变量添加了0元素,防止temp_prob被过滤后出现空集的现象,否则无法计算max

值得注意的是,由于数据量较大,上述代码会运行6分钟左右不等,这也是值得优化的地方。

获得每一条探针的偏好性列表prob_list和对应的信号强度列表val_list后,我们就可以计算其Spearman相关系数并画图了。相关系数的计算直接采用数据框的corr方法,可视化以散点图为载体:

def corr_plot(x: list, y: list):"""计算相关性并画图"""# 相关性result = pd.DataFrame({'Probability':x,'Intensity':y})result = result.corr(method='spearman')coef = result['Probability'][1]# 散点图fig, ax = plt.subplots()ax.spines['right'].set_visible(False)ax.spines['top'].set_visible(False)plt.scatter(x, y, c=y, cmap='plasma', s=10)plt.xlabel("Binding Preference")plt.ylabel("Probe Intensity")plt.title("Scatter Plot")plt.text(2.5e-9, 60000, "Spearman Correlation = %.3f"%coef)plt.show()
corr_plot(prob_list, val_list)

在这里插入图片描述

可以看到,偏好性值与信号强度的Spearman相关性值为0.255,而文献中给出的相关性值为0.336,复现效果还是将就的。

五、复现效果评估与优化方向

复现效果评估:本文对验证集的复现效果还是不错的,在没有得到文章实现细节的情况下,仍然能够达到一个可观的效果;同时,这也反映了隐马尔可夫模型在处理多模态序列识别方面是具有优势的。

优化方向:

  1. HMM模型的训练次数可以增加,并且可以增加交叉验证的内容;
  2. 缺乏了N-Max-Product算法的实现;
  3. 划分单个kmer的方法会忽略序列上下文信息,这是该模型的限制。后续如果能够提高k值,并且借助ChIP-seqNGS数据进行分析,也许会有更进一步地效果。

这篇关于【转录因子结合位点预测-1】基于信念传播的kmerHMM模型(文献复现)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/188097

相关文章

Golang的CSP模型简介(最新推荐)

《Golang的CSP模型简介(最新推荐)》Golang采用了CSP(CommunicatingSequentialProcesses,通信顺序进程)并发模型,通过goroutine和channe... 目录前言一、介绍1. 什么是 CSP 模型2. Goroutine3. Channel4. Channe

Python结合requests和Cheerio处理网页内容的操作步骤

《Python结合requests和Cheerio处理网页内容的操作步骤》Python因其简洁明了的语法和强大的库支持,成为了编写爬虫程序的首选语言之一,requests库是Python中用于发送HT... 目录一、前言二、环境搭建三、requests库的基本使用四、Cheerio库的基本使用五、结合req

如何用Java结合经纬度位置计算目标点的日出日落时间详解

《如何用Java结合经纬度位置计算目标点的日出日落时间详解》这篇文章主详细讲解了如何基于目标点的经纬度计算日出日落时间,提供了在线API和Java库两种计算方法,并通过实际案例展示了其应用,需要的朋友... 目录前言一、应用示例1、天安门升旗时间2、湖南省日出日落信息二、Java日出日落计算1、在线API2

Python基于火山引擎豆包大模型搭建QQ机器人详细教程(2024年最新)

《Python基于火山引擎豆包大模型搭建QQ机器人详细教程(2024年最新)》:本文主要介绍Python基于火山引擎豆包大模型搭建QQ机器人详细的相关资料,包括开通模型、配置APIKEY鉴权和SD... 目录豆包大模型概述开通模型付费安装 SDK 环境配置 API KEY 鉴权Ark 模型接口Prompt

大模型研发全揭秘:客服工单数据标注的完整攻略

在人工智能(AI)领域,数据标注是模型训练过程中至关重要的一步。无论你是新手还是有经验的从业者,掌握数据标注的技术细节和常见问题的解决方案都能为你的AI项目增添不少价值。在电信运营商的客服系统中,工单数据是客户问题和解决方案的重要记录。通过对这些工单数据进行有效标注,不仅能够帮助提升客服自动化系统的智能化水平,还能优化客户服务流程,提高客户满意度。本文将详细介绍如何在电信运营商客服工单的背景下进行

Andrej Karpathy最新采访:认知核心模型10亿参数就够了,AI会打破教育不公的僵局

夕小瑶科技说 原创  作者 | 海野 AI圈子的红人,AI大神Andrej Karpathy,曾是OpenAI联合创始人之一,特斯拉AI总监。上一次的动态是官宣创办一家名为 Eureka Labs 的人工智能+教育公司 ,宣布将长期致力于AI原生教育。 近日,Andrej Karpathy接受了No Priors(投资博客)的采访,与硅谷知名投资人 Sara Guo 和 Elad G

Retrieval-based-Voice-Conversion-WebUI模型构建指南

一、模型介绍 Retrieval-based-Voice-Conversion-WebUI(简称 RVC)模型是一个基于 VITS(Variational Inference with adversarial learning for end-to-end Text-to-Speech)的简单易用的语音转换框架。 具有以下特点 简单易用:RVC 模型通过简单易用的网页界面,使得用户无需深入了

透彻!驯服大型语言模型(LLMs)的五种方法,及具体方法选择思路

引言 随着时间的发展,大型语言模型不再停留在演示阶段而是逐步面向生产系统的应用,随着人们期望的不断增加,目标也发生了巨大的变化。在短短的几个月的时间里,人们对大模型的认识已经从对其zero-shot能力感到惊讶,转变为考虑改进模型质量、提高模型可用性。 「大语言模型(LLMs)其实就是利用高容量的模型架构(例如Transformer)对海量的、多种多样的数据分布进行建模得到,它包含了大量的先验

图神经网络模型介绍(1)

我们将图神经网络分为基于谱域的模型和基于空域的模型,并按照发展顺序详解每个类别中的重要模型。 1.1基于谱域的图神经网络         谱域上的图卷积在图学习迈向深度学习的发展历程中起到了关键的作用。本节主要介绍三个具有代表性的谱域图神经网络:谱图卷积网络、切比雪夫网络和图卷积网络。 (1)谱图卷积网络 卷积定理:函数卷积的傅里叶变换是函数傅里叶变换的乘积,即F{f*g}

秋招最新大模型算法面试,熬夜都要肝完它

💥大家在面试大模型LLM这个板块的时候,不知道面试完会不会复盘、总结,做笔记的习惯,这份大模型算法岗面试八股笔记也帮助不少人拿到过offer ✨对于面试大模型算法工程师会有一定的帮助,都附有完整答案,熬夜也要看完,祝大家一臂之力 这份《大模型算法工程师面试题》已经上传CSDN,还有完整版的大模型 AI 学习资料,朋友们如果需要可以微信扫描下方CSDN官方认证二维码免费领取【保证100%免费