裏 RjpWiki

Julia ときどき R, Python によるコンピュータプログラム,コンピュータ・サイエンス,統計学

ダメ出し:もろもろ

2012年06月28日 | ブログラミング

簡易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

コメント
  • X
  • Facebookでシェアする
  • はてなブックマークに追加する
  • LINEでシェアする

PVアクセスランキング にほんブログ村

PVアクセスランキング にほんブログ村