circRNA-miRNA互作分析¶
一句话概述¶
预测环状RNA(circRNA)作为miRNA海绵的竞争性内源RNA(ceRNA)功能,利用miRanda/TargetScan等工具进行circRNA-miRNA结合位点预测,构建ceRNA调控网络揭示基因表达调控机制。
核心知识点总览¶
| 知识点 | 关键内容 | 重要程度 |
|---|---|---|
| ceRNA假说 | circRNA海绵miRNA→解除mRNA抑制 | ⭐⭐⭐⭐⭐ |
| miRNA结合预测 | miRanda/RNAhybrid/TargetScan | ⭐⭐⭐⭐⭐ |
| circRNA鉴定 | CIRI2/CIRCexplorer2/find_circ | ⭐⭐⭐⭐ |
| ceRNA网络构建 | circRNA-miRNA-mRNA三元网络 | ⭐⭐⭐⭐ |
| 表达相关性 | 竞争关系需要负相关验证 | ⭐⭐⭐⭐ |
| 数据库资源 | circBase/circInteractome/StarBase | ⭐⭐⭐ |
| 功能验证 | RIP/pulldown/荧光素酶实验 | ⭐⭐⭐ |
| AGO-CLIP证据 | AGO结合数据支持的互作 | ⭐⭐⭐ |
各步骤详解¶
第一步:ceRNA假说与circRNA海绵机制¶
白话解释: ceRNA(competing endogenous RNA)假说认为:含有相同miRNA结合位点的RNA分子之间存在"竞争"关系。circRNA因为环状结构不易被降解,可以稳定地"吸附"大量miRNA(像海绵一样),使这些miRNA无法抑制其靶mRNA,从而间接上调mRNA表达。经典例子是CDR1as/ciRS-7含有超过70个miR-7结合位点。
技术细节: ceRNA机制的关键要素: 1. circRNA在细胞中有足够的丰度 2. circRNA含有足够多的miRNA响应元件(MRE) 3. circRNA与miRNA的结合是功能性的(在RISC复合体中) 4. circRNA的表达变化能显著改变游离miRNA的有效浓度
ceRNA网络的三元关系: - circRNA ↔ miRNA(结合/海绵) - miRNA → mRNA(抑制/降解) - circRNA → mRNA(间接正调控:通过吸附miRNA解除抑制)
# ceRNA调控示意
#
# 正常状态:
# miR-7 →→→ 抑制 Target mRNA → 低表达
#
# circRNA(CDR1as)高表达时:
# CDR1as ←← 吸附 miR-7 Target mRNA → 高表达(解除抑制)
# (海绵)
#
# 关键条件:
# 1. circRNA含≥多个miRNA结合位点
# 2. circRNA丰度足够高
# 3. miRNA在特定细胞中表达
# 4. 下游靶mRNA被同一miRNA调控
第二步:circRNA鉴定与定量¶
白话解释: 从RNA-seq数据中鉴定circRNA,需要找到"反向剪接"(back-splice)的reads——即reads跨越了环化接头(junction),5'剪接位点的碱基顺序被"倒过来"了。多个工具可以做这件事。
技术细节:
# === circRNA鉴定(CIRI2)===
# CIRI2从BWA比对结果中检测back-splice junction reads
# 1. BWA比对(需要使用BWA-MEM,不去除chimeric reads)
bwa mem -T 19 -t 16 genome.fa R1.fq.gz R2.fq.gz > sample.sam
# 2. CIRI2检测
perl CIRI2.pl \
-I sample.sam \
-O sample_circRNA.txt \
-F genome.fa \
-A annotation.gtf \
-T 16
# === circRNA鉴定(CIRCexplorer2)===
# 1. STAR比对(检测chimeric reads)
STAR --runThreadN 16 \
--genomeDir star_index \
--readFilesIn R1.fq.gz R2.fq.gz \
--readFilesCommand zcat \
--outSAMtype BAM SortedByCoordinate \
--chimSegmentMin 10 \
--chimOutType Junctions \
--outFileNamePrefix sample_
# 2. CIRCexplorer2 parse + annotate
CIRCexplorer2 parse -t STAR sample_Chimeric.out.junction \
-b back_spliced_junction.bed # 默认输出即为此文件名
CIRCexplorer2 annotate \
-r ref.txt \
-g genome.fa \
-b back_spliced_junction.bed \
-o circRNA_annotated.txt
# === circRNA定量(汇总junction reads数)===
# BSJ (back-splice junction) reads count作为circRNA表达量
# CPM归一化
# circRNA结果整理
import pandas as pd
# 读取CIRI2结果
circ_df = pd.read_csv("sample_circRNA.txt", sep="\t")
# 关键列:circRNA_ID, chr, start, end, #junction_reads, strand, gene_name
# 过滤:至少2个BSJ reads
circ_filtered = circ_df[circ_df['#junction_reads'] >= 2]
# 提取circRNA序列(用于下游miRNA结合预测)
# circRNA序列 = back-splice junction两端外显子序列的拼接
print(f"Total circRNAs detected: {len(circ_filtered)}")
print(f"Mean BSJ reads: {circ_filtered['#junction_reads'].mean():.1f}")
第三步:circRNA-miRNA结合位点预测¶
白话解释: 这一步的核心问题是:某个circRNA上有哪些miRNA可以结合?我们用miRanda、RNAhybrid、TargetScan等工具,将miRNA序列与circRNA序列进行互补配对预测。一般要求seed区(miRNA的2-8位)能完美匹配,且整体结合自由能足够低。
技术细节:
# === miRanda 预测 circRNA-miRNA结合 ===
# miRanda基于动态规划的序列互补+热力学稳定性
# 准备文件
# 1. miRNA成熟序列(mature miRNAs fasta)
# 从miRBase下载 mature.fa
# 2. circRNA序列(fasta格式)
# 从基因组中提取circRNA对应外显子序列
# 运行miRanda
miranda \
mature_mirna.fa \
circRNA_sequences.fa \
-sc 140 \
-en -20 \
-scale 4 \
-strict \
-out miranda_results.txt
# 参数说明:
# -sc 140: 最小比对分数(默认140)
# -en -20: 最小自由能(kcal/mol,越低越稳定)
# -strict: 严格seed匹配(要求seed区完美配对)
# 解析结果
grep "^>" miranda_results.txt | \
awk -F'\t' '{print $1"\t"$2"\t"$3"\t"$4}' > miranda_parsed.txt
# === RNAhybrid 预测 ===
# RNAhybrid计算最优互补结合的最小自由能(MFE)
RNAhybrid \
-t circRNA_sequences.fa \
-q mature_mirna.fa \
-b 100 \
-c \
-f 2,7 \
-e -25 \
-p 0.05 \
> rnahybrid_results.txt
# -f 2,7: 强制seed区(position 2-7)完美匹配
# -e -25: MFE阈值
# -p 0.05: p值阈值
# === TargetScan方法(适用于3'UTR,此处用于circRNA seed match)===
# TargetScan seed类型:
# 8mer: 完美配对 position 2-8 + A at position 1
# 7mer-m8: 完美配对 position 2-8
# 7mer-A1: 完美配对 position 2-7 + A at position 1
# 6mer: 完美配对 position 2-7
from Bio import SeqIO
import re
def find_seed_matches(circ_seq, mirna_seed, match_type="7mer-m8"):
"""在circRNA序列中搜索miRNA seed互补位点"""
# miRNA seed (position 2-8)的互补序列
complement = {'A': 'U', 'U': 'A', 'G': 'C', 'C': 'G'}
seed_rc = ''.join(complement[b] for b in reversed(mirna_seed))
# RNA中U替换为T用于搜索DNA序列
seed_rc_dna = seed_rc.replace('U', 'T')
matches = []
for m in re.finditer(seed_rc_dna, str(circ_seq)):
matches.append({
'start': m.start(),
'end': m.end(),
'type': match_type
})
return matches
# 批量预测
results = []
for circ_record in SeqIO.parse("circRNA_sequences.fa", "fasta"):
for mirna_record in SeqIO.parse("mature_mirna.fa", "fasta"):
mirna_seq = str(mirna_record.seq)
seed = mirna_seq[1:8] # position 2-8
matches = find_seed_matches(circ_record.seq, seed)
if matches:
results.append({
'circRNA': circ_record.id,
'miRNA': mirna_record.id,
'num_sites': len(matches),
'sites': matches
})
import pandas as pd
results_df = pd.DataFrame(results)
# 按结合位点数排序(更多位点=更强的海绵效应)
results_df = results_df.sort_values('num_sites', ascending=False)
第四步:构建ceRNA网络¶
白话解释: 有了circRNA-miRNA的结合预测后,还需要找到同一个miRNA调控的mRNA靶基因,这样就能构建完整的circRNA-miRNA-mRNA三元调控网络。最后还要用表达数据验证:circRNA与mRNA应该正相关(它们竞争同一个miRNA),circRNA与miRNA应该负相关。
技术细节:
# === ceRNA网络构建 ===
library(igraph)
library(ggplot2)
# 1. circRNA-miRNA互作(来自miRanda/RNAhybrid预测)
circ_mirna <- read.table("miranda_parsed.txt", header = TRUE)
# 过滤:保留高置信度互作
circ_mirna_filtered <- circ_mirna[circ_mirna$score >= 150 &
circ_mirna$energy <= -25, ]
# 2. miRNA-mRNA互作(来自TargetScan/miRDB)
# 下载TargetScan预测结果
mirna_mrna <- read.table("targetscan_predictions.txt", header = TRUE, sep = "\t")
# 保留高置信度(cumulative weighted context++ score < -0.2,越负越强)
mirna_mrna_filtered <- mirna_mrna[mirna_mrna$context_pp_score < -0.2, ]
# 3. 构建三元网络
# 找到共享miRNA的circRNA-mRNA对
shared_mirnas <- intersect(circ_mirna_filtered$miRNA, mirna_mrna_filtered$miRNA)
# 构建边列表
edges_circ_mirna <- data.frame(
from = circ_mirna_filtered$circRNA[circ_mirna_filtered$miRNA %in% shared_mirnas],
to = circ_mirna_filtered$miRNA[circ_mirna_filtered$miRNA %in% shared_mirnas],
type = "sponge"
)
edges_mirna_mrna <- data.frame(
from = mirna_mrna_filtered$miRNA[mirna_mrna_filtered$miRNA %in% shared_mirnas],
to = mirna_mrna_filtered$gene[mirna_mrna_filtered$miRNA %in% shared_mirnas],
type = "inhibit"
)
all_edges <- rbind(edges_circ_mirna, edges_mirna_mrna)
# 创建网络图
g <- graph_from_data_frame(all_edges, directed = TRUE)
V(g)$type <- ifelse(grepl("^circ", V(g)$name), "circRNA",
ifelse(grepl("^hsa-mi", V(g)$name), "miRNA", "mRNA"))
V(g)$color <- c("circRNA" = "red", "miRNA" = "green", "mRNA" = "blue")[V(g)$type]
plot(g, vertex.size = 5, vertex.label.cex = 0.6,
edge.arrow.size = 0.3, layout = layout_with_fr(g))
# 4. 表达相关性验证
# circRNA与mRNA应正相关(它们竞争同一个miRNA)
# circRNA与miRNA可能负相关(海绵效应)
cor_circ_mrna <- cor.test(expression$circRNA_X, expression$mRNA_Y)
cor_circ_mirna <- cor.test(expression$circRNA_X, expression$miR_Z)
第五步:ceRNA网络的表达验证¶
白话解释: 预测出来的ceRNA网络需要用实际表达数据来验证。如果一个circRNA真的在"海绵"某个miRNA,那么当circRNA表达升高时,该miRNA的有效浓度降低,其靶mRNA应该表达升高。因此需要验证circRNA-mRNA正相关、circRNA-miRNA负相关的模式。
技术细节:
# === 表达相关性验证 ===
# 需要同一样本的circRNA、miRNA、mRNA表达数据
# circRNA: 来自RNA-seq (BSJ reads count, CPM)
# miRNA: 来自small RNA-seq (RPM)
# mRNA: 来自RNA-seq (FPKM/TPM)
# 读取表达矩阵
circ_expr <- read.csv("circRNA_expression.csv", row.names = 1)
mirna_expr <- read.csv("miRNA_expression.csv", row.names = 1)
mrna_expr <- read.csv("mRNA_expression.csv", row.names = 1)
# 确保样本一致
common_samples <- Reduce(intersect, list(
colnames(circ_expr), colnames(mirna_expr), colnames(mrna_expr)))
# 对每个预测的ceRNA关系计算相关性
validate_ceRNA <- function(circ_id, mirna_id, mrna_id) {
circ_vals <- as.numeric(circ_expr[circ_id, common_samples])
mirna_vals <- as.numeric(mirna_expr[mirna_id, common_samples])
mrna_vals <- as.numeric(mrna_expr[mrna_id, common_samples])
# circRNA vs mRNA (期望正相关)
cor_cm <- cor.test(circ_vals, mrna_vals, method = "spearman")
# circRNA vs miRNA (期望负相关)
cor_ci <- cor.test(circ_vals, mirna_vals, method = "spearman")
# miRNA vs mRNA (期望负相关)
cor_im <- cor.test(mirna_vals, mrna_vals, method = "spearman")
return(data.frame(
circRNA = circ_id, miRNA = mirna_id, mRNA = mrna_id,
cor_circ_mrna = cor_cm$estimate, p_circ_mrna = cor_cm$p.value,
cor_circ_mirna = cor_ci$estimate, p_circ_mirna = cor_ci$p.value,
cor_mirna_mrna = cor_im$estimate, p_mirna_mrna = cor_im$p.value
))
}
# 批量验证
validated_results <- do.call(rbind, apply(cerna_predictions, 1, function(row) {
validate_ceRNA(row['circRNA'], row['miRNA'], row['mRNA'])
}))
# 筛选符合ceRNA模式的三元组
# 条件:circRNA-mRNA正相关 AND miRNA-mRNA负相关
valid_cerna <- validated_results %>%
filter(cor_circ_mrna > 0.3 & p_circ_mrna < 0.05 &
cor_mirna_mrna < -0.3 & p_mirna_mrna < 0.05)
第六步:利用数据库资源增强预测¶
白话解释: 除了从头预测,还可以利用已有的circRNA互作数据库来获取已验证或高置信度的circRNA-miRNA互作关系。这些数据库整合了AGO-CLIP实验数据、高通量验证结果和文献报道。
技术细节:
# === 数据库资源利用 ===
# 1. StarBase/ENCORI:基于AGO-CLIP数据的实验支持互作
# https://starbase.sysu.edu.cn/
# 下载circRNA-miRNA互作数据
starbase_interactions <- read.table("starbase_circRNA_miRNA.txt",
header = TRUE, sep = "\t")
# 列:circRNA, miRNA, clipExpNum, pancancerNum, ...
# 2. circInteractome:circRNA互作预测
# https://circinteractome.nia.nih.gov/
# 提供circRNA的miRNA结合位点预测和RBP结合位点
# 3. circBank/circBase:circRNA基本信息和注释
# https://www.circbank.cn/
# 4. 取预测与数据库的交集
# 增加可信度
predicted_pairs <- paste(circ_mirna_filtered$circRNA, circ_mirna_filtered$miRNA)
database_pairs <- paste(starbase_interactions$circRNA, starbase_interactions$miRNA)
overlap <- intersect(predicted_pairs, database_pairs)
cat(sprintf("Predicted: %d\nDatabase-supported: %d\nOverlap: %d\n",
length(predicted_pairs), length(database_pairs), length(overlap)))
实战命令速查¶
# circRNA鉴定
bwa mem -T 19 -t 16 genome.fa R1.fq.gz R2.fq.gz > sample.sam
perl CIRI2.pl -I sample.sam -O circ.txt -F genome.fa -A anno.gtf -T 16
# miRNA结合预测
miranda mature.fa circRNA.fa -sc 140 -en -20 -strict -out miranda_out.txt
RNAhybrid -t circRNA.fa -q mirna.fa -f 2,7 -e -25 > hybrid_out.txt
# ceRNA网络(R中构建)
# 见上文详细代码
面试常问点¶
Q1: ceRNA假说的核心条件是什么?在什么情况下circRNA的海绵功能成立?¶
A: 核心条件:(1) circRNA需要足够高的表达丰度(与miRNA浓度可比);(2) 含有足够多的MRE(miRNA结合位点);(3) miRNA的总量有限(竞争才有意义);(4) 共同靶标在同一时空表达。很多文献中报道的ceRNA关系因circRNA丰度太低而存在争议——如果circRNA拷贝数远低于miRNA,其海绵效应微乎其微。
Q2: 如何评估circRNA-miRNA结合预测的可靠性?¶
A: 多重证据策略:(1) 多工具交叉(miRanda + RNAhybrid + TargetScan取交集);(2) 数据库验证(ENCORI/StarBase中AGO-CLIP数据支持);(3) 结合位点数量(多个位点比单个更可靠);(4) 种间保守性(保守的结合位点更可能功能性);(5) 表达相关性验证。
Q3: circRNA与线性RNA的miRNA海绵功能有何区别?¶
A: circRNA因环状结构抵抗RNA外切酶降解,半衰期远长于线性RNA(>24h vs 数小时)。且部分circRNA含有大量密集的MRE(如CDR1as有>70个miR-7位点)。但大多数circRNA的MRE数量有限(1-5个),这时与3'UTR较长的mRNA相比,海绵效应可能并不显著。
Q4: AGO-CLIP数据如何支持circRNA-miRNA互作?¶
A: AGO-CLIP(如HITS-CLIP/PAR-CLIP/eCLIP)通过免疫沉淀AGO蛋白捕获正在被RISC复合体结合的RNA片段。如果在AGO-CLIP数据中发现circRNA的序列片段,说明该circRNA确实被加载到RISC中与miRNA互作。ENCORI/StarBase数据库整合了大量AGO-CLIP数据用于支持互作验证。
Q5: 如何实验验证circRNA的miRNA海绵功能?¶
A: (1) 双荧光素酶报告基因:将circRNA片段克隆到荧光素酶3'UTR,共转miRNA mimics检测抑制;(2) RNA pulldown:生物素标记circRNA探针pulldown结合的miRNA;(3) RIP-seq:AGO2免疫沉淀后检测结合的circRNA和miRNA;(4) 功能实验:过表达/敲低circRNA后检测miRNA靶基因表达变化。
易错点¶
1. 忽略circRNA丰度对海绵功能的影响¶
许多circRNA表达量极低(<10 copies/cell),而单个miRNA可达数千copies。低丰度circRNA无法有效竞争miRNA,其ceRNA功能成疑。应始终评估circRNA的绝对丰度。
2. 仅凭序列互补就确认互作¶
序列互补是必要不充分条件。需要额外证据:(1) 两者在同一细胞中共表达;(2) 表达相关性符合ceRNA模式;(3) 实验验证或数据库支持。
3. 忽略circRNA的亚细胞定位¶
作为miRNA海绵的circRNA应该在细胞质中(miRNA主要在胞浆发挥作用)。如果circRNA主要定位在细胞核,其海绵功能不成立。可通过核质分离RNA-seq或FISH确认定位。
4. 对非特异性结合位点过度解读¶
只有1个7mer seed match的预测互作可靠性低。建议设置更严格标准:8mer匹配,或多个7mer位点,或额外的3'端配对。
5. 未区分真实circRNA和线性剪接假象¶
RNA-seq中检测到的back-splice junction reads也可能来自模板切换(template switching)等技术假象。应设置minimum BSJ reads阈值(≥2-5),并用RNase R消化验证。
补充知识¶
circRNA的其他功能(非海绵)¶
- 蛋白质支架/翻译:部分circRNA含IRES可翻译微肽
- 转录调控:EIciRNA在转录位点促进宿主基因转录
- 蛋白互作:circFoxo3与CDK2/p21形成三元复合物
- 免疫调控:外源circRNA可激活RIG-I先天免疫
ceRNA网络分析工具¶
- ENCORI/StarBase:最全面的RNA互作数据库
- circMine:circRNA功能预测
- Circlncnet:circRNA-lncRNA-mRNA网络
- ceRNAR:R包构建ceRNA网络
引用推荐¶
- CDR1as/ciRS-7: Hansen et al., Nature, 2013
- ceRNA hypothesis: Salmena et al., Cell, 2011
- circRNA catalog: Salzman et al., PLoS ONE, 2012
- CIRI2: Gao et al., Briefings in Bioinformatics, 2018