跳转至

613_比较基因组共线性分析

一句话概述: MCScanX和JCVI是检测基因组间共线性(Synteny/Collinearity)的主要工具,通过比较基因顺序揭示基因组结构进化(如全基因组复制、染色体重排),是比较基因组学的核心分析。

核心知识点速查表

概念白话解释
Synteny(共线性)两个基因组中基因排列顺序的保守性——"基因还在老位置"
Collinearity(共线性块)一段连续的、基因顺序一致的区域
Anchor gene(锚定基因)共线性分析中匹配的同源基因对
WGD(全基因组复制)整个基因组翻倍一次,是植物进化的重要事件
Ks(同义替换率)衡量两个同源基因的进化距离(时间)
Ka(非同义替换率)导致氨基酸改变的突变率
Dot plot(点阵图)二维图展示两基因组间的同源区域
Circos图环形图展示基因组间的共线性关系

一、安装工具

1.1 MCScanX安装

# === 从GitHub安装MCScanX ===
git clone https://github.com/wyp1125/MCScanX.git  # 克隆仓库
cd MCScanX  # 进入目录
make  # 编译

# 将MCScanX加入PATH
echo 'export PATH=$PATH:/path/to/MCScanX' >> ~/.bashrc  # 添加路径
source ~/.bashrc  # 刷新

# 验证安装
MCScanX -h  # 查看帮助

1.2 JCVI/MCscan(Python)安装(推荐)

# JCVI是更现代的Python替代工具,比MCScanX快
pip install jcvi  # pip安装

# 依赖安装
conda install -c bioconda last  # LAST比对工具(比BLAST快)
pip install matplotlib  # 画图依赖

# 验证安装
python -m jcvi.compara.catalog --help  # 查看帮助

二、MCScanX分析流程

2.1 准备输入文件

MCScanX需要两个输入文件:.blast(BLAST结果)和.gff(基因位置)

# === 准备GFF文件(基因位置文件)===
# MCScanX的GFF格式很简单:染色体 基因名 起始 终止
# 格式:chr\tgene_id\tstart\tend

# 从标准GFF3提取
awk '$3=="gene" {
    split($9, a, ";");     # 分割第9列
    split(a[1], b, "=");   # 获取ID
    gsub(/ID=/, "", b[2]); # 去掉前缀
    print $1"\t"b[2]"\t"$4"\t"$5  # 输出4列
}' genome_A.gff3 > species_A.gff  # 物种A的基因位置

awk '$3=="gene" {
    split($9, a, ";");
    split(a[1], b, "=");
    gsub(/ID=/, "", b[2]);
    print $1"\t"b[2]"\t"$4"\t"$5
}' genome_B.gff3 > species_B.gff  # 物种B的基因位置

# 合并两个物种的GFF
cat species_A.gff species_B.gff > input.gff  # 合并

# === 准备蛋白序列 ===
cat proteins_A.fasta proteins_B.fasta > all_proteins.fasta  # 合并蛋白序列

# === 运行BLAST ===
# 先建数据库
makeblastdb -in all_proteins.fasta \
    -dbtype prot \             # 蛋白数据库
    -out all_proteins_db       # 数据库名

# 全比全BLASTp
blastp \
    -query all_proteins.fasta \     # 查询序列
    -db all_proteins_db \           # 数据库
    -out input.blast \              # 输出文件
    -outfmt 6 \                     # 表格格式(MCScanX要求)
    -evalue 1e-10 \                 # E值阈值
    -num_threads 16 \               # 线程数
    -max_target_seqs 5 \            # 每个基因最多5个匹配
    -num_alignments 5               # 最多5个比对

2.2 运行MCScanX

# === 基本运行 ===
# 注意:input.gff和input.blast必须同名(前缀相同)
MCScanX input  # 运行共线性分析

# === 自定义参数 ===
MCScanX input \
    -a \          # 检测种间和种内共线性(默认只检测种内)
    -e 1e-10 \    # E值阈值
    -s 5 \        # 最少锚定基因对数(默认5)
    -m 25 \       # 最大间隔基因数(默认25)
    -b 2          # 匹配分值(默认50)

2.3 MCScanX结果解读

# 主要输出文件
# input.collinearity — 共线性块信息
# input.tandem — 串联重复基因
# input.html — HTML可视化

# 查看共线性块
head -30 input.collinearity

# 输出格式示例:
# ## Alignment 0: score=350 e_value=3.7e-20 N=7 ChrA&ChrB plus
# 0- 0: geneA_001 geneB_001   1e-50
# 0- 1: geneA_002 geneB_002   2e-45
# ...
# 含义:第0号共线性块,得分350,包含7对锚定基因,
# 位于ChrA和ChrB之间,方向相同(plus)

2.4 MCScanX可视化

# === 1. 点阵图(Dot plot)===
java -cp MCScanX/downstream_analyses dot_plotter \
    -g input.gff \              # 基因位置
    -s input.collinearity \     # 共线性结果
    -c dot_plot_config.txt \    # 配置文件
    -o dot_plot.png             # 输出图片

# === 2. 圈图(Circle plot)===
java -cp MCScanX/downstream_analyses circle_plotter \
    -g input.gff \
    -s input.collinearity \
    -c circle_config.txt \
    -o circle_plot.png

# === 3. 双基因组对比图(Dual synteny plot)===
java -cp MCScanX/downstream_analyses dual_synteny_plotter \
    -g input.gff \
    -s input.collinearity \
    -c dual_config.txt \
    -o dual_synteny.png

# === 4. 柱形对比图(Bar plot)===
java -cp MCScanX/downstream_analyses bar_plotter \
    -g input.gff \
    -s input.collinearity \
    -c bar_config.txt \
    -o bar_plot.png

三、JCVI/MCscan(Python)分析流程(推荐)

JCVI比MCScanX更快更易用:

# === 第1步:准备BED和CDS文件 ===
# 从GFF3和基因组提取BED格式和CDS序列
python -m jcvi.formats.gff bed \
    --type=mRNA \              # 提取mRNA特征
    --key=Name \               # 用Name作为基因ID
    genome_A.gff3 \            # GFF3文件
    -o species_A.bed           # 输出BED文件

python -m jcvi.formats.gff bed \
    --type=mRNA \
    --key=Name \
    genome_B.gff3 \
    -o species_B.bed

# 提取CDS序列
python -m jcvi.formats.fasta format \
    cds_A.fasta species_A.cds  # 格式化CDS文件
python -m jcvi.formats.fasta format \
    cds_B.fasta species_B.cds

# === 第2步:运行共线性分析 ===
python -m jcvi.compara.catalog ortholog \
    species_A species_B \      # 两个物种
    --no_strip_names           # 保留完整基因名

# 输出文件:
# species_A.species_B.anchors  — 锚定基因对
# species_A.species_B.lifted.anchors — 扩展的锚定对
# species_A.species_B.last — LAST比对结果

# === 第3步:画点阵图(Dot plot)===
python -m jcvi.graphics.dotplot \
    species_A.species_B.anchors  # 画点阵图

# === 第4步:画共线性对比图 ===
# 先创建布局文件(seqids和layout)

# seqids文件:每行列出要展示的染色体
echo "Chr1,Chr2,Chr3,Chr4,Chr5" > seqids   # 物种A的染色体
echo "chr1,chr2,chr3,chr4,chr5" >> seqids   # 物种B的染色体

# layout文件:定义图形布局
cat > layout << 'EOF'
# y, xstart, xend, rotation, color, label, va, bed
.6, .1, .8, 0, , Species_A, top, species_A.bed
.4, .1, .8, 0, , Species_B, top, species_B.bed
# edges
e, 0, 1, species_A.species_B.anchors.simple
EOF

# 画宏观共线性图
python -m jcvi.graphics.karyotype \
    seqids layout  # 输出 karyotype.pdf

四、Ks分析(估计分歧时间)

# === 用JCVI计算Ks值 ===
python -m jcvi.compara.synteny mcscan \
    species_A.bed species_A.species_B.anchors \
    --iter=1  # 迭代次数

# === 画Ks分布图 ===
python -m jcvi.compara.synteny ksdistrib \
    species_A.species_B.anchors.ks  # Ks值文件
# === R语言画Ks密度图 ===
library(ggplot2)  # 加载ggplot2

# 读取Ks数据
ks_data <- read.table("ks_values.txt", header = TRUE)  # 读取Ks值

# 画Ks密度分布图
ggplot(ks_data, aes(x = Ks)) +
    geom_density(fill = "steelblue", alpha = 0.5) +  # 密度曲线
    xlim(0, 3) +  # x轴范围
    geom_vline(xintercept = c(0.5, 1.0, 1.5),  # 标记可能的WGD峰
               linetype = "dashed", color = "red") +
    labs(
        title = "Ks Distribution",
        x = "Synonymous substitution rate (Ks)",  # 同义替换率
        y = "Density"  # 密度
    ) +
    theme_minimal()

ggsave("ks_distribution.pdf", width = 8, height = 5)  # 保存

# Ks峰值对应WGD事件
# 如果有明显的峰,说明发生过全基因组复制

五、MCScanX vs JCVI对比

特性MCScanXJCVI/MCscan(Python)
语言C++Python
比对工具BLASTLAST(更快)
速度较慢快(2-10倍)
可视化Java程序(4种图)Python matplotlib
Ks计算需额外脚本内置
安装难度中等简单(pip)
文献引用极高(>5000次)较高
推荐度经典但稍老2024年Nature Protocols推荐

六、常见报错与解决

报错信息原因解决方案
No collinear blocks found阈值太严或物种差异太大降低-s或增大-m参数
Gene ID mismatchGFF和BLAST中的基因名不一致确保两个文件的基因ID完全匹配
BLAST format errorBLAST输出格式不对必须用-outfmt 6格式
Java heap spaceMCScanX可视化内存不足java -Xmx4g -cp ...增加内存
LAST not found (JCVI)LAST未安装conda install -c bioconda last
latex not found (JCVI)matplotlib需要latex字体conda install -c conda-forge texlive-core

七、面试高频题

Q1:什么是共线性(Synteny),为什么要分析它?

答: 共线性是指两个基因组中基因排列顺序的保守性。分析共线性可以:(1) 验证全基因组复制(WGD)事件——如果发现大量2:1或2:2的共线性块,说明发生过基因组倍增;(2) 研究染色体重排进化——倒位、易位等结构变异会打断共线性;(3) 辅助基因组注释——利用近缘物种的注释来改善目标基因组的注释。

Q2:MCScanX的锚定基因对数(-s参数)怎么选?

答: -s是认定共线性块的最少锚定基因对数,默认5。意思是至少要有5对同源基因排列顺序一致才算一个共线性块。亲缘关系近的物种可以设高一点(比如10),减少假阳性。亲缘关系远的物种可以适当降低(比如3),避免丢失短的共线性区域。

Q3:Ks分布图中的峰代表什么?

答: Ks(同义替换率)反映两个基因的分歧时间——Ks越大分歧越早。Ks分布图中的峰代表古老的进化事件:(1) 峰值在Ks~0.3-0.5可能代表最近的WGD(全基因组复制);(2) 峰值在Ks~1.0-1.5代表更古老的WGD;(3) 物种间比较时,峰值代表物种分化时间。多个峰说明经历了多次WGD。

Q4:比较基因组共线性分析有哪些应用?

答: 在微生物基因组学中,共线性分析可用于:(1) 比较不同菌株的染色体结构重排;(2) 检测水平基因转移事件——如果一段基因在不同物种中共线性保守,中间物种缺失,可能是水平转移;(3) 辅助基因组组装验证——新组装的基因组与近缘参考比较,确认染色体结构正确性。


参考资料:MCScanX: Wang et al., NAR 2012 | MCScanX Protocol: Wang et al., Nature Protocols 2024 | JCVI: Tang et al., iMeta 2024 | github.com/wyp1125/MCScanX