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