【问题标题】:Simulating data in R在 R 中模拟数据
【发布时间】:2018-11-30 03:04:06
【问题描述】:

对于我的统计任务的一部分,我必须研究泊松分布的均值分布。我被要求创建一个带有输入 n、N、lambda 的函数 poi_bar,其中我们有一个长度为 N 的向量,并且向量中的每个单独条目都等于在 lambda = lambda 的泊松分布上选择的 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

但我希望样本不同,而不是重复一次二十五次。

【问题讨论】:

  • 这是一个与 RStudio 无关的 R 问题。我将编辑问题标题。
  • 查看我添加到答案中的代码。它使其更加完整,并提供了一种旨在提高速度的替代解决方案。

标签: r


【解决方案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

还有时间。我将使用两个 CRAN 包,microbenchmarkggplot2 来绘制结果。

library(ggplot2)
library(microbenchmark)

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-03-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多