组成数据分析CoDA方法
一句话概述:微生物组数据是组成数据(compositional data),各物种的相对丰度总和为常数(如100%),直接使用标准统计方法会产生虚假相关。CoDA方法通过对数比转换(CLR/ILR/ALR)解决这个问题。
核心知识点速查表
| 概念 | 说明 |
|---|
| 组成数据 | 各成分相对丰度之和为常数(白话:蛋糕切块,总是100%) |
| 组成偏差 | 一个物种增加→其他物种看起来降低(假关系) |
| CLR转换 | Centered Log-Ratio,居中对数比(最常用) |
| ILR转换 | Isometric Log-Ratio,等距对数比(统计上最优) |
| ALR转换 | Additive Log-Ratio,相加对数比(需选参考) |
| ALDEx2 | 基于CLR的差异丰度分析工具 |
| 伪计数 | 处理零值的策略(加一个小数如0.5) |
一、为什么微生物组是组成数据?
# 测序数据的根本问题:
# 我们测量的是reads数(相对量),不是绝对丰度
# 示例:假设样本中有3个物种
# 真实绝对丰度: A=1000, B=500, C=500 (总=2000)
# 测序10000条reads后: A=5000, B=2500, C=2500
# 如果A增加到2000(真实变化):
# 真实: A=2000, B=500, C=500 (总=3000)
# 测序10000条reads: A=6667, B=1667, C=1667
# → B和C的reads数下降了,但真实丰度没变!
# → 这就是组成偏差(compositional bias)
二、对数比转换
# === CLR转换(最常用) ===
library(compositions)
# 输入: OTU丰度表(样本×物种)
otu <- read.csv("otu_table.csv", row.names=1)
# 处理零值(CLR不能处理零)
otu_nozero <- otu + 0.5 # 加伪计数0.5
# CLR转换
otu_clr <- clr(otu_nozero) # 居中对数比转换
# 公式: CLR(xi) = log(xi / geometric_mean(x))
# 每个值变成相对于几何均值的对数
# 手动实现CLR
clr_manual <- function(x) {
gm <- exp(mean(log(x))) # 几何均值
log(x / gm) # 对数比
}
# === ILR转换 ===
otu_ilr <- ilr(otu_nozero) # 等距对数比
# ILR的维度 = 原始维度-1
# 统计性质最优(正交、等距),但解释性较差
# === ALR转换 ===
otu_alr <- alr(otu_nozero, ivar=1) # 相加对数比
# 以第1个物种为参考
# 简单但结果依赖参考物种的选择
三、CoDA差异分析
# === ALDEx2差异分析 ===
library(ALDEx2)
# 输入: 原始计数矩阵(物种×样本)+ 分组向量
conditions <- c(rep("Healthy", 50), rep("Disease", 50)) # 分组
# ALDEx2分析
aldex_result <- aldex(
reads = as.data.frame(t(otu)), # 物种×样本矩阵
conditions = conditions, # 分组
mc.samples = 128, # Monte Carlo采样次数
test = "t", # t检验
effect = TRUE, # 计算效应量
include.sample.summary = FALSE
)
# 查看结果
head(aldex_result)
# we.ep: Welch's t检验p值
# we.eBH: BH校正后的p值
# effect: 效应量(>1显著)
# overlap: 重叠度(<0.01显著)
# 火山图
aldex.plot(aldex_result, type="MW", test="welch") # MA图
四、面试高频考点
Q1: 为什么不能直接对相对丰度做统计分析?
- 相对丰度是组成数据,总和恒为1(或100%)
- 各成分之间不独立,一个增加其他必然减少
- 直接做相关分析会产生虚假负相关
- 白话:班级成绩用百分比排名时,一个人升了,其他人排名自动降
Q2: CLR、ILR、ALR怎么选?
| 方法 | 优点 | 缺点 | 适用场景 |
|---|
| CLR | 简单直观,维度不变 | 存在共线性 | 可视化、探索分析 |
| ILR | 统计性质最优 | 解释困难 | 正式统计检验 |
| ALR | 最简单 | 依赖参考选择 | 有明确参考物种时 |
Q3: 零值怎么处理?
- 加伪计数:最简单,但影响结果。常用0.5或1
- 贝叶斯估计:ALDEx2用Dirichlet先验采样
- 零替代:如cmultRepl()函数
- 建模零:零膨胀模型直接处理
速查表
# === CoDA分析速查 ===
library(compositions)
clr(otu + 0.5) # CLR转换
ilr(otu + 0.5) # ILR转换
library(ALDEx2)
aldex(reads, conditions, test="t") # ALDEx2差异分析
# 2025推荐方案:
# 差异分析: ALDEx2 > ANCOM-BC > MaAsLin2 (CLR)
# 相关分析: SparCC (组成数据专用相关) > propr
# 距离: Aitchison距离 = CLR后的欧氏距离