NAG Library Manual, Mark 30.2
Interfaces:  FL   CL   CPP   AD 

NAG FL Interface Introduction
Example description
    Program g03gbfe

!     G03GBF Example Program Text
!     Mark 30.2 Release. NAG Copyright 2024.

!     .. Use Statements ..
      Use nag_library, Only: g03gbf, nag_wp, x04caf
!     .. Implicit None Statement ..
      Implicit None
!     .. Parameters ..
      Integer, Parameter               :: nin = 5, nout = 6
!     .. Local Scalars ..
      Real (Kind=nag_wp)               :: loglik, tol
      Integer                          :: f1, g1, i, ifail, ldf, ldg, ldprob,  &
                                          lds, ldx, m, n, ng, niter, nvar,     &
                                          popt, riter, s1, s2, sds, sopt, tds, &
                                          x1
!     .. Local Arrays ..
      Real (Kind=nag_wp), Allocatable  :: f(:,:), g(:,:), prob(:,:), s(:,:,:), &
                                          w(:), x(:,:)
      Integer, Allocatable             :: isx(:)
!     .. Executable Statements ..
      Write (nout,*) 'G03GBF Example Program Results'
      Write (nout,*)
      Flush (nout)

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

!     Problem size
      Read (nin,*) n, m, nvar

!     Number of groups
      Read (nin,*) ng

!     Scaling option
      Read (nin,*) sopt

!     Initial probabilities option
      Read (nin,*) popt

!     Maximum number of iterations
      Read (nin,*) niter

!     Leading dimensions
      x1 = n + 1
      g1 = nvar + 1
      f1 = n + 1
      ldx = 2*n
      ldprob = n + 3
      ldg = 2*nvar
      ldf = 2*n

      s1 = nvar + 1
      s2 = nvar + 1
      tds = ng
      Select Case (sopt)
      Case (1)
      Case (2)
      Case (3)
        s2 = ng + 1
      Case (4)
        s2 = 2
      Case Default
        s1 = 2
        s2 = 2
      End Select
      lds = 2*(s1-1)
      sds = 2*(s2-1)
      Allocate (s(lds,sds,tds))

      Allocate (x(ldx,m),prob(ldprob,ng),g(ldg,ng),w(2*ng),isx(m),f(ldf,ng))

!     Data matrix X
      Read (nin,*)(x(i,1:m),i=1,n)
      x(n+1:2*n,1:m) = x(1:n,1:m)

!     Included variables
      If (nvar/=m) Then
        Read (nin,*) isx(1:m)
      End If

      tol = 0.0E0_nag_wp
      riter = 5

!     First Call using sopt = 1 (Groupwise covariance) and
!                      popt = 1 (probabilities set internally)
      ifail = 0
      Call g03gbf(n,m,x,ldx,isx,nvar,ng,1,prob,ldprob,niter,riter,w,g,ldg,1,s, &
        lds,sds,f,ldf,tol,loglik,ifail)

!     Optionally read initial probabilities of group membership
      If (popt==2) Then
        Read (nin,*)(prob(i,1:ng),i=1,n)
      End If


!     Second Call using supplied sopt and popt.
      ifail = 0
      Call g03gbf(n,m,x(x1,1),ldx,isx,nvar,ng,popt,prob,ldprob,niter,riter,    &
        w(ng+1),g(g1,1),ldg,sopt,s(s1,s2,1),lds,sds,f(f1,1),ldf,tol,loglik,    &
        ifail)

!     Results from second call
      Write (nout,*)
      Flush (nout)
      ifail = 0
      Call x04caf('g','n',1,ng,w(ng+1),1,'Mixing proportions',ifail)

      Write (nout,*)
      Flush (nout)
      ifail = 0
      Call x04caf('g','n',nvar,ng,g(g1,1),ldg,'Group means',ifail)

      Write (nout,*)
      Flush (nout)
      Select Case (sopt)
      Case (1)
        Do i = 1, ng
          ifail = 0
          Call x04caf('g','n',nvar,nvar,s(s1,s2,i),lds,                        &
            'Variance-covariance matrix',ifail)
        End Do
      Case (2)
        ifail = 0
        Call x04caf('g','n',nvar,nvar,s(s1,s2,1),lds,                          &
          'Pooled Variance-covariance matrix',ifail)
      Case (3)
        ifail = 0
        Call x04caf('g','n',nvar,ng,s(s1,s2,1),lds,'Groupwise Variance',ifail)
      Case (4)
        ifail = 0
        Call x04caf('g','n',nvar,1,s(s1,s2,1),lds,'Pooled Variance',ifail)
      Case (5)
        ifail = 0
        Call x04caf('g','n',1,1,s(s1,s2,1),lds,'Overall Variance',ifail)
      End Select

      Write (nout,*)
      Flush (nout)
      ifail = 0
      Call x04caf('g','n',n,ng,f(f1,1),ldf,'Densities',ifail)

      Write (nout,*)
      Flush (nout)
      ifail = 0
      Call x04caf('g','n',n,ng,prob,ldprob,'Membership probabilities',ifail)

      Write (nout,*)
      Write (nout,'(1X,A,1X,I16)') 'No. iterations:', niter

      Write (nout,'(1X,A,1X,F16.4)') 'Log-likelihood:', loglik

      Deallocate (x,prob,g,s,w,isx,f)
    End Program g03gbfe