修复伯努利模拟的函数

时间:2019-01-28 17:44:37

标签: r statistics bernoulli-probability

我想创建一个具有三个参数的函数:样本数量,样本数量,伯努利试验中成功的真实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):
  (列表)对象不能强制输入“ double”

因此,我想寻求您的帮助以发现问题并建立这样的功能!谢谢!

1 个答案:

答案 0 :(得分:0)

该错误在以下部分中发生:

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)
}