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 error | ViennaRNA Python绑定未安装 | conda install -c bioconda viennarna |
序列含T而非U | DNA序列不是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