170_群体宏基因组分析¶
一句话概述¶
大队列宏基因组meta-analysis通过标准化处理流程、批次效应校正和效应量合并(random-effects meta-analysis)整合来自多个研究的宏基因组数据,提高统计力并发现可复现的微生物-疾病关联。
核心知识点总览¶
| 知识点 | 说明 |
|---|---|
| Meta-analysis | 系统整合多个独立研究的统计方法 |
| 标准化处理 | 对所有队列使用统一的分析流程 |
| 批次校正 | 消除研究间的技术差异(ComBat等) |
| 效应量合并 | Random-effects model合并各研究的效应 |
| 异质性检验 | I²统计量评估研究间异质性 |
| 跨队列验证 | LOSO(Leave-One-Study-Out)交叉验证 |
| 混杂因素 | 地理、饮食、药物等需要校正 |
| 大队列资源 | curatedMetagenomicData、GMrepo |
各步骤详解¶
第一步:群体宏基因组整合的必要性¶
白话解释: 单个研究通常样本量有限(50-200人),发现的微生物-疾病关联可能是偶然的。通过整合全球多个研究(如合并5个T2D队列共2000人),可以:(1) 显著提高统计力;(2) 发现在多个人群中可复现的关联(而非某个队列的artifact);(3) 检测地理和技术差异对结果的影响。
第二步:标准化数据处理¶
代码示例:
# === 使用统一流程处理所有队列的原始数据 ===
# 推荐: MetaPhlAn4 + HUMAnN3
for cohort in Study_A Study_B Study_C Study_D; do
for sample in $(ls ${cohort}/fastq/*.fq.gz | sed 's/_[12].fq.gz//' | sort -u); do
# MetaPhlAn4物种分类
metaphlan ${sample}_1.fq.gz,${sample}_2.fq.gz \
--bowtie2out ${sample}.bt2.bz2 \
--input_type fastq \
--nproc 8 \
-o ${cohort}/profiles/$(basename ${sample})_profile.txt
# HUMAnN3功能分析
humann --input ${sample}_1.fq.gz \
--output ${cohort}/humann/ \
--threads 8 \
--metaphlan-options "--bowtie2db /db/metaphlan"
done
# 合并该队列的所有profile
merge_metaphlan_tables.py ${cohort}/profiles/*_profile.txt \
> ${cohort}/merged_abundance.tsv
done
# === 使用curatedMetagenomicData获取已处理数据 ===
library(curatedMetagenomicData)
# 查询可用的T2D数据集
available_studies <- sampleMetadata %>%
filter(disease == "T2D") %>%
select(study_name, body_site, number_reads) %>%
distinct(study_name)
# 下载多个队列
datasets <- curatedMetagenomicData(
c("QinJ_2012.relative_abundance",
"KarlssonFH_2013.relative_abundance",
"LiJ_2017.relative_abundance"),
dryrun = FALSE
)
# 合并为统一格式
library(TreeSummarizedExperiment)
merged_data <- mergeData(datasets)
第三步:批次效应诊断和校正¶
代码示例:
library(vegan)
library(ggplot2)
# === 诊断批次效应 ===
# PCoA/PERMANOVA检测研究是否是主要变异来源
abundance_matrix <- assay(merged_data) # taxa × samples
metadata <- colData(merged_data)
# Bray-Curtis距离
bc_dist <- vegdist(t(abundance_matrix), method = "bray")
# PERMANOVA: 疾病 vs 研究
adonis_result <- adonis2(bc_dist ~ disease + study_name + age + BMI,
data = as.data.frame(metadata),
permutations = 999)
print(adonis_result)
# 如果study_name解释的方差远大于disease → 批次效应严重
# PCoA可视化
pcoa_res <- cmdscale(bc_dist, k = 2)
plot_df <- data.frame(PC1 = pcoa_res[,1], PC2 = pcoa_res[,2],
Study = metadata$study_name,
Disease = metadata$disease)
ggplot(plot_df, aes(x = PC1, y = PC2, color = Study, shape = Disease)) +
geom_point(alpha = 0.7) +
theme_minimal() +
labs(title = "PCoA - Before Batch Correction")
# === 批次校正方法 ===
# 方法1: ComBat (适合连续数据如CLR转换后)
library(sva)
abundance_clr <- compositions::clr(t(abundance_matrix + 0.5))
batch <- metadata$study_name
condition <- metadata$disease
combat_corrected <- ComBat(
dat = t(abundance_clr),
batch = batch,
mod = model.matrix(~ condition)
)
# 方法2: MMUPHin (专为微生物组meta-analysis)
library(MMUPHin)
fit_adjust <- adjust_batch(
feature_abd = abundance_matrix,
batch = "study_name",
covariates = "disease",
data = as.data.frame(metadata)
)
adjusted_abundance <- fit_adjust$feature_abd_adj
# 方法3: 不做批次校正, 在每个研究内分析后合并效应量
# (最保守, 避免校正引入artifact)
第四步:Meta-analysis效应量合并¶
代码示例:
library(meta)
library(metafor)
# === 按研究分别做差异丰度分析 ===
# 对每个研究独立运行DA分析
study_results <- list()
for (study in unique(metadata$study_name)) {
study_data <- abundance_matrix[, metadata$study_name == study]
study_meta <- metadata[metadata$study_name == study, ]
# 使用Wilcoxon/ALDEx2/等做DA分析
# 提取每个taxa的效应量(log2FC)和标准误
results <- run_da_analysis(study_data, study_meta$disease)
results$study <- study
study_results[[study]] <- results
}
all_results <- do.call(rbind, study_results)
# === Random-effects meta-analysis ===
taxa_list <- unique(all_results$taxon)
meta_results <- data.frame()
for (taxon in taxa_list) {
taxon_data <- all_results[all_results$taxon == taxon, ]
if (nrow(taxon_data) >= 3) { # 至少3个研究
# Random-effects model
meta_fit <- rma(yi = taxon_data$log2FC,
sei = taxon_data$SE,
method = "REML")
meta_results <- rbind(meta_results, data.frame(
taxon = taxon,
overall_effect = meta_fit$beta[1],
se = meta_fit$se,
pvalue = meta_fit$pval,
I2 = meta_fit$I2, # 异质性
n_studies = nrow(taxon_data)
))
}
}
# FDR校正
meta_results$qvalue <- p.adjust(meta_results$pvalue, method = "BH")
sig_taxa <- meta_results[meta_results$qvalue < 0.05, ]
print(paste("显著差异taxa:", nrow(sig_taxa)))
# === 森林图可视化 ===
# 对top taxa绘制森林图
top_taxon <- sig_taxa$taxon[1]
taxon_data <- all_results[all_results$taxon == top_taxon, ]
forest_meta <- metagen(
TE = taxon_data$log2FC,
seTE = taxon_data$SE,
studlab = taxon_data$study,
sm = "MD"
)
forest(forest_meta, main = top_taxon)
第五步:LOSO交叉验证¶
代码示例:
# === Leave-One-Study-Out验证 ===
# 每次留出一个研究作为验证集,其余做训练
studies <- unique(metadata$study_name)
loso_results <- list()
for (held_out in studies) {
# 训练集
train_idx <- metadata$study_name != held_out
train_data <- abundance_matrix[, train_idx]
train_labels <- metadata$disease[train_idx]
# 测试集
test_idx <- metadata$study_name == held_out
test_data <- abundance_matrix[, test_idx]
test_labels <- metadata$disease[test_idx]
# 训练分类器
library(randomForest)
rf_model <- randomForest(x = t(train_data), y = factor(train_labels), ntree = 500)
# 预测
predictions <- predict(rf_model, t(test_data), type = "prob")[, "T2D"]
auc <- pROC::auc(test_labels, predictions)
loso_results[[held_out]] <- data.frame(
study = held_out,
AUC = as.numeric(auc),
n_test = sum(test_idx)
)
}
loso_df <- do.call(rbind, loso_results)
cat(sprintf("LOSO平均AUC: %.3f ± %.3f\n", mean(loso_df$AUC), sd(loso_df$AUC)))
实战命令¶
# === 群体宏基因组meta-analysis流程 ===
# 1. 统一处理所有队列
for cohort in A B C D; do
metaphlan --input_type fastq -o ${cohort}_profile.txt ${cohort}_reads.fq.gz
done
# 2. R分析
Rscript meta_analysis.R --studies "A,B,C,D" --output results/
面试常问点¶
Q1:为什么不能直接合并多个研究的OTU表做分析?¶
A: (1) 不同研究使用不同的16S区域(V3-V4 vs V4)、测序平台、DNA提取方法,直接合并会产生强烈的批次效应;(2) OTU定义不同(97%相似度阈值或不同的聚类方法)导致不可比;(3) 测序深度差异大;(4) 研究间的技术差异可能远大于生物学差异,掩盖真实信号。正确做法:从原始reads重新用统一流程处理,或使用效应量合并(不合并原始数据)。
Q2:Random-effects model在微生物组meta-analysis中的优势?¶
A: Random-effects model假设各研究估计的是不同(但相关)的真实效应——这符合微生物组的现实(不同人群的微生物-疾病关联确实可能不同)。与Fixed-effects相比:(1) 更保守,考虑了研究间异质性;(2) 置信区间更宽但更诚实;(3) 结果可推广到新人群。当I²>50%时(常见),fixed-effects model不适用。
Q3:I²统计量如何解释?¶
A: I²衡量研究间异质性占总变异的比例:I²=0%表示无异质性(效应完全一致);25%/50%/75%分别为低/中/高异质性。在微生物组meta-analysis中:(1) I²>50%很常见(因为不同人群/地理/饮食);(2) 高I²不意味着结果无效,但提示需要探索异质性来源;(3) 可做亚组分析(按地区/技术)或meta-regression寻找调节因素。
Q4:LOSO验证的目的是什么?¶
A: LOSO(Leave-One-Study-Out)模拟"新队列预测"的场景——训练模型时不看某个队列的数据,然后在该队列上测试。如果LOSO AUC仍然高(>0.7),说明发现的微生物标志物具有跨队列泛化能力。如果某个队列LOSO AUC特别低,提示该队列可能有独特的混杂因素或微生物特征差异。
Q5:如何处理大队列分析中的混杂因素?¶
A: 关键混杂因素:(1) 药物使用(二甲双胍改变肠道菌群,是T2D研究最大混杂);(2) 地理/饮食;(3) 年龄/BMI;(4) 测序技术。处理方法:(1) 在DA分析模型中纳入混杂因素为协变量;(2) 匹配设计(propensity score);(3) 分层分析(如分药物使用者/非使用者);(4) 敏感性分析(排除用药样本后结果是否成立)。
易错点¶
1. 不同队列的分类分辨率不一致¶
错误: 有的队列注释到种,有的只到属,混合分析。 正确做法: 统一到最粗的共同分辨率(通常是属或种),或从原始数据重新统一注释。
2. 批次校正过度¶
错误: ComBat校正后生物学信号也被去除。 正确做法: 校正模型中必须包含感兴趣的生物学变量(如疾病状态)作为保护变量。或使用更保守的方法(如效应量合并不校正原始数据)。
3. 不检查publication bias¶
错误: Meta-analysis不做漏斗图/Egger检验。 正确做法: 检查publication bias——如果只有阳性结果的研究被发表,meta-analysis结果会偏高。使用funnel plot和Egger's test检测。
4. 样本重叠¶
错误: 同一队列的样本出现在两个"独立"研究中。 正确做法: 仔细检查各研究的样本来源(SRA accession),排除重复样本。
补充知识¶
大型微生物组队列资源¶
| 资源 | 内容 | 样本量 |
|---|---|---|
| curatedMetagenomicData | 已处理的公开宏基因组 | ~20,000 |
| GMrepo | 人肠道宏基因组数据库 | ~60,000 |
| American Gut Project | 公民科学16S数据 | ~30,000 |
| Human Microbiome Project | NIH参考人群 | ~5,000 |
Meta-analysis专用工具¶
- MMUPHin(R): 微生物组meta-analysis专用包
- metafor(R): 通用meta-analysis引擎
- curatedMetagenomicData(R/Bioconductor): 标准化公开数据
- MaAsLin2: 多变量关联分析(支持random effects)