Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/delphi/8.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/shell/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Delphi中的Z得分与P值之比-单尾到双尾_Delphi_Distribution_P Value - Fatal编程技术网

Delphi中的Z得分与P值之比-单尾到双尾

Delphi中的Z得分与P值之比-单尾到双尾,delphi,distribution,p-value,Delphi,Distribution,P Value,早上好 我从网络中的z值中找到了一个现成的p值计算器(对于Delphi来说有点难)。不幸的是,它只给出左尾的值,我需要它给出双尾的值。谁能告诉我如何计算或在代码中更改什么 function NormalZ (const X: Extended): Extended; { Returns Z(X) for the Standard Normal Distribution as defined by Abramowitz & Stegun. This is the function th

早上好

我从网络中的z值中找到了一个现成的p值计算器(对于Delphi来说有点难)。不幸的是,它只给出左尾的值,我需要它给出双尾的值。谁能告诉我如何计算或在代码中更改什么

function NormalZ (const X: Extended): Extended;
{ Returns Z(X) for the Standard Normal Distribution as defined by
  Abramowitz & Stegun. This is the function that defines the Standard
  Normal Distribution Curve.
  Full Accuracy of FPU }
begin
  Result := Exp (- Sqr (X) / 2.0)/Sqrt (2 * Pi);
end;

function NormalP (const A: Extended): Single;
{Returns P(A) for the Standard Normal Distribution as defined by
  Abramowitz & Stegun. This is the Probability that a value is less
  than A, i.e. Area under the curve defined by NormalZ to the left
  of A.
  Only handles values A >= 0 otherwise exception raised.
  Accuracy: Absolute Error < 7.5e-8 }
const
  B1: Extended = 0.319381530;
  B2: Extended = -0.356563782;
  B3: Extended = 1.781477937;
  B4: Extended = -1.821255978;
  B5: Extended = 1.330274429;
var
  T: Extended;
  T2: Extended;
  T4: Extended;
begin
  if (A < 0) then
    raise EMathError.Create ('Value must be Non-Negative')
  else
  begin
    T := 1 / (1 + 0.2316419 * A);
    T2 := Sqr (T);
    T4 := Sqr (T2);
    Result := 1.0 - NormalZ (A) * (B1 * T + B2 * T2
      + B3 * T * T2 + B4 * T4 + B5 * T * T4);
  end;
end;
函数NormalZ(常数X:扩展):扩展;
{返回由定义的标准正态分布的Z(X)
这是定义标准的函数
正态分布曲线。
FPU}的完全精度
开始
结果:=Exp(-Sqr(X)/2.0)/Sqrt(2*Pi);
终止
函数NormalP(常数A:扩展):单个;
{返回由定义的标准正态分布的P(A)
Abramowitz&Stegun。这是一个值小于
大于A,即左侧由NormalZ定义的曲线下的面积
A的。
仅处理>=0的值,否则引发异常。
准确度:绝对误差<7.5e-8}
常数
B1:扩展=0.319381530;
B2:扩展=-0.356563782;
B3:扩展=1.781477937;
B4:扩展=-1.821255978;
B5:扩展=1.330274429;
变量
T:扩展;
T2:延长;
T4:延长;
开始
如果(A<0),则
raise EMATERROR.Create('值必须为非负')
其他的
开始
T:=1/(1+0.2316419*A);
T2:=Sqr(T);
T4:=Sqr(T2);
结果:=1.0-正态Z(A)*(B1*T+B2*T2
+B3*T*T2+B4*T4+B5*T*T4);
终止
终止
根据在线计算器,例如: 对于给定的z分数: 0.70710678 这个密码给了我 0,76025003 因此,除了单尾假设,正确的结果是什么。有谁能告诉我如何得到双尾假设的正确结果,即0.47950012?我猜情况可能很简单,但我不擅长z分布(


谢谢您的帮助。

您要查找的公式可以在您链接的网页的源代码中找到

如果X是p函数的结果,则计算2*(1-X)

我也翻译了源代码中的Z函数。它会生成与您提供的函数不同的结果。我不能说哪个更准确

function pzscore(z:extended):extended;
const
  Z_MAX = 6;
var
  x, y, w : extended;
begin
  if z = 0.0 then
    x := 0.0
  else
    begin
      y := 0.5 * abs(z);
      if y > Z_MAX * 0.5 then
        x := 1.0
      else
        if y < 1.0 then
          begin
            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;
          end
        else
          begin
            Y := 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;
          end;
    end;
  if x > 0.0 then
    Result :=  (x + 1.0) * 0.5
  else
    Result :=  (1.0 - x) * 0.5;
end;
函数pzscore(z:扩展):扩展;
常数
Z_MAX=6;
变量
x、 y,w:扩展;
开始
如果z=0.0,则
x:=0.0
其他的
开始
y:=0.5*abs(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:=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;
终止
终止
如果x>0.0,则
结果:=(x+1.0)*0.5
其他的
结果:=(1.0-x)*0.5;
终止

对不起,从我收到的反对票来看,我认为这是一个愚蠢的问题

事实上,我不认为该模式可能在页面代码中,所以我感到羞耻。谢谢大卫·杜波伊斯。代码的挖掘部分:

var lp = pzscore(z);
document.getElementById('lp').value = lp.toFixed(4);
var rp = 1 - lp;
document.getElementById('rp').value = rp.toFixed(4);
 var tp = 2 * rp;
document.getElementById('tp').value = tp.toFixed(4);
 var cl = 1 - tp;
document.getElementById('cl').value = cl.toFixed(4);
我只需要计算简单的方程式。函数NormalP(x)将给出mi的左尾P值。那么1-NormalP(x)将给出右尾P值。然后2*(1-NormalP(x))会给我一个答案


不需要新函数,上面使用的是与eg SPSS和R兼容的有效函数(我已检查)。

这对您有帮助吗?我很高兴您得到了所需的功能。如果你觉得我的回答有帮助,请接受。完成。:)谢谢你所做的一切!