【问题标题】:Efficient method to compute the $U$ statistic计算 $U$ 统计量的有效方法
【发布时间】:2018-06-18 22:19:58
【问题描述】:

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

                                                     

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

目前,我设法将其减少到只有一个 for 循环,但这仍然是一个耗时的过程。

【问题讨论】:

  • 这是 if(x_i>y_j) then 1 else 0 的和吗?
  • 是的。我不知道如何在这个网站上使用 TeX。对不起。
  • 只有一些 Stackexchange 站点支持 TeX,不幸的是,SO 不是其中之一。请看下面我的回答。
  • 谢谢!这正是我无法表述的。 (不幸的是,由于我的声誉得分低,我无法为您的答案投票)
  • 很高兴这有帮助

标签: r performance for-loop math


【解决方案1】:

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

sum(outer(x, y, ">"))

【讨论】:

    【解决方案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 在这里所做的)。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多