Javascript 这个学生的t分布CDF计算中有没有明显的缺陷?

Javascript 这个学生的t分布CDF计算中有没有明显的缺陷?,javascript,statistics,cdf,Javascript,Statistics,Cdf,我一直在寻找一个有效的函数来计算学生t分布的CDF累积分布函数 以下是我在查看JStat库之后解决的问题 看着上一篇参考文献中的注释,我找到了一本绝版的书,这对我没有帮助 如果你对更精确的算法感兴趣,你可以 可以看看:StatLib:; Griffiths,P.和Hill,I.D.的应用统计算法。 埃利斯·霍伍德:奇切斯特1985 cmu站点有一个FORTRAN函数,我将其翻译如下 查看其他来源,我发现高阶函数,如不完全beta、log gamma,实现似乎更复杂,在一种情况下是迭代的 我想知道

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

以下是我在查看JStat库之后解决的问题

看着上一篇参考文献中的注释,我找到了一本绝版的书,这对我没有帮助

如果你对更精确的算法感兴趣,你可以 可以看看:StatLib:; Griffiths,P.和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;
}

此算法可能存在两个问题

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

尾部精度。该算法如何处理极端尾部?通常,我们需要使用log来避免舍入错误


谢谢我试图将其与其他算法进行比较。他们都看到第一个参考似乎有类似的限制。v=1000000 t=1的快速检查产生的结果与第一个完全相同。更快。我得看看第二个。是否有一组已知的测试用例会特别强调这个问题?我明白了,一般来说,你对一个更喜欢的算法有什么建议吗?