spcorr(3f) - [M_datapac:STATISTICS] compute the sample Spearman rank
correlation coefficient between two vectors of observations
SUBROUTINE SPCORR(X,Y,N,Iwrite,Spc)
spcorr(3f) computes the spearman rank correlation coefficient between
the 2 sets of data in the input vectors x and y.
the spearman rank correlation coefficient will be a REAL
value between -1.0 and 1.0 (inclusively).
X description of parameter
Y description of parameter
Sample program:
program demo_spcorr
use M_datapac, only : spcorr
implicit none
! call spcorr(x,y)
end program demo_spcorr
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
Type | Intent | Optional | Attributes | Name | ||
---|---|---|---|---|---|---|
real(kind=wp), | dimension(:) | :: | X | |||
real(kind=wp), | dimension(:) | :: | Y | |||
integer | :: | N | ||||
integer | :: | Iwrite | ||||
real(kind=wp) | :: | Spc |
Type | Attributes | Name | Initial | |||
---|---|---|---|---|---|---|
real | :: | WS(15000) |
SUBROUTINE SPCORR(X,Y,N,Iwrite,Spc) REAL(kind=wp) :: an, hold, Spc, sum, WS, X, XR, Y, YR INTEGER :: i, iflag, iupper, Iwrite, N ! ! INPUT ARGUMENTS--X = THE VECTOR OF ! (UNSORTED OR SORTED) OBSERVATIONS ! WHICH CONSTITUTE THE FIRST SET ! OF DATA. ! --Y = THE VECTOR OF ! (UNSORTED OR SORTED) OBSERVATIONS ! WHICH CONSTITUTE THE SECOND SET ! OF DATA. ! --N = THE INTEGER NUMBER OF OBSERVATIONS ! IN THE VECTOR X, OR EQUIVALENTLY, ! THE INTEGER NUMBER OF OBSERVATIONS ! IN THE VECTOR Y. ! --IWRITE = AN INTEGER FLAG CODE WHICH ! (IF SET TO 0) WILL SUPPRESS ! THE PRINTING OF THE ! SPEARMAN RANK CORRELATION COEFFICIENT ! AS IT IS COMPUTED; ! OR (IF SET TO SOME INTEGER ! VALUE NOT EQUAL TO 0), ! LIKE, SAY, 1) WILL CAUSE ! THE PRINTING OF THE ! SPEARMAN CORRELATION COEFFICIENT ! AT THE TIME IT IS COMPUTED. ! OUTPUT ARGUMENTS--SPC = THE VALUE OF THE ! COMPUTED SPEARMAN RANK CORRELATION ! COEFFICIENT BETWEEN THE 2 SETS OF DATA ! IN THE INPUT VECTORS X AND Y. ! THIS VALUE ! WILL BE BETWEEN -1.0 AND 1.0 ! (INCLUSIVELY). ! OUTPUT--THE COMPUTED VALUE OF THE ! SPEARMAN RANK CORRELATION COEFFICIENT BETWEEN THE 2 SETS ! OF DATA IN THE INPUT VECTORS X AND Y. ! RESTRICTIONS--THE MAXIMUM ALLOWABLE VALUE OF N FOR THIS SUBROUTINE IS 7500. ! !--------------------------------------------------------------------- ! DIMENSION X(:) , Y(:) DIMENSION XR(7500) , YR(7500) COMMON /BLOCK2_real32/ WS(15000) EQUIVALENCE (XR(1),WS(1)) EQUIVALENCE (YR(1),WS(7501)) ! iupper = 7500 ! ! CHECK THE INPUT ARGUMENTS FOR ERRORS ! an = N Spc = 0.0_wp iflag = 0 IF ( N<1 .OR. N>iupper ) THEN WRITE (G_IO,99001) iupper 99001 FORMAT (' ***** FATAL ERROR--THE THIRD INPUT ARGUMENT TO SPCORR(3f) IS OUTSIDE THE ALLOWABLE (1,',& & I0,' INTERVAL *****') WRITE (G_IO,99002) N 99002 FORMAT (' ***** THE VALUE OF THE ARGUMENT IS ',I0,' *****') RETURN ELSEIF ( N==1 ) THEN WRITE (G_IO,99003) 99003 FORMAT (' ***** NON-FATAL DIAGNOSTIC--THE THIRD INPUT ARGUMENT TO SPCORR(3f) HAS THE VALUE 1 *****') RETURN ELSE hold = X(1) DO i = 2 , N IF ( X(i)/=hold ) GOTO 50 ENDDO WRITE (G_IO,99004) hold 99004 FORMAT (' ***** NON-FATAL DIAGNOSTIC--THE FIRST INPUT ARGUMENT (A VECTOR) TO SPCORR(3f) HAS ALL ELEMENTS =',& & E15.8,' *****') iflag = 1 50 hold = Y(1) DO i = 2 , N IF ( Y(i)/=hold ) GOTO 100 ENDDO WRITE (G_IO,99005) hold 99005 FORMAT (' ***** NON-FATAL DIAGNOSTIC--THE SECOND INPUT ARGUMENT (A VECTOR) TO SPCORR(3f) HAS ALL ELEMENTS =',& & E15.8,' *****') iflag = 1 100 IF ( iflag==1 ) RETURN ! !-----START POINT----------------------------------------------------- ! CALL RANK(X,N,XR) CALL RANK(Y,N,YR) sum = 0.0_wp DO i = 1 , N sum = sum + (XR(i)-YR(i))**2 ENDDO Spc = 1.0_wp - (6.0_wp*sum/((an-1.0_wp)*an*(an+1.0_wp))) ! IF ( Iwrite/=0 ) WRITE (G_IO,99006) N , Spc 99006 FORMAT (' THE SPEARMAN RANK CORRELATION COEFFICIENT OF THE 2 SETS OF '& & ,I0,' OBSERVATIONS IS ',F14.5) ENDIF END SUBROUTINE SPCORR