R中runif和样本之间的区别?

时间:2014-11-17 17:23:12

标签: r random-sample

就他们使用的概率分布而言?我知道runif给出了小数,而样本给出了整数,但我感兴趣的是样本是否也使用“均匀概率分布”?

3 个答案:

答案 0 :(得分:10)

考虑以下代码和输出:

> set.seed(1)
> round(runif(10,1,100))
 [1] 27 38 58 91 21 90 95 66 63  7
> set.seed(1)
> sample(1:100, 10, replace=TRUE)
 [1] 27 38 58 91 21 90 95 67 63  7

这强烈建议当被要求做同样的事情时,2个函数提供几乎相同的输出(尽管有趣的是round提供相同的输出而不是floor或{{1 }})。主要区别在于默认值,如果你不改变那些默认值,那么两者都会给出称为统一的东西(虽然ceiling会被认为是离散的统一,默认情况下没有替换)。

<强> 修改

更正确的比较是:

sample

而不是使用> ceiling(runif(10,0,100)) [1] 27 38 58 91 21 90 95 67 63 7

我们甚至可以提升一个档次:

round

当然如果使用> set.seed(1) > tmp1 <- sample(1:100, 1000, replace=TRUE) > set.seed(1) > tmp2 <- ceiling(runif(1000,0,100)) > all.equal(tmp1,tmp2) [1] TRUE probs参数(并非所有值都相等),那么它将不再是统一的。

答案 1 :(得分:7)

来自一组固定输入的

sample samples ,如果传入length-1输入作为第一个参数,则返回整数输出(s )。

另一方面,runif会从真实评估的范围中返回一个样本。

 > sample(c(1,2,3), 1)
 [1] 2
 > runif(1, 1, 3)
 [1] 1.448551

答案 2 :(得分:0)

sample()的运行速度超过ceiling(runif()) 这有助于了解是进行多次模拟还是自举。

原始时间试用脚本,时间测试4个等效脚本:

n<- 100                     # sample size
m<- 10000                   # simulations
system.time(sample(n, size=n*m, replace =T))  # faster than ceiling/runif 
system.time(ceiling(runif(n*m, 0, n)))
system.time(ceiling(n * runif(n*m)))
system.time(floor(runif(n*m, 1, n+1)))

比例时间优势随着n和m而增加,但是注意你不要填补记忆!

BTW不要使用round()将均匀分布的连续转换为均匀分布的整数,因为终端值的选择时间只有它们的一半。