158_mRNA疫苗设计生信¶
一句话概述¶
mRNA疫苗的生物信息学设计涵盖抗原表位预测、密码子优化(提高翻译效率)、5'/3'UTR设计(增强稳定性和翻译)、mRNA二级结构优化(降低最低自由能MFE)以及脂质纳米颗粒(LNP)递送适配等多个环节。
核心知识点总览¶
| 知识点 | 说明 |
|---|---|
| 密码子优化 | 替换同义密码子提高目标宿主的翻译效率 |
| CAI(密码子适应指数) | 衡量密码子使用与宿主偏好的匹配程度 |
| UTR设计 | 5'UTR影响翻译起始,3'UTR影响稳定性 |
| MFE(最低自由能) | mRNA二级结构稳定性指标 |
| GC含量优化 | 影响稳定性、免疫原性和翻译效率 |
| 修饰核苷酸 | N1-methylpseudouridine(m1Ψ)减少固有免疫激活 |
| 抗原表位预测 | T/B细胞表位预测指导抗原序列选择 |
| LinearDesign | 百度开发的mRNA结构-密码子联合优化算法 |
各步骤详解¶
第一步:理解mRNA疫苗结构¶
白话解释: mRNA疫苗就像一张"蓝图"——注入人体后,细胞的核糖体会"阅读"这张蓝图并制造出抗原蛋白(如新冠S蛋白),然后免疫系统识别这个蛋白产生免疫反应。设计mRNA疫苗就是优化这张蓝图——让它容易被阅读(翻译效率高)、不容易被撕毁(稳定性好)、不引发不良反应(免疫原性可控)。
mRNA疫苗结构组成:
| 组件 | 功能 | 优化策略 |
|---|---|---|
| 5' Cap | 保护+翻译起始 | Cap1结构(m7GpppNm) |
| 5'UTR | 翻译效率调控 | 选择高效UTR序列 |
| CDS | 编码抗原蛋白 | 密码子优化+结构优化 |
| 3'UTR | mRNA稳定性 | 选择已验证的稳定UTR |
| Poly(A) | 稳定性+翻译 | 长度100-150nt |
第二步:抗原序列选择与表位预测¶
代码示例:
# === 抗原选择: 以SARS-CoV-2 Spike蛋白为例 ===
from Bio import SeqIO, Entrez
# 获取参考序列
Entrez.email = "user@example.com"
handle = Entrez.efetch(db="protein", id="YP_009724390.1", rettype="fasta")
spike_protein = SeqIO.read(handle, "fasta")
print(f"Spike protein length: {len(spike_protein.seq)} aa")
# === T细胞表位预测 (使用IEDB API) ===
import requests
def predict_mhc_epitopes(sequence, allele="HLA-A*02:01", length=9):
"""使用IEDB API预测MHC-I表位"""
url = "http://tools-cluster-interface.iedb.org/tools_api/mhci/"
data = {
"method": "recommended",
"sequence_text": str(sequence),
"allele": allele,
"length": str(length)
}
response = requests.post(url, data=data)
return response.text
# 预测HLA-A*02:01限制性9-mer表位
epitopes = predict_mhc_epitopes(spike_protein.seq[:200])
# === B细胞表位预测 ===
def predict_bcell_epitopes(sequence):
"""使用IEDB B细胞表位预测"""
url = "http://tools-cluster-interface.iedb.org/tools_api/bcell/"
data = {
"method": "Bepipred",
"sequence_text": str(sequence),
"window_size": "9"
}
response = requests.post(url, data=data)
return response.text
bcell_results = predict_bcell_epitopes(spike_protein.seq)
# === 抗原性预测 (VaxiJen) ===
# 使用VaxiJen server或本地实现
# http://www.ddg-pharmfac.net/vaxijen/VaxiJen/VaxiJen.html
第三步:密码子优化¶
白话解释: 同一个氨基酸可以由多个不同的密码子编码(同义密码子)。不同物种对密码子有"偏好"——人类细胞喜欢用的密码子和大肠杆菌不一样。把mRNA中的密码子换成人类细胞偏好的,翻译速度就更快。
代码示例:
# === 密码子优化 ===
from python_codon_tables import get_codons_table
import random
# 人类密码子使用频率
human_codon_freq = {
'F': {'TTT': 0.45, 'TTC': 0.55},
'L': {'TTA': 0.07, 'TTG': 0.13, 'CTT': 0.13, 'CTC': 0.20, 'CTA': 0.07, 'CTG': 0.41},
'I': {'ATT': 0.36, 'ATC': 0.48, 'ATA': 0.16},
'V': {'GTT': 0.18, 'GTC': 0.24, 'GTA': 0.11, 'GTG': 0.47},
'S': {'TCT': 0.15, 'TCC': 0.22, 'TCA': 0.12, 'TCG': 0.06, 'AGT': 0.15, 'AGC': 0.24},
'P': {'CCT': 0.28, 'CCC': 0.33, 'CCA': 0.27, 'CCG': 0.11},
'T': {'ACT': 0.24, 'ACC': 0.36, 'ACA': 0.28, 'ACG': 0.12},
'A': {'GCT': 0.26, 'GCC': 0.40, 'GCA': 0.23, 'GCG': 0.11},
'Y': {'TAT': 0.43, 'TAC': 0.57},
'*': {'TAA': 0.28, 'TAG': 0.20, 'TGA': 0.52},
'H': {'CAT': 0.41, 'CAC': 0.59},
'Q': {'CAA': 0.25, 'CAG': 0.75},
'N': {'AAT': 0.46, 'AAC': 0.54},
'K': {'AAA': 0.42, 'AAG': 0.58},
'D': {'GAT': 0.46, 'GAC': 0.54},
'E': {'GAA': 0.42, 'GAG': 0.58},
'C': {'TGT': 0.45, 'TGC': 0.55},
'W': {'TGG': 1.0},
'R': {'CGT': 0.08, 'CGC': 0.19, 'CGA': 0.11, 'CGG': 0.21, 'AGA': 0.20, 'AGG': 0.20},
'G': {'GGT': 0.16, 'GGC': 0.34, 'GGA': 0.25, 'GGG': 0.25},
'M': {'ATG': 1.0},
}
def optimize_codons(protein_seq, codon_table, strategy='weighted'):
"""密码子优化"""
optimized_dna = []
for aa in protein_seq:
if aa in codon_table:
codons = codon_table[aa]
if strategy == 'most_frequent':
# 总是用最高频密码子
best_codon = max(codons, key=codons.get)
optimized_dna.append(best_codon)
elif strategy == 'weighted':
# 按频率随机选择(保持多样性,避免极端GC含量)
codon_list = list(codons.keys())
weights = list(codons.values())
chosen = random.choices(codon_list, weights=weights, k=1)[0]
optimized_dna.append(chosen)
return ''.join(optimized_dna)
# 优化Spike蛋白CDS
protein_seq = str(spike_protein.seq)
optimized_cds = optimize_codons(protein_seq, human_codon_freq, strategy='weighted')
# 计算CAI (Codon Adaptation Index)
def calculate_cai(dna_seq, codon_table):
"""计算密码子适应指数"""
from math import log, exp
cai_values = []
for i in range(0, len(dna_seq) - 2, 3):
codon = dna_seq[i:i+3]
# 找到对应氨基酸
for aa, codons in codon_table.items():
if codon in codons:
max_freq = max(codons.values())
if max_freq > 0:
w = codons[codon] / max_freq
if w > 0:
cai_values.append(log(w))
break
return exp(sum(cai_values) / len(cai_values)) if cai_values else 0
cai = calculate_cai(optimized_cds, human_codon_freq)
print(f"CAI: {cai:.3f}") # 目标: > 0.8
第四步:mRNA二级结构优化¶
白话解释: mRNA会自发折叠成各种"发夹"结构。如果结构太稳定(MFE太低),核糖体难以"打开"它来翻译;如果结构太不稳定,mRNA容易被降解。需要找到平衡点——特别是5'UTR附近要避免强结构(影响翻译起始),而3'UTR可以有适度结构(保护mRNA)。
代码示例:
# === 使用ViennaRNA预测二级结构 ===
import RNA # ViennaRNA Python绑定
# 预测MFE结构
mRNA_sequence = "AUGGCUAACCUGAUAGCUAUAGCUAUAGCU..." # RNA序列
(structure, mfe) = RNA.fold(mRNA_sequence)
print(f"MFE structure: {structure}")
print(f"MFE: {mfe:.2f} kcal/mol")
# === 局部结构分析 (5'UTR区域) ===
# 5'UTR应该尽量无结构(利于核糖体结合)
utr5 = mRNA_sequence[:100] # 前100nt
(utr5_struct, utr5_mfe) = RNA.fold(utr5)
print(f"5'UTR MFE: {utr5_mfe:.2f} kcal/mol")
# 理想: MFE接近0 (无强结构)
# === 滑动窗口MFE分析 ===
window_size = 40
step = 10
mfe_profile = []
for i in range(0, len(mRNA_sequence) - window_size, step):
window = mRNA_sequence[i:i+window_size]
_, w_mfe = RNA.fold(window)
mfe_profile.append((i, w_mfe))
import matplotlib.pyplot as plt
positions, mfes = zip(*mfe_profile)
plt.plot(positions, mfes)
plt.xlabel("Position (nt)")
plt.ylabel("MFE (kcal/mol)")
plt.title("Local MFE Profile")
plt.axhline(y=0, color='r', linestyle='--')
plt.savefig("mfe_profile.png", dpi=150)
# === LinearDesign: 联合优化密码子和结构 ===
# LinearDesign (百度研究院): https://github.com/LinearDesignSoftware/LinearDesign
# 同时优化MFE和CAI的Pareto最优解
# 命令行: ./lineardesign -i protein.fasta -o optimized.fasta --lambda 3
第五步:UTR设计和完整mRNA构建¶
代码示例:
# === 5'UTR候选序列 ===
# 来自高表达基因或已验证的UTR
utr5_candidates = {
"HBB": "ACATTTGCTTCTGACACAACTGTGTTCACTAGCAACCTCAAACAGACACCATG",
"minimal_Kozak": "GCCACCATG", # 最简Kozak序列
"BNT162b2_like": "GAGAATAAACTAGTATTCTTCTGGTCCCCACAGACTCAGAGAGAACCCGCCACCATG",
}
# === 3'UTR候选序列 ===
utr3_candidates = {
"AES_mtRNR1": (
"CTAGGAAAAAAGGCTTAGGCTTTCCTGGAGTCACCATGCTGTCTGTGAAG"
"AAATTGACTTGTCCTCCTCTTCCTGACAGGTGCTGAGCCCCGAGCCCCCG"
),
"HBB": "GCTCGCTTTCTTGCTGTCCAATTTCTATTAAAGGTTCCTTTGTTCCCTAAGTCCAACTACTAAACTGG",
}
# === Poly(A)尾 ===
poly_a = "A" * 120 # 120nt poly(A)
# === 组装完整mRNA ===
def assemble_mrna(utr5, cds, utr3, poly_a_length=120):
"""组装完整的mRNA序列"""
# DNA → RNA转换
cds_rna = cds.replace('T', 'U')
components = {
"5'UTR": utr5.replace('T', 'U'),
"CDS": cds_rna,
"Stop": "UGA", # 或UAA, UAG
"3'UTR": utr3.replace('T', 'U'),
"Poly(A)": "A" * poly_a_length
}
full_mrna = ''.join(components.values())
# 统计
gc_content = (full_mrna.count('G') + full_mrna.count('C')) / len(full_mrna)
print(f"mRNA长度: {len(full_mrna)} nt")
print(f"GC含量: {gc_content:.1%}")
print(f"CDS长度: {len(cds_rna)} nt ({len(cds_rna)//3} codons)")
return full_mrna, components
full_mrna, components = assemble_mrna(
utr5=utr5_candidates["BNT162b2_like"],
cds=optimized_cds,
utr3=utr3_candidates["AES_mtRNR1"]
)
# === GC含量优化 ===
# 目标GC含量: 50-60% (平衡稳定性和免疫原性)
# m1Ψ修饰时可以接受较高的U含量
gc = (full_mrna.count('G') + full_mrna.count('C')) / len(full_mrna)
print(f"GC含量: {gc:.1%}")
# 如果GC过低, 可以通过密码子选择调整(如Ala选GCC而非GCU)
第六步:稳定性和免疫原性评估¶
代码示例:
# === 1. 修饰核苷酸考虑 ===
# BioNTech/Pfizer的BNT162b2使用N1-methylpseudouridine(m1Ψ)完全替代U
# 这减少了TLR7/8和RIG-I对外源mRNA的识别
# 密码子优化时需要考虑: m1Ψ替换后的碱基配对和结构可能改变
# === 2. 序列特征评估 ===
def evaluate_mrna_features(mrna_seq):
"""评估mRNA序列的关键特征"""
features = {}
# 长度
features['length'] = len(mrna_seq)
# GC含量
features['gc_content'] = (mrna_seq.count('G') + mrna_seq.count('C')) / len(mrna_seq)
# Uridine含量 (低U含量减少TLR激活)
features['u_content'] = mrna_seq.count('U') / len(mrna_seq)
# CpG二核苷酸含量 (低CpG减少固有免疫)
cpg_count = mrna_seq.count('CG')
features['cpg_density'] = cpg_count / (len(mrna_seq) - 1)
# UU二核苷酸 (连续U被TLR7识别)
uu_count = mrna_seq.count('UU')
features['uu_density'] = uu_count / (len(mrna_seq) - 1)
# 密码子多样性 (避免重复密码子耗尽tRNA)
cds_start = mrna_seq.find('AUG')
if cds_start >= 0:
codons = [mrna_seq[i:i+3] for i in range(cds_start, len(mrna_seq)-2, 3)]
unique_codons = len(set(codons))
features['codon_diversity'] = unique_codons / len(codons)
return features
features = evaluate_mrna_features(full_mrna)
for k, v in features.items():
print(f"{k}: {v:.4f}" if isinstance(v, float) else f"{k}: {v}")
# === 3. 半衰期预测 ===
# 考虑影响mRNA稳定性的因素:
# - 3'UTR中的AU-rich elements(ARE): 促进降解
# - 5'UTR结构: 过强的结构阻碍翻译
# - Poly(A)长度: 越长越稳定(直到~150nt)
# - GC含量: 高GC更稳定但可能影响免疫原性
实战命令¶
# === 工具安装 ===
pip install viennarna biopython python-codon-tables
conda install -c bioconda viennarna
# === LinearDesign安装和运行 ===
git clone https://github.com/LinearDesignSoftware/LinearDesign.git
cd LinearDesign && make
echo "PROTEIN_SEQUENCE" | ./lineardesign --lambda 3
# === RNAfold结构预测 ===
echo "AUGCUAGCUAGCUAGC" | RNAfold --noPS
# === 密码子优化工具 ===
# JCat (在线): http://www.jcat.de/
# OPTIMIZER (在线): http://genomes.urv.es/OPTIMIZER/
# CodonW (命令行): codonw sequence.fasta -cai -fop
# === 表位预测 ===
# NetMHCpan: https://services.healthtech.dtu.dk/services/NetMHCpan-4.1/
# IEDB: http://tools.iedb.org/main/
面试常问点¶
Q1:mRNA疫苗设计中密码子优化的目的和注意事项?¶
A: 目的是提高翻译效率——将CDS中的密码子替换为人类细胞偏好的同义密码子(高频密码子对应充足的tRNA)。注意事项:(1) 不能只追求最高频密码子(CAI=1),需要保持密码子多样性避免tRNA耗竭;(2) 需要同时考虑GC含量(目标50-60%);(3) 避免连续的罕见密码子(翻译暂停);(4) 某些位置的翻译减速可能对蛋白折叠重要(如信号肽后的减速区)。
Q2:5'UTR和3'UTR设计的关键考虑因素?¶
A: 5'UTR:(1) Kozak序列(GCCACCAUGG)保证翻译起始效率;(2) 避免上游ORF(uORF)——会截获核糖体;(3) 避免强二级结构(阻碍43S扫描);(4) 长度适中(50-100nt)。3'UTR:(1) 避免AU-rich elements(ARE)——促进mRNA降解;(2) 可使用已验证的高效UTR(如β-globin 3'UTR);(3) 可以串联两段3'UTR提高稳定性(BNT162b2策略)。
Q3:LinearDesign算法的核心思想是什么?¶
A: LinearDesign同时优化密码子使用(CAI)和mRNA二级结构稳定性(MFE)。传统方法先优化密码子再预测结构,二者可能冲突。LinearDesign使用动态规划算法在所有同义密码子选择的组合空间中搜索Pareto最优解——通过λ参数平衡CAI和MFE的权重。λ=0只优化结构,λ→∞只优化密码子。实验证明联合优化的mRNA比单独优化的蛋白表达量高5-10倍。
Q4:N1-methylpseudouridine(m1Ψ)替代U的生物学意义?¶
A: 外源mRNA中的尿苷(U)被模式识别受体(TLR3/7/8、RIG-I)识别为"异己"信号,触发强烈的固有免疫反应(产生IFN-α等),导致翻译抑制和mRNA降解。m1Ψ替代U后:(1) 逃避TLR识别,减少炎症反应;(2) 提高翻译效率(核糖体通读更流畅);(3) 增加mRNA半衰期。这是Katalin Karikó和Drew Weissman的诺贝尔奖级发现。
Q5:如何评估设计的mRNA疫苗候选序列?¶
A: 计算评估:(1) CAI > 0.8;(2) GC含量50-60%;(3) 5'UTR MFE接近0;(4) 无uORF;(5) CpG密度适中。实验验证:(1) 体外转录(IVT)效率;(2) 293T细胞转染后蛋白表达量(Western/ELISA);(3) 细胞内mRNA半衰期(qRT-PCR);(4) 动物免疫原性(中和抗体滴度、T细胞应答)。
易错点¶
1. 过度密码子优化导致蛋白折叠问题¶
错误: 所有密码子都用最高频密码子。 正确做法: 过快的翻译可能导致蛋白折叠错误。保持适度的密码子多样性(CAI 0.8-0.9而非1.0),在关键折叠位点适当保留较慢密码子。
2. 5'UTR中引入意外的起始密码子¶
错误: 5'UTR中含有AUG(uORF起始)。 正确做法: 严格检查5'UTR序列中是否有AUG。任何上游AUG都可能截获核糖体,大幅降低目标蛋白翻译效率。
3. 忽略GC含量对免疫原性的影响¶
错误: 为了稳定性把GC推到70%+。 正确做法: 过高的GC可能增加非目标二级结构,影响翻译。同时,使用m1Ψ修饰后,适度的GC含量(50-60%)已足够。
4. 不考虑目标蛋白的信号肽和修饰¶
错误: 直接用天然蛋白序列做密码子优化,不调整信号肽。 正确做法: 可能需要:(1) 替换为高效的分泌信号肽(如IgKappa leader);(2) 添加/移除糖基化位点;(3) 引入稳定化突变(如Spike蛋白的K986P/V987P脯氨酸替换锁定pre-fusion构象)。
5. 忽略制造可行性¶
错误: 序列中有极高的二级结构或重复序列。 正确做法: 体外转录(IVT)需要DNA模板——极长的poly(A)或强回文序列可能影响模板合成。序列中避免限制酶位点(用于线性化)、极端GC区域(影响T7转录)。
补充知识¶
mRNA疫苗设计工具清单¶
| 工具 | 功能 | 链接 |
|---|---|---|
| LinearDesign | 联合密码子-结构优化 | GitHub |
| ViennaRNA | RNA结构预测 | tbi.univie.ac.at |
| IEDB | 表位预测 | iedb.org |
| NetMHCpan | MHC结合预测 | DTU服务器 |
| JCat | 密码子优化 | jcat.de |
| Solubis | 蛋白溶解度预测 | 在线工具 |
新兴方向¶
- 自复制mRNA(saRNA): 含有复制酶基因,可在细胞内自我扩增
- 环状RNA疫苗(circRNA): 环状结构抗降解,无需cap和poly(A)
- AI辅助设计: 深度学习模型预测mRNA翻译效率和稳定性
- 个性化新抗原疫苗: 基于患者肿瘤突变谱定制mRNA疫苗