跳转至

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 ProjectNIH参考人群~5,000

Meta-analysis专用工具

  • MMUPHin(R): 微生物组meta-analysis专用包
  • metafor(R): 通用meta-analysis引擎
  • curatedMetagenomicData(R/Bioconductor): 标准化公开数据
  • MaAsLin2: 多变量关联分析(支持random effects)