对于我的统计学任务,我必须研究泊松分布的均值分布。我被要求创建一个带有输入n,N,lambda的函数poi_bar,其中我们有一个长度为N的向量,向量中的每个单独项都等于在Lambda = lambda的Poisson分布中选择的n个数的平均值。
我尝试了十几种方法,并在互联网上搜索了数小时,但没有发现任何信息可以告诉我如何执行此操作。我能获得的最接近的是当我定义如下函数时:
poi_bar = function(n, N, lambda) {
V = rep(c(mean(rpois(n, lambda = lambda))), times = N)
return(V)
}
要测试此方法是否确实有效,我尝试了n = 8,N = 25,lambda = 17,结果是:
poi_bar(8,25,17)
[1] 18.375 18.375 18.375 18.375 18.375 18.375 18.375 18.375
[9] 18.375 18.375 18.375 18.375 18.375 18.375 18.375 18.375
[17] 18.375 18.375 18.375 18.375 18.375 18.375 18.375 18.375
[25] 18.375
但是我希望样本有所不同,而不仅仅是重复25次。
答案 0 :(得分:1)
您应该使用replicate
,而不是rep
。
poi_bar <- function(n, N, lambda) {
V <- replicate(N, mean(rpois(n, lambda = lambda)))
V
}
set.seed(1234)
poi_bar(8, 25, 17)
编辑。
尽管答案已经被接受,但我意识到有更好,更快的方法来完成此操作。
函数colMeans
和rowMeans
比mean
的重复应用要快得多,因此接下来的内容将检查在这种使用情况下是否正确。
请注意,函数poi_bar
与上面的函数相同,但是为了使时间合理,我将其重写为单行代码。原来更清晰。
poi_bar = function(n, N, lambda) {
replicate(N, mean(rpois(n, lambda = lambda)))
}
poi_bar2 = function(n, N, lambda) {
colMeans(replicate(N, rpois(n, lambda = lambda)))
}
现在测试它们,看看结果是否相同。
set.seed(1234)
p <- poi_bar(8, 2500, 17)
set.seed(1234)
p2 <- poi_bar2(8, 2500, 17)
identical(p, p2)
#[1] TRUE
时间。我将使用两个microbenchmark
和ggplot2
CRAN程序包来绘制结果。
library(ggplot2)
library(microbenchmark)
mb <- microbenchmark(
v1 = poi_bar(8, 2500, 17),
v2 = poi_bar2(8, 2500, 17)
)
print(mb)
autoplot(mb)