我正在尝试在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
函数运行。
答案 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
而不是runif
或rbinom
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