跳转至

766. RNA二级结构预测

一句话概述:预测RNA分子的折叠方式(哪些碱基配对形成茎环/发夹等结构),理解RNA如何通过形状执行功能——就像预测一条纸带折成的纸飞机的形状,RNA的功能取决于它折成什么样。


核心知识点速查表

概念白话解释关键工具
二级结构碱基配对模式(A-U, G-C, G-U)茎环/发夹/环
MFE最小自由能(最稳定结构)RNAfold
点括号表示法(((...)))表示配对Vienna格式
茎环(Stem-loop)RNA最常见的结构单元配对区+未配对环
RNAfold最经典的RNA结构预测ViennaRNA
SHAPE化学探针实验验证结构实验方法

一、原理(白话版)

1.1 RNA二级结构基础

RNA碱基配对规则:
  Watson-Crick配对:A-U, G-C(稳定)
  摇摆配对:G-U(较弱但常见)

常见二级结构元素:
  茎(Stem):配对的碱基区域 (((...)))
  环(Loop):未配对的碱基 ...
  发夹环(Hairpin loop):茎顶端的环
  内部环(Internal loop):茎中间的不配对区
  凸起(Bulge):一侧有不配对碱基
  多分支环(Multi-branch loop):多个茎交汇

自由能:
  碱基配对释放能量(负值=稳定)
  G-C配对:约-3 kcal/mol(最稳定)
  A-U配对:约-2 kcal/mol
  G-U配对:约-1 kcal/mol
  MFE(最小自由能)结构 = 最稳定的折叠方式

1.2 预测方法分类

方法原理代表工具
热力学最小化自由能RNAfold, Mfold
比较分析进化保守的配对Rfam, CMfind
机器学习深度学习预测SPOT-RNA, LinearFold
实验辅助SHAPE/DMS数据约束RNAstructure+SHAPE

二、RNAfold预测

2.1 命令行使用

# ===== 安装ViennaRNA =====
conda install -c bioconda viennarna  # conda安装

# ===== RNAfold基本用法 =====
# 从序列预测MFE结构
echo "GGGAAACCCUUUAAGGGAAACCC" | RNAfold
# 输出:
# GGGAAACCCUUUAAGGGAAACCC
# (((.......)))..(((...))) (-8.20)
# ↑ 点括号表示法     ↑ MFE(kcal/mol)

# 从FASTA文件批量预测
RNAfold \
  --infile sequences.fasta \           # 输入FASTA文件
  --outfile structures.txt \           # 输出结果
  --noPS \                             # 不生成PostScript图
  -p \                                 # 计算配对概率
  --MEA \                              # 计算最大期望准确度结构
  -T 37                                # 温度37°C

# 输出解释:
# MFE结构:自由能最低的单一结构
# 配对概率:每对碱基配对的概率
# MEA结构:最大化期望准确度的结构(通常比MFE更可靠)

# ===== RNAcofold:两条RNA的相互作用预测 =====
echo "GGGAAACCC&CCCUUUGGG" | RNAcofold
# 预测两条RNA如何配对(如miRNA-mRNA)

2.2 Python接口

# ===== Python使用ViennaRNA =====
import RNA  # 导入ViennaRNA Python接口

# 基本MFE预测
sequence = "GGGAAACCCUUUAAGGGAAACCC"  # RNA序列
(structure, mfe) = RNA.fold(sequence)  # 预测MFE结构

print(f"序列: {sequence}")
print(f"结构: {structure}")
print(f"MFE:  {mfe:.2f} kcal/mol")

# 配对概率矩阵
fc = RNA.fold_compound(sequence)  # 创建折叠复合物
(structure, mfe) = fc.mfe()       # MFE
fc.pf()                           # 配分函数(计算所有可能结构的概率)
bpp = fc.bpp()                    # 碱基配对概率矩阵

# 遍历高概率配对
for i in range(1, len(sequence)):
    for j in range(i+1, len(sequence)+1):
        if bpp[i][j] > 0.5:  # 配对概率>50%
            print(f"  位置 {i}-{j}: 配对概率 = {bpp[i][j]:.3f}")

# ===== 多序列结构预测(考虑保守性) =====
# RNAalifold:比较基因组学方法
import subprocess

# 先做多序列比对
# clustalw -infile=rna_seqs.fasta -outfile=rna_aligned.aln

# 用RNAalifold预测共保守结构
result = subprocess.run(
    ["RNAalifold", "--input-format=C", "rna_aligned.aln"],
    capture_output=True, text=True
)
print(result.stdout)

2.3 结构可视化

# ===== 可视化RNA结构 =====
import matplotlib.pyplot as plt  # 导入matplotlib
import RNA  # 导入ViennaRNA

sequence = "GGGAAACCCUUUAAGGGAAACCC"
(structure, mfe) = RNA.fold(sequence)

# 方法一:forgi/forna在线可视化
# 访问 http://rna.tbi.univie.ac.at/forna/
# 粘贴序列和点括号结构

# 方法二:R2R绘图
# 方法三:VARNA Java程序

# 方法四:matplotlib简单绘制弧线图
fig, ax = plt.subplots(figsize=(12, 4))

# 解析点括号结构
pairs = []  # 存储配对
stack = []  # 栈
for i, char in enumerate(structure):
    if char == '(':
        stack.append(i)  # 左括号入栈
    elif char == ')':
        j = stack.pop()  # 匹配右括号
        pairs.append((j, i))  # 记录配对

# 绘制序列
for i, base in enumerate(sequence):
    color = {'A': 'red', 'U': 'blue', 'G': 'green', 'C': 'orange'}.get(base, 'gray')
    ax.text(i, -0.1, base, ha='center', fontsize=8, color=color, fontweight='bold')

# 绘制配对弧线
for (i, j) in pairs:
    arc_height = (j - i) / 2 * 0.15  # 弧线高度
    arc = plt.matplotlib.patches.Arc(
        ((i+j)/2, 0), j-i, arc_height*2,
        angle=0, theta1=0, theta2=180,
        color='gray', linewidth=1
    )
    ax.add_patch(arc)

ax.set_xlim(-1, len(sequence))
ax.set_ylim(-0.5, max(j-i for i,j in pairs)/2*0.15 + 0.5)
ax.set_title(f"RNA Structure (MFE = {mfe:.2f} kcal/mol)")
ax.axis('off')
plt.tight_layout()
plt.savefig("rna_structure_arc.png", dpi=300)
plt.show()

三、实验辅助结构预测(SHAPE约束)

# ===== 用SHAPE数据约束结构预测 =====
import RNA  # 导入ViennaRNA

sequence = "GGGAAACCCUUUAAGGGAAACCC"

# SHAPE实验值(每个碱基的反应性)
# 高值=未配对,低值=配对
shape_data = [0.1, 0.2, 0.1, 0.9, 0.8, 0.7, 0.2, 0.1, 0.1,
              0.9, 0.8, 0.9, 0.8, 0.9, 0.2, 0.1, 0.1,
              0.8, 0.7, 0.9, 0.1, 0.2, 0.1]

# 创建折叠复合物
fc = RNA.fold_compound(sequence)

# 添加SHAPE约束
# 将SHAPE值转为软约束
for i, val in enumerate(shape_data):
    # SHAPE值转为伪能量
    if val > 0.7:  # 高反应性 → 可能未配对
        fc.sc_add_up(i+1, -0.5)  # 惩罚配对
    elif val < 0.3:  # 低反应性 → 可能配对
        fc.sc_add_up(i+1, 0.5)   # 鼓励配对

# 预测SHAPE约束的结构
(structure_shape, mfe_shape) = fc.mfe()
print(f"SHAPE约束结构: {structure_shape} ({mfe_shape:.2f})")

# 对比无约束结构
(structure_free, mfe_free) = RNA.fold(sequence)
print(f"无约束结构:     {structure_free} ({mfe_free:.2f})")

四、常见报错与解决

报错信息原因解决方案
import RNA errorViennaRNA Python绑定未安装conda install -c bioconda viennarna
序列含T而非UDNA序列不是RNA将T替换为U
MFE=0序列太短或无法配对检查序列长度(至少6nt)
内存不足序列太长(>5000nt)用LinearFold(线性时间算法)
预测不准长序列MFE预测误差大结合SHAPE数据或比较基因组学
多重结构一条序列可能有多种结构用配分函数分析结构集合

五、面试高频问题

Q1: MFE预测的局限性?

A: ①热力学参数有误差,长序列(>500nt)预测准确率显著下降;②只预测最稳定结构,但RNA在细胞中可能动态切换多种构象;③不考虑蛋白质结合、离子环境等细胞内因素;④不能预测假结(pseudoknot)。改进方法:结合SHAPE实验数据、比较基因组学、或用机器学习方法。

Q2: 如何验证预测的RNA结构?

A: ①SHAPE-seq/DMS-seq:化学探针标记未配对碱基;②突变分析:补偿性突变恢复结构=结构存在;③PARIS/CLASH:交联后测序检测碱基配对;④结晶学/冷冻电镜:三级结构(分辨率最高但最难)。

Q3: RNA结构在生物学中有什么作用?

A: ①调控翻译:mRNA 5'UTR的结构影响核糖体起始;②剪接调控:前体mRNA的结构影响剪接位点选择;③功能性RNA:tRNA/rRNA/ribozyme的功能完全依赖结构;④miRNA/siRNA:前体的茎环结构被Drosha/Dicer识别;⑤核糖开关:细菌mRNA通过结构变化感应代谢物。


六、速查表

# ===== RNA结构预测速查 =====

# RNAfold(命令行)
echo "GGGAAACCCUUUAAGGGAAACCC" | RNAfold
RNAfold --infile seqs.fa -p --MEA -T 37

# Python
import RNA
(ss, mfe) = RNA.fold(sequence)

# 点括号表示法:
# ( = 配对(5'端)
# ) = 配对(3'端)
# . = 未配对

# 常见结构元素:
# 发夹环: (((...)))
# 内部环: ((..((...))..))
# 凸起:   ((..(((...)))..))
# 多分支: ((...)(...)(...))

# 工具选择:
# 短序列(<500nt) → RNAfold
# 长序列(>500nt) → LinearFold
# 多序列保守 → RNAalifold
# 实验辅助 → RNAstructure + SHAPE

# 在线可视化:
# forna: http://rna.tbi.univie.ac.at/forna/
# R2DT: https://rnacentral.org/r2dt