如何在Javascript中找到正态分布?

3
我正在尝试将Excel电子表格中的公式转换为在线计算器,具体的公式是:
=(NORM.S.DIST(2.5467437 + -1.9344945 *B7^( -0.5),1))^2

我遇到的问题是,任何我找到的 Javascript 库中似乎都没有 NORM.S.DIST。在研究这个问题时,我找到了这个解决方案,但它是基于 C# 的,我不知道如何将其转换为 Javascript。我该如何用 Javascript 解决这个问题?

我不知道如何将其转换为JavaScript。那段代码只包含算术运算。你是在编写JavaScript应用程序吗?通过逐行转换该代码,这将是一个很好的练习机会,让你学习js。 - Crescent Fresh
@CrescentFresh 我肯定是的,而且这正是我正在做的事情 - 但我找不到这种方法的JS等效物。 - Michael A
2个回答

2

1

这样就可以解决问题。

对于由均值和标准差定义的任何正态分布,让myval成为您想要查找百分位数的值。

如果您只想返回Excel中NORM.S.DIST的输出,请跳过百分位函数。

var myval = 14;
var mean = 15.5;
var SD = 4.8333;

var answer = centile(mean, SD, myval);
console.log(answer);

function centile(mean, SD, val)
{
    z = (val-mean)/SD;
    ans = NORMSDIST(z);
    return ans;
}

function erf(x)
{
    //A&S formula 7.1.26
  
  var ans = 0;
    var a1 = 0.254829592;
    var a2 = -0.284496736;
    var a3 = 1.421413741;
    var a4 = -1.453152027;
    var a5 = 1.061405429;
    var p = 0.3275911;
    x = Math.abs(x);
    var t = 1 / (1 + p * x);
    //Horner's method, takes O(n) operations for nth order polynomial
    ans = 1 - ((((((a5 * t + a4) * t) + a3) * t + a2) * t) + a1) * t * Math.exp(-1 * x * x);
    return ans; 
}

function NORMSDIST(z)
{
    var ans = 0;
    var sign = 1;
    if (z < 0) sign = -1;
    ans = 0.5 * (1.0 + sign * erf(Math.abs(z)/Math.sqrt(2)));
    return ans;
}

工作笔: https://codepen.io/RichClarke/pen/oNdpoRM?editors=0011


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接