本学生的 t 分布 CDF 计算中的任何明显缺陷

Any obvious pitfalls in this Student's t-distribution CDF computation?

本文关键字:任何明 缺陷 计算 分布 CDF      更新时间:2023-09-26

我一直在寻找一个有效的函数来计算学生t分布的CDF(累积分布函数)。

这是我在查看了另一个堆栈溢出问题后解决的问题,JStat 库,the_subtprob第 317 行的函数。

查看上次参考中的注释导致我找到了一本绝版书,这无济于事

如果您对更精确的算法感兴趣,您可以 可以看看: 统计库: http://lib.stat.cmu.edu/apstat/;
应用统计算法,作者:Griffiths, P. and Hill, I.D.
埃利斯·霍伍德:奇切斯特 (1985)

cmu 站点有一个 FORTRAN 函数,我翻译了它,如下所示。

查看其他来源,我发现高阶函数,如不完整的beta,log gamma,并且实现似乎更复杂,并且在一种情况下是迭代的。

我想知道此实现是否存在任何已知的陷阱。 它似乎产生了与其他结果相同的结果。 任何关于如何评估这一点的想法也会有所帮助。

function tcdf (t, v) {
    //
    // ALGORITHM AS 3  APPL. STATIST. (1968) VOL.17, P.189
    // STUDENT T PROBABILITY (LOWER TAIL)
    //               
    var b = v / (v + t * t),
        c = 1,
        s = 1,
        ioe = v % 2,
        k = 2 + ioe;
    if (v < 1) {
        return 0;
    }
    if (v >= 4) {
        while (k <= v - 2) {
            c *= b - b / k;
            s += c;
            k += 2;
        }
    }
    c = t / Math.sqrt(v);
    if (1 !== ioe) {
        return 0.5 + 0.5 * Math.sqrt(b) * c * s;
    }
    return 0.5 + ((1 === v ? 0 : b * c * s) + Math.atan(c)) / Math.PI;
}

此算法可能出现两个问题。

  1. 处理大值v。当v变大时,我们应该恢复标准正态分布。但是,您在v上有一个while循环。所以v=1000000说,变得很慢

  2. 尾部精度。算法如何应对极端的尾部?通常,我们需要使用 log 以避免舍入误差。