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
)
面试常问点
- 为什么菌群数据要用CLR转换? 相对丰度是成分数据(和为1),Spearman相关会产生虚假负相关,CLR消除这个约束
- sPLS和CCA的区别? sPLS有稀疏惩罚(自动特征选择),CCA不做特征选择
- 如何解读 Module Eigengene? 是模块内所有基因表达的第一主成分,代表整个模块的"代表性表达量"
- 多重检验如何处理? 用
p.adjust(method="BH") 做 Benjamini-Hochberg FDR 校正
速查表
| 方法 | 包 | 适用场景 |
|---|
| sPLS | mixOmics | 找两组学的关联特征对 |
| WGCNA + 相关 | WGCNA + vegan | 模块级别的菌-基因关联 |
| MOFA+ | MOFA2 | 多组学联合因子分析(>2组学) |
| Mendelian Randomization | TwoSampleMR | 因果推断(需GWAS数据) |