原文連結:http://tecdat.cn/?p=24613
最近我們被客戶要求撰寫關於社區發現算法的研究報告,包括一些圖形和統計輸出。
我們在心理學網絡論文中看到的一個問題是,作者有時會對其數據的可視化進行過度解釋。這尤其涉及到圖形的布局和節點的位置,例如:網絡中的節點是否聚集在某些社區 ( 點擊文末「閱讀原文」獲取完整代碼數據******** )。
下面我將詳細討論這個問題,並提供一個關於如何識別網絡中項目社群的基本R教程。非常歡迎在下面的評論部分提出反饋。
我們創建一個例子。首先,我們拿一些數據,估計一個正則化的偏相關網絡,其中節點之間的邊類似於偏相關,並使用'spring'命令繪製網絡。這是心理學網絡文獻中默認的,使用Fruchterman-Reingold算法為圖中的節點創建一個布局:具有最多連接/最高連接數的節點被放在圖的中心。
cort<- cor(data)
graph(cort,layout="spring")
matrix 是這 20 個項目的相關矩陣, Size 命令告訴我們有多少人。
這是結果圖:
然而,這裡的節點部署只是許多同樣 "正確 "的節點部署方式中的一種。當網絡中只有1-3個節點時,算法將總是以同樣的方式部署它們(其中節點之間的邊的長度代表它們之間的關係有多強),算法唯一的自由度是圖形的旋轉。但是,特別是在有許多節點的圖中,部署方式只告訴我們一個非常粗略的結果,不應該被過度解釋。
點擊標題查閱往期內容
R語言複雜網絡分析:聚類(社區檢測)和可視化
左右滑動查看更多
01
02
03
04
以下是繪製我們上述網絡的另外兩種方法,它們同樣 "正確"。
nNd <- 20
set.seed(1)
grh2<-grph
set.seed(2)
gr3<-grph
雖然項目之間的邊顯然是相同的,但節點的位置卻有很大的不同。
《歐洲神經精神藥理學》(European Neuropsychopharmacology)上Madhoo & Levine的一篇新論文為這個問題提供了一個很好的例子。他們在兩個時間點(相隔12周)調查了約2500名被診斷為重度抑鬱症的精神科門診病人的14種抑鬱症狀的網絡結構。這篇論文的一個非常不錯的貢獻是,他們研究了網絡結構隨時間的變化,其方式與我們以前在同一數據集中的研究有些不同。
與上面的網絡例子類似,他們使用正則化的偏相關網絡來估計兩個時間點的橫截面網絡模型,並使用Fruchterman-Reingold算法繪製網絡。他們通過目測得出結論,有4個症狀群存在,而且這些症狀群沒有隨時間變化。
"在基線時,網絡由四個症狀群組成(圖1a),即:睡眠障礙(項目1-5),認知和物理動機缺損(項目6-9),情感(項目10-12)和食慾(項目(13-14)。
[...]終點症狀分組(圖1b)與基線時相似"。
但這些發現和結論僅僅是基於對結果圖的視覺檢查--而我們在上面已經了解到,對這些圖的解釋應該非常謹慎。值得注意的是,這種視覺上的過度解讀在心理學網絡文獻中相當常見。
讓人眼前一亮的另一個原因是,我們在最近的一篇論文中分析了同一數據集的社群結構,發現社群的數量隨時間而變化--這與作者對圖表的視覺解釋相衝突。
那麼,如何在R中做到這一點?有許多可能性,我介紹三種:一種來自潛變量建模領域的非常成熟的方法(特徵值分解);一種來自網絡科學的成熟算法(spinglass算法);以及一種正在開發中的非常新的工具(使用walktrap算法的探索性圖分析)。
傳統上,我們想用潛變量框架來描述上述20個項目,問題是:我們需要多少個潛變量來解釋這20個項目之間的協方差?一個非常簡單的方法是查看數據中各成分的特徵值。
plot(eigen)
abline(h=1)
這向我們顯示了Y軸上每個成分的每個特徵值;X軸顯示了不同的成分。一個高的特徵值意味著它能解釋項目之間的大量協方差。紅線描述了所謂的標準:一個簡單的規則,決定我們需要多少個成分來充分描述項目之間的協方差(每個成分的特徵值>1)。無論如何,根據我們現在使用的規則,我們可能會決定提取2-5個成分。我們還不知道哪個項目屬於哪個成分--為此,我們需要運行,例如,探索性因子分析(EFA),看看因子載荷。
為什麼這與網絡有關呢?許多論文現在已經表明,潛變量模型和網絡模型在數學上是等價的,這意味著在大多數情況下,支撐數據的因素的數量將轉化為你在網絡中可以找到的社區的數量。
第二種方法是所謂的spinglass算法,該算法在網絡科學中已經非常成熟。為此,我們將上面估計的網絡輸入到R中。最相關的部分是最後一行membership。
spinglascmy(g)
mershp
在我們的例子中,spinglass算法檢測到了5個社區,這個向量代表了這20個節點屬於哪個社區(例如,節點1-7屬於社區5)。然後,我們可以很容易地在qgraph中繪製這些社區,例如,對節點進行相應的著色。請注意,iqgraph是一個非常通用的軟體包,除了spinglass算法之外,它還有許多其他檢測社區的可能性,比如walktrap算法。(感謝Alex Millner對igraph的投入;當然,這裡所有的錯誤都是我的錯誤)。
值得注意的是,spinglass算法每次運行都會導致不同的結果。這意味著你應該在運行spinglass.community之前通過set.seed()設置一個種子,而不是像我上面那樣。我運行該算法1000次,看看得到的聚類數量的中位數,然後找到一個能重現這個聚類數量中位數的種子。我在一篇論文中使用了這個解決方案(注意,使用不同的種子,解決方案看起來是不同的)。
同樣關鍵的是,要知道有許多種不同的方法來做社群檢測。Spinglass有些簡單化,因為它只允許項目成為一個社區的一部分--但可能項目被描述為同時屬於幾個社區更好。Barabási的書 "網絡科學 "中有一個關於社區檢測的廣泛章節。Spinglass只是眾多機會中的一個。正如我上面提到的:例如walktrap,也是常用的,而且更穩定。
第三種方法是通過探索性圖表分析。從你的數據中重新估計了一個正則化的部分相關網絡,與我們上面所做的類似,然後使用walktrap算法來尋找網絡中的項目社群。在使用walktrap算法的情況下,這應該會得到與igraph相同的結果(並且細節設置相同,比如步驟數)。
優點是--與特徵值分解不同--它直接顯示哪些項目屬於哪些社群。
walktrap(da, plt= TRUE)
如果這個方法被證明是有效的,它非常容易使用,並自動顯示你的項目屬於哪個社區。
請注意,目前,探索性圖分析採取你的數據並自動估計一個高斯圖形模型(假設是多變量的正常變量)。
現在,我們想檢查一下我們的結果的穩健性:spinglass算法和使用walktrap算法在社區檢測方面是否一致?
這很容易做到:讓我們把這兩個網絡畫在一起,並對社區進行相應的著色。首先,我們根據結果來定義社群,然後用上面第一個網絡的布局來繪製網絡。
walktrap(coate tile="walktap")
spinglass(coratix, tite="spinglass")
直覺上--基於視覺檢查--walktrap的解決方案似乎更有意義,其中節點8屬於藍色社區而不是紫色社區。但是,同樣,這只是複雜關係的圖形顯示,我們在這裡必須謹慎解釋。
因此,讓我們用一個稍微不同的布局來繪製同一個網絡。
walktrap(layou = list(int = atinomNe2,no,2)))
spinglass(cori, layo.pr = list(iit=matrxnrm(Nd2)nde2
正如你現在看到的,在這個可視化中,不清楚節點8應該屬於藍色還是紅色社區,我們沒有明確的直觀偏好。
如果你對網絡中的項目之間的統計社區感興趣,不要只在視覺上檢查你的圖。當我為論文做這件事時,我使用上面描述的三種方法,通常它們的結果相當相似。顯然,你也可能對理論或概念更感興趣。在這種情況下,你可能根本不需要看你的數據,不需要經歷上述所有的麻煩。
請注意,上述spinglass或walktrap等社群檢測方法的最大局限是,項目確定地只屬於一個社群。對於心理學數據來說,擬合因子模型經常會發現有交叉負荷的項目,這是一個問題。而你可以通過模擬一個2因子模型看到,其中1個項目在兩個因子上都有同樣的載荷。希望我們很快就能在R中實現允許項目同時屬於多個社區的算法(Barabási在他的《網絡科學》一書第9章中描述了幾個。
點擊文末 「閱讀原文」
獲取全文完整資料。
本文選自《R語言社區發現算法檢測心理學複雜網絡:spinglass、探索性圖分析walktrap算法與可視化》。
點擊標題查閱往期內容
數據分享|Python用Apriori算法關聯規則分析亞馬遜購買書籍關聯推薦客戶和網絡圖可視化R語言複雜網絡分析:聚類(社區檢測)和可視化
使用Python和SAS Viya分析社交網絡
R語言用igraph繪製網絡圖可視化
在R語言中使用航空公司複雜網絡對疫情進行建模
R語言用相關網絡圖可視化分析汽車配置和飲酒習慣
R語言公交地鐵路線進出站數據挖掘網絡圖可視化
python對網絡圖networkx進行社區檢測和彩色繪圖R語言推特twitter網絡轉發可視化分析
R語言複雜網絡分析:聚類(社區檢測)和可視化
R語言混合圖形模型MGM的網絡可預測性分析
R語言使用自組織映射神經網絡(SOM)進行客戶細分
R語言網絡分析友誼悖論案例
R語言網絡和網絡流的可視化實踐:通勤者流動網絡
R語言最大流最小割定理和最短路徑算法分析交通網絡流量擁堵問題
R語言公交地鐵路線網絡圖實現數據挖掘實戰
R軟體SIR模型網絡結構擴散過程模擬
通過SAS網絡分析對人口遷移進行可視化分析
python隸屬關係圖模型:基於模型的網絡中密集重疊社區檢測方法
使用Python和SAS Viya分析社交網絡
用R語言和python進行社交網絡中的社區檢測
python圖工具中基於隨機塊模型動態網絡社團檢測
在R語言中使用航空公司複雜網絡對疫情進行建模
採用SPSS Modeler的Web複雜網絡對所有腧穴進行分析