【问题标题】:How do I convert probability into z-score如何将概率转换为 z 分数
【发布时间】:2021-01-31 18:30:31
【问题描述】:

Javascript>

如果您从事数据科学行业,如果您没有正态分布表,您会感到困扰。我在 Stackoverflow 中看到一篇文章,该文章将 z-score 转换为 JavaScript 中的概率。我真正想知道的是这个函数的逆向计算

/**
 * @param {number} z - Number of standard deviations from the mean.
 */
function GetZPercent(z) {
   // If z is greater than 6.5 standard deviations from the mean
   // the number of significant digits will be outside of a reasonable 
   // range.
   if (z < -6.5)
     return 0.0;

   if (z > 6.5)
     return 1.0;

   var factK    = 1;
   var sum      = 0;
   var term     = 1;
   var k        = 0;
   var loopStop = Math.exp(-23);
   
   while (Math.abs(term) > loopStop) {
     term = 0.3989422804 * Math.pow(-1, k) * Math.pow(z, k) / (2 * k + 1) /
            Math.pow(2, k) * Math.pow(z, k + 1) / factK;
     sum += term;
     k++;
     factK *= k;
   }

   sum += 0.5;

   return sum;
 }

我知道如何将 z 分数转换为概率。但是,我不知道如何从 javascript 中的相应概率计算 z 分数(标准差)。例如,如果我输入 0.95(或 95%),我可以预期得到 2.25 的标准差。如果我输入 2.25,上面的代码给了我 95%。

【问题讨论】:

  • 所以你有 javascript 代码并要求... javascript 代码?有什么问题?
  • 您是在询问如何在网页中调用此函数(例如,如何从输入中为函数提供 z 分数并将结果输出并显示出来?)
  • 其中一个+1500 similar questions 可能会提供答案,例如,使用与您的代码相同的代码来回答这个问题:Seeking a statistical javascript function to return p-value from a z-score
  • 抱歉我的模棱两可。我在问javascript代码。上面的代码将 z 分数转换为概率。我问反之亦然;将概率转换为 z 分数。如果我输入 95%,它会吐出 2.25 个标准差。
  • 你能编辑你的问题吗,因为在那里你真的在问相反的问题,无论是在标题还是在你的问题正文中。

标签: javascript probability


【解决方案1】:

我发现这段代码也有效。使用 critz(p) 将概率转换为 z 分数。例如,我们可以预期 critz(0.95) 中的 1.65,因为 95% 对应于 z-score 的 1.65 标准差。

/*  The following JavaScript functions for calculating normal and
    chi-square probabilities and critical values were adapted by
    John Walker from C implementations
    written by Gary Perlman of Wang Institute, Tyngsboro, MA
    01879.  Both the original C code and this JavaScript edition
    are in the public domain.  */

/*  POZ  --  probability of normal z value

    Adapted from a polynomial approximation in:
            Ibbetson D, Algorithm 209
            Collected Algorithms of the CACM 1963 p. 616
    Note:
            This routine has six digit accuracy, so it is only useful for absolute
            z values <= 6.  For z values > to 6.0, poz() returns 0.0.
*/
    var Z_MAX = 6;
function poz(z) {

    var y, x, w;

    if (z == 0.0) {
        x = 0.0;
    } else {
        y = 0.5 * Math.abs(z);
        if (y > (Z_MAX * 0.5)) {
            x = 1.0;
        } else if (y < 1.0) {
            w = y * y;
            x = ((((((((0.000124818987 * w
                     - 0.001075204047) * w + 0.005198775019) * w
                     - 0.019198292004) * w + 0.059054035642) * w
                     - 0.151968751364) * w + 0.319152932694) * w
                     - 0.531923007300) * w + 0.797884560593) * y * 2.0;
        } else {
            y -= 2.0;
            x = (((((((((((((-0.000045255659 * y
                           + 0.000152529290) * y - 0.000019538132) * y
                           - 0.000676904986) * y + 0.001390604284) * y
                           - 0.000794620820) * y - 0.002034254874) * y
                           + 0.006549791214) * y - 0.010557625006) * y
                           + 0.011630447319) * y - 0.009279453341) * y
                           + 0.005353579108) * y - 0.002141268741) * y
                           + 0.000535310849) * y + 0.999936657524;
        }
    }
    return z > 0.0 ? ((x + 1.0) * 0.5) : ((1.0 - x) * 0.5);
}


/*  CRITZ  --  Compute critical normal z value to
               produce given p.  We just do a bisection
               search for a value within CHI_EPSILON,
               relying on the monotonicity of pochisq().  */

function critz(p) {
    var Z_EPSILON = 0.000001;     /* Accuracy of z approximation */
    var minz = -Z_MAX;
    var maxz = Z_MAX;
    var zval = 0.0;
    var pval;
    if( p < 0.0 ) p = 0.0;
    if( p > 1.0 ) p = 1.0;

    while ((maxz - minz) > Z_EPSILON) {
        pval = poz(zval);
        if (pval > p) {
            maxz = zval;
        } else {
            minz = zval;
        }
        zval = (maxz + minz) * 0.5;
    }
    return(zval);
}

【讨论】:

【解决方案2】:

这是一个执行相反计算的函数(z 分数的概率)。这个sn-p可以让你输入概率并显示对应的z-score:

function percentile_z(p) {
    if (p < 0.5) return -percentile_z(1-p);

    if (p > 0.92) {
        if (p == 1) return Infinity;
        let r = Math.sqrt(-Math.log(1-p));
        return (((2.3212128*r+4.8501413)*r-2.2979648)*r-2.7871893)/
               ((1.6370678*r+3.5438892)*r+1);
    }
    p -= 0.5;
    let r = p*p;
    return p*(((-25.4410605*r+41.3911977)*r-18.6150006)*r+2.5066282)/
             ((((3.1308291*r-21.0622410)*r+23.0833674)*r-8.4735109)*r+1);
}

// I/O handling
function calc() {
    var p = +document.getElementById("prob").value;
    var z = percentile_z(p);
    document.getElementById("z").textContent = z.toFixed(4);
}
calc();
input { width: 5em }
Probability (between 0 and 1):
<input type="number" id="prob" step="0.0001" min="0" max="1" value="0.9500" oninput="calc()"><p>

Z Score: <span id="z"></span>

对于 0.95 的概率,它返回 1.6449 的 z 分数。另请参阅 this table 作为参考。


源自easycalculation.com

【讨论】:

  • 这似乎不适用于 p>=0.5,即使您在 0.5-p 左右添加 Math.abs(),它似乎也给出了不正确的答案,例如 0.6
  • 感谢您的评论。奇怪的是,这被忽视了 4 年。非常感谢您发现这一点!现已更正。
猜你喜欢
  • 1970-01-01
  • 2022-10-09
  • 2015-03-31
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-02-20
  • 1970-01-01
  • 2011-06-21
相关资源
最近更新 更多