跳转至

372_微生物组宿主转录组联合


一句话说明

把"肠道里有什么菌"和"宿主细胞在表达哪些基因"两张表合起来找关联,叫微生物组-宿主转录组联合分析。


核心知识点

要点1:为什么要联合分析

  • 菌群可以通过代谢产物(短链脂肪酸、胆汁酸)调控宿主基因表达
  • 单独看菌群或转录组都只有"一半答案"
  • 联合分析揭示菌-宿主通路级别的互作机制

要点2:数据层次与整合策略

层次数据类型工具
相关性OTU丰度 × 基因表达Spearman/WGCNA
联合降维两矩阵同时降维MOFA+, sPLS
因果推断菌→宿主基因Mendelian Randomization
通路整合菌功能通路 × 宿主通路HUMAnN3 + GSEA

要点3:稀疏偏最小二乘(sPLS)

  • mixOmics包的 spls() 函数
  • 同时从两个数据集中提取潜在成分(Latent Components)
  • 自动特征选择:只保留与另一组学最相关的特征

要点4:WGCNA 联合分析思路

  • 先构建宿主基因共表达网络(WGCNA)→ 识别基因模块
  • 再将模块特征基因(Module Eigengene)与菌群丰度做相关分析
  • 找到"某个基因模块由哪些菌群驱动"

要点5:常见统计陷阱

  • 成分数据问题:菌群相对丰度之和=1,需先做 CLR 转换再相关
  • 多重检验:几千个菌×几万个基因的配对,必须用 FDR 校正
  • 混杂因素:宿主年龄、BMI、用药会同时影响菌群和转录组

实战代码

sPLS 联合分析(R,mixOmics)

library(mixOmics)   # 多组学整合分析包
library(compositions)  # CLR转换

# 加载数据
microbiome <- read.csv("otu_relative.csv", row.names = 1)  # 样本×OTU
transcriptome <- read.csv("gene_expression.csv", row.names = 1)  # 样本×基因

# 步骤1:菌群数据 CLR 转换(消除成分数据约束)
microbiome_clr <- as.data.frame(clr(microbiome + 0.5))  # +0.5 处理零值

# 步骤2:转录组数据标准化
transcriptome_scaled <- scale(transcriptome)   # Z-score标准化

# 步骤3:sPLS 联合降维
spls_result <- spls(
  X = microbiome_clr,        # 自变量:菌群矩阵(样本×OTU)
  Y = transcriptome_scaled,  # 因变量:转录组矩阵(样本×基因)
  ncomp = 3,                 # 提取3个潜在成分
  keepX = c(10, 10, 10),     # 每个成分保留X侧10个特征(菌)
  keepY = c(20, 20, 20)      # 每个成分保留Y侧20个特征(基因)
)

# 查看关联图
plotVar(spls_result,
  comp = 1,           # 查看第1个潜在成分
  var.names = TRUE,   # 显示变量名
  cex = c(0.8, 0.6)  # 调整字体大小
)

# 提取关键特征对
selected_micro <- selectVar(spls_result, comp = 1)$X$name  # 选出的关键菌
selected_gene  <- selectVar(spls_result, comp = 1)$Y$name  # 选出的关键基因
cat("关键菌:", selected_micro, "\n")
cat("关键基因:", selected_gene, "\n")

WGCNA + 菌群相关分析

library(WGCNA)     # 加权基因共表达网络分析
library(vegan)     # 用于 CLR 转换

# 步骤1:WGCNA 构建基因模块
enableWGCNAThreads(4)   # 开启多线程

# 自动软阈值选择
powers <- c(1:20)
sft <- pickSoftThreshold(transcriptome_scaled, powerVector = powers,
                         networkType = "signed")
soft_power <- sft$powerEstimate   # 自动选择的软阈值

# 一步法构建网络(适合初学者)
net <- blockwiseModules(
  transcriptome_scaled,
  power = soft_power,
  TOMType = "signed",          # 有符号TOM(保留表达方向)
  minModuleSize = 30,          # 最小模块基因数
  mergeCutHeight = 0.25,       # 模块合并阈值
  numericLabels = FALSE,       # 用颜色命名模块
  verbose = 3
)

# 提取模块特征基因(Module Eigengene)
MEs <- moduleEigengenes(transcriptome_scaled, net$colors)$eigengenes

# 步骤2:模块特征基因 × 菌群丰度相关分析
microbiome_clr <- as.data.frame(clr(microbiome + 0.5))
cor_result <- cor(MEs, microbiome_clr, method = "spearman")  # Spearman相关

# 可视化热图
library(pheatmap)
pheatmap(cor_result,
  main = "基因模块-菌群相关热图",
  fontsize_row = 8,
  fontsize_col = 6
)

面试常问点

  1. 为什么菌群数据要用CLR转换? 相对丰度是成分数据(和为1),Spearman相关会产生虚假负相关,CLR消除这个约束
  2. sPLS和CCA的区别? sPLS有稀疏惩罚(自动特征选择),CCA不做特征选择
  3. 如何解读 Module Eigengene? 是模块内所有基因表达的第一主成分,代表整个模块的"代表性表达量"
  4. 多重检验如何处理?p.adjust(method="BH") 做 Benjamini-Hochberg FDR 校正

速查表

方法适用场景
sPLSmixOmics找两组学的关联特征对
WGCNA + 相关WGCNA + vegan模块级别的菌-基因关联
MOFA+MOFA2多组学联合因子分析(>2组学)
Mendelian RandomizationTwoSampleMR因果推断(需GWAS数据)