跳转至

612_泛基因组分析Roary

一句话概述: Roary是分析细菌泛基因组(Pan-genome)的标准工具,能从多个菌株的GFF注释文件中快速计算核心基因组和附属基因组,揭示菌株间的基因共享和独特基因。

核心知识点速查表

概念白话解释
Pan-genome(泛基因组)一个物种所有菌株基因的总和——核心+附属
Core genome(核心基因组)所有菌株都有的基因,维持基本生存功能
Accessory genome(附属基因组)只在部分菌株中有的基因,赋予特殊能力
Soft core95-99%菌株共有的基因(几乎核心)
Shell genes15-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 GFFGFF文件末尾缺少序列用Prokka重新注释
Core gene alignment is empty核心基因阈值太严格降低-cd参数
Too many clusters输入物种太多样Roary适合种内分析
Memory error菌株太多减少菌株数或增加内存
MCL clustering failedMCL未正确安装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