跳转至

指示种分析IndVal

一句话概述:指示种分析(Indicator Value Analysis, IndVal)用于鉴定与特定环境或分组条件显著关联的物种,结合忠诚度(该物种出现在该组的频率)和专一性(该物种在该组中的相对丰度),是微生物组生物标志物筛选的经典方法。

核心知识点速查表

概念说明
IndValIndicator Value,指示值(0-1,越接近1越是好的指示种)
忠诚度(Fidelity)该物种在目标组中出现的频率(白话:是否经常出现在该组)
专一性(Specificity)该物种的丰度集中在目标组的程度(白话:是否只在该组丰度高)
指示种IndVal高且显著的物种,是该组的"代表物种"

一、R语言实操

# === 指示种分析 ===
library(indicspecies)

# 输入: OTU丰度表 + 分组向量
# otu_table: 样本×物种的丰度矩阵
# group: 分组向量(如"Healthy"/"Disease")

result <- multipatt(
  otu_table,                         # 物种丰度矩阵
  cluster = metadata$group,          # 分组向量
  func = "IndVal.g",                  # 使用IndVal.g方法(群组版)
  control = how(nperm=999)           # 999次置换检验
)

# 查看结果
summary(result, indvalcomp=TRUE)     # 显示完整结果(含A和B分量)
# A = 专一性(Specificity): 该物种丰度集中在该组的程度
# B = 忠诚度(Fidelity): 该物种在该组样本中出现的频率
# IndVal = sqrt(A × B): 综合指示值
# p.value: 置换检验p值

# 提取显著指示种
sig_species <- result$sign[result$sign$p.value < 0.05, ]
sig_species <- sig_species[order(-sig_species$stat), ]   # 按IndVal排序
head(sig_species, 20)                                     # 前20个指示种
# === 可视化 ===
library(ggplot2)

# 提取显著指示种的详细信息
sig_detail <- data.frame(
  Species = rownames(sig_species),
  IndVal = sig_species$stat,
  Group = apply(sig_species[, 1:ncol(sig_species)-2], 1,
                function(x) names(x)[which(x==1)]),     # 所属组
  p_value = sig_species$p.value
)

ggplot(sig_detail[1:20,], aes(x=reorder(Species, IndVal),
                                y=IndVal, fill=Group)) +
  geom_bar(stat="identity") +
  coord_flip() +
  labs(x="Species", y="Indicator Value", title="Top 20 Indicator Species") +
  theme_minimal()

二、面试高频考点

Q1: IndVal怎么理解?

  • 完美指示种(IndVal=1):该物种只在某一组中出现,且在该组的所有样本中都有
  • A=1, B=0.5: 该物种丰度完全集中在某组,但只出现在该组一半的样本中
  • A=0.5, B=1: 该物种出现在某组所有样本中,但在其他组也有不少
  • 白话:好的指示种 = 只在那里出现(专一) + 每次都出现(忠诚)

Q2: IndVal vs LEfSe vs DESeq2?

方法优点缺点
IndVal生态学理论基础,同时考虑频率和丰度不处理组成偏差
LEfSe简单直观,考虑效应量假阳性率高(2025基准测试)
ALDEx2处理组成偏差,可重复性高保守,可能漏掉弱信号

速查表

# === 指示种分析速查 ===
library(indicspecies)
result <- multipatt(otu_table, group, func="IndVal.g", control=how(nperm=999))
summary(result, indvalcomp=TRUE)
# IndVal = sqrt(Specificity × Fidelity), p < 0.05为显著指示种