查看原文
其他

基于R语言的微生物群落组成多样性分析——共线性网络分析

王志山 科研后花园 2023-09-08


引言



     之前有一位粉丝后台留言说能不能出一期有关于共线性网络的文章,说实话,小编之前只在文献中看到过这类图,对于其原理也是迷迷糊糊。看了好多别人写的文章,根据大佬们的思路,我也大致整理了一些代码,希望能对大家有所启发。话不多说,直接上正文吧!



正文——代码
1

前期准备





1)设置工作环境

rm(list=ls())#clear Global Environmentsetwd('D:\\桌面\\共线性网络分析')#设置工作路径

2)加载包

#安装包install.packages('Hmisc')install.packages("igraph")#加载包library(Hmisc)library(igraph)


2

加载、预处理数据





1)加载数据

df1 <- read.table(file="otu.txt",sep="\t",header=T,check.names=FALSE,row.names = 1)head(df1)


2)求相对丰度

df2 <- apply(df1,2,function(x) x/sum(x))

3)过滤低丰度OTU

df3 <- df2[which(rowSums(df2) >= 0.01), ]#将丰度小于0.01的舍弃

3

数据计算





1)计算OTU间的相关性

df_corr <- rcorr(t(df3), type = 'spearman')#这里我们计算spearman相关系数

2)#提取R值、P值并校正P值

df_corr_r = df_corr$rdf_corr_p = df_corr$P#注意,这里P大写# 使用BH法校正p值df_p <- p.adjust(df_corr_p, method = 'BH')

3)确定物种间存在相互作用关系的阈值,将相关性R矩阵内不符合的数据转换为0

df_corr_r[df_corr_p>0.05|abs(df_corr_r)<0.6] = 0

4)构建igraph对象

df_igraph <- graph_from_adjacency_matrix(df_corr_r,mode="undirected",weighted=TRUE,diag=FALSE)

5)提取权重

这里是权重提取,可以下载源码查看plot(df_igraph,main="Co-occurrence network",vertex.frame.color=NA,vertex.label=NA,edge.width=1, vertex.size=5,edge.lty=1,edge.curved=TRUE,margin=c(0,0,0,0))


4

简单绘图





# 设定随机种子数,后续出图都从同一随机种子数出发,保证前后出图形状相对应set.seed(12)plot(df_igraph,main="Co-occurrence network",vertex.frame.color=NA,vertex.label=NA,edge.width=1, vertex.size=5,edge.lty=1,edge.curved=TRUE,margin=c(0,0,0,0))




5

个性化绘图





1)相关性颜色设置

# 如果构建网络时,weighted=NULL,此步骤不能统计sum(df_weight>0)sum(df_weight<0)# 通过V()和E()对节点和边的属性进行访问# 设置线的颜色,正相关为红色,负相关为蓝色df_edge_color = ifelse(df_weight>0, "red",ifelse(df_weight<0, "blue","grey"))E(df_igraph)$color = as.character(df_edge_color)# 设定边的宽度,这里我们将相关系数与边宽进行关联E(df_igraph)$width = abs(df_weight)*2.5

2)加入OTU丰度信息,使得节点大小代表丰度

data <- rowSums(df1)data1=as.data.frame(data)df_igraph_size = data1[V(df_igraph)$name,] # 筛选对应OTU属性df_igraph_size2 = log10(df_igraph_size)#数据进行转换V(df_igraph)$size = df_igraph_size2

3)节点颜色设置成OTU代表的门

data2=read.table(file="phylum_otu.txt",sep="\t",header=T, check.names=FALSE,row.names = 1)df_igraph_col = data2[V(df_igraph)$name,]df_igraph_col2=as.factor(df_igraph_col)levels(df_igraph_col2)color=c("green","brown","pink")levels(df_igraph_col2) = color # 直接修改levles可以使得值全部对应替换V(df_igraph)$color = as.character(df_igraph_col2)

4)绘图

set.seed(12)plot(df_igraph,main="Co-occurrence network",vertex.frame.color=NA, edge.lty=1,edge.curved=TRUE,margin=c(0,0,0,0), vertex.label.cex=.7,vertex.label.dist=1,#标签大小 layout=layout_in_circle#控制样式,具体见官方文档 )

5)添加图例

legend(x=-1.7,y=-0.7,levels(as.factor(df_igraph_col)),pch=21,col="black",pt.bg=color)

注:图中节点间的连线颜色代表OTU间的相关性,红色为正相关,蓝色为负相关,粗细代表相关性大小;节点大小代表丰度大小;节点颜色代表OTU的物种信息(门水平)



参考

1)https://blog.csdn.net/woodcorpse/article/details/78737867
2)https://igraph.org/r/doc/layout_as_bipartite.html

源码及数据在后台回复“共线性网络图”获取!!!



看不懂代码的,这里推荐几个可以在线做网络图的网站:

1)图图云(http://www.cloudtutu.com/)

2)ChiPot(https://www.chiplot.online/)

3)派森诺基因云(https://www.genescloud.cn/)


欢迎大家点赞、转发并点亮在看,让更多朋友看到!!!


您可能也对以下帖子感兴趣

文章有问题?点此查看未经处理的缓存