R : PCOA

发布时间 2023-05-25 22:31:19作者: 王哲MGG_AI

library(vegan)
library(tidyverse)
pairwise.adonis1 <-function(x,factors,p.adjust.m)
{
x = x %>% as.matrix()
co = as.matrix(combn(unique(factors),2))
pairs = c()
F.Model =c()
R2 = c()
p.value = c()
for(elem in 1:ncol(co)){
ad = adonis(x[factors %in%c(as.character(co[1,elem]),as.character(co[2,elem])),factors %in%c(as.character(co[1,elem]),as.character(co[2,elem]))] ~
factors[factors %in%c(as.character(co[1,elem]),as.character(co[2,elem]))] ,permutations = 999);
pairs =c(pairs,paste(co[1,elem],'vs',co[2,elem]));
F.Model =c(F.Model,ad$aov.tab[1,4]);
R2 = c(R2,ad$aov.tab[1,5]);
p.value = c(p.value,ad$aov.tab[1,6])
}
p.adjusted =p.adjust(p.value,method=p.adjust.m)
pairw.res = data.frame(pairs,F.Model,R2,p.value,p.adjusted)
return(pairw.res)
}
setwd("D:\\Desktop")

#---导入数据
#otu =read.csv("./otu.csv",row.names = 1) %>% t() %>% as.data.frame()
otu =read.table("./OTU_table.txt",row.names = 1,sep = "\t",header=T) %>% as.data.frame()
head(otu)

#map = read.csv("./map.csv")
map = read.table("./metadata3-1.txt", sep = "\t",header=T)
head(map)
colnames(map)[1] = "ID"
row.names(map) = map$ID

idx = rownames(map) %in% colnames(otu)
map1 = map[idx,]
map1
otu = otu[,rownames(map1)]
head(otu)


bray_curtis =vegan:: vegdist(t(otu),method = "bray", na.rm=TRUE)

pcoa <- otu %>%
t() %>%
vegan:: vegdist(method = "bray", na.rm=TRUE) %>%
cmdscale(k=2, eig=T) ###数据矩阵的多维尺度

points <- pcoa$points %>% as.data.frame() %>%
# as.tibble() %>%
dplyr::rename(.,x = "V1",y = "V2" )
head(points)

eig = pcoa$eig
eig
points = cbind(points, map1[match(rownames(points), map1$ID), ])
ado = adonis(bray_curtis~ map1$Group,permutations = 999,method="bray")
a = round(as.data.frame(ado$aov.tab[5])[1,1],3)
R2 <- paste("adonis:R ",a, sep = "")
b = as.data.frame(ado$aov.tab[6])[1,1]
p_v = paste("p: ",b, sep = "")
title = paste(R2," ",p_v, sep = "")
title
# anosim.result<-anosim(bray_curtis, map1$Group,permutations = 999)
# summary(anosim.result)

pair_bray_adonis = pairwise.adonis1(bray_curtis,map1$Group, p.adjust.m= "bonferroni")
head(pair_bray_adonis)

library("ggalt")
library(car)
library(ggforce)


n = 0.85
p1 <- ggplot(points, aes(x=x, y=y, fill = Group)) +
geom_point(alpha=.7, size=5, pch = 21) +
scale_shape_manual(values=points$Group)+scale_fill_manual(values=c("#E41A1C","#E6A429","#44AC41","#377EB8","#B055B0"))+ ##底色设置
scale_color_manual(values=c("#BD3C29","#0172B6","#E18727","#44AC41","#B055B0"))+
labs(x=paste("PCoA 1 (", format(100 * eig[1] / sum(eig), digits=4), "%)", sep=""),y=paste("PCoA 2 (", format(100 * eig[2] / sum(eig), digits=4), "%)", sep=""),title=title) +
geom_mark_ellipse(aes(x=x * n, y=y * n,fill=Group,label=Group),alpha=0.1,color="grey",linetype = 3) + theme_bw()+
theme(panel.grid.major=element_blank(),panel.grid.minor=element_blank())+
theme(axis.text = element_text(color = "black",size =9))

p1


library(ggpubr)
library(patchwork)
tab2 <- ggtexttable(pair_bray_adonis, rows = NULL)

p2 = p1 | tab2
p2

##############################################################################################################

这段R语言代码主要用于分析生态数据的差异和相似性。以下是代码的主要步骤和功能:

  1. 导入所需的R包(vegan、tidyverse等)。
  2. 定义了一个名为pairwise.adonis1的函数,用于执行多个配对的adonis分析,并计算F模型值、R方和p值。函数中使用了adonis函数来执行adonis分析。
  3. 设置工作目录,读取并导入数据文件(OTU表和元数据表)。
  4. 对OTU表进行初步处理,保留与元数据匹配的样本。
  5. 计算样本间的Bray-Curtis距离矩阵。
  6. 对Bray-Curtis距离矩阵进行PCoA分析,提取前两个主坐标轴的值。
  7. 将PCoA结果与元数据合并,用于后续的可视化和统计分析。
  8. 使用adonis函数执行整体的adonis分析,并计算R方和p值。
  9. 进行配对的adonis分析,计算配对间的F模型值、R方、p值,并进行多重检验校正。
  10. 使用ggplot2包进行PCoA的可视化,根据元数据中的分组信息对样本进行着色,并绘制群落组成的椭圆。
  11. 使用ggtexttable函数将配对的adonis结果以表格形式展示。
  12. 使用patchwork包将PCoA图和配对的adonis结果表格合并为一个图形。

###############################################################################################################

library(vegan)
library(tidyverse)

这两行代码用于加载所需的R包(vegan和tidyverse)。

pairwise.adonis1 <- function(x, factors, p.adjust.m) {
x = x %>% as.matrix()
co = as.matrix(combn(unique(factors), 2))
pairs = c()
F.Model = c()
R2 = c()
p.value = c()
for (elem in 1:ncol(co)) {
ad = adonis(x[factors %in% c(as.character(co[1, elem]), as.character(co[2, elem]))],
factors %in% c(as.character(co[1, elem]), as.character(co[2, elem]))] ~
factors[factors %in% c(as.character(co[1, elem]), as.character(co[2, elem]))],
permutations = 999)
pairs = c(pairs, paste(co[1, elem], 'vs', co[2, elem]))
F.Model = c(F.Model, ad$aov.tab[1, 4])
R2 = c(R2, ad$aov.tab[1, 5])
p.value = c(p.value, ad$aov.tab[1, 6])
}
p.adjusted = p.adjust(p.value, method = p.adjust.m)
pairw.res = data.frame(pairs, F.Model, R2, p.value, p.adjusted)
return(pairw.res)
}

这段代码定义了一个名为pairwise.adonis1的函数,用于执行多个配对的adonis分析。函数中的循环用于逐对比较不同组合之间的差异,并计算F模型值、R方和p值。

setwd("D:\\Desktop")

这行代码用于设置工作目录,即设置当前R会话的工作路径。

otu = read.table("./OTU_table.txt", row.names = 1, sep = "\t", header = T) %>% as.data.frame()
head(otu)

这段代码读取名为"OTU_table.txt"的文件,并将其存储在名为otu的数据框中。然后使用head()函数显示otu的前几行数据。

map = read.table("./metadata3-1.txt", sep = "\t", header = T)
head(map)
colnames(map)[1] = "ID"
row.names(map) = map$ID

这段代码读取名为"metadata3-1.txt"的文件,并将其存储在名为map的数据框中。然后,对map的列名进行重命名,将第一列的名称更改为"ID"。最后,将map的行名设置为map$ID列的值。

idx = rownames(map) %in% colnames(otu)
map1 = map[idx, ]
map1
otu = otu[, rownames(map1)]
head(otu)

这段代码用于保留与map数据框中的样本ID匹配的otu数据框的列。首先,将mapotu的行名进行匹配,并将匹配结果存储在idx中。然后,使用idxmap中选择相应的行,并将结果存储在map1中。最后,根据map1中的样本ID选择相应的列,更新otu数据框。

bray_curtis = vegan::vegdist(t(otu), method = "bray", na.rm = TRUE)

这行代码计算基于Bray-Curtis距离的样本间的距离矩阵,使用的是vegan包中的vegdist函数。

pcoa <- otu %>%
t() %>%
vegan::vegdist(method = "bray", na.rm = TRUE) %>%
cmdscale(k = 2, eig = T)

这行代码执行基于Bray-Curtis距离的PCoA(Principal Coordinates Analysis)分析,计算前两个主坐标轴的值。首先,对otu进行转置,然后使用vegan包中的vegdist函数计算Bray-Curtis距离矩阵。最后,使用cmdscale函数进行主坐标分析,并指定保留的主坐标轴数量为2。

points <- pcoa$points %>%
as.data.frame() %>%
dplyr::rename(., x = "V1", y = "V2")
head(points)

这段代码将PCoA结果中的坐标值存储在名为points的数据框中。首先,将pcoa$points转换为数据框,然后使用rename函数将第一列和第二列的列名更改为"x"和"y"。

eig = pcoa$eig
eig

这段代码将PCoA分析中计算的特征值(eigenvalues)存储在名为eig的向量中,并显示特征值的值。

points = cbind(points, map1[match(rownames(points), map1$ID), ])

这行代码将points数据框与map1数据框进行合并,根据样本ID进行匹配。使用match函数找到points数据框中的行名在map1$ID列中的对应索引,然后根据索引选择相应的行,并将结果与points数据框合并。

 

ado = adonis(bray_curtis ~ map1$Group, permutations = 999, method = "bray")
a = round(as.data.frame(ado$aov.tab[5])[1, 1], 3)
R2 <- paste("adonis:R ", a, sep = "")
b = as.data.frame(ado$aov.tab[6])[1, 1]
p_v = paste("p: ", b, sep = "")
title = paste(R2, " ", p_v, sep = "")
title

这段代码执行adonis分析,基于Bray-Curtis距离矩阵和map1$Group的分组信息。结果存储在ado中。然后,提取adonis结果中的R方值和p值,并将其格式化为字符串。最后,将R方和p值合并为标题字符串title

pair_bray_adonis = pairwise.adonis1(bray_curtis, map1$Group, p.adjust.m = "bonferroni")
head(pair_bray_adonis)

这段代码使用之前定义的pairwise.adonis1函数执行多个配对的adonis分析,比较不同组合之间的差异。结果存储在pair_bray_adonis中,并使用head函数显示前几行结果。

library("ggalt")
library(car)
library(ggforce)

这几行代码用于加载额外的R包(ggalt、car和ggforce)。

 

n = 0.85
p1 <- ggplot(points, aes(x = x, y = y, fill = Group)) +
geom_point(alpha = .7, size = 5, pch = 21) +
scale_shape_manual(values = points$Group) +
scale_fill_manual(values = c("#E41A1C", "#E6A429", "#44AC41", "#377EB8", "#B055B0")) +
scale_color_manual(values = c("#BD3C29", "#0172B6", "#E18727", "#44AC41", "#B055B0")) +
labs(x = paste("PCoA 1 (", format(100 * eig[1] / sum(eig), digits = 4), "%)", sep = ""),
y = paste("PCoA 2 (", format(100 * eig[2] / sum(eig), digits = 4), "%)", sep = ""),
title = title) +
geom_mark_ellipse(aes(x = x * n, y = y * n, fill = Group, label = Group),
alpha = 0.1, color = "grey", linetype = 3) +
theme_bw() +
theme(panel.grid.major = element_blank(), panel.grid.minor = element_blank()) +
theme(axis.text = element_text(color = "black", size = 9))
p1

这段代码使用ggplot2包创建一个散点图,并使用PCoA分析的结果绘制样本点。aes函数定义了xy坐标以及颜色填充变量Groupgeom_point函数用于绘制散点,scale_shape_manualscale_fill_manual函数用于设置点的形状和填充颜色。labs函数用于设置坐标轴标签和图形标题。geom_mark_ellipse函数用于绘制标记的椭圆,表示每个组的聚类范围。theme函数用于设置图形的样式和主题。

library(ggpubr)
p = ggarrange(p1, ncol = 1, nrow = 1)
p

这段代码使用ggpubr包中的ggarrange函数将图形p1放置在一个图形面板中,并将其显示出来。

这段R代码的主要目的是执行多个配对的adonis分析,并根据结果绘制PCoA图以可视化样本间的差异。图中的点表示不同样本,颜色表示不同组别,椭圆表示每个组的聚类范围。图形的标题显示了adonis分析的结果,包括R方和p值。