在R中生成n i.i.d伯努利变量的样本

时间:2016-09-26 21:56:48

标签: r statistics

我正在尝试在R中编写一个函数,它产生一组n i.i.d伯努利随机变量X1,X2,...,Xn~B(1,π)。

生成M = 1000个随机样本。当n = 10且pi = 0.4时。

我无法启动代码。如果有人能提供帮助,那将非常感激。

以下是我遇到的问题:

rbinom(n=10,prob=.4,size=1)

现在我想将这些变量组装成一个1000个样本的矩阵,这些样本通过rbinom函数运行。

2 个答案:

答案 0 :(得分:2)

采取你迄今为止所做的事情:

set.seed(101) ## for reproducibility
rr <- replicate(1000,rbinom(n=10,prob=.04,size=1))

创建1000个样本。

dim(rr)
## [1] 10 1000
mean(rr)
## [1] 0.0411

即。这是10行×1000列;如果您愿意,可以使用t()转置它。如果您在simplify=FALSE电话中指定replicate(),则会获得长度为10的向量列表。

(关于你是否想要0.04或0.4的概率,你的问题是不一致的,但你应该能够自己解决这个问题。)

对于这个特殊问题,你也可以使用

matrix(rbinom(10000,prob=0.04,size=1),nrow=10)

matrix(as.numeric(runif(10000)<0.04),nrow=10)

答案 1 :(得分:0)

一种快速的解决方案是使用sample而不是runifrbinom

n <- 10L
m <- 1000L
p <- .04

set.seed(1)
microbenchmark::microbenchmark(
  replicate               = replicate(m, rbinom(n = n, prob = p, size = 1)), 
  `matrix rbinom`         = matrix(rbinom(m * n, prob = p, size = 1), nrow = n),
  `matrix runif`          = matrix(as.numeric(runif(m * n) < p), nrow = n), 
  `matrix sample`         = matrix(
    sample(1:0, size = m * n, replace = TRUE, prob = c(p, 1 - p)), nrow = n),
  `matrix sample logical` = matrix(
    sample(c(T, F), size = m * n, replace = TRUE, prob = c(p, 1 - p)), nrow = n))
#R Unit: microseconds
#R                   expr      min        lq       mean    median        uq       max neval
#R              replicate 2453.795 2499.4770 3397.60451 2539.1285 2583.8825 70546.023   100
#R          matrix rbinom  347.826  349.6820  359.90301  357.5655  359.4210   424.812   100
#R           matrix runif  288.464  290.7830  301.35238  297.0440  299.1310   406.262   100
#R          matrix sample  105.276  111.0735  116.48064  113.1600  116.4065   192.928   100
#R  matrix sample logical   83.943   86.0295   89.31318   87.1890   88.5800   135.885   100