指示种分析IndVal
一句话概述:指示种分析(Indicator Value Analysis, IndVal)用于鉴定与特定环境或分组条件显著关联的物种,结合忠诚度(该物种出现在该组的频率)和专一性(该物种在该组中的相对丰度),是微生物组生物标志物筛选的经典方法。
核心知识点速查表
| 概念 | 说明 |
|---|
| IndVal | Indicator 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为显著指示种