1. 从零开始为什么你需要ENCORI数据库如果你正在研究miRNA那你肯定遇到过这个头疼的问题我手里的这个miRNA它到底调控了哪些基因这个问题听起来简单但做起来可不容易。传统的做法是你得上五六个不同的预测网站比如TargetScan、miRanda、DIANA-microT一个一个地查然后把结果手动整理到Excel里再去重、取交集。这个过程不仅繁琐而且不同数据库的预测结果经常“打架”让你不知道该信谁。更麻烦的是当你手头有几十甚至上百个miRNA需要分析时这种手动操作几乎就是一场灾难。这就是我今天要跟你详细聊的ENCORI数据库的价值所在。你可以把它想象成一个“miRNA靶基因预测的超级市场”。以前你需要跑五六个不同的商店数据库才能买齐东西现在你走进ENCORI这一家货架上就摆满了所有主流数据库PITA, RNA22, miRmap, DIANA-microT, miRanda, PicTar, TargetScan的“商品”预测结果。它最大的魅力在于整合。它把散落在各处的数据按照统一的格式和标准整理好了还附带了实验验证的证据比如CLIP-seq和降解组测序的数据支持。这意味着你得到的不再是一个冷冰冰的计算机预测列表而是一个有实验证据“背书”的、更可靠的靶基因关系网。我第一次用ENCORI的时候感觉就像发现了一个宝藏。当时我手上有几十个在癌症样本里差异表达的miRNA老板急着要靶基因列表做下游验证。要是按老方法没个一两周根本搞不定。但用ENCORI的批量下载接口写个简单的脚本泡杯咖啡的功夫所有数据就都躺在我电脑里了。省下来的时间我可以更专注地去做后续的富集分析和实验设计。所以无论你是刚入门的研究生还是需要处理高通量数据的生物信息分析师掌握ENCORI的批量挖掘技巧都能让你的研究效率提升好几个档次。2. 深入核心ENCORI数据库的“武器库”里有什么在动手写代码之前我们得先搞清楚这个数据库里到底有哪些“弹药”以及怎么用它们才能命中我们的研究目标。ENCORI的全称是The Encyclopedia of RNA Interactomes顾名思义它是一个关于RNA之间如何“社交”的大百科全书。它的核心是RNA互作网络不只是miRNA-mRNA还包括lncRNA-miRNA、circRNA-miRNA等等就像一个复杂的社交网络图。对于我们做miRNA靶基因预测来说最需要关注的是它提供的几层“证据等级”这直接决定了你筛选出来的靶基因靠不靠谱。我把它总结为“三重过滤网”第一重过滤网计算预测程序。这是最基础的一层。ENCORI集成了7个最主流的预测算法比如老牌的TargetScan主要看种子区匹配和序列保守性、miRanda考虑结合自由能、PITA侧重靶点可及性等等。在网页上你可以勾选一个或多个程序。这里有个小技巧如果你要求一个靶向关系必须被多个程序比如≥3个同时预测到那么你得到的列表会短很多但假阳性率也会大大降低结果更严谨。反之如果你不想错过任何潜在靶点可以只要求一个程序支持这样名单会很长但需要后续更严格的实验验证。第二重过滤网实验证据支持。这是ENCORI相比其他纯预测数据库的杀手锏。它整合了真实的生物实验数据主要是两种clipExpNum代表支持该互作关系的CLIP-seq实验数量。CLIP-seq技术能像“拍照片”一样捕获miRNA和其靶标RNA在细胞内实际结合的位置。这个数字越大说明实验验证越充分。我一般会设置clipExpNum2要求至少有两个独立的实验支持这样数据可靠性就高多了。degraExpNum代表支持该互作关系的降解组测序Degradome-seq实验数量。这个技术专门用来检测miRNA切割靶mRNA后产生的片段。如果这个数大于0那就是非常强的直接证据了。第三重过滤网跨癌症/细胞类型的普适性。这个参数pancancerNum非常有用。比如你研究的是某种特定癌症但你发现某个miRNA-靶基因对在超过10种不同的癌症类型中都被检测到有互作那这个调控关系很可能是一个在多种癌症中通用的、核心的调控通路其生物学意义就更重大了。理解这些参数就像拿到了武器库的说明书。你知道哪把“枪”参数组合适合打“近距离巷战”精细、严格的筛选哪把适合“火力覆盖”宽松、全面的初筛。接下来我们就可以根据不同的研究场景灵活搭配这些参数去批量获取我们想要的数据了。3. 实战演练手把手教你配置批量下载脚本理论讲得再多不如动手敲一行代码。原始文章里给的脚本是一个很好的起点但它更像一个“示例模板”。在实际项目中我们往往需要根据具体的研究问题来调整参数。下面我就以一个更贴近真实需求的场景为例带你从头走一遍。场景设定假设我们正在研究胃癌我们从测序数据中找到了5个显著高表达的miRNA例如 hsa-miR-21-5p, hsa-miR-106a-5p, hsa-miR-93-5p, hsa-miR-200c-3p, hsa-miR-141-3p。现在我们需要批量获取它们在人类hg38中所有被至少2个预测程序支持并且有CLIP-seq实验证据≥1个实验的mRNA靶基因。第一步分析需求确定参数根据场景我们可以确定以下核心参数assemblyhg38研究人类。geneTypemRNA只关注编码蛋白的mRNA。miRNAhsa-miR-21-5p...我们可以一个个写但更高效的方法是利用“循环”。clipExpNum1要求至少有一个CLIP-seq实验支持。degraExpNum0先不要求降解组证据可放宽初筛。pancancerNum0先不做跨癌种限制。programNum2关键要求至少被2个不同的预测程序支持。programall对7个程序都进行查询让数据库自己根据programNum2去筛选。targetall查询所有靶基因。cellTypeall不限制细胞类型。第二步编写更灵活的Bash脚本我们不把miRNA名字写死在循环里而是放在一个文本文件中这样以后换一批miRNA分析会非常方便。创建miRNA列表文件nano miRNA_list.txt在文件中输入你的miRNA名称每行一个hsa-miR-21-5p hsa-miR-106a-5p hsa-miR-93-5p hsa-miR-200c-3p hsa-miR-141-3p创建下载脚本download_ENCORI.shnano download_ENCORI.sh写入脚本内容#!/bin/bash # 定义参考基因组版本和基因类型 ASSEMBLYhg38 GENE_TYPEmRNA # 定义核心过滤参数 CLIP_EXP_NUM1 PROGRAM_NUM2 # 从文件读取miRNA列表 while IFS read -r miRNA do # 构建下载URL # 注意URL中的符号在bash脚本中需要转义或放在引号内这里使用转义 URLhttps://rnasysu.com/encori/api/miRNATarget/?assembly${ASSEMBLY}\geneType${GENE_TYPE}\miRNA${miRNA}\clipExpNum${CLIP_EXP_NUM}\degraExpNum0\pancancerNum0\programNum${PROGRAM_NUM}\programall\targetall\cellTypeall # 定义输出文件名用miRNA名字命名更清晰 OUTPUT_FILE${miRNA}_targets_${ASSEMBLY}_clip${CLIP_EXP_NUM}_prog${PROGRAM_NUM}.txt echo 正在下载 ${miRNA} 的数据... # 使用curl下载-s 静默模式-o 指定输出文件 curl -s -o ${OUTPUT_FILE} ${URL} # 检查文件是否下载成功且非空 if [ -s ${OUTPUT_FILE} ]; then echo - 成功保存到 ${OUTPUT_FILE} # 可以顺便看一眼文件有多少行数据减去标题行 LINE_COUNT$(wc -l ${OUTPUT_FILE}) TARGET_COUNT$((LINE_COUNT - 1)) echo - 共发现 ${TARGET_COUNT} 个靶基因关系 else echo - 警告${OUTPUT_FILE} 文件为空或下载失败可能无符合条件的数据。 # 可以选择删除空文件 rm -f ${OUTPUT_FILE} fi # 礼貌一点避免请求过快暂停1秒 sleep 1 done miRNA_list.txt echo 批量下载任务全部完成第三步运行脚本并检查结果# 给脚本添加执行权限 chmod x download_ENCORI.sh # 运行脚本 ./download_ENCORI.sh运行后你的目录下就会生成类似hsa-miR-21-5p_targets_hg38_clip1_prog2.txt的文件。用head命令查看一下文件内容确认数据格式是否正确。这个脚本的优势在于你只需要更新miRNA_list.txt和调整脚本顶部的几个参数比如把PROGRAM_NUM改成3或者把CLIP_EXP_NUM改成2就能立刻适应新的、更严格或更宽松的分析需求实现了真正的参数化、可复用的批量下载。4. 从数据到洞察在R中进行高效整合与筛选数据下载下来只是第一步一堆分散的文本文件并不是我们想要的最终结果。我们需要把它们读入R整理成一个结构清晰、便于分析的数据框DataFrame。原始文章给出了基础方法这里我分享几个更稳健、更高效的技巧特别是处理可能出现的空文件或格式不一致问题。第一步智能读取与合并我们创建一个R脚本比如叫integrate_ENCORI.R。# 清除环境从头开始 rm(list ls()) # 设置工作目录到你的数据所在文件夹 setwd(/你的/数据/路径/) # 1. 动态获取所有下载好的文件 # 使用 pattern 匹配我们脚本生成的文件名格式 file_list - list.files(pattern *_targets_hg38_clip1_prog2.txt) # 检查找到了哪些文件 print(找到以下数据文件) print(file_list) # 2. 创建一个空列表来存储数据 all_data_list - list() # 3. 循环读取并处理每个文件 for (file in file_list) { # 从文件名中提取miRNA名称更优雅的方式 # 假设文件名格式hsa-miR-21-5p_targets_hg38_clip1_prog2.txt mirna_name - gsub(_targets_hg38_clip1_prog2.txt$, , file) cat(正在处理:, mirna_name, ...\n) # 使用 tryCatch 避免单个文件读取错误导致整个循环中断 data_df - tryCatch({ # 读取文件指定分隔符为制表符确保列名识别正确 df - read.delim(file, sep \t, header TRUE, stringsAsFactors FALSE, check.names FALSE) # 检查数据框是否有效有行且有列 if (nrow(df) 0 ncol(df) 0) { # 添加一列记录来源miRNA df$query_miRNA - mirna_name # 将处理好的数据框存入列表用miRNA名字作为列表元素名 all_data_list[[mirna_name]] - df cat( 成功读取有效记录数:, nrow(df), \n) } else { cat( 警告文件, file, 包含0行数据已跳过。\n) NULL } }, error function(e) { cat( 错误读取文件, file, 时失败。错误信息:, e$message, \n) NULL }) } # 4. 将列表中的所有数据框合并成一个大数据框 # 使用 do.call 和 rbind效率较高 if (length(all_data_list) 0) { combined_data - do.call(rbind, all_data_list) # 重置行名 rownames(combined_data) - NULL cat(\n数据整合完成\n) cat(合并后的总数据行数:, nrow(combined_data), \n) cat(数据列名:, colnames(combined_data), \n) # 查看前几行 print(head(combined_data, 4)) } else { stop(没有成功读取到任何有效数据请检查下载的文件。) }第二步关键字段解读与数据清洗合并后的数据框包含很多列我们需要重点关注以下几列miRNA name: miRNA的标准名称。geneName: 靶基因的官方符号如TP53, EGFR这是我们最常用的标识。geneID: 靶基因的ENSEMBL ID如ENSG00000141510适合用于基于ID的富集分析。program: 支持该预测结果的程序名称。因为我们用了programall和programNum2所以每一行记录只显示其中一个支持的程序。这意味着如果一个关系被3个程序支持它在数据中会出现3次。clipExpNum: 支持的CLIP-seq实验数。我们可以根据这个值进一步筛选高置信度的互作。# 数据清洗与深化分析示例 # 1. 去重基于miRNA-靶基因对查看唯一互作关系 # 注意由于program列不同直接对全部列去重会保留每个程序记录。 # 如果我们只关心“是否存在互作”可以按miRNA和基因名去重。 unique_interactions - combined_data[!duplicated(combined_data[, c(miRNA name, geneName)]), ] cat(唯一的miRNA-靶基因互作关系数量:, nrow(unique_interactions), \n) # 2. 统计每个miRNA预测到的靶基因数量 target_count_per_mirna - aggregate(geneName ~ miRNA name, data unique_interactions, FUN function(x) length(unique(x))) colnames(target_count_per_mirna) - c(miRNA, Target_Count) # 按靶基因数量降序排列 target_count_per_mirna - target_count_per_mirna[order(-target_count_per_mirna$Target_Count), ] print(target_count_per_mirna) # 3. 筛选高置信度互作例如clipExpNum 2 且 被至少3个程序支持 # 首先计算每个唯一互作关系被多少个程序支持 program_count - aggregate(program ~ miRNA name geneName, data combined_data, FUN length) colnames(program_count)[3] - program_support_count # 然后获取每个互作关系的最大clipExpNum因为同一对关系在不同程序行中clipExpNum可能相同 clip_exp_max - aggregate(clipExpNum ~ miRNA name geneName, data combined_data, FUN max) # 合并这两个统计信息到唯一关系表中 high_confidence - merge(unique_interactions, program_count, by c(miRNA name, geneName)) high_confidence - merge(high_confidence, clip_exp_max, by c(miRNA name, geneName)) # 现在进行筛选 high_confidence_filtered - subset(high_confidence, program_support_count 3 clipExpNum 2) cat(高置信度程序支持3且CLIP实验2互作关系数量:, nrow(high_confidence_filtered), \n) # 4. 保存结果 write.csv(unique_interactions, file ENCORI_unique_miRNA_targets.csv, row.names FALSE) write.csv(high_confidence_filtered, file ENCORI_high_confidence_targets.csv, row.names FALSE)通过这样的R语言处理流程我们不仅完成了简单的数据合并更实现了数据的深度清洗和分层筛选。你可以轻松得到从“所有可能”到“高度可信”的不同层次的靶基因列表为后续的韦恩图分析、通路富集分析如使用clusterProfiler对geneID进行GO/KEGG分析或构建调控网络打下坚实的基础。记住好的数据整理是成功分析的一半花点时间把这一步做扎实后面的所有分析都会顺畅得多。