【问题标题】:Fixing a function on Bernoulli's simulation修复伯努利模拟的函数
【发布时间】:2019-06-21 18:45:45
【问题描述】:

我想创建一个具有三个参数的函数:样本大小、样本数量、伯努利试验中成功的真实 p。

此函数将输出以下结果:p 的平均估计值(即每个样本的 p 个估计值的平均值)、真实标准差的平均估计值(即每个样本的 sd 估计值的平均值)和最后是 95% CI 包含真实 p 的样本分数。

我想出了以下代码:

   draw_function <- function(si=1, proba= 0.5){
   sample_draw <- rbinom(n= si, 1, prob= proba)
   mean_estimate <-  mean(sample_draw)
   s_estimate <- sqrt(mean_estimate*(1-mean_estimate))
  confidence_interval <- list(c(mean_estimate - 
  1.96*s_estimate/sqrt(si), mean_estimate + 1.96*s_estimate/sqrt(si)))
    list(mean_sample = mean_estimate, s_sample = s_estimate, c_sample = 
  confidence_interval)
   }



   draw_sample <- function(s=1, r=1, p=0.5) {
   for (i in 1:r) {
     inter <-  list(mean_p=c(), mean_s = c(), mean_c = c() )
     samp <- draw_function(si=s, proba= p)
    inter$mean_p = c(inter$mean_p, samp$mean_sample)
  inter$mean_s = c(inter$mean_s, samp$s_sample)
  inter$mean_c <- c(inter$mean_c, samp$c_sample)
    if ( inter[[3]][1] > p & inter[[3]][2] < p ) {
   mean_c <- (mean_c + 1)/i
   } 
  else {
  meanc <- (mean_c + 0)/i
  }
    }

  return(list(mean(inter$mean_p), mean(inter$mean_s), inter$mean_c))

但是,即使在修改了引起我注意的错误之后,此代码也无法正常工作。

我不断收到此错误:

draw_sample 中的错误(s = 30,r = 1000,p = 0.05):
(list) 对象不能被强制输入'double'

因此,我很想寻求您的帮助以找到问题并构建这样的功能!谢谢!

【问题讨论】:

    标签: r statistics bernoulli-probability


    【解决方案1】:

    错误发生在以下部分:

    inter[[3]][1] > p & inter[[3]][2] < p
    

    使用 browser() 或逐行运行代码,你会注意到

    confidence_interval <- list(c(mean_estimate - 1.96*s_estimate/sqrt(si), 
      mean_estimate + 1.96*s_estimate/sqrt(si)))
    

    返回一个列表本身。所以如果你想自己拿零件,那就必须分别是inter[[3]][[i]][1]inter[[3]][[i]][2]

    可以进行一些优化,我最近可能会编辑此评论并提出一些建议。 :-)

    :::编辑::: 稍微深入一点的回答。 R 中的 r[dens] 函数有一些与之相关的开销。作为加快代码速度的一种简单方法,就是一次运行所有模拟,并以巧妙的方式对子集执行计算。一种方法(如果模拟在内存限制内)如下所示,将所有内容插入矩阵,然后使用 rowMeans 快速计算必要的信息。

    draw_sample <- function(s = 1, r = 1, p = .5){
      samples <- matrix(rbinom(n = r * s, size = 1, p = p), ncol = s, nrow = r, byrow = TRUE)
      mean_p <- rowMeans(samples)
      mean_s <- mean_p * (1 - mean_p)
      bound = 1.96 * mean_s / sqrt(s)
      mean_c <- mean(ifelse(mean_p - bound < p & mean_p + bound > p, 1, 0))
      list(mean_p = mean(mean_p), mean_s = mean(mean_s), mean_c = mean_c)
    }
    

    【讨论】:

    • 非常感谢!我应该使用矩阵表示法...我只是有一个简单的问题:为什么线 mean_c p & mean_p + bound p & mean_p + bound
    • 你好 Rororo 这只是我的一个错误。显然代码应该具有双重条件。我还可以看到我在 rbinom 调用中缺少 size 参数。我现在都添加了,当我尝试执行draw_sample(s = 100, r = 100, p = .5) 时它会运行。 :-)
    • 另外,ifelse 语句显然被颠倒了。我们希望下限比真实 p“小”,而上限比真实 p“大”,因为真实 p 介于两者之间。这现在也已在我的回答中得到解决。
    猜你喜欢
    • 2019-10-05
    • 2020-04-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-02-19
    • 2018-04-11
    • 2020-12-17
    相关资源
    最近更新 更多