跳转至

环境DNA (eDNA) Metabarcoding分析

一句话概述

环境DNA (eDNA) metabarcoding通过采集水、土壤等环境样本中游离的DNA片段来鉴定该环境中存在的物种——白话说就是:动物在水里游泳会掉落皮肤细胞、排泄物等含DNA的物质,我们只需要采一瓶水就能知道这里有哪些鱼、蛙、甚至鲸鱼,不需要真的看到它们。


核心知识点表格

知识点说明
eDNA生物释放到环境中的游离DNA(来自皮肤、粪便、黏液等)
Metabarcoding用通用引物扩增标记基因(如COI、12S、ITS),结合高通量测序
COI细胞色素c氧化酶I,动物DNA条形码的"金标准"marker
12S rRNA线粒体基因,鱼类eDNA的首选marker
18S rRNA真核生物通用marker
DADA2扩增子序列变体(ASV)推断工具,实现单碱基分辨率
OBITools最早的metabarcoding专用工具,适合非细菌数据
BLAST物种鉴定的基础方法,序列比对到参考数据库
BOLD条形码参考数据库(动物COI为主)
MiFish鱼类eDNA专用引物和分析流水线

各步骤详解

第一步:理解eDNA实验设计

白话解释: eDNA采样就像"法医采集DNA证据"——从水里过滤出微量DNA,扩增特定基因片段,测序后比对数据库来鉴定物种。

eDNA实验流程:
1. 野外采样 → 采集水样/土壤样本(注意防污染!)
2. 过滤/沉淀 → 用0.45μm滤膜过滤水样,截留DNA
3. DNA提取 → 从滤膜上提取总DNA
4. PCR扩增 → 用通用引物扩增目标marker(如12S、COI)
5. 文库构建 → 加接头和索引,准备上机
6. 测序 → Illumina MiSeq 2×250bp(最常用)
7. 生信分析 → 质控→去噪→物种鉴定→生态分析

常用Marker选择指南:
  鱼类   → 12S rRNA(MiFish引物)
  两栖类 → 12S或16S
  哺乳类 → 12S
  无脊椎 → COI
  真菌   → ITS
  植物   → rbcL / trnL

第二步:DADA2处理(R语言)

白话解释: DADA2通过学习测序错误模型来区分"真实序列"和"测序错误",生成ASV(扩增子序列变体)——比传统97% OTU聚类更精确。

library(dada2)                           # 加载DADA2

# ===== 设置文件路径 =====
path <- "/data/edna_fastq/"              # FASTQ文件目录
fnFs <- sort(list.files(path, pattern = "_R1_001.fastq.gz", full.names = TRUE))
fnRs <- sort(list.files(path, pattern = "_R2_001.fastq.gz", full.names = TRUE))
sample_names <- sapply(strsplit(basename(fnFs), "_"), `[`, 1)  # 提取样本名

# ===== 质量图检查 =====
plotQualityProfile(fnFs[1:2])            # 查看正向reads质量
plotQualityProfile(fnRs[1:2])            # 查看反向reads质量

# ===== 过滤与修剪 =====
filtFs <- file.path(path, "filtered", paste0(sample_names, "_F_filt.fastq.gz"))
filtRs <- file.path(path, "filtered", paste0(sample_names, "_R_filt.fastq.gz"))

out <- filterAndTrim(
  fnFs, filtFs,                          # 正向:原始→过滤后
  fnRs, filtRs,                          # 反向:原始→过滤后
  truncLen = c(200, 160),                # 截断长度(根据质量图调整)
  maxEE = c(2, 2),                       # 最大期望错误数
  truncQ = 2,                            # 质量值低于2则截断
  maxN = 0,                              # 不允许N碱基
  rm.phix = TRUE,                        # 去除PhiX spike-in
  compress = TRUE,                       # 压缩输出
  multithread = TRUE                     # 多线程
)
# 注意:对于ITS等变长marker,不要使用truncLen截断!

# ===== 学习错误率 =====
errF <- learnErrors(filtFs, multithread = TRUE)  # 学习正向错误模型
errR <- learnErrors(filtRs, multithread = TRUE)  # 学习反向错误模型
plotErrors(errF, nominalQ = TRUE)        # 检查错误模型拟合

# ===== 去噪(核心步骤)=====
dadaFs <- dada(filtFs, err = errF, multithread = TRUE)  # 正向去噪
dadaRs <- dada(filtRs, err = errR, multithread = TRUE)  # 反向去噪

# ===== 合并配对reads =====
mergers <- mergePairs(
  dadaFs, filtFs,                        # 正向结果和文件
  dadaRs, filtRs,                        # 反向结果和文件
  verbose = TRUE                         # 显示详情
)

# ===== 构建ASV表 =====
seqtab <- makeSequenceTable(mergers)     # 序列×样本矩阵
dim(seqtab)                              # 查看维度(样本数 × ASV数)
table(nchar(getSequences(seqtab)))       # 查看ASV长度分布

# ===== 去除嵌合体 =====
seqtab.nochim <- removeBimeraDenovo(
  seqtab,                               # 输入ASV表
  method = "consensus",                  # 共识方法
  multithread = TRUE,                    # 多线程
  verbose = TRUE                         # 显示进度
)
sum(seqtab.nochim) / sum(seqtab)         # 嵌合体去除后保留比例

第三步:物种鉴定(分类学注释)

白话解释: 把ASV序列和参考数据库比对,找到最接近的已知物种。eDNA分析常用BLAST方法,因为通用分类器(如naive Bayes)主要针对细菌优化。

# ===== 方法1:DADA2内置的assignTaxonomy(适合16S/18S)=====
taxa <- assignTaxonomy(
  seqtab.nochim,                         # ASV序列表
  "/db/MIDORI2_NB_12S.fasta.gz",         # 参考数据库(如MIDORI2的12S)
  multithread = TRUE                     # 多线程
)

# ===== 方法2:BLAST比对(eDNA推荐)=====
# 先导出ASV序列
library(Biostrings)                      # 序列处理包
asv_seqs <- DNAStringSet(getSequences(seqtab.nochim))  # 获取ASV序列
names(asv_seqs) <- paste0("ASV_", seq_along(asv_seqs))  # 命名
writeXStringSet(asv_seqs, "ASV_sequences.fasta")  # 写入FASTA文件
# BLAST比对
blastn \                                 # 核酸BLAST
  -query ASV_sequences.fasta \           # 输入ASV序列
  -db /db/nt \                           # NCBI nt数据库
  -out blast_results.txt \               # 输出结果
  -outfmt "6 qseqid sseqid pident length evalue stitle" \  # 格式化输出
  -max_target_seqs 5 \                   # 每个ASV最多5个匹配
  -evalue 1e-10 \                        # E值阈值
  -num_threads 16                        # 16线程

# 也可以用BOLD数据库(动物条形码专用)
# 在线:https://www.boldsystems.org/index.php/IDS_OpenIdEngine

第四步:生态学分析

白话解释: 鉴定出物种后,进行生态学分析——哪些站点物种最丰富?不同环境的物种组成有什么差异?

library(phyloseq)                        # 微生物/eDNA生态分析
library(vegan)                           # 群落生态学
library(ggplot2)                         # 可视化

# 创建phyloseq对象
ps <- phyloseq(
  otu_table(seqtab.nochim, taxa_are_rows = FALSE),  # ASV丰度表
  tax_table(taxa),                       # 分类信息
  sample_data(metadata)                  # 样本元数据(站点、环境因子等)
)

# Alpha多样性
plot_richness(
  ps,                                    # phyloseq对象
  x = "Site",                            # x轴:采样站点
  measures = c("Observed", "Shannon"),   # 观测到的物种数和Shannon指数
  color = "Season"                       # 按季节着色
)

# Beta多样性(物种组成差异)
ord <- ordinate(ps, method = "NMDS", distance = "bray")  # NMDS排序
plot_ordination(
  ps, ord,                               # 数据和排序结果
  color = "Site",                        # 按站点着色
  shape = "Season"                       # 按季节标记
) + geom_point(size = 3)                 # 散点大小

# PERMANOVA:检验组间差异是否显著
adonis2(
  distance(ps, method = "bray") ~        # Bray-Curtis距离
    Site * Season,                       # 站点×季节交互效应
  data = as(sample_data(ps), "data.frame"),  # 元数据
  permutations = 999                     # 置换次数
)

# 物种检出热图
plot_heatmap(
  ps,                                    # phyloseq对象
  taxa.label = "Species",                # 物种标签
  sample.label = "Site"                  # 样本标签
)

常见报错与解决

报错原因解决方案
DADA2: Error learning error rates质量分数分布异常检查测序平台,某些平台质量分数不适合DADA2
mergePairs: 0 reads merged正反向reads没有重叠检查truncLen设置,保留足够重叠区(≥20bp)
BLAST: no hits数据库不包含目标物种换用专门数据库(如MIDORI2 for 12S,BOLD for COI)
phyloseq: sample names mismatch样本名格式不一致统一样本命名格式
嵌合体比例过高(>30%)PCR条件不佳优化PCR周期数(减少到25-30个循环)
物种注释率低marker或数据库选择不当12S用MIDORI2/MitoFish,COI用BOLD

速查表

# ========== eDNA Metabarcoding速查 ==========

# DADA2核心流程(R)
out <- filterAndTrim(fnFs, filtFs, fnRs, filtRs, truncLen=c(200,160))
errF <- learnErrors(filtFs, multithread=TRUE)
dadaFs <- dada(filtFs, err=errF, multithread=TRUE)
mergers <- mergePairs(dadaFs, filtFs, dadaRs, filtRs)
seqtab <- makeSequenceTable(mergers)
seqtab.nochim <- removeBimeraDenovo(seqtab)
taxa <- assignTaxonomy(seqtab.nochim, ref_db)

# 物种鉴定(命令行)
blastn -query ASV.fasta -db nt -out results.txt -outfmt 6 -evalue 1e-10

# 常用参考数据库
# 12S(鱼): MIDORI2, MitoFish
# COI(动物): BOLD, MIDORI2
# ITS(真菌): UNITE
# 18S(真核): SILVA, PR2

面试高频问题

Q1: eDNA metabarcoding和传统物种调查有什么优势?

优势:(1) 非侵入性,不需要捕获/杀伤动物;(2) 高灵敏度,能检测到稀有/隐蔽物种;(3) 高通量,一次检测几十到几百个物种;(4) 标准化采样,减少人为偏差。局限:(1) 不能区分活的和死的生物体;(2) DNA降解影响检测窗口(水中DNA半衰期约1-2周);(3) PCR偏好性可能影响物种定量。

Q2: ASV和OTU有什么区别?eDNA该选哪个?

OTU按97%相似度聚类,ASV保留单碱基差异。ASV更精确、可重复、可跨研究比较。但对于eDNA中的某些长marker(如COI),研究表明OTU可能恢复更多物种多样性。一般推荐先用ASV(DADA2),如果效果不好再试OTU。

Q3: eDNA分析中最容易出现什么问题?

(1) 污染!——采样器具、实验室环境的DNA污染会产生假阳性,必须设置空白对照(field blank + extraction blank + PCR blank);(2) 标记基因选择——不同marker对不同类群的检测效率差异大;(3) 参考数据库不全——很多物种还没有barcode序列,导致无法注释。

Q4: DADA2和OBITools有什么区别?

DADA2使用统计错误模型进行去噪,生成ASV,适合各种扩增子数据。OBITools是最早专为非细菌metabarcoding设计的工具,使用独特的去噪方法(obiclean)。DADA2在R中运行,生态更完善;OBITools是Python/C++命令行工具。目前DADA2更主流,但OBITools的某些功能(如引物匹配过滤)很实用。

Q5: eDNA能做定量分析吗?

理论上ASV的reads数与物种生物量有一定相关性,但受到很多因素干扰:(1) PCR扩增偏好性(引物对不同物种的扩增效率不同);(2) DNA脱落率因物种而异;(3) DNA降解速率受温度pH等影响。因此eDNA主要用于"有/无"检测,定量需要非常谨慎地设计实验和内标(spike-in)校正。