环境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)校正。