这个学生的t分布CDF计算有任何明显的缺陷吗?

时间:2015-02-03 17:06:13

标签: javascript statistics cdf

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

以下是我查看another stackoverflow question,JStat库the_subtprob function on Line 317 here后我已经解决的问题。

查看上一篇参考文献中的注释,让我看到了一本绝版书,但这并没有帮助

  

如果您对更精确的算法感兴趣   可以看看:StatLib:http://lib.stat.cmu.edu/apstat/;
  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;
}

1 个答案:

答案 0 :(得分:0)

此算法存在两个可能的问题。

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

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