備忘録 a record of inner life

やったことや考えたこと・本・論文・音楽の備忘録。 特に環境科学・生態毒性に関して。

相互情報量ベースのネットワーク分析 using R minet

先日WGCNA(Weighted Gene Coexpression Network Analysis)を試しに使ってみました(この記事 → 論文のメモ: 生態毒性研究へのWGCNAの適用)。しかし、遺伝子発現のデータは別に直線関係ばかりではないので(最近読んだ論文のメモ: omicsデータの用量応答モデル)、ピアソンの相関係数に基づいて計算することに違和感を覚えました。

そこで、非線形の関係も扱える相互情報量(mutual information)に基づくネットワーク分析を勉強してみました。

 

 

 

参考にした情報は以下の論文+Wikipediaの"相互情報量"と"情報量"。

ARACNEをRで実装した論文。

Meyer PE, Lafitte F, Bontempi G, 2008, minet: AR/Bioconductor package for inferring large transcriptional networks using mutual information, BMC Bioinfor 9(1): 461.

相互情報量とピアソン相関係数のどちらが適切かは時と場合によるという話。

法隆大輔, 林武司, 2013, 遺伝子発現プロファイル類似度としてのピアソン相関係数相互情報量の比較, 計量生物学 33(2):125-143.

 

 

まず相互情報量を求める

相互情報量の定義はwiki参照。数式で書くとこんな感じらしい。

I(X;Y)=\sum _{{y\in Y}}\sum _{{x\in X}}p(x,y)\log {\frac  {p(x,y)}{p(x)\,p(y)}},\!(wikiより)

連続値の場合の周辺確率と同時確率の求め方は、色々提案されているようですが(たぶん)、一番分かりやすいのはデータを分割して離散化する方法でしょう。

下のデータで遊んでみる。G1とG2が遺伝子発現量を、Sが試料番号を示してます。

> data

     S1 S2  S3 S4 S5   S6 S7  S8 S9
G1   62 41     5 30 15    52 45    1   39
G2 167 42 136 50 98  114 90 167  38

f:id:Kyoshiro1225:20180126222931p:plain

 

ピアソンの相関係数は-0.20です。

f:id:Kyoshiro1225:20180126224258p:plain

一方、相互情報量の場合。

まずデータを分割して離散化します。区切り方は、区切りの幅を同一にする"equalwidth"か区切り内のデータ数を同一にする"equalfreq"か、など選択します。

> d <- discretize ( t(data) , nbins=3 ) #デフォルトだとnbinsはサンプルサイズの平方根

> d

  G1 G2
1  3   3
2  2   1
3  1   3
4  2   1
5  1   2
6  3   2
7  3   2
8  1   3
9  2   1

f:id:Kyoshiro1225:20180126232725p:plain

## こういう感じに分割される

# このデータの場合equalfreqもequalwidthも同じ

次に相互情報量を下記の式から求めます。Hはエントロピー

H(P)=-\sum _{A\in \Omega }P(A)\log P(A)

I(X,Y)=H(X)+H(Y)-H(X,Y)(wikiより)

上の図をもとに集計表を作成し、X(=G1)とY(=G2)のエントロピーを求めます。

  • H(X) = -  { 1/3*log(1/3) + 1/3*log(1/3) + 1/3*log(1/3) }  = 1.584963
  • H(Y) = -  { 1/3*log(1/3) + 1/3*log(1/3) + 1/3*log(1/3) }  = 1.584963
  • H(X,Y) = - { 1/3*log(1/3) + 2*1/9*log(1/9) + 2*2/9*log(2/9) } = 2.19716
  • I (X; Y) = 1.584963 + 1.584963  - 2.19716  =  0.972766 

 

一応、Rのinfotheoライブラリーのmutinformation関数で検算しておきます。求め方は"empirical (=maximum likelihood)" か"shrink entropy"か、"schurmann-grassberger"など選べます。

empirical methodで求めた相互情報量は0.973で、上記の手計算と一致していますね。

> mutinformation(d, method="emp") ## 底はe

          G1      G2
G1 1.099 0.674
G2 0.674 1.099

> natstobits ( mutinformation(d, method="emp") )  ## 底2のビットに変換

                  G1             G2
G1 1.5849625 0.9727653
G2 0.9727653 1.5849625

 

ちなみにRのminetパッケージ(infotheoを利用している)だとbuild.mim関数で一気に求められます。

> build.mim( t(data), estimator="mi.empirical", disc="equalfreq")
                   G1             G2
G1 0.0000000 0.6742695
G2 0.6742695 0.0000000

 

 

相互情報量をもとにネットワーク分析をしてみる

ぶっちゃけRのminetライブラリにぶち込むだけですが、とりあえずやってみます。

次はデータを拡張して、下のものを使用します。G1~G10が遺伝子で、各サンプルS1~S6における発現量のデータです。サンプル6個で相互情報量を求めるのは厳しいかも…。

f:id:Kyoshiro1225:20180127153823p:plain

 

ピアソン相関係数の行列はこんな感じ。

f:id:Kyoshiro1225:20180127154215p:plain

相互情報量を、build.mim関数で求めたのが下。

> mim.eqwi <- build.mim( t(data) , estimator ="mi.empirical", disc="equalwidth")

f:id:Kyoshiro1225:20180127154341p:plain

 

このように類似度行列が得られたら、次は図示するための準備。WGCNAの場合と同様に閾値で区切って0/1データに変換するなどの処理を行います。とりあえずminetライブラリに実装されているARACNEを用います。

> net.eqwi <- aracne(mim.eqwi)

f:id:Kyoshiro1225:20180127161839p:plain

#赤字の場所がARACNEによってカットされた部分。indirectな関係を除外できるということですが…?

 

最後に、相互情報量相関係数の結果を比較。snaライブラリーで図示。

>  mim.cor <- build.mim( t(data) , estimator ="pearson")  # 相関係数使用, 離散化はされない

> net.cor <- aracne(mim.cor)

 

> library( sna ) 

> par (mfrow=c(2,1) )

> gplot(net.eqwi, usearrows=FALSE, displaylabels=TRUE)

> gplot(net.cor, usearrows=FALSE, displaylabels=TRUE)

f:id:Kyoshiro1225:20180127160810p:plain

#左が相互情報量ベースで右がPearson相関係数ベース