・お題:生体内の様々な分子は相互作用し、絶妙なバランスを保っている。生体内の分子の役割を理解するのに、ネットワーク解析が有効らしい。学んでみたい。
・私は素人なので、参考サイトをなぞるような形で学んでいきたい。今回は以下のサイトを参考に学ばせていただく。九州工大の竹本先生のHP。日本語でここまで詳しく解説されているHPは他に見たことがないので、ぜひこちらのHPをご覧いただきたい。
・竹本先生の貴著「生物ネットワーク解析」も名著だと思うので、気になる方はぜひチェックしてみてほしい。
・前回、中心性を求めて図示して遊んでみた。今回はネットワーク全体の特徴量を求めるところから。
・ライブラリをアクチベートし、ネットワークを読み込む。
>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
・相関係数が何を表すのかは良く分からない。。
・適当なグラフを作成して相関係数を求めてみた。感覚的には、次数が高いノードと隣接しているノードの次数が高いと正の値に、次数の高いノードと隣接しているノードの次数が低いと負の値に、すべてのノードの次数が等しいと算出不可になるような雰囲気を感じた。
> 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に関する補足。
・ネットワーク周りはかなり勉強が必要そう。。
つづく。