多次元化ROCカーブ

  • こちらROCカーブとsurvival ROCカーブなるものを勉強した
  • ROCカーブってなんだっけ?
    • 2つの群があって、それぞれのサンプルがスカラー量を持っているときに、閾値を動かしてやって、その閾値の大小の割合を2つのそれぞれの群について算出する。閾値に対して2群のそれぞれに値が得られるから、それを対応のある値セットとして2次元にプロットする
  • 一般化してみる
    • 2つとは限らず、k個の群があって
    • それぞれのサンプルが、スカラー量とは限らず、d次元のベクトル情報を持っているとき、
    • その閾値(スカラー量)ではなくて、d次元空間を2分する線(等高線のようなもの)を設定してやり
    • 2つではなくてk個の群のそれぞれについてて、等高線の片側・もう片側に属する割合を算出する
    • 等高線の引き方ごとにk個の値が対応を持って得られるから
    • それをk次元空間にプロットする
  • Rでやってみる
    • 以下の例では、k=3群、d=2次元情報
    • 等高線様のものは、たとえば、ということで、全サンプルの重心を中心とした同心円とした
    • 3群の分布の様子と、

    • そこから得られた3群用ROCカーブ

    • この3次元プロットは、3次元を使っているのに、1本の線しか引いていなくてもったいない感じがする
    • では、ということで、適当に中心を定め、適当に半径を定めて、2領域に分けたうえで、どんなROCになるかを見てみると、こんな感じ
      • この点が作る3次元の形の見方がわかれば、k群の「弁別」の具合に関する何かしらの指標ともいえそうだ

k <- 3
d <- 2
m <- matrix(runif(k*d),ncol=d)
sd <- matrix(runif(k*d),ncol=d)
n <- sample(100:200,k)

x <- NULL
xall <- NULL
pheno <- c()
for(i in 1:k){
	x[[i]] <- matrix(0,n[i],ncol = d)
	for(j in 1:d){
		x[[i]][,j] <- rnorm(n[i],m[i,j],sd[i,j])
	}
	xall <- rbind(xall,x[[i]])
	pheno <- c(pheno,rep(i,n[i]))
}

plot(xall,col=pheno)

ctr <- apply(xall,2,mean)

xall.ctrd <- t(t(xall)-ctr)

plot(xall.ctrd,col = pheno)

norms <- sqrt(apply(xall.ctrd^2,1,sum))
max.norm <- max(norms)

norm.parameter <- seq(from = 0,to =max.norm,length=100)

num.inside <- matrix(0,length(norm.parameter),k)

for(i in 1:length(norm.parameter)){
	tmp.inside <- which(norms <= norm.parameter[i])
	for(j in 1:k){
		num.inside[i,j] <- length(which(pheno[tmp.inside] == j))/n[j]
	}
}

library(rgl)
plot3d(num.inside)
    • 領域分割をばらばらにする
num.point <- 10000
num.inside <- matrix(0,num.point,k)
for(i in 1:num.point){
	tmp.ctr <- apply(xall,2,sample,1)
	tmp.r <- runif(1)*mean(norms)
	tmp.ctrd <- t(t(xall)-tmp.ctr)
	tmp.norms <- sqrt(apply(tmp.ctrd^2,1,sum))
	tmp.inside <- which(tmp.norms <= tmp.r)
	for(j in 1:k){
		num.inside[i,j] <- length(which(pheno[tmp.inside] == j))/n[j]
	}

}

plot3d(num.inside)