Как быстрее всего найти квантили каждой строки в матрице с R?

D <- matrix(rnorm(2000), nrow=2, ncol=1000)

t(matrix(c(quantile(D[1,], c(0.05,0.95)), quantile(D[2,], c(0.05,0.95))), nrow=2))

У меня есть матрица 2 на 1000, каждый из столбцов которой представляет собой пару наблюдений (X, Y). Я хочу найти одинаковые квантили каждой строки. скажем q_0.05 и q_0.95. Каков самый быстрый способ вычислить это?


person Paw in Data    schedule 30.09.2020    source источник
comment
@RonakShah Данк, ты в порядке!   -  person Paw in Data    schedule 30.09.2020
comment
rowQuantiles из matrixstats кажется быстрее stackoverflow.com/a/46717647   -  person Ronak Shah    schedule 30.09.2020


Ответы (1)


Попробуйте matrixStats::rowQuantiles.

library(matrixStats)
microbenchmark::microbenchmark(baseR=apply(D, 1, quantile, c(0.05, 0.95)),
                               matrixStats=rowQuantiles(D, probs=c(.05, .95)), 
                               times=10L)

# Unit: milliseconds
#        expr     min       lq     mean   median       uq      max neval cld
#       baseR 222.127 227.1580 238.7553 229.6283 233.1329 326.8730    10   b
# matrixStats 145.262 160.9838 171.9204 161.8530 168.4477 263.1476    10  a 

y1 <- t(apply(D, 1, quantile, c(.05, .95)))
y2 <- rowQuantiles(D, probs=c(.05, .95))
stopifnot(all.equal(y1, y2))

Данные:

set.seed(42)
D <- matrix(rnorm(2e6), nrow=2, ncol=2e6)
person jay.sf    schedule 30.09.2020