距离矩阵与排序分析
一句话概述:距离矩阵量化样本间的差异(β多样性),排序分析(PCoA/NMDS/RDA/CCA)将高维距离矩阵降维到2-3维进行可视化,是微生物组和群落生态学数据分析的核心方法。
核心知识点速查表
| 概念 | 说明 |
|---|
| β多样性 | 样本间的群落差异(白话:两个样本的微生物组有多不同) |
| 距离矩阵 | n×n矩阵,每个元素是两个样本间的距离 |
| Bray-Curtis | 基于丰度的距离(最常用于微生物组) |
| UniFrac | 考虑系统发育关系的距离(需要进化树) |
| Aitchison | 组成数据的标准距离(CLR后的欧氏距离) |
| PCoA | 主坐标分析,基于距离矩阵的降维 |
| NMDS | 非度量多维标度,保持排序关系的降维 |
| RDA/CCA | 约束排序,考虑环境变量的排序 |
一、距离度量选择
| 距离 | 特点 | 适用场景 |
|---|
| Bray-Curtis | 考虑丰度差异 | 微生物组(最常用) |
| Jaccard | 只看有无(0/1) | 物种组成比较 |
| Weighted UniFrac | 考虑系统发育+丰度 | 16S数据 |
| Unweighted UniFrac | 考虑系统发育+有无 | 16S数据 |
| Aitchison | 组成数据标准距离 | CoDA方法学者推荐 |
| Euclidean | 欧氏距离 | CLR转换后的数据 |
# === 计算距离矩阵 ===
library(vegan)
# Bray-Curtis距离
bc_dist <- vegdist(otu_table, method="bray") # Bray-Curtis
# Jaccard距离
jac_dist <- vegdist(otu_table, method="jaccard") # Jaccard
# Aitchison距离(推荐用于组成数据)
library(compositions)
otu_clr <- clr(otu_table + 0.5) # CLR转换
ait_dist <- dist(otu_clr) # 欧氏距离=Aitchison距离
二、排序分析
# === PCoA(主坐标分析) ===
library(vegan)
library(ggplot2)
pcoa_result <- cmdscale(bc_dist, k=2, eig=TRUE) # PCoA降维
eig_percent <- pcoa_result$eig / sum(pcoa_result$eig) * 100 # 解释方差
# 可视化
df_pcoa <- data.frame(
PC1 = pcoa_result$points[,1],
PC2 = pcoa_result$points[,2],
Group = metadata$group
)
ggplot(df_pcoa, aes(PC1, PC2, color=Group)) +
geom_point(size=3) +
stat_ellipse(level=0.95) + # 95%置信椭圆
labs(x=paste0("PCoA1 (", round(eig_percent[1],1), "%)"),
y=paste0("PCoA2 (", round(eig_percent[2],1), "%)")) +
theme_minimal()
# === NMDS(非度量多维标度) ===
nmds <- metaMDS(otu_table, distance="bray", k=2) # NMDS
stressplot(nmds) # 应力图(stress<0.2可接受)
cat("Stress:", nmds$stress, "\n") # stress值
# 可视化
plot(nmds, type="n")
points(nmds, display="sites", col=as.numeric(metadata$group), pch=16)
legend("topright", levels(metadata$group), col=1:2, pch=16)
# === RDA(冗余分析,约束排序) ===
rda_result <- rda(
otu_clr ~ Age + BMI + Diet, # 响应 ~ 环境变量
data = metadata
)
summary(rda_result)
# 显著性检验
anova(rda_result, permutations=999) # 全局检验
anova(rda_result, by="terms", permutations=999) # 各变量检验
# 可视化
plot(rda_result, scaling=2) # Type II scaling
三、面试高频考点
Q1: PCoA和PCA的区别?
- PCA:直接对原始数据降维,使用欧氏距离
- PCoA:对距离矩阵降维,可使用任意距离度量
- PCoA更灵活,适合微生物组(可用Bray-Curtis/UniFrac)
- 当距离=欧氏时,PCoA=PCA
Q2: NMDS的stress值怎么解读?
- stress < 0.05:优秀
- stress < 0.1:良好
- stress < 0.2:可接受
- stress > 0.2:不可靠,需增加维度
Q3: 约束排序(RDA/CCA) vs 非约束排序(PCA/PCoA/NMDS)?
| 非约束排序 | 约束排序 |
|---|
| 目的 | 展示整体模式 | 展示环境变量解释的模式 |
| 输入 | 仅物种数据 | 物种+环境变量 |
| 适用 | 探索性分析 | 假设检验 |
| 白话 | 看总体长什么样 | 看哪些因素驱动差异 |
速查表
# === 排序分析速查 ===
library(vegan)
# 距离矩阵
vegdist(otu, "bray") # Bray-Curtis
vegdist(otu, "jaccard") # Jaccard
# 非约束排序
cmdscale(dist, k=2, eig=TRUE) # PCoA
metaMDS(otu, "bray", k=2) # NMDS
# 约束排序
rda(otu ~ env1+env2, data=meta) # RDA(线性响应)
cca(otu ~ env1+env2, data=meta) # CCA(单峰响应)
# 统计检验
adonis2(dist ~ group, data=meta) # PERMANOVA
betadisper(dist, group) # 组间方差齐性