在R中模拟数据

时间:2018-11-29 06:25:48

标签: r

对于我的统计学任务,我必须研究泊松分布的均值分布。我被要求创建一个带有输入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次。

1 个答案:

答案 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)

编辑。
尽管答案已经被接受,但我意识到有更好,更快的方法来完成此操作。
函数colMeansrowMeansmean的重复应用要快得多,因此接下来的内容将检查在这种使用情况下是否正确。

请注意,函数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

时间。我将使用两个microbenchmarkggplot2 CRAN程序包来绘制结果。

library(ggplot2)
library(microbenchmark)

mb <- microbenchmark(
  v1 = poi_bar(8, 2500, 17), 
  v2 = poi_bar2(8, 2500, 17)
  )
print(mb)
autoplot(mb)

enter image description here