跳转至

零膨胀模型微生物组

一句话概述:微生物组数据中存在大量零值(某些物种在部分样本中未检测到),零膨胀模型(Zero-Inflated Models)区分"真零"(物种确实不存在)和"假零"(存在但未检测到),比普通计数模型更适合微生物组数据分析。

核心知识点速查表

概念说明
零膨胀数据中零值比期望的多得多(白话:很多物种"缺席")
真零物种确实不存在(结构零)
假零物种存在但测序未检出(采样零/技术零)
ZIPZero-Inflated Poisson,零膨胀泊松
ZINBZero-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: 为什么微生物组数据有这么多零?

  1. 真零:该样本中物种确实不存在
  2. 测序深度不够:物种存在但丰度太低未检出
  3. DNA提取偏差:某些物种的DNA提取效率低
  4. 微生物组数据通常50-90%是零值

Q2: ZINB和Hurdle模型的区别?

ZINBHurdle
零的来源区分"真零"+"假零"不区分,只分"零"和"非零"
适用场景理论上零有两种来源只关心是否存在和丰度
白话学生没来上课可能是请假(真)也可能是逃课(假)只管有没有来

速查表

# === 零膨胀模型速查 ===
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) 检验