无法重现论文结果(样本大小)

机器算法验证 r 二项分布 样本量
2022-04-05 00:41:15

我有兴趣使用本文的结果(修改后的二项式比例的精确样本量,特别强调Geoffrey Fosgate 的诊断性休息参数估计)来计算样本量。在 R 的 binomSamSize 包中有一个用于计算样本大小的算法的实现。我检查了用于计算它的代码,它似乎完全符合论文,但论文结果部分中显示的结果似乎不可重现。样本量太小了。

该论文需要订阅才能完整查看,但这里有一个片段来显示如何计算样本量:

在此处输入图像描述

这是我要重现的结果: 在此处输入图像描述

这是我正在使用的代码(从 binomSamSize 包中提取):

ciss.midp <- function(p0, d, alpha, nMax = 1e+06){
  pi.L <- p0 - d
  pi.U <- p0 + d
  if (pi.L < 0) 
    stop("p0 - d is below zero!")
  if (pi.U > 1) 
    stop("p0 + d is above one!")
  n <- floor(max(1/p0, 1/(1 - p0)))
  done <- FALSE
  while (!done & (n < nMax)) {
    n <- n + 1
    x <- round(p0 * n)
    lhs2 <- 1/2 * dbinom(x, size = n, prob = pi.L) + 1/2 * 
      dbinom(x, size = n, prob = pi.U) + 
      pbinom(x, size = n, prob = pi.L, lower.tail = FALSE) + 
      pbinom(x - 1, size = n, prob = pi.U)
    if (!is.na(lhs2)) {
      done <- (lhs2 < alpha)
    }
  }
  return(n)
}

我最终要生成带圆圈的列是这样的:

> sapply(seq(0.5, 0.9, 0.05), function(i) ciss.midp(p0=i, d=0.1, alpha=0.1))
[1] 68 67 65 61 57 50 42 34 23

PS:如果我还能提供什么让这个问题更容易回答,请在评论中告诉我。

1个回答

也许作者的实现 - 尽管有描述 - 从一个大的 n 开始,然后在我们第一次高于 alpha 时返回并停止,从而返回总和低于 alpha 的最后一个 n?至少这种算法的实现将与论文的结果一致(下面的测试代码)。

似乎有不止一个 n,其中从总和高于 n 的 alpha 和低于 n + 1 的 alpha 的转换......但是,我确实认为从小 n 及以上开始会更好。

##Go the other way...not my 1st choice though...
ciss.midp2 <- function (p0, d, alpha, nMax = 1e+05) {
    pi.L <- p0 - d
    pi.U <- p0 + d
    if (pi.L < 0)
        stop("p0 - d is below zero!")
    if (pi.U > 1)
        stop("p0 + d is above one!")
    n <- nMax
    done <- FALSE
    while (!done & (n > 0)) {
        n <- n - 1
        x <- round(p0 * n)
        lhs2 <- 1/2 * dbinom(x, size = n, prob = pi.L) +
          pbinom(x, size = n, prob = pi.L, lower.tail = FALSE) +
          (1 - pbinom(x-1, size = n, prob = pi.U, lower.tail=FALSE)) +
          1/2*dbinom(x, size = n, prob = pi.U)

        if (!is.na(lhs2)) {
            done <- (lhs2 > alpha)
        }
    }
    return(n+1)
}

library("binomSamSize")
p.grid <- seq(0.5, 0.9, 0.05)
sapply(p.grid, function(i) ciss.midp(p0=i, d=0.1, alpha=0.1))
[1] 68 67 65 61 57 50 42 34 23
sapply(p.grid, function(i) ciss.midp2(p0=i, d=0.1, alpha=0.1)
[1] 68 67 65 61 57 52 45 39 29