零膨胀模型微生物组
一句话概述:微生物组数据中存在大量零值(某些物种在部分样本中未检测到),零膨胀模型(Zero-Inflated Models)区分"真零"(物种确实不存在)和"假零"(存在但未检测到),比普通计数模型更适合微生物组数据分析。
核心知识点速查表
| 概念 | 说明 |
|---|
| 零膨胀 | 数据中零值比期望的多得多(白话:很多物种"缺席") |
| 真零 | 物种确实不存在(结构零) |
| 假零 | 物种存在但测序未检出(采样零/技术零) |
| ZIP | Zero-Inflated Poisson,零膨胀泊松 |
| ZINB | Zero-Inflated Negative Binomial,零膨胀负二项(最常用) |
| Hurdle模型 | 两部分模型:①是否存在 ②存在时的丰度 |
| 过度离散 | 方差>均值,微生物计数数据的常见特征 |
一、模型选择
计数数据建模选择流程:
├── 方差=均值? → Poisson回归
├── 方差>均值(过度离散)? → 负二项回归(NB)
├── 零值过多?
│ ├── 区分真零和假零? → 零膨胀模型(ZIP/ZINB)
│ └── 不区分? → Hurdle模型
└── 纵向/重复测量? → 加随机效应 → ZINB-GLMM
二、R语言实操
# === 零膨胀负二项模型(最常用) ===
library(pscl)
# 数据: 微生物OTU计数
# abundance: 某物种的reads数(含大量0)
# group: 疾病/健康分组
# age, bmi: 协变量
# 查看零值比例
cat("零值比例:", mean(data$abundance == 0), "\n") # 通常>50%
# 零膨胀负二项模型
zinb_model <- zeroinfl(
abundance ~ group + age + bmi | # 计数部分: 影响丰度的因素
group + age, # 零膨胀部分: 影响是否存在的因素
data = data,
dist = "negbin" # 负二项分布(处理过度离散)
)
summary(zinb_model)
# 结果解读:
# Count model coefficients: 影响非零丰度的因素
# Zero-inflation model coefficients: 影响"额外零"概率的因素
# === Hurdle模型 ===
library(pscl)
hurdle_model <- hurdle(
abundance ~ group + age + bmi | # 计数部分(非零样本的丰度)
group + age, # 二值部分(是否为零)
data = data,
dist = "negbin" # 负二项分布
)
summary(hurdle_model)
# 模型比较
AIC(zinb_model) # ZINB的AIC
AIC(hurdle_model) # Hurdle的AIC
# AIC越小越好
# === 使用glmmTMB处理纵向数据 ===
library(glmmTMB)
# 零膨胀负二项混合模型(纵向微生物组)
zinb_mixed <- glmmTMB(
abundance ~ group * timepoint + age + # 固定效应
(1 | subject), # 随机效应
ziformula = ~ group + timepoint, # 零膨胀部分
family = nbinom2, # 负二项分布
data = longitudinal_data
)
summary(zinb_mixed)
三、面试高频考点
Q1: 为什么微生物组数据有这么多零?
- 真零:该样本中物种确实不存在
- 测序深度不够:物种存在但丰度太低未检出
- DNA提取偏差:某些物种的DNA提取效率低
- 微生物组数据通常50-90%是零值
Q2: ZINB和Hurdle模型的区别?
| ZINB | Hurdle |
|---|
| 零的来源 | 区分"真零"+"假零" | 不区分,只分"零"和"非零" |
| 适用场景 | 理论上零有两种来源 | 只关心是否存在和丰度 |
| 白话 | 学生没来上课可能是请假(真)也可能是逃课(假) | 只管有没有来 |
速查表
# === 零膨胀模型速查 ===
library(pscl)
# ZINB
zeroinfl(y ~ x1+x2 | z1+z2, dist="negbin", data=df)
# Hurdle
hurdle(y ~ x1+x2 | z1+z2, dist="negbin", data=df)
# 纵向数据
library(glmmTMB)
glmmTMB(y ~ x*time + (1|id), ziformula=~x, family=nbinom2, data=df)
# 模型比较: AIC(model1) vs AIC(model2)
# 判断零膨胀: vuong(zinb_model, nb_model) 检验