Z Оценка до P Значение в Delphi - от одного до двух - PullRequest
0 голосов
/ 26 августа 2018

Доброе утро

Я нашел в сети готовый калькулятор p-значений по значению z (это довольно сложно для 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;

В соответствии с онлайн-калькулятором, например, здесь: https://www.easycalculation.com/statistics/p-value-for-z-score.php для данной оценки z: 0,70710678 этот код дает мне0,76025003 как результат, что является правильным результатом, но для односторонней гипотезы.Может кто-нибудь сказать мне, как получить правильный результат для двусторонней гипотезы, то есть 0,47950012?Я думаю, что дело может быть очень простым, но я не очень хорош в z-distibution.: (

Спасибо за любую помощь.

Ответы [ 2 ]

0 голосов
/ 01 сентября 2018

Извините, я думаю, что это был тупой вопрос - судя по полученным мной отрицательным голосам.Что ж.;)

Действительно, я не думал, что шаблон может быть внутри кода страницы, так что позор мне.И спасибо, Дэвид Дюбуа.Раскопки части кода:

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) выдаст мне левостороннее P-значение.Тогда 1-NormalP (x) даст мне правостороннее P-значение.Тогда 2 * (1-NormalP (x)) даст мне ответ.

Нет необходимости в новой функции, использованные выше допустимые функции, совместимые, например, с SPSS и R (я проверял).

0 голосов
/ 26 августа 2018

Формула, которую вы ищете, может быть найдена в исходном коде веб-страницы, которую вы связали.

Если 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;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...