612_泛基因组分析Roary¶
一句话概述: Roary是分析细菌泛基因组(Pan-genome)的标准工具,能从多个菌株的GFF注释文件中快速计算核心基因组和附属基因组,揭示菌株间的基因共享和独特基因。
核心知识点速查表¶
| 概念 | 白话解释 |
|---|---|
| Pan-genome(泛基因组) | 一个物种所有菌株基因的总和——核心+附属 |
| Core genome(核心基因组) | 所有菌株都有的基因,维持基本生存功能 |
| Accessory genome(附属基因组) | 只在部分菌株中有的基因,赋予特殊能力 |
| Soft core | 95-99%菌株共有的基因(几乎核心) |
| Shell genes | 15-95%菌株共有的基因 |
| Cloud genes | <15%菌株有的稀有基因 |
| Ortholog(直系同源) | 不同菌株中来源相同、功能相似的基因 |
| Paralog(旁系同源) | 同一菌株内因基因复制产生的相似基因 |
| Gene presence/absence | 基因在每个菌株中存在与否的二元矩阵 |
一、安装配置¶
1.1 安装Roary及依赖¶
# === conda安装(推荐)===
conda create -n pangenome python=3.8 # 创建环境
conda activate pangenome # 激活环境
# 安装Roary和Prokka(Roary需要Prokka生成的GFF文件)
conda install -c bioconda roary prokka # 一起安装
# 验证安装
roary --version # 查看版本
prokka --version # 查看版本
# === Docker安装 ===
docker pull sangerpathogens/roary # Docker镜像
1.2 安装可视化工具¶
# Phandango在线可视化(推荐)
# 访问 https://jameshadfield.github.io/phandango/
# 安装roary_plots.py的依赖
pip install matplotlib numpy biopython # Python画图依赖
conda install -c bioconda fasttree # 快速建树工具
二、完整分析流程¶
2.1 第一步:用Prokka注释基因组¶
# === 批量用Prokka注释所有基因组 ===
# Roary的输入必须是Prokka生成的GFF3文件
for genome in genomes/*.fasta; do
name=$(basename "$genome" .fasta) # 提取文件名
prokka \
--kingdom Bacteria \ # 细菌基因组
--outdir prokka_${name} \ # 输出目录
--prefix ${name} \ # 输出文件前缀
--locustag ${name} \ # 基因座位标签
--cpus 8 \ # CPU数
--force \ # 覆盖已有结果
${genome} # 输入基因组
echo "完成注释: ${name}"
done
# 收集所有GFF文件到一个目录
mkdir -p gff_files # 创建GFF目录
cp prokka_*/*.gff gff_files/ # 复制所有GFF文件
2.2 第二步:运行Roary¶
# === 基本运行 ===
roary \
-p 16 \ # 16个CPU
-f roary_output \ # 输出目录
-e \ # 生成核心基因多序列比对
-n \ # 用MAFFT做比对(推荐)
-v \ # 详细输出
gff_files/*.gff # 所有GFF文件
# === 高级参数 ===
roary \
-p 16 \ # CPU数
-f roary_advanced \ # 输出目录
-e -n \ # 核心基因比对用MAFFT
-i 95 \ # BLASTp序列相似性阈值(默认95%)
-cd 99 \ # 核心基因定义:99%菌株共有
-s \ # 不拆分旁系同源基因
-g 60000 \ # 最大基因簇数(大数据集需增大)
-v \ # 详细输出
gff_files/*.gff # 输入文件
白话解释各参数: - -i 95:两个基因序列相似度>95%才认为是同一个基因(默认95%,物种太多样可降低到90%或80%) - -cd 99:一个基因在99%的菌株中都存在才算核心基因 - -s:关闭旁系同源拆分(如果你不关心旁系同源) - -e -n:对核心基因做多序列比对,用MAFFT算法
2.3 第三步:解读结果文件¶
# Roary输出的关键文件
ls roary_output/
# gene_presence_absence.csv — 最重要!基因在每个菌株的有/无
# gene_presence_absence.Rtab — R语言友好的二元矩阵
# core_gene_alignment.aln — 核心基因的多序列比对
# summary_statistics.txt — 统计摘要
# pan_genome_reference.fa — 泛基因组参考序列
# number_of_conserved_genes.Rtab — 累积曲线数据
# number_of_new_genes.Rtab — 新基因曲线数据
# number_of_genes_in_pan_genome.Rtab — 泛基因组大小曲线
# accessory_binary_genes.fa.newick — 附属基因组的树
# 查看统计摘要
cat roary_output/summary_statistics.txt
2.4 第四步:可视化¶
# === 方法1:Roary自带的Python脚本 ===
# 先用FastTree建树
FastTree -nt -gtr roary_output/core_gene_alignment.aln \
> core_gene_tree.nwk # 基于核心基因比对建NJ树
# 画泛基因组矩阵图
python roary_plots.py \
core_gene_tree.nwk \ # 系统发育树
roary_output/gene_presence_absence.csv # 基因存在/缺失矩阵
# 输出:pangenome_matrix.png, pangenome_pie.png, pangenome_frequency.png
# === 方法2:Phandango在线可视化 ===
# 1. 访问 https://jameshadfield.github.io/phandango/
# 2. 拖入 core_gene_tree.nwk
# 3. 拖入 gene_presence_absence.csv
# 交互式查看基因有无模式
三、R语言下游分析¶
# === 泛基因组统计分析 ===
library(ggplot2) # 加载画图包
# 读取泛基因组大小累积数据
pan_data <- read.table(
"roary_output/number_of_genes_in_pan_genome.Rtab",
header = FALSE
)
# 读取核心基因组累积数据
core_data <- read.table(
"roary_output/number_of_conserved_genes.Rtab",
header = FALSE
)
# === 画泛基因组开放/封闭曲线 ===
n_genomes <- 1:ncol(pan_data) # 基因组数量
# 计算每个基因组数量下的平均值
pan_means <- colMeans(pan_data) # 泛基因组平均大小
core_means <- colMeans(core_data) # 核心基因组平均大小
plot_df <- data.frame(
genomes = rep(n_genomes, 2), # 基因组数
genes = c(pan_means, core_means), # 基因数
type = rep(c("Pan-genome", "Core genome"), each = length(n_genomes))
)
ggplot(plot_df, aes(x = genomes, y = genes, color = type)) +
geom_line(linewidth = 1.2) + # 画曲线
geom_point(size = 2) + # 画点
labs(
title = "Pan-genome and Core genome curves",
x = "Number of genomes", # x轴
y = "Number of genes", # y轴
color = "Type" # 图例标题
) +
theme_minimal() + # 简洁主题
scale_color_manual(values = c("Core genome" = "blue",
"Pan-genome" = "red"))
ggsave("pangenome_curve.pdf", width = 10, height = 6) # 保存
# === 分析基因频率分布 ===
# 读取基因存在/缺失矩阵
gene_pa <- read.csv(
"roary_output/gene_presence_absence.Rtab",
sep = "\t", row.names = 1
)
# 计算每个基因在多少个菌株中存在
gene_freq <- rowSums(gene_pa > 0) # 每个基因的存在频率
# 分类统计
n_strains <- ncol(gene_pa) # 总菌株数
core <- sum(gene_freq == n_strains) # 核心基因
soft_core <- sum(gene_freq >= 0.95 * n_strains & gene_freq < n_strains)
shell <- sum(gene_freq >= 0.15 * n_strains & gene_freq < 0.95 * n_strains)
cloud <- sum(gene_freq < 0.15 * n_strains)
cat("核心基因(100%):", core, "\n")
cat("软核心基因(95-99%):", soft_core, "\n")
cat("Shell基因(15-95%):", shell, "\n")
cat("Cloud基因(<15%):", cloud, "\n")
cat("泛基因组总大小:", nrow(gene_pa), "\n")
四、关键参数调优指南¶
| 场景 | 调整参数 | 说明 |
|---|---|---|
| 核心基因太少 | 降低-i到90或80 | 物种多样性高时需要降低阈值 |
| 核心基因太少 | 降低-cd到95或90 | 允许个别菌株缺失 |
| 运行时间太长 | 增加-p线程数 | 或用-z不删除中间文件 |
| 基因簇太多 | 检查输入是否跨物种 | Roary设计用于种内比较 |
| 旁系同源问题 | 使用-s关闭拆分 | 或者检查基因簇大小分布 |
经验法则:细菌约1000基因/Mb。如果2Mb基因组的核心基因只有200个,说明-i阈值可能需要降低。
五、Roary的替代工具(2024-2025)¶
| 工具 | 特点 | 适用场景 |
|---|---|---|
| Roary | 经典工具,速度快 | 种内泛基因组(推荐起点) |
| RIBAP (2024) | 整数线性规划优化Roary结果 | 跨种/属级泛基因组 |
| Panaroo | 纠错功能强 | 注释质量参差不齐的数据 |
| PPanGGOLiN | 图分区方法 | 大规模泛基因组 |
| PeGAS (2025) | 集成耐药+毒力+泛基因组 | 临床微生物基因组学 |
六、常见报错与解决¶
| 报错信息 | 原因 | 解决方案 |
|---|---|---|
No GFF files found | 路径错误或文件格式不对 | 确认GFF文件由Prokka生成 |
Nucleotide sequence not found in GFF | GFF文件末尾缺少序列 | 用Prokka重新注释 |
Core gene alignment is empty | 核心基因阈值太严格 | 降低-cd参数 |
Too many clusters | 输入物种太多样 | Roary适合种内分析 |
Memory error | 菌株太多 | 减少菌株数或增加内存 |
MCL clustering failed | MCL未正确安装 | conda install -c bioconda mcl |
七、面试高频题¶
Q1:什么是泛基因组?核心基因组和附属基因组有什么区别?¶
答: 泛基因组是一个物种所有菌株基因的总集合。核心基因组(core genome)是所有菌株都有的基因,通常与基本生存功能相关(代谢、DNA复制等)。附属基因组(accessory genome)只在部分菌株中有,通常与环境适应、毒力、耐药等特殊功能相关。打比方:核心基因组是每个人都会的"吃饭走路",附属基因组是个人特长"会游泳""会弹琴"。
Q2:开放泛基因组和封闭泛基因组是什么意思?¶
答: 画"泛基因组大小 vs 基因组数量"的曲线:如果随着加入新基因组,泛基因组大小持续增长不饱和,说明是开放泛基因组(物种基因库很大,还有很多未发现的基因),如大肠杆菌。如果曲线趋于平稳,说明是封闭泛基因组(基因库有限),如结核分枝杆菌。开放/封闭反映了物种的基因获取能力(水平基因转移频率)。
Q3:Roary的输入文件有什么要求?¶
答: Roary要求GFF3格式的注释文件,且文件末尾必须包含核苷酸序列(FASTA格式)。推荐用Prokka注释生成,因为Prokka的GFF格式与Roary完全兼容。注意:NCBI下载的GFF文件通常不包含序列,不能直接用,需要先转换。
Q4:如何选择Roary的-i参数?¶
答: -i是BLASTp的序列相似性阈值,默认95%。种内分析用95%即可。如果物种多样性高(如不同亚种),可降低到90%或80%。判断方法:如果核心基因数量远低于预期(细菌约1000基因/Mb),说明阈值太高。但不要低于70%,否则会把不相关的基因错误地聚在一起。
参考资料:Roary: Page et al., Bioinformatics 2015 | RIBAP: Hoelzer et al., Genome Biology 2024 | Prokka: Seemann, Bioinformatics 2014 | 官方文档: sanger-pathogens.github.io/Roary