    PROGRAM g02kafe

!      G02KAF Example Program Text

!      Mark 23 Release. NAG Copyright 2011.

!      .. Use Statements ..
       USE nag_library, ONLY : g02kaf, nag_wp
!      .. Implicit None Statement ..
       IMPLICIT NONE
!      .. Parameters ..
       INTEGER, PARAMETER              :: nin = 5, nout = 6
!      .. Local Scalars ..
       REAL (KIND=nag_wp)              :: h, nep, rss, tau, tol
       INTEGER                         :: df, i, ifail, ip, ldx, m, n, niter,  &
                                          opt, optloo, orig
!      .. Local Arrays ..
       REAL (KIND=nag_wp), ALLOCATABLE :: b(:), res(:), vif(:), x(:,:), y(:)
       REAL (KIND=nag_wp)              :: perr(5)
       INTEGER, ALLOCATABLE            :: isx(:)
!      .. Intrinsic Functions ..
       INTRINSIC                          count
!      .. Executable Statements ..
       WRITE (nout,*) 'G02KAF Example Program Results'
       WRITE (nout,*)

!      Skip heading in data file
       READ (nin,*)

!      Read in the problem size
       READ (nin,*) n, m, h, opt, tol, niter, orig, optloo, tau

       ldx = n
       ALLOCATE (x(ldx,m),y(n),isx(m))

!      Read in data
       READ (nin,*) (x(i,1:m),y(i),i=1,n)

!      Read in variable inclusion flags
       READ (nin,*) isx(1:m)

!      Calculate IP
       ip = count(isx(1:m)==1)

       ALLOCATE (b(ip+1),vif(ip),res(n))

!      Fit ridge regression model
       ifail = -1
       CALL g02kaf(n,m,x,ldx,isx,ip,tau,y,h,opt,niter,tol,nep,orig,b,vif,res, &
          rss,df,optloo,perr,ifail)
       IF (ifail/=0) THEN
          IF (ifail/=-1) THEN
             GO TO 20
          END IF
       END IF

!      Display results
       WRITE (nout,99999) 'Value of ridge parameter:', h
       WRITE (nout,*)
       WRITE (nout,99998) 'Sum of squares of residuals:', rss
       WRITE (nout,99997) 'Degrees of freedom: ', df
       WRITE (nout,99999) 'Number of effective parameters:', nep
       WRITE (nout,*)
       WRITE (nout,*) 'Parameter estimates'
       WRITE (nout,99995) (i,b(i),i=1,ip+1)
       WRITE (nout,*)
       WRITE (nout,99996) 'Number of iterations:', niter
       WRITE (nout,*)
       IF (opt==1) THEN
          WRITE (nout,*) 'Ridge parameter minimises GCV'
       ELSE IF (opt==2) THEN
          WRITE (nout,*) 'Ridge parameter minimises UEV'
       ELSE IF (opt==3) THEN
          WRITE (nout,*) 'Ridge parameter minimises FPE'
       ELSE IF (opt==4) THEN
          WRITE (nout,*) 'Ridge parameter minimises BIC'
       END IF
       WRITE (nout,*)
       WRITE (nout,*) 'Estimated prediction errors:'
       WRITE (nout,99999) 'GCV    =', perr(1)
       WRITE (nout,99999) 'UEV    =', perr(2)
       WRITE (nout,99999) 'FPE    =', perr(3)
       WRITE (nout,99999) 'BIC    =', perr(4)
       IF (optloo==2) THEN
          WRITE (nout,99999) 'LOO CV =', perr(5)
       END IF
       WRITE (nout,*)
       WRITE (nout,*) 'Residuals'
       WRITE (nout,99995) (i,res(i),i=1,n)
       WRITE (nout,*)
       WRITE (nout,*) 'Variance inflation factors'
       WRITE (nout,99995) (i,vif(i),i=1,ip)

20     CONTINUE

99999  FORMAT (1X,A,1X,F10.4)
99998  FORMAT (1X,A,E11.4)
99997  FORMAT (1X,A,1X,I5)
99996  FORMAT (1X,A,I16)
99995  FORMAT (1X,I4,1X,F11.4)
    END PROGRAM g02kafe
