使用随机化测试需要用户随机将某些矢量等重新排序为空模型。
在我的情况下,我有一个10,000个元素的向量,我必须从中重新取样。我们现在就这样做:
x <- sample(c(TRUE, FALSE), 10000, TRUE)
所以我的实际数据看起来像x
。我想随机重新排序矢量x
,n
次。这可以完成:
lapply(1:1000, function(i) sample(x))
在这种情况下,需要进行1000次重复:
start <- Sys.time()
lapply(1:1000, function(i) sample(x))
Sys.time() - start
Time difference of 10.20258 secs
现在考虑必须进行一些额外的计算,这是针对距离矩阵中的一个单元格。现在将此开销乘以i
x j
矩阵,这会耗费大量时间。 是否有更快的方式重新调整x
向量(最好是在基数R中)n
次?我使用list
结构但是如果矩阵结构更多高效我对任何事情持开放态度。在我的列表中,各个元素与原始x
具有完全相同的TRUE / FALSE比例。这是随机化测试的关键。
答案 0 :(得分:4)
在R中打印可能很慢(更不用说并非所有内容都会被打印到屏幕上)。
尝试改为分配输出:
> start <- Sys.time()
> out <- lapply(1:1000, function(i) sample(x))
> Sys.time() - start
Time difference of 0.7525001 secs
答案 1 :(得分:4)
在大多数情况下,vapply
比lapply
快。您还可以考虑replicate
进行简单复制,因为所有采样都独立于i
:
fun1 <- function() lapply(1:1000, function(i) sample(x))
fun2 <- function() vapply(1:1000, function(i) sample(x), FUN.VALUE = x)
fun3 <- function() replicate(1000, sample(x), simplify = FALSE)
library(microbenchmark)
microbenchmark(fun1(), fun2(), fun3())
Unit: milliseconds
expr min lq median uq max neval
fun1() 363.3359 387.9058 531.3358 731.9839 9850.098 100
fun2() 403.4411 469.3090 587.7403 747.8655 15495.549 100
fun3() 363.2694 374.1643 516.9334 600.4151 6231.890 100
# Note that `vapply` returns a matrix, not a list.
函数replicate
似乎对此任务稍微有效。