解释两侧、两个样本、Welch T 检验

机器算法验证 分布 t检验 javascript
2022-04-03 21:24:54

我正在编写一些代码(JavaScript)来比较基准测试结果。我正在使用Welch T 检验,因为基准测试之间的方差和/或样本量很可能不同。临界值是从 T 分布表中以 95% 置信度(双边)提取的。

韦尔奇公式非常简单,但我对重要结果的解释很模糊。我不确定临界值是否应该除以 2。感谢您帮助清理。我也应该四舍五入自由度df来查找临界值还是Math.ceilMath.floor合适?

  /**
   * Determines if the benchmark's hertz is higher than another.
   * @member Benchmark
   * @param {Object} other The benchmark to compare.
   * @returns {Number} Returns `1` if higher, `-1` if lower, and `0` if indeterminate.
   */
  function compare(other) {
    // use welch t-test
    // http://frank.mtsu.edu/~dkfuller/notes302/welcht.pdf
    // http://www.public.iastate.edu/~alicia/stat328/Regression%20inference-part2.pdf
    var a = this.stats,
        b = other.stats,
        pow = Math.pow,
        bitA = a.variance / a.size,
        bitB = b.variance / b.size,
        df = pow(bitA + bitB, 2) / ((pow(bitA, 2) / a.size - 1) + (pow(bitB, 2) / b.size - 1)),
        t = (a.mean - b.mean) / Math.sqrt(bitA + bitB),
        c = getCriticalValue(Math.round(df));

    // check if t-statistic is significant
    return Math.abs(t) > c / 2 ? (t > 0 ? 1 : -1) : 0;
  }

更新:感谢到目前为止的所有回复!我的同事在这里发布了更多信息,以防影响建议。

4个回答

(1a)您不需要 Welch 检验来应对不同的样本量。这是由学生 t 检验自动处理的。

(1b)如果您认为两个总体中的方差很有可能存在很大差异,那么您先验地假设这两个总体不同。这可能不是位置的差异——这是 t 检验评估的——但它仍然是一个重要的差异。不要通过忽略这种差异的测试来掩盖它!(方差差异通常出现在一个样本被一些极端结果“污染”的情况下,同时移动位置并增加方差。由于方差很大,很难检测到位置的变化(无论它有多大) 在中小型样本中,因为方差的增加大致与平方成正比位置的变化。例如,当实验组中只有一小部分对治疗有反应时,就会发生这种形式的“污染”。)因此,您应该考虑更合适的测试,例如滑点测试更好的是使用探索性数据分析技术的自动化程度较低的图形方法。

(2)当平均值在任一方向(更大或更小)可能发生变化时,使用双侧测试。否则,当您仅测试平均值的增加或减少时,请使用单边测试。

(3)舍入是不正确的,你不应该这样做:大多数计算 t 分布的算法并不关心自由度是否是整数。四舍五入不是什么大问题,但如果您首先使用 t 检验,您会担心样本量小(否则更简单的z 检验会正常工作),甚至自由度的微小变化也很重要一点。

除以 2 用于 p 值。如果您比较临界值,则不需要除以 2。该函数getCriticalValue应该是学生 t 分布的分位数函数因此它应该取2个值,概率和自由度。如果您想要代码所示的 2 面假设,那么您需要 0.975 分位数。

对于四舍五入,因为自由度是正的,所以Math.round看起来不错。

将自由度舍入为整数并不是绝对必要的。可以为该参数的所有正实数值定义学生t分布。将其限制为正整数可能会使临界值更容易计算,具体取决于您的操作方式。对于任何合理的样本量,它在实践中的影响很小。

我正在与 OP 合作进行基准测试项目,并想感谢大家清理了一些事情。此外,我想提供更多信息,以防影响建议。

样本大小范围为 5 - 700+(最多可在 8 秒内完成或直到误差幅度等于或低于 1%。为简单起见,从对象中提取临界值(因为其他计算确定了样本量减 1) 的自由度

  /**
   * T-Distribution two-tailed critical values for 95% confidence
   * http://www.itl.nist.gov/div898/handbook/eda/section3/eda3672.htm
   */
  T_DISTRIBUTION = {
    '1':  12.706, '2':  4.303, '3':  3.182, '4':  2.776 /* , ... */
  }

更新

我检查了一下,差异之间的差异似乎相当大。

Variances:
    4,474,400,141.236059
    3,032,977,106.8208385
  226,854,226,665.14194
       24,612,581.169126578

我们正在测试各种代码片段的每秒操作数(一些较慢,操作/秒较低,另一些较快,操作/秒较高)

此外,我们过去常常简单地比较每个平均值+-误差范围之间的重叠,但有人建议 t 检验更好,因为它可以找到具有统计意义的结果。