RでYouden Indexを用いたROC曲線の最適カットオフ

[公開日]2017/05/15 [カテゴリー]R言語入門 Written by  IMIN

ROC曲線のカットオフの値を決める方法は様々ですが、今回はYouden Indexを用いた、最適カットオフをR言語を用いて探索するプログラムをご紹介します。

 
 

Youden Indexによるカットオフとは?

ROC曲線のカットオフの決め方の一つです。具体的には 感度+特異度-1 が最大となるようなカットオフを指します。

感度とは、疾患のある人が陽性になる確率。特異度とは、疾患のない人が陰性となる確率です。この感度と特異度の和を最大にするカットオフがYouden Indexによる方法となります。(下図)

Youden Indexを用いたROC曲線の最適カットオフを見つけ、フィッシャーの正確確率検定を行う自作関数

Youden Indexによるカットオフを探索して、フィッシャーの正確確率検定を行い、結果をcsv形式のファイルで出力する自作関数を作成しました。

yoden_fun(解析データ,出力ファイル名)

としてご利用ください。

出力内容は、名前、カットポイント、分割表の各要素(4つ)、感度、特異度、感度+特異度、正答率、サンプルサイズ

になっております。

※解析データは2列のデータフレーム型で、1列目にカットオフを探索したい列、2列目に真の値を入れるようにしてください。

 

プログラム

yoden_fun <- function(data,filename)

{

sum = 0

cut = sort(unique(data[,1]))

for(i in 1:length(sort(unique(data[,1]))))

{

dat = table(data[,2],data[,1]<cut[i])

if(ncol(dat)==1)

{

dat = cbind(dat,0)

}

tokuido =dat[1,2]/(dat[1,1]+dat[1,2])

kando = dat[2,1]/(dat[2,1]+dat[2,2])

if((kando+tokuido)>sum)

{

sum = kando + tokuido

dat2 = dat

cutpoint = cut[i]

}

}

ans <- fisher.test(dat2)

p_value <- ans[1]

tokuido =dat2[1,2]/(dat2[1,1]+dat2[1,2])

kando = dat2[2,1]/(dat2[2,1]+dat2[2,2])

N <- dat2[1]+dat2[2]+dat2[3]+dat2[4]

seitou = (dat2[1,2] + dat2[2,1])/N

result = cbind(colnames(data)[1],cutpoint,dat2[1,2],dat2[2,2],dat2[1,1],dat2[2,1],p_value,kando,tokuido,kando+tokuido,seitou,N)

colnames(result) = c("名前","カットポイント","a","b","c","d","p値","感度","特異度","感度+特異度","正答率","N")

write.table(result,filename,append=T,quote=F,sep=",",row.names=F,col.names=T,fileEncoding="CP932")

write.table("",filename,append=T,quote=F,sep=",",row.names=F,col.names=F,fileEncoding="CP932")

}

使用例

データフレーム型のdfの2列目と4列目について、探索を行う場合以下のようなプログラムになります。

プログラム

fn = "yoden.csv"

data = df[,c(2,4)]

yoden_fun(data,fn)

  • スポンサーリンク

  • コメントを残す

    メールアドレスが公開されることはありません。 * が付いている欄は必須項目です

    CAPTCHA