戻る     次へ     目次へ

9.6. ROC(Receiver Operating Characteristic)について
医学と統計(52)投稿からから。

統計解析環境「R」を使ったROC曲線などの分析事例を紹介します。
ここでは心筋梗塞(Inf.)と狭心症(Ang.)の有(1)無(0)における血清CPK(Creatine phosphokinase )の仮想データを用いる事にします。

「R」コマンドの記述
 library(Epi)
CPK<- c( 452, 462, 456, 456, 458, 421, 391, 394, 384, 427, 298, 295, 257, 244, 262,
254, 226, 203, 219, 236, 174, 178, 194, 197, 143, 159, 136, 126, 116, 105,
104, 87, 96, 118, 60, 66, 68, 52, 15, 36, 7, 38, 27, 7, 7, 4 )

Inf.<- c( 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 0, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1,
1, 1, 0, 0, 1, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0 )

Ang.<- c( 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0,
1, 1, 1, 1, 1, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0 )

ROC(CPK, Inf., plot="ROC", PV=T, MX=T, MI=T, AUC=T)

上記のデータを表計算ソフト「MS-Excel」 に入力しておき、下記コマンドを実行する方が便利でしょう (入力済みデータはここから)

library(Epi)
dat<- read.delim("clipboard", header=T)
x<- dat$CPK
y<- dat$Inf.
z<- dat$Ang.
ROC(x, y, plot="ROC", PV=T, MX=T, MI=T, AUC=T)
ROC(x, z, plot="ROC", PV=T, MX=T, MI=T, AUC=T)

*** >br> Arguments (引数)
PV: Should sensitivity, specificity and predictive values at the optimal cutpoint be given on the ROC plot?
MX: Should the “optimal cutpoint” (i.e. where sens+spec is maximal) be indicated on the ROC curve?
MI : Should model summary from the logistic regression model be printed in the plot?
***

出力結果:
図1:心筋梗塞(Inf.)のROC
 

図2:狭心症(Ang.)のROC
 

重ね書きしたい時は次の様にすれば良いでしょう。

ROC(x, y, plot="ROC", PV=F, MX=F, MI=F, AUC=F)
par(new=T,col=2)
ROC(x, z, plot="ROC", PV=F, MX=F, MI=F, AUC=F)

Logistic model への当てはめは次により行うことが出来ます。

library(Epi)
mod <- glm ( y ~ x , data=dat , family=binomial )
   y.hat <- fitted ( mod , type = "response" )
   ROC ( y.hat , y , PV=F , MX=F , MI = F , cuts = 0.5 , plot="ROC" )
   classtab <- function(yy , pred, cutoff){
   tmp.y <- factor ( yy , levels=c ( 0 , 1 ) , labels = c ( "True 0" , "True 1" ) )
   pred.y <- factor ( as.numeric ( pred > cutoff ) , levels = c ( 0 , 1 ) ,
   labels = c ( "Predicted + tab <- table ( pred.y , tmp.y , deparse.level = 0 )
   class(tab) <- "classtab"
   return(tab=tab)
   }
print.classtab <- function ( obj ) { noquote ( print ( obj [1: 2 , 1: 2 ] ) )
   cat ( "\n" )
   cat ( "Sensitivity = ", round ( obj [ 2 , 2 ] / sum ( obj [ , 2 ] ) , 3 ) , "\n")
   cat ( "Specificity = ", round ( obj [ 1 , 1 ] / sum ( obj [ , 1 ] ) , 3 ) , "\n")
   }
ctab <- classtab ( y , fitted(mod , type = "response" ) , 0.5 )
ctab

出力結果
... True(0) True(1)
Predicted(0) 9 3
Predicted(1) 5 29

Sensitivity = 0.906
Specificity = 0.643

上記の出力結果は Logistic 回帰モデルで Cutoff = 0.5 とした場合です。

ところで、
心筋梗塞(Inf.)と狭心症(Ang.)の2つのAUCの比較は次により行うことが出来ます。

Web オンラインソフト(下記URL)を使って見ましょう。
参照URL

出力結果
Significance of the Difference between the Areas under Two Independent ROC Curves

「R」では、
library( pROC ) が用意されていますので、次により行います。
参照先URL

library のインストール( pROC , plyr )をしておきます。

そして、実行は次の通りです。

library(pROC)
roc.Inf <- roc ( CPK ~ Inf., data = dat )
roc.Ang <- roc( CPK ~ Ang.., data=dat )
roc.Inf
roc.Ang

roc.test ( roc1 = roc.Inf , roc2 = roc.Ang , method = "delong" )

# Bootstrap 法
roc.test ( roc1 = roc.Inf, roc2 = roc.Ang, method = "bootstrap", boot.n = 1000 )

*** 詳しくは下記URLの「pROC.pdf」を参考にして下さい。 参照先URL ***

出力結果:
DeLong's test for two ROC curves

data: roc.Inf and roc.Ang
D = -0.3029, df = 89.475, p-value = 0.7626
alternative hypothesis: true difference in AUC is not equal to 0
sample estimates:
AUC of roc1 AUC of roc2
0.8504464 0.8764569

戻る     次へ      目次へ     TOPへ