いろいろ倉庫

KNIME、EXCEL、R、Pythonなどの備忘録

【R】ネットワーク解析を学んでみたい②

・お題:生体内の様々な分子は相互作用し、絶妙なバランスを保っている。生体内の分子の役割を理解するのに、ネットワーク解析が有効らしい。学んでみたい。

 

・私は素人なので、参考サイトをなぞるような形で学んでいきたい。今回は以下のサイトを参考に学ばせていただく。九州工大の竹本先生のHP。日本語でここまで詳しく解説されているHPは他に見たことがないので、ぜひこちらのHPをご覧いただきたい。

sites.google.com

・竹本先生の貴著「生物ネットワーク解析」も名著だと思うので、気になる方はぜひチェックしてみてほしい。

www.coronasha.co.jp

 

・前回、中心性を求めて図示して遊んでみた。今回はネットワーク全体の特徴量を求めるところから。

・ライブラリをアクチベートし、ネットワークを読み込む。

>library(igraph)
>library(RColorBrewer)

>d <- as.matrix(read.table("test.txt",header=T,row.names=1))
>g <- graph.adjacency(d,mode="directed",weighted=T)

・test.txtの中身は、以下の内容のtextファイル。カレントディレクトリに保存してある。

A C 1
D C 2
C B 3
E C 2
C G 3
C H 4
G F 3
G I 1
H I 2
I Q 1
Q R 2
R M 3
R K 4
J K 4
K L 3
K M 3
L M 2
M O 2
M P 3

・ちなみに、図示すると以下のような感じ。

> plot(g)

・次数の分布をみてみる。

> degree(g)
A D C E G H I Q R J K L M B F O P 
1 1 6 1 3 2 3 2 3 1 4 2 5 1 1 1 1 

> table(degree(g))

1 2 3 4 5 6 
8 3 3 1 1 1 

> degree.distribution(g)
[1] 0.00000000 0.47058824 0.17647059 0.17647059 0.05882353 0.05882353 0.05882353
> plot(degree.distribution(g))

クラスタ係数(ざっくりいうとネットワーク・ノード同士の繋がりの密度)。引数typeにglobalを与えると、ノード全体のクラスタ係数が出る。

> transitivity(g,type="global")
[1] 0.1395349

・引数typeにlocalを与えて、引数vidsにノードのIDを与えると、個別ノードのクラスタ係数を求められる。個別ノードを頂点とした三角形がどのぐらいあるかというイメージ。

> transitivity(g,type="local", vids ="M")

[1] 0.2
> transitivity(g,type="local", vids ="K")
[1] 0.3333333

> transitivity(g,type="local", vids ="C")
[1] 0

 

相関係数

> assortativity.degree(g)
[1] -0.488123

相関係数が何を表すのかは良く分からない。。

igraph.org

・適当なグラフを作成して相関係数を求めてみた。感覚的には、次数が高いノードと隣接しているノードの次数が高いと正の値に、次数の高いノードと隣接しているノードの次数が低いと負の値に、すべてのノードの次数が等しいと算出不可になるような雰囲気を感じた。

> g_star<-make_star(25, mode = "undirected")
> plot(g_star)

> assortativity_degree(g_star)
[1] -1

 

> g_lattice<-make_lattice(c(1, 5, 5))
> plot(g_lattice)

> assortativity_degree(g_lattice)
[1] 0.4152047

 

> g_ring<-make_ring(10)
> plot(g_ring)

> assortativity_degree(g_ring)
[1] NaN

 

> g_full<-make_full_citation_graph(10, directed = F)
> plot(g_full)


> assortativity_degree(g_full)
[1] NaN

 

> plot(g2)#次数が4,3,2,1になるようにg2を作って読み込ませた。

> assortativity_degree(g2)
[1] 0.382716

 

・各ノード間の最短経路長の行列。各ノードから他のノードに至るまでの最短経路の長さなのだけれど、weightが加味されているため、plot(g)で見たままの経路長にはならないらしい。
> shortest.paths(g)

・ちなみに、引数weightsにNANを与えると、重みを無視してくれるみたい。なんとなく、電車の乗り換え回数みたいな雰囲気。。
> shortest.paths(g,weights = NaN)

・平均最短経路長

> average.path.length(g)
[1] 7.24

・これをg_fullに適用すると、当然1になる。どこからどこに行くにしても、乗り換えなしで行けちゃう…。。

> average.path.length(g_full)
[1] 1

・2つのノードの最短経路を出す。今回重み付きの有効グラフにしてしまったので、あまり面白くないかも。。

> get.all.shortest.paths(g,"A","P",mode="out")
$res
$res1
+ 8/17 vertices, named, from 62e85ba:
[1] A C G I Q R M P

$nrgeo
 [1] 1 0 1 0 1 1 1 1 1 0 1 0 1 1 1 1 1

・nrgeoに関する補足。

stackoverflow.com

 

・ネットワーク周りはかなり勉強が必要そう。。

 

 

つづく。