计算$ U $统计量的有效方法

时间:2018-06-18 22:19:58

标签: r performance for-loop math

令x为长度为n的向量,y为长度为m的向量, U统计量定义为:

enter image description here

如何在不使用R?中的for循环的情况下计算它?

目前,我设法将其减少到只有一个for循环,但它仍然需要一个时间程序。

2 个答案:

答案 0 :(得分:3)

外部很好做这样的嵌套操作,它将函数应用于每个元素组合并返回一个矩阵。

{{1}}

答案 1 :(得分:2)

这类似于计算AUC。有效的方案可以做到这一点:

U1 <- function(x, y) {
  sum(outer(x, y, ">"))
}

# devtools::install_github("privefl/bigstatsr")
U2 <- function(x, y) {      
  n <- length(x)
  m <- length(y)
  bigstatsr::AUC(c(x, y), rep(1:0, c(n, m))) * n * m
}

x <- rnorm(1e4)
y <- rnorm(1e3)
microbenchmark::microbenchmark(
  U1(x, y),
  U2(x, y)
)
all.equal(U1(x, y), U2(x, y))

结果:

Unit: milliseconds
     expr        min         lq       mean     median         uq       max neval cld
 U1(x, y) 207.441259 210.245571 215.022827 211.683981 214.707473 423.98014   100   b
 U2(x, y)   4.641516   5.037166   5.853701   5.154041   5.330179  21.99448   100  a 

请注意,通常,当x_i和y_j等于时,它会计数0.5(这是bigstatsr::AUC在这里所做的)。