Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi Statistik-Funktionen qnorm, pnorm? (https://www.delphipraxis.net/181217-statistik-funktionen-qnorm-pnorm.html)

nuclearping 25. Jul 2014 15:53

Delphi-Version: XE2

Statistik-Funktionen qnorm, pnorm?
 
Hallo,

hat Delphi bei seinen Boardmitteln Implementierungen dieser Funktionen dabei?
Delphi-Quellcode:
qnorm, pnorm
Ich vermute fast nicht. Oder? :?

Jedenfalls suche ich schon seit 'ner Weile und komme nicht wirklich vorran. Für
Delphi-Quellcode:
pnorm
habe ich die TPMath-Units gefunden. Aber für
Delphi-Quellcode:
qnorm
finde ich nur die qnorm Implementierung für R.

Und bevor ich mich hinsetze und die nach Delphi übersetze, frage ich doch lieber vorher erst. :thumb:

mkinzler 25. Jul 2014 15:59

AW: Statistik-Funktionen qnorm, pnorm?
 
https://translate.google.de/translat...hp%3Ft%3D18361

https://github.com/JuliaLang/Rmath/b...er/src/qnorm.c

nuclearping 25. Jul 2014 16:00

AW: Statistik-Funktionen qnorm, pnorm?
 
Oh großartig, danke! :)

nuclearping 26. Jul 2014 11:09

AW: Statistik-Funktionen qnorm, pnorm?
 
Ich hab die Funktion aus dem russischen Forum übernommen und etwas erweitert. Also falls jemand mal das gleiche Problem hat:
Delphi-Quellcode:
(*
  Aktualisierte Funktion unten.
*)
Die Ergebnisse von ein paar Testläufen decken sich mit der Gegenprüfung in R. R's qnorm ist jedoch in den Nachkommastellen etwas präziser.

Delphi-Quellcode:
qnorm(0.05)
Code:
R: -1.644854
Delphi: -1.61513793468475

Dejan Vu 27. Jul 2014 08:38

AW: Statistik-Funktionen qnorm, pnorm?
 
Du könntest die Genauigkeit bei Verwendung von Double oder Extended entscheidend verbessern.
Zum Verständnis würde mich noch das Ergebnis der Addition
Delphi-Quellcode:
p + mu + sigma
interessieren, sofern einer der Werte NAN ist.
Ferner sollten Floatingpoint Werte nie auf exakte Gleichheit geprüft werden, sondern z.B. mit Hilfe der Funktion
Delphi-Quellcode:
CompareValue(a,b, eps)

nuclearping 27. Jul 2014 10:20

AW: Statistik-Funktionen qnorm, pnorm?
 
Danke für die Tipps. :)

In die Richtung dachte ich auch schon. Aber wenn ich statt
Delphi-Quellcode:
Single
Delphi-Quellcode:
Double
oder
Delphi-Quellcode:
Extended
verwende, bleibt das Ergebnis trotzdem gleich. Die Unschärfe muss also woanders herkommen. Ich habs der Korrektheit wegen aber auf
Delphi-Quellcode:
Extended
umgestellt.

Das Ergebnis, wenn einer der Werte
Delphi-Quellcode:
NaN
ist, wäre in dem Fall dann auch
Delphi-Quellcode:
NaN
. Den Part kann man also wegkürzen und mit der Bedingung
Delphi-Quellcode:
if sigma < 0 then
zusammenfassen. Ich hab das so aus der C-Implementierung übernommen, aber in Delphi macht das keinen Sinn.

Dein Bedenken mit der Prüfung auf exakte Gleichheit bei Floating-Variablen stimmt generell auch. Ist in dem Fall aber nicht so wichtig, da die Funktion in diesem Fall wirklich exakt 0 oder 1 übergeben bekommen würde. Der Korrektheit wegen habe ich's aber auch umgestellt. Aber statt
Delphi-Quellcode:
CompareValue
habe ich
Delphi-Quellcode:
SameValue
genommen.

Überarbeitete Funktion:
Delphi-Quellcode:
function qnorm(p: Extended; mu: Extended = 0; sigma: Extended = 1): Extended;
begin
  if IsNan(p) or IsNan(mu) or IsNan(sigma) or (sigma < 0) then
    Result := NAN
  else if sigma = 0 then
    Result := mu
  else if SameValue(p, 0) then
    Result := -Infinity
  else if SameValue(p, 1) then
    Result := Infinity
  else
    try
      Result := Sqrt(Abs(0.5 * Pi * Ln(1 - Sqr(1 - 2 * p))));
      if p < 0.5 then
        Result := -Result;

      Result := mu + sigma * Result;
    except
      Result := NAN;
    end;
end;
PS: Oben muss es natürlich heissen
Delphi-Quellcode:
qnorm(0.05)
statt
Delphi-Quellcode:
qnorm(0.5)
. Denn
Delphi-Quellcode:
qnorm(0.5)
= 0. Habs mal editiert.

gammatester 28. Jul 2014 08:04

AW: Statistik-Funktionen qnorm, pnorm?
 
Quellcode für Pascal/Delphi-Implentationen der Quantilfunktion der Normalverteilung findest Du im Teil Statistische Verteilungen meines AMath-Pakets (für 80-Bit-Extended)
Delphi-Quellcode:
function normal_invx(mu, sd, y: extended): extended;
  {-Return the functional inverse of normal (Gaussian) distribution}
  { with mean mu and standard deviation sd > 0, 0 < y < 1.}
bzw. DAMath (für 64-Bit-Versionen mit Double).
Delphi-Quellcode:
function normal_inv(mu, sd, y: double): double;
  {-Return the functional inverse of the normal (Gaussian) distribution}
  { with mean mu and standard deviation sd > 0, 0 < y < 1.}
Gruß Gammatester

nuclearping 28. Jul 2014 08:49

AW: Statistik-Funktionen qnorm, pnorm?
 
Prima, noch besser! :thumb: Die Funktion ist auch genauso präzise, wie die aus R.
Code:
R: -1.644854
AMath: -1,64485362695147


Alle Zeitangaben in WEZ +1. Es ist jetzt 08:07 Uhr.

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz