lamcdf(3f) - [M_datapac:CUMULATIVE_DISTRIBUTION] compute the
Tukey-Lambda cumulative distribution function
SUBROUTINE LAMCDF(X,Alamba,Cdf)
REAL(kind=wp),intent(in) :: X
REAL(kind=wp),intent(in) :: Alamba
REAL(kind=wp),intent(out) :: Cdf
LAMCDF(3f) computes the cumulative distribution function value for the
(Tukey) lambda distribution with tail length parameter value = ALAMBA.
In general, the probability density function for this distribution
is not simple.
The percent point function for this distribution is
g(P) = ((P**ALAMBA)-((1-P)**ALAMBA))/ALAMBA
X The value at which the cumulative distribution function is
to be evaluated.
For ALAMBA non-positive, no restrictions on X.
For ALAMBA positive, X should be between (-1/ALAMBA) and
(+1/ALAMBA), inclusively.
ALAMBA The value of lambda (the tail length parameter).
CDF The cumulative distribution function value for the Tukey
lambda distribution.
Sample program:
program demo_lamcdf
!@(#) line plotter graph of cumulative distribution function
use M_datapac, only : lamcdf, plott, label
implicit none
real,allocatable :: x(:), y(:)
real :: alamba
integer :: i
call label('lamcdf')
alamba=4.0
x=[(real(i)/100.0/alamba,i=-100,100,1)]
if(allocated(y))deallocate(y)
allocate(y(size(x)))
do i=1,size(x)
call lamcdf(X(i),Alamba,y(i))
enddo
call plott(x,y,size(x))
end program demo_lamcdf
Results:
The following is a plot of Y(I) (vertically) versus X(I) (horizontally)
I-----------I-----------I-----------I-----------I
0.2500000E+00 - X
0.2291667E+00 I XX
0.2083333E+00 I XX
0.1875000E+00 I XX
0.1666667E+00 I XX
0.1458333E+00 I XXX
0.1250000E+00 - XX
0.1041667E+00 I XX
0.8333333E-01 I XX
0.6250000E-01 I XXX
0.4166666E-01 I XXXX
0.2083333E-01 I XXXX
0.0000000E+00 - XXXXX
-0.2083334E-01 I XXXX
-0.4166669E-01 I XXXX
-0.6250000E-01 I XXX
-0.8333334E-01 I XX
-0.1041667E+00 I XX
-0.1250000E+00 - XX
-0.1458333E+00 I XXX
-0.1666667E+00 I XX
-0.1875000E+00 I XX
-0.2083333E+00 I XX
-0.2291667E+00 I XX
-0.2500000E+00 - X
I-----------I-----------I-----------I-----------I
0.0000E+00 0.2500E+00 0.5000E+00 0.7500E+00 0.1000E+01
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
lampdf(3f) - [M_datapac:PROBABILITY_DENSITY] compute the Tukey-Lambda
probability density function
SUBROUTINE LAMPDF(X,Alamba,Pdf)
REAL(kind=wp) :: X
REAL(kind=wp) :: Alamba
LAMPDF(3f) computes the probability density function value for the
(tukey) lambda distribution with tail length parameter value = alamba.
In general, the probability density function for this distribution
is not simple.
The percent point function for this distribution is
g(p) = ((p**alamba)-((1-p)**alamba))/alamba
X The REAL value at which the probability density
function is to be evaluated.
For ALAMBA non-positive, no restrictions on X.
For ALAMBA positive, X should be between (-1/ALAMBA)
and (+1/ALAMBA), inclusively.
ALAMBA The REAL value of lambda (the tail length
parameter).
PDF The probability density function value for the Tukey Lambda
distribution
Sample program:
program demo_lampdf
!@(#) line plotter graph of probability density function
use M_datapac, only : lampdf, plott, label
implicit none
real,allocatable :: x(:), y(:)
real :: alamba
integer :: i
call label('lampdf')
alamba=0.0
x=[(real(i),i=-100,100,1)]
if(allocated(y))deallocate(y)
allocate(y(size(x)))
do i=1,size(x)
call LAMPDF(X(i)/100.0,Alamba,y(i))
enddo
call plott(x,y,size(x))
end program demo_lampdf
Results:
The following is a plot of Y(I) (vertically) versus X(I) (horizontally)
I-----------I-----------I-----------I-----------I
0.1000000E+03 - XXXX
0.9166666E+02 I XXXXXXX
0.8333334E+02 I XXXXXXX
0.7500000E+02 I XXXXXXX
0.6666667E+02 I XXXXX
0.5833334E+02 I XXXXX
0.5000000E+02 - XXXXXX
0.4166667E+02 I XXXX
0.3333334E+02 I XXXX
0.2500000E+02 I XXXX
0.1666667E+02 I XX
0.8333336E+01 I XX
0.0000000E+00 - X
-0.8333328E+01 I XX
-0.1666666E+02 I XX
-0.2499999E+02 I XXXX
-0.3333333E+02 I XXXX
-0.4166666E+02 I XXXX
-0.5000000E+02 - XXXXXX
-0.5833333E+02 I XXXXX
-0.6666666E+02 I XXXXX
-0.7500000E+02 I XXXXXXX
-0.8333333E+02 I XXXXXXX
-0.9166666E+02 I XXXXXXX
-0.1000000E+03 - XXXX
I-----------I-----------I-----------I-----------I
0.1966E+00 0.2100E+00 0.2233E+00 0.2367E+00 0.2500E+00
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), | intent(in) | :: | X | |||
real(kind=wp), | intent(in) | :: | Alamba | |||
real(kind=wp), | intent(out) | :: | Cdf |
SUBROUTINE LAMCDF(X,Alamba,Cdf) REAL(kind=wp),intent(in) :: X REAL(kind=wp),intent(in) :: Alamba REAL(kind=wp),intent(out) :: Cdf REAL(kind=wp) :: pdel , plower , pmax , pmid , pmin , pupper , xcalc , xmax , xmin INTEGER :: icount ! !--------------------------------------------------------------------- ! ! CHECK THE INPUT ARGUMENTS FOR ERRORS ! IF ( Alamba>0.0_wp ) THEN xmax = 1.0_wp/Alamba xmin = -xmax IF ( X<xmin .OR. X>xmax ) THEN WRITE (G_IO,99001) 99001 FORMAT (& &' ***** NON-FATAL DIAGNOSTIC--THE FIRST INPUT ARGUMENT TO LAMCDF(3f) IS OUTSIDE THE USUAL +-(1/ALAMBA) INTERVAL *****') WRITE (G_IO,99002) X 99002 FORMAT (' ***** THE VALUE OF THE ARGUMENT IS ',E15.8,' *****') IF ( X<xmin ) Cdf = 0.0_wp IF ( X>xmax ) Cdf = 1.0_wp RETURN ENDIF ENDIF ! !-----START POINT----------------------------------------------------- ! IF ( Alamba>0.0_wp ) THEN ! xmax = 1.0_wp/Alamba xmin = -xmax IF ( X<=xmin ) Cdf = 0.0_wp IF ( X>=xmax ) Cdf = 1.0_wp IF ( X<=xmin .OR. X>=xmax ) RETURN ENDIF ! IF ( -0.001_wp>=Alamba .OR. Alamba>=0.001_wp ) THEN ! IF ( -0.001_wp>=Alamba .OR. Alamba>=0.001_wp ) THEN pmin = 0.0_wp pmid = 0.5_wp pmax = 1.0_wp plower = pmin pupper = pmax icount = 0 DO xcalc = (pmid**Alamba-(1.0_wp-pmid)**Alamba)/Alamba IF ( xcalc==X ) THEN Cdf = pmid GOTO 99999 ELSE IF ( xcalc>X ) THEN pupper = pmid pmid = (pmid+plower)/2.0_wp ELSE plower = pmid pmid = (pmid+pupper)/2.0_wp ENDIF pdel = ABS(pmid-plower) icount = icount + 1 IF ( pdel<0.000001_wp .OR. icount>30 ) THEN Cdf = pmid GOTO 99999 ENDIF ENDIF ENDDO ENDIF ENDIF IF ( X>=0.0_wp ) THEN Cdf = 1.0_wp/(1.0_wp+EXP(-X)) RETURN ELSE Cdf = EXP(X)/(1.0_wp+EXP(X)) RETURN ENDIF ! 99999 END SUBROUTINE LAMCDF