NanoRNAMod:用 Snakemake 整合七种 RNA 修饰检测工具
困境:RNA 修饰检测没有金标准
在香港中文大学生命科学学院读博期间,我花了大量时间研究 RNA 修饰。不仅仅是 m6A、假尿苷等修饰如何调控基因表达的生物学问题,还有一个更实际的问题:我们到底怎样从牛津纳米孔直接 RNA 测序(DRS)数据中可靠地检测这些修饰?
答案比我想象的复杂得多。这个领域没有一个公认的金标准工具,取而代之的是一批不断增长的检测工具,每一种都基于不同的统计假设和信号处理策略:
- xpore 建模每个位置的信号分布差异
- nanocompore 用广义加性模型比较条件间的信号特征
- baleen 基于 k-mer 的归一化方法
- differr 比较事件级别的电流强度变化
- drummer 使用混合模型检测差异性修饰
- eligos2 关注 RNA 修饰引起的错配和截短信号
- epinano 用随机森林分类器训练信号特征
每种工具都有自己的优势、偏差和盲区。有些灵敏但噪声大,有些保守但可能遗漏真实的修饰位点。当我刚开始研究时,我不得不一个个手动运行这些工具,管理各自的依赖环境,然后试图在完全不同的输出格式之间做比较。这个过程既繁琐又容易出错。
所以我构建了 NanoRNAMod——一个 Snakemake 流水线,将这七种工具整合在一个可重复的工作流中。
NanoRNAMod 的工作原理
NanoRNAMod 采用基于比较的策略:你提供 Native(未修饰的)和 Control(例如去甲基化处理或体外转录的)样本,每种工具会识别两个条件之间信号存在显著差异的位置。这一点非常关键,因为大多数 RNA 修饰检测算法依赖的是修饰与未修饰上下文之间的比较,而不是直接从头检测修饰。
整个流程从原始 fast5 文件开始,经过碱基识别、比对、事件比对,最终到修饰检测。基本流程如下:
- 碱基识别(Guppy)将原始电信号转换为核苷酸序列
- 读长比对(Minimap2)将碱基识别后的读长比对到参考转录组
- 事件比对(f5c)将原始信号事件重新比对到碱基识别序列
- 修饰检测 同时运行全部七种工具,每种工具在自己的隔离 conda 环境中执行
- 下采样迭代 可选地在不同测序深度下重复分析,用于基准测试
下采样功能的设计
下采样系统是我特别满意的一个功能。在 RNA 修饰检测领域,一个重要挑战是理解测序深度如何影响检测的灵敏度和特异性。NanoRNAMod 允许你配置任意数量的下采样深度和重复次数:
# 在 config.yaml 中配置
downsampling:
enabled: true
depths: [100000, 500000, 1000000, 5000000]
iterations: 3
对于每个深度,流水线会随机抽取指定次数的读长并运行完整的检测流程。这样你可以获得每种工具的性能如何随数据量变化的完整图景——这对于实验设计和公平的工具比较至关重要。
隔离的 Conda 环境
生物信息学中最大的痛点之一就是依赖冲突。这七种工具依赖不同版本的 Python、R 和大量库。NanoRNAMod 通过提供 14 个独立的 conda 环境配置文件来解决这个问题——每种工具的检测和后处理步骤各一个。Snakemake 会自动为每个规则激活正确的环境:
rule run_xpore:
input:
eventalign="results/eventalign/{sample}/eventalign.txt",
bam="results/alignment/{sample}.bam"
output:
dir="results/xpore/{condition}/"
conda:
"envs/xpore.yaml"
shell:
"""
python scripts/run_xpore.py {input.eventalign} {input.bam} {output.dir}
"""
这意味着你可以在一台全新的机器上用一条 snakemake --use-conda 命令运行整个流程,一切都能正常工作。
运行流水线
上手非常简单:
# 克隆仓库
git clone https://github.com/loganylchen/NanoRNAMod.git
cd NanoRNAMod
# 编辑配置文件
cp config/config.example.yaml config/config.yaml
# 在 config.yaml 中填入你的样本路径和参数
# 运行流水线
snakemake --use-conda --cores 32
配置文件控制样本名称、fast5 目录路径、参考序列以及所有下采样参数。首次运行时,流水线会自动下载并创建所有 conda 环境。
我学到了什么
构建 NanoRNAMod 让我学到了远超运行生物信息学工具本身的东西:
Snakemake 工作流管理。 我从写零散的 shell 脚本,进化到了理解基于有向无环图(DAG)的工作流设计。学会编写带有正确输入输出声明、通配符约束和检查点逻辑的规则,从根本上改变了我对可重复研究的理解。
纳米孔信号处理。 深入研究 f5c 如何执行事件比对,理解原始电流信号、squiggle 数据和碱基识别序列之间的关系,让我对这些检测工具底层在做什么有了更深刻的认识。
统计基准测试方法学。 在具有不同统计框架的工具之间设计公平的比较,迫使我在精确率、召回率、F1 分数,以及如何在几乎没有完美真值集的领域中定义”金标准”等问题上进行更深入的思考。
可重复研究实践。 将每种工具的环境容器化,让整个工作流可配置、一条命令可运行,这让我深刻认识到让科学可重复的重要性。如果别人无法重新运行你的分析,那还能算是科学吗?
结语
纳米孔数据中的 RNA 修饰检测仍是一个快速发展的领域。没有哪种工具能够呈现完整画面,而这正是 NanoRNAMod 这类工具的价值所在。通过使多种检测方法在相同条件下的运行和比较变得容易,我们可以更细致地理解每种方法能检测到什么——又会遗漏什么。
如果你正在使用纳米孔 DRS 数据研究 RNA 修饰,欢迎试用 NanoRNAMod。任何贡献和反馈都非常欢迎。