微生物组数据清洗实战:Decontam+SCRUB+FEAST全流程解析
在微生物组研究中,数据质量直接影响后续分析的可靠性。测序过程中引入的污染物、试剂背景噪音以及样本间交叉污染,可能导致结果偏差甚至错误结论。本文将带你完整走通从原始数据到清洁数据的全流程,结合Decontam、SCRUB和FEAST三大工具,构建一套可复用的污染校正工作流。
1. 环境准备与数据导入
1.1 工具安装与依赖配置
首先确保R环境(建议4.0+版本)和RStudio已就绪。这三个工具分别来自Bioconductor、GitHub和CRAN,安装方式略有差异:
# Decontam安装(Bioconductor) if (!requireNamespace("BiocManager", quietly = TRUE)) install.packages("BiocManager") BiocManager::install("decontam") # SCRUB安装(GitHub) install.packages(c('glmnet', 'torch', 'tidyverse')) devtools::install_github("shenhav-and-korem-labs/SCRuB") # FEAST安装(GitHub) Packages <- c("Rcpp", "RcppArmadillo", "vegan", "dplyr") install.packages(Packages) devtools::install_github("cozygene/FEAST")注意:torch安装可能需要额外系统依赖,Linux用户需提前配置libtorch
1.2 数据结构标准化
微生物组数据通常以OTU表(物种丰度)和样本元数据表形式存在。推荐使用phyloseq对象统一管理:
library(phyloseq) library(tidyverse) # 读取CSV格式的OTU表和元数据 otu <- read.csv("otu_table.csv", row.names=1) # 行名为OTU,列名为样本 meta <- read.csv("metadata.csv", row.names=1) # 行名需与OTU表列名一致 # 转换为phyloseq对象 ps <- phyloseq( otu_table(otu, taxa_are_rows=TRUE), sample_data(meta) )关键数据结构要求:
- OTU表:数值矩阵,不含分类信息
- 元数据:必须包含样本类型标识(如Control/Sample)
- 阴性对照:建议至少3个技术重复
2. 基于Decontam的污染物识别
2.1 阴性对照质量评估
正式分析前,先检查阴性对照的测序深度是否合理:
library(ggplot2) df <- data.frame( LibrarySize = sample_sums(ps), SampleType = sample_data(ps)$Sample_or_Control ) ggplot(df, aes(x=reorder(rownames(df), LibrarySize), y=LibrarySize, color=SampleType)) + geom_point() + theme_minimal()理想情况下,阴性对照的文库大小应明显小于真实样本(通常低1-2个数量级)。如果出现阴性对照与样本文库大小重叠,可能需要重新评估实验流程。
2.2 污染物判定与过滤
Decontam提供两种算法选择:
- 频率法(frequency):基于污染物在低生物量样本中相对丰度更高
- 流行率法(prevalence):利用污染物在阴性对照中出现频率更高
# 标记阴性对照样本 sample_data(ps)$is.neg <- sample_data(ps)$Sample_or_Control == "Control" # 使用流行率法(推荐有多个阴性对照时使用) contam <- isContaminant( ps, method="prevalence", neg="is.neg", threshold=0.5 ) # 查看污染物统计 table(contam$contaminant) # TRUE为污染物 # 过滤污染物 ps.noncontam <- prune_taxa(!contam$contaminant, ps)参数选择经验:
threshold:通常0.1-0.5,值越小筛选越严格batch参数:适用于多批次实验设计detailed=TRUE:获取每个OTU的详细统计量
3. SCRUB校正样本间污染
3.1 原理与参数理解
SCRUB(Source Correction for Removing Unwanted Borrowing)专门解决样本间交叉污染问题,其核心优势在于:
- 同时考虑技术重复和样本类型信息
- 采用概率模型估计污染比例
- 保留低丰度但真实的生物学信号
关键输入参数:
metadata_column:指定样本分组列control_samples:阴性对照样本名向量batch_column:可选批次信息
3.2 实际操作示例
library(SCRuB) # 准备输入数据(需转换为数据框) otu_df <- as.data.frame(otu_table(ps.noncontam)) meta_df <- as.data.frame(sample_data(ps.noncontam)) # 运行SCRUB scrub_res <- SCRUB( otu_df, meta_df, control_samples = rownames(meta_df)[meta_df$Sample_or_Control=="Control"], metadata_column = "SampleType" ) # 获取校正后的OTU表 otu_scrub <- scrub_res$corrected_abundances典型输出解读:
contamination_proportions:各样本的估计污染比例corrected_abundances:校正后的丰度矩阵contaminant_sources:污染物主要来源分析
提示:SCRUB计算量较大,大数据集建议在服务器运行
4. FEAST溯源分析
4.1 群落来源解析原理
FEAST(Fast Expectation-maximization for microbial Source Tracking)通过EM算法量化不同来源对目标样本的贡献度。在污染分析场景中,可用于:
- 量化阴性对照对样本的污染贡献
- 识别主要污染来源样本
- 验证清洗效果
4.2 实施步骤与可视化
library(FEAST) # 准备输入数据(需要指定源样本和目标样本) sources <- rownames(meta)[meta$SampleType == "Control"] # 以阴性对照为源 targets <- rownames(meta)[meta$SampleType == "Sample"] # 真实样本为目标 # 运行FEAST feast_res <- FEAST( t(otu_scrub), # 需要转置为样本×OTU sources = sources, targets = targets, env = meta$SampleType # 分组信息 ) # 结果可视化 plot_contribution(feast_res$contribution, metadata = meta, group = "SampleType")关键输出:
contribution:各源对目标的贡献矩阵p_value:来源显著性imputation:估算的潜在来源
5. 流程整合与自动化
将上述步骤整合为可复用的工作流:
# 定义完整清洗函数 clean_microbiome <- function(otu_path, meta_path, output_dir) { # 1. 数据加载 ps <- create_phyloseq(otu_path, meta_path) # 2. Decontam过滤 ps <- run_decontam(ps, method="prevalence") # 3. SCRUB校正 scrub_res <- run_scrub(ps) # 4. FEAST验证 feast_res <- run_feast(scrub_res$corrected) # 保存结果 save_results(scrub_res, feast_res, output_dir) } # 实际调用 clean_microbiome( "data/otu_table.csv", "data/metadata.csv", "results/cleaned" )常见问题处理:
- 阴性对照信号过强:检查实验环节,考虑增加过滤严格度
- SCRUB收敛失败:尝试减小
learning_rate参数 - FEAST结果不稳定:确保源样本数量足够(≥3)
经过这套流程处理后的数据,可显著提高下游α/β多样性分析、差异物种检测等结果的可靠性。在实际项目中,建议保存中间结果并记录每个步骤的过滤统计量,便于追溯和复现分析过程。