いろいろ倉庫

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

【R】中心性解析してみたい②

・お題:ネットワークの大事なところを探すことを、中心性解析と呼ぶらしい。生物の分子機能のネットワークの中心性解析を使うと、生体維持に大切なところを見つけられたりするみたい。ぜひやってみたい。

 

・先日ネットワーク解析を学びたいというシリーズの記事を書いた際に、参考サイトの著者でもいらっしゃる九工大の竹本先生から教えて頂いた資料を参考に学んでみる。大変感謝です。

・今回の参考元サイト。正しいことはぜひそちらをご確認いただきたい。

kztakemoto.github.io

 

・前回、中心性を求めて、必須遺伝子と非必須遺伝子に分けて箱ひげ図を描いたりwilcoxonの順位和検定したりした。今回は中心性を指標に必須/非必須を判定した場合のROCカーブを描いてみたい。

・ライブラリの読み込みとオブジェクトの作成は前回の続きとする。ROCカーブに関して、以下のサイトが分かりやすかったので、気になる方はご覧ください。

blog.kikagaku.co.jp

> library(pROC)#ROCを描くためのライブラリを読み込む

ROC曲線に関して、事前に少し試してみたい。先の参考サイトによると、閾値をいろいろずらしてデータを収集し、縦軸にTrue Positive Rate(真陽性率)、横軸にFalse Positive Rate(偽陽性率)をとったグラフとのこと。真陽性率は感度(Sensitivity)と同じもの。偽陽性率は1から特異度(Specificity)を引いたものになる。

・ライブラリpROCでは、判定結果(0,1)と判定に使う数値のベクトルを与えてやれば、自動的にROCカーブを描いてくれる。試してみる。

> x<-c(0,0,1,0,1)#判定結果
> x
[1] 0 0 1 0 1
> y<-1:5#判定に使う数値
> y
[1] 1 2 3 4 5
> ROC <- roc(x~y)#オブジェクトを作成する
Setting levels: control = 0, case = 1
Setting direction: controls < cases
> plot(ROC)

ROCカーブを描くことができた。閾値とSensitivity、Specificityの関係も見てみる。いずれもROCオブジェクトに保存されている。

> ROC$thresholds

[1] -Inf  1.5  2.5  3.5  4.5  Inf

> ROC$sensitivities
[1] 1.0 1.0 1.0 0.5 0.5 0.0
> ROC$specificities
[1] 0.0000000 0.3333333 0.6666667 0.6666667 1.0000000 1.0000000

 

・先のROCカーブをよく見ると、横軸がSpecificityになっており、右がゼロ、左が1.0になっている。plot関数の引数legacy.axesにTRUEを与えると、一般的な1-Specificity表示にできる。ついでに、引数print.aucにTRUEを与えてAUCを、引数mainにグラフタイトルを、roc関数の引数ciにTRUEを与えて信頼区間を加えてやる。
> ROC <- roc(x~y, ci = TRUE)
Setting levels: control = 0, case = 1
Setting direction: controls < cases
> plot(ROC, print.auc=TRUE, main="Test", legacy.axes = TRUE)

・今回やりたいことのイメージは、中心性に閾値を設けて、高い場合は必須、低い場合は非必須と判定する感じ。そのため、前準備として、必須なら1、非必須なら0というラベルを作成する。
> ess_score <- ifelse(d$essential == "E",1,0)
> ess_score

・試しに一つ描いてみる。
> ROC1 <- roc(ess_score~d$degree, ci = TRUE)
Setting levels: control = 0, case = 1
Setting direction: controls < cases
> plot(ROC1, print.auc=TRUE, main = "Degree", legacy.axes = TRUE)

・plot.roc関数を使って、それぞれの中心性のROCカーブを描いてみる。
> layout(matrix( 1:6, ncol = 3 ))
> plot.roc(ess_score~d$degree, print.auc = TRUE, ci = TRUE, legacy.axes = TRUE, main = "Degree")
Setting levels: control = 0, case = 1
Setting direction: controls < cases
> plot.roc(ess_score~d$eigen, print.auc = TRUE, ci = TRUE, legacy.axes = TRUE, main = "Eigenvector")
Setting levels: control = 0, case = 1
Setting direction: controls < cases
> plot.roc(ess_score~d$page, print.auc = TRUE, ci = TRUE, legacy.axes = TRUE, main = "PageRank")
Setting levels: control = 0, case = 1
Setting direction: controls < cases
> plot.roc(ess_score~d$closen, print.auc = TRUE, ci = TRUE, legacy.axes = TRUE, main = "Closeness")
Setting levels: control = 0, case = 1
Setting direction: controls < cases
> plot.roc(ess_score~d$between, print.auc = TRUE, ci = TRUE, legacy.axes = TRUE, main = "Betweenness")
Setting levels: control = 0, case = 1
Setting direction: controls < cases
> plot.roc(ess_score~d$subgraph, print.auc = TRUE, ci = TRUE, legacy.axes = TRUE, main = "Subgraph")
Setting levels: control = 0, case = 1
Setting direction: controls < cases

・AUCに大きな差はなさそう。いずれの手法も単独で閾値を設けて生存必須性を予測するうえでの性能はそう大きく変わらなさそうな結果に思えた。

 

 

おわり。