----- Original Message ----- From: Camilo La Rota <[EMAIL PROTECTED]> To: David A. Heiser <[EMAIL PROTECTED]> Sent: Tuesday, November 23, 1999 7:41 PM Subject: Re: quantiles, how to calculate? > Hi David, > > Thank you for your answer. > > Yes of course I am interested. > > Can you also give me a reference or tell me how this is done? > > Thank you very much, > > Camilo > __________________________________________ Attached is a text file listing the two subroutines involved. I do all my calcs in double precision which explains the # signs. DAH
DEFINT I-N DEFLNG H DEFSTR F, S DEFDBL A-E, O-R, T-Z SUB NormDist (PV, KK, ZV, DV, KV) REM Inverse normal distribution, Input, PV, Output ZV (standarized normal deviate), DV REM PV, input 0-1 REM KK, control, =0 approximate ZV, no DV REM =-1, precise value, DV calculated REM ZV, deviate or sigma value -1E+38 TO 1E+38 REM DV distribution density REM KV, =-1 if correct input REM KV=0, error in PV input SELECT CASE PV CASE IS < 0# ZV = -1E+38 '1213' DV = 0 PRINT "PM is less than ZERO" KV = 0 EXIT SUB CASE IS > 1# ZV = 1E+38 DV = 0 PRINT "PM greater than one" KV = 0 EXIT SUB CASE IS = 0# ZV = -1E+38 DV = 0# KV = -1 EXIT SUB CASE IS = .5# ZV = 0# DV = .39894228040143# KV = -1 EXIT SUB CASE IS = 1# ZV = 1E+38 DV = 0# KV = -1 EXIT SUB CASE IS < .5# T0 = PV T9 = -1# GOTO inverse CASE IS > .5# T0 = 1# - PV T9 = 1# GOTO inverse END SELECT inverse: REM approximation T1 = SQR(LOG(1# / (T0 * T0))) T2 = 2.515517# + T1 * (.802853# + T1 * .010328#) T3 = 1# + T1 * (1.432788# + T1 * (.189269# + T1 * .001308#)) T4 = T1 - T2 / T3 ZV = T9 * T4 DV = 0# IF NOT KK THEN KV = -1 EXIT SUB ELSE REM Newton's method to close in on precise ZV value DO CALL NormDistPrb(ZV, PVC, QVC, DV) DP = ABS(PVC - PV) REM accuracy can be changed by resetting the DP test value IF DP < .00000000000001# THEN KV = -1 EXIT DO ELSE IF DV = 0# THEN PRINT "Error in routine" PRINT "Current Z value"; ZV STOP KV = 0 EXIT SUB ELSE ZV = ZV - (PVC - PV) / DV END IF END IF LOOP END IF END SUB SUB NormDistPrb (ZD, PV, QV, ZI) REM Normal distribution, N(0,1), Input ZD, Output ZI, PV and QV DIM AT(4), BT(4), AC(2), BC(2) X0 = ABS(ZD) IF X0 > 17# THEN ZI = 0# IF ZD < 0# THEN PV = 0# QV = 1# EXIT SUB ELSE PV = 1# QV = 0# EXIT SUB END IF ELSE REM probability density, ZI XA = -ZD * ZD / 2! IF X0 > 3.6 THEN ZI = .39894228040142# * EXP(XA) ELSE TN = 0# T1 = 1# EX = 1# DO TN = TN + 1# T1 = T1 * XA / TN EX = EX + T1 IF (ABS(T1 / EX)) < 1E-14 THEN EXIT DO LOOP ZI = .39894228040142# * EX END IF IF X0 < 2# THEN REM normal series NN = 0 T1 = ZI * ZD PV = .5# + T1 DO NN = NN + 1 T1 = T1 * ZD * ZD / (2# * CDBL(NN) + 1#) PV = PV + T1 IF (ABS(T1)) < 1E-15 THEN EXIT DO LOOP QV = 1# - PV EXIT SUB ELSE AT(2) = 1#: AT(1) = 0# BT(2) = X0: BT(1) = 1# BC(1) = X0: BC(2) = X0 NN = 0: AO = 0# DO REM continuing fraction NN = NN + 1 AC(2) = CDBL(2 * NN) AC(1) = AC(2) - 1# REM computes continuing fraction sums AT(3) = BC(1) * AT(2) + AC(1) * AT(1) BT(3) = BC(1) * BT(2) + AC(1) * BT(1) AT(4) = BC(2) * AT(3) + AC(2) * AT(2) BT(4) = BC(2) * BT(3) + AC(2) * BT(2) AT(1) = AT(3) / BT(4) BT(1) = BT(3) / BT(4) AT(2) = AT(4) / BT(4) BT(2) = 1# DF = ABS((AT(2) - AO) / AT(2)) AO = AT(2) IF DF < 1E-14 THEN EXIT DO LOOP IF ZD < 0# THEN PV = ZI * AT(2) QV = 1# - PV EXIT SUB ELSE QV = ZI * AT(2) PV = 1# - QV EXIT SUB END IF END IF END IF END SUB