GEOPPF Subroutine

public subroutine GEOPPF(P, Ppar, Ppf)

NAME

geoppf(3f) - [M_datapac:PERCENT_POINT] compute the geometric percent
point function

SYNOPSIS

   SUBROUTINE GEOPPF(P,Ppar,Ppf)

DESCRIPTION

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.

OPTIONS

 X   description of parameter
 Y   description of parameter

EXAMPLES

Sample program:

program demo_geoppf
use M_datapac, only : geoppf
implicit none
! call geoppf(x,y)
end program demo_geoppf

Results:

AUTHOR

The original DATAPAC library was written by James Filliben of the
Statistical Engineering Division, National Institute of Standards
and Technology.

MAINTAINER

John Urban, 2022.05.31

LICENSE

CC0-1.0

REFERENCES

  • FELLER, AN INTRODUCTION TO PROBABILITY THEORY AND ITS APPLICATIONS, VOLUME 1, EDITION 2, 1957, pages 155-157, 210.
  • NATIONAL BUREAU OF STANDARDS APPLIED MATHEMATICS SERIES 55, 1964, page 929.

NAME

georan(3f) - [M_datapac:RANDOM] generate geometric random numbers

SYNOPSIS

   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(:)

DESCRIPTION

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.

INPUT ARGUMENTS

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).

OUTPUT ARGUMENTS

X   A vector (of dimension at least N) into which the generated random
    sample of size N from the geometric distribution will be placed.

EXAMPLES

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

AUTHOR

The original DATAPAC library was written by James Filliben of the
Statistical Engineering Division, National Institute of Standards
and Technology.

MAINTAINER

John Urban, 2022.05.31

LICENSE

CC0-1.0

REFERENCES

  • Tocher, The Art of Simulation, 1963, pages 14-15.
  • Hammersley and Handscomb, Monte Carlo Methods, 1964, page 36.
  • Feller, An Introduction to Probability Theory and its Applications, Volume 1, Edition 2, 1957, pages 155-157, 210.
  • National Bureau of Standards Applied Mathematics Series 55, 1964, page 929.

Arguments

Type IntentOptional Attributes Name
real(kind=wp) :: P
real(kind=wp) :: Ppar
real(kind=wp) :: Ppf

Source Code

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