geoppf(3f) - [M_datapac:PERCENT_POINT] compute the geometric percent
point function
SUBROUTINE GEOPPF(P,Ppar,Ppf)
geoppf(3f) computes the percent point function value for the geometric
distribution with REAL 'bernoulli probability' parameter
= ppar.
the geometric distribution used herein has mean = (1-ppar)/ppar and
standard deviation = sqrt((1-ppar)/(ppar*ppar))).
this distribution is defined for all non-negative integer x--x = 0,
1, 2, ... .
this distribution has the probability function
f(x) = ppar * (1-ppar)**x.
the geometric distribution is the distribution of the number of
failures before obtaining 1 success in an indefinite sequence of
bernoulli (0,1) trials where the probability of success in a precision
trial = ppar.
note that the percent point function of a distribution is identically
the same as the inverse cumulative distribution function of the
distribution.
X description of parameter
Y description of parameter
Sample program:
program demo_geoppf
use M_datapac, only : geoppf
implicit none
! call geoppf(x,y)
end program demo_geoppf
Results:
The original DATAPAC library was written by James Filliben of the
Statistical Engineering Division, National Institute of Standards
and Technology.
John Urban, 2022.05.31
CC0-1.0
georan(3f) - [M_datapac:RANDOM] generate geometric random numbers
SUBROUTINE GEORAN(N,P,Iseed,X)
INTEGER,intent(in) :: N
REAL(kind=wp),intent(in) :: P
INTEGER,intent(inout) :: Iseed
REAL(kind=wp),intent(out) :: X(:)
GEORAN(3f) generates a random sample of size N from the geometric
distribution with REAL 'Bernoulli probability' parameter
= P.
The geometric distribution used herein has mean = (1-P)/P and standard
deviation = sqrt((1-P)/(P*P))). This distribution is defined for
all non-negative integer X-- X = 0, 1, 2, ... .
This distribution has the probability function
f(X) = P * (1-P)**X.
The geometric distribution is the distribution of the number of
failures before obtaining 1 success in an indefinite sequence of
Bernoulli (0,1) trials where the probability of success in a precision
trial = P.
N The desired integer number of random numbers to be generated.
ISEED An integer iseed value. Should be set to a non-negative value
to start a new sequence of values. Will be set to -1 on return
to indicate the next call should continue the current random
sequence walk.
P The value of the 'Bernoulli probability' parameter for the
geometric distribution. P should be between 0.0 (exclusively)
and 1.0 (exclusively).
X A vector (of dimension at least N) into which the generated random
sample of size N from the geometric distribution will be placed.
Sample program:
program demo_georan
use m_datapac, only : georan, plott, label, plotxt, sort
implicit none
integer,parameter :: n=4000
real :: x(n)
integer :: iseed
real :: P
call label('georan')
P=0.2
iseed=12345
call georan(N,P,Iseed,X)
call plotxt(x,n)
call sort(x,n,x) ! sort to show distribution
call plotxt(x,n)
end program demo_georan
Results:
THE FOLLOWING IS A PLOT OF X(I) (VERTICALLY) VERSUS I (HORIZONTALLY
I-----------I-----------I-----------I-----------I
0.4500000E+02 - X
0.4312500E+02 I
0.4125000E+02 I
0.3937500E+02 I
0.3750000E+02 I X
0.3562500E+02 I
0.3375000E+02 - X
0.3187500E+02 I X
0.3000000E+02 I
0.2812500E+02 I X X
0.2625000E+02 I X X X X XX
0.2437500E+02 I X X XX X X X X
0.2250000E+02 - X X X X X
0.2062500E+02 I X X X XX X XX X X X X
0.1875000E+02 I X XX X XXX X XX X XX XX XX X XX
0.1687500E+02 I X X XX X XXXX X X XXX XX XXXXX XX XX X XXXX
0.1500000E+02 I XX X XXXXXXX X X X X XX XXXX X X X X XX
0.1312500E+02 I XXXX XXXXXX XXXXXXXXX XXXXXXX X X XXXXXXXX XXXX X
0.1125000E+02 - XXXXXXXXXXXXXXXXXXXXXXXX XXXXXXXX XX XXX XXX XX
0.9375000E+01 I XXXXXXXXXXXXXXXXX XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
0.7500000E+01 I XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
0.5625000E+01 I XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
0.3750000E+01 I XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
0.1875000E+01 I XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
0.0000000E+00 - XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
I-----------I-----------I-----------I-----------I
0.1000E+01 0.1001E+04 0.2000E+04 0.3000E+04 0.4000E+04
THE FOLLOWING IS A PLOT OF X(I) (VERTICALLY) VERSUS I (HORIZONTALLY
I-----------I-----------I-----------I-----------I
0.4500000E+02 - X
0.4312500E+02 I
0.4125000E+02 I
0.3937500E+02 I
0.3750000E+02 I X
0.3562500E+02 I
0.3375000E+02 - X
0.3187500E+02 I X
0.3000000E+02 I
0.2812500E+02 I X
0.2625000E+02 I X
0.2437500E+02 I X
0.2250000E+02 - X
0.2062500E+02 I XX
0.1875000E+02 I X
0.1687500E+02 I X
0.1500000E+02 I XX
0.1312500E+02 I XX
0.1125000E+02 - XX
0.9375000E+01 I XXX
0.7500000E+01 I XXXXXX
0.5625000E+01 I XXXXXX
0.3750000E+01 I XXXXXXXXXX
0.1875000E+01 I XXXXXXXXXXXXXX
0.0000000E+00 - XXXXXXXXXXX
I-----------I-----------I-----------I-----------I
0.1000E+01 0.1001E+04 0.2000E+04 0.3000E+04 0.4000E+04
The original DATAPAC library was written by James Filliben of the
Statistical Engineering Division, National Institute of Standards
and Technology.
John Urban, 2022.05.31
CC0-1.0
Type | Intent | Optional | Attributes | Name | ||
---|---|---|---|---|---|---|
real(kind=wp) | :: | P | ||||
real(kind=wp) | :: | Ppar | ||||
real(kind=wp) | :: | Ppf |
SUBROUTINE GEOPPF(P,Ppar,Ppf) REAL(kind=wp) :: aden , anum , aratio , arg1 , arg2 , P , Ppar , Ppf , ratio INTEGER iratio ! ! INPUT ARGUMENTS--P = THE VALUE ! (BETWEEN 0.0 (INCLUSIVELY) ! AND 1.0 (EXCLUSIVELY)) ! AT WHICH THE PERCENT POINT ! FUNCTION IS TO BE EVALUATED. ! --PPAR = THE VALUE ! OF THE 'BERNOULLI PROBABILITY' ! PARAMETER FOR THE GEOMETRIC ! DISTRIBUTION. ! PPAR SHOULD BE BETWEEN ! 0.0 (EXCLUSIVELY) AND ! 1.0 (EXCLUSIVELY). ! OUTPUT ARGUMENTS--PPF = THE PERCENT ! POINT FUNCTION VALUE. ! OUTPUT--THE PERCENT POINT FUNCTION . ! VALUE PPF FOR THE GEOMETRIC DISTRIBUTION ! WITH 'BERNOULLI PROBABILITY' PARAMETER VALUE = PPAR. ! PRINTING--NONE UNLESS AN INPUT ARGUMENT ERROR CONDITION EXISTS. ! RESTRICTIONS--PPAR SHOULD BE BETWEEN 0.0 (EXCLUSIVELY) ! AND 1.0 (EXCLUSIVELY). ! --P SHOULD BE BETWEEN 0.0 (INCLUSIVELY) ! AND 1.0 (EXCLUSIVELY). ! FORTRAN LIBRARY SUBROUTINES NEEDED--LOG. ! MODE OF INTERNAL OPERATIONS--. ! COMMENT--NOTE THAT EVEN THOUGH THE OUTPUT ! FROM THIS DISCRETE DISTRIBUTION ! PERCENT POINT FUNCTION ! SUBROUTINE MUST NECESSARILY BE A ! DISCRETE INTEGER VALUE, ! THE OUTPUT VARIABLE PPF IS SINGLE ! PRECISION IN MODE. ! PPF HAS BEEN SPECIFIED AS SINGLE ! PRECISION SO AS TO CONFORM WITH THE DATAPAC ! CONVENTION THAT ALL OUTPUT VARIABLES FROM ALL ! DATAPAC SUBROUTINES ARE . ! THIS CONVENTION IS BASED ON THE BELIEF THAT ! 1) A MIXTURE OF MODES (FLOATING POINT ! VERSUS INTEGER) IS INCONSISTENT AND ! AN UNNECESSARY COMPLICATION ! IN A DATA ANALYSIS; AND ! 2) FLOATING POINT MACHINE ARITHMETIC ! (AS OPPOSED TO INTEGER ARITHMETIC) ! IS THE MORE NATURAL MODE FOR DOING ! DATA ANALYSIS. ! ORIGINAL VERSION--NOVEMBER 1975. ! !--------------------------------------------------------------------- ! ! CHECK THE INPUT ARGUMENTS FOR ERRORS ! IF ( P<0.0_wp .OR. P>=1.0_wp ) THEN WRITE (G_IO,99001) 99001 FORMAT (' ', & &'***** FATAL ERROR--THE FIRST INPUT ARGUMENT TO THE GEOPPF SUBROU& &TINE IS OUTSIDE THE ALLOWABLE (0,1) INTERVAL *****') WRITE (G_IO,99003) P Ppf = 0.0_wp RETURN ELSEIF ( Ppar<=0.0_wp .OR. Ppar>=1.0_wp ) THEN WRITE (G_IO,99002) 99002 FORMAT (' ', & &'***** FATAL ERROR--THE SECOND INPUT ARGUMENT TO THE GEOPPF SUBROU& &TINE IS OUTSIDE THE ALLOWABLE (0,1) INTERVAL *****') WRITE (G_IO,99003) Ppar Ppf = 0.0_wp RETURN ! !-----START POINT----------------------------------------------------- ! ELSEIF ( P/=0.0 ) THEN ! arg1 = 1.0_wp - P arg2 = 1.0_wp - Ppar anum = LOG(arg1) aden = LOG(arg2) ratio = anum/aden iratio = ratio Ppf = iratio aratio = iratio IF ( aratio==ratio ) Ppf = iratio - 1 GOTO 99999 ENDIF Ppf = 0.0_wp RETURN 99003 FORMAT (' ','***** THE VALUE OF THE ARGUMENT IS ',E15.8,' *****') ! 99999 END SUBROUTINE GEOPPF