跳转至

距离矩阵与排序分析

一句话概述:距离矩阵量化样本间的差异(β多样性),排序分析(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)            # 组间方差齐性