这是一个简单的任务,以获得随机数的贝茨分布。我需要一百万个平均值来运行一万次:
bates1 = replicate(10000, mean(runif(1e+06,1,5)))
summary(bates1)
我等了很久才完成它的计算。我尝试了for循环也没有用(无限慢)。
有什么办法吗?
我试过for循环,
set.seed(999)
for (i in 1:10000) {
x <- randomLHS(1e+6,1)
x <- 1 + 4*x
y[i] <- mean(x)
}
summary(y)
在代码之前,为x和y分配空间(使用length())。
4条答案
按热度按时间kyxcudwk1#
如果不进行并行化,我们可以通过找到所需函数的高性能版本来加快速度。
dqrng
package的runif
版本比base快3倍,在长向量上sum(x) / length(x)
比mean(x)
快一点。结合这两种方法,我们得到了> 3倍的速度提升,如果结合并行化,速度会更快,如neilfws的回答:
不到1.5分钟(相比之下,我的笔记本电脑上的原始代码大约需要6.5分钟)。
9jyewag02#
在R中有很多方法可以进行并行计算。您可以查看:
举个例子,在我的工作机器(一台普通的Surface Book 2)上使用
doParallel
库:所以大约2分钟,而不是5分钟多一点(不完全是“永远”,但足够长)。
其中一些也可能有所帮助。
uujelgoq3#
贝茨分布可以看作是正态分布的多项式近似(当
n
接近Inf
时,它是正态分布)。对于n = 1e6
,正态分布是一个非常好的近似。使用1e5
示例演示:这两组样本在数值上基本上是不可区分的。为了进行比较,绘制正态分布中两个不同样本的经验CDF。
j8ag8udp4#
你不能在这里模拟贝茨分布。整数参数为n的Bates分布是(0,1)上n个均匀随机变量的均值。一个快速获得它的方法是: