使用EVOLVEpro对蛋白质热稳定性进行定向进化

news/2024/11/30 0:30:13/文章来源:https://www.cnblogs.com/crazypigf/p/18569065

对EVOLVEpro还不熟的读者可以查看之前的博客:Rapid in silico directed evolution by a protein language model with EVOLVEpro 文献解读。

本文通过Kaggle竞赛中提供的酶热稳定性数据集对EVOLVEpro的性能进行验证。

数据集为test.csv和test_labels.csv,这是经过实验测量的某种酶的各个突变体的tm值。


野生型的酶序列

VPVNPEPDATSVENVALKTGSGDSQSDPIKADLEVKGQSALPFDVDCWAILCKGAPNVLQRVNEKTKNSNRDRSGANKGPFKDPQKWGIKALPPKNPSWSAQDFKSPEEYAFASSLQGGTNAILAPVNLASQNSQGGVLNGFYSANKVAQFDPSKPQQTKGTWFQITKFTGAAGPYCKALGSNDKSVCDKNKNIAGDWGFDPAKWAYQYDEKNNKFNYVGK

生成突变体文库,生成的突变体文库的大小为4200

from evolvepro.src.process import generate_wt, generate_single_aa_mutants
generate_wt('VPVNPEPDATSVENVALKTGSGDSQSDPIKADLEVKGQSALPFDVDCWAILCKGAPNVLQRVNEKTKNSNRDRSGANKGPFKDPQKWGIKALPPKNPSWSAQDFKSPEEYAFASSLQGGTNAILAPVNLASQNSQGGVLNGFYSANKVAQFDPSKPQQTKGTWFQITKFTGAAGPYCKALGSNDKSVCDKNKNIAGDWGFDPAKWAYQYDEKNNKFNYVGK', output_file='output/kaggle_WT.fasta')
generate_single_aa_mutants('output/kaggle_WT.fasta', output_file='output/kaggle.fasta')

构建突变图文库序列的embedding,PLM使用esm1b_t33_650M_UR50S

python evolvepro/plm/esm/extract.py esm1b_t33_650M_UR50S output/kaggle.fasta output/kaggle_esm1b_t33_650M_UR50S --toks_per_batch 512 --include mean --concatenate_dir output

随机选择12个突变体,作为第一轮进化的训练集

从kaggle test.csv和test_labels.csv找出相应的实验测量数据,其中有3个突变体没有找到相应的实验测量值,所以第一轮训练集数据大小为9.

from evolvepro.src.process import suggest_initial_mutants
suggest_initial_mutants('output/kaggle.fasta', num_mutants=12, random_seed=42)
suggest = ["L92R","L116N","A91W","Y176N","A16Q","P97Q","K212H","T19K","P175K","A130I","A55E","I123A",
]
import pandas as pddef mutation(seq):for i in range(len(seq)):if seq[i] != WT[i]:return WT[i] + str(i+1) + seq[i]WT = 'VPVNPEPDATSVENVALKTGSGDSQSDPIKADLEVKGQSALPFDVDCWAILCKGAPNVLQRVNEKTKNSNRDRSGANKGPFKDPQKWGIKALPPKNPSWSAQDFKSPEEYAFASSLQGGTNAILAPVNLASQNSQGGVLNGFYSANKVAQFDPSKPQQTKGTWFQITKFTGAAGPYCKALGSNDKSVCDKNKNIAGDWGFDPAKWAYQYDEKNNKFNYVGK'test = pd.read_csv('test.csv', index_col=0)
test_labels = pd.read_csv('test_labels.csv', index_col=0)df = pd.concat([test, test_labels], axis=1)[['protein_sequence', 'tm']]
df['length'] = df.apply(lambda x: len(x['protein_sequence']), axis=1)
df = df.loc[df['length'] == 221, ['protein_sequence', 'tm']]
df['mutation'] = df.apply(lambda x: mutation(x['protein_sequence']), axis=1)
df = df.loc[df['mutation'].isin(suggest), :]
df['Variant'] = df.apply(lambda x: x['mutation'][1:], axis=1)
df = df[['Variant', 'tm']]
df.columns = ['Variant', 'activity']
df.to_excel('kaggle/Round1.xlsx', index=False)

进行第一轮定向进化

from evolvepro.src.evolve import evolve_experimentalprotein_name = 'kaggle'
embeddings_base_path = 'output'
embeddings_file_name = 'kaggle_esm1b_t33_650M_UR50S.csv'
round_base_path = 'kaggle'
wt_fasta_path = "output/kaggle_WT.fasta"
number_of_variants = 12
output_dir = 'output'
rename_WT = Falseround_name = 'Round1'
round_file_names = ['Round1.xlsx']this_round_variants, df_test, df_sorted_all = evolve_experimental(protein_name,round_name,embeddings_base_path,embeddings_file_name,round_base_path,round_file_names,wt_fasta_path,rename_WT,number_of_variants,output_dir
)

选择预测值最高的12个突变体,进行第二轮进化

从kaggle test.csv和test_labels.csv找出相应的实验测量数据,其中有5个突变体没有找到相应的实验测量值,所以第二轮训练集数据大小为9 + 7.

P94Q
P93S
P42Y
G88M
N133H
K78H
P80H
V45H
Q158M
D32I
N77H
G118K

选择预测值最高的12个突变体,进行第三轮进化

从kaggle test.csv和test_labels.csv找出相应的实验测量数据,其中有2个突变体没有找到相应的实验测量值,所以第三轮训练集数据大小为9 + 7 + 10.

Q150M
A125M
Q117D
F164W
N140Q
N14Q
P93M
T159F
S115D
F112W
N214Q
K160H

选择预测值最高的12个突变体,进行第四轮进化

从kaggle test.csv和test_labels.csv找出相应的实验测量数据,其中有7个突变体没有找到相应的实验测量值,所以第四轮训练集数据大小为9 + 7 + 10 + 5.

Q158I
A55Q
N14K
P153W
A113T
Q158V
E211W
P107Q
Q150G
F81W
D201Q
D197M

选择预测值最高的12个突变体,进行第五轮进化

从kaggle test.csv和test_labels.csv找出相应的实验测量数据,其中有5个突变体没有找到相应的实验测量值,所以第四轮训练集数据大小为9 + 7 + 10 + 5 + 8.

K192Q
A55Q
D197A
P202Q
S115N
G37H
K178H
N193V
K192M
Q158L
A111H
I123H

最终我们分别选取模型预测和数据集中排名前100,50,10的的突变体,查看它们之间的交集

import pandas as pddef mutation(seq):for i in range(len(seq)):if seq[i] != WT[i]:return WT[i] + str(i+1) + seq[i]WT = 'VPVNPEPDATSVENVALKTGSGDSQSDPIKADLEVKGQSALPFDVDCWAILCKGAPNVLQRVNEKTKNSNRDRSGANKGPFKDPQKWGIKALPPKNPSWSAQDFKSPEEYAFASSLQGGTNAILAPVNLASQNSQGGVLNGFYSANKVAQFDPSKPQQTKGTWFQITKFTGAAGPYCKALGSNDKSVCDKNKNIAGDWGFDPAKWAYQYDEKNNKFNYVGK'pre_df = pd.read_csv('output/kaggle/Round5/df_sorted_all.csv', index_col=0)
test = pd.read_csv('test.csv', index_col=0)
test_labels = pd.read_csv('test_labels.csv', index_col=0)df = pd.concat([test, test_labels], axis=1)[['protein_sequence', 'tm']]
df['length'] = df.apply(lambda x: len(x['protein_sequence']), axis=1)
df = df.loc[df['length'] == 221, ['protein_sequence', 'tm']]
df['mutation'] = df.apply(lambda x: mutation(x['protein_sequence']), axis=1)
df = df.sort_values(by='tm', ascending=False)pre_100 = set(pre_df['variant'][:100])
real_100 = set(df['mutation'][:100])
print("top100的交集大小:", len(pre_100 & real_100))pre_50 = set(pre_df['variant'][:50])
real_50 = set(df['mutation'][:50])
print("top50的交集大小:", len(pre_50 & real_50))pre_10 = set(pre_df['variant'][:10])
real_10 = set(df['mutation'][:10])
print("top10的交集大小:", len(pre_10 & real_10))

top100的交集大小: 3
top50的交集大小: 2
top10的交集大小: 1

值得一提的是,实验中测定的tm值最高的突变体F112W正是模型预测的tm值最高的突变体,这表明EVOLVEpro对定向进化湿实验中具有一定的指导意义。

不过也可以看到,通过5轮进化,构建的训练集大小为9 + 7 + 10 + 5 + 8=39,在tm值top100,top50和top10预测中并没有太高的命中率。

在未来可以通过结合蛋白质结构的embedding或者更有效的隐变量表示方法,使得EVOLVEpro在定向进化中可以发挥更强大的能力。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/841101.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

计算机概念——io 复用

前言 首先什么是io复用呢? 现在web框架没有不用到io复用的,这点是肯定的,不然并发真的很差。 那么io复用,复用的是什么呢?复用的真的不是io管道啥的,也不是io连接啥的,复用的是io线程。 这其实是操作系统的设计上的io并发不足的地方,然后自己给慢慢填了。 正文 听一段历…

java学习11.25

写了很久的这个差费报销系统,写的太慢了,一半不到,结构上也非常臃肿。

HTML中实现多选一且输入框的启用与禁用

其他类别内容:<script>// 控制"其他类别内容"输入框的启用与禁用function toggleTypeContent() {var typeContentInput = document.getElementById("typecontent");var otherRadio = document.getElementById("other");// 如果选中了&quo…

Pwn 乱刷合集

持续更新中3※ [SHCTF 2024] No stack overflow2考点:ret2libc,libc 库查询,整数溢出在 linux 下使用 checksec 查看该程序开启的保护,发现 Arch 为 amd64-64-little,这说明这是一个 64位 的程序,并且采用了 小端 存储,即低位对应低地址,高位对应高地址。下方的 RELRO …

MySQL原理简介—7.redo日志的底层原理

大纲 1.redo日志对事务提交后数据不丢失的意义 2.redo日志文件的构成 3.redo日志会写入到Redo Log Blcok中 4.redo日志如何写入到Redo Log Blcok中 5.Redo Log Buffer解析 6.Redo Log Buffer的刷盘时机 7.undo log回滚日志原理1.redo日志对事务提交后数据不丢失的意义 (1)redo …

MySQL原理简介—8.MySQL并发事务处理

大纲 1.简单总结增删改SQL语句的实现原理 2.多个事务同时执行的场景遇到的问题 3.多个事务并发更新或查询时可能出现的问题 4.SQL标准中对事务的4个隔离级别 5.MySQL是如何支持4种事务隔离级别的 6.Spring事务注解了如何设置隔离级别 7.uodo log多版本链介绍 8.基于undo log多版…

python复习笔记——2024.11.25

2024.11.25 一、类的定义二、类与实例的关系# 定义一个猫类,age, name, color 是属性,或者称为成员变量 class Cat:age=Nonename=Nonecolor=Nonecat1=Cat() #通过对象名.属性名,可以给各个属性赋值 cat1.name="小白" cat2,age=2 cat3.color="白色"print…

Logisim-019-4位先行进位电路

仓库地址 https://gitee.com/gitliang/logisim-to-cpu

Java学习笔记——2024.11.25

2024.11.25 一、Java_DOS原理 1.DOS基本原理 创建文件夹=>md d:\\xxx 消除文件夹=>rd d:\\xxx2.相对路径和绝对路径=>相对路径:从当前目录开始定位,形成的一个路径 =>绝对路径:从顶级目录d,开始定位,形成的路径举例子:相对路径:..\ ..\abc2 \ test200\hello…

Jenkins实现CICD之邮箱告警

作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任。 目录一.Jenkins配置邮箱告警1 安装支持邮件配置的Mailer插件2 配置QQ邮箱3 配置系统管理员邮箱地址4 发送测试邮件二.Jenkins配置钉钉告警 一.Jenkins配置邮箱告警 1 安装支持邮件配置的Mailer插件如上图所示…

MATLAB贝叶斯优化混合Bayes-CNN-RNN分析股票市场数据与浅层网络超参数优化

全文链接:https://tecdat.cn/?p=38354 原文出处:拓端数据部落公众号 本文旨在介绍一种利用贝叶斯优化方法来优化混合 CNN - RNN 和浅层网络超参数的简单方法,并展示了如何使贝叶斯优化器考虑离散值。通过对股票市场数据的模拟与分析,阐述了网络构建、数据预处理、超参数优…