2015-05-22 176 views
0

我是新來的igraph和社會網絡分析,而不是R.結構化數據

我奮力正確地構建我的社區檢測數據集,但已經成功地使用IGRAPH生成一個共生矩陣as directed [here]。接下來我要做的是在同一個數據集上使用社區檢測算法來創建一個圖表,顯示羣集as is done in the answer here

如何做到這一點的示例代碼如下:

df1 <- graph.famous("Zachary") 
df2 <- walktrap.community(df1) #any algorithm 
plot.communities(df2, df) 

我一直在網上找到了扎卡里數據集的結構上戳,這樣我就可以正確模擬我的數據,但我正在努力尋找通過技術文檔的方法。

我的數據,目前在長形結構化,使得:

id   interest comments 
1    Comedy   2 
1 Music: Electronic   11 
1  Video Gaming   10 
1   Music: Pop   1 
1  Entertainment   1 
1  Video Gaming   4 
2  Video Gaming   45 
2  Entertainment   26 
2   Music: Pop   1 
2   Comedy   14 
3  Video Gaming   10 
3  Entertainment   4 
3   Comedy   8 
4  Video Gaming   9 
4 Music: Electronic   1 
4  Music: Pop   2 
5  Music: Pop   2 
5  Entertainment   1 
5  Video Gaming   1 
6  Video Gaming   12 

我試圖找到重疊在人羣中,我學習興趣的集羣,所以ID是一個人,在interests是人的興趣,以及comments是他們已經表現出興趣的次數的指數。這有幫助嗎?

我試着在這個數據集上運行社區算法(例如df2 <- walktrap.community(df)),但似乎沒有正常工作。關於這個n00b做錯了的想法?

+0

圖形由節點和邊組成。您的數據集中與節點有關的內容以及您如何知道哪些節點已連接?對於Zarchary數據,它可以用鄰接矩陣('get.adjacency(df1)')或邊緣列表('get.edgelist(df1)')表示。 – MrFlick

+0

@MrFlick節點是列「利益「 - 即喜劇,博弈等。我試圖找到我正在研究的人羣中重疊興趣的集羣,因此身份證是一個人,利益是人的利益,」評論「是很多時候他們表現出興趣。這有幫助嗎? – roody

+0

這是有道理的,但仍然不能很好地轉化爲圖形的語言。所以你希望每個興趣成爲一個節點,然後你想要一個節點之間的邊緣,如果一個用戶共享這兩個利益?我不確定你會如何處理評論欄,因爲這看起來不適合作爲節點或邊緣權重。我仍然很難看到這些數據如何以圖表的形式表現出來。 – MrFlick

回答

0

圖形不會讓您聚集個人,但只能找出哪些變量是相關的。不過,如果你想從你的數據中建立一個圖表,這是你必須做的。 (請注意,我已將您的示例數據保存爲.csv文件,並將其上傳到Dropbox中以製作一個易於重現的示例)。

library(repmis) 
library(igraph) 

test=source_data("https://www.dropbox.com/s/bochkedd4o3gzvq/so.csv?dl=0") 

首先,你要的是建立一個矩陣,每個單獨的一行,每個功能一米欄:

matrix=matrix  
rownames(matrix)=unique(test[,1]) 
colnames(matrix)=unique(test[,2]) 

,並在單元格的值對應於利益的力量:

for (i in 1:nrow(matrix)){ 
    temp=test[test[,1]==i,][,2:3] 
    for (j in 1:ncol(matrix)){ 
    matrix[i,j]=sum(temp[temp[,1]==colnames(matrix)[j],2]) # sum is used because of duplicates 
    } 
} 

你得到的是:

> matrix 
    comedy electronic gaming pop ent 
1  2   11  14 1 1 
2  14   0  45 1 26 
3  8   0  10 0 4 
4  0   1  9 2 0 
5  0   0  1 2 1 
6  0   0  12 0 0 

然後,從,你可以創建一個鄰接矩陣:

x=t(matrix)%*%matrix 

而你得到的是:

> x 
      comedy electronic gaming pop ent 
comedy  264   22 738 16 398 
electronic  22  122 163 13 11 
gaming  738  163 2547 79 1225 
pop   16   13  79 10 29 
ent   398   11 1225 29 694 

建立從圖形很簡單:

g=graph.adjacency(x,weighted=T,mode="undirected",diag=FALSE) 
g=simplify(g) 

您可以將任何社區檢測算法應用於對象g,例如:

spinglass.community(g,weight=E(g)$weight) 

如果你想聚集個人而不是變量,我會看看PCA和層次聚類(例如參見FactoMineR包中的優秀HCPC函數)。在這種情況下,您將使用上面的對象matrix(不需要計算鄰接矩陣)。

+0

你能否解釋一下矩陣x中的數字是什麼,這是交叉產品的結果。 – user20650

+0

@ user20650請查看'graph.adjacency'函數的文檔:http://igraph.org/r/doc/graph.adjacency.html – Antoine

+0

感謝您的回覆。例如,爲了擴展我的問題,'264'在'x'的喜劇/喜劇元素中涉及了什麼 - 我不知道這與原始數據有什麼關係(我知道im很可能很慢)ps 。我明白你正試圖形成一個加權鄰接矩陣。 – user20650