R实战 | 置换多元方差分析(以PCoA的PERMANOVA分析为例)

e9c46a77b5af14ba894df0039b8598bb.jpeg

adonis-cover

置换多元方差分析(Permutational multivariate analysis of variance,PERMANOVA),又称非参数多因素方差分析(nonparametric multivariate analysis of variance)、或者ADONIS分析。它利用距离矩阵(如欧式距离、Bray-Curtis距离)对总方差进行分解,分析不同分组因素或不同环境因子对样品差异的解释度,并使用「置换检验」对各个变量解释的统计学意义进行显著性分析。

一个例子

比如,对宏基因组检测的物种丰度数据进行PCA/NMDS/PCoA降维可视化后,不同组的样品之间存在一些重叠,那怎么判断这些组之间的样品构成是否存在显著差别呢?这就需要用到PERMANOVA检验了,检验不同组的样品中心点是否重叠。

d9de597e398ca7f685e61ce6a1636010.png
example
9df37981a3a75055637f60e55b243524.png 0ab0b31f8a4d7dfc70d2efe9f93c6f29.png

以上面的PCoA图为例,椭圆圈出的四组样品点正好对应四个海拔分组,这四组样品之间的群落差异是否显著呢?检验组间群落差异本质上是检验距离矩阵之间的差异,普通的ANOVA分析无能为力。而基于距离矩阵的PerMANOVA分析则表明,这四个分组两两之间差异是显著的(p<0.05)。

Rui J, Li J, Wang S, et al. Responses of Bacterial Communities to Simulated Climate Changes in Alpine Meadow Soil of the Qinghai-Tibet Plateau. Appl Environ Microbiol. 2015;81(17):6070-6077. doi:10.1128/AEM.00557-15

示例数据和代码领取

点赞在看 本文,分享至朋友圈集赞20个保留30分钟,截图发至微信mzbj0002领取。

「木舟笔记2022年度VIP可免费领取」

「注:」2022马上过去了,为了方便各位读者朋友,现推出木舟笔记永久VIP,售价169¥2022VIP仅需支付差价进行升级。木舟笔记永久VIP享本号所有资源(限定课程除外),后续不再推出VIP企划。

木舟笔记2022年度VIP企划

「权益:」

  1. 「2022」年度木舟笔记所有推文示例数据及代码(「在VIP群里实时更新」)。

    b6c549e9eb8905e7d02c83c992ed0b1d.png
    data+code
  2. 木舟笔记「科研交流群」

  3. 「半价」购买跟着Cell学作图系列合集(免费教程+代码领取)|跟着Cell学作图系列合集

「收费:」

「99¥/人」。可添加微信:mzbj0002 转账,或直接在文末打赏。

3df820fdad1861517894fe36e6933581.png

实战

PCoA

# Load package
library(vegan)
library(ggplot2)
library(ggthemes)
# Load data
otu <- read.table('otu.txt',row.names = 1,header = T)
group <- read.table('group.txt',header = T)
#pcoa
# vegdist函数,计算距离;method参数,选择距离类型
distance <- vegdist(otu, method = 'bray')
# 对加权距离进行PCoA分析
pcoa <- cmdscale(distance, k = (nrow(otu) - 1), eig = TRUE)
## plot data
# 提取样本点坐标
plot_data <- data.frame({pcoa$point})[1:2]

# 提取列名,便于后面操作。
plot_data$ID <- rownames(plot_data)
names(plot_data)[1:2] <- c('PCoA1', 'PCoA2')

# eig记录了PCoA排序结果中,主要排序轴的特征值(再除以特征值总和就是各轴的解释量)
eig = pcoa$eig

#为样本点坐标添加分组信息
plot_data <- merge(plot_data, group, by = 'ID', all.x = TRUE)
head(plot_data)

# 计算加权bray-curtis距离
dune_dist <- vegdist(otu, method="bray", binary=F)
dune_pcoa <- cmdscale(dune_dist, k=(nrow(otu) - 1), eig=T)

dune_pcoa_points <- as.data.frame(dune_pcoa$points)
sum_eig <- sum(dune_pcoa$eig)
eig_percent <- round(dune_pcoa$eig/sum_eig*100,1)

colnames(dune_pcoa_points) <- paste0("PCoA", 1:3)

dune_pcoa_result <- cbind(dune_pcoa_points, group)

head(dune_pcoa_result)
library(ggplot2)

ggplot(dune_pcoa_result, aes(x=PCoA1, y=PCoA2, fill=group)) +
  geom_point(shape = 21,color = 'black',size=4) +
  stat_ellipse(level=0.95)+
  scale_fill_manual(values = c('#73bbaf','#d15b64','#592c93'))+
  labs(x=paste("PCoA 1 (", eig_percent[1], "%)", sep=""),
       y=paste("PCoA 2 (", eig_percent[2], "%)", sep=""))  +
  theme_classic()
b83a0694f240c35406aba601830b24c7.png

PERMANOVA

# 基于bray-curtis距离进行计算
dune.div <- adonis2(otu ~ group, data = group, permutations = 999, method="bray")

dune.div
library(ggalt)
dune_adonis <- paste0("adonis R2: ",round(dune.div$R2,2), "; P-value: ", dune.div$`Pr(>F)`)

p <- ggplot(dune_pcoa_result, aes(x=PCoA1, y=PCoA2, fill=group)) +
  geom_point(shape = 21,color = 'black',size=4) +
  stat_ellipse(level=0.95)+
  scale_fill_manual(values = c('#73bbaf','#d15b64','#592c93'))+
  labs(x=paste("PCoA 1 (", eig_percent[1], "%)", sep=""),
       y=paste("PCoA 2 (", eig_percent[2], "%)", sep=""),
       title=dune_adonis)  +
  theme_classic()
p
88204c44f1f6aa19dd47031705165681.png
image-20221228004115608

配对Adonis

# 配对Adonis确定两两分组之间对物种组成差异的影响
#devtools::install_github("pmartinezarbizu/pairwiseAdonis/pairwiseAdonis")
library(pairwiseAdonis)
dune.pairwise.adonis <- pairwise.adonis(x=otu, factors=group$group, 
                                        sim.function = "vegdist",
                                        sim.method = "bray",
                                        p.adjust.m = "BH",
                                        reduce = NULL,
                                        perm = 999)

library(ggpubr)
library(patchwork)
tab2 <- ggtexttable(dune.pairwise.adonis[,c("pairs","R2","p.value","p.adjusted")], rows = NULL, 
                    theme = ttheme("blank")) %>% 
  tab_add_hline(at.row = 1:2, row.side = "top", linewidth = 1)  %>% 
  tab_add_hline(at.row = nrow(dune.pairwise.adonis)+1, row.side = "bottom", linewidth = 1)  

p + tab2  + plot_layout(design=c(area(1,1), area(2,1)))
77f5b84c81d9f598fbaa95bf03f29336.png

往期内容

  1. CNS图表复现|生信分析|R绘图 资源分享&讨论群!

  2. 这图怎么画| 有点复杂的散点图

  3. 这图怎么画 | 相关分析棒棒糖图

  4. 组学生信| Front Immunol |基于血清蛋白质组早期诊断标志筛选的简单套路

  5. (免费教程+代码领取)|跟着Cell学作图系列合集

  6. Q&A | 如何在论文中画出漂亮的插图?

  7. 跟着 Cell 学作图 | 桑葚图(ggalluvial)

  8. R实战 | Lasso回归模型建立及变量筛选

  9. 跟着 NC 学作图 | 互作网络图进阶(蛋白+富集通路)(Cytoscape)

  10. R实战 | 给聚类加个圈圈(ggunchull)

  11. R实战 | NGS数据时间序列分析(maSigPro)

  12. 跟着 Cell 学作图 | 韦恩图(ggVennDiagram)


cb3b060d5977f37dc20927ef3ac60a4c.png
木舟笔记矩阵
### 微生物相对丰度分析中的 PCoA置换多元方差分析 #### 使用 R 进行 PCoAPERMANOVA 的代码示 R 是一种强大的统计编程语言,在微生物组数据分析中广泛使用。以下是基于 `vegan` 包实现 PCoAPERMANOVA 的代码: ```r library(vegan) # 加载数据 data <- read.csv("microbiome_data.csv", row.names = 1) # 替换为实际文件名 metadata <- read.csv("metadata.csv") # 替换为实际元数据文件名 # 距离矩阵计算 (Bray-Curtis 或其他距离) distance_matrix <- vegdist(data, method = "bray") # 主坐标分析 (PCoA) pcoa_result <- cmdscale(distance_matrix, k = 2, eig = TRUE) # 可视化 PCoA 结果 plot(pcoa_result$points[, 1], pcoa_result$points[, 2], col = as.numeric(metadata$Group), # 根据分组着色 pch = 19, xlab = "PCoA1", ylab = "PCoA2", main = "Principal Coordinates Analysis (PCoA)") legend("topright", legend = levels(as.factor(metadata$Group)), fill = unique(col)) # 置换多元方差分析 (PERMANOVA) permanova_result <- adonis2(distance_matrix ~ metadata$Group, permutations = 999) print(permanova_result) ``` 上述代码展示了如何通过 `cmdscale()` 函数执行主坐标分析,并利用 `adonis2()` 函数完成置换多元方差分析[^1]。 --- #### 使用 Python 实现 PCoAPERMANOVA 的代码示 Python 中可以借助 `scikit-bio` 和 `statsmodels` 库来实现类似的分析过程: ```python import pandas as pd from skbio.stats.distance import permanova, pcoa from scipy.spatial.distance import braycurtis # 数据加载 data = pd.read_csv('microbiome_data.csv', index_col=0) # 替换为实际文件名 metadata = pd.read_csv('metadata.csv') # 替换为实际元数据文件名 # 计算 Bray-Curtis 距离矩阵 def pairwise_bray_curtis(matrix): samples = matrix.index.tolist() distance_matrix = [] for i in range(len(samples)): row_distances = [ braycurtis(matrix.loc[samples[i]], matrix.loc[samples[j]]) for j in range(i + 1)] distance_matrix.append(row_distances) return pd.DataFrame(distance_matrix, columns=samples[:-len(distance_matrix)-1:-1]) dm = pairwise_bray_curtis(data) # 执行 PCoA pcoa_results = pcoa(dm) fig = pcoa_results.plot( title="Principal Coordinates Analysis (PCoA)", axis_labels=["PCoA1", "PCoA2"], s=50, cmap='Set3', labels=list(metadata['Group'])) # PERMANOVA 分析 group_column_name = 'Group' # 替换为实际列名 permanova_results = permanova(dm, group_metadata=metadata[group_column_name]) print(permanova_results) ``` 以上代码实现了基于 `skbio` 的 PCoA 绘制以及 PERMANOVA 显著性检验。 --- ### 注意事项 - **输入数据格式**:确保输入的数据是以样本作为行、特征(OTU/ASV)作为列的表格形式。 - **标准化处理**:在进行距离矩阵计算之前,通常需要对原始计数数据进行标准化或转换(如 CLR 转换),以减少稀疏性和零膨胀的影响。 - **可视化优化**:可以通过调整颜色映射、形状标记等方式增强 PCoA 图表的表现力。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值