![]() |
Delphi-Version: XE2
Statistik-Funktionen qnorm, pnorm?
Hallo,
hat Delphi bei seinen Boardmitteln Implementierungen dieser Funktionen dabei?
Delphi-Quellcode:
Ich vermute fast nicht. Oder? :?
qnorm, pnorm
Jedenfalls suche ich schon seit 'ner Weile und komme nicht wirklich vorran. Für
Delphi-Quellcode:
habe ich die
pnorm
![]()
Delphi-Quellcode:
finde ich nur die
qnorm
![]() Und bevor ich mich hinsetze und die nach Delphi übersetze, frage ich doch lieber vorher erst. :thumb: |
AW: Statistik-Funktionen qnorm, pnorm?
|
AW: Statistik-Funktionen qnorm, pnorm?
Oh großartig, danke! :)
|
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:
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.
(*
Aktualisierte Funktion unten. *)
Delphi-Quellcode:
qnorm(0.05)
Code:
R: -1.644854
Delphi: -1.61513793468475 |
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:
interessieren, sofern einer der Werte NAN ist.
p + mu + sigma
Ferner sollten Floatingpoint Werte nie auf exakte Gleichheit geprüft werden, sondern z.B. mit Hilfe der Funktion
Delphi-Quellcode:
CompareValue(a,b, eps)
|
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:
oder
Double
Delphi-Quellcode:
verwende, bleibt das Ergebnis trotzdem gleich. Die Unschärfe muss also woanders herkommen. Ich habs der Korrektheit wegen aber auf
Extended
Delphi-Quellcode:
umgestellt.
Extended
Das Ergebnis, wenn einer der Werte
Delphi-Quellcode:
ist, wäre in dem Fall dann auch
NaN
Delphi-Quellcode:
. Den Part kann man also wegkürzen und mit der Bedingung
NaN
Delphi-Quellcode:
zusammenfassen. Ich hab das so aus der C-Implementierung übernommen, aber in Delphi macht das keinen Sinn.
if sigma < 0 then
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:
habe ich
CompareValue
Delphi-Quellcode:
genommen.
SameValue
Überarbeitete Funktion:
Delphi-Quellcode:
PS: Oben muss es natürlich heissen
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;
Delphi-Quellcode:
statt
qnorm(0.05)
Delphi-Quellcode:
. Denn
qnorm(0.5)
Delphi-Quellcode:
= 0. Habs mal editiert.
qnorm(0.5)
|
AW: Statistik-Funktionen qnorm, pnorm?
Quellcode für Pascal/Delphi-Implentationen der Quantilfunktion der Normalverteilung findest Du im Teil
![]() ![]()
Delphi-Quellcode:
bzw.
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.} ![]()
Delphi-Quellcode:
Gruß Gammatester
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.} |
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:16 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz