统计数据:Alpha 和 Beta 之间的关系

机器算法验证 统计学意义 数理统计
2022-02-13 10:28:50

我的问题与 alpha 和 beta 之间的关系以及它们在统计中的定义有关。

alpha = I 型错误率 = 考虑 NULL 假设正确的显着性水平

Beta = II 型错误率

如果 alpha 降低(特异性随着 alpha = 1 - 特异性而增加),则 beta 增加(灵敏度/功效随着 beta = 1 - 灵敏度/功效而降低)

alpha 的变化如何影响 beta ? 是否存在线性关系?alpha/beta 的比率是否始终相同,换句话说,特异性/敏感性比率始终相同吗?如果是,这意味着通过使用 bonferroni 校正,我们只是转向更低的灵敏度和更高的特异性,但我们不会改变灵敏度/特异性比。这样说对吗?

更新(案例特定问题):

对于给定的实验设计,我们对数据运行 5 个线性模型。我们的真阳性率(灵敏度/功效)为 0.8,真阴性率(特异性)为 0.7。(让我们想象一下,我们知道什么应该是积极的,什么不应该是积极的。)。如果我们现在使用 Bonferroni 将显着性水平修正为 0.05 / 5 = 0.01。我们可以数值估计得到的真阳性率(灵敏度/功率)和真阴性率(特异性)吗?

非常感谢你的帮助。

3个回答

α是相关的。我将尝试通过诊断测试来说明这一点。假设您有一个测量血液标志物水平的诊断测试。众所周知,与健康人相比,患有某种疾病的人的这种标志物水平较低。很明显,您必须确定一个临界值,低于该临界值的人被归类为“生病”,而高于该临界值的人被认为是健康的。然而,即使病人和健康人中,血液标志物的分布也很可能有很大差异。一些健康人的血液标志物水平可能非常低,即使他们非常健康。β

有四种可能发生:

  1. 一个病人被正确识别为病人(真阳性 = TP)
  2. 病人被错误地归类为健康人(假阴性 = FN)
  3. 一个健康的人被正确识别为健康(真阴性 = TN)
  4. 一个健康的人被错误地归类为有病(假阳性 = FP)

这些可能性可以用2x2 表来说明:

               Sick Healthy
Test positive   TP     FP
Test negative   FN     TN

α表示误报率,即是假阴性率,即我写了一个简单的脚本以图形方式说明情况。α=FP/(FP+TN)ββ=FN/(TP+FN)R

alphabeta <- function(mean.sick=100, sd.sick=10, 
    mean.healthy=130, sd.healthy=10, cutoff=120, n=10000, 
    side="below", do.plot=TRUE) {
      
      popsick <- rnorm(n, mean=mean.sick, sd=sd.sick)
      pophealthy <- rnorm(n, mean=mean.healthy, sd=sd.healthy)
      
      if ( side == "below" ) {
        
        truepos <- length(popsick[popsick <= cutoff])
        falsepos <- length(pophealthy[pophealthy <= cutoff])
        trueneg <- length(pophealthy[pophealthy > cutoff])
        falseneg <- length(popsick[popsick > cutoff])
        
      } else if ( side == "above" ) {
        
        truepos <- length(popsick[popsick >= cutoff])
        falsepos <- length(pophealthy[pophealthy >= cutoff])
        trueneg <- length(pophealthy[pophealthy < cutoff])
        falseneg <- length(popsick[popsick < cutoff])
        
      }
      
      twotable <- matrix(c(truepos, falsepos, falseneg, trueneg), 
                    2, 2, byrow=T)
      rownames(twotable) <- c("Test positive", "Test negative")
      colnames(twotable) <- c("Sick", "Healthy")
      
      spec <- twotable[2, 2]/(twotable[2, 2] + twotable[1, 2])
      alpha <- 1 - spec
      sens <- pow <- twotable[1, 1]/(twotable[1, 1] + 
                      twotable[2, 1])
      beta <- 1 - sens
      
      pos.pred <- twotable[1,1]/(twotable[1,1] + twotable[1,2])
      neg.pred <- twotable[2,2]/(twotable[2,2] + twotable[2,1])
      
      if ( do.plot == TRUE ) {        
        dsick <- density(popsick)
        dhealthy <- density(pophealthy)
        
        par(mar=c(5.5, 4, 0.5, 0.5))
        plot(range(c(dsick$x, dhealthy$x)), range(c(c(dsick$y, 
       dhealthy$y))), type = "n", xlab="", ylab="", 
           axes=FALSE)
        box()
        axis(1, at=mean(pophealthy), 
         lab=substitute(mu[H[0]]~paste("=", m, sep=""), 
         list(m=mean.healthy)), cex.axis=1.5, tck=0.02)
        axis(1, at=mean(popsick), 
           lab=substitute(mu[H[1]] ~ paste("=", m, sep=""), 
           list(m=mean.sick)), cex.axis=1.5, tck=0.02)                                        
        axis(1, at=cutoff, lab=substitute(italic(paste("Cutoff=", 
         coff, sep="")), list(coff=cutoff)), pos=-0.004, 
          tick=FALSE, cex.axis=1.25)
        lines(dhealthy, col = "steelblue", lwd=2)
        
        if ( side == "below" ) {
          polygon(c(cutoff, dhealthy$x[dhealthy$x<=cutoff], 
          cutoff), c(0, dhealthy$y[dhealthy$x<=cutoff],0), 
            col = "grey65")
        } else if ( side == "above" ) {
          polygon(c(cutoff, dhealthy$x[dhealthy$x>=cutoff], 
            cutoff), c(0, dhealthy$y[dhealthy$x>=cutoff],0), 
            col = "grey65")
        }
        
        lines(dsick, col = "red", lwd=2)
        
        if ( side == "below" ) {
          polygon(c(cutoff, dsick$x[dsick$x>cutoff], cutoff), 
          c(0, dsick$y[dsick$x>cutoff], 0) , col="grey90")
        } else if ( side == "above" ) {
          polygon(c(cutoff, dsick$x[dsick$x<=cutoff], cutoff), 
            c(0, dsick$y[dsick$x<=cutoff],0) , col="grey90")
        }
        
        legend("topleft",
               legend= 
          (c(as.expression(substitute(alpha~paste("=", a), 
           list(a=round(alpha,3)))), 
             as.expression(substitute(beta~paste("=", b), 
             list(b=round(beta,3)))))), fill=c("grey65", 
             "grey90"), cex=1.2, bty="n")
        abline(v=mean(popsick), lty=3)
        abline(v=mean(pophealthy), lty=3)
        abline(v=cutoff, lty=1, lwd=1.5)
        abline(h=0)
        
      }
      
      #list(specificity=spec, sensitivity=sens, alpha=alpha, beta=beta, power=pow, positiv.predictive=pos.pred, negative.predictive=neg.pred)
      
      c(alpha, beta)
      
    }

让我们看一个例子。我们假设病人血液标志物的平均水平为 100,标准差为 10。在健康人中,平均血液水平为 140,标准差为 15。临床医生将临界值设置为 120。

    alphabeta(mean.sick=100, sd.sick=10, mean.healthy=140, 
         sd.healthy=15, cutoff=120, n=100000, do.plot=TRUE, 
         side="below")

                  Sick Healthy
    Test positive 9764     901
    Test negative  236    9099

Beta 和 alpha,截止值为 120

您会看到阴影区域彼此相关。在这种情况下,但是,如果临床医生以不同的方式设置截止值会怎样?让我们把它设置得低一点,到 105 看看会发生什么。α=901/(901+9099)0.09β=236/(236+9764)0.024

              Sick Healthy
Test positive 6909      90
Test negative 3091    9910

截止 105

我们的现在非常低,因为几乎没有健康人被诊断为生病。但是我们的增加了,因为血液标志物水平高的病人现在被错误地归类为健康人。αβ

最后,让我们看看对于不同的截止值是如何变化的:αβ

    cutoffs <- seq(0, 200, by=0.1)
    cutoff.grid <- expand.grid(cutoffs)
    
    plot.frame <- apply(cutoff.grid, MARGIN=1, FUN=alphabeta, 
        mean.sick=100, sd.sick=10, mean.healthy=140, 
        sd.healthy=15, n=100000, do.plot=FALSE, side="below")
    
    plot(plot.frame[1,] ~ cutoffs, type="l", las=1, 
      xlab="Cutoff value", ylab="Alpha/Beta", lwd=2, 
      cex.axis=1.5, cex.lab=1.2)
    lines(plot.frame[2,]~cutoffs, col="steelblue", lty=2, lwd=2)
    legend("topleft", legend=c(expression(alpha), 
       expression(beta)), lwd=c(2,2),lty=c(1,2), col=c("black", 
       "steelblue"), bty="n", cex=1.2)

具有不同截止值的 alpha 和 beta 绘图

您可以立即看到的比率不是恒定的。同样非常重要的是效果大小。在这种情况下,这将是病人和健康人血液标志物水平平均值的差异。差异越大,两组越容易被截断分开:αβ

完美截止

在这里,我们有一个“完美”的测试,因为 150 的截止值可以区分病人和健康人。


Bonferroni 调整

Bonferroni 调整减少了误差,但扩大了 II 型误差 ( )这意味着做出错误否定决定的错误会增加,而错误肯定会最小化。这就是为什么 Bonferroni 调整通常被称为保守的原因。在上图中,请注意是如何增加的:它从增加到同时,下降αββ0.020.31α0.090.01

对于未来的其他人:

在样本量估计中,Ztotal 是通过将对应于 alpha 的 Z 和对应于 power (1-beta) 的 Z 相加来计算的。所以在数学上,如果样本量保持不变,增加 alpha 的 Z 意味着您将 Z 的功率降低相同的数量,例如,将 Zalpha 从 0.05 增加到 0.1 会降低 Zpower 0.05。

不同之处在于 alpha 的 Z 是双尾的,而 beta 的 Z 是 1 尾的。因此,虽然 Z 值变化相同的量,但该 Z 值对应的概率百分比不会变化相同的量。

例子:

5% alpha(95% 置信度)和 80% 功效(20% beta)给出的样本量与

20% 的 alpha(80% 置信度)和 93.6% 的功效(6.4% 的 beta),而不是 1:1 时的 95% 功效。

阿尔法和贝塔之间没有一般的关系。

这完全取决于您的测试,举个简单的例子:

(维基百科)

在口语中,第一类错误可以被认为是“让一个无辜的人有罪”,第二类错误是“让一个有罪的人自由”。

陪审团可以是严厉的:没有 II 类错误,有些是 I 陪审团可以是“友善”的:没有 I 类,但有一些 II 陪审团可以是正常的:一些 I 类和一些 II 陪审团可以是完美的:没有错误

在实践中有两种拮抗作用:

当测试质量提高时,I 类和 II 类错误会减少,直到某个点。当陪审团进步时,他倾向于对无辜和有罪的人做出更好的判断。

在某个时间点之后,潜在的问题出现在测试的构建中。I 型或 II 型对于运行测试的人来说更重要。以陪审团为例,第一类错误更为重要,因此建立法律程序以避免第一类错误。如果有任何疑问,该人是自由的。直觉上,这会导致 II 型错误的增加。

关于邦费罗尼:

(又是维基百科)

Bonferroni 校正仅控制误报的概率。校正通常以增加产生假阴性的可能性为代价,从而降低统计功效。在测试大量假设时,这可能会导致较大的临界值。