【R】微生物网络构建简单方法汇总

偶然发现一本书:

里面刚好有微生物网络分析的内容,我就当个搬运工把代码整理了一下(注:书籍和示例数据在公众号PLANTOMIX后台回复“微生物组分析”即可获取下载链接噢):

library(ggraph)
library(vegan)
library(MCL)
library(tidyverse)
library(qgraph)
library(SpiecEasi)
library(ggnet)

# load OTU table
load('../data/data.OTU.RData')

data.otu = data.otu[,seq(1,90,3)]
colnames(data.otu) = paste('S',1:ncol(data.otu), sep = '')
# 基于相异度的网络(Dissimilarity-Based Network)
diss.mat = vegan::vegdist(t(data.otu),
                           method = 'bray') %>%
        as.matrix()

diss.cutoff = 0.6 # 设置阈值
diss.adj = ifelse(diss.mat <= diss.cutoff, 1, 0)

# 从邻接矩阵中构建网络
diss.net = graph.adjacency(diss.adj,
                           mode = 'undirected',
                           diag = FALSE)

# 基于相关性的网络
cor.matrix = cor(diss.mat,method = 'pearson')
cor.cutoff = 0.3
cor.adj = ifelse(abs(cor.matrix) >= cor.cutoff,1,0) # 相关性矩阵转换成二元邻接矩阵
cor.net = graph.adjacency(cor.adj,
                          mode = 'undirected',
                          diag = FALSE)

build.cor.net =function(MB, method, num_perms, sig_level){

        taxa =dim(MB)[2]
        MB.mat =array(0, dim = c(taxa, taxa, num_perms + 1))
        # Perform permutation Constructing and Analyzing Microbiome Networks in R 251
        MBperm =permatswap(MB, "quasiswap", times = num_perms)
        # Convert to relative abundance
        MB.relative =MB / rowSums(MB)
        MB.mat[,,1]<-as.matrix(cor(MB.relative,method=method))
        for(p in 2:num_perms) {
                MBperm.relative=MBperm$perm[[p-1]] / rowSums(MBperm$perm[[p-1]])
                MB.mat[, , p] =as.matrix(cor(MBperm.relative, 
                                               method=method))
        }
        # Get p-values
        pvals=sapply(1:taxa,
                       function(i) sapply(1:taxa, function(j)
                               sum(MB.mat[i, j, 1]> MB.mat[i, j, 2:num_perms])))
        pvals=pvals / num_perms
        # p-value correction
        pvals_BH=array(p.adjust(pvals, method = "BH"),
                         dim=c(nrow(pvals), ncol(pvals)))
        # Build adjacency matrix
        adj.mat=ifelse(pvals_BH>= (1 - sig_level), 1, 0)
        # Add names to rows & cols
        rownames(adj.mat)=colnames(MB)
        colnames(adj.mat)=colnames(MB)
        # Build and return the network
        graph<-graph.adjacency(adj.mat,
                               mode="undirected",
                               diag=FALSE)
}

cor.net.2 = build.cor.net(as.matrix(data.otu), # 此处矩阵要求输入的是整数,小数会报错
                          method = 'pearson',
                          num_perms = 999,
                          sig_level = 0.01)

# Graphical Model Networks
ebic.cor = cor_auto(data.otu) # extended Bayesian information criterion
ebic.graph = EBICglasso(ebic.cor,
                        ncol(data.otu),
                        0.5)
ebic.qgnet = qgraph(ebic.graph,
                    DoNotPlot = FALSE) # build network
ebic.net = as.igraph(ebic.qgnet,
                     attributes=T) # convert to igraph

# local false discovery rate network
fdr.cor = cor_auto(data.otu)
fdr.graph = FDRnetwork(fdr.cor,
                       cutoff = 0.01,
                       method = 'pval')
fdr.qgnet = qgraph(fdr.graph, DoNotPlot = T)
fdr.net = as.igraph(fdr.qgnet)

# SparCC and SPIEC-EASI Networks
sparcc.matrix = sparcc(data.otu)
sparcc.cutoff = 0.3
sparcc.adj = ifelse(abs(sparcc.matrix$Cor) >= sparcc.cutoff,
                    1,0)
rownames(sparcc.adj) = colnames(data.otu)
colnames(sparcc.adj) = colnames(data.otu)

sparcc.net = graph.adjacency(sparcc.adj,
                             mode = 'undirected',
                             diag = FALSE)

# SPIEC-EASI network
spieceasi.matrix = spiec.easi(as.matrix(data.otu),
                              method = 'glasso',
                              lambda.min.ratio = 1e-2,
                              nlambda = 20,
                              icov.select.params = list(rep.num = 50))
rownames(spieceasi.matrix[["refit"]][["stars"]]) = colnames(data.otu)

spieceasi.net = graph.adjacency(spieceasi.matrix[["refit"]][["stars"]],
                                mode = 'undirected',
                                diag = FALSE)

# hub decetion
net = sparcc.net
net.cn = closeness(net)
net.bn = betweenness(net)
net.pr = page_rank(net)$vector
net.hs = hub_score(net)$vector

net.hs.sort = sort(net.hs, decreasing = T)
net.hs.top5 = head(net.hs.sort, 5)

# cluster decetion
wt = walktrap.community(net)
ml = multilevel.community(net)
membership(wt)
adj = as_adjacency_matrix(net)
mc = mcl(adj, addLoops = TRUE)

compare(membership(wt), membership(ml))
compare(membership(wt), mc$Cluster)
expected.cls =sample(1:5, vcount(net), replace = T) %>%
        as_membership
compare(expected.cls, membership(wt))
plot_dendrogram(wt)

modularity(net, membership(wt))

# Network Simulation
num.nodes = 50
regular.net = k.regular.game(num.nodes, k = 4)
random.net = erdos.renyi.game(num.nodes, p = 0.037)
smallworld.net = sample_smallworld(dim = 1, num.nodes, nei =
                                            2, p = 0.2)
scalefree.net = barabasi.game(num.nodes)

# 网络可视化
net = diss.net
wt = walktrap.community(net)

layout =  c(layout.fruchterman.reingold,
            layout_as_tree,
            layout_nicely,
            layout_on_sphere)

plot.igraph(net,
            vertex.size = 10,
            vertex.label = NA,
            edge.curved = T,
            edge.size = 1,
            layout = layout.fruchterman.reingold)

# 带聚类
ceb = cluster_edge_betweenness(net)
dendPlot(ceb, mode="hclust")
plot(ceb, net)

# 导出网络
#将网络图导出为"graphml"、"gml"格式,方便导入Gephi等软件中使用
#支持的格式有"edgelist", "pajek", "ncol", "lgl"
#"graphml", "dimacs", "gml", "dot", "leda"
write_graph(net, "../figures/g1.graphml", format="graphml")
write_graph(net, "../figures/g1.gephi", format="gml")
write_graph(net, '../figures/net.txt', format = 'edgelist')

大概图形是这样的:

我的 Cytoscape 和 Gephi 都罢工了,无法进行网络图绘制,大家自行尝试一下噢!

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 204,684评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 87,143评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 151,214评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,788评论 1 277
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,796评论 5 368
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,665评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,027评论 3 399
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,679评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 41,346评论 1 299
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,664评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,766评论 1 331
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,412评论 4 321
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,015评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,974评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,203评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,073评论 2 350
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,501评论 2 343