2017/05/15
2020/05/04
RでYouden Indexを用いたROC曲線の最適カットオフ
ROC曲線のカットオフの値を決める方法は様々ですが、今回はYouden Indexを用いた、最適カットオフをR言語を用いて探索するプログラムをご紹介します。
R言語について、さらに学びたい方は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)
R言語について、さらに学びたい方はR言語入門をご覧ください。
Recommended