跳转至

基因组Survey分析

一句话概述:基因组Survey(调查分析)是在正式组装前,通过k-mer频率分布估算基因组大小、杂合度、重复序列比例等基本特征,为测序策略和组装方案提供依据。白话:先"摸底考试",看看这个基因组长什么样。

核心知识点速查表

概念说明
k-mer长度为k的连续子序列(通常k=17或21)
k-mer频率分布统计每个k-mer出现的次数及其分布
基因组大小= k-mer总数 / 主峰覆盖度
杂合度基因组中等位基因差异的比例(杂合峰在主峰的1/2处)
重复序列比例高频k-mer区域对应重复序列
GC含量基因组中G和C碱基的比例,影响测序和组装
GenomeScope基于k-mer频率的基因组特征估计工具
Jellyfish高效k-mer计数工具

一、流程概览

原始reads → 质控(fastp) → k-mer计数(Jellyfish) → 频率分布 → GenomeScope估算
                                                  基因组大小、杂合度、重复率

二、实操步骤

2.1 数据质控

# === 用fastp做质控 ===
fastp \
    -i raw_R1.fastq.gz \         # 原始正向reads
    -I raw_R2.fastq.gz \         # 原始反向reads
    -o clean_R1.fastq.gz \       # 质控后正向reads
    -O clean_R2.fastq.gz \       # 质控后反向reads
    -q 20 \                      # 最低碱基质量
    -l 50 \                      # 最短读段长度
    -w 8 \                       # 工作线程
    -h fastp_report.html          # HTML报告

2.2 k-mer计数

# === 使用Jellyfish计数k-mer ===

# 第1步:计数(k=21最常用)
jellyfish count \
    -C \                         # 正义链和反义链合并计数
    -m 21 \                      # k-mer长度=21
    -s 5G \                      # 哈希表初始大小(5GB,大基因组用更大值)
    -t 16 \                      # 线程数
    -o kmer_counts.jf \          # 输出文件
    <(zcat clean_R1.fastq.gz) \  # 解压输入(正向)
    <(zcat clean_R2.fastq.gz)    # 解压输入(反向)

# 第2步:生成频率直方图
jellyfish histo \
    -t 16 \                      # 线程数
    -h 1000000 \                 # 最大频率上限
    kmer_counts.jf > kmer_histo.txt   # 输出直方图
# === 使用KMC替代方案(更快,内存更少) ===
# 适合大基因组(>1Gb)

# 创建临时目录
mkdir kmc_tmp

# 运行KMC
kmc \
    -k21 \                       # k-mer长度
    -ci2 \                       # 最低计数阈值(过滤测序错误)
    -cs1000000 \                 # 最大计数值
    -t16 \                       # 线程数
    -m64 \                       # 最大内存(GB)
    @input_list.txt \            # 输入文件列表(每行一个fastq路径)
    kmc_output \                 # 输出前缀
    kmc_tmp                       # 临时目录

# 生成直方图
kmc_tools transform kmc_output histogram kmer_histo.txt

2.3 GenomeScope分析

# === 方法1: GenomeScope 2.0 在线版 ===
# 访问: http://qb.cshl.edu/genomescope/genomescope2.0/
# 上传kmer_histo.txt文件
# 设置k-mer length=21, Ploidy=2(二倍体)
# 点击Submit

# === 方法2: GenomeScope 2.0 命令行 ===
# 安装
conda install -c bioconda genomescope2

# 运行
genomescope2 \
    -i kmer_histo.txt \          # k-mer直方图文件
    -k 21 \                      # k-mer长度
    -p 2 \                       # 倍性(2=二倍体,4=四倍体)
    -o genomescope_output         # 输出目录

# 输出文件:
# genomescope_output/
# ├── summary.txt         # ★文字摘要(基因组大小、杂合度等)
# ├── model.txt           # 模型参数
# ├── linear_plot.png     # ★线性坐标的k-mer分布图
# ├── log_plot.png        # ★对数坐标的k-mer分布图
# └── transformed_linear_plot.png  # 变换后的图

2.4 结果解读

# === GenomeScope summary.txt 示例 ===
# Genome Haploid Length   485,234,567 bp     # 单倍体基因组大小 ★
# Genome Repeat Length    198,765,432 bp     # 重复序列长度
# Genome Unique Length    286,469,135 bp     # 唯一序列长度
# Heterozygosity           1.23 %            # 杂合度 ★
# Repeat                   40.97 %           # 重复序列比例 ★
# Read Error Rate           0.35 %           # 读段错误率
# Model Fit                 97.5 %           # 模型拟合度

k-mer分布图解读

频率
 ^
 |    *
 |   * *         ← 杂合峰(在主峰的1/2位置,杂合度高时明显)
 |  *   *
 | *     *****
 |*         * *  ← 主峰(代表单倍体覆盖度)
 |           * *
 |            * *** ← 右侧长尾(重复序列)
 +--+--+--+--+--→ 覆盖度(depth)
    0  25 50 75 100

# 主峰位置 = 平均测序深度
# 杂合峰 = 主峰的一半位置出现的次峰
# 右侧长尾 = 重复序列(出现频率是主峰的2倍、3倍...)
# 最左侧的极高频点 = 测序错误产生的k-mer(应过滤)

三、手动估算基因组大小

# === 基本公式 ===
# 基因组大小 = k-mer总数 / 主峰覆盖度

# 从直方图计算k-mer总数
awk '{total += $1 * $2} END{print "Total k-mers:", total}' kmer_histo.txt

# 假设主峰在覆盖度50处
# 基因组大小 = k-mer总数 / 50

# === 更精确的计算(排除错误k-mer) ===
# 通常覆盖度<5的k-mer被认为是测序错误
awk '$1 >= 5 {total += $1 * $2} END{print "Filtered k-mers:", total}' kmer_histo.txt
# 基因组大小 = 过滤后k-mer总数 / 主峰覆盖度

四、Smudgeplot杂合度分析

# === Smudgeplot:可视化基因组倍性和杂合度 ===
# 特别适合判断多倍体和杂合体

# 安装
conda install -c bioconda smudgeplot

# 从KMC结果提取k-mer对
smudgeplot.py hetkmers \
    -o kmer_pairs \              # 输出前缀
    kmc_output                    # KMC数据库

# 绘制smudgeplot
smudgeplot.py plot \
    kmer_pairs_coverages.tsv \   # 覆盖度文件
    -o smudge_plot \             # 输出前缀
    -k 21                        # k-mer长度

# 结果解读:
# AB类型的点集中在 → 二倍体(AB)
# 多个点簇 → 可能是多倍体
# 点分散 → 高杂合度

五、面试高频考点

Q1: 为什么要做基因组Survey?

  • 在花大钱正式测序前,先用少量数据"摸底"
  • 知道基因组大小 → 计算需要多少测序数据
  • 知道杂合度 → 选择合适的组装策略
  • 知道重复率 → 判断组装难度
  • 白话:装修前先量房

Q2: k-mer分布图上能看出什么信息?

  • 主峰位置 = 测序深度(白话:数据多不多)
  • 杂合峰 = 基因组杂合度(白话:爸妈给的DNA差别大不大)
  • 右侧长尾 = 重复序列含量(白话:基因组里有多少"复读机")
  • 左侧尖峰 = 测序错误(白话:仪器读错的碱基)

Q3: 基因组大小估计不准怎么办?

  • 增加测序数据量(至少30x覆盖度)
  • 用多个k值(17/21/27)估算取平均
  • 高杂合基因组用GenomeScope2.0的杂合模型
  • 结合流式细胞术(flow cytometry)实验验证

常见报错与解决

报错原因解决方案
Jellyfish内存不足哈希表太小增大-s参数
GenomeScope拟合失败数据量不够或质量差检查测序深度>30x
主峰不明显数据太少或污染增加数据/检查污染
多个主峰多倍体或混合物种-p 4设置四倍体模型
杂合度异常高可能是混合了两个物种用Kraken2检查污染

速查表

# === 基因组Survey标准流程 ===
# 1. 质控
fastp -i R1.fq.gz -I R2.fq.gz -o clean_R1.fq.gz -O clean_R2.fq.gz

# 2. k-mer计数
jellyfish count -C -m 21 -s 5G -t 16 -o counts.jf <(zcat clean_*.fq.gz)
jellyfish histo -t 16 counts.jf > histo.txt

# 3. GenomeScope估算
genomescope2 -i histo.txt -k 21 -p 2 -o results/

# 关键输出:基因组大小、杂合度、重复率
# 推荐测序深度:Survey用30x,正式组装用50-100x(NGS)或30x(HiFi)