「簡易ROC」について
もろもろ。プログラムの書き方自体も相変わらずだけど(ひょっとして,Hatena では,ちゃんと書いたプログラムでも,空白がはがされてこんなになるのだろうかと??)。my.roc2 のように書く方がよいだろうということで。
my.roc<-function(x,y,t=NULL){
Nx <- length(x)
Ny <- length(y)
if(is.null(t))t<-seq(from=min(x,y),to=max(x,y),length=100)
xa<-outer(x,t,FUN="<")
ya<-outer(y,t,FUN="<")
xb<-apply(sign(xa),2,sum)
yb<-apply(sign(ya),2,sum)
xy<-data.frame(X=Nx-xb,Y=Ny-yb)
return(xy)
}
my.roc2 <- function(x, y, t = NULL) {
Nx <- length(x)
Ny <- length(y)
if (is.null(t))
t <- seq(from = min(x, y), to = max(x, y), length = 100)
xa <- outer(x, t, FUN = ">=") # 後で Nx-xb するなら,最初からこうしておけばよい
ya <- outer(y, t, FUN = ">=")
xb <- colSums(xa) # apply は遅い
yb <- colSums(ya)
data.frame(X = xb, Y = yb)
}
set.seed(123456)
x <- rnorm(1000, mean = 0, sd = 5)
y <- rnorm(2000, mean = 3, sd = 3)
t <- seq(from = -5, to = 20, length = 1000)
roc.out <- my.roc(x, y, t)
roc.out2 <- my.roc2(x, y, t)
all.equal(roc.out, roc.out2)
library(rbenchmark)
benchmark(my.roc(x, y, t), my.roc2(x, y, t))
結果が等しいことと,roc.out2 の方が少しは速いということで。
> all.equal(roc.out, roc.out2)
[1] TRUE
> library(rbenchmark)
> benchmark(my.roc(x, y, t), my.roc2(x, y, t))
test replications elapsed relative user.self sys.self
1 my.roc(x, y, t) 100 42.099 1.645392 38.849 3.856
2 my.roc2(x, y, t) 100 25.586 1.000000 23.570 2.141