一文學會網絡分析——Co-occurrence網絡圖在R中的實現

2021-01-20 宏基因組

撰文:陳亮 中科院微生物所

責編:劉永鑫 中科院遺傳發育所

網絡分析背景知識

近年來,隨著計算機技術的發展,網絡科學研究在社會網絡方面的分析方法已經成熟,從而促進了網絡分析方法向其他領域的滲透,例如:信號傳導網絡、神經網絡、代謝通路網絡、基因調控網絡、生態網絡等。

基於圖論(Graph theory)的網絡科學認為,任何非連續事物之間的關係都可以用網絡來表示,通過將網際網路內的電腦、社會關係中的個人、生物的基因等不同屬性的實體抽象為節點(Node),並用連接(Link)來展示實體之間的關係,通過量化以節點和連接為組件的網絡結構指數(Index),從而能夠在統一的框架下尋找複雜系統的共性。

目前生態學領域大家用到的網絡圖多為基於群落數據相關性構建的Co-occurrence網絡圖。此類網絡可以採用R中igraph包構建並實現出圖。當然,除此之外,還有一些非命令行的軟體,例如cytoscape,gephi,pajek等。但我認為,對於R使用者來說,通過R做圖還是最方便的。大致的流程如下圖所示:

1)根據觀察,實驗或者相關性推斷來確定物種間的聯繫。Co-occurrence網絡的構建多是基於相關性推斷來構建的。常用的相關性推斷方法有Pearson,Spearman, Sparcc等方法。

2)通過構建的相關性矩陣或者相互作用列表來構建igraph對象。常用的方法有以下三種,分別由graph_from_incidence_matrix,graph_from_adjacency_matrix,graph_from_edgelist三個函數獲得,詳細信息參照igraph官方幫助文檔。第一種數據格式是普通矩陣,矩陣中數字代表行列所代表的物種間存在聯繫,這種聯繫可通過實驗或觀察來得到。第二種數據格式是鄰接矩陣,物種間相關性計算得到的通常為此種形式。第三種為邊列表(edgelist),共兩列數據,分別代表網絡內的節點名稱,每一行代表這兩個節點間存在著聯繫。

3)計算網絡的各種參數,用以推斷網絡的性質。

常用網絡參數有:

平均路徑長度(Average path length):網絡中任意兩個節點之間的距離的平均值。其反映網絡中各個節點間的分離程度。現實網絡通常具有「小世界(Small-world)」特性。

聚集係數(Clustering coefficient):分局域聚類係數和全局聚集係數,是反映網絡中節點的緊密關係的參數,也稱為傳遞性。整個網絡的全局聚集係數C表徵了整個網絡的平均的「成簇性質」。

介數(Betweenness):網絡中不相鄰的節點i和j之間的通訊主要依賴於連接節點i和j的最短路徑。如果一個節點被許多最短路徑經過,則表明該節點在網絡中很重要。 經過節點n的數量所佔比例,介數反映了某節點在通過網絡進行信息傳輸中的重要性。

連接性 (Connectance): 網絡中物種之間實際發生的相互作用數之和(連接數之和)佔總的潛在相互作用數(連接數)的比例,可以反映網絡的複雜程度。

此外還包括:度分布(Degree distribution)、平均度(Average degree)、平均介數(Average betweenness)、平均最近鄰度(Average nearest-neighbor degree)、直徑(Diameter)、介數中心性(Betweenness centralization)和度中心性(Degree centralization)等參數。
各網絡參數計算方法及意義參見igraph.org官方幫助文檔。

群落數據co-occurrence實例

網絡分析需要兩個文件,OTU表和OTU的屬性;具體格式見測試數據下載連結:後臺回復「網絡」獲取

1.最簡單的網絡圖

# 設置工作目錄:請修改下方目錄或在Rstudio的Session菜單中選擇下載測試數據所在的目錄
# setwd("~/Downloads/chenliang")

# 安裝需要的包,默認不安裝,沒安裝過的請取消如下注釋
# install.packages("igraph")
# install.packages("psych")

# 加載包
library(igraph)
library(psych)

# 讀取otu-sample矩陣,行為sample,列為otu
otu = read.table("otu_table.txt",head=T,row.names=1)

# 計算OTU間兩兩相關係數矩陣
# 數據量小時可以用psych包corr.test求相關性矩陣,數據量大時,可應用WGCNA中corAndPvalue, 但p值需要藉助其他函數矯正
occor = corr.test(otu,use="pairwise",method="spearman",adjust="fdr",alpha=.05)
occor.r = occor$r # 取相關性矩陣R值
occor.p = occor$p # 取相關性矩陣p值

# 確定物種間存在相互作用關係的閾值,將相關性R矩陣內不符合的數據轉換為0
occor.r[occor.p>0.05|abs(occor.r)<0.6] = 0

# 構建igraph對象
igraph = graph_from_adjacency_matrix(occor.r,mode="undirected",weighted=TRUE,diag=FALSE)
igraph
# NOTE:可以設置weighted=NULL,但是此時要注意此函數只能識別相互作用矩陣內正整數,所以應用前請確保矩陣正確。
# 可以按下面命令轉換數據
# occor.r[occor.r!=0] = 1
# igraph = graph_from_adjacency_matrix(occor.r,mode="undirected",weighted=NULL,diag=FALSE)

# 是否去掉孤立頂點,根據自己實驗而定
# remove isolated nodes,即去掉和所有otu均無相關性的otu 可省略,前期矩陣已處理過
bad.vs = V(igraph)[degree(igraph) == 0]
igraph = delete.vertices(igraph, bad.vs)
igraph

# 將igraph weight屬性賦值到igraph.weight
igraph.weight = E(igraph)$weight

# 做圖前去掉igraph的weight權重,因為做圖時某些layout會受到其影響
E(igraph)$weight = NA

# 簡單出圖
# 設定隨機種子數,後續出圖都從同一隨機種子數出發,保證前後出圖形狀相對應
set.seed(123)
plot(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))


最簡單的點線網絡圖

2.按相關類型設置邊顏色

# 如果構建網絡時,weighted=NULL,此步驟不能統計
sum(igraph.weight>0)# number of postive correlation
sum(igraph.weight<0)# number of negative correlation

# set edge color,postive correlation 設定為red, negative correlation設定為blue
E.color = igraph.weight
E.color = ifelse(E.color>0, "red",ifelse(E.color<0, "blue","grey"))
E(igraph)$color = as.character(E.color)

# 改變edge顏色後出圖
set.seed(123)
plot(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))


邊按相關性著色,正相關為紅色,負相關為藍色

3.按相關性設置邊寬度

# 可以設定edge的寬 度set edge width,例如將相關係數與edge width關聯
E(igraph)$width = abs(igraph.weight)*4

# 改變edge寬度後出圖
set.seed(123)
plot(igraph,main="Co-occurrence network",vertex.frame.color=NA,vertex.label=NA,
vertex.size=5,edge.lty=1,edge.curved=TRUE,margin=c(0,0,0,0))


邊寬度為4倍相關係數絕對值,看看邊是不是有粗有細,越粗代表相關絕對值越大

4.設置點的顏色和大小屬性對應物種和豐度

# 添加OTU注釋信息,如分類單元和豐度
# 另外可以設置vertices size, vertices color來表徵更多維度的數據
# 注意otu_pro.txt文件為我隨機產生的數據,因此網絡圖可能不會產生特定的模式或規律。
otu_pro = read.table("otu_pro.txt",head=T,row.names=1)
# set vertices size
igraph.size = otu_pro[V(igraph)$name,] # 篩選對應OTU屬性
igraph.size1 = log((igraph.size$abundance)*100) # 原始數據是什麼,為什麼*100再取e對數
V(igraph)$size = igraph.size1

# set vertices color
igraph.col = otu_pro[V(igraph)$name,]
levels(igraph.col$phylum)
levels(igraph.col$phylum) = c("green","deeppink","deepskyblue","yellow","brown","pink","gray","cyan","peachpuff") # 直接修改levles可以連值全部對應替換
V(igraph)$color = as.character(igraph.col$phylum)

set.seed(123)
plot(igraph,main="Co-occurrence network",vertex.frame.color=NA,vertex.label=NA,
edge.lty=1,edge.curved=TRUE,margin=c(0,0,0,0))


點大小對應OTU豐度,顏色對應門分類學種類

5.調整布局樣式

# 改變layout,layout有很多,具體查看igraph官方幫助文檔。
set.seed(123)
plot(igraph,main="Co-occurrence network",layout=layout_with_kk,vertex.frame.color=NA,vertex.label=NA,
edge.lty=1,edge.curved=TRUE,margin=c(0,0,0,0))

set.seed(123)
plot(igraph,main="Co-occurrence network",layout=layout.fruchterman.reingold,vertex.frame.color=NA,vertex.label=NA,
edge.lty=1,edge.curved=TRUE,margin=c(0,0,0,0))


不同的布局選項,和上圖有什麼變化

6.按模塊著色

# 模塊性 modularity
fc = cluster_fast_greedy(igraph,weights =NULL)# cluster_walktrap cluster_edge_betweenness, cluster_fast_greedy, cluster_spinglass
modularity = modularity(igraph,membership(fc))
# 按照模塊為節點配色
comps = membership(fc)
colbar = rainbow(max(comps))
V(igraph)$color = colbar[comps]

set.seed(123)
plot(igraph,main="Co-occurrence network",vertex.frame.color=NA,vertex.label=NA,
edge.lty=1,edge.curved=TRUE,margin=c(0,0,0,0))


按劃分的模塊著色,結果中也很常用

7.顯示標籤和點輪廓

# 最後添加刪除color和label項可顯示標籤和點顏色邊框
plot(igraph,main="Co-occurrence network",vertex.frame.color=NA,vertex.label=NA,
edge.lty=1,edge.curved=TRUE,margin=c(0,0,0,0))


最後的效果

8.常用網絡屬性

# network property
# 邊數量 The size of the graph (number of edges)
num.edges = length(E(igraph)) # length(curve_multiple(igraph))
num.edges
# 頂點數量 Order (number of vertices) of a graph
num.vertices = length(V(igraph))# length(diversity(igraph, weights = NULL, vids = V(igraph)))
num.vertices
# 連接數(connectance) 網絡中物種之間實際發生的相互作用數之和(連接數之和)佔總的潛在相互作用數(連接數)的比例,可以反映網絡的複雜程度
connectance = edge_density(igraph,loops=FALSE)# 同 graph.density;loops如果為TRUE,允許自身環(self loops即A--A或B--B)的存在
connectance
# 平均度(Average degree)
average.degree = mean(igraph::degree(igraph))# 或者為2M/N,其中M 和N 分別表示網絡的邊數和節點數。
average.degree
# 平均路徑長度(Average path length)
average.path.length = average.path.length(igraph) # 同mean_distance(igraph) # mean_distance calculates the average path length in a graph
average.path.length
# 直徑(Diameter)
diameter = diameter(igraph, directed = FALSE, unconnected = TRUE, weights = NULL)
diameter
# 群連通度 edge connectivity / group adhesion
edge.connectivity = edge_connectivity(igraph)
edge.connectivity
# 聚集係數(Clustering coefficient):分局域聚類係數和全局聚集係數,是反映網絡中節點的緊密關係的參數,也稱為傳遞性。整個網絡的全局聚集係數C表徵了整個網絡的平均的「成簇性質」。
clustering.coefficient = transitivity(igraph)
clustering.coefficient
no.clusters = no.clusters(igraph)
no.clusters
# 介數中心性(Betweenness centralization)
centralization.betweenness = centralization.betweenness(igraph)$centralization
centralization.betweenness
# 度中心性(Degree centralization)
centralization.degree = centralization.degree(igraph)$centralization
centralization.degree

通過以上的學習,大家是不是可以一步步基於OTU表和注釋,用R實現高大上的網絡分析和繪製了呢?想要提高,還得多讀,多練,多思考,解決科學問題是關鍵!

後臺回復「網絡」,獲取代碼和測試數據下載連結。

猜你喜歡

10000+:菌群分析 寶寶與貓狗 梅毒狂想曲 提DNA發Nature Cell專刊 腸道指揮大腦

系列教程:微生物組入門 Biostar 微生物組  宏基因組

專業技能:學術圖表 高分文章 生信寶典 不可或缺的人

一文讀懂:宏基因組 寄生蟲益處 進化樹

必備技能:提問 搜索  Endnote

文獻閱讀 熱心腸 SemanticScholar Geenmedical

擴增子分析:圖表解讀 分析流程 統計繪圖

16S功能預測   PICRUSt  FAPROTAX  Bugbase Tax4Fun

在線工具:16S預測培養基 生信繪圖

科研經驗:雲筆記  雲協作 公眾號

編程模板: Shell  R Perl

生物科普:  腸道細菌 人體上的生命 生命大躍進  細胞暗戰 人體奧秘  

寫在後面

為鼓勵讀者交流、快速解決科研困難,我們建立了「宏基因組」專業討論群,目前己有國內外5000+ 一線科研人員加入。參與討論,獲得專業解答,歡迎分享此文至朋友圈,並掃碼加主編好友帶你入群,務必備註「姓名-單位-研究方向-職稱/年級」。PI請明示身份,另有海內外微生物相關PI群供大佬合作交流。技術問題尋求幫助,首先閱讀《如何優雅的提問》學習解決問題思路,仍未解決群內討論,問題不私聊,幫助同行。

學習16S擴增子、宏基因組科研思路和分析實戰,關注「宏基因組」

點擊閱讀原文,跳轉最新文章目錄閱讀

相關焦點

  • Nature子刊經典網絡圖在R中的繪製,網絡模塊性可視化
    ,表明了微生物互作網絡複雜性的提高能夠促進生態系統功能。其中的網絡圖無論是畫法還是配色都值得學習,小編在這裡嘗試用R畫了文章網絡圖,以供大家學習!!NC原文網絡圖重現網絡圖aa <- rcorr(t(otu[1:500,6:14]), type=c("spearman"))## Create data frame of co-occurring OTUsnet <- CorrDF(aa$r, aa$P)net$padj <- p.adjust(net$p, method="none")
  • 如何繪製漂亮的網絡圖?
    Gephi最常見是用於社交網絡數據分析,如下,是我手工整理的《天龍八部》中部分人物的關係網絡。我們可以看到段王爺是如何實力搶鏡力壓三大男主的,儘管金庸老爺子心中的男一號可能是段譽。除了媒體的社交網絡分析,在自然科學領域,特別是微生物生態學相關的學者,像以上兩個例子一樣,通常更傾向於使用igraph和Gephi做微生物群落的共發生網絡分析(Co-occurrence network analysis )。
  • 【NGO專業之路】關係網絡圖分析利益相關方
    一、簡介非營利機構的實踐中,多方參與和協作的情況經常發生。關係網絡圖通過訪談與討論,將利益相關者之間的關係狀況,以網絡圖的形式立體呈現。由此,實踐者能清楚認識自己在關係網絡中的位置,與其它利益相關者的關係,各方利益相關者的影響力大小,並在此基礎上展開討論,為改善關係網絡制定計劃以指導更好的實踐。
  • 網絡圖怎麼畫?手把手教你快速繪製高大上的網絡圖
    網絡拓撲圖是由箭頭線條、節點、路線三個因素組成形如網絡結構的圖示類型。網絡工程師繪製網絡圖,通常將網絡節點設備和通信介質進行物理布局,以清晰地展示網絡傳輸方式和途徑。網絡拓撲圖有許多種結構類型,通常有星型、環型、總線型、樹型、網狀、分布式結構、等等。
  • 【科研貓】網絡圖:基因互作-關鍵基因(1)
    在一個網絡圖當中往往有數十個乃至上百個節點,那就意味著,我們需要分析的基因有數十個或者上百個。這些基因是怎麼來的呢?這就跟我們的研究目的相關了,這些基因可能是我們篩選出來的差異表達的基因,可能是腫瘤患者中高頻突變的一些基因,也可能是某一個miRNA的下遊靶基因,抑或僅僅是你感興趣的一群基因,都是可以的。
  • 網絡分析概述之網絡基礎簡介
    在上圖示例的無向網絡圖中,節點形狀表示了RNA類型,顏色表示了RNA表達量上調/下調類型。根據節點、邊的屬性信息,在繪製網絡圖時,即可呈現到更豐富的內容。再舉一例,如下所示,基於隨機矩陣理論構建的大豆根瘤內生細菌共發生網絡,按模塊劃分為圈圖,節點代表OTUs,節點顏色代表OTUs所屬的門分類,邊的顏色代表了OTUs間的正負相關;對於特殊的OTUs(根瘤菌),以特殊形狀表示。
  • 單代號網絡圖講解
    由一個節點表示一項工作,以箭線表示工作順序的網絡圖稱為單代號網絡圖。單代號網絡圖的邏輯關係容易表達,且不用虛箭線,便於檢查和修改。但不易繪製成時標網絡計劃,使用不直觀。一、單代號網絡圖的基本構成與符號單代號網絡圖中,箭線表示相鄰工作之間的邏輯關係。一個節點表示一項工作,一般用圓圈或矩形表示。
  • Python圖表繪製進擊,一文學會如何調整刻度範圍和刻度標籤
    熟悉Python的朋友,一定對matplotlib庫很熟悉了,作為Python經典的數據可視化庫,在Python繪圖中是很多人的首選,原因在於其功能強大的繪圖函數,最近咱們一直在聊matplotlib庫中與繪圖相關的函數,相信大家已經學會了很多函數的使用方法,已經能夠繪製自己所需的圖表,今天咱們再深度聊聊和
  • 雙代號網絡圖的繪製
    雙代號網絡圖是目前推廣應用較為廣泛的一種網絡計劃形式,它是以箭線及其兩端節點的編號表示工作的一種網絡圖。儲油罐工程施工網絡計劃圖一、雙代號網絡圖的基本概念3.線路 線路是指網絡圖中從起點節點開始,沿箭頭方向順序通過一系列箭線與節點,最後達到終點節點的通路。
  • 二建考試單代號網絡圖、雙代號網絡圖怎麼學?竅門在這裡!
    一、認識網絡圖二、緊前工作和緊後工作的關係1、買菜是剁餡的緊前工作(緊挨著,在前面)箭頭指向本工作的開始節點答:包餃子的緊前工作有兩個,分別是剁餡和擀餃子皮三、雙代號網絡計劃的繪圖規則1、雙代號網絡圖必須正確表達已定的邏輯關係2、雙代號網絡圖中,嚴禁出現循環迴路
  • 華語流行歌曲名稱的詞同現網絡研究
    This paper revealsthe unique nature about the co-occurrence network of the names of songs and broadensthe research field and scope of language network.
  • MagicHand雲平臺|物種與功能網絡與模型預測分析
    今天給大家介紹雲平臺宏基因組個性化分析之一:物種與功能網絡與模型預測分析。物種與功能網絡與模型預測分析物種與功能網絡與模型預測分析是針對特定的研究對象和目的,對特定的樣品及其數據集進行關聯與模型預測分析,進一步挖掘數據中的有效信息。
  • 進度控制知識:網絡圖的繪製規則
    在繪製雙代號網絡圖時,一般應遵循以下基本規則:(1)網絡圖必須按照已定的邏輯關係繪製。由於網絡圖是有向、有序網狀圖形,所以其必須嚴格按照工作之間的邏輯關係繪製,這同時也是為保證工程質量和資源優化配置及合理使用所必需的。(2)網絡圖中嚴禁出現從一個節點出發,順箭頭方向又回到原出發點的循環迴路。
  • 單代號網絡圖,你還記得多少?
    由一個節點表示一項工作,以箭線表示工作順序的網絡圖稱為單代號網絡圖。單代號網絡圖的邏輯關係容易表達,且不用虛箭線,便於檢查和修改。但不易繪製成時標網絡計劃,使用不直觀。1、單代號網絡圖的基本構成與符號單代號網絡圖中,箭線表示相鄰工作之間的邏輯關係。一個節點表示一項工作,一般用圓圈或矩形表示。
  • 如何建立知識網絡圖
    如何建立知識網絡圖  根據建立知識結構圖的目的,建立知識結構的步驟也劃分為兩步。  下面是建立知識網絡圖的兩條原則:  (1)由點及面  知識結構圖是由每一個單個的知識點組成的,每個知識點都是中學階段要求的必須掌握的基礎。所以,要想在考試中取得好成績,首先要打好基礎,這就是我們所說的學好「點」。
  • 淺談社會網絡分析方法在稅收分析中的應用
    本文旨在借鑑"社會網絡分析"理論,展望其在稅收分析上的運用。    一、「社會網絡分析」基礎理論    社會網絡分析是20世紀70年代以來在社會學、心理學、人類學、數學、通信科學等領域逐步發展起來的一個研究分支,是一套用來分析多個個體通過相互聯繫構成的網絡結構、性質及其他用於描述這個網絡屬性的分析方法的集合,它強調從關係或者結構的角度把握研究對象,注重個體間的關係。
  • 相互作用網絡分析基礎|網絡|基礎|分析|節點|基因|關係|功能|-健康界
    網絡分析雖然也算是一種富集分析,但是這個分析的思想還是主要觀察基因與基因之間的相互作用關係來尋找更重要的基因。我們都知道,一個基因要行使功能,肯定不是獨立地行駛功能的,而是通過和其他基因相互作用來發揮作用的。我們通過基因與基因的相互作用關係就可以得到一個類似於基因網絡的結果。
  • 說實話,如果不是這次複習了一下,網絡圖的節點計算法我早忘了...
    節點計算法是直接在網絡圖上進行計算,步驟如下:順箭頭方向計算節點最早時間→計算工作自由時差→逆箭頭方向計算節點最遲時間→計算工作總時差。其他任意中間節點:任意中間節點 j 的最早時間ETj為:式中:ETj ——節點 j 的緊前節點 i 的最早開始時間;Di-j ——工作 i-j 的持續時間。建設中的香港新機場② 計算工期Tc式中:ETn ——終點節點n的最早開工時間。
  • 高發季節 high-occurrence season
    請看新華社的報導:Li noted that autumns and winters were high-occurrence seasons for the flu, and urged the authorities to improve disease prevention and treatment in
  • Fintech時代商業銀行的大零售數位化營銷 ——基於社交網絡圖挖掘
    社交網絡的內涵  社交網絡是指社會中個體與個體之間聯繫的集合,由個體(網絡圖中的節點)和各個體之間的聯繫(節點之間的連線)組成。從本質上來看,社交網絡是個體為達到特定目的,在個體與個體之間進行信息和資源交流的社會關係展現。