跳转至

组成数据分析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: 零值怎么处理?

  1. 加伪计数:最简单,但影响结果。常用0.5或1
  2. 贝叶斯估计:ALDEx2用Dirichlet先验采样
  3. 零替代:如cmultRepl()函数
  4. 建模零:零膨胀模型直接处理

速查表

# === 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后的欧氏距离