Javascript 如何将概率转换为z分数
Javascript> 如果你在数据科学行业,如果没有正态分布表,你会很烦恼。我在Stackoverflow中看到了一篇文章,它在JavaScript中将z-score转换为概率。我真正想知道的是这个函数的反向计算Javascript 如何将概率转换为z分数,javascript,probability,Javascript,Probability,Javascript> 如果你在数据科学行业,如果没有正态分布表,你会很烦恼。我在Stackoverflow中看到了一篇文章,它在JavaScript中将z-score转换为概率。我真正想知道的是这个函数的反向计算 /** *@param{number}z-平均值的标准偏差数。 */ 函数GetZPercent(z){ //如果z大于平均值的6.5标准偏差 //有效位数将超出合理范围 //射程。 如果(z6.5) 返回1.0; var-factK=1; var总和=0; var项=1; var
/**
*@param{number}z-平均值的标准偏差数。
*/
函数GetZPercent(z){
//如果z大于平均值的6.5标准偏差
//有效位数将超出合理范围
//射程。
如果(z<-6.5)
返回0.0;
如果(z>6.5)
返回1.0;
var-factK=1;
var总和=0;
var项=1;
var k=0;
var loopStop=Math.exp(-23);
while(Math.abs(term)>loopStop){
术语=0.3989422804*数学功率(-1,k)*数学功率(z,k)/(2*k+1)/
数学功率(2,k)*数学功率(z,k+1)/factK;
总和+=期限;
k++;
factK*=k;
}
总和+=0.5;
回报金额;
}
这里有一个函数,它执行相反的计算(z分数的概率)。此代码段允许您输入概率,并显示相应的z分数:
函数百分位_z(p){
if(p<0.5)返回-百分位_z(1-p);
如果(p>0.92){
如果(p==1)返回无穷大;
设r=Math.sqrt(-Math.log(1-p));
返回(((2.3212128*r+4.8501413)*r-2.2979648)*r-2.7871893)/
((1.6370678*r+3.5438892)*r+1);
}
p-=0.5;
设r=p*p;
返回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处理
函数计算(){
var p=+document.getElementById(“prob”).value;
var z=百分位_z(p);
document.getElementById(“z”).textContent=z.toFixed(4);
}
计算()代码>
input{width:5em}
概率(介于0和1之间):
Z分数:
这里有一个函数,它执行相反的计算(Z分数的概率)。此代码段允许您输入概率,并显示相应的z分数:
函数百分位_z(p){
if(p<0.5)返回-百分位_z(1-p);
如果(p>0.92){
如果(p==1)返回无穷大;
设r=Math.sqrt(-Math.log(1-p));
返回(((2.3212128*r+4.8501413)*r-2.2979648)*r-2.7871893)/
((1.6370678*r+3.5438892)*r+1);
}
p-=0.5;
设r=p*p;
返回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处理
函数计算(){
var p=+document.getElementById(“prob”).value;
var z=百分位_z(p);
document.getElementById(“z”).textContent=z.toFixed(4);
}
计算()代码>
input{width:5em}
概率(介于0和1之间):
Z分数:
我发现这个代码也能工作。使用critz(p)将概率转换为z分数。例如,我们可以从critz(0.95)中得到1.65,因为95%对应于z分数中的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);
}
/*以下JavaScript函数用于计算正常和
卡方概率和临界值采用
来自C实现的John Walker
作者:马里兰州廷斯伯罗王学院加里·帕尔曼
1879原始C代码和此JavaScript版本
属于公共领域*/
/*POZ——正常z值的概率
根据多项式近似值改编,如下所示:
Ibbetson D,算法209
收集了CACM 1963 p的算法。616
注:
此例程具有六位精度,因此仅对绝对值有用
z值为6.0时,poz()返回0.0。
*/
var Z_MAX=6;
函数poz(z){
变量y,x,w;
如果(z==0.0){
x=0.0;
}否则{
y=0.5*数学绝对值(z);
如果(y>(Z_MAX*0.5)){
x=1.0;
}否则如果(y<1.0){
w=y*y;
x=((((((((()0.000124818987*w
-0.00107520407)*w+0.005198775019)*w
-0.019198292004)*w+0.059054035642)*w
-0.151968751364)*w+0.319152932694)*w
-0.531923007300)*w+0.797884560593)*y*2.0;
}否则{
y-=2.0;
x=(((((((((((((((()))0.000045255659*y
+0.00015229290)*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.00927945341)*y
+0.0053579108)*y-0.00211268741)*y
+0.0005310849)*y+0.99993667524;
}
}
返回z>0.0?((x+1.0)*0.5):((1.0-x)*0.5);
}
/*CRITZ——计算临界法向z值
产生给定的p。我们只是做一个二等分
在CHI_EPSILON中搜索一个值,
依赖于pochisq()的单调性*/
函数critz(p){
var Z_ε=0.000001;/*Z近似的精度*/
var minz=-Z_MAX;
var maxz=Z_MAX;
var-zval=0.0;
var pval;
如果(p<0.0)p=0.0;
如果(p>1.0)p=1.0;
while((maxz-minz)>Z_ε){
pval=poz(zval);
如果(pval>p){
maxz=zval;
}否则{
minz=zval;
}
zval=(最大值+最小值)*0.5;
}
返回(zval);
}
我发现这个代码也可以工作。使用critz(p)将概率转换为z分数。例如,我们可以从critz(0.95)中得到1.65,因为95%对应于z分数中的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);
}
/*以下JavaScript函数用于计算正常和
卡方检验