C===================================================== SAMLMR.FOR SUBROUTINE SAMLMR(X,N,XMOM,NMOM,A,B,*) C*********************************************************************** C* * C* FORTRAN CODE WRITTEN FOR INCLUSION IN IBM RESEARCH REPORT RC20525, * C* 'FORTRAN ROUTINES FOR USE WITH THE METHOD OF L-MOMENTS, VERSION 3' * C* * C* J. R. M. HOSKING * C* IBM RESEARCH DIVISION * C* T. J. WATSON RESEARCH CENTER * C* YORKTOWN HEIGHTS * C* NEW YORK 10598, U.S.A. * C* * C* VERSION 3 AUGUST 1996 * C* * C*********************************************************************** C C SAMPLE L-MOMENTS OF A DATA ARRAY C C PARAMETERS OF ROUTINE: C X * INPUT* ARRAY OF LENGTH N. CONTAINS THE DATA, IN ASCENDING C ORDER. C N * INPUT* NUMBER OF DATA VALUES C XMOM *OUTPUT* ARRAY OF LENGTH NMOM. ON EXIT, CONTAINS THE SAMPLE C L-MOMENTS L-1, L-2, T-3, T-4, ... . C NMOM * INPUT* NUMBER OF L-MOMENTS TO BE FOUND. AT MOST MAX(N,20). C A * INPUT* ) PARAMETERS OF PLOTTING C B * INPUT* ) POSITION (SEE BELOW) C C FOR UNBIASED ESTIMATES (OF THE LAMBDA'S) SET A=B=ZERO. OTHERWISE, C PLOTTING-POSITION ESTIMATORS ARE USED, BASED ON THE PLOTTING POSITION C (J+A)/(N+B) FOR THE J'TH SMALLEST OF N OBSERVATIONS. FOR EXAMPLE, C A=-0.35D0 AND B=0.0D0 YIELDS THE ESTIMATORS RECOMMENDED BY C HOSKING ET AL. (1985, TECHNOMETRICS) FOR THE GEV DISTRIBUTION. C IMPLICIT DOUBLE PRECISION (A-H,O-Z) DOUBLE PRECISION X(N),XMOM(NMOM),SUM(20) DATA ZERO/0D0/,ONE/1D0/ IF(NMOM.GT.20.OR.NMOM.GT.N)GOTO 1000 DO 10 J=1,NMOM 10 SUM(J)=ZERO IF(A.EQ.ZERO.AND.B.EQ.ZERO)GOTO 50 IF(A.LE.-ONE.OR.A.GE.B)GOTO 1010 C C PLOTTING-POSITION ESTIMATES OF PWM'S C DO 30 I=1,N PPOS=(I+A)/(N+B) TERM=X(I) SUM(1)=SUM(1)+TERM DO 20 J=2,NMOM TERM=TERM*PPOS 20 SUM(J)=SUM(J)+TERM 30 CONTINUE DO 40 J=1,NMOM 40 SUM(J)=SUM(J)/N GOTO 100 C C UNBIASED ESTIMATES OF PWM'S C 50 DO 70 I=1,N Z=I TERM=X(I) SUM(1)=SUM(1)+TERM DO 60 J=2,NMOM Z=Z-ONE TERM=TERM*Z 60 SUM(J)=SUM(J)+TERM 70 CONTINUE Y=N Z=N SUM(1)=SUM(1)/Z DO 80 J=2,NMOM Y=Y-ONE Z=Z*Y 80 SUM(J)=SUM(J)/Z C C L-MOMENTS C 100 K=NMOM P0=ONE IF(NMOM-NMOM/2*2.EQ.1)P0=-ONE DO 120 KK=2,NMOM AK=K P0=-P0 P=P0 TEMP=P*SUM(1) DO 110 I=1,K-1 AI=I P=-P*(AK+AI-ONE)*(AK-AI)/(AI*AI) 110 TEMP=TEMP+P*SUM(I+1) SUM(K)=TEMP 120 K=K-1 XMOM(1)=SUM(1) IF(NMOM.EQ.1)RETURN XMOM(2)=SUM(2) IF(SUM(2).EQ.ZERO)GOTO 1020 IF(NMOM.EQ.2)RETURN DO 130 K=3,NMOM 130 XMOM(K)=SUM(K)/SUM(2) RETURN C 1000 WRITE(6,7000) RETURN 1 1010 WRITE(6,7010) RETURN 1 1020 WRITE(6,7020) RETURN 1 C 7000 FORMAT(' *** ERROR *** ROUTINE SAMLMR : PARAMETER NMOM INVALID') 7010 FORMAT(' *** ERROR *** ROUTINE SAMLMR :', * ' PLOTTING-POSITION PARAMETERS INVALID') 7020 FORMAT(' *** ERROR *** ROUTINE SAMLMR : ALL DATA VALUES EQUAL') END