library(igraph) #ver.0.6以降の新しい表記法を確認 ?igraph #『Rで学ぶデータサイエンス8 ネットワーク分析』(共立出版)で変更の生じる箇所 #p.4 #1.2.2 隣接行列 dg <- matrix(c( 0,1,1,0, 1,0,1,0, 0,0,0,0, 1,0,0,0), nrow = 4, ncol = 4, byrow = TRUE) dg #1.2.2 igraphの場合 g <- graph.adjacency(dg) g str(g) E(g) #頂点や辺の添え字は1から始まるようになっている #p.5 #1.3 辺リスト e.list <- c(1,2,1,3,2,1,2,3,4,1) e.matrix <- matrix(e.list, ncol = 2, byrow = TRUE) e.matrix #p.7 #1.3.2 igraphの場合 g <- graph(e.list, n = 4) #e.listに+1する必要なし str(g) g <- graph.edgelist(e.matrix ) str(g) g <- graph.edgelist(matrix(c( 1,2, 1,3, 1,4, 2,3), ncol = 2, byrow = TRUE), directed = FALSE) str(g) g <- graph.edgelist(matrix(c( "A", "B", "C", "D", "E", "F"), ncol = 2, byrow = TRUE)) str(g) #p.10 #1.4.2 igraphでのファイルの読み込み #例のedge.list.txtも0を含まないよう、全要素に+1する必要がある #1.5.2 igraphの場合 g <- graph.formula(東京--神田, 東京--神田, 東京--神田) str(g) E(g) #多重グラフにならない #p.19 #2.1 最短経路と最短距離 A <- matrix(c( 0,1,0,0,0,1, 0,0,1,0,0,0, 0,0,0,1,0,0, 0,1,0,0,1,0, 0,0,0,0,0,0, 0,0,0,1,0,0), nrow = 6, byrow = TRUE) #p.27 #2.6 igraphの場合 g <- graph.adjacency(A) shortest.paths(g, mode = "out") #p.28 (sp <- get.shortest.paths(g, 1, to = 5, mode = "out")) #頂点の指定を変更 #結果に+1する必要なし p.37 #3.3.2 igraphの場合 g <- graph.adjacency(A) reciprocity(g, mode = "ratio") #mode引数を追加 #デフォルトでは以下の計算 sum(A * t(A)) / sum(A) #本の表記を使うと2a/(2a + c + d) ※2012年7月4日修正 #p.45 ※2012年7月12日追加 #4.2.2 igraphの場合 closeness(g) #これによって算出される近接中心性は標準化されていない #標準化する場合は次のようにする。 closeness(g, normalized = TRUE) #p.53 #4.5.1 igraphの場合 A <- matrix(c( 0,0,0,0,0,0,0,0,0, 1,0,0,0,0,0,0,0,0, 1,0,0,0,0,0,0,0,0, 0,1,1,0,0,0,0,0,0, 1,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0, 0,0,0,0,0,1,0,0,0, 0,0,0,0,0,1,0,0,0, 0,0,0,0,0,1,0,0,0), nrow = 9, byrow = TRUE) g <- graph.adjacency(A, mode = "directed") #PageRank算出のアルゴリズムが変更されているようで、本と同じ計算結果を得るには古いバージョンの関数を使用 page.rank.old(g, directed = TRUE) #5.1.1 連結成分 #p.76 #igraphの場合 g <- graph.adjacency(A, mode = "undirected") clusters(g) #コマンドはそのままですが出力が1開始になります #5.1.2 クリーク #p.79 #igraphの場合 g <- graph.adjacency(A, mode = "undirected") maximal.cliques(g) #ここも出力が1開始になっています #頂点数3以上のものを取り出すときも+1は不要になりました clique <- list() mc <- maximal.cliques(g) for (i in 1:length(mc)) if (length(mc[[i]]) >= 3) {mc[[i]] <- mc[[i]]; clique <- c(clique, mc[i])} clique #p.81 #5.1.3 コミュニティ g <- graph(c( 1,2, 1,3, 1,4, 1,5, 1,9, 2,3, 2,4, 3,4, 5,6, 5,7, 5,9, 6,7, 6,8, 7,8), # -1が不要になりました n = 9, directed = FALSE) #V(g)$name <- 1:9 不要になりました (eb <- edge.betweenness.community(g))#モジュラリティに基づく最適なコミュニテイ分割が出力されるようになりました eb$merges #+1が不要になりました #p.85 Q <- 1:9 for (i in 1:9) {memb <- community.to.membership(g, eb$merges - 1, steps = i - 1) Q[i] <- modularity(g, memb$membership + 1)} Q #community.to.membership関数のコミュニティのインデックスはまだ0から始まるようでeb$mergesは-1する #modularity関数の中のmemb$membershipには+1する community.to.membership(g, eb$merges - 1, steps = 6) #ここもeb$mergesは-1する #出力の$membershipでコミュニティのインデックスは0開始のまま #p.153 #図11.10 g <- random.graph.game(20, p = 0.3) membership <- leading.eigenvector.community(g, steps = 1)$membership #関数名変更 V(g)$color <- ifelse(membership == 1, "white", "black") #membership == 0から変更 plot(g, layout = layout.kamada.kawai, vertex.size = degree(g), vertex.label.dist = 1, vertex.label.color = "black", vertex.label.family = "") #最終更新 2012年7月12日