X

Normal Distribution

The Normal Distribution

4.4/5 (5)

The normal (or Gaussian) distribution is a very commonly occurring continuous probability distribution. Normal distributions are extremely important in statistics and are often used in the natural and social sciences for real-valued random variables whose distributions are not known.

The normal distribution is immensely useful because of the central limit theorem, which states that, under mild conditions, the mean of many random variables independently drawn from the same distribution is distributed approximately normally, irrespective of the form of the original distribution. Physical quantities that are expected to be the sum of many independent processes often have a distribution very close to the normal.

For a given probability the square of the standardized normal deviate corresponds to Chi-square with one degree of freedom. That special relationship is utilized in this program source code, which calculates the precise probability P corresponding to a given value of the standardized normal deviate Z.

The one-sided probability corresponds to the area under the normal curve from plus infinity to Z.

The method applied in the source code is based on series expansion. The results are accurate to 18 decimals.

[code language=”vb”]
#COMPILE EXE
#REGISTER NONE
#DIM ALL

FUNCTION ProbFromNormalDeviate(BYVAL Z AS EXT, BYVAL ED AS EXT) AS EXT
LOCAL flag AS LONG, T, S, P AS EXT ‘ extended precision
IF Z < 0 THEN flag = 1 ‘ negative Z Z = Z * Z P = PCHI2(Z,1) * 0.5 ‘ One-sided probability. Start with this.
IF flag = 1 THEN P = 1.0 – P ‘ negative Z. Get complementary probability.
P = P * ED ‘ Get one-sided or two-sided probability according to ED
IF P > 1.0 THEN P = 1.0 ‘ never give a probability of more than one
FUNCTION = P
END FUNCTION

FUNCTION PBMAIN
LOCAL Result AS STRING, i1 AS LONG, P, OT AS EXT
Result$ = INPUTBOX$("Enter Z , X-Sided (1 or 2)", _
"1- or 2-sided Probability from Normal Deviate Z")
i1&=INSTR(Result$,",")
OT=VAL(MID$(Result$,i1&+1))
IF OT=1.0 OR OT=2.0 THEN
P = ProbFromNormalDeviate(VAL(LEFT$(Result$,i1&-1)), OT)
MSGBOX "P="+FORMAT$(P," ##.##################" ),, _
"Normal Deviate Z="+LEFT$(Result$,i1&-1)+" "+STR$(OT)+"-sided"
END IF
END FUNCTION

FUNCTION PCHI2(BYVAL X AS EXT, BYVAL F AS EXT) AS EXT

‘ FUNCTION PCHI2 – CALCULATES THE P-VALUE FROM
‘ THE CHI-SQUARE VALUE (X) AND THE DEGREES OF FREEDOM (F, must be integer)
‘ The probability is calculated using series expansions 26.4.4 and 26.4.5.
‘ In: Handbook of mathematical Functions. Editors: Abramowitz M & Stegun IA,
‘ Dover, New York, 1972.
‘ Original code by Erik Christensen

LOCAL D, E, R, G, H, SL, S, T, P, C, SK, Q AS EXT ‘ extended precision
Q = 1.0
IF X > 0 AND F > 0 AND ROUND(F, 0) = F THEN
D = F
E = D / 2.0
R = F – INT(F / 2.0) * 2.0
G = 1.0
IF R < 0.3 THEN ‘ F is even
DO
E = E – 1.0
IF E < 1.8 THEN EXIT LOOP
G = G * E
LOOP
ELSE ‘ F is odd
G = SQR(ATN(1.0) * 4.0) ‘ = sqrt(PI)
DO
E = E – 1.0
IF E < 0.3 THEN EXIT LOOP
G = G * E
LOOP
END IF
H = ((X / 2.0) ^ (D / 2.0) * EXP(-X / 2.0)) / (X * G)
SL = H * 2.0 * X / D
S = 0.0
T = 0.0
P = 1.0
DO
D = D + 2.0
P = P * X / D
S = S + P
C = ABS(S – T)
IF C < 1.0E-18 THEN EXIT LOOP
T = S
LOOP
SK = (S + 1.0) * SL
Q = 1.0 – SK
IF Q < 1.0E-18 THEN Q = 1.0E-18
END IF
FUNCTION = Q
END FUNCTION

[/code]