跳转至

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 → 5'UTR → Kozak序列 → 信号肽 → 抗原编码区(CDS) → 终止密码子 → 3'UTR → Poly(A)尾

组件功能优化策略
5' Cap保护+翻译起始Cap1结构(m7GpppNm)
5'UTR翻译效率调控选择高效UTR序列
CDS编码抗原蛋白密码子优化+结构优化
3'UTRmRNA稳定性选择已验证的稳定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
ViennaRNARNA结构预测tbi.univie.ac.at
IEDB表位预测iedb.org
NetMHCpanMHC结合预测DTU服务器
JCat密码子优化jcat.de
Solubis蛋白溶解度预测在线工具

新兴方向

  • 自复制mRNA(saRNA): 含有复制酶基因,可在细胞内自我扩增
  • 环状RNA疫苗(circRNA): 环状结构抗降解,无需cap和poly(A)
  • AI辅助设计: 深度学习模型预测mRNA翻译效率和稳定性
  • 个性化新抗原疫苗: 基于患者肿瘤突变谱定制mRNA疫苗