diff --git a/ReadMatLabDesign.for b/ReadMatLabDesign.for index fdc0ac6182734b4c380ea04cf747701d419727af..82f49d5e1098d0fd7a4fac2628513a7ddf0a6a26 100644 --- a/ReadMatLabDesign.for +++ b/ReadMatLabDesign.for @@ -1,12 +1,12 @@ -C -------------------------------------------------------------------- -C This file crates matlabdll.dll whih is ment to read the .m file -C -C Copyright (C) 2010-2014 European Commission -C +C -------------------------------------------------------------------- +C This file crates matlabdll.dll whih is ment to read the .m file +C +C Copyright (C) 2010-2014 European Commission +C C This file is part of Program DMM C -C DMM is free software developed at the Joint Research Centre of the -C European Commission: you can redistribute it and/or modify it under +C DMM is free software developed at the Joint Research Centre of the +C European Commission: you can redistribute it and/or modify it under C the terms of the GNU General Public License as published by C the Free Software Foundation, either version 3 of the License, or C (at your option) any later version. @@ -17,205 +17,205 @@ C MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the C GNU General Public License for more details. C C You should have received a copy of the GNU General Public License -C along with DMM. If not, see <http://www.gnu.org/licenses/>. -C --------------------------------------------------------------------- - SUBROUTINE DESIGN(ny,nz,nx,nu,ns,nt,theta,c,H,G,a,F,R) -!DEC$ ATTRIBUTES DLLEXPORT, ALIAS:'design_' :: DESIGN - -C INPUT - INTEGER ny,nz,nx,nu,ns(6),nt - DOUBLE PRECISION theta(nt) -C OUTPUT - DOUBLE PRECISION c(ny,max(1,nz),ns(1)),H(ny,nx,ns(2)), - & G(ny,nu,ns(3)),a(nx,ns(4)),F(nx,nx,ns(5)), - & R(nx,nu,ns(6)) -C -C COMMON -C - INTEGER ep - COMMON /X/ ep - DATA ep/0/ - CHARACTER*200 mfile,pathmfile - COMMON /M/ mfile,pathmfile - CHARACTER*1024 buffer,buffer1 - COMMON /ERRBUFFER/ buffer -C -C LOCALS TO INTERFACE MatLab -C - INTEGER engOpen, engGetVariable, mxCreateDoubleMatrix - INTEGER mxGetPr - INTEGER engPutVariable, engEvalString, engClose - INTEGER i, temp, status - DOUBLE PRECISION nsd(6) - INTEGER ny_ptr,nz_ptr,nx_ptr,nu_ptr,ns_ptr,nt_ptr,theta_ptr - INTEGER C_ptr, H_ptr, G_ptr, A_ptr, F_ptr, R_ptr - - -C Try to open MatLab (just the first time) - IF (ep .eq.0 ) THEN - ep = engOpen('matlab ') - IF (ep .eq. 0) THEN - ny = 0 ! ' Can''t start MatLab engine' - RETURN - ENDIF - IF (engEvalString(ep,'cd ' // pathmfile).ne. 0) then - ny = -7 ! ' Can''t find or open the MatLab funtion' - RETURN - ENDIF - ENDIF - -C -C Check MatLab INPUT -C - ny_ptr = mxCreateDoubleScalar(ny*1.0d0) - status = engPutVariable(ep, 'ny'C, ny_ptr) - IF (status .ne. 0) THEN - ny = -1 ! ' Can''t read ny in the MatLab file' - RETURN - ENDIF - - nz_ptr = mxCreateDoubleScalar(nz*1.0d0) - status = engPutVariable(ep, 'nz'C, nz_ptr) - IF (status .ne. 0) THEN - ny = -2 ! ' Can''t read nz in the MatLab file' - RETURN - ENDIF - - nx_ptr = mxCreateDoubleScalar(nx*1.0d0) - status = engPutVariable(ep, 'nx'C, nx_ptr) - IF (status .ne. 0) THEN - ny = -3 ! ' Can''t read nx in the MatLab file' - RETURN - ENDIF - - nu_ptr = mxCreateDoubleScalar(nu*1.0d0) - status = engPutVariable(ep, 'nu'C, nu_ptr) - IF (status .ne. 0) THEN - ny = -4 ! ' Can''t read nu in the MatLab file' - RETURN - ENDIF - - ns_ptr = mxCreateDoubleMatrix(1, 6, 0) - DO i=1,6 - nsd(i)=ns(i)*1.d0 - ENDDO - CALL mxCopyReal8ToPtr(nsd, mxGetPr(ns_ptr), 6) - status = engPutVariable(ep, 'ns'C, ns_ptr) - IF (status .ne. 0) THEN - ny = -5 ! ' Can''t read ns in the MatLab file' - RETURN - ENDIF - - theta_ptr = mxCreateDoubleMatrix(1, nt, 0) - CALL mxCopyReal8ToPtr(theta, mxGetPr(theta_ptr), nt) - status = engPutVariable(ep, 'theta'C, theta_ptr) - IF (status .ne. 0) THEN - ny = -6 ! ' Can''t read theta in the MatLab file' - RETURN - ENDIF - -C -C Evaluate the MatLab DESIGN Funtion with the input data from FORTRAN -C - buffer = '' - status = engOutputBuffer(ep, buffer1) - IF (engEvalString(ep, 'clear success;'// - & '[C,H,G,A,F,R]='//TRIM(mfile)//'( ny,nz,nx,'// - & 'nu,ns,theta);'//'success=1;') .ne. 0) then - ny = -8 ! engEvalString failed - RETURN - ENDIF - C_ptr = engGetVariable(ep, 'success'C) - IF (C_ptr .eq. 0) then - buffer=buffer1 - ny=-8 ! engEvalString failed - RETURN - ENDIF - -C -C Get the MatLab DESIGN created matrics back to FORTRAN -C - C_ptr = engGetVariable(ep, 'C'C) - IF(C_ptr.NE.0) THEN - CALL mxCopyPtrToReal8(mxGetPr(C_ptr), c, ny*max(1,nz)*ns(1)) - ELSE - ny = -101 - ENDIF - - H_ptr = engGetVariable(ep, 'H'C) - IF(H_ptr.NE.0) THEN - CALL mxCopyPtrToReal8(mxGetPr(H_ptr), H, ny*nx*ns(2)) - ELSE - ny = -102 - ENDIF - - G_ptr = engGetVariable(ep, 'G'C) - IF(G_ptr.NE.0) THEN - CALL mxCopyPtrToReal8(mxGetPr(G_ptr), G, ny*nu*ns(3)) - ELSE - ny = -103 - ENDIF - - A_ptr = engGetVariable(ep, 'A'C) - IF(A_ptr.NE.0) THEN - CALL mxCopyPtrToReal8(mxGetPr(A_ptr), a, nx*ns(4)) - ELSE - ny = -104 - ENDIF - - F_ptr = engGetVariable(ep, 'F'C) - IF(F_ptr.NE.0) THEN - CALL mxCopyPtrToReal8(mxGetPr(F_ptr), F, nx*nx*ns(5)) - ELSE - ny = -105 - ENDIF - - R_ptr = engGetVariable(ep, 'R'C) - IF(R_ptr.NE.0) THEN - CALL mxCopyPtrToReal8(mxGetPr(R_ptr), R, nx*nu*ns(6)) - ELSE - ny = -106 - ENDIF - -C -C Free dynamic memory allocated by MXCREATE function -C - CALL mxDestroyArray(nz_ptr) - CALL mxDestroyArray(nx_ptr) - CALL mxDestroyArray(nu_ptr) - CALL mxDestroyArray(ns_ptr) - CALL mxDestroyArray(theta_ptr) - CALL mxDestroyArray(C_ptr) - CALL mxDestroyArray(H_ptr) - CALL mxDestroyArray(G_ptr) - CALL mxDestroyArray(A_ptr) - CALL mxDestroyArray(F_ptr) - CALL mxDestroyArray(R_ptr) - CALL mxDestroyArray(ny_ptr) - - RETURN - END - -C ----------------------------------------- -C To make dynamic the name of the .m file -C ----------------------------------------- - SUBROUTINE SETFILEM(string1,string2) -!DEC$ ATTRIBUTES DLLEXPORT, ALIAS:'setfilem_' :: SETFILEM - CHARACTER*200 string1,string2,mfile,pathmfile - COMMON /M/ mfile, pathmfile - mfile = string1 - pathmfile = string2 - RETURN - END - -C -------------------- -C To get MatLab errors -C -------------------- - SUBROUTINE GETERRSTR(matlaberror) -!DEC$ ATTRIBUTES DLLEXPORT, ALIAS:'geterrstr_' :: GETERRSTR - CHARACTER*1024 matlaberror - CHARACTER*1024 buffer - COMMON /ERRBUFFER/ buffer - matlaberror = buffer - RETURN - END +C along with DMM. If not, see <http://www.gnu.org/licenses/>. +C --------------------------------------------------------------------- + SUBROUTINE DESIGN(ny,nz,nx,nu,ns,nt,theta,c,H,G,a,F,R) +!DEC$ ATTRIBUTES DLLEXPORT, ALIAS:'design_' :: DESIGN + +C INPUT + INTEGER ny,nz,nx,nu,ns(6),nt + DOUBLE PRECISION theta(nt) +C OUTPUT + DOUBLE PRECISION c(ny,max(1,nz),ns(1)),H(ny,nx,ns(2)), + & G(ny,nu,ns(3)),a(nx,ns(4)),F(nx,nx,ns(5)), + & R(nx,nu,ns(6)) +C +C COMMON +C + INTEGER ep + COMMON /X/ ep + DATA ep/0/ + CHARACTER*200 mfile,pathmfile + COMMON /M/ mfile,pathmfile + CHARACTER*1024 buffer,buffer1 + COMMON /ERRBUFFER/ buffer +C +C LOCALS TO INTERFACE MatLab +C + INTEGER engOpen, engGetVariable, mxCreateDoubleMatrix + INTEGER mxGetPr + INTEGER engPutVariable, engEvalString, engClose + INTEGER i, temp, status + DOUBLE PRECISION nsd(6) + INTEGER ny_ptr,nz_ptr,nx_ptr,nu_ptr,ns_ptr,nt_ptr,theta_ptr + INTEGER C_ptr, H_ptr, G_ptr, A_ptr, F_ptr, R_ptr + + +C Try to open MatLab (just the first time) + IF (ep .eq.0 ) THEN + ep = engOpen('matlab ') + IF (ep .eq. 0) THEN + ny = 0 ! ' Can''t start MatLab engine' + RETURN + ENDIF + IF (engEvalString(ep,'cd ' // pathmfile).ne. 0) then + ny = -7 ! ' Can''t find or open the MatLab funtion' + RETURN + ENDIF + ENDIF + +C +C Check MatLab INPUT +C + ny_ptr = mxCreateDoubleScalar(ny*1.0d0) + status = engPutVariable(ep, 'ny'C, ny_ptr) + IF (status .ne. 0) THEN + ny = -1 ! ' Can''t read ny in the MatLab file' + RETURN + ENDIF + + nz_ptr = mxCreateDoubleScalar(nz*1.0d0) + status = engPutVariable(ep, 'nz'C, nz_ptr) + IF (status .ne. 0) THEN + ny = -2 ! ' Can''t read nz in the MatLab file' + RETURN + ENDIF + + nx_ptr = mxCreateDoubleScalar(nx*1.0d0) + status = engPutVariable(ep, 'nx'C, nx_ptr) + IF (status .ne. 0) THEN + ny = -3 ! ' Can''t read nx in the MatLab file' + RETURN + ENDIF + + nu_ptr = mxCreateDoubleScalar(nu*1.0d0) + status = engPutVariable(ep, 'nu'C, nu_ptr) + IF (status .ne. 0) THEN + ny = -4 ! ' Can''t read nu in the MatLab file' + RETURN + ENDIF + + ns_ptr = mxCreateDoubleMatrix(1, 6, 0) + DO i=1,6 + nsd(i)=ns(i)*1.d0 + ENDDO + CALL mxCopyReal8ToPtr(nsd, mxGetPr(ns_ptr), 6) + status = engPutVariable(ep, 'ns'C, ns_ptr) + IF (status .ne. 0) THEN + ny = -5 ! ' Can''t read ns in the MatLab file' + RETURN + ENDIF + + theta_ptr = mxCreateDoubleMatrix(1, nt, 0) + CALL mxCopyReal8ToPtr(theta, mxGetPr(theta_ptr), nt) + status = engPutVariable(ep, 'theta'C, theta_ptr) + IF (status .ne. 0) THEN + ny = -6 ! ' Can''t read theta in the MatLab file' + RETURN + ENDIF + +C +C Evaluate the MatLab DESIGN Funtion with the input data from FORTRAN +C + buffer = '' + status = engOutputBuffer(ep, buffer1) + IF (engEvalString(ep, 'clear success;'// + & '[C,H,G,A,F,R]='//TRIM(mfile)//'( ny,nz,nx,'// + & 'nu,ns,theta);'//'success=1;') .ne. 0) then + ny = -8 ! engEvalString failed + RETURN + ENDIF + C_ptr = engGetVariable(ep, 'success'C) + IF (C_ptr .eq. 0) then + buffer=buffer1 + ny=-8 ! engEvalString failed + RETURN + ENDIF + +C +C Get the MatLab DESIGN created matrics back to FORTRAN +C + C_ptr = engGetVariable(ep, 'C'C) + IF(C_ptr.NE.0) THEN + CALL mxCopyPtrToReal8(mxGetPr(C_ptr), c, ny*max(1,nz)*ns(1)) + ELSE + ny = -101 + ENDIF + + H_ptr = engGetVariable(ep, 'H'C) + IF(H_ptr.NE.0) THEN + CALL mxCopyPtrToReal8(mxGetPr(H_ptr), H, ny*nx*ns(2)) + ELSE + ny = -102 + ENDIF + + G_ptr = engGetVariable(ep, 'G'C) + IF(G_ptr.NE.0) THEN + CALL mxCopyPtrToReal8(mxGetPr(G_ptr), G, ny*nu*ns(3)) + ELSE + ny = -103 + ENDIF + + A_ptr = engGetVariable(ep, 'A'C) + IF(A_ptr.NE.0) THEN + CALL mxCopyPtrToReal8(mxGetPr(A_ptr), a, nx*ns(4)) + ELSE + ny = -104 + ENDIF + + F_ptr = engGetVariable(ep, 'F'C) + IF(F_ptr.NE.0) THEN + CALL mxCopyPtrToReal8(mxGetPr(F_ptr), F, nx*nx*ns(5)) + ELSE + ny = -105 + ENDIF + + R_ptr = engGetVariable(ep, 'R'C) + IF(R_ptr.NE.0) THEN + CALL mxCopyPtrToReal8(mxGetPr(R_ptr), R, nx*nu*ns(6)) + ELSE + ny = -106 + ENDIF + +C +C Free dynamic memory allocated by MXCREATE function +C + CALL mxDestroyArray(nz_ptr) + CALL mxDestroyArray(nx_ptr) + CALL mxDestroyArray(nu_ptr) + CALL mxDestroyArray(ns_ptr) + CALL mxDestroyArray(theta_ptr) + CALL mxDestroyArray(C_ptr) + CALL mxDestroyArray(H_ptr) + CALL mxDestroyArray(G_ptr) + CALL mxDestroyArray(A_ptr) + CALL mxDestroyArray(F_ptr) + CALL mxDestroyArray(R_ptr) + CALL mxDestroyArray(ny_ptr) + + RETURN + END + +C ----------------------------------------- +C To make dynamic the name of the .m file +C ----------------------------------------- + SUBROUTINE SETFILEM(string1,string2) +!DEC$ ATTRIBUTES DLLEXPORT, ALIAS:'setfilem_' :: SETFILEM + CHARACTER*200 string1,string2,mfile,pathmfile + COMMON /M/ mfile, pathmfile + mfile = string1 + pathmfile = string2 + RETURN + END + +C -------------------- +C To get MatLab errors +C -------------------- + SUBROUTINE GETERRSTR(matlaberror) +!DEC$ ATTRIBUTES DLLEXPORT, ALIAS:'geterrstr_' :: GETERRSTR + CHARACTER*1024 matlaberror + CHARACTER*1024 buffer + COMMON /ERRBUFFER/ buffer + matlaberror = buffer + RETURN + END diff --git a/amh.for b/amh.for index 9877f6fad6b8681d2c16de2173b6e45f4d2d85f7..28583ec960d898611b8ddc2e316a7d3c61ea8eff 100644 --- a/amh.for +++ b/amh.for @@ -1,50 +1,50 @@ -C ------------------------------------------------------------- -C AMH DRAWS THE DISCRETE LATENT VARIABLE IN BLOCKS -C (see Fiorentini, Planas and Rossi, Statistics and Computing, 2014, 24, 77-89) -C Developed by A.Rossi, C.Planas and G.Fiorentini -C Pr[Z(t)|Z(\t),Y] pto Pr[Y^(t+1,T)|Y^t,Z] x Pr[Y(t)|Y^(t-1),Z^t] -C x Pr[Z(t)|Z(\t)] -C -C State-space format: y(t) = c(t)z(t) + H(t)x(t) + G(t)u(t) -C x(t) = a(t) + F(t)x(t-1) + R(t)u(t) -C -C y(t) (ny x 1) ny = # of endogenous series -C z(t) (nz x 1) nz = # of exogenous series -C x(t) (nx x 1) nx = # of continous states -C u(t) (nu x 1) nu = # of shocks -C c(t) (ny x nz x ns1) ns1 = # of states for c(t) -C H(t) (ny x nx x ns2) ns2 = # of states for H(t) -C G(t) (ny x nu x ns3) ns3 = # of states for G(t) -C a(t) (nx x ns4) ns4 = # of states for a(t) -C F(t) (nx x nx x ns5) ns5 = # of states for F(t) -C R(t) (nx x nu x ns6) ns6 = # of states for R(t) -C -C FURTHER INPUT -C nobs: # of observatios -C d(1): order of integration of the system -C d(2): number of non-stationary elements -C nv: # of discrete latent variables (S1,S2,...) -C ns: ns1,ns2,... -C nstot: total # of states (states of S1 x S2 x ...x Snv) -C nt: dimension of theta -C np: dimension of psi -C PMAT: (nstot x nstot) one-step transition probabilities -C PE: ergodic distribution of S1 x S2 x ...x Snv -C INFOS: (9 x 6) set latent variables -C nstot: total # of states i.e. ns1 x ns2 x ...x nsv -C PTR: transition porbabilities -C PM: marginal probabilities -C -C OUTPUT -C Z:(nobs x 1) takes values {1,2,...,nstot} -C ACCRATE: CUMULATES ACCEPTANS 1 IF DRAW IS ACCEPTED 0 Otherwise -C -C Copyright (C) 2010-2014 European Commission -C +C ------------------------------------------------------------- +C AMH DRAWS THE DISCRETE LATENT VARIABLE IN BLOCKS +C (see Fiorentini, Planas and Rossi, Statistics and Computing, 2014, 24, 77-89) +C Developed by A.Rossi, C.Planas and G.Fiorentini +C Pr[Z(t)|Z(\t),Y] pto Pr[Y^(t+1,T)|Y^t,Z] x Pr[Y(t)|Y^(t-1),Z^t] +C x Pr[Z(t)|Z(\t)] +C +C State-space format: y(t) = c(t)z(t) + H(t)x(t) + G(t)u(t) +C x(t) = a(t) + F(t)x(t-1) + R(t)u(t) +C +C y(t) (ny x 1) ny = # of endogenous series +C z(t) (nz x 1) nz = # of exogenous series +C x(t) (nx x 1) nx = # of continous states +C u(t) (nu x 1) nu = # of shocks +C c(t) (ny x nz x ns1) ns1 = # of states for c(t) +C H(t) (ny x nx x ns2) ns2 = # of states for H(t) +C G(t) (ny x nu x ns3) ns3 = # of states for G(t) +C a(t) (nx x ns4) ns4 = # of states for a(t) +C F(t) (nx x nx x ns5) ns5 = # of states for F(t) +C R(t) (nx x nu x ns6) ns6 = # of states for R(t) +C +C FURTHER INPUT +C nobs: # of observatios +C d(1): order of integration of the system +C d(2): number of non-stationary elements +C nv: # of discrete latent variables (S1,S2,...) +C ns: ns1,ns2,... +C nstot: total # of states (states of S1 x S2 x ...x Snv) +C nt: dimension of theta +C np: dimension of psi +C PMAT: (nstot x nstot) one-step transition probabilities +C PE: ergodic distribution of S1 x S2 x ...x Snv +C INFOS: (9 x 6) set latent variables +C nstot: total # of states i.e. ns1 x ns2 x ...x nsv +C PTR: transition porbabilities +C PM: marginal probabilities +C +C OUTPUT +C Z:(nobs x 1) takes values {1,2,...,nstot} +C ACCRATE: CUMULATES ACCEPTANS 1 IF DRAW IS ACCEPTED 0 Otherwise +C +C Copyright (C) 2010-2014 European Commission +C C This file is part of Program DMM C -C DMM is free software developed at the Joint Research Centre of the -C European Commission: you can redistribute it and/or modify it under +C DMM is free software developed at the Joint Research Centre of the +C European Commission: you can redistribute it and/or modify it under C the terms of the GNU General Public License as published by C the Free Software Foundation, either version 3 of the License, or C (at your option) any later version. @@ -55,503 +55,503 @@ C MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the C GNU General Public License for more details. C C You should have received a copy of the GNU General Public License -C along with DMM. If not, see <http://www.gnu.org/licenses/>. -C ------------------------------------------------------------- - SUBROUTINE AMH(HFIX,nobs,d,ny,nz,nx,nu,nv,ns,nstot,nt,np, - 1 yk,IYK,theta,psi,PTR,PM,INFOS,pdll,Z,S,ACCRATE) - - USE dfwin - INTERFACE - SUBROUTINE DESIGN(ny,nz,nx,nu,ns,nt,theta,c,H,G,a,F,R) - INTEGER ny,nz,nx,nu,ns(6),nt - DOUBLE PRECISION theta(nt) - DOUBLE PRECISION c(ny,max(1,nz),ns(1)),H(ny,nx,ns(2)), - 1 G(ny,nu,ns(3)),a(nx,ns(4)),F(nx,nx,ns(5)),R(nx,nu,ns(6)) - END SUBROUTINE - END INTERFACE - POINTER (pdll,fittizia) - POINTER (pdesign,DESIGN) - -C INPUT - INTEGER HFIX,nobs,d(2),ny,nz,nx,nu,nv,ns(6),nstot,nt,np, - 1 IYK(nobs,ny+1),INFOS(9,6) - DOUBLE PRECISION yk(nobs,ny+nz),theta(nt),psi(np), - 1 PTR(nobs,nstot,nstot),PM(nobs,nstot) - -C INPUT/OUTPUT - INTEGER Z(nobs),S(nobs,6),ACCRATE(nobs) - -C LOCALS - INTEGER IT,I,II,J,JJ,K,IFAIL,ISEQ,iny,HFIXL,I0,I1,IACC,IC,IR,id1 - INTEGER Z0(nobs),IS(6),IND(HFIX+2,6),SEQ(nv),dn(2) - DOUBLE PRECISION c(ny,max(nz,1),ns(1)),H(ny,nx,ns(2)), - 1 G(ny,nu,ns(3)),a(nx,ns(4)),F(nx,nx,ns(5)),R(nx,nu,ns(6)) - DOUBLE PRECISION P1(INFOS(8,1),INFOS(8,1)), - 1 P2(INFOS(8,2),INFOS(8,2)),P3(INFOS(8,3),INFOS(8,3)), - 2 P4(INFOS(8,4),INFOS(8,4)),P5(INFOS(8,5),INFOS(8,5)), - 3 P6(INFOS(8,6),INFOS(8,6)),PMAT(nstot,nstot),PE(nstot), - 4 PALL(nstot,nstot,HFIX+1) - DOUBLE PRECISION Xdd(max(d(1),1),nx),Pdd(max(d(1),1),nx,nx) - DOUBLE PRECISION OM(nobs,nx,nx),MU(nobs,nx) - DOUBLE PRECISION HRG(ny,nu),VV(ny,ny),HF(ny,nx),COM(ny+1,ny), - 1 HRGV(nu,ny),B(nx,ny),RR(nx,nx),BH(nx,nx),BHRG(nx,nu),DD(nx,nx), - 2 CS(nx,nx),CC(nx,nx),AA(nx,nx),DI(nx,nx),COM1(nx+1,nx),Ha(ny), - 3 OMC(nx,nx),OMCDIC(nx,nx),AOMCDIC(nx,nx),AOMCDICOM(nx,nx), - 4 VVHF(ny,nx),WORK(3*nx),LAM(nx),PR(nstot), - 5 QN,QO,PA,PN,PO,GN,GO,AUX,delta,v,vd,PS0,PS1,AUX1,AUX0 - DOUBLE PRECISION, ALLOCATABLE:: DLL(:),XT(:,:),PT(:,:,:), - 1 XT0(:,:),PT0(:,:,:),PTR2(:,:,:) - DOUBLE PRECISION EPS,ONE,ZERO - DATA EPS/1.D-14/,ONE/1.0D0/,ZERO/0.0D0/ - DOUBLE PRECISION LEMMA4,MARKOVP,genunf - - dn(1) = 0 - dn(2) = d(2) - id1 = max(1,d(1)) - Z0 = Z - delta = 1.D-3 - pdesign = getprocaddress(pdll, "design_"C) - CALL DESIGN(ny,nz,nx,nu,ns,nt,theta,c,H,G,a,F,R) - CALL DESIGNZ(nv,np,psi,INFOS,P1,P2,P3,P4,P5,P6) -C PALL(i,j) = Pr[Z(t+1)=i|Z(t)=j], Z = S1 x S2 x ... x Snv - CALL PPROD(nv,nstot,INFOS,P1,P2,P3,P4,P5,P6,PMAT) -C ERGODIC solves PE: PE*(I-P') = 0 - CALL ERGODIC(nstot,PMAT,PE) -C KOLMOGOROV EQNS - PALL(:,:,1) = PMAT - DO J = 2,HFIX+1 ! Kolmogorov eqns - DO jj = 1,nstot - DO ii = 1,nstot-1 - PALL(ii,jj,J) = SUM(PALL(ii,:,1)*PALL(:,jj,J-1)) - ENDDO - PALL(nstot,jj,J) = 1.D0-SUM(PALL(1:nstot-1,jj,J)) - ENDDO - ENDDO - -C OMEGA and MU RECURSIONS - OM(:,:,:)= ZERO - MU(:,:) = ZERO - DO 250 IT = nobs-1,1,-1 -C INT2SEQ map from Z(IT+1) to IS = (k1 k2 k3 k4 k5 k6) - CALL INT2SEQ(Z(IT+1),nv,INFOS,SEQ,IS) - iny = IYK(IT+1,ny+1) - - DO 10 I=1,iny - Ha(I) = SUM(H(IYK(IT+1,I),:,IS(2))*a(:,IS(4))) ! H*a (ny x 1) - DO 10 J=1,nu -10 HRG(I,J) = SUM(H(IYK(IT+1,I),:,IS(2))*R(:,J,IS(6))) - + + G(IYK(IT+1,I),J,IS(3)) ! HR+G (ny x nu) - - DO 20 I=1,iny - DO 20 J=1,iny -20 VV(I,J) = SUM(HRG(I,1:nu)*HRG(J,1:nu)) ! (HR+G)*(HR+G)' (ny x ny) - - DO 30 I=1,iny - DO 30 J=1,nx -30 HF(I,J)=SUM(H(IYK(IT+1,I),:,IS(2))*F(:,J,IS(5))) ! HF(ny x nx) - - COM(1:iny,1:iny) = VV(1:iny,1:iny) - IFAIL = -1 -C CALL F01ADF(iny,COM(1:iny+1,1:iny), iny+1, IFAIL) - CALL DPOTRF('L',iny,COM(1:iny,1:iny),iny,IFAIL) ! COM = L*L' - CALL DPOTRI('L',iny,COM(1:iny,1:iny),iny,IFAIL) ! COM = VV^-1 - DO 40 I=1,iny - DO 40 J=1,I - VV(I,J) = COM(I,J) -40 VV(J,I) = VV(I,J) ! inv[(HR+G)*(HR+G)'] (ny x ny) - -C B = R*(H*R+G)'*VV (nx x ny) - DO 50 I=1,nu - DO 50 J=1,iny -50 HRGV(I,J) = SUM(HRG(1:iny,I)*VV(1:iny,J)) ! (H*R+G)'*VV (nu x ny) - - DO 60 I=1,nx - DO 60 J=1,iny -60 B(I,J) = SUM(R(I,1:nu,IS(6))*HRGV(1:nu,J)) ! B (nx x ny) - - DO 70 I=1,nx - DO 70 J=1,nx - RR(I,J) = SUM(R(I,:,IS(6))*R(J,:,IS(6))) ! RR' (nx x nx) -70 BH(I,J) = SUM(B(I,1:iny)*H(IYK(IT+1,1:iny),J,IS(2))) ! BH (nx x nx) - -C FIND CS such that CS*CS' = RR'-B*HRG*R' (nx x nx) - DO 80 I=1,nx - DO 80 J=1,nu -80 BHRG(I,J) = SUM(B(I,1:iny)*HRG(1:iny,J)) - - DO 90 I=1,nx - DO 90 J=1,I -90 CC(I,J) = RR(I,J) - SUM(BHRG(I,1:nu)*R(J,1:nu,IS(6))) - - IFAIL=-1 -C CALL F02FAF('V','L',nx,CC,nx,LAM,WORK,3*nx,IFAIL) - CALL DSYEV( 'V','L',nx,CC,nx,LAM,WORK,3*nx,IFAIL) - DO 100 I=1,nx - IF (LAM(I).LE.EPS) LAM(I)= ZERO -100 CS(:,I) = CC(1:nx,I)*DSQRT(LAM(I)) - -C AA = F - B*HF (nx x nx) - DO 110 I=1,nx - DO 110 J=1,nx -110 AA(I,J) = F(I,J,IS(5)) - SUM(B(I,1:iny)*HF(1:iny,J)) - -C OMC = OM(+1)*CS (nx x nx) - DO 120 I=1,nx - DO 120 J=1,nx -120 OMC(I,J) = SUM(OM(IT+1,I,:)*CS(:,J)) - -C DD = I + CS'*OM(+1)*CS (nx x nx) - DD(:,:) = ZERO - DO 130 I=1,nx - DD(I,I) = ONE - DO 130 J=1,I - DD(I,J) = DD(I,J) + SUM(CS(:,I)*OMC(:,J)) -130 DD(J,I) = DD(I,J) - -C DI = inv(DD) (nx x nx) - COM1(1:nx,:) = DD(:,:) - IFAIL = -1 -C CALL F01ADF(nx,COM1,nx+1,IFAIL) - CALL DPOTRF('L',nx,COM1(1:nx,1:nx),nx,IFAIL) ! COM1 = L*L' - CALL DPOTRI('L',nx,COM1(1:nx,1:nx),nx,IFAIL) ! COM1 = DD^-1 - DO 135 I=1,nx - DO 135 J=1,I - DI(I,J) = COM1(I,J) -135 DI(J,I) = DI(I,J) - -C OMCDIC = I - OM(+1)*CS*DI*CS' (nx x nx) - DO 140 I=1,nx - DO 140 J=1,nx -140 COM1(I,J) = SUM(OMC(I,:)*DI(:,J)) ! OM(+1)*CS*DI (nx x nx) - - OMCDIC(:,:) = ZERO - DO 145 I=1,nx - OMCDIC(I,I) = ONE - DO 145 J=1,nx -145 OMCDIC(I,J) = OMCDIC(I,J)-SUM(COM1(I,:)*CS(J,:)) - -C AOMCDIC = AA'*(I - OM(+1)*CS*DINV CS') (nx x nx) - DO 150 I=1,nx - DO 150 J=1,nx -150 AOMCDIC(I,J) = SUM(AA(:,I)*OMCDIC(:,J)) - -C AOMCDICOM = AA'*(I - OM(+1)*CS*DINV*CS')*OM(+1) (nx x nx) - DO 160 I=1,nx - DO 160 J=1,nx -160 AOMCDICOM(I,J) = SUM(AOMCDIC(I,:)*OM(IT+1,:,J)) - -C VV*H*F (ny x nx) - DO 170 I=1,iny - DO 170 J=1,nx -170 VVHF(I,J) = SUM(VV(I,1:iny)*HF(1:iny,J)) - -C OM = AA*(I - OM(+1)*C*DI*C')*OM(+1)*AA' + -C + F'*H'*VV*H*F - DO 180 I=1,nx - DO 180 J=1,nx -180 OM(IT,I,J) = SUM(AOMCDICOM(I,:)*AA(:,J)) - + + SUM(HF(1:iny,I)*VVHF(1:iny,J)) - -C MU = AA'*(I - OM(+1)*C*DI* C')*MU(+1) + -C - AA'*(I - OM C DINV C')*OM(+1)*LAM -C + F'*H'*VV*(y(+1) - H*a - c*z) -C LAM = a - B*H*a + B*[y(+1)-c*z] (nx x 1) - COM(1:iny,1) = 0.D0 - DO 185 I=1,iny -185 COM(I,1) = SUM(c(IYK(IT+1,I),1:nz,IS(1))*yk(IT+1,ny+1:ny+nz)) - - DO 190 I=1,nx -190 LAM(I) = a(I,IS(4)) - SUM(BH(I,1:nx)*a(1:nx,IS(4))) - + + SUM(B(I,1:iny)*(yk(IT+1,IYK(IT+1,1:iny)) - + - COM(1:iny,1))) - DO 200 I=1,nx -200 MU(IT,I) = SUM(AOMCDIC(I,:)*MU(IT+1,:)) - + - SUM(AOMCDICOM(I,:)*LAM(:)) - + + SUM(VVHF(1:iny,I)*(yk(IT+1,IYK(IT+1,1:iny)) - # - Ha(1:iny)-COM(1:iny,1))) - -250 CONTINUE - - ALLOCATE (XT(0:HFIX,nx),PT(0:HFIX,nx,nx),XT0(0:HFIX,nx), - 1 PT0(0:HFIX,nx,nx),PTR2(HFIX+1,nstot,nstot),DLL(HFIX)) - -C First block - I0 = 1 - I1 = HFIX - GN = 1.D0 - GO = 1.D0 - QN = 1.D0 - QO = 1.D0 -C vd = G05CAF(vd) ! For qn(z) = delta*g0(z) + (1-delta)*gn(z) - vd = genunf(0.D0,1.D0) ! For qn(z) = delta*g0(z) + (1-delta)*gn(z) - DO 300 IT = I1,I0,-1 - PR(:) = PTR(IT+1,Z(IT+1),:)*PM(IT,:)/PM(IT+1,Z(IT+1)) ! P[Z(j)|Z(j+1)] - IF (vd.GT.delta) THEN ! sample from gn(x) -C v = G05CAF(v) - v = genunf(0.D0,1.D0) - AUX = PR(1) - ISEQ = 1 - DO 290 WHILE (AUX.LT.v) - ISEQ = ISEQ + 1 -290 AUX = AUX + PR(ISEQ) - ELSE -C v = G05CAF(v) - v = genunf(0.D0,1.D0) - AUX = PM(IT,1) - ISEQ = 1 - DO 291 WHILE (AUX.LT.v) - ISEQ = ISEQ+1 -291 AUX = AUX + PM(IT,ISEQ) - ENDIF - Z(IT) = ISEQ - GN = GN*PM(IT,ISEQ) - GO = GO*PM(IT,Z0(IT)) - QN = QN*PR(ISEQ) -300 QO = QO*PTR(IT+1,Z0(IT+1),Z0(IT))*PM(IT,Z0(IT))/PM(IT+1,Z0(IT+1)) ! P[Z0(j)|Z0(j+1)] - - QN = delta*GN + (1.D0-delta)*QN - QO = delta*GO + (1.D0-delta)*QO - - IF (SUM(ABS(Z(I0:I1)-Z0(I0:I1))).NE.0) THEN - IND(1,1) = 0 - IND(2:HFIX+2,1) = Z0(1:HFIX+1) - PS0 = MARKOVP(PALL,PE,nstot,HFIX,1,nobs,IND(1:HFIX+2,1)) - IND(2:HFIX+2,1) = Z(1:HFIX+1) - PS1 = MARKOVP(PALL,PE,nstot,HFIX,1,nobs,IND(1:HFIX+2,1)) - - DO 305 I = 1,max(d(1),HFIX) -305 CALL INT2SEQ(Z(I),nv,INFOS,SEQ,IND(I,:)) - - CALL IKF(d,ny,nz,nx,nu,ns,IND(1:id1,:),yk(1:id1,:), - 1 IYK(1:id1,:),c,H,G,a,F,R,Xdd,Pdd,DLL(1:d(1))) - XT(d(1),1:nx) = Xdd(id1,1:nx) - PT(d(1),1:nx,1:nx) = Pdd(id1,1:nx,1:nx) - CALL KF(HFIX,d,ny,nz,nx,nu,ns,IND(1:HFIX,:),yk(1:HFIX,:), - 1 IYK(1:HFIX,:),c,H,G,a,F,R,XT,PT,DLL(1:HFIX)) - AUX1=LEMMA4(OM(HFIX,:,:),MU(HFIX,:),XT(HFIX,:),PT(HFIX,:,:),nx) - PN = AUX1 + SUM(DLL(1:HFIX)) + PS1 ! prior x likelihood - - DO 306 I = 1,max(d(1),HFIX) -306 CALL INT2SEQ(Z0(I),nv,INFOS,SEQ,IND(I,:)) - - CALL IKF(d,ny,nz,nx,nu,ns,IND(1:id1,:),yk(1:id1,:), - 1 IYK(1:id1,:),c,H,G,a,F,R,Xdd,Pdd,DLL(1:d(1))) - XT0(d(1),1:nx) = Xdd(id1,1:nx) - PT0(d(1),1:nx,1:nx) = Pdd(id1,1:nx,1:nx) - CALL KF(HFIX,d,ny,nz,nx,nu,ns,IND(1:HFIX,:),yk(1:HFIX,:), - 1 IYK(1:HFIX,:),c,H,G,a,F,R,XT0,PT0,DLL(1:HFIX)) - AUX0=LEMMA4(OM(HFIX,:,:),MU(HFIX,:),XT0(HFIX,:),PT0(HFIX,:,:),nx) - PO = AUX0 + SUM(DLL(1:HFIX)) + PS0 ! prior x likelihood - -c PA = DEXP(PN-PO)*QO/QN - PA = MAX(MIN(PN-PO+DLOG(QO)-DLOG(QN),0.D0),-300.D0) - PA = DEXP(PA) - ELSE - DO 307 I = 1,max(d(1),HFIX) -307 CALL INT2SEQ(Z(I),nv,INFOS,SEQ,IND(I,:)) - - CALL IKF(d,ny,nz,nx,nu,ns,IND(1:id1,:),yk(1:id1,:), - 1 IYK(1:id1,:),c,H,G,a,F,R,Xdd,Pdd,DLL(1:d(1))) - XT(d(1),1:nx) = Xdd(id1,1:nx) - PT(d(1),1:nx,1:nx) = Pdd(id1,1:nx,1:nx) - CALL KF(HFIX,d,ny,nz,nx,nu,ns,IND(1:HFIX,:),yk(1:HFIX,:), - 1 IYK(1:HFIX,:),c,H,G,a,F,R,XT,PT,DLL(1:HFIX)) - XT0(HFIX,:) = XT(HFIX,:) - PT0(HFIX,:,:)= PT(HFIX,:,:) - PA = 1.D0 - ENDIF -C v = G05CAF(v) - v = genunf(0.D0,1.D0) - IF (v.GT.PA) THEN - IACC = 0 - Z(1:HFIX) = Z0(1:HFIX) - ACCRATE(1:HFIX) = ACCRATE(1:HFIX) + 1 - ELSE - Z0(1:HFIX) = Z(1:HFIX) - IACC = 1 - ENDIF - -C Inner blocks - DO 400 WHILE (I1.LT.(nobs-HFIX)) - I1 = I1 + HFIX - I0 = I1 - HFIX + 1 - GN = 1.D0 - GO = 1.D0 - QN = 1.D0 - QO = 1.D0 -C vd = G05CAF(vd) ! For qn(z) = delta*g0(z) + (1-delta)*gn(z) - vd = genunf(0.D0,1.D0) - PTR2(1,:,:) = PTR(I0,:,:) ! q[Z(t+1)|Z(t)] - DO 310 J = 2,HFIX+1 ! q[Z(t+j)|Z(t)] j = 2,...,HFIX+1 - DO 310 IC = 1,nstot - DO 310 IR = 1,nstot -310 PTR2(J,IR,IC) = SUM(PTR(I0+J-1,IR,:)*PTR2(J-1,:,IC)) - DO 350 IT = I1,I0,-1 ! t+h,t+h-1,...,t+j,...,t+1 - K = IT - I0 + 1 ! h,h-1,...,1 - PR(:) = PTR(IT+1,Z(IT+1),:)*PTR2(K,:,Z(I0-1)) - # / PTR2(K+1,Z(IT+1),Z(I0-1)) - IF (vd.GT.delta) THEN ! sample from gn(x) -C v = G05CAF(v) - v = genunf(0.D0,1.D0) - AUX = PR(1) - ISEQ = 1 - DO 320 WHILE (AUX.LT.v) - ISEQ = ISEQ+1 -320 AUX = AUX + PR(ISEQ) - ELSE -C v = G05CAF(v) - v = genunf(0.D0,1.D0) - AUX = PM(IT,1) - ISEQ = 1 - DO 322 WHILE (AUX.LT.v) - ISEQ = ISEQ+1 -322 AUX = AUX + PM(IT,ISEQ) - ENDIF - Z(IT) = ISEQ - GN = GN*PM(IT,ISEQ) - GO = GO*PM(IT,Z0(IT)) - QN = QN*PR(ISEQ) -350 QO = QO*PTR(IT+1,Z0(IT+1),Z0(IT))*PTR2(K,Z0(IT),Z0(I0-1)) - # / PTR2(K+1,Z0(IT+1),Z0(I0-1)) ! P[Z0(j)|Z0(j+1)] - - QN = delta*GN + (1.D0-delta)*QN - QO = delta*GO + (1.D0-delta)*QO - - IF (SUM(ABS(Z(I0:I1)-Z0(I0:I1))).NE.0) THEN - IND(1:HFIX+2,1) = Z0(I0-1:I1+1) - PS0 = MARKOVP(PALL,PE,nstot,HFIX,2,nobs,IND(1:HFIX+2,1)) - IND(1:HFIX+2,1) = Z(I0-1:I1+1) - PS1 = MARKOVP(PALL,PE,nstot,HFIX,2,nobs,IND(1:HFIX+2,1)) - - XT(0,:) = IACC*XT(HFIX,:) + (1-IACC)*XT0(HFIX,:) ! Xt|t - PT(0,:,:) = IACC*PT(HFIX,:,:)+ (1-IACC)*PT0(HFIX,:,:) ! Pt|t - XT0(0,:) = XT(0,:) - PT0(0,:,:)= PT(0,:,:) - - DO 360 I = I0,I1 -360 CALL INT2SEQ(Z(I),nv,INFOS,SEQ,IND(I-I0+1,:)) - CALL KF(HFIX,dn,ny,nz,nx,nu,ns,IND(1:HFIX,:),yk(I0:I1,:), - 1 IYK(I0:I1,:),c,H,G,a,F,R,XT,PT,DLL(1:HFIX)) - AUX1=LEMMA4(OM(I1,:,:),MU(I1,:),XT(HFIX,:),PT(HFIX,:,:),nx) - PN = AUX1 + SUM(DLL(1:HFIX)) + PS1 ! prior x likelihood - - DO 361 I = I0,I1 -361 CALL INT2SEQ(Z0(I),nv,INFOS,SEQ,IND(I-I0+1,:)) - - CALL KF(HFIX,dn,ny,nz,nx,nu,ns,IND(1:HFIX,:),yk(I0:I1,:), - 1 IYK(I0:I1,:),c,H,G,a,F,R,XT0,PT0,DLL(1:HFIX)) - AUX0=LEMMA4(OM(I1,:,:),MU(I1,:),XT0(HFIX,:),PT0(HFIX,:,:),nx) - PO = AUX0 + SUM(DLL(1:HFIX)) + PS0 ! prior x likelihood -C PA = DEXP(PN-PO)*QO/QN - PA = MAX(MIN(PN-PO+DLOG(QO)-DLOG(QN),0.D0),-300.D0) - PA = DEXP(PA) - ELSE - XT(0,:) = IACC*XT(HFIX,:) + (1-IACC)*XT0(HFIX,:) ! Xt|t - PT(0,:,:) = IACC*PT(HFIX,:,:)+ (1-IACC)*PT0(HFIX,:,:) ! Pt|t - - DO 362 I = I0,I1 -362 CALL INT2SEQ(Z(I),nv,INFOS,SEQ,IND(I-I0+1,:)) - - CALL KF(HFIX,dn,ny,nz,nx,nu,ns,IND(1:HFIX,:),yk(I0:I1,:), - 1 IYK(I0:I1,:),c,H,G,a,F,R,XT,PT,DLL(1:HFIX)) - XT0(HFIX,:) = XT(HFIX,:) - PT0(HFIX,:,:)= PT(HFIX,:,:) - PA = 1.D0 - ENDIF -C v = G05CAF(v) - v = genunf(0.D0,1.D0) - IF (v.GT.PA) THEN - Z(I0:I1) = Z0(I0:I1) - ACCRATE(I0:I1) = ACCRATE(I0:I1) + 1 - IACC = 0 - ELSE - Z0(I0:I1) = Z(I0:I1) - IACC = 1 - ENDIF -400 CONTINUE - -C Last block - I0 = I1+1 - I1 = nobs - HFIXL = I1 - I0 + 1 - QN = 1.D0 - QO = 1.D0 -C vd = G05CAF(vd) ! For qn(z) = delta*g0(z) + (1-delta)*gn(z) - vd = genunf(0.D0,1.D0) - DO 500 IT = HFIXL,1,-1 - IF (vd.GT.delta) THEN ! sample from gn(x) -C v = G05CAF(v) - v = genunf(0.D0,1.D0) - AUX = PTR(nobs-IT+1,1,Z(nobs-IT)) !nobs-9: nobs - ISEQ = 1 - DO 450 WHILE (AUX.LT.v) - ISEQ = ISEQ+1 -450 AUX = AUX + PTR(nobs-IT+1,ISEQ,Z(nobs-IT)) - ELSE -C v = G05CAF(v) - v = genunf(0.D0,1.D0) - AUX = PM(nobs-IT+1,1) - ISEQ = 1 - DO 451 WHILE (AUX.LT.v) - ISEQ = ISEQ+1 -451 AUX = AUX + PM(nobs-IT+1,ISEQ) - ENDIF - Z(nobs-IT+1) = ISEQ - GN = GN*PM(nobs-IT+1,ISEQ) - GO = GO*PM(nobs-IT+1,Z0(nobs-IT+1)) - QN = QN*PTR(nobs-IT+1,ISEQ,Z(nobs-IT)) -500 QO = QO*PTR(nobs-IT+1,Z0(nobs-IT+1),Z0(nobs-IT)) - - QN = delta*GN + (1.D0-delta)*QN - QO = delta*GO + (1.D0-delta)*QO - - IF (SUM(ABS(Z(I0:I1)-Z0(I0:I1))).NE.0) THEN - IND(HFIXL+2,1) = 0 - IND(1:HFIXL+1,1) = Z0(I0-1:nobs) - PS0 = MARKOVP(PALL,PE,nstot,HFIXL,nobs,nobs,IND(1:HFIXL+2,1)) - IND(1:HFIXL+1,1) = Z(I0-1:nobs) - PS1 = MARKOVP(PALL,PE,nstot,HFIXL,nobs,nobs,IND(1:HFIXL+2,1)) - - XT(0,:) = IACC*XT(HFIXL,:) + (1-IACC)*XT0(HFIXL,:) ! Xt|t - PT(0,:,:) = IACC*PT(HFIXL,:,:)+ (1-IACC)*PT0(HFIXL,:,:) ! Pt|t - XT0(0,:) = XT(0,:) - PT0(0,:,:)= PT(0,:,:) - - DO 510 I = I0,I1 -510 CALL INT2SEQ(Z(I),nv,INFOS,SEQ,IND(I-I0+1,:)) - - CALL KF(HFIXL,dn,ny,nz,nx,nu,ns,IND(1:HFIXL,:),yk(I0:I1,:), - 1 IYK(I0:I1,:),c,H,G,a,F,R,XT,PT,DLL(1:HFIXL)) - - PN = SUM(DLL(1:HFIXL)) + PS1 ! prior x likelihood - - DO 520 I = I0,I1 -520 CALL INT2SEQ(Z0(I),nv,INFOS,SEQ,IND(I-I0+1,:)) - - CALL KF(HFIXL,dn,ny,nz,nx,nu,ns,IND(1:HFIXL,:),yk(I0:I1,:), - 1 IYK(I0:I1,:),c,H,G,a,F,R,XT0,PT0,DLL(1:HFIXL)) - - PO = SUM(DLL(1:HFIXL)) + PS0 ! prior x likelihood -C PA = DEXP(PN-PO)*QO/QN - PA = MAX(MIN(PN-PO+DLOG(QO)-DLOG(QN),0.D0),-300.D0) - PA = DEXP(PA) - ELSE - PA = 1.D0 - ENDIF -C v = G05CAF(v) - v = genunf(0.D0,1.D0) - IF (v.GT.PA) THEN - Z(I0:I1) = Z0(I0:I1) - ACCRATE(I0:I1) = ACCRATE(I0:I1) + 1 - ELSE - Z0(I0:I1) = Z(I0:I1) - ENDIF - - DO I=1,nobs - CALL INT2SEQ(Z(I),nv,INFOS,SEQ,S(I,:)) - ENDDO - - DEALLOCATE (XT,PT,XT0,PT0,PTR2,DLL) - - RETURN +C along with DMM. If not, see <http://www.gnu.org/licenses/>. +C ------------------------------------------------------------- + SUBROUTINE AMH(HFIX,nobs,d,ny,nz,nx,nu,nv,ns,nstot,nt,np, + 1 yk,IYK,theta,psi,PTR,PM,INFOS,pdll,Z,S,ACCRATE) + + USE dfwin + INTERFACE + SUBROUTINE DESIGN(ny,nz,nx,nu,ns,nt,theta,c,H,G,a,F,R) + INTEGER ny,nz,nx,nu,ns(6),nt + DOUBLE PRECISION theta(nt) + DOUBLE PRECISION c(ny,max(1,nz),ns(1)),H(ny,nx,ns(2)), + 1 G(ny,nu,ns(3)),a(nx,ns(4)),F(nx,nx,ns(5)),R(nx,nu,ns(6)) + END SUBROUTINE + END INTERFACE + POINTER (pdll,fittizia) + POINTER (pdesign,DESIGN) + +C INPUT + INTEGER HFIX,nobs,d(2),ny,nz,nx,nu,nv,ns(6),nstot,nt,np, + 1 IYK(nobs,ny+1),INFOS(9,6) + DOUBLE PRECISION yk(nobs,ny+nz),theta(nt),psi(np), + 1 PTR(nobs,nstot,nstot),PM(nobs,nstot) + +C INPUT/OUTPUT + INTEGER Z(nobs),S(nobs,6),ACCRATE(nobs) + +C LOCALS + INTEGER IT,I,II,J,JJ,K,IFAIL,ISEQ,iny,HFIXL,I0,I1,IACC,IC,IR,id1 + INTEGER Z0(nobs),IS(6),IND(HFIX+2,6),SEQ(nv),dn(2) + DOUBLE PRECISION c(ny,max(nz,1),ns(1)),H(ny,nx,ns(2)), + 1 G(ny,nu,ns(3)),a(nx,ns(4)),F(nx,nx,ns(5)),R(nx,nu,ns(6)) + DOUBLE PRECISION P1(INFOS(8,1),INFOS(8,1)), + 1 P2(INFOS(8,2),INFOS(8,2)),P3(INFOS(8,3),INFOS(8,3)), + 2 P4(INFOS(8,4),INFOS(8,4)),P5(INFOS(8,5),INFOS(8,5)), + 3 P6(INFOS(8,6),INFOS(8,6)),PMAT(nstot,nstot),PE(nstot), + 4 PALL(nstot,nstot,HFIX+1) + DOUBLE PRECISION Xdd(max(d(1),1),nx),Pdd(max(d(1),1),nx,nx) + DOUBLE PRECISION OM(nobs,nx,nx),MU(nobs,nx) + DOUBLE PRECISION HRG(ny,nu),VV(ny,ny),HF(ny,nx),COM(ny+1,ny), + 1 HRGV(nu,ny),B(nx,ny),RR(nx,nx),BH(nx,nx),BHRG(nx,nu),DD(nx,nx), + 2 CS(nx,nx),CC(nx,nx),AA(nx,nx),DI(nx,nx),COM1(nx+1,nx),Ha(ny), + 3 OMC(nx,nx),OMCDIC(nx,nx),AOMCDIC(nx,nx),AOMCDICOM(nx,nx), + 4 VVHF(ny,nx),WORK(3*nx),LAM(nx),PR(nstot), + 5 QN,QO,PA,PN,PO,GN,GO,AUX,delta,v,vd,PS0,PS1,AUX1,AUX0 + DOUBLE PRECISION, ALLOCATABLE:: DLL(:),XT(:,:),PT(:,:,:), + 1 XT0(:,:),PT0(:,:,:),PTR2(:,:,:) + DOUBLE PRECISION EPS,ONE,ZERO + DATA EPS/1.D-14/,ONE/1.0D0/,ZERO/0.0D0/ + DOUBLE PRECISION LEMMA4,MARKOVP,genunf + + dn(1) = 0 + dn(2) = d(2) + id1 = max(1,d(1)) + Z0 = Z + delta = 1.D-3 + pdesign = getprocaddress(pdll, "design_"C) + CALL DESIGN(ny,nz,nx,nu,ns,nt,theta,c,H,G,a,F,R) + CALL DESIGNZ(nv,np,psi,INFOS,P1,P2,P3,P4,P5,P6) +C PALL(i,j) = Pr[Z(t+1)=i|Z(t)=j], Z = S1 x S2 x ... x Snv + CALL PPROD(nv,nstot,INFOS,P1,P2,P3,P4,P5,P6,PMAT) +C ERGODIC solves PE: PE*(I-P') = 0 + CALL ERGODIC(nstot,PMAT,PE) +C KOLMOGOROV EQNS + PALL(:,:,1) = PMAT + DO J = 2,HFIX+1 ! Kolmogorov eqns + DO jj = 1,nstot + DO ii = 1,nstot-1 + PALL(ii,jj,J) = SUM(PALL(ii,:,1)*PALL(:,jj,J-1)) + ENDDO + PALL(nstot,jj,J) = 1.D0-SUM(PALL(1:nstot-1,jj,J)) + ENDDO + ENDDO + +C OMEGA and MU RECURSIONS + OM(:,:,:)= ZERO + MU(:,:) = ZERO + DO 250 IT = nobs-1,1,-1 +C INT2SEQ map from Z(IT+1) to IS = (k1 k2 k3 k4 k5 k6) + CALL INT2SEQ(Z(IT+1),nv,INFOS,SEQ,IS) + iny = IYK(IT+1,ny+1) + + DO 10 I=1,iny + Ha(I) = SUM(H(IYK(IT+1,I),:,IS(2))*a(:,IS(4))) ! H*a (ny x 1) + DO 10 J=1,nu +10 HRG(I,J) = SUM(H(IYK(IT+1,I),:,IS(2))*R(:,J,IS(6))) + + + G(IYK(IT+1,I),J,IS(3)) ! HR+G (ny x nu) + + DO 20 I=1,iny + DO 20 J=1,iny +20 VV(I,J) = SUM(HRG(I,1:nu)*HRG(J,1:nu)) ! (HR+G)*(HR+G)' (ny x ny) + + DO 30 I=1,iny + DO 30 J=1,nx +30 HF(I,J)=SUM(H(IYK(IT+1,I),:,IS(2))*F(:,J,IS(5))) ! HF(ny x nx) + + COM(1:iny,1:iny) = VV(1:iny,1:iny) + IFAIL = -1 +C CALL F01ADF(iny,COM(1:iny+1,1:iny), iny+1, IFAIL) + CALL DPOTRF('L',iny,COM(1:iny,1:iny),iny,IFAIL) ! COM = L*L' + CALL DPOTRI('L',iny,COM(1:iny,1:iny),iny,IFAIL) ! COM = VV^-1 + DO 40 I=1,iny + DO 40 J=1,I + VV(I,J) = COM(I,J) +40 VV(J,I) = VV(I,J) ! inv[(HR+G)*(HR+G)'] (ny x ny) + +C B = R*(H*R+G)'*VV (nx x ny) + DO 50 I=1,nu + DO 50 J=1,iny +50 HRGV(I,J) = SUM(HRG(1:iny,I)*VV(1:iny,J)) ! (H*R+G)'*VV (nu x ny) + + DO 60 I=1,nx + DO 60 J=1,iny +60 B(I,J) = SUM(R(I,1:nu,IS(6))*HRGV(1:nu,J)) ! B (nx x ny) + + DO 70 I=1,nx + DO 70 J=1,nx + RR(I,J) = SUM(R(I,:,IS(6))*R(J,:,IS(6))) ! RR' (nx x nx) +70 BH(I,J) = SUM(B(I,1:iny)*H(IYK(IT+1,1:iny),J,IS(2))) ! BH (nx x nx) + +C FIND CS such that CS*CS' = RR'-B*HRG*R' (nx x nx) + DO 80 I=1,nx + DO 80 J=1,nu +80 BHRG(I,J) = SUM(B(I,1:iny)*HRG(1:iny,J)) + + DO 90 I=1,nx + DO 90 J=1,I +90 CC(I,J) = RR(I,J) - SUM(BHRG(I,1:nu)*R(J,1:nu,IS(6))) + + IFAIL=-1 +C CALL F02FAF('V','L',nx,CC,nx,LAM,WORK,3*nx,IFAIL) + CALL DSYEV( 'V','L',nx,CC,nx,LAM,WORK,3*nx,IFAIL) + DO 100 I=1,nx + IF (LAM(I).LE.EPS) LAM(I)= ZERO +100 CS(:,I) = CC(1:nx,I)*DSQRT(LAM(I)) + +C AA = F - B*HF (nx x nx) + DO 110 I=1,nx + DO 110 J=1,nx +110 AA(I,J) = F(I,J,IS(5)) - SUM(B(I,1:iny)*HF(1:iny,J)) + +C OMC = OM(+1)*CS (nx x nx) + DO 120 I=1,nx + DO 120 J=1,nx +120 OMC(I,J) = SUM(OM(IT+1,I,:)*CS(:,J)) + +C DD = I + CS'*OM(+1)*CS (nx x nx) + DD(:,:) = ZERO + DO 130 I=1,nx + DD(I,I) = ONE + DO 130 J=1,I + DD(I,J) = DD(I,J) + SUM(CS(:,I)*OMC(:,J)) +130 DD(J,I) = DD(I,J) + +C DI = inv(DD) (nx x nx) + COM1(1:nx,:) = DD(:,:) + IFAIL = -1 +C CALL F01ADF(nx,COM1,nx+1,IFAIL) + CALL DPOTRF('L',nx,COM1(1:nx,1:nx),nx,IFAIL) ! COM1 = L*L' + CALL DPOTRI('L',nx,COM1(1:nx,1:nx),nx,IFAIL) ! COM1 = DD^-1 + DO 135 I=1,nx + DO 135 J=1,I + DI(I,J) = COM1(I,J) +135 DI(J,I) = DI(I,J) + +C OMCDIC = I - OM(+1)*CS*DI*CS' (nx x nx) + DO 140 I=1,nx + DO 140 J=1,nx +140 COM1(I,J) = SUM(OMC(I,:)*DI(:,J)) ! OM(+1)*CS*DI (nx x nx) + + OMCDIC(:,:) = ZERO + DO 145 I=1,nx + OMCDIC(I,I) = ONE + DO 145 J=1,nx +145 OMCDIC(I,J) = OMCDIC(I,J)-SUM(COM1(I,:)*CS(J,:)) + +C AOMCDIC = AA'*(I - OM(+1)*CS*DINV CS') (nx x nx) + DO 150 I=1,nx + DO 150 J=1,nx +150 AOMCDIC(I,J) = SUM(AA(:,I)*OMCDIC(:,J)) + +C AOMCDICOM = AA'*(I - OM(+1)*CS*DINV*CS')*OM(+1) (nx x nx) + DO 160 I=1,nx + DO 160 J=1,nx +160 AOMCDICOM(I,J) = SUM(AOMCDIC(I,:)*OM(IT+1,:,J)) + +C VV*H*F (ny x nx) + DO 170 I=1,iny + DO 170 J=1,nx +170 VVHF(I,J) = SUM(VV(I,1:iny)*HF(1:iny,J)) + +C OM = AA*(I - OM(+1)*C*DI*C')*OM(+1)*AA' + +C + F'*H'*VV*H*F + DO 180 I=1,nx + DO 180 J=1,nx +180 OM(IT,I,J) = SUM(AOMCDICOM(I,:)*AA(:,J)) + + + SUM(HF(1:iny,I)*VVHF(1:iny,J)) + +C MU = AA'*(I - OM(+1)*C*DI* C')*MU(+1) + +C - AA'*(I - OM C DINV C')*OM(+1)*LAM +C + F'*H'*VV*(y(+1) - H*a - c*z) +C LAM = a - B*H*a + B*[y(+1)-c*z] (nx x 1) + COM(1:iny,1) = 0.D0 + DO 185 I=1,iny +185 COM(I,1) = SUM(c(IYK(IT+1,I),1:nz,IS(1))*yk(IT+1,ny+1:ny+nz)) + + DO 190 I=1,nx +190 LAM(I) = a(I,IS(4)) - SUM(BH(I,1:nx)*a(1:nx,IS(4))) + + + SUM(B(I,1:iny)*(yk(IT+1,IYK(IT+1,1:iny)) + + - COM(1:iny,1))) + DO 200 I=1,nx +200 MU(IT,I) = SUM(AOMCDIC(I,:)*MU(IT+1,:)) + + - SUM(AOMCDICOM(I,:)*LAM(:)) + + + SUM(VVHF(1:iny,I)*(yk(IT+1,IYK(IT+1,1:iny)) + # - Ha(1:iny)-COM(1:iny,1))) + +250 CONTINUE + + ALLOCATE (XT(0:HFIX,nx),PT(0:HFIX,nx,nx),XT0(0:HFIX,nx), + 1 PT0(0:HFIX,nx,nx),PTR2(HFIX+1,nstot,nstot),DLL(HFIX)) + +C First block + I0 = 1 + I1 = HFIX + GN = 1.D0 + GO = 1.D0 + QN = 1.D0 + QO = 1.D0 +C vd = G05CAF(vd) ! For qn(z) = delta*g0(z) + (1-delta)*gn(z) + vd = genunf(0.D0,1.D0) ! For qn(z) = delta*g0(z) + (1-delta)*gn(z) + DO 300 IT = I1,I0,-1 + PR(:) = PTR(IT+1,Z(IT+1),:)*PM(IT,:)/PM(IT+1,Z(IT+1)) ! P[Z(j)|Z(j+1)] + IF (vd.GT.delta) THEN ! sample from gn(x) +C v = G05CAF(v) + v = genunf(0.D0,1.D0) + AUX = PR(1) + ISEQ = 1 + DO 290 WHILE (AUX.LT.v) + ISEQ = ISEQ + 1 +290 AUX = AUX + PR(ISEQ) + ELSE +C v = G05CAF(v) + v = genunf(0.D0,1.D0) + AUX = PM(IT,1) + ISEQ = 1 + DO 291 WHILE (AUX.LT.v) + ISEQ = ISEQ+1 +291 AUX = AUX + PM(IT,ISEQ) + ENDIF + Z(IT) = ISEQ + GN = GN*PM(IT,ISEQ) + GO = GO*PM(IT,Z0(IT)) + QN = QN*PR(ISEQ) +300 QO = QO*PTR(IT+1,Z0(IT+1),Z0(IT))*PM(IT,Z0(IT))/PM(IT+1,Z0(IT+1)) ! P[Z0(j)|Z0(j+1)] + + QN = delta*GN + (1.D0-delta)*QN + QO = delta*GO + (1.D0-delta)*QO + + IF (SUM(ABS(Z(I0:I1)-Z0(I0:I1))).NE.0) THEN + IND(1,1) = 0 + IND(2:HFIX+2,1) = Z0(1:HFIX+1) + PS0 = MARKOVP(PALL,PE,nstot,HFIX,1,nobs,IND(1:HFIX+2,1)) + IND(2:HFIX+2,1) = Z(1:HFIX+1) + PS1 = MARKOVP(PALL,PE,nstot,HFIX,1,nobs,IND(1:HFIX+2,1)) + + DO 305 I = 1,max(d(1),HFIX) +305 CALL INT2SEQ(Z(I),nv,INFOS,SEQ,IND(I,:)) + + CALL IKF(d,ny,nz,nx,nu,ns,IND(1:id1,:),yk(1:id1,:), + 1 IYK(1:id1,:),c,H,G,a,F,R,Xdd,Pdd,DLL(1:d(1))) + XT(d(1),1:nx) = Xdd(id1,1:nx) + PT(d(1),1:nx,1:nx) = Pdd(id1,1:nx,1:nx) + CALL KF(HFIX,d,ny,nz,nx,nu,ns,IND(1:HFIX,:),yk(1:HFIX,:), + 1 IYK(1:HFIX,:),c,H,G,a,F,R,XT,PT,DLL(1:HFIX)) + AUX1=LEMMA4(OM(HFIX,:,:),MU(HFIX,:),XT(HFIX,:),PT(HFIX,:,:),nx) + PN = AUX1 + SUM(DLL(1:HFIX)) + PS1 ! prior x likelihood + + DO 306 I = 1,max(d(1),HFIX) +306 CALL INT2SEQ(Z0(I),nv,INFOS,SEQ,IND(I,:)) + + CALL IKF(d,ny,nz,nx,nu,ns,IND(1:id1,:),yk(1:id1,:), + 1 IYK(1:id1,:),c,H,G,a,F,R,Xdd,Pdd,DLL(1:d(1))) + XT0(d(1),1:nx) = Xdd(id1,1:nx) + PT0(d(1),1:nx,1:nx) = Pdd(id1,1:nx,1:nx) + CALL KF(HFIX,d,ny,nz,nx,nu,ns,IND(1:HFIX,:),yk(1:HFIX,:), + 1 IYK(1:HFIX,:),c,H,G,a,F,R,XT0,PT0,DLL(1:HFIX)) + AUX0=LEMMA4(OM(HFIX,:,:),MU(HFIX,:),XT0(HFIX,:),PT0(HFIX,:,:),nx) + PO = AUX0 + SUM(DLL(1:HFIX)) + PS0 ! prior x likelihood + +c PA = DEXP(PN-PO)*QO/QN + PA = MAX(MIN(PN-PO+DLOG(QO)-DLOG(QN),0.D0),-300.D0) + PA = DEXP(PA) + ELSE + DO 307 I = 1,max(d(1),HFIX) +307 CALL INT2SEQ(Z(I),nv,INFOS,SEQ,IND(I,:)) + + CALL IKF(d,ny,nz,nx,nu,ns,IND(1:id1,:),yk(1:id1,:), + 1 IYK(1:id1,:),c,H,G,a,F,R,Xdd,Pdd,DLL(1:d(1))) + XT(d(1),1:nx) = Xdd(id1,1:nx) + PT(d(1),1:nx,1:nx) = Pdd(id1,1:nx,1:nx) + CALL KF(HFIX,d,ny,nz,nx,nu,ns,IND(1:HFIX,:),yk(1:HFIX,:), + 1 IYK(1:HFIX,:),c,H,G,a,F,R,XT,PT,DLL(1:HFIX)) + XT0(HFIX,:) = XT(HFIX,:) + PT0(HFIX,:,:)= PT(HFIX,:,:) + PA = 1.D0 + ENDIF +C v = G05CAF(v) + v = genunf(0.D0,1.D0) + IF (v.GT.PA) THEN + IACC = 0 + Z(1:HFIX) = Z0(1:HFIX) + ACCRATE(1:HFIX) = ACCRATE(1:HFIX) + 1 + ELSE + Z0(1:HFIX) = Z(1:HFIX) + IACC = 1 + ENDIF + +C Inner blocks + DO 400 WHILE (I1.LT.(nobs-HFIX)) + I1 = I1 + HFIX + I0 = I1 - HFIX + 1 + GN = 1.D0 + GO = 1.D0 + QN = 1.D0 + QO = 1.D0 +C vd = G05CAF(vd) ! For qn(z) = delta*g0(z) + (1-delta)*gn(z) + vd = genunf(0.D0,1.D0) + PTR2(1,:,:) = PTR(I0,:,:) ! q[Z(t+1)|Z(t)] + DO 310 J = 2,HFIX+1 ! q[Z(t+j)|Z(t)] j = 2,...,HFIX+1 + DO 310 IC = 1,nstot + DO 310 IR = 1,nstot +310 PTR2(J,IR,IC) = SUM(PTR(I0+J-1,IR,:)*PTR2(J-1,:,IC)) + DO 350 IT = I1,I0,-1 ! t+h,t+h-1,...,t+j,...,t+1 + K = IT - I0 + 1 ! h,h-1,...,1 + PR(:) = PTR(IT+1,Z(IT+1),:)*PTR2(K,:,Z(I0-1)) + # / PTR2(K+1,Z(IT+1),Z(I0-1)) + IF (vd.GT.delta) THEN ! sample from gn(x) +C v = G05CAF(v) + v = genunf(0.D0,1.D0) + AUX = PR(1) + ISEQ = 1 + DO 320 WHILE (AUX.LT.v) + ISEQ = ISEQ+1 +320 AUX = AUX + PR(ISEQ) + ELSE +C v = G05CAF(v) + v = genunf(0.D0,1.D0) + AUX = PM(IT,1) + ISEQ = 1 + DO 322 WHILE (AUX.LT.v) + ISEQ = ISEQ+1 +322 AUX = AUX + PM(IT,ISEQ) + ENDIF + Z(IT) = ISEQ + GN = GN*PM(IT,ISEQ) + GO = GO*PM(IT,Z0(IT)) + QN = QN*PR(ISEQ) +350 QO = QO*PTR(IT+1,Z0(IT+1),Z0(IT))*PTR2(K,Z0(IT),Z0(I0-1)) + # / PTR2(K+1,Z0(IT+1),Z0(I0-1)) ! P[Z0(j)|Z0(j+1)] + + QN = delta*GN + (1.D0-delta)*QN + QO = delta*GO + (1.D0-delta)*QO + + IF (SUM(ABS(Z(I0:I1)-Z0(I0:I1))).NE.0) THEN + IND(1:HFIX+2,1) = Z0(I0-1:I1+1) + PS0 = MARKOVP(PALL,PE,nstot,HFIX,2,nobs,IND(1:HFIX+2,1)) + IND(1:HFIX+2,1) = Z(I0-1:I1+1) + PS1 = MARKOVP(PALL,PE,nstot,HFIX,2,nobs,IND(1:HFIX+2,1)) + + XT(0,:) = IACC*XT(HFIX,:) + (1-IACC)*XT0(HFIX,:) ! Xt|t + PT(0,:,:) = IACC*PT(HFIX,:,:)+ (1-IACC)*PT0(HFIX,:,:) ! Pt|t + XT0(0,:) = XT(0,:) + PT0(0,:,:)= PT(0,:,:) + + DO 360 I = I0,I1 +360 CALL INT2SEQ(Z(I),nv,INFOS,SEQ,IND(I-I0+1,:)) + CALL KF(HFIX,dn,ny,nz,nx,nu,ns,IND(1:HFIX,:),yk(I0:I1,:), + 1 IYK(I0:I1,:),c,H,G,a,F,R,XT,PT,DLL(1:HFIX)) + AUX1=LEMMA4(OM(I1,:,:),MU(I1,:),XT(HFIX,:),PT(HFIX,:,:),nx) + PN = AUX1 + SUM(DLL(1:HFIX)) + PS1 ! prior x likelihood + + DO 361 I = I0,I1 +361 CALL INT2SEQ(Z0(I),nv,INFOS,SEQ,IND(I-I0+1,:)) + + CALL KF(HFIX,dn,ny,nz,nx,nu,ns,IND(1:HFIX,:),yk(I0:I1,:), + 1 IYK(I0:I1,:),c,H,G,a,F,R,XT0,PT0,DLL(1:HFIX)) + AUX0=LEMMA4(OM(I1,:,:),MU(I1,:),XT0(HFIX,:),PT0(HFIX,:,:),nx) + PO = AUX0 + SUM(DLL(1:HFIX)) + PS0 ! prior x likelihood +C PA = DEXP(PN-PO)*QO/QN + PA = MAX(MIN(PN-PO+DLOG(QO)-DLOG(QN),0.D0),-300.D0) + PA = DEXP(PA) + ELSE + XT(0,:) = IACC*XT(HFIX,:) + (1-IACC)*XT0(HFIX,:) ! Xt|t + PT(0,:,:) = IACC*PT(HFIX,:,:)+ (1-IACC)*PT0(HFIX,:,:) ! Pt|t + + DO 362 I = I0,I1 +362 CALL INT2SEQ(Z(I),nv,INFOS,SEQ,IND(I-I0+1,:)) + + CALL KF(HFIX,dn,ny,nz,nx,nu,ns,IND(1:HFIX,:),yk(I0:I1,:), + 1 IYK(I0:I1,:),c,H,G,a,F,R,XT,PT,DLL(1:HFIX)) + XT0(HFIX,:) = XT(HFIX,:) + PT0(HFIX,:,:)= PT(HFIX,:,:) + PA = 1.D0 + ENDIF +C v = G05CAF(v) + v = genunf(0.D0,1.D0) + IF (v.GT.PA) THEN + Z(I0:I1) = Z0(I0:I1) + ACCRATE(I0:I1) = ACCRATE(I0:I1) + 1 + IACC = 0 + ELSE + Z0(I0:I1) = Z(I0:I1) + IACC = 1 + ENDIF +400 CONTINUE + +C Last block + I0 = I1+1 + I1 = nobs + HFIXL = I1 - I0 + 1 + QN = 1.D0 + QO = 1.D0 +C vd = G05CAF(vd) ! For qn(z) = delta*g0(z) + (1-delta)*gn(z) + vd = genunf(0.D0,1.D0) + DO 500 IT = HFIXL,1,-1 + IF (vd.GT.delta) THEN ! sample from gn(x) +C v = G05CAF(v) + v = genunf(0.D0,1.D0) + AUX = PTR(nobs-IT+1,1,Z(nobs-IT)) !nobs-9: nobs + ISEQ = 1 + DO 450 WHILE (AUX.LT.v) + ISEQ = ISEQ+1 +450 AUX = AUX + PTR(nobs-IT+1,ISEQ,Z(nobs-IT)) + ELSE +C v = G05CAF(v) + v = genunf(0.D0,1.D0) + AUX = PM(nobs-IT+1,1) + ISEQ = 1 + DO 451 WHILE (AUX.LT.v) + ISEQ = ISEQ+1 +451 AUX = AUX + PM(nobs-IT+1,ISEQ) + ENDIF + Z(nobs-IT+1) = ISEQ + GN = GN*PM(nobs-IT+1,ISEQ) + GO = GO*PM(nobs-IT+1,Z0(nobs-IT+1)) + QN = QN*PTR(nobs-IT+1,ISEQ,Z(nobs-IT)) +500 QO = QO*PTR(nobs-IT+1,Z0(nobs-IT+1),Z0(nobs-IT)) + + QN = delta*GN + (1.D0-delta)*QN + QO = delta*GO + (1.D0-delta)*QO + + IF (SUM(ABS(Z(I0:I1)-Z0(I0:I1))).NE.0) THEN + IND(HFIXL+2,1) = 0 + IND(1:HFIXL+1,1) = Z0(I0-1:nobs) + PS0 = MARKOVP(PALL,PE,nstot,HFIXL,nobs,nobs,IND(1:HFIXL+2,1)) + IND(1:HFIXL+1,1) = Z(I0-1:nobs) + PS1 = MARKOVP(PALL,PE,nstot,HFIXL,nobs,nobs,IND(1:HFIXL+2,1)) + + XT(0,:) = IACC*XT(HFIXL,:) + (1-IACC)*XT0(HFIXL,:) ! Xt|t + PT(0,:,:) = IACC*PT(HFIXL,:,:)+ (1-IACC)*PT0(HFIXL,:,:) ! Pt|t + XT0(0,:) = XT(0,:) + PT0(0,:,:)= PT(0,:,:) + + DO 510 I = I0,I1 +510 CALL INT2SEQ(Z(I),nv,INFOS,SEQ,IND(I-I0+1,:)) + + CALL KF(HFIXL,dn,ny,nz,nx,nu,ns,IND(1:HFIXL,:),yk(I0:I1,:), + 1 IYK(I0:I1,:),c,H,G,a,F,R,XT,PT,DLL(1:HFIXL)) + + PN = SUM(DLL(1:HFIXL)) + PS1 ! prior x likelihood + + DO 520 I = I0,I1 +520 CALL INT2SEQ(Z0(I),nv,INFOS,SEQ,IND(I-I0+1,:)) + + CALL KF(HFIXL,dn,ny,nz,nx,nu,ns,IND(1:HFIXL,:),yk(I0:I1,:), + 1 IYK(I0:I1,:),c,H,G,a,F,R,XT0,PT0,DLL(1:HFIXL)) + + PO = SUM(DLL(1:HFIXL)) + PS0 ! prior x likelihood +C PA = DEXP(PN-PO)*QO/QN + PA = MAX(MIN(PN-PO+DLOG(QO)-DLOG(QN),0.D0),-300.D0) + PA = DEXP(PA) + ELSE + PA = 1.D0 + ENDIF +C v = G05CAF(v) + v = genunf(0.D0,1.D0) + IF (v.GT.PA) THEN + Z(I0:I1) = Z0(I0:I1) + ACCRATE(I0:I1) = ACCRATE(I0:I1) + 1 + ELSE + Z0(I0:I1) = Z(I0:I1) + ENDIF + + DO I=1,nobs + CALL INT2SEQ(Z(I),nv,INFOS,SEQ,S(I,:)) + ENDDO + + DEALLOCATE (XT,PT,XT0,PT0,PTR2,DLL) + + RETURN END diff --git a/amh2.for b/amh2.for index 09d2fa174f379f7a9c5214e551b7edd184584ab7..1779a0cc704f766be46bbfaa10d25b9d548aefed 100644 --- a/amh2.for +++ b/amh2.for @@ -1,50 +1,50 @@ -C ------------------------------------------------------------- -C AMH2 DRAWS THE DISCRETE LATENT VARIABLE IN BLOCKS (no missing values) -C (see Fiorentini, Planas and Rossi, Statistics and Computing, 2014, 24, 77-89) -C Developed by A.Rossi, C.Planas and G.Fiorentini -C Pr[Z(t)|Z(\t),Y] pto Pr[Y^(t+1,T)|Y^t,Z] x Pr[Y(t)|Y^(t-1),Z^t] -C x Pr[Z(t)|Z(\t)] -C -C State-space format: y(t) = c(t)z(t) + H(t)x(t) + G(t)u(t) -C x(t) = a(t) + F(t)x(t-1) + R(t)u(t) -C -C y(t) (ny x 1) ny = # of endogenous series -C z(t) (nz x 1) nz = # of exogenous series -C x(t) (nx x 1) nx = # of continous states -C u(t) (nu x 1) nu = # of shocks -C c(t) (ny x nz x ns1) ns1 = # of states for c(t) -C H(t) (ny x nx x ns2) ns2 = # of states for H(t) -C G(t) (ny x nu x ns3) ns3 = # of states for G(t) -C a(t) (nx x ns4) ns4 = # of states for a(t) -C F(t) (nx x nx x ns5) ns5 = # of states for F(t) -C R(t) (nx x nu x ns6) ns6 = # of states for R(t) -C -C FURTHER INPUT -C nobs: # of observatios -C d(1): order of integration of the system -C d(2): number of non-stationary elements -C nv: # of discrete latent variables (S1,S2,...) -C ns: ns1,ns2,... -C nstot: total # of states (states of S1 x S2 x ...x Snv) -C nt: dimension of theta -C np: dimension of psi -C PMAT: (nstot x nstot) one-step transition probabilities -C PE: ergodic distribution of S1 x S2 x ...x Snv -C INFOS: (9 x 6) set latent variables -C nstot: total # of states i.e. ns1 x ns2 x ...x nsv -C PTR: transition porbabilities -C PM: marginal probabilities -C -C OUTPUT -C Z:(nobs x 1) takes values {1,2,...,nstot} -C ACCRATE: CUMULATES ACCEPTANS 1 IF DRAW IS ACCEPTED 0 Otherwise -C -C Copyright (C) 2010-2014 European Commission -C +C ------------------------------------------------------------- +C AMH2 DRAWS THE DISCRETE LATENT VARIABLE IN BLOCKS (no missing values) +C (see Fiorentini, Planas and Rossi, Statistics and Computing, 2014, 24, 77-89) +C Developed by A.Rossi, C.Planas and G.Fiorentini +C Pr[Z(t)|Z(\t),Y] pto Pr[Y^(t+1,T)|Y^t,Z] x Pr[Y(t)|Y^(t-1),Z^t] +C x Pr[Z(t)|Z(\t)] +C +C State-space format: y(t) = c(t)z(t) + H(t)x(t) + G(t)u(t) +C x(t) = a(t) + F(t)x(t-1) + R(t)u(t) +C +C y(t) (ny x 1) ny = # of endogenous series +C z(t) (nz x 1) nz = # of exogenous series +C x(t) (nx x 1) nx = # of continous states +C u(t) (nu x 1) nu = # of shocks +C c(t) (ny x nz x ns1) ns1 = # of states for c(t) +C H(t) (ny x nx x ns2) ns2 = # of states for H(t) +C G(t) (ny x nu x ns3) ns3 = # of states for G(t) +C a(t) (nx x ns4) ns4 = # of states for a(t) +C F(t) (nx x nx x ns5) ns5 = # of states for F(t) +C R(t) (nx x nu x ns6) ns6 = # of states for R(t) +C +C FURTHER INPUT +C nobs: # of observatios +C d(1): order of integration of the system +C d(2): number of non-stationary elements +C nv: # of discrete latent variables (S1,S2,...) +C ns: ns1,ns2,... +C nstot: total # of states (states of S1 x S2 x ...x Snv) +C nt: dimension of theta +C np: dimension of psi +C PMAT: (nstot x nstot) one-step transition probabilities +C PE: ergodic distribution of S1 x S2 x ...x Snv +C INFOS: (9 x 6) set latent variables +C nstot: total # of states i.e. ns1 x ns2 x ...x nsv +C PTR: transition porbabilities +C PM: marginal probabilities +C +C OUTPUT +C Z:(nobs x 1) takes values {1,2,...,nstot} +C ACCRATE: CUMULATES ACCEPTANS 1 IF DRAW IS ACCEPTED 0 Otherwise +C +C Copyright (C) 2010-2014 European Commission +C C This file is part of Program DMM C -C DMM is free software developed at the Joint Research Centre of the -C European Commission: you can redistribute it and/or modify it under +C DMM is free software developed at the Joint Research Centre of the +C European Commission: you can redistribute it and/or modify it under C the terms of the GNU General Public License as published by C the Free Software Foundation, either version 3 of the License, or C (at your option) any later version. @@ -55,512 +55,512 @@ C MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the C GNU General Public License for more details. C C You should have received a copy of the GNU General Public License -C along with DMM. If not, see <http://www.gnu.org/licenses/>. -C ------------------------------------------------------------- - SUBROUTINE AMH2(HFIX,nobs,d,ny,nz,nx,nu,nv,ns,nstot,nt,np,yk, - 1 theta,psi,PTR,PM,INFOS,pdll,Z,S,ACCRATE) - - USE dfwin - INTERFACE - SUBROUTINE DESIGN(ny,nz,nx,nu,ns,nt,theta,c,H,G,a,F,R) - INTEGER ny,nz,nx,nu,ns(6),nt - DOUBLE PRECISION theta(nt) - DOUBLE PRECISION c(ny,max(1,nz),ns(1)),H(ny,nx,ns(2)), - 1 G(ny,nu,ns(3)),a(nx,ns(4)),F(nx,nx,ns(5)),R(nx,nu,ns(6)) - END SUBROUTINE - END INTERFACE - POINTER (pdll,fittizia) ! ASSOCIATE pointer P alla DLL ad una varibile fittizia - POINTER (pdesign,DESIGN) ! IMPORTANT associo il puntatore pdesign alla Interface definita - -C INPUT - INTEGER HFIX,nobs,d(2),ny,nz,nx,nu,nv,ns(6),nstot,nt,np, - 1 INFOS(9,6) - DOUBLE PRECISION yk(nobs,ny+nz),theta(nt),psi(np), - 1 PTR(nobs,nstot,nstot),PM(nobs,nstot) - -C INPUT/OUTPUT - INTEGER Z(nobs),S(nobs,6),ACCRATE(nobs) - -C LOCALS - INTEGER IT,I,II,J,JJ,K,IFAIL,ISEQ,HFIXL,I0,I1,IACC,IC,IR,id1 - INTEGER Z0(nobs),IS(6),IND(HFIX+2,6),SEQ(nv),dn(2) - DOUBLE PRECISION c(ny,max(nz,1),ns(1)),H(ny,nx,ns(2)), - 1 G(ny,nu,ns(3)),a(nx,ns(4)),F(nx,nx,ns(5)),R(nx,nu,ns(6)) - DOUBLE PRECISION P1(INFOS(8,1),INFOS(8,1)), - 1 P2(INFOS(8,2),INFOS(8,2)),P3(INFOS(8,3),INFOS(8,3)), - 2 P4(INFOS(8,4),INFOS(8,4)),P5(INFOS(8,5),INFOS(8,5)), - 3 P6(INFOS(8,6),INFOS(8,6)),PMAT(nstot,nstot),PE(nstot), - 4 PALL(nstot,nstot,HFIX+1) - DOUBLE PRECISION Xdd(max(d(1),1),nx),Pdd(max(d(1),1),nx,nx) - DOUBLE PRECISION OM(nobs,nx,nx),MU(nobs,nx) - DOUBLE PRECISION HRG(ny,nu),VV(ny,ny),HF(ny,nx),COM(ny+1,ny), - 1 HRGV(nu,ny),B(nx,ny),RR(nx,nx),BH(nx,nx),BHRG(nx,nu),DD(nx,nx), - 2 CS(nx,nx),CC(nx,nx),AA(nx,nx),DI(nx,nx),COM1(nx+1,nx),Ha(ny), - 3 OMC(nx,nx),OMCDIC(nx,nx),AOMCDIC(nx,nx),AOMCDICOM(nx,nx), - 4 VVHF(ny,nx),WORK(3*nx),LAM(nx),PR(nstot), - 5 QN,QO,PA,PN,PO,GN,GO,AUX,delta,v,vd,PS0,PS1,AUX1,AUX0 - DOUBLE PRECISION, ALLOCATABLE:: DLL(:),XT(:,:),PT(:,:,:), - 1 XT0(:,:),PT0(:,:,:),PTR2(:,:,:) - DOUBLE PRECISION EPS,ONE,ZERO - DATA EPS/1.D-14/,ONE/1.0D0/,ZERO/0.0D0/ - DOUBLE PRECISION LEMMA4,MARKOVP,genunf - - dn(1) = 0 - dn(2) = d(2) - id1 = max(d(1),1) - Z0 = Z - delta = 1.D-3 - pdesign = getprocaddress(pdll, "design_"C) - CALL DESIGN(ny,nz,nx,nu,ns,nt,theta,c,H,G,a,F,R) - CALL DESIGNZ(nv,np,psi,INFOS,P1,P2,P3,P4,P5,P6) -C PMAT(i,j) = Pr[Z(t+1)=i|Z(t)=j], Z = S1 x S2 x ... x Snv - CALL PPROD(nv,nstot,INFOS,P1,P2,P3,P4,P5,P6,PMAT) -C ERGODIC solves PE: PE*(I-P') = 0 - CALL ERGODIC(nstot,PMAT,PE) - -C KOLMOGOROV EQNS - PALL(:,:,1) = PMAT - DO J = 2,HFIX+1 ! Kolmogorov eqns - DO jj = 1,nstot - DO ii = 1,nstot-1 - PALL(ii,jj,J) = SUM(PALL(ii,:,1)*PALL(:,jj,J-1)) - ENDDO - PALL(nstot,jj,J) = 1.D0-SUM(PALL(1:nstot-1,jj,J)) - ENDDO - ENDDO - -C OMEGA and MU RECURSIONS - OM(:,:,:)= ZERO - MU(:,:) = ZERO - DO 250 IT = nobs-1,1,-1 -C INT2SEQ map from Z(IT+1) to IS = (k1 k2 k3 k4 k5 k6) - CALL INT2SEQ(Z(IT+1),nv,INFOS,SEQ,IS) - - DO 10 I=1,ny - Ha(I) = SUM(H(I,:,IS(2))*a(:,IS(4))) ! H*a (ny x 1) - DO 10 J=1,nu -10 HRG(I,J) = SUM(H(I,:,IS(2))*R(:,J,IS(6))) - + + G(I,J,IS(3)) ! HR+G (ny x nu) - - DO 20 I=1,ny - VV(I,I) = SUM(HRG(I,1:nu)*HRG(I,1:nu)) - DO 20 J=1,I-1 - VV(I,J) = SUM(HRG(I,1:nu)*HRG(J,1:nu)) ! (HR+G)*(HR+G)' (ny x ny) -20 VV(J,I) = VV(I,J) - - DO 30 I=1,ny - DO 30 J=1,nx -30 HF(I,J)=SUM(H(I,:,IS(2))*F(:,J,IS(5))) ! HF(ny x nx) - - COM(1:ny,1:ny) = VV(1:ny,1:ny) - IFAIL = -1 -C CALL F01ADF(ny,COM(1:ny+1,1:ny), ny+1, IFAIL) - CALL DPOTRF('L',ny,COM(1:ny,1:ny),ny,IFAIL) ! COM = L*L' - CALL DPOTRI('L',ny,COM(1:ny,1:ny),ny,IFAIL) ! COM = VV^-1 - DO 40 I=1,ny - DO 40 J=1,I - VV(I,J) = COM(I,J) -40 VV(J,I) = VV(I,J) ! inv[(HR+G)*(HR+G)'] (ny x ny) - -C B = R*(H*R+G)'*VV (nx x ny) - DO 50 I=1,nu - DO 50 J=1,ny -50 HRGV(I,J) = SUM(HRG(1:ny,I)*VV(1:ny,J)) ! (H*R+G)'*VV (nu x ny) - - DO 60 I=1,nx - DO 60 J=1,ny -60 B(I,J) = SUM(R(I,1:nu,IS(6))*HRGV(1:nu,J)) ! B (nx x ny) - - DO 70 I=1,nx - DO 70 J=1,nx -70 BH(I,J) = SUM(B(I,1:ny)*H(1:ny,J,IS(2))) ! BH (nx x nx) - - DO 75 I=1,nx - RR(I,I) = SUM(R(I,:,IS(6))*R(I,:,IS(6))) - DO 75 J=1,I-1 - RR(I,J) = SUM(R(I,:,IS(6))*R(J,:,IS(6))) ! RR' (nx x nx) -75 RR(J,I) = RR(I,J) - -C FIND CS such that CS*CS' = RR'-B*HRG*R' (nx x nx) - DO 80 I=1,nx - DO 80 J=1,nu -80 BHRG(I,J) = SUM(B(I,1:ny)*HRG(1:ny,J)) - - DO 90 I=1,nx - DO 90 J=1,I -90 CC(I,J) = RR(I,J) - SUM(BHRG(I,1:nu)*R(J,1:nu,IS(6))) - - IFAIL=-1 -C CALL F02FAF('V','L',nx,CC,nx,LAM,WORK,3*nx,IFAIL) - CALL DSYEV( 'V','L',nx,CC,nx,LAM,WORK,3*nx,IFAIL) - DO 100 I=1,nx - IF (LAM(I).LE.EPS) LAM(I)= ZERO -100 CS(:,I) = CC(1:nx,I)*DSQRT(LAM(I)) - -C AA = F - B*HF (nx x nx) - DO 110 I=1,nx - DO 110 J=1,nx -110 AA(I,J) = F(I,J,IS(5)) - SUM(B(I,1:ny)*HF(1:ny,J)) - -C OMC = OM(+1)*CS (nx x nx) - DO 120 I=1,nx - DO 120 J=1,nx -120 OMC(I,J) = SUM(OM(IT+1,I,:)*CS(:,J)) - -C DD = I + CS'*OM(+1)*CS (nx x nx) - DD(:,:) = ZERO - DO 130 I=1,nx - DD(I,I) = ONE - DO 130 J=1,I - DD(I,J) = DD(I,J) + SUM(CS(:,I)*OMC(:,J)) -130 DD(J,I) = DD(I,J) - -C DI = inv(DD) (nx x nx) - COM1(1:nx,:) = DD(:,:) - IFAIL = -1 -C CALL F01ADF(nx,COM1,nx+1,IFAIL) - CALL DPOTRF('L',nx,COM1(1:nx,1:nx),nx,IFAIL) ! COM1 = L*L' - CALL DPOTRI('L',nx,COM1(1:nx,1:nx),nx,IFAIL) ! COM1 = DD^-1 - DO 135 I=1,nx - DO 135 J=1,I - DI(I,J) = COM1(I,j) -135 DI(J,I) = DI(I,J) - -C OMCDIC = I - OM(+1)*CS*DI*CS' (nx x nx) - DO 140 I=1,nx - DO 140 J=1,nx -140 COM1(I,J) = SUM(OMC(I,:)*DI(:,J)) ! OM(+1)*CS*DI (nx x nx) - - OMCDIC(:,:) = ZERO - DO 145 I=1,nx - OMCDIC(I,I) = ONE - DO 145 J=1,nx -145 OMCDIC(I,J) = OMCDIC(I,J)-SUM(COM1(I,:)*CS(J,:)) - -C AOMCDIC = AA'*(I - OM(+1)*CS*DINV CS') (nx x nx) - DO 150 I=1,nx - DO 150 J=1,nx -150 AOMCDIC(I,J) = SUM(AA(:,I)*OMCDIC(:,J)) - -C AOMCDICOM = AA'*(I - OM(+1)*CS*DINV*CS')*OM(+1) (nx x nx) - DO 160 I=1,nx - DO 160 J=1,nx -160 AOMCDICOM(I,J) = SUM(AOMCDIC(I,:)*OM(IT+1,:,J)) - -C VV*H*F (ny x nx) - DO 170 I=1,ny - DO 170 J=1,nx -170 VVHF(I,J) = SUM(VV(I,1:ny)*HF(1:ny,J)) - -C OM = AA*(I - OM(+1)*C*DI*C')*OM(+1)*AA' + -C + F'*H'*VV*H*F - DO 180 I=1,nx - OM(IT,I,I) = SUM(AOMCDICOM(I,:)*AA(:,I)) - + + SUM(HF(1:ny,I)*VVHF(1:ny,I)) - DO 180 J=1,I-1 - OM(IT,I,J) = SUM(AOMCDICOM(I,:)*AA(:,J)) - + + SUM(HF(1:ny,I)*VVHF(1:ny,J)) -180 OM(IT,J,I) = OM(IT,I,J) - -C MU = AA'*(I - OM(+1)*C*DI* C')*MU(+1) + -C - AA'*(I - OM C DINV C')*OM(+1)*LAM -C + F'*H'*VV*(y(+1) - H*a - c*z) -C LAM = a - B*H*a + B*[y(+1)-c*z] (nx x 1) - COM(1:ny,1) = 0.D0 - DO 185 I=1,ny -185 COM(I,1) = SUM(c(I,1:nz,IS(1))*yk(IT+1,ny+1:ny+nz)) - - DO 190 I=1,nx -190 LAM(I) = a(I,IS(4)) - SUM(BH(I,1:nx)*a(1:nx,IS(4))) - + + SUM(B(I,1:ny)*(yk(IT+1,1:ny) - + - COM(1:ny,1))) - DO 200 I=1,nx -200 MU(IT,I) = SUM(AOMCDIC(I,:)*MU(IT+1,:)) - + - SUM(AOMCDICOM(I,:)*LAM(:)) - + + SUM(VVHF(1:ny,I)*(yk(IT+1,1:ny) - # - Ha(1:ny)-COM(1:ny,1))) -250 CONTINUE - - ALLOCATE (XT(0:HFIX,nx),PT(0:HFIX,nx,nx),XT0(0:HFIX,nx), - 1 PT0(0:HFIX,nx,nx),PTR2(HFIX+1,nstot,nstot),DLL(HFIX)) - -C First block - I0 = 1 - I1 = HFIX - GN = 1.D0 - GO = 1.D0 - QN = 1.D0 - QO = 1.D0 -C vd = G05CAF(vd) ! For qn(z) = delta*g0(z) + (1-delta)*gn(z) - vd = genunf(0.D0,1.D0) - DO 300 IT = I1,I0,-1 - PR(:) = PTR(IT+1,Z(IT+1),:)*PM(IT,:)/PM(IT+1,Z(IT+1)) ! P[Z(j)|Z(j+1)] - IF (vd.GT.delta) THEN ! sample from gn(x) -C v = G05CAF(v) - v = genunf(0.D0,1.D0) - AUX = PR(1) - ISEQ = 1 - DO 290 WHILE (AUX.LT.v) - ISEQ = ISEQ + 1 -290 AUX = AUX + PR(ISEQ) - ELSE -C v = G05CAF(v) - v = genunf(0.D0,1.D0) - AUX = PM(IT,1) - ISEQ = 1 - DO 291 WHILE (AUX.LT.v) - ISEQ = ISEQ+1 -291 AUX = AUX + PM(IT,ISEQ) - ENDIF - Z(IT) = ISEQ - GN = GN*PM(IT,ISEQ) - GO = GO*PM(IT,Z0(IT)) - QN = QN*PR(ISEQ) -300 QO = QO*PTR(IT+1,Z0(IT+1),Z0(IT))*PM(IT,Z0(IT))/PM(IT+1,Z0(IT+1)) ! P[Z0(j)|Z0(j+1)] - - QN = delta*GN + (1.D0-delta)*QN - QO = delta*GO + (1.D0-delta)*QO - - IF (SUM(ABS(Z(I0:I1)-Z0(I0:I1))).NE.0) THEN - IND(1,1) = 0 - IND(2:HFIX+2,1) = Z0(1:HFIX+1) - PS0 = MARKOVP(PALL,PE,nstot,HFIX,1,nobs,IND(1:HFIX+2,1)) - IND(2:HFIX+2,1) = Z(1:HFIX+1) - PS1 = MARKOVP(PALL,PE,nstot,HFIX,1,nobs,IND(1:HFIX+2,1)) - - DO 305 I = 1,max(d(1),HFIX) -305 CALL INT2SEQ(Z(I),nv,INFOS,SEQ,IND(I,:)) - - CALL IKF2(d,ny,nz,nx,nu,ns,IND(1:id1,:),yk(1:id1,:), - 1 c,H,G,a,F,R,Xdd,Pdd,DLL(1:id1)) - XT(d(1),1:nx) = Xdd(id1,1:nx) - PT(d(1),1:nx,1:nx) = Pdd(id1,1:nx,1:nx) - CALL KF2(HFIX,d,ny,nz,nx,nu,ns,IND(1:HFIX,:),yk(1:HFIX,:), - 1 c,H,G,a,F,R,XT,PT,DLL(1:HFIX)) - AUX1=LEMMA4(OM(HFIX,:,:),MU(HFIX,:),XT(HFIX,:),PT(HFIX,:,:),nx) - PN = AUX1 + SUM(DLL(1:HFIX)) + PS1 ! prior x likelihood - - DO 306 I = 1,max(d(1),HFIX) -306 CALL INT2SEQ(Z0(I),nv,INFOS,SEQ,IND(I,:)) - - CALL IKF2(d,ny,nz,nx,nu,ns,IND(1:id1,:),yk(1:id1,:), - 1 c,H,G,a,F,R,Xdd,Pdd,DLL(1:id1)) - XT0(d(1),1:nx) = Xdd(id1,1:nx) - PT0(d(1),1:nx,1:nx) = Pdd(id1,1:nx,1:nx) - CALL KF2(HFIX,d,ny,nz,nx,nu,ns,IND(1:HFIX,:),yk(1:HFIX,:), - 1 c,H,G,a,F,R,XT0,PT0,DLL(1:HFIX)) - AUX0=LEMMA4(OM(HFIX,:,:),MU(HFIX,:),XT0(HFIX,:),PT0(HFIX,:,:),nx) - PO = AUX0 + SUM(DLL(1:HFIX)) + PS0 ! prior x likelihood - -c PA = DEXP(PN-PO)*QO/QN - PA = MAX(MIN(PN-PO+DLOG(QO)-DLOG(QN),0.D0),-300.D0) - PA = DEXP(PA) - ELSE - DO 307 I = 1,max(d(1),HFIX) -307 CALL INT2SEQ(Z(I),nv,INFOS,SEQ,IND(I,:)) - - CALL IKF2(d,ny,nz,nx,nu,ns,IND(1:id1,:),yk(1:id1,:), - 1 c,H,G,a,F,R,Xdd,Pdd,DLL(1:id1)) - XT(d(1),1:nx) = Xdd(id1,1:nx) - PT(d(1),1:nx,1:nx) = Pdd(id1,1:nx,1:nx) - CALL KF2(HFIX,d,ny,nz,nx,nu,ns,IND(1:HFIX,:),yk(1:HFIX,:), - 1 c,H,G,a,F,R,XT,PT,DLL(1:HFIX)) - XT0(HFIX,:) = XT(HFIX,:) - PT0(HFIX,:,:)= PT(HFIX,:,:) - PA = 1.D0 - ENDIF -C v = G05CAF(v) - v = genunf(0.D0,1.D0) - IF (v.GT.PA) THEN - IACC = 0 - Z(1:HFIX) = Z0(1:HFIX) - ACCRATE(1:HFIX) = ACCRATE(1:HFIX) + 1 - ELSE - Z0(1:HFIX) = Z(1:HFIX) - IACC = 1 - ENDIF - -C Inner blocks - DO 400 WHILE (I1.LT.(nobs-HFIX)) - I1 = I1 + HFIX - I0 = I1 - HFIX + 1 - GN = 1.D0 - GO = 1.D0 - QN = 1.D0 - QO = 1.D0 -C vd = G05CAF(vd) ! For qn(z) = delta*g0(z) + (1-delta)*gn(z) - vd = genunf(0.D0,1.D0) - PTR2(1,:,:) = PTR(I0,:,:) ! q[Z(t+1)|Z(t)] - DO 310 J = 2,HFIX+1 ! q[Z(t+j)|Z(t)] j = 2,...,HFIX+1 - DO 310 IC = 1,nstot - DO 310 IR = 1,nstot -310 PTR2(J,IR,IC) = SUM(PTR(I0+J-1,IR,:)*PTR2(J-1,:,IC)) - DO 350 IT = I1,I0,-1 ! t+h,t+h-1,...,t+j,...,t+1 - K = IT - I0 + 1 ! h,h-1,...,1 - PR(:) = PTR(IT+1,Z(IT+1),:)*PTR2(K,:,Z(I0-1)) - # / PTR2(K+1,Z(IT+1),Z(I0-1)) - IF (vd.GT.delta) THEN ! sample from gn(x) -C v = G05CAF(v) - v = genunf(0.D0,1.D0) - AUX = PR(1) - ISEQ = 1 - DO 320 WHILE (AUX.LT.v) - ISEQ = ISEQ+1 -320 AUX = AUX + PR(ISEQ) - ELSE -C v = G05CAF(v) - v = genunf(0.D0,1.D0) - AUX = PM(IT,1) - ISEQ = 1 - DO 322 WHILE (AUX.LT.v) - ISEQ = ISEQ+1 -322 AUX = AUX + PM(IT,ISEQ) - ENDIF - Z(IT) = ISEQ - GN = GN*PM(IT,ISEQ) - GO = GO*PM(IT,Z0(IT)) - QN = QN*PR(ISEQ) -350 QO = QO*PTR(IT+1,Z0(IT+1),Z0(IT))*PTR2(K,Z0(IT),Z0(I0-1)) - # / PTR2(K+1,Z0(IT+1),Z0(I0-1)) ! P[Z0(j)|Z0(j+1)] - - QN = delta*GN + (1.D0-delta)*QN - QO = delta*GO + (1.D0-delta)*QO - - IF (SUM(ABS(Z(I0:I1)-Z0(I0:I1))).NE.0) THEN - IND(1:HFIX+2,1) = Z0(I0-1:I1+1) - PS0 = MARKOVP(PALL,PE,nstot,HFIX,2,nobs,IND(1:HFIX+2,1)) - IND(1:HFIX+2,1) = Z(I0-1:I1+1) - PS1 = MARKOVP(PALL,PE,nstot,HFIX,2,nobs,IND(1:HFIX+2,1)) - - XT(0,:) = IACC*XT(HFIX,:) + (1-IACC)*XT0(HFIX,:) ! Xt|t - PT(0,:,:) = IACC*PT(HFIX,:,:)+ (1-IACC)*PT0(HFIX,:,:) ! Pt|t - XT0(0,:) = XT(0,:) - PT0(0,:,:)= PT(0,:,:) - - DO 360 I = I0,I1 -360 CALL INT2SEQ(Z(I),nv,INFOS,SEQ,IND(I-I0+1,:)) - CALL KF2(HFIX,dn,ny,nz,nx,nu,ns,IND(1:HFIX,:),yk(I0:I1,:), - 1 c,H,G,a,F,R,XT,PT,DLL(1:HFIX)) - AUX1=LEMMA4(OM(I1,:,:),MU(I1,:),XT(HFIX,:),PT(HFIX,:,:),nx) - PN = AUX1 + SUM(DLL(1:HFIX)) + PS1 ! prior x likelihood - - DO 361 I = I0,I1 -361 CALL INT2SEQ(Z0(I),nv,INFOS,SEQ,IND(I-I0+1,:)) - - CALL KF2(HFIX,dn,ny,nz,nx,nu,ns,IND(1:HFIX,:),yk(I0:I1,:), - 1 c,H,G,a,F,R,XT0,PT0,DLL(1:HFIX)) - AUX0=LEMMA4(OM(I1,:,:),MU(I1,:),XT0(HFIX,:),PT0(HFIX,:,:),nx) - PO = AUX0 + SUM(DLL(1:HFIX)) + PS0 ! prior x likelihood -C PA = DEXP(PN-PO)*QO/QN - PA = MAX(MIN(PN-PO+DLOG(QO)-DLOG(QN),0.D0),-300.D0) - PA = DEXP(PA) - ELSE - XT(0,:) = IACC*XT(HFIX,:) + (1-IACC)*XT0(HFIX,:) ! Xt|t - PT(0,:,:) = IACC*PT(HFIX,:,:)+ (1-IACC)*PT0(HFIX,:,:) ! Pt|t - - DO 362 I = I0,I1 -362 CALL INT2SEQ(Z(I),nv,INFOS,SEQ,IND(I-I0+1,:)) - - CALL KF2(HFIX,dn,ny,nz,nx,nu,ns,IND(1:HFIX,:),yk(I0:I1,:), - 1 c,H,G,a,F,R,XT,PT,DLL(1:HFIX)) - XT0(HFIX,:) = XT(HFIX,:) - PT0(HFIX,:,:)= PT(HFIX,:,:) - PA = 1.D0 - ENDIF -C v = G05CAF(v) - v = genunf(0.D0,1.D0) - IF (v.GT.PA) THEN - Z(I0:I1) = Z0(I0:I1) - ACCRATE(I0:I1) = ACCRATE(I0:I1) + 1 - IACC = 0 - ELSE - Z0(I0:I1) = Z(I0:I1) - IACC = 1 - ENDIF -400 CONTINUE - -C Last block - I0 = I1+1 - I1 = nobs - HFIXL = I1 - I0 + 1 - QN = 1.D0 - QO = 1.D0 -C vd = G05CAF(vd) ! For qn(z) = delta*g0(z) + (1-delta)*gn(z) - vd = genunf(0.D0,1.D0) - DO 500 IT = HFIXL,1,-1 - IF (vd.GT.delta) THEN ! sample from gn(x) -C v = G05CAF(v) - v = genunf(0.D0,1.D0) - AUX = PTR(nobs-IT+1,1,Z(nobs-IT)) !nobs-9: nobs - ISEQ = 1 - DO 450 WHILE (AUX.LT.v) - ISEQ = ISEQ+1 -450 AUX = AUX + PTR(nobs-IT+1,ISEQ,Z(nobs-IT)) - ELSE -C v = G05CAF(v) - v = genunf(0.D0,1.D0) - AUX = PM(nobs-IT+1,1) - ISEQ = 1 - DO 451 WHILE (AUX.LT.v) - ISEQ = ISEQ+1 -451 AUX = AUX + PM(nobs-IT+1,ISEQ) - ENDIF - Z(nobs-IT+1) = ISEQ - GN = GN*PM(nobs-IT+1,ISEQ) - GO = GO*PM(nobs-IT+1,Z0(nobs-IT+1)) - QN = QN*PTR(nobs-IT+1,ISEQ,Z(nobs-IT)) -500 QO = QO*PTR(nobs-IT+1,Z0(nobs-IT+1),Z0(nobs-IT)) - - QN = delta*GN + (1.D0-delta)*QN - QO = delta*GO + (1.D0-delta)*QO - - IF (SUM(ABS(Z(I0:I1)-Z0(I0:I1))).NE.0) THEN - IND(HFIXL+2,1) = 0 - IND(1:HFIXL+1,1) = Z0(I0-1:nobs) - PS0 = MARKOVP(PALL,PE,nstot,HFIXL,nobs,nobs,IND(1:HFIXL+2,1)) - IND(1:HFIXL+1,1) = Z(I0-1:nobs) - PS1 = MARKOVP(PALL,PE,nstot,HFIXL,nobs,nobs,IND(1:HFIXL+2,1)) - - XT(0,:) = IACC*XT(HFIXL,:) + (1-IACC)*XT0(HFIXL,:) ! Xt|t - PT(0,:,:) = IACC*PT(HFIXL,:,:)+ (1-IACC)*PT0(HFIXL,:,:) ! Pt|t - XT0(0,:) = XT(0,:) - PT0(0,:,:)= PT(0,:,:) - - DO 510 I = I0,I1 -510 CALL INT2SEQ(Z(I),nv,INFOS,SEQ,IND(I-I0+1,:)) - - CALL KF2(HFIXL,dn,ny,nz,nx,nu,ns,IND(1:HFIXL,:),yk(I0:I1,:), - 1 c,H,G,a,F,R,XT,PT,DLL(1:HFIXL)) - - PN = SUM(DLL(1:HFIXL)) + PS1 ! prior x likelihood - - DO 520 I = I0,I1 -520 CALL INT2SEQ(Z0(I),nv,INFOS,SEQ,IND(I-I0+1,:)) - - CALL KF2(HFIXL,dn,ny,nz,nx,nu,ns,IND(1:HFIXL,:),yk(I0:I1,:), - 1 c,H,G,a,F,R,XT0,PT0,DLL(1:HFIXL)) - - PO = SUM(DLL(1:HFIXL)) + PS0 ! prior x likelihood -C PA = DEXP(PN-PO)*QO/QN - PA = MAX(MIN(PN-PO+DLOG(QO)-DLOG(QN),0.D0),-300.D0) - PA = DEXP(PA) - ELSE - PA = 1.D0 - ENDIF -C v = G05CAF(v) - v = genunf(0.D0,1.D0) - IF (v.GT.PA) THEN - Z(I0:I1) = Z0(I0:I1) - ACCRATE(I0:I1) = ACCRATE(I0:I1) + 1 - ELSE - Z0(I0:I1) = Z(I0:I1) - ENDIF - - DO I=1,nobs - CALL INT2SEQ(Z(I),nv,INFOS,SEQ,S(I,:)) - ENDDO - - DEALLOCATE (XT,PT,XT0,PT0,PTR2,DLL) - - RETURN +C along with DMM. If not, see <http://www.gnu.org/licenses/>. +C ------------------------------------------------------------- + SUBROUTINE AMH2(HFIX,nobs,d,ny,nz,nx,nu,nv,ns,nstot,nt,np,yk, + 1 theta,psi,PTR,PM,INFOS,pdll,Z,S,ACCRATE) + + USE dfwin + INTERFACE + SUBROUTINE DESIGN(ny,nz,nx,nu,ns,nt,theta,c,H,G,a,F,R) + INTEGER ny,nz,nx,nu,ns(6),nt + DOUBLE PRECISION theta(nt) + DOUBLE PRECISION c(ny,max(1,nz),ns(1)),H(ny,nx,ns(2)), + 1 G(ny,nu,ns(3)),a(nx,ns(4)),F(nx,nx,ns(5)),R(nx,nu,ns(6)) + END SUBROUTINE + END INTERFACE + POINTER (pdll,fittizia) ! ASSOCIATE pointer P alla DLL ad una varibile fittizia + POINTER (pdesign,DESIGN) ! IMPORTANT associo il puntatore pdesign alla Interface definita + +C INPUT + INTEGER HFIX,nobs,d(2),ny,nz,nx,nu,nv,ns(6),nstot,nt,np, + 1 INFOS(9,6) + DOUBLE PRECISION yk(nobs,ny+nz),theta(nt),psi(np), + 1 PTR(nobs,nstot,nstot),PM(nobs,nstot) + +C INPUT/OUTPUT + INTEGER Z(nobs),S(nobs,6),ACCRATE(nobs) + +C LOCALS + INTEGER IT,I,II,J,JJ,K,IFAIL,ISEQ,HFIXL,I0,I1,IACC,IC,IR,id1 + INTEGER Z0(nobs),IS(6),IND(HFIX+2,6),SEQ(nv),dn(2) + DOUBLE PRECISION c(ny,max(nz,1),ns(1)),H(ny,nx,ns(2)), + 1 G(ny,nu,ns(3)),a(nx,ns(4)),F(nx,nx,ns(5)),R(nx,nu,ns(6)) + DOUBLE PRECISION P1(INFOS(8,1),INFOS(8,1)), + 1 P2(INFOS(8,2),INFOS(8,2)),P3(INFOS(8,3),INFOS(8,3)), + 2 P4(INFOS(8,4),INFOS(8,4)),P5(INFOS(8,5),INFOS(8,5)), + 3 P6(INFOS(8,6),INFOS(8,6)),PMAT(nstot,nstot),PE(nstot), + 4 PALL(nstot,nstot,HFIX+1) + DOUBLE PRECISION Xdd(max(d(1),1),nx),Pdd(max(d(1),1),nx,nx) + DOUBLE PRECISION OM(nobs,nx,nx),MU(nobs,nx) + DOUBLE PRECISION HRG(ny,nu),VV(ny,ny),HF(ny,nx),COM(ny+1,ny), + 1 HRGV(nu,ny),B(nx,ny),RR(nx,nx),BH(nx,nx),BHRG(nx,nu),DD(nx,nx), + 2 CS(nx,nx),CC(nx,nx),AA(nx,nx),DI(nx,nx),COM1(nx+1,nx),Ha(ny), + 3 OMC(nx,nx),OMCDIC(nx,nx),AOMCDIC(nx,nx),AOMCDICOM(nx,nx), + 4 VVHF(ny,nx),WORK(3*nx),LAM(nx),PR(nstot), + 5 QN,QO,PA,PN,PO,GN,GO,AUX,delta,v,vd,PS0,PS1,AUX1,AUX0 + DOUBLE PRECISION, ALLOCATABLE:: DLL(:),XT(:,:),PT(:,:,:), + 1 XT0(:,:),PT0(:,:,:),PTR2(:,:,:) + DOUBLE PRECISION EPS,ONE,ZERO + DATA EPS/1.D-14/,ONE/1.0D0/,ZERO/0.0D0/ + DOUBLE PRECISION LEMMA4,MARKOVP,genunf + + dn(1) = 0 + dn(2) = d(2) + id1 = max(d(1),1) + Z0 = Z + delta = 1.D-3 + pdesign = getprocaddress(pdll, "design_"C) + CALL DESIGN(ny,nz,nx,nu,ns,nt,theta,c,H,G,a,F,R) + CALL DESIGNZ(nv,np,psi,INFOS,P1,P2,P3,P4,P5,P6) +C PMAT(i,j) = Pr[Z(t+1)=i|Z(t)=j], Z = S1 x S2 x ... x Snv + CALL PPROD(nv,nstot,INFOS,P1,P2,P3,P4,P5,P6,PMAT) +C ERGODIC solves PE: PE*(I-P') = 0 + CALL ERGODIC(nstot,PMAT,PE) + +C KOLMOGOROV EQNS + PALL(:,:,1) = PMAT + DO J = 2,HFIX+1 ! Kolmogorov eqns + DO jj = 1,nstot + DO ii = 1,nstot-1 + PALL(ii,jj,J) = SUM(PALL(ii,:,1)*PALL(:,jj,J-1)) + ENDDO + PALL(nstot,jj,J) = 1.D0-SUM(PALL(1:nstot-1,jj,J)) + ENDDO + ENDDO + +C OMEGA and MU RECURSIONS + OM(:,:,:)= ZERO + MU(:,:) = ZERO + DO 250 IT = nobs-1,1,-1 +C INT2SEQ map from Z(IT+1) to IS = (k1 k2 k3 k4 k5 k6) + CALL INT2SEQ(Z(IT+1),nv,INFOS,SEQ,IS) + + DO 10 I=1,ny + Ha(I) = SUM(H(I,:,IS(2))*a(:,IS(4))) ! H*a (ny x 1) + DO 10 J=1,nu +10 HRG(I,J) = SUM(H(I,:,IS(2))*R(:,J,IS(6))) + + + G(I,J,IS(3)) ! HR+G (ny x nu) + + DO 20 I=1,ny + VV(I,I) = SUM(HRG(I,1:nu)*HRG(I,1:nu)) + DO 20 J=1,I-1 + VV(I,J) = SUM(HRG(I,1:nu)*HRG(J,1:nu)) ! (HR+G)*(HR+G)' (ny x ny) +20 VV(J,I) = VV(I,J) + + DO 30 I=1,ny + DO 30 J=1,nx +30 HF(I,J)=SUM(H(I,:,IS(2))*F(:,J,IS(5))) ! HF(ny x nx) + + COM(1:ny,1:ny) = VV(1:ny,1:ny) + IFAIL = -1 +C CALL F01ADF(ny,COM(1:ny+1,1:ny), ny+1, IFAIL) + CALL DPOTRF('L',ny,COM(1:ny,1:ny),ny,IFAIL) ! COM = L*L' + CALL DPOTRI('L',ny,COM(1:ny,1:ny),ny,IFAIL) ! COM = VV^-1 + DO 40 I=1,ny + DO 40 J=1,I + VV(I,J) = COM(I,J) +40 VV(J,I) = VV(I,J) ! inv[(HR+G)*(HR+G)'] (ny x ny) + +C B = R*(H*R+G)'*VV (nx x ny) + DO 50 I=1,nu + DO 50 J=1,ny +50 HRGV(I,J) = SUM(HRG(1:ny,I)*VV(1:ny,J)) ! (H*R+G)'*VV (nu x ny) + + DO 60 I=1,nx + DO 60 J=1,ny +60 B(I,J) = SUM(R(I,1:nu,IS(6))*HRGV(1:nu,J)) ! B (nx x ny) + + DO 70 I=1,nx + DO 70 J=1,nx +70 BH(I,J) = SUM(B(I,1:ny)*H(1:ny,J,IS(2))) ! BH (nx x nx) + + DO 75 I=1,nx + RR(I,I) = SUM(R(I,:,IS(6))*R(I,:,IS(6))) + DO 75 J=1,I-1 + RR(I,J) = SUM(R(I,:,IS(6))*R(J,:,IS(6))) ! RR' (nx x nx) +75 RR(J,I) = RR(I,J) + +C FIND CS such that CS*CS' = RR'-B*HRG*R' (nx x nx) + DO 80 I=1,nx + DO 80 J=1,nu +80 BHRG(I,J) = SUM(B(I,1:ny)*HRG(1:ny,J)) + + DO 90 I=1,nx + DO 90 J=1,I +90 CC(I,J) = RR(I,J) - SUM(BHRG(I,1:nu)*R(J,1:nu,IS(6))) + + IFAIL=-1 +C CALL F02FAF('V','L',nx,CC,nx,LAM,WORK,3*nx,IFAIL) + CALL DSYEV( 'V','L',nx,CC,nx,LAM,WORK,3*nx,IFAIL) + DO 100 I=1,nx + IF (LAM(I).LE.EPS) LAM(I)= ZERO +100 CS(:,I) = CC(1:nx,I)*DSQRT(LAM(I)) + +C AA = F - B*HF (nx x nx) + DO 110 I=1,nx + DO 110 J=1,nx +110 AA(I,J) = F(I,J,IS(5)) - SUM(B(I,1:ny)*HF(1:ny,J)) + +C OMC = OM(+1)*CS (nx x nx) + DO 120 I=1,nx + DO 120 J=1,nx +120 OMC(I,J) = SUM(OM(IT+1,I,:)*CS(:,J)) + +C DD = I + CS'*OM(+1)*CS (nx x nx) + DD(:,:) = ZERO + DO 130 I=1,nx + DD(I,I) = ONE + DO 130 J=1,I + DD(I,J) = DD(I,J) + SUM(CS(:,I)*OMC(:,J)) +130 DD(J,I) = DD(I,J) + +C DI = inv(DD) (nx x nx) + COM1(1:nx,:) = DD(:,:) + IFAIL = -1 +C CALL F01ADF(nx,COM1,nx+1,IFAIL) + CALL DPOTRF('L',nx,COM1(1:nx,1:nx),nx,IFAIL) ! COM1 = L*L' + CALL DPOTRI('L',nx,COM1(1:nx,1:nx),nx,IFAIL) ! COM1 = DD^-1 + DO 135 I=1,nx + DO 135 J=1,I + DI(I,J) = COM1(I,j) +135 DI(J,I) = DI(I,J) + +C OMCDIC = I - OM(+1)*CS*DI*CS' (nx x nx) + DO 140 I=1,nx + DO 140 J=1,nx +140 COM1(I,J) = SUM(OMC(I,:)*DI(:,J)) ! OM(+1)*CS*DI (nx x nx) + + OMCDIC(:,:) = ZERO + DO 145 I=1,nx + OMCDIC(I,I) = ONE + DO 145 J=1,nx +145 OMCDIC(I,J) = OMCDIC(I,J)-SUM(COM1(I,:)*CS(J,:)) + +C AOMCDIC = AA'*(I - OM(+1)*CS*DINV CS') (nx x nx) + DO 150 I=1,nx + DO 150 J=1,nx +150 AOMCDIC(I,J) = SUM(AA(:,I)*OMCDIC(:,J)) + +C AOMCDICOM = AA'*(I - OM(+1)*CS*DINV*CS')*OM(+1) (nx x nx) + DO 160 I=1,nx + DO 160 J=1,nx +160 AOMCDICOM(I,J) = SUM(AOMCDIC(I,:)*OM(IT+1,:,J)) + +C VV*H*F (ny x nx) + DO 170 I=1,ny + DO 170 J=1,nx +170 VVHF(I,J) = SUM(VV(I,1:ny)*HF(1:ny,J)) + +C OM = AA*(I - OM(+1)*C*DI*C')*OM(+1)*AA' + +C + F'*H'*VV*H*F + DO 180 I=1,nx + OM(IT,I,I) = SUM(AOMCDICOM(I,:)*AA(:,I)) + + + SUM(HF(1:ny,I)*VVHF(1:ny,I)) + DO 180 J=1,I-1 + OM(IT,I,J) = SUM(AOMCDICOM(I,:)*AA(:,J)) + + + SUM(HF(1:ny,I)*VVHF(1:ny,J)) +180 OM(IT,J,I) = OM(IT,I,J) + +C MU = AA'*(I - OM(+1)*C*DI* C')*MU(+1) + +C - AA'*(I - OM C DINV C')*OM(+1)*LAM +C + F'*H'*VV*(y(+1) - H*a - c*z) +C LAM = a - B*H*a + B*[y(+1)-c*z] (nx x 1) + COM(1:ny,1) = 0.D0 + DO 185 I=1,ny +185 COM(I,1) = SUM(c(I,1:nz,IS(1))*yk(IT+1,ny+1:ny+nz)) + + DO 190 I=1,nx +190 LAM(I) = a(I,IS(4)) - SUM(BH(I,1:nx)*a(1:nx,IS(4))) + + + SUM(B(I,1:ny)*(yk(IT+1,1:ny) + + - COM(1:ny,1))) + DO 200 I=1,nx +200 MU(IT,I) = SUM(AOMCDIC(I,:)*MU(IT+1,:)) + + - SUM(AOMCDICOM(I,:)*LAM(:)) + + + SUM(VVHF(1:ny,I)*(yk(IT+1,1:ny) + # - Ha(1:ny)-COM(1:ny,1))) +250 CONTINUE + + ALLOCATE (XT(0:HFIX,nx),PT(0:HFIX,nx,nx),XT0(0:HFIX,nx), + 1 PT0(0:HFIX,nx,nx),PTR2(HFIX+1,nstot,nstot),DLL(HFIX)) + +C First block + I0 = 1 + I1 = HFIX + GN = 1.D0 + GO = 1.D0 + QN = 1.D0 + QO = 1.D0 +C vd = G05CAF(vd) ! For qn(z) = delta*g0(z) + (1-delta)*gn(z) + vd = genunf(0.D0,1.D0) + DO 300 IT = I1,I0,-1 + PR(:) = PTR(IT+1,Z(IT+1),:)*PM(IT,:)/PM(IT+1,Z(IT+1)) ! P[Z(j)|Z(j+1)] + IF (vd.GT.delta) THEN ! sample from gn(x) +C v = G05CAF(v) + v = genunf(0.D0,1.D0) + AUX = PR(1) + ISEQ = 1 + DO 290 WHILE (AUX.LT.v) + ISEQ = ISEQ + 1 +290 AUX = AUX + PR(ISEQ) + ELSE +C v = G05CAF(v) + v = genunf(0.D0,1.D0) + AUX = PM(IT,1) + ISEQ = 1 + DO 291 WHILE (AUX.LT.v) + ISEQ = ISEQ+1 +291 AUX = AUX + PM(IT,ISEQ) + ENDIF + Z(IT) = ISEQ + GN = GN*PM(IT,ISEQ) + GO = GO*PM(IT,Z0(IT)) + QN = QN*PR(ISEQ) +300 QO = QO*PTR(IT+1,Z0(IT+1),Z0(IT))*PM(IT,Z0(IT))/PM(IT+1,Z0(IT+1)) ! P[Z0(j)|Z0(j+1)] + + QN = delta*GN + (1.D0-delta)*QN + QO = delta*GO + (1.D0-delta)*QO + + IF (SUM(ABS(Z(I0:I1)-Z0(I0:I1))).NE.0) THEN + IND(1,1) = 0 + IND(2:HFIX+2,1) = Z0(1:HFIX+1) + PS0 = MARKOVP(PALL,PE,nstot,HFIX,1,nobs,IND(1:HFIX+2,1)) + IND(2:HFIX+2,1) = Z(1:HFIX+1) + PS1 = MARKOVP(PALL,PE,nstot,HFIX,1,nobs,IND(1:HFIX+2,1)) + + DO 305 I = 1,max(d(1),HFIX) +305 CALL INT2SEQ(Z(I),nv,INFOS,SEQ,IND(I,:)) + + CALL IKF2(d,ny,nz,nx,nu,ns,IND(1:id1,:),yk(1:id1,:), + 1 c,H,G,a,F,R,Xdd,Pdd,DLL(1:id1)) + XT(d(1),1:nx) = Xdd(id1,1:nx) + PT(d(1),1:nx,1:nx) = Pdd(id1,1:nx,1:nx) + CALL KF2(HFIX,d,ny,nz,nx,nu,ns,IND(1:HFIX,:),yk(1:HFIX,:), + 1 c,H,G,a,F,R,XT,PT,DLL(1:HFIX)) + AUX1=LEMMA4(OM(HFIX,:,:),MU(HFIX,:),XT(HFIX,:),PT(HFIX,:,:),nx) + PN = AUX1 + SUM(DLL(1:HFIX)) + PS1 ! prior x likelihood + + DO 306 I = 1,max(d(1),HFIX) +306 CALL INT2SEQ(Z0(I),nv,INFOS,SEQ,IND(I,:)) + + CALL IKF2(d,ny,nz,nx,nu,ns,IND(1:id1,:),yk(1:id1,:), + 1 c,H,G,a,F,R,Xdd,Pdd,DLL(1:id1)) + XT0(d(1),1:nx) = Xdd(id1,1:nx) + PT0(d(1),1:nx,1:nx) = Pdd(id1,1:nx,1:nx) + CALL KF2(HFIX,d,ny,nz,nx,nu,ns,IND(1:HFIX,:),yk(1:HFIX,:), + 1 c,H,G,a,F,R,XT0,PT0,DLL(1:HFIX)) + AUX0=LEMMA4(OM(HFIX,:,:),MU(HFIX,:),XT0(HFIX,:),PT0(HFIX,:,:),nx) + PO = AUX0 + SUM(DLL(1:HFIX)) + PS0 ! prior x likelihood + +c PA = DEXP(PN-PO)*QO/QN + PA = MAX(MIN(PN-PO+DLOG(QO)-DLOG(QN),0.D0),-300.D0) + PA = DEXP(PA) + ELSE + DO 307 I = 1,max(d(1),HFIX) +307 CALL INT2SEQ(Z(I),nv,INFOS,SEQ,IND(I,:)) + + CALL IKF2(d,ny,nz,nx,nu,ns,IND(1:id1,:),yk(1:id1,:), + 1 c,H,G,a,F,R,Xdd,Pdd,DLL(1:id1)) + XT(d(1),1:nx) = Xdd(id1,1:nx) + PT(d(1),1:nx,1:nx) = Pdd(id1,1:nx,1:nx) + CALL KF2(HFIX,d,ny,nz,nx,nu,ns,IND(1:HFIX,:),yk(1:HFIX,:), + 1 c,H,G,a,F,R,XT,PT,DLL(1:HFIX)) + XT0(HFIX,:) = XT(HFIX,:) + PT0(HFIX,:,:)= PT(HFIX,:,:) + PA = 1.D0 + ENDIF +C v = G05CAF(v) + v = genunf(0.D0,1.D0) + IF (v.GT.PA) THEN + IACC = 0 + Z(1:HFIX) = Z0(1:HFIX) + ACCRATE(1:HFIX) = ACCRATE(1:HFIX) + 1 + ELSE + Z0(1:HFIX) = Z(1:HFIX) + IACC = 1 + ENDIF + +C Inner blocks + DO 400 WHILE (I1.LT.(nobs-HFIX)) + I1 = I1 + HFIX + I0 = I1 - HFIX + 1 + GN = 1.D0 + GO = 1.D0 + QN = 1.D0 + QO = 1.D0 +C vd = G05CAF(vd) ! For qn(z) = delta*g0(z) + (1-delta)*gn(z) + vd = genunf(0.D0,1.D0) + PTR2(1,:,:) = PTR(I0,:,:) ! q[Z(t+1)|Z(t)] + DO 310 J = 2,HFIX+1 ! q[Z(t+j)|Z(t)] j = 2,...,HFIX+1 + DO 310 IC = 1,nstot + DO 310 IR = 1,nstot +310 PTR2(J,IR,IC) = SUM(PTR(I0+J-1,IR,:)*PTR2(J-1,:,IC)) + DO 350 IT = I1,I0,-1 ! t+h,t+h-1,...,t+j,...,t+1 + K = IT - I0 + 1 ! h,h-1,...,1 + PR(:) = PTR(IT+1,Z(IT+1),:)*PTR2(K,:,Z(I0-1)) + # / PTR2(K+1,Z(IT+1),Z(I0-1)) + IF (vd.GT.delta) THEN ! sample from gn(x) +C v = G05CAF(v) + v = genunf(0.D0,1.D0) + AUX = PR(1) + ISEQ = 1 + DO 320 WHILE (AUX.LT.v) + ISEQ = ISEQ+1 +320 AUX = AUX + PR(ISEQ) + ELSE +C v = G05CAF(v) + v = genunf(0.D0,1.D0) + AUX = PM(IT,1) + ISEQ = 1 + DO 322 WHILE (AUX.LT.v) + ISEQ = ISEQ+1 +322 AUX = AUX + PM(IT,ISEQ) + ENDIF + Z(IT) = ISEQ + GN = GN*PM(IT,ISEQ) + GO = GO*PM(IT,Z0(IT)) + QN = QN*PR(ISEQ) +350 QO = QO*PTR(IT+1,Z0(IT+1),Z0(IT))*PTR2(K,Z0(IT),Z0(I0-1)) + # / PTR2(K+1,Z0(IT+1),Z0(I0-1)) ! P[Z0(j)|Z0(j+1)] + + QN = delta*GN + (1.D0-delta)*QN + QO = delta*GO + (1.D0-delta)*QO + + IF (SUM(ABS(Z(I0:I1)-Z0(I0:I1))).NE.0) THEN + IND(1:HFIX+2,1) = Z0(I0-1:I1+1) + PS0 = MARKOVP(PALL,PE,nstot,HFIX,2,nobs,IND(1:HFIX+2,1)) + IND(1:HFIX+2,1) = Z(I0-1:I1+1) + PS1 = MARKOVP(PALL,PE,nstot,HFIX,2,nobs,IND(1:HFIX+2,1)) + + XT(0,:) = IACC*XT(HFIX,:) + (1-IACC)*XT0(HFIX,:) ! Xt|t + PT(0,:,:) = IACC*PT(HFIX,:,:)+ (1-IACC)*PT0(HFIX,:,:) ! Pt|t + XT0(0,:) = XT(0,:) + PT0(0,:,:)= PT(0,:,:) + + DO 360 I = I0,I1 +360 CALL INT2SEQ(Z(I),nv,INFOS,SEQ,IND(I-I0+1,:)) + CALL KF2(HFIX,dn,ny,nz,nx,nu,ns,IND(1:HFIX,:),yk(I0:I1,:), + 1 c,H,G,a,F,R,XT,PT,DLL(1:HFIX)) + AUX1=LEMMA4(OM(I1,:,:),MU(I1,:),XT(HFIX,:),PT(HFIX,:,:),nx) + PN = AUX1 + SUM(DLL(1:HFIX)) + PS1 ! prior x likelihood + + DO 361 I = I0,I1 +361 CALL INT2SEQ(Z0(I),nv,INFOS,SEQ,IND(I-I0+1,:)) + + CALL KF2(HFIX,dn,ny,nz,nx,nu,ns,IND(1:HFIX,:),yk(I0:I1,:), + 1 c,H,G,a,F,R,XT0,PT0,DLL(1:HFIX)) + AUX0=LEMMA4(OM(I1,:,:),MU(I1,:),XT0(HFIX,:),PT0(HFIX,:,:),nx) + PO = AUX0 + SUM(DLL(1:HFIX)) + PS0 ! prior x likelihood +C PA = DEXP(PN-PO)*QO/QN + PA = MAX(MIN(PN-PO+DLOG(QO)-DLOG(QN),0.D0),-300.D0) + PA = DEXP(PA) + ELSE + XT(0,:) = IACC*XT(HFIX,:) + (1-IACC)*XT0(HFIX,:) ! Xt|t + PT(0,:,:) = IACC*PT(HFIX,:,:)+ (1-IACC)*PT0(HFIX,:,:) ! Pt|t + + DO 362 I = I0,I1 +362 CALL INT2SEQ(Z(I),nv,INFOS,SEQ,IND(I-I0+1,:)) + + CALL KF2(HFIX,dn,ny,nz,nx,nu,ns,IND(1:HFIX,:),yk(I0:I1,:), + 1 c,H,G,a,F,R,XT,PT,DLL(1:HFIX)) + XT0(HFIX,:) = XT(HFIX,:) + PT0(HFIX,:,:)= PT(HFIX,:,:) + PA = 1.D0 + ENDIF +C v = G05CAF(v) + v = genunf(0.D0,1.D0) + IF (v.GT.PA) THEN + Z(I0:I1) = Z0(I0:I1) + ACCRATE(I0:I1) = ACCRATE(I0:I1) + 1 + IACC = 0 + ELSE + Z0(I0:I1) = Z(I0:I1) + IACC = 1 + ENDIF +400 CONTINUE + +C Last block + I0 = I1+1 + I1 = nobs + HFIXL = I1 - I0 + 1 + QN = 1.D0 + QO = 1.D0 +C vd = G05CAF(vd) ! For qn(z) = delta*g0(z) + (1-delta)*gn(z) + vd = genunf(0.D0,1.D0) + DO 500 IT = HFIXL,1,-1 + IF (vd.GT.delta) THEN ! sample from gn(x) +C v = G05CAF(v) + v = genunf(0.D0,1.D0) + AUX = PTR(nobs-IT+1,1,Z(nobs-IT)) !nobs-9: nobs + ISEQ = 1 + DO 450 WHILE (AUX.LT.v) + ISEQ = ISEQ+1 +450 AUX = AUX + PTR(nobs-IT+1,ISEQ,Z(nobs-IT)) + ELSE +C v = G05CAF(v) + v = genunf(0.D0,1.D0) + AUX = PM(nobs-IT+1,1) + ISEQ = 1 + DO 451 WHILE (AUX.LT.v) + ISEQ = ISEQ+1 +451 AUX = AUX + PM(nobs-IT+1,ISEQ) + ENDIF + Z(nobs-IT+1) = ISEQ + GN = GN*PM(nobs-IT+1,ISEQ) + GO = GO*PM(nobs-IT+1,Z0(nobs-IT+1)) + QN = QN*PTR(nobs-IT+1,ISEQ,Z(nobs-IT)) +500 QO = QO*PTR(nobs-IT+1,Z0(nobs-IT+1),Z0(nobs-IT)) + + QN = delta*GN + (1.D0-delta)*QN + QO = delta*GO + (1.D0-delta)*QO + + IF (SUM(ABS(Z(I0:I1)-Z0(I0:I1))).NE.0) THEN + IND(HFIXL+2,1) = 0 + IND(1:HFIXL+1,1) = Z0(I0-1:nobs) + PS0 = MARKOVP(PALL,PE,nstot,HFIXL,nobs,nobs,IND(1:HFIXL+2,1)) + IND(1:HFIXL+1,1) = Z(I0-1:nobs) + PS1 = MARKOVP(PALL,PE,nstot,HFIXL,nobs,nobs,IND(1:HFIXL+2,1)) + + XT(0,:) = IACC*XT(HFIXL,:) + (1-IACC)*XT0(HFIXL,:) ! Xt|t + PT(0,:,:) = IACC*PT(HFIXL,:,:)+ (1-IACC)*PT0(HFIXL,:,:) ! Pt|t + XT0(0,:) = XT(0,:) + PT0(0,:,:)= PT(0,:,:) + + DO 510 I = I0,I1 +510 CALL INT2SEQ(Z(I),nv,INFOS,SEQ,IND(I-I0+1,:)) + + CALL KF2(HFIXL,dn,ny,nz,nx,nu,ns,IND(1:HFIXL,:),yk(I0:I1,:), + 1 c,H,G,a,F,R,XT,PT,DLL(1:HFIXL)) + + PN = SUM(DLL(1:HFIXL)) + PS1 ! prior x likelihood + + DO 520 I = I0,I1 +520 CALL INT2SEQ(Z0(I),nv,INFOS,SEQ,IND(I-I0+1,:)) + + CALL KF2(HFIXL,dn,ny,nz,nx,nu,ns,IND(1:HFIXL,:),yk(I0:I1,:), + 1 c,H,G,a,F,R,XT0,PT0,DLL(1:HFIXL)) + + PO = SUM(DLL(1:HFIXL)) + PS0 ! prior x likelihood +C PA = DEXP(PN-PO)*QO/QN + PA = MAX(MIN(PN-PO+DLOG(QO)-DLOG(QN),0.D0),-300.D0) + PA = DEXP(PA) + ELSE + PA = 1.D0 + ENDIF +C v = G05CAF(v) + v = genunf(0.D0,1.D0) + IF (v.GT.PA) THEN + Z(I0:I1) = Z0(I0:I1) + ACCRATE(I0:I1) = ACCRATE(I0:I1) + 1 + ELSE + Z0(I0:I1) = Z(I0:I1) + ENDIF + + DO I=1,nobs + CALL INT2SEQ(Z(I),nv,INFOS,SEQ,S(I,:)) + ENDDO + + DEALLOCATE (XT,PT,XT0,PT0,PTR2,DLL) + + RETURN END diff --git a/checkdesign.for b/checkdesign.for index d4297d439362c5d4cd4fe003863e51c9dcf04b4a..68474ff3595c2afa4f5dc85157b37d3d6315272b 100644 --- a/checkdesign.for +++ b/checkdesign.for @@ -1,27 +1,27 @@ -C ------------------------------------------------------------- -C CHECKDESIGN cheks design.dll or design.m -C Developed by A.Rossi, C.Planas and G.Fiorentini -C -C State-space format: y(t) = c(t)z(t) + H(t)x(t) + G(t)u(t) -C x(t) = a(t) + F(t)x(t-1) + R(t)u(t) -C -C y(t) (ny x 1) ny = # of endogenous series -C z(t) (nz x 1) nz = # of exogenous series -C x(t) (nx x 1) nx = # of continous states -C u(t) (nu x 1) nu = # of shocks -C c(t) (ny x nz x ns1) ns1 = # of states for c(t) -C H(t) (ny x nx x ns2) ns2 = # of states for H(t) -C G(t) (ny x nu x ns3) ns3 = # of states for G(t) -C a(t) (nx x ns4) ns4 = # of states for a(t) -C F(t) (nx x nx x ns5) ns5 = # of states for F(t) -C R(t) (nx x nu x ns6) ns6 = # of states for R(t) -C -C Copyright (C) 2010-2014 European Commission -C +C ------------------------------------------------------------- +C CHECKDESIGN cheks design.dll or design.m +C Developed by A.Rossi, C.Planas and G.Fiorentini +C +C State-space format: y(t) = c(t)z(t) + H(t)x(t) + G(t)u(t) +C x(t) = a(t) + F(t)x(t-1) + R(t)u(t) +C +C y(t) (ny x 1) ny = # of endogenous series +C z(t) (nz x 1) nz = # of exogenous series +C x(t) (nx x 1) nx = # of continous states +C u(t) (nu x 1) nu = # of shocks +C c(t) (ny x nz x ns1) ns1 = # of states for c(t) +C H(t) (ny x nx x ns2) ns2 = # of states for H(t) +C G(t) (ny x nu x ns3) ns3 = # of states for G(t) +C a(t) (nx x ns4) ns4 = # of states for a(t) +C F(t) (nx x nx x ns5) ns5 = # of states for F(t) +C R(t) (nx x nu x ns6) ns6 = # of states for R(t) +C +C Copyright (C) 2010-2014 European Commission +C C This file is part of Program DMM C -C DMM is free software developed at the Joint Research Centre of the -C European Commission: you can redistribute it and/or modify it under +C DMM is free software developed at the Joint Research Centre of the +C European Commission: you can redistribute it and/or modify it under C the terms of the GNU General Public License as published by C the Free Software Foundation, either version 3 of the License, or C (at your option) any later version. @@ -32,237 +32,237 @@ C MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the C GNU General Public License for more details. C C You should have received a copy of the GNU General Public License -C along with DMM. If not, see <http://www.gnu.org/licenses/>. -C ------------------------------------------------------------- - SUBROUTINE CHECKDESIGN(ny,nz,nx,nu,ns,nt,d,theta,pdll,PATH,NMLNAME) - - USE dfwin - INTERFACE - SUBROUTINE DESIGN(ny,nz,nx,nu,ns,nt,theta,c,H,G,a,F,R) - INTEGER ny,nz,nx,nu,ns(6),nt - DOUBLE PRECISION theta(nt) - DOUBLE PRECISION c(ny,max(1,nz),ns(1)),H(ny,nx,ns(2)), - 1 G(ny,nu,ns(3)),a(nx,ns(4)),F(nx,nx,ns(5)),R(nx,nu,ns(6)) - END SUBROUTINE - END INTERFACE - POINTER (pdll,fittizia) ! ASSOCIATE pointer pdll alla DLL ad una varibile fittizia - POINTER (pdesign,DESIGN) - -C INPUT - INTEGER ny,nz,nx,nu,ns(6),nt,d(2) - DOUBLE PRECISION theta(nt) - CHARACTER*200 NMLNAME,PATH,FILEOUT - -C LOCALS - INTEGER I,J,maxnz,IFAIL,ESTABLE - DOUBLE PRECISION WORK(4*nx),WR(nx),WI(nx),VR(1), - 1 VI(1),W(nx) !WRY(ny),WORK1(64*ny) - DOUBLE PRECISION,ALLOCATABLE::c(:,:,:),H(:,:,:), - 1 G(:,:,:),a(:,:),F(:,:,:),R(:,:,:) !,HRG(:,:),HRGRH(:,:) - CHARACTER*3 CJ -C EXTERNAL SUBROUTINES - EXTERNAL DGEEV - - ALLOCATE(c(ny,max(nz,1),ns(1)),H(ny,nx,ns(2)), - 1 G(ny,nu,ns(3)),a(nx,ns(4)),F(nx,nx,ns(5)),R(nx,nu,ns(6))) !,HRG(ny,nu),HRGRH(ny,ny)) - - pdesign = getprocaddress(pdll, "design_"C) - CALL DESIGN(ny,nz,nx,nu,ns,nt,theta,c,H,G,a,F,R) - - maxnz = max(1,nz) - FILEOUT = TRIM(PATH)//TRIM(NMLNAME)//'.CHK' - OPEN(11,FILE = FILEOUT, ACCESS='SEQUENTIAL') - -C write ny,nx,etc - WRITE(11,1000) nt,ny,nx,nu,nz -1000 FORMAT(' nt = ',I3,'; ny = ',I3,'; nx = ',I3,'; nu = ',I3, - # '; nz = ',I3,';') - -C write theta - WRITE(11,*) 'theta(1:nt) = [' - WRITE(11,*) ' ' - WRITE(11,'(<nt>(F20.10))') theta(1:nt) - WRITE(11,*) ']' - -C write c(ny,max(1,nz),ns(1)) - DO J = 1,ns(1) - WRITE(11,*) ' ' - IF (J.LE.9) THEN - WRITE(CJ,'(I1)') J - ELSEIF ((J.GE.10).AND.(J.LE.99)) THEN - WRITE(CJ,'(I2)') J - ELSEIF ((J.GE.100).AND.(J.LE.999)) THEN - WRITE(CJ,'(I3)') J - ENDIF - WRITE(11,*) 'c(1:ny,1:nz,'//TRIM(CJ)// ') = [' - WRITE(11,*) ' ' - WRITE(11,'(<maxnz>(F20.10))') (c(I,1:maxnz,J),I=1,ny) - WRITE(11,*) ']' - ENDDO - -C write H(ny,nx,ns(2)) - DO J = 1,ns(2) - WRITE(11,*) ' ' - IF (J.LE.9) THEN - WRITE(CJ,'(I1)') J - ELSEIF ((J.GE.10).AND.(J.LE.99)) THEN - WRITE(CJ,'(I2)') J - ELSEIF ((J.GE.100).AND.(J.LE.999)) THEN - WRITE(CJ,'(I3)') J - ENDIF - WRITE(11,*) 'H(1:ny,1:nx,'//TRIM(CJ)// ') = [' - WRITE(11,*) ' ' - WRITE(11,'(<nx>(F20.10))') (H(I,1:nx,J),I=1,ny) - WRITE(11,*) ']' - ENDDO - -C write G(ny,nu,ns(3)) - DO J = 1,ns(3) - WRITE(11,*) ' ' - IF (J.LE.9) THEN - WRITE(CJ,'(I1)') J - ELSEIF ((J.GE.10).AND.(J.LE.99)) THEN - WRITE(CJ,'(I2)') J - ELSEIF ((J.GE.100).AND.(J.LE.999)) THEN - WRITE(CJ,'(I3)') J - ENDIF - WRITE(11,*) 'G(1:ny,1:nu,'//TRIM(CJ)// ') = [' - WRITE(11,*) ' ' - WRITE(11,'(<nu>(F20.10))') (G(I,1:nu,J),I=1,ny) - WRITE(11,*) ']' - ENDDO - -C write a(nx,ns(4)) - DO J = 1,ns(4) - WRITE(11,*) ' ' - IF (J.LE.9) THEN - WRITE(CJ,'(I1)') J - ELSEIF ((J.GE.10).AND.(J.LE.99)) THEN - WRITE(CJ,'(I2)') J - ELSEIF ((J.GE.100).AND.(J.LE.999)) THEN - WRITE(CJ,'(I3)') J - ENDIF - WRITE(11,*) 'a(1:nx,'//TRIM(CJ)// ') = [' - WRITE(11,*) ' ' - WRITE(11,'(<1>(F20.10))') (a(I,J),I=1,nx) - WRITE(11,*) ']' - ENDDO - -C write F(nx,nx,ns(5)) - DO J = 1,ns(5) - WRITE(11,*) ' ' - IF (J.LE.9) THEN - WRITE(CJ,'(I1)') J - ELSEIF ((J.GE.10).AND.(J.LE.99)) THEN - WRITE(CJ,'(I2)') J - ELSEIF ((J.GE.100).AND.(J.LE.999)) THEN - WRITE(CJ,'(I3)') J - ENDIF - WRITE(11,*) 'F(1:nx,1:nx,'//TRIM(CJ)// ') = [' - WRITE(11,*) ' ' - WRITE(11,'(<nx>(F20.10))') (F(I,1:nx,J),I=1,nx) - WRITE(11,*) ']' - ENDDO - -C write R(nx,nu,ns(6)) - DO J = 1,ns(6) - WRITE(11,*) ' ' - IF (J.LE.9) THEN - WRITE(CJ,'(I1)') J - ELSEIF ((J.GE.10).AND.(J.LE.99)) THEN - WRITE(CJ,'(I2)') J - ELSEIF ((J.GE.100).AND.(J.LE.999)) THEN - WRITE(CJ,'(I3)') J - ENDIF - WRITE(11,*) 'R(1:nx,1:nu,'//TRIM(CJ)// ') = [' - WRITE(11,*) ' ' - WRITE(11,'(<nu>(F20.10))') (R(I,1:nu,J),I=1,nx) - WRITE(11,*) ']' - ENDDO - -C Check unstable eigenvalues of F - DO J = 1,ns(5) - IF (d(2).GT.0) THEN - IFAIL=-1 -C CALL F02EBF('N',d(2),F(1:d(2),1:d(2),J),d(2), -C 1 WR(1:d(2)),WI(1:d(2)),VR,1,VI,1,WORK,4*nx,IFAIL) - CALL DGEEV('N','N',d(2),F(1:d(2),1:d(2),J),d(2), - 1 WR(1:d(2)),WI(1:d(2)),VR,1,VI,1,WORK,4*nx,IFAIL) - - ESTABLE = 0 - DO I = 1,d(2) - W(I) = WR(I)**2+WI(I)**2 - ESTABLE = ESTABLE + ABS(W(I).GE.1.D0) - ENDDO - IF (ESTABLE.NE.d(2)) THEN - WRITE(11,*) ' ' - WRITE(11,*) 'WARNING: the number of unstable eigenvalues for ' - WRITE(11,*) 'F(1:nx,1:nx,'//TRIM(CJ)// 'is not equal to d(2) ' - WRITE(11,*) 'or non-stationary states are not placed in the' - WRITE(11,*) 'first d(2) positions.' - ENDIF - ENDIF - -C Check stable eigenvalues of F - IF (nx-d(2).GT.0) THEN - IFAIL=-1 -c CALL F02EBF('N',nx-d(2),F(d(2)+1:nx,d(2)+1:nx,J), -c 1 nx-d(2),WR,WI,VR,1,VI,1,WORK,4*nx,IFAIL) - CALL DGEEV('N','N',nx-d(2),F(d(2)+1:nx,d(2)+1:nx,J), - # nx-d(2),WR,WI,VR,1,VI,1,WORK,4*nx,IFAIL) - - ESTABLE = 0 - DO I = 1,nx-d(2) - W(I) = WR(I)**2+WI(I)**2 - ESTABLE = ESTABLE + ABS(W(I).LT.1.D0) - ENDDO - IF (ESTABLE.NE.(nx-d(2))) THEN - WRITE(11,*) ' ' - WRITE(11,*) 'WARNING: the number of stable eigenvalues for ' - WRITE(11,*) 'F(1:nx,1:nx,'//TRIM(CJ)//'is not equal to nx-d(2)' - WRITE(11,*) 'or non-stationary states are not placed in the ' - WRITE(11,*) 'first d(2) positions.' - ENDIF - ENDIF - ENDDO - - CLOSE(11) - DEALLOCATE(c,H,G,a,F,R) - - RETURN - PAUSE - END - -C Check rank{(HR+G)*(HR+G)'} this check is wrong!!! -c DO J = 1,ns(2) !H -c DO JJ = 1,ns(3) !G -c DO JJJ = 1,ns(6) !R - -c DO I =1,ny -c DO K =1,nu -c HRG(I,K) = SUM(H(I,1:nx,J)*R(1:nx,K,JJJ))+G(I,K,JJ) -c ENDDO -c ENDDO - -c DO I =1,ny -c DO K =1,ny -c HRGRH(I,K) = SUM(HRG(I,1:nu)*HRG(K,1:nu)) -c ENDDO -c ENDDO - -c IFAIL = -1 -c CALL F02FAF('N','U',ny,HRGRH,ny,WRY(1:ny),WORK1,64*ny,IFAIL) -c SRANK = 0 -c DO 10 I=1,ny -c10 IF (WRY(I).GT.1.D-12) SRANK=SRANK+1 - -c IF (SRANK.LT.ny) THEN -c WRITE(11,*) ' ' -c WRITE(11,*) 'WARNING: the rank of the system computed looking ' -c WRITE(11,*) 'at rank{(HR+G)*transpose(HR+G)} is less than ny ' -c ENDIF - -c ENDDO -c ENDDO -c ENDDO - +C along with DMM. If not, see <http://www.gnu.org/licenses/>. +C ------------------------------------------------------------- + SUBROUTINE CHECKDESIGN(ny,nz,nx,nu,ns,nt,d,theta,pdll,PATH,NMLNAME) + + USE dfwin + INTERFACE + SUBROUTINE DESIGN(ny,nz,nx,nu,ns,nt,theta,c,H,G,a,F,R) + INTEGER ny,nz,nx,nu,ns(6),nt + DOUBLE PRECISION theta(nt) + DOUBLE PRECISION c(ny,max(1,nz),ns(1)),H(ny,nx,ns(2)), + 1 G(ny,nu,ns(3)),a(nx,ns(4)),F(nx,nx,ns(5)),R(nx,nu,ns(6)) + END SUBROUTINE + END INTERFACE + POINTER (pdll,fittizia) ! ASSOCIATE pointer pdll alla DLL ad una varibile fittizia + POINTER (pdesign,DESIGN) + +C INPUT + INTEGER ny,nz,nx,nu,ns(6),nt,d(2) + DOUBLE PRECISION theta(nt) + CHARACTER*200 NMLNAME,PATH,FILEOUT + +C LOCALS + INTEGER I,J,maxnz,IFAIL,ESTABLE + DOUBLE PRECISION WORK(4*nx),WR(nx),WI(nx),VR(1), + 1 VI(1),W(nx) !WRY(ny),WORK1(64*ny) + DOUBLE PRECISION,ALLOCATABLE::c(:,:,:),H(:,:,:), + 1 G(:,:,:),a(:,:),F(:,:,:),R(:,:,:) !,HRG(:,:),HRGRH(:,:) + CHARACTER*3 CJ +C EXTERNAL SUBROUTINES + EXTERNAL DGEEV + + ALLOCATE(c(ny,max(nz,1),ns(1)),H(ny,nx,ns(2)), + 1 G(ny,nu,ns(3)),a(nx,ns(4)),F(nx,nx,ns(5)),R(nx,nu,ns(6))) !,HRG(ny,nu),HRGRH(ny,ny)) + + pdesign = getprocaddress(pdll, "design_"C) + CALL DESIGN(ny,nz,nx,nu,ns,nt,theta,c,H,G,a,F,R) + + maxnz = max(1,nz) + FILEOUT = TRIM(PATH)//TRIM(NMLNAME)//'.CHK' + OPEN(11,FILE = FILEOUT, ACCESS='SEQUENTIAL') + +C write ny,nx,etc + WRITE(11,1000) nt,ny,nx,nu,nz +1000 FORMAT(' nt = ',I3,'; ny = ',I3,'; nx = ',I3,'; nu = ',I3, + # '; nz = ',I3,';') + +C write theta + WRITE(11,*) 'theta(1:nt) = [' + WRITE(11,*) ' ' + WRITE(11,'(<nt>(F20.10))') theta(1:nt) + WRITE(11,*) ']' + +C write c(ny,max(1,nz),ns(1)) + DO J = 1,ns(1) + WRITE(11,*) ' ' + IF (J.LE.9) THEN + WRITE(CJ,'(I1)') J + ELSEIF ((J.GE.10).AND.(J.LE.99)) THEN + WRITE(CJ,'(I2)') J + ELSEIF ((J.GE.100).AND.(J.LE.999)) THEN + WRITE(CJ,'(I3)') J + ENDIF + WRITE(11,*) 'c(1:ny,1:nz,'//TRIM(CJ)// ') = [' + WRITE(11,*) ' ' + WRITE(11,'(<maxnz>(F20.10))') (c(I,1:maxnz,J),I=1,ny) + WRITE(11,*) ']' + ENDDO + +C write H(ny,nx,ns(2)) + DO J = 1,ns(2) + WRITE(11,*) ' ' + IF (J.LE.9) THEN + WRITE(CJ,'(I1)') J + ELSEIF ((J.GE.10).AND.(J.LE.99)) THEN + WRITE(CJ,'(I2)') J + ELSEIF ((J.GE.100).AND.(J.LE.999)) THEN + WRITE(CJ,'(I3)') J + ENDIF + WRITE(11,*) 'H(1:ny,1:nx,'//TRIM(CJ)// ') = [' + WRITE(11,*) ' ' + WRITE(11,'(<nx>(F20.10))') (H(I,1:nx,J),I=1,ny) + WRITE(11,*) ']' + ENDDO + +C write G(ny,nu,ns(3)) + DO J = 1,ns(3) + WRITE(11,*) ' ' + IF (J.LE.9) THEN + WRITE(CJ,'(I1)') J + ELSEIF ((J.GE.10).AND.(J.LE.99)) THEN + WRITE(CJ,'(I2)') J + ELSEIF ((J.GE.100).AND.(J.LE.999)) THEN + WRITE(CJ,'(I3)') J + ENDIF + WRITE(11,*) 'G(1:ny,1:nu,'//TRIM(CJ)// ') = [' + WRITE(11,*) ' ' + WRITE(11,'(<nu>(F20.10))') (G(I,1:nu,J),I=1,ny) + WRITE(11,*) ']' + ENDDO + +C write a(nx,ns(4)) + DO J = 1,ns(4) + WRITE(11,*) ' ' + IF (J.LE.9) THEN + WRITE(CJ,'(I1)') J + ELSEIF ((J.GE.10).AND.(J.LE.99)) THEN + WRITE(CJ,'(I2)') J + ELSEIF ((J.GE.100).AND.(J.LE.999)) THEN + WRITE(CJ,'(I3)') J + ENDIF + WRITE(11,*) 'a(1:nx,'//TRIM(CJ)// ') = [' + WRITE(11,*) ' ' + WRITE(11,'(<1>(F20.10))') (a(I,J),I=1,nx) + WRITE(11,*) ']' + ENDDO + +C write F(nx,nx,ns(5)) + DO J = 1,ns(5) + WRITE(11,*) ' ' + IF (J.LE.9) THEN + WRITE(CJ,'(I1)') J + ELSEIF ((J.GE.10).AND.(J.LE.99)) THEN + WRITE(CJ,'(I2)') J + ELSEIF ((J.GE.100).AND.(J.LE.999)) THEN + WRITE(CJ,'(I3)') J + ENDIF + WRITE(11,*) 'F(1:nx,1:nx,'//TRIM(CJ)// ') = [' + WRITE(11,*) ' ' + WRITE(11,'(<nx>(F20.10))') (F(I,1:nx,J),I=1,nx) + WRITE(11,*) ']' + ENDDO + +C write R(nx,nu,ns(6)) + DO J = 1,ns(6) + WRITE(11,*) ' ' + IF (J.LE.9) THEN + WRITE(CJ,'(I1)') J + ELSEIF ((J.GE.10).AND.(J.LE.99)) THEN + WRITE(CJ,'(I2)') J + ELSEIF ((J.GE.100).AND.(J.LE.999)) THEN + WRITE(CJ,'(I3)') J + ENDIF + WRITE(11,*) 'R(1:nx,1:nu,'//TRIM(CJ)// ') = [' + WRITE(11,*) ' ' + WRITE(11,'(<nu>(F20.10))') (R(I,1:nu,J),I=1,nx) + WRITE(11,*) ']' + ENDDO + +C Check unstable eigenvalues of F + DO J = 1,ns(5) + IF (d(2).GT.0) THEN + IFAIL=-1 +C CALL F02EBF('N',d(2),F(1:d(2),1:d(2),J),d(2), +C 1 WR(1:d(2)),WI(1:d(2)),VR,1,VI,1,WORK,4*nx,IFAIL) + CALL DGEEV('N','N',d(2),F(1:d(2),1:d(2),J),d(2), + 1 WR(1:d(2)),WI(1:d(2)),VR,1,VI,1,WORK,4*nx,IFAIL) + + ESTABLE = 0 + DO I = 1,d(2) + W(I) = WR(I)**2+WI(I)**2 + ESTABLE = ESTABLE + ABS(W(I).GE.1.D0) + ENDDO + IF (ESTABLE.NE.d(2)) THEN + WRITE(11,*) ' ' + WRITE(11,*) 'WARNING: the number of unstable eigenvalues for ' + WRITE(11,*) 'F(1:nx,1:nx,'//TRIM(CJ)// 'is not equal to d(2) ' + WRITE(11,*) 'or non-stationary states are not placed in the' + WRITE(11,*) 'first d(2) positions.' + ENDIF + ENDIF + +C Check stable eigenvalues of F + IF (nx-d(2).GT.0) THEN + IFAIL=-1 +c CALL F02EBF('N',nx-d(2),F(d(2)+1:nx,d(2)+1:nx,J), +c 1 nx-d(2),WR,WI,VR,1,VI,1,WORK,4*nx,IFAIL) + CALL DGEEV('N','N',nx-d(2),F(d(2)+1:nx,d(2)+1:nx,J), + # nx-d(2),WR,WI,VR,1,VI,1,WORK,4*nx,IFAIL) + + ESTABLE = 0 + DO I = 1,nx-d(2) + W(I) = WR(I)**2+WI(I)**2 + ESTABLE = ESTABLE + ABS(W(I).LT.1.D0) + ENDDO + IF (ESTABLE.NE.(nx-d(2))) THEN + WRITE(11,*) ' ' + WRITE(11,*) 'WARNING: the number of stable eigenvalues for ' + WRITE(11,*) 'F(1:nx,1:nx,'//TRIM(CJ)//'is not equal to nx-d(2)' + WRITE(11,*) 'or non-stationary states are not placed in the ' + WRITE(11,*) 'first d(2) positions.' + ENDIF + ENDIF + ENDDO + + CLOSE(11) + DEALLOCATE(c,H,G,a,F,R) + + RETURN + PAUSE + END + +C Check rank{(HR+G)*(HR+G)'} this check is wrong!!! +c DO J = 1,ns(2) !H +c DO JJ = 1,ns(3) !G +c DO JJJ = 1,ns(6) !R + +c DO I =1,ny +c DO K =1,nu +c HRG(I,K) = SUM(H(I,1:nx,J)*R(1:nx,K,JJJ))+G(I,K,JJ) +c ENDDO +c ENDDO + +c DO I =1,ny +c DO K =1,ny +c HRGRH(I,K) = SUM(HRG(I,1:nu)*HRG(K,1:nu)) +c ENDDO +c ENDDO + +c IFAIL = -1 +c CALL F02FAF('N','U',ny,HRGRH,ny,WRY(1:ny),WORK1,64*ny,IFAIL) +c SRANK = 0 +c DO 10 I=1,ny +c10 IF (WRY(I).GT.1.D-12) SRANK=SRANK+1 + +c IF (SRANK.LT.ny) THEN +c WRITE(11,*) ' ' +c WRITE(11,*) 'WARNING: the rank of the system computed looking ' +c WRITE(11,*) 'at rank{(HR+G)*transpose(HR+G)} is less than ny ' +c ENDIF + +c ENDDO +c ENDDO +c ENDDO + diff --git a/chi2inv.for b/chi2inv.for index 6f911f1b8a9671b6cd08e8842805f4c19c875d32..842c48701a98aa4ad97b6958eb2d5ce9a4675ac3 100644 --- a/chi2inv.for +++ b/chi2inv.for @@ -435,9 +435,9 @@ C LOCALS WRITE(*,*) 'CHI2INV: Too many degrees of freedom' PAUSE RETURN - ENDIF + ENDIF CHI2INV = T(V,P) - RETURN + RETURN END diff --git a/confun.for b/confun.for index f9d5a8157f1ac2d0f4e5c2f5e6cefa2e9fc2006c..a4c09d6fbe0c10b29853f4daadf799d92e02eaa3 100644 --- a/confun.for +++ b/confun.for @@ -1,13 +1,13 @@ -C -------------------------------------------------------------------- -C CONFUN computes non linear constrains for E04UCF -C Developed by A.Rossi, C.Planas and G.Fiorentini -C -C Copyright (C) 2010-2014 European Commission -C +C -------------------------------------------------------------------- +C CONFUN computes non linear constrains for E04UCF +C Developed by A.Rossi, C.Planas and G.Fiorentini +C +C Copyright (C) 2010-2014 European Commission +C C This file is part of Program DMM C -C DMM is free software developed at the Joint Research Centre of the -C European Commission: you can redistribute it and/or modify it under +C DMM is free software developed at the Joint Research Centre of the +C European Commission: you can redistribute it and/or modify it under C the terms of the GNU General Public License as published by C the Free Software Foundation, either version 3 of the License, or C (at your option) any later version. @@ -18,19 +18,19 @@ C MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the C GNU General Public License for more details. C C You should have received a copy of the GNU General Public License -C along with DMM. If not, see <http://www.gnu.org/licenses/>. -C ------------------------------------------------------------- - SUBROUTINE CONFUN(MODE,NCNLNS,NPAR,LDCJ,NEEDC,CHI,CC,CJAC, - , NNN,IU,U) -C Input - INTEGER MODE,NPAR,NCNLNS,LDCJ,NEEDC(NCNLNS),NNN - INTEGER*8 IU(72) - DOUBLE PRECISION U(IU(1)*(2*IU(4)+IU(5)+7)+3*IU(8)+2),CHI(NPAR) -C Output - DOUBLE PRECISION CC(LDCJ),CJAC(LDCJ,NPAR) - - CC(:) = 0.D0 - CJAC(:,:) = 0.D0 - - RETURN +C along with DMM. If not, see <http://www.gnu.org/licenses/>. +C ------------------------------------------------------------- + SUBROUTINE CONFUN(MODE,NCNLNS,NPAR,LDCJ,NEEDC,CHI,CC,CJAC, + , NNN,IU,U) +C Input + INTEGER MODE,NPAR,NCNLNS,LDCJ,NEEDC(NCNLNS),NNN + INTEGER*8 IU(72) + DOUBLE PRECISION U(IU(1)*(2*IU(4)+IU(5)+7)+3*IU(8)+2),CHI(NPAR) +C Output + DOUBLE PRECISION CC(LDCJ),CJAC(LDCJ,NPAR) + + CC(:) = 0.D0 + CJAC(:,:) = 0.D0 + + RETURN END diff --git a/cumnorm.for b/cumnorm.for index 94ca63fd90756df4159832dfc2b0995563f8714c..4645f476b9dd3ae7cb9cf580231386765ca877b8 100644 --- a/cumnorm.for +++ b/cumnorm.for @@ -1,14 +1,14 @@ -C ------------------------------------------------------------------------ -C CUMNORM returns the value of the cumulative (standard) -C Normal distribution function between -inf and X using erfc -C Developed by A.Rossi, C.Planas and G.Fiorentini -C -C Copyright (C) 2010-2014 European Commission -C +C ------------------------------------------------------------------------ +C CUMNORM returns the value of the cumulative (standard) +C Normal distribution function between -inf and X using erfc +C Developed by A.Rossi, C.Planas and G.Fiorentini +C +C Copyright (C) 2010-2014 European Commission +C C This file is part of Program DMM C -C DMM is free software developed at the Joint Research Centre of the -C European Commission: you can redistribute it and/or modify it under +C DMM is free software developed at the Joint Research Centre of the +C European Commission: you can redistribute it and/or modify it under C the terms of the GNU General Public License as published by C the Free Software Foundation, either version 3 of the License, or C (at your option) any later version. @@ -19,15 +19,15 @@ C MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the C GNU General Public License for more details. C C You should have received a copy of the GNU General Public License -C along with DMM. If not, see <http://www.gnu.org/licenses/>. -C -------------------------------------------------------------------------- - DOUBLE PRECISION FUNCTION cumnorm(X) -C INPUT - DOUBLE PRECISION X - - cumnorm = .5D0*erfc(-X/dsqrt(2.D0)) - - RETURN - END - - +C along with DMM. If not, see <http://www.gnu.org/licenses/>. +C -------------------------------------------------------------------------- + DOUBLE PRECISION FUNCTION cumnorm(X) +C INPUT + DOUBLE PRECISION X + + cumnorm = .5D0*erfc(-X/dsqrt(2.D0)) + + RETURN + END + + diff --git a/designz.for b/designz.for index 60a9bfbe4d8ef2844209170513d320efba327169..5d29e5d4ccf66b8fb9afb562c317275c70f1ee61 100644 --- a/designz.for +++ b/designz.for @@ -1,24 +1,24 @@ -C -------------------------------------------------------------------- -C DESIGNZ sets transition probs for latent variables using INFOS -C Developed by A.Rossi, C.Planas and G.Fiorentini -C -C by cols: S1,S2,...,Snv; with nv <=6 -C by row: the 1st contains the # of matrices affected by Si -C the 2nd-3rd etc point to c (1),H (2),G (3),a (4),F (5),R (6) -C the 8-th row contains the # of states -C the 9-th row spec the dynamics for Sj -C -C nstot: total # of states i.e. ns1 x ns2 x ...x nsv -C -C OUTPUT: P1,P2,...,P6 where -C Pk(i,j) = Pr[Sk(t+1)=i|Sk(t)=j], k = 1,2,...,min(6,nv) -C -C Copyright (C) 2010-2014 European Commission -C +C -------------------------------------------------------------------- +C DESIGNZ sets transition probs for latent variables using INFOS +C Developed by A.Rossi, C.Planas and G.Fiorentini +C +C by cols: S1,S2,...,Snv; with nv <=6 +C by row: the 1st contains the # of matrices affected by Si +C the 2nd-3rd etc point to c (1),H (2),G (3),a (4),F (5),R (6) +C the 8-th row contains the # of states +C the 9-th row spec the dynamics for Sj +C +C nstot: total # of states i.e. ns1 x ns2 x ...x nsv +C +C OUTPUT: P1,P2,...,P6 where +C Pk(i,j) = Pr[Sk(t+1)=i|Sk(t)=j], k = 1,2,...,min(6,nv) +C +C Copyright (C) 2010-2014 European Commission +C C This file is part of Program DMM C -C DMM is free software developed at the Joint Research Centre of the -C European Commission: you can redistribute it and/or modify it under +C DMM is free software developed at the Joint Research Centre of the +C European Commission: you can redistribute it and/or modify it under C the terms of the GNU General Public License as published by C the Free Software Foundation, either version 3 of the License, or C (at your option) any later version. @@ -29,377 +29,377 @@ C MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the C GNU General Public License for more details. C C You should have received a copy of the GNU General Public License -C along with DMM. If not, see <http://www.gnu.org/licenses/>. -C --------------------------------------------------------------------- - SUBROUTINE DESIGNZ(nv,np,psi,INFOS,P1,P2,P3,P4,P5,P6) -C INPUT - INTEGER nv,np,INFOS(9,6) - DOUBLE PRECISION psi(np) -C OUTPUT - DOUBLE PRECISION P1(INFOS(8,1),INFOS(8,1)), - 1 P2(INFOS(8,2),INFOS(8,2)),P3(INFOS(8,3),INFOS(8,3)), - 2 P4(INFOS(8,4),INFOS(8,4)),P5(INFOS(8,5),INFOS(8,5)), - 3 P6(INFOS(8,6),INFOS(8,6)) - -C LOCALS - INTEGER I,J,K - -C Transition probability matrix - K = 0 - IF (nv.EQ.1) THEN - - IF (INFOS(9,1).EQ.1) THEN ! S~IID - DO I = 1,INFOS(8,1)-1 - P1(I,:) = psi(K+I) - ENDDO - K = K + INFOS(8,1)-1 - ELSEIF (INFOS(9,1).EQ.2) THEN ! S~Markov - DO J = 1,INFOS(8,1) - DO I = 1,INFOS(8,1)-1 - P1(I,J) = psi(K+I) - ENDDO - K = K + INFOS(8,1)-1 - ENDDO - ENDIF - DO J = 1,INFOS(8,1) - P1(INFOS(8,1),J) = 1.D0-SUM(P1(1:INFOS(8,1)-1,J)) - ENDDO - - ELSEIF (nv.EQ.2) THEN - - IF (INFOS(9,1).EQ.1) THEN - DO I = 1,INFOS(8,1)-1 - P1(I,:) = psi(K+I) - ENDDO - K = K + INFOS(8,1)-1 - ELSEIF (INFOS(9,1).EQ.2) THEN - DO J = 1,INFOS(8,1) - DO I = 1,INFOS(8,1)-1 - P1(I,J) = psi(K+I) - ENDDO - K = K + INFOS(8,1)-1 - ENDDO - ENDIF - DO J = 1,INFOS(8,1) - P1(INFOS(8,1),J) = 1.D0-SUM(P1(1:INFOS(8,1)-1,J)) - ENDDO - IF (INFOS(9,2).EQ.1) THEN - DO I = 1,INFOS(8,2)-1 - P2(I,:) = psi(K+I) - ENDDO - K = K + INFOS(8,2)-1 - ELSEIF (INFOS(9,2).EQ.2) THEN - DO J = 1,INFOS(8,2) - DO I = 1,INFOS(8,2)-1 - P2(I,J) = psi(K+I) - ENDDO - K = K + INFOS(8,2)-1 - ENDDO - ENDIF - DO J = 1,INFOS(8,2) - P2(INFOS(8,2),J) = 1.D0-SUM(P2(1:INFOS(8,2)-1,J)) - ENDDO - - ELSEIF (nv.EQ.3) THEN - - IF (INFOS(9,1).EQ.1) THEN - DO I = 1,INFOS(8,1)-1 - P1(I,:) = psi(K+I) - ENDDO - K = K + INFOS(8,1)-1 - ELSEIF (INFOS(9,1).EQ.2) THEN - DO J = 1,INFOS(8,1) - DO I = 1,INFOS(8,1)-1 - P1(I,J) = psi(K+I) - ENDDO - K = K + INFOS(8,1)-1 - ENDDO - ENDIF - DO J = 1,INFOS(8,1) - P1(INFOS(8,1),J) = 1.D0-SUM(P1(1:INFOS(8,1)-1,J)) - ENDDO - IF (INFOS(9,2).EQ.1) THEN - DO I = 1,INFOS(8,2)-1 - P2(I,:) = psi(K+I) - ENDDO - K = K + INFOS(8,2)-1 - ELSEIF (INFOS(9,2).EQ.2) THEN - DO J = 1,INFOS(8,2) - DO I = 1,INFOS(8,2)-1 - P2(I,J) = psi(K+I) - ENDDO - K = K + INFOS(8,2)-1 - ENDDO - ENDIF - DO J = 1,INFOS(8,2) - P2(INFOS(8,2),J) = 1.D0-SUM(P2(1:INFOS(8,2)-1,J)) - ENDDO - IF (INFOS(9,3).EQ.1) THEN - DO I = 1,INFOS(8,3)-1 - P3(I,:) = psi(K+I) - ENDDO - K = K + INFOS(8,3)-1 - ELSEIF (INFOS(9,3).EQ.2) THEN - DO J = 1,INFOS(8,3) - DO I = 1,INFOS(8,3)-1 - P3(I,J) = psi(K+I) - ENDDO - K = K + INFOS(8,3)-1 - ENDDO - ENDIF - DO J = 1,INFOS(8,3) - P3(INFOS(8,3),J) = 1.D0-SUM(P3(1:INFOS(8,3)-1,J)) - ENDDO - - ELSEIF (nv.EQ.4) THEN - - IF (INFOS(9,1).EQ.1) THEN - DO I = 1,INFOS(8,1)-1 - P1(I,:) = psi(K+I) - ENDDO - K = K + INFOS(8,1)-1 - ELSEIF (INFOS(9,1).EQ.2) THEN - DO J = 1,INFOS(8,1) - DO I = 1,INFOS(8,1)-1 - P1(I,J) = psi(K+I) - ENDDO - K = K + INFOS(8,1)-1 - ENDDO - ENDIF - DO J = 1,INFOS(8,1) - P1(INFOS(8,1),J) = 1.D0-SUM(P1(1:INFOS(8,1)-1,J)) - ENDDO - IF (INFOS(9,2).EQ.1) THEN - DO I = 1,INFOS(8,2)-1 - P2(I,:) = psi(K+I) - ENDDO - K = K + INFOS(8,2)-1 - ELSEIF (INFOS(9,2).EQ.2) THEN - DO J = 1,INFOS(8,2) - DO I = 1,INFOS(8,2)-1 - P2(I,J) = psi(K+I) - ENDDO - K = K + INFOS(8,2)-1 - ENDDO - ENDIF - DO J = 1,INFOS(8,2) - P2(INFOS(8,2),J) = 1.D0-SUM(P2(1:INFOS(8,2)-1,J)) - ENDDO - IF (INFOS(9,3).EQ.1) THEN - DO I = 1,INFOS(8,3)-1 - P3(I,:) = psi(K+I) - ENDDO - K = K + INFOS(8,3)-1 - ELSEIF (INFOS(9,3).EQ.2) THEN - DO J = 1,INFOS(8,3) - DO I = 1,INFOS(8,3)-1 - P3(I,J) = psi(K+I) - ENDDO - K = K + INFOS(8,3)-1 - ENDDO - ENDIF - DO J = 1,INFOS(8,3) - P3(INFOS(8,3),J) = 1.D0-SUM(P3(1:INFOS(8,3)-1,J)) - ENDDO - IF (INFOS(9,4).EQ.1) THEN - DO I = 1,INFOS(8,4)-1 - P4(I,:) = psi(K+I) - ENDDO - K = K + INFOS(8,4)-1 - ELSEIF (INFOS(9,4).EQ.2) THEN - DO J = 1,INFOS(8,4) - DO I = 1,INFOS(8,4)-1 - P4(I,J) = psi(K+I) - ENDDO - K = K + INFOS(8,4)-1 - ENDDO - ENDIF - DO J = 1,INFOS(8,4) - P4(INFOS(8,4),J) = 1.D0-SUM(P4(1:INFOS(8,4)-1,J)) - ENDDO - - ELSEIF (nv.EQ.5) THEN - - IF (INFOS(9,1).EQ.1) THEN - DO I = 1,INFOS(8,1)-1 - P1(I,:) = psi(K+I) - ENDDO - K = K + INFOS(8,1)-1 - ELSEIF (INFOS(9,1).EQ.2) THEN - DO J = 1,INFOS(8,1) - DO I = 1,INFOS(8,1)-1 - P1(I,J) = psi(K+I) - ENDDO - K = K + INFOS(8,1)-1 - ENDDO - ENDIF - DO J = 1,INFOS(8,1) - P1(INFOS(8,1),J) = 1.D0-SUM(P1(1:INFOS(8,1)-1,J)) - ENDDO - IF (INFOS(9,2).EQ.1) THEN - DO I = 1,INFOS(8,2)-1 - P2(I,:) = psi(K+I) - ENDDO - K = K + INFOS(8,2)-1 - ELSEIF (INFOS(9,2).EQ.2) THEN - DO J = 1,INFOS(8,2) - DO I = 1,INFOS(8,2)-1 - P2(I,J) = psi(K+I) - ENDDO - K = K + INFOS(8,2)-1 - ENDDO - ENDIF - DO J = 1,INFOS(8,2) - P2(INFOS(8,2),J) = 1.D0-SUM(P2(1:INFOS(8,2)-1,J)) - ENDDO - IF (INFOS(9,3).EQ.1) THEN - DO I = 1,INFOS(8,3)-1 - P3(I,:) = psi(K+I) - ENDDO - K = K + INFOS(8,3)-1 - ELSEIF (INFOS(9,3).EQ.2) THEN - DO J = 1,INFOS(8,3) - DO I = 1,INFOS(8,3)-1 - P3(I,J) = psi(K+I) - ENDDO - K = K + INFOS(8,3)-1 - ENDDO - ENDIF - DO J = 1,INFOS(8,3) - P3(INFOS(8,3),J) = 1.D0-SUM(P3(1:INFOS(8,3)-1,J)) - ENDDO - IF (INFOS(9,4).EQ.1) THEN - DO I = 1,INFOS(8,4)-1 - P4(I,:) = psi(K+I) - ENDDO - K = K + INFOS(8,4)-1 - ELSEIF (INFOS(9,4).EQ.2) THEN - DO J = 1,INFOS(8,4) - DO I = 1,INFOS(8,4)-1 - P4(I,J) = psi(K+I) - ENDDO - K = K + INFOS(8,4)-1 - ENDDO - ENDIF - DO J = 1,INFOS(8,4) - P4(INFOS(8,4),J) = 1.D0-SUM(P4(1:INFOS(8,4)-1,J)) - ENDDO - IF (INFOS(9,5).EQ.1) THEN - DO I = 1,INFOS(8,5)-1 - P5(I,:) = psi(K+I) - ENDDO - K = K + INFOS(8,5)-1 - ELSEIF (INFOS(9,5).EQ.2) THEN - DO J = 1,INFOS(8,5) - DO I = 1,INFOS(8,5)-1 - P5(I,J) = psi(K+I) - ENDDO - K = K + INFOS(8,5)-1 - ENDDO - ENDIF - DO J = 1,INFOS(8,5) - P5(INFOS(8,5),J) = 1.D0-SUM(P5(1:INFOS(8,5)-1,J)) - ENDDO - - ELSEIF (nv.EQ.6) THEN - - IF (INFOS(9,1).EQ.1) THEN - DO I = 1,INFOS(8,1)-1 - P1(I,:) = psi(K+I) - ENDDO - K = K + INFOS(8,1)-1 - ELSEIF (INFOS(9,1).EQ.2) THEN - DO J = 1,INFOS(8,1) - DO I = 1,INFOS(8,1)-1 - P1(I,J) = psi(K+I) - ENDDO - K = K + INFOS(8,1)-1 - ENDDO - ENDIF - DO J = 1,INFOS(8,1) - P1(INFOS(8,1),J) = 1.D0-SUM(P1(1:INFOS(8,1)-1,J)) - ENDDO - IF (INFOS(9,2).EQ.1) THEN - DO I = 1,INFOS(8,2)-1 - P2(I,:) = psi(K+I) - ENDDO - K = K + INFOS(8,2)-1 - ELSEIF (INFOS(9,2).EQ.2) THEN - DO J = 1,INFOS(8,2) - DO I = 1,INFOS(8,2)-1 - P2(I,J) = psi(K+I) - ENDDO - K = K + INFOS(8,2)-1 - ENDDO - ENDIF - DO J = 1,INFOS(8,2) - P2(INFOS(8,2),J) = 1.D0-SUM(P2(1:INFOS(8,2)-1,J)) - ENDDO - IF (INFOS(9,3).EQ.1) THEN - DO I = 1,INFOS(8,3)-1 - P3(I,:) = psi(K+I) - ENDDO - K = K + INFOS(8,3)-1 - ELSEIF (INFOS(9,3).EQ.2) THEN - DO J = 1,INFOS(8,3) - DO I = 1,INFOS(8,3)-1 - P3(I,J) = psi(K+I) - ENDDO - K = K + INFOS(8,3)-1 - ENDDO - ENDIF - DO J = 1,INFOS(8,3) - P3(INFOS(8,3),J) = 1.D0-SUM(P3(1:INFOS(8,3)-1,J)) - ENDDO - IF (INFOS(9,4).EQ.1) THEN - DO I = 1,INFOS(8,4)-1 - P4(I,:) = psi(K+I) - ENDDO - K = K + INFOS(8,4)-1 - ELSEIF (INFOS(9,4).EQ.2) THEN - DO J = 1,INFOS(8,4) - DO I = 1,INFOS(8,4)-1 - P4(I,J) = psi(K+I) - ENDDO - K = K + INFOS(8,4)-1 - ENDDO - ENDIF - DO J = 1,INFOS(8,4) - P4(INFOS(8,4),J) = 1.D0-SUM(P4(1:INFOS(8,4)-1,J)) - ENDDO - IF (INFOS(9,5).EQ.1) THEN - DO I = 1,INFOS(8,5)-1 - P5(I,:) = psi(K+I) - ENDDO - K = K + INFOS(8,5)-1 - ELSEIF (INFOS(9,5).EQ.2) THEN - DO J = 1,INFOS(8,5) - DO I = 1,INFOS(8,5)-1 - P5(I,J) = psi(K+I) - ENDDO - K = K + INFOS(8,5)-1 - ENDDO - ENDIF - DO J = 1,INFOS(8,5) - P5(INFOS(8,5),J) = 1.D0-SUM(P5(1:INFOS(8,5)-1,J)) - ENDDO - IF (INFOS(9,6).EQ.1) THEN - DO I = 1,INFOS(8,6)-1 - P6(I,:) = psi(K+I) - ENDDO - K = K + INFOS(8,6)-1 - ELSEIF (INFOS(9,6).EQ.2) THEN - DO J = 1,INFOS(8,6) - DO I = 1,INFOS(8,6)-1 - P6(I,J) = psi(K+I) - ENDDO - K = K + INFOS(8,6)-1 - ENDDO - ENDIF - DO J = 1,INFOS(8,6) - P6(INFOS(8,6),J) = 1.D0-SUM(P6(1:INFOS(8,6)-1,J)) - ENDDO - ENDIF - - RETURN +C along with DMM. If not, see <http://www.gnu.org/licenses/>. +C --------------------------------------------------------------------- + SUBROUTINE DESIGNZ(nv,np,psi,INFOS,P1,P2,P3,P4,P5,P6) +C INPUT + INTEGER nv,np,INFOS(9,6) + DOUBLE PRECISION psi(np) +C OUTPUT + DOUBLE PRECISION P1(INFOS(8,1),INFOS(8,1)), + 1 P2(INFOS(8,2),INFOS(8,2)),P3(INFOS(8,3),INFOS(8,3)), + 2 P4(INFOS(8,4),INFOS(8,4)),P5(INFOS(8,5),INFOS(8,5)), + 3 P6(INFOS(8,6),INFOS(8,6)) + +C LOCALS + INTEGER I,J,K + +C Transition probability matrix + K = 0 + IF (nv.EQ.1) THEN + + IF (INFOS(9,1).EQ.1) THEN ! S~IID + DO I = 1,INFOS(8,1)-1 + P1(I,:) = psi(K+I) + ENDDO + K = K + INFOS(8,1)-1 + ELSEIF (INFOS(9,1).EQ.2) THEN ! S~Markov + DO J = 1,INFOS(8,1) + DO I = 1,INFOS(8,1)-1 + P1(I,J) = psi(K+I) + ENDDO + K = K + INFOS(8,1)-1 + ENDDO + ENDIF + DO J = 1,INFOS(8,1) + P1(INFOS(8,1),J) = 1.D0-SUM(P1(1:INFOS(8,1)-1,J)) + ENDDO + + ELSEIF (nv.EQ.2) THEN + + IF (INFOS(9,1).EQ.1) THEN + DO I = 1,INFOS(8,1)-1 + P1(I,:) = psi(K+I) + ENDDO + K = K + INFOS(8,1)-1 + ELSEIF (INFOS(9,1).EQ.2) THEN + DO J = 1,INFOS(8,1) + DO I = 1,INFOS(8,1)-1 + P1(I,J) = psi(K+I) + ENDDO + K = K + INFOS(8,1)-1 + ENDDO + ENDIF + DO J = 1,INFOS(8,1) + P1(INFOS(8,1),J) = 1.D0-SUM(P1(1:INFOS(8,1)-1,J)) + ENDDO + IF (INFOS(9,2).EQ.1) THEN + DO I = 1,INFOS(8,2)-1 + P2(I,:) = psi(K+I) + ENDDO + K = K + INFOS(8,2)-1 + ELSEIF (INFOS(9,2).EQ.2) THEN + DO J = 1,INFOS(8,2) + DO I = 1,INFOS(8,2)-1 + P2(I,J) = psi(K+I) + ENDDO + K = K + INFOS(8,2)-1 + ENDDO + ENDIF + DO J = 1,INFOS(8,2) + P2(INFOS(8,2),J) = 1.D0-SUM(P2(1:INFOS(8,2)-1,J)) + ENDDO + + ELSEIF (nv.EQ.3) THEN + + IF (INFOS(9,1).EQ.1) THEN + DO I = 1,INFOS(8,1)-1 + P1(I,:) = psi(K+I) + ENDDO + K = K + INFOS(8,1)-1 + ELSEIF (INFOS(9,1).EQ.2) THEN + DO J = 1,INFOS(8,1) + DO I = 1,INFOS(8,1)-1 + P1(I,J) = psi(K+I) + ENDDO + K = K + INFOS(8,1)-1 + ENDDO + ENDIF + DO J = 1,INFOS(8,1) + P1(INFOS(8,1),J) = 1.D0-SUM(P1(1:INFOS(8,1)-1,J)) + ENDDO + IF (INFOS(9,2).EQ.1) THEN + DO I = 1,INFOS(8,2)-1 + P2(I,:) = psi(K+I) + ENDDO + K = K + INFOS(8,2)-1 + ELSEIF (INFOS(9,2).EQ.2) THEN + DO J = 1,INFOS(8,2) + DO I = 1,INFOS(8,2)-1 + P2(I,J) = psi(K+I) + ENDDO + K = K + INFOS(8,2)-1 + ENDDO + ENDIF + DO J = 1,INFOS(8,2) + P2(INFOS(8,2),J) = 1.D0-SUM(P2(1:INFOS(8,2)-1,J)) + ENDDO + IF (INFOS(9,3).EQ.1) THEN + DO I = 1,INFOS(8,3)-1 + P3(I,:) = psi(K+I) + ENDDO + K = K + INFOS(8,3)-1 + ELSEIF (INFOS(9,3).EQ.2) THEN + DO J = 1,INFOS(8,3) + DO I = 1,INFOS(8,3)-1 + P3(I,J) = psi(K+I) + ENDDO + K = K + INFOS(8,3)-1 + ENDDO + ENDIF + DO J = 1,INFOS(8,3) + P3(INFOS(8,3),J) = 1.D0-SUM(P3(1:INFOS(8,3)-1,J)) + ENDDO + + ELSEIF (nv.EQ.4) THEN + + IF (INFOS(9,1).EQ.1) THEN + DO I = 1,INFOS(8,1)-1 + P1(I,:) = psi(K+I) + ENDDO + K = K + INFOS(8,1)-1 + ELSEIF (INFOS(9,1).EQ.2) THEN + DO J = 1,INFOS(8,1) + DO I = 1,INFOS(8,1)-1 + P1(I,J) = psi(K+I) + ENDDO + K = K + INFOS(8,1)-1 + ENDDO + ENDIF + DO J = 1,INFOS(8,1) + P1(INFOS(8,1),J) = 1.D0-SUM(P1(1:INFOS(8,1)-1,J)) + ENDDO + IF (INFOS(9,2).EQ.1) THEN + DO I = 1,INFOS(8,2)-1 + P2(I,:) = psi(K+I) + ENDDO + K = K + INFOS(8,2)-1 + ELSEIF (INFOS(9,2).EQ.2) THEN + DO J = 1,INFOS(8,2) + DO I = 1,INFOS(8,2)-1 + P2(I,J) = psi(K+I) + ENDDO + K = K + INFOS(8,2)-1 + ENDDO + ENDIF + DO J = 1,INFOS(8,2) + P2(INFOS(8,2),J) = 1.D0-SUM(P2(1:INFOS(8,2)-1,J)) + ENDDO + IF (INFOS(9,3).EQ.1) THEN + DO I = 1,INFOS(8,3)-1 + P3(I,:) = psi(K+I) + ENDDO + K = K + INFOS(8,3)-1 + ELSEIF (INFOS(9,3).EQ.2) THEN + DO J = 1,INFOS(8,3) + DO I = 1,INFOS(8,3)-1 + P3(I,J) = psi(K+I) + ENDDO + K = K + INFOS(8,3)-1 + ENDDO + ENDIF + DO J = 1,INFOS(8,3) + P3(INFOS(8,3),J) = 1.D0-SUM(P3(1:INFOS(8,3)-1,J)) + ENDDO + IF (INFOS(9,4).EQ.1) THEN + DO I = 1,INFOS(8,4)-1 + P4(I,:) = psi(K+I) + ENDDO + K = K + INFOS(8,4)-1 + ELSEIF (INFOS(9,4).EQ.2) THEN + DO J = 1,INFOS(8,4) + DO I = 1,INFOS(8,4)-1 + P4(I,J) = psi(K+I) + ENDDO + K = K + INFOS(8,4)-1 + ENDDO + ENDIF + DO J = 1,INFOS(8,4) + P4(INFOS(8,4),J) = 1.D0-SUM(P4(1:INFOS(8,4)-1,J)) + ENDDO + + ELSEIF (nv.EQ.5) THEN + + IF (INFOS(9,1).EQ.1) THEN + DO I = 1,INFOS(8,1)-1 + P1(I,:) = psi(K+I) + ENDDO + K = K + INFOS(8,1)-1 + ELSEIF (INFOS(9,1).EQ.2) THEN + DO J = 1,INFOS(8,1) + DO I = 1,INFOS(8,1)-1 + P1(I,J) = psi(K+I) + ENDDO + K = K + INFOS(8,1)-1 + ENDDO + ENDIF + DO J = 1,INFOS(8,1) + P1(INFOS(8,1),J) = 1.D0-SUM(P1(1:INFOS(8,1)-1,J)) + ENDDO + IF (INFOS(9,2).EQ.1) THEN + DO I = 1,INFOS(8,2)-1 + P2(I,:) = psi(K+I) + ENDDO + K = K + INFOS(8,2)-1 + ELSEIF (INFOS(9,2).EQ.2) THEN + DO J = 1,INFOS(8,2) + DO I = 1,INFOS(8,2)-1 + P2(I,J) = psi(K+I) + ENDDO + K = K + INFOS(8,2)-1 + ENDDO + ENDIF + DO J = 1,INFOS(8,2) + P2(INFOS(8,2),J) = 1.D0-SUM(P2(1:INFOS(8,2)-1,J)) + ENDDO + IF (INFOS(9,3).EQ.1) THEN + DO I = 1,INFOS(8,3)-1 + P3(I,:) = psi(K+I) + ENDDO + K = K + INFOS(8,3)-1 + ELSEIF (INFOS(9,3).EQ.2) THEN + DO J = 1,INFOS(8,3) + DO I = 1,INFOS(8,3)-1 + P3(I,J) = psi(K+I) + ENDDO + K = K + INFOS(8,3)-1 + ENDDO + ENDIF + DO J = 1,INFOS(8,3) + P3(INFOS(8,3),J) = 1.D0-SUM(P3(1:INFOS(8,3)-1,J)) + ENDDO + IF (INFOS(9,4).EQ.1) THEN + DO I = 1,INFOS(8,4)-1 + P4(I,:) = psi(K+I) + ENDDO + K = K + INFOS(8,4)-1 + ELSEIF (INFOS(9,4).EQ.2) THEN + DO J = 1,INFOS(8,4) + DO I = 1,INFOS(8,4)-1 + P4(I,J) = psi(K+I) + ENDDO + K = K + INFOS(8,4)-1 + ENDDO + ENDIF + DO J = 1,INFOS(8,4) + P4(INFOS(8,4),J) = 1.D0-SUM(P4(1:INFOS(8,4)-1,J)) + ENDDO + IF (INFOS(9,5).EQ.1) THEN + DO I = 1,INFOS(8,5)-1 + P5(I,:) = psi(K+I) + ENDDO + K = K + INFOS(8,5)-1 + ELSEIF (INFOS(9,5).EQ.2) THEN + DO J = 1,INFOS(8,5) + DO I = 1,INFOS(8,5)-1 + P5(I,J) = psi(K+I) + ENDDO + K = K + INFOS(8,5)-1 + ENDDO + ENDIF + DO J = 1,INFOS(8,5) + P5(INFOS(8,5),J) = 1.D0-SUM(P5(1:INFOS(8,5)-1,J)) + ENDDO + + ELSEIF (nv.EQ.6) THEN + + IF (INFOS(9,1).EQ.1) THEN + DO I = 1,INFOS(8,1)-1 + P1(I,:) = psi(K+I) + ENDDO + K = K + INFOS(8,1)-1 + ELSEIF (INFOS(9,1).EQ.2) THEN + DO J = 1,INFOS(8,1) + DO I = 1,INFOS(8,1)-1 + P1(I,J) = psi(K+I) + ENDDO + K = K + INFOS(8,1)-1 + ENDDO + ENDIF + DO J = 1,INFOS(8,1) + P1(INFOS(8,1),J) = 1.D0-SUM(P1(1:INFOS(8,1)-1,J)) + ENDDO + IF (INFOS(9,2).EQ.1) THEN + DO I = 1,INFOS(8,2)-1 + P2(I,:) = psi(K+I) + ENDDO + K = K + INFOS(8,2)-1 + ELSEIF (INFOS(9,2).EQ.2) THEN + DO J = 1,INFOS(8,2) + DO I = 1,INFOS(8,2)-1 + P2(I,J) = psi(K+I) + ENDDO + K = K + INFOS(8,2)-1 + ENDDO + ENDIF + DO J = 1,INFOS(8,2) + P2(INFOS(8,2),J) = 1.D0-SUM(P2(1:INFOS(8,2)-1,J)) + ENDDO + IF (INFOS(9,3).EQ.1) THEN + DO I = 1,INFOS(8,3)-1 + P3(I,:) = psi(K+I) + ENDDO + K = K + INFOS(8,3)-1 + ELSEIF (INFOS(9,3).EQ.2) THEN + DO J = 1,INFOS(8,3) + DO I = 1,INFOS(8,3)-1 + P3(I,J) = psi(K+I) + ENDDO + K = K + INFOS(8,3)-1 + ENDDO + ENDIF + DO J = 1,INFOS(8,3) + P3(INFOS(8,3),J) = 1.D0-SUM(P3(1:INFOS(8,3)-1,J)) + ENDDO + IF (INFOS(9,4).EQ.1) THEN + DO I = 1,INFOS(8,4)-1 + P4(I,:) = psi(K+I) + ENDDO + K = K + INFOS(8,4)-1 + ELSEIF (INFOS(9,4).EQ.2) THEN + DO J = 1,INFOS(8,4) + DO I = 1,INFOS(8,4)-1 + P4(I,J) = psi(K+I) + ENDDO + K = K + INFOS(8,4)-1 + ENDDO + ENDIF + DO J = 1,INFOS(8,4) + P4(INFOS(8,4),J) = 1.D0-SUM(P4(1:INFOS(8,4)-1,J)) + ENDDO + IF (INFOS(9,5).EQ.1) THEN + DO I = 1,INFOS(8,5)-1 + P5(I,:) = psi(K+I) + ENDDO + K = K + INFOS(8,5)-1 + ELSEIF (INFOS(9,5).EQ.2) THEN + DO J = 1,INFOS(8,5) + DO I = 1,INFOS(8,5)-1 + P5(I,J) = psi(K+I) + ENDDO + K = K + INFOS(8,5)-1 + ENDDO + ENDIF + DO J = 1,INFOS(8,5) + P5(INFOS(8,5),J) = 1.D0-SUM(P5(1:INFOS(8,5)-1,J)) + ENDDO + IF (INFOS(9,6).EQ.1) THEN + DO I = 1,INFOS(8,6)-1 + P6(I,:) = psi(K+I) + ENDDO + K = K + INFOS(8,6)-1 + ELSEIF (INFOS(9,6).EQ.2) THEN + DO J = 1,INFOS(8,6) + DO I = 1,INFOS(8,6)-1 + P6(I,J) = psi(K+I) + ENDDO + K = K + INFOS(8,6)-1 + ENDDO + ENDIF + DO J = 1,INFOS(8,6) + P6(INFOS(8,6),J) = 1.D0-SUM(P6(1:INFOS(8,6)-1,J)) + ENDDO + ENDIF + + RETURN END diff --git a/drawpsi.for b/drawpsi.for index b54d50e49a7bd628a9e73fd0befb2440a02fcc86..a95d9029b6c52463a3b09574d98137c06d30dcd1 100644 --- a/drawpsi.for +++ b/drawpsi.for @@ -1,47 +1,47 @@ -C ---------------------------------------------------------------------- -C DRAWS parameters PSI conditionally on S -C Developed by A.Rossi, C.Planas and G.Fiorentini -C -C p(theta,psi|Y,S,z) propto p(theta|Y,S,z) x p(psi|S) -C -C State-space format: y(t) = c(t)z(t) + H(t)x(t) + G(t)u(t) -C x(t) = a(t) + F(t)x(t-1) + R(t)u(t) -C -C y(t) (ny x 1) ny = # of endogenous series -C z(t) (nz x 1) nz = # of exogenous series -C x(t) (nx x 1) nx = # of continous states -C u(t) (nu x 1) nu = # of shocks -C c(t) (ny x nz x ns1) ns1 = # of states for c(t) -C H(t) (ny x nx x ns2) ns2 = # of states for H(t) -C G(t) (ny x nu x ns3) ns3 = # of states for G(t) -C a(t) (nx x ns4) ns4 = # of states for a(t) -C F(t) (nx x nx x ns5) ns5 = # of states for F(t) -C R(t) (nx x nu x ns6) ns6 = # of states for R(t) -C -C FURTHER INPUT: -C -C nobs: # of observations -C d: order of integration of the system -C nv: # of discrete latent variables (S1,S2,...) -C nt: dimension of parameter theta -C Z: discrete latent var -C theta0: previous value of theta -C INFOS (9 x 6): -C by cols: S1,S2,...,Snv; with nv <=6 -C by row: the 1st contains the # of matrices affected by Si -C the 2nd-3rd etc point to c (1),H (2),G (3),a (4),F (5),R (6) -C the 8-th row contains the # of states -C the 9-th row spec. the dynamic of S -C -C OUTPUT: -C PSI (np(1) x 1) -C -C Copyright (C) 2010-2014 European Commission -C +C ---------------------------------------------------------------------- +C DRAWS parameters PSI conditionally on S +C Developed by A.Rossi, C.Planas and G.Fiorentini +C +C p(theta,psi|Y,S,z) propto p(theta|Y,S,z) x p(psi|S) +C +C State-space format: y(t) = c(t)z(t) + H(t)x(t) + G(t)u(t) +C x(t) = a(t) + F(t)x(t-1) + R(t)u(t) +C +C y(t) (ny x 1) ny = # of endogenous series +C z(t) (nz x 1) nz = # of exogenous series +C x(t) (nx x 1) nx = # of continous states +C u(t) (nu x 1) nu = # of shocks +C c(t) (ny x nz x ns1) ns1 = # of states for c(t) +C H(t) (ny x nx x ns2) ns2 = # of states for H(t) +C G(t) (ny x nu x ns3) ns3 = # of states for G(t) +C a(t) (nx x ns4) ns4 = # of states for a(t) +C F(t) (nx x nx x ns5) ns5 = # of states for F(t) +C R(t) (nx x nu x ns6) ns6 = # of states for R(t) +C +C FURTHER INPUT: +C +C nobs: # of observations +C d: order of integration of the system +C nv: # of discrete latent variables (S1,S2,...) +C nt: dimension of parameter theta +C Z: discrete latent var +C theta0: previous value of theta +C INFOS (9 x 6): +C by cols: S1,S2,...,Snv; with nv <=6 +C by row: the 1st contains the # of matrices affected by Si +C the 2nd-3rd etc point to c (1),H (2),G (3),a (4),F (5),R (6) +C the 8-th row contains the # of states +C the 9-th row spec. the dynamic of S +C +C OUTPUT: +C PSI (np(1) x 1) +C +C Copyright (C) 2010-2014 European Commission +C C This file is part of Program DMM C -C DMM is free software developed at the Joint Research Centre of the -C European Commission: you can redistribute it and/or modify it under +C DMM is free software developed at the Joint Research Centre of the +C European Commission: you can redistribute it and/or modify it under C the terms of the GNU General Public License as published by C the Free Software Foundation, either version 3 of the License, or C (at your option) any later version. @@ -52,105 +52,105 @@ C MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the C GNU General Public License for more details. C C You should have received a copy of the GNU General Public License -C along with DMM. If not, see <http://www.gnu.org/licenses/>. -C ---------------------------------------------------------------------- - SUBROUTINE DRAWPSI(nobs,nv,np,INFOS,Z,psiprior,psi0,psi) - -C INPUT - INTEGER nobs,nv,np(3),Z(nobs),INFOS(9,6) - DOUBLE PRECISION psiprior(np(2),np(3)),psi0(np(1)) -C OUTPUT - DOUBLE PRECISION psi(np(1)) -C LOCALS - INTEGER I,K,ii,jj,NN,NSI,IFAIL,SEQ(nobs,nv) - INTEGER,ALLOCATABLE:: NIJ(:,:) - INTEGER S(nobs,6) - DOUBLE PRECISION, ALLOCATABLE:: P1(:,:),P2(:,:),P3(:,:),P4(:,:), - 1 P5(:,:),P6(:,:),PENEW(:),PEOLD(:),GAM(:) - DOUBLE PRECISION uv,v,AG - DOUBLE PRECISION genunf,gengam -C DOUBLE PRECISION G05CAF - - ALLOCATE(P1(INFOS(8,1),INFOS(8,1)), - 1 P2(INFOS(8,2),INFOS(8,2)),P3(INFOS(8,3),INFOS(8,3)), - 2 P4(INFOS(8,4),INFOS(8,4)),P5(INFOS(8,5),INFOS(8,5)), - 3 P6(INFOS(8,6),INFOS(8,6))) - - DO 1 I = 1,nobs -1 CALL INT2SEQ(Z(I),nv,INFOS,SEQ(I,1:nv),S(I,1:6)) - - psi(:) = 0.D0 - NN = 0 - K = 0 - DO 100 I = 1,nv - NSI = INFOS(8,I) ! # of states for SI - ALLOCATE(GAM(NSI)) - IF (INFOS(9,I).EQ.1) THEN ! S~IID -C SAMPLING FROM DIRICHLET - DO 5 ii = 1,NSI - AG = SUM(ABS((SEQ(1:nobs,I).EQ.ii)))+psiprior(K+1,ii) - IFAIL = -1 -C 5 CALL G05FFF(AG,1.D0,1,GAM(ii),IFAIL) -5 GAM(ii) = gengam(1.D0,AG) - psi(NN+1:NN+NSI-1) = GAM(1:NSI-1)/SUM(GAM(1:NSI)) - psi0(NN+1:NN+NSI-1) = psi(NN+1:NN+NSI-1) - K = K + 1 - NN = NN + NSI-1 - ELSEIF (INFOS(9,I).EQ.2) THEN ! S~Markov - ALLOCATE(NIJ(NSI,NSI),PENEW(NSI),PEOLD(NSI)) - DO 50 jj = 1,NSI - DO 10 ii = 1,NSI -10 NIJ(ii,jj) = SUM(ABS((SEQ(2:nobs,I).EQ.ii).AND. - # (SEQ(1:nobs-1,I).EQ.jj))) -C SAMPLING FROM DIRICHLET - DO 20 ii = 1,NSI - AG = NIJ(ii,jj) + psiprior(K+1,ii) - IFAIL = -1 -C20 CALL G05FFF(AG,1.D0,1,GAM(ii),IFAIL) -20 GAM(ii) = gengam(1.D0,AG) - psi(NN+1:NN+NSI-1) = GAM(1:NSI-1)/SUM(GAM(1:NSI)) - K = K + 1 -50 NN = NN + NSI-1 -C METROPOLIS TO ADJUST INITIAL CONDITION P(S(1)=0|p11,p12,...) - CALL DESIGNZ(nv,np(1),psi,INFOS,P1,P2,P3,P4,P5,P6) !new - IF (I.EQ.1) THEN - CALL ERGODIC(NSI,P1,PENEW(1:NSI)) - ELSEIF (I.EQ.2) THEN - CALL ERGODIC(NSI,P2,PENEW(1:NSI)) - ELSEIF (I.EQ.3) THEN - CALL ERGODIC(NSI,P3,PENEW(1:NSI)) - ELSEIF (I.EQ.4) THEN - CALL ERGODIC(NSI,P4,PENEW(1:NSI)) - ELSEIF (I.EQ.5) THEN - CALL ERGODIC(NSI,P5,PENEW(1:NSI)) - ELSE - CALL ERGODIC(NSI,P6,PENEW(1:NSI)) - ENDIF - CALL DESIGNZ(nv,np(1),psi0,INFOS,P1,P2,P3,P4,P5,P6) !old - IF (I.EQ.1) THEN - CALL ERGODIC(NSI,P1,PEOLD(1:NSI)) - ELSEIF (I.EQ.2) THEN - CALL ERGODIC(NSI,P2,PEOLD(1:NSI)) - ELSEIF (I.EQ.3) THEN - CALL ERGODIC(NSI,P3,PEOLD(1:NSI)) - ELSEIF (I.EQ.4) THEN - CALL ERGODIC(NSI,P4,PEOLD(1:NSI)) - ELSEIF (I.EQ.5) THEN - CALL ERGODIC(NSI,P5,PEOLD(1:NSI)) - ELSE - CALL ERGODIC(NSI,P6,PEOLD(1:NSI)) - ENDIF - uv = min(1.D0,PENEW(SEQ(1,I))/PEOLD(SEQ(1,I))) -C v = G05CAF(v) - v = genunf(0.D0,1.D0) ! U(0,1) - IF (v.GT.uv) THEN - psi(NN-NSI*(NSI-1)+1:NN) = psi0(NN-NSI*(NSI-1)+1:NN) - ENDIF - psi0(NN-NSI*(NSI-1)+1:NN) = psi(NN-NSI*(NSI-1)+1:NN) - DEALLOCATE(NIJ,PENEW,PEOLD) - ENDIF -100 DEALLOCATE(GAM) - DEALLOCATE(P1,P2,P3,P4,P5,P6) - - RETURN +C along with DMM. If not, see <http://www.gnu.org/licenses/>. +C ---------------------------------------------------------------------- + SUBROUTINE DRAWPSI(nobs,nv,np,INFOS,Z,psiprior,psi0,psi) + +C INPUT + INTEGER nobs,nv,np(3),Z(nobs),INFOS(9,6) + DOUBLE PRECISION psiprior(np(2),np(3)),psi0(np(1)) +C OUTPUT + DOUBLE PRECISION psi(np(1)) +C LOCALS + INTEGER I,K,ii,jj,NN,NSI,IFAIL,SEQ(nobs,nv) + INTEGER,ALLOCATABLE:: NIJ(:,:) + INTEGER S(nobs,6) + DOUBLE PRECISION, ALLOCATABLE:: P1(:,:),P2(:,:),P3(:,:),P4(:,:), + 1 P5(:,:),P6(:,:),PENEW(:),PEOLD(:),GAM(:) + DOUBLE PRECISION uv,v,AG + DOUBLE PRECISION genunf,gengam +C DOUBLE PRECISION G05CAF + + ALLOCATE(P1(INFOS(8,1),INFOS(8,1)), + 1 P2(INFOS(8,2),INFOS(8,2)),P3(INFOS(8,3),INFOS(8,3)), + 2 P4(INFOS(8,4),INFOS(8,4)),P5(INFOS(8,5),INFOS(8,5)), + 3 P6(INFOS(8,6),INFOS(8,6))) + + DO 1 I = 1,nobs +1 CALL INT2SEQ(Z(I),nv,INFOS,SEQ(I,1:nv),S(I,1:6)) + + psi(:) = 0.D0 + NN = 0 + K = 0 + DO 100 I = 1,nv + NSI = INFOS(8,I) ! # of states for SI + ALLOCATE(GAM(NSI)) + IF (INFOS(9,I).EQ.1) THEN ! S~IID +C SAMPLING FROM DIRICHLET + DO 5 ii = 1,NSI + AG = SUM(ABS((SEQ(1:nobs,I).EQ.ii)))+psiprior(K+1,ii) + IFAIL = -1 +C 5 CALL G05FFF(AG,1.D0,1,GAM(ii),IFAIL) +5 GAM(ii) = gengam(1.D0,AG) + psi(NN+1:NN+NSI-1) = GAM(1:NSI-1)/SUM(GAM(1:NSI)) + psi0(NN+1:NN+NSI-1) = psi(NN+1:NN+NSI-1) + K = K + 1 + NN = NN + NSI-1 + ELSEIF (INFOS(9,I).EQ.2) THEN ! S~Markov + ALLOCATE(NIJ(NSI,NSI),PENEW(NSI),PEOLD(NSI)) + DO 50 jj = 1,NSI + DO 10 ii = 1,NSI +10 NIJ(ii,jj) = SUM(ABS((SEQ(2:nobs,I).EQ.ii).AND. + # (SEQ(1:nobs-1,I).EQ.jj))) +C SAMPLING FROM DIRICHLET + DO 20 ii = 1,NSI + AG = NIJ(ii,jj) + psiprior(K+1,ii) + IFAIL = -1 +C20 CALL G05FFF(AG,1.D0,1,GAM(ii),IFAIL) +20 GAM(ii) = gengam(1.D0,AG) + psi(NN+1:NN+NSI-1) = GAM(1:NSI-1)/SUM(GAM(1:NSI)) + K = K + 1 +50 NN = NN + NSI-1 +C METROPOLIS TO ADJUST INITIAL CONDITION P(S(1)=0|p11,p12,...) + CALL DESIGNZ(nv,np(1),psi,INFOS,P1,P2,P3,P4,P5,P6) !new + IF (I.EQ.1) THEN + CALL ERGODIC(NSI,P1,PENEW(1:NSI)) + ELSEIF (I.EQ.2) THEN + CALL ERGODIC(NSI,P2,PENEW(1:NSI)) + ELSEIF (I.EQ.3) THEN + CALL ERGODIC(NSI,P3,PENEW(1:NSI)) + ELSEIF (I.EQ.4) THEN + CALL ERGODIC(NSI,P4,PENEW(1:NSI)) + ELSEIF (I.EQ.5) THEN + CALL ERGODIC(NSI,P5,PENEW(1:NSI)) + ELSE + CALL ERGODIC(NSI,P6,PENEW(1:NSI)) + ENDIF + CALL DESIGNZ(nv,np(1),psi0,INFOS,P1,P2,P3,P4,P5,P6) !old + IF (I.EQ.1) THEN + CALL ERGODIC(NSI,P1,PEOLD(1:NSI)) + ELSEIF (I.EQ.2) THEN + CALL ERGODIC(NSI,P2,PEOLD(1:NSI)) + ELSEIF (I.EQ.3) THEN + CALL ERGODIC(NSI,P3,PEOLD(1:NSI)) + ELSEIF (I.EQ.4) THEN + CALL ERGODIC(NSI,P4,PEOLD(1:NSI)) + ELSEIF (I.EQ.5) THEN + CALL ERGODIC(NSI,P5,PEOLD(1:NSI)) + ELSE + CALL ERGODIC(NSI,P6,PEOLD(1:NSI)) + ENDIF + uv = min(1.D0,PENEW(SEQ(1,I))/PEOLD(SEQ(1,I))) +C v = G05CAF(v) + v = genunf(0.D0,1.D0) ! U(0,1) + IF (v.GT.uv) THEN + psi(NN-NSI*(NSI-1)+1:NN) = psi0(NN-NSI*(NSI-1)+1:NN) + ENDIF + psi0(NN-NSI*(NSI-1)+1:NN) = psi(NN-NSI*(NSI-1)+1:NN) + DEALLOCATE(NIJ,PENEW,PEOLD) + ENDIF +100 DEALLOCATE(GAM) + DEALLOCATE(P1,P2,P3,P4,P5,P6) + + RETURN END diff --git a/drawtheta.for b/drawtheta.for index 7848c0226a5fcaea32c5a8e0b3d4a5d2cfde7bc6..91470035c50841d24a444b14964a50422e125e92 100644 --- a/drawtheta.for +++ b/drawtheta.for @@ -1,32 +1,32 @@ -C ---------------------------------------------------------------------- -C DRAWTHETA draws model parameters theta -C Developed by A.Rossi, C.Planas and G.Fiorentini -C p(theta|Y,S,z) propto p(theta|Y,S,z) -C -C State-space format: y(t) = c(t)z(t) + H(t)x(t) + G(t)u(t) -C x(t) = a(t) + F(t)x(t-1) + R(t)u(t) -C -C y(t) (ny x 1) ny = # of endogenous series -C z(t) (nz x 1) nz = # of exogenous series -C x(t) (nx x 1) nx = # of continous states -C u(t) (nu x 1) nu = # of shocks -C c(t) (ny x nz x ns1) ns1 = # of states for c(t) -C H(t) (ny x nx x ns2) ns2 = # of states for H(t) -C G(t) (ny x nu x ns3) ns3 = # of states for G(t) -C a(t) (nx x ns4) ns4 = # of states for a(t) -C F(t) (nx x nx x ns5) ns5 = # of states for F(t) -C R(t) (nx x nu x ns6) ns6 = # of states for R(t) -C -C OUTPUT: -C theta (nt x 1) -C NEVAL # of runs of the Kalman Filter (KF) / MH acceptance prob -C -C Copyright (C) 2010-2014 European Commission -C +C ---------------------------------------------------------------------- +C DRAWTHETA draws model parameters theta +C Developed by A.Rossi, C.Planas and G.Fiorentini +C p(theta|Y,S,z) propto p(theta|Y,S,z) +C +C State-space format: y(t) = c(t)z(t) + H(t)x(t) + G(t)u(t) +C x(t) = a(t) + F(t)x(t-1) + R(t)u(t) +C +C y(t) (ny x 1) ny = # of endogenous series +C z(t) (nz x 1) nz = # of exogenous series +C x(t) (nx x 1) nx = # of continous states +C u(t) (nu x 1) nu = # of shocks +C c(t) (ny x nz x ns1) ns1 = # of states for c(t) +C H(t) (ny x nx x ns2) ns2 = # of states for H(t) +C G(t) (ny x nu x ns3) ns3 = # of states for G(t) +C a(t) (nx x ns4) ns4 = # of states for a(t) +C F(t) (nx x nx x ns5) ns5 = # of states for F(t) +C R(t) (nx x nu x ns6) ns6 = # of states for R(t) +C +C OUTPUT: +C theta (nt x 1) +C NEVAL # of runs of the Kalman Filter (KF) / MH acceptance prob +C +C Copyright (C) 2010-2014 European Commission +C C This file is part of Program DMM C -C DMM is free software developed at the Joint Research Centre of the -C European Commission: you can redistribute it and/or modify it under +C DMM is free software developed at the Joint Research Centre of the +C European Commission: you can redistribute it and/or modify it under C the terms of the GNU General Public License as published by C the Free Software Foundation, either version 3 of the License, or C (at your option) any later version. @@ -37,133 +37,133 @@ C MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the C GNU General Public License for more details. C C You should have received a copy of the GNU General Public License -C along with DMM. If not, see <http://www.gnu.org/licenses/>. -C ---------------------------------------------------------------------- - SUBROUTINE DRAWTHETA(nobs,d,ny,nz,nx,nu,nv,ns,nt,INFOS,INDT, - 1 MEDT,SIGT,yk,IYK,Z,thetaprior,tipo,pdll, - 2 theta0,theta,NEVAL) -C INPUT - CHARACTER*1 fittizia - POINTER (pdll,fittizia) - INTEGER nobs,d(2),ny,nz,nx,nu,nv,ns(6),nt,Z(nobs), - 1 IYK(nobs,ny+1),INFOS(9,6),INDT(nt+2) - DOUBLE PRECISION yk(nobs,ny+nz),thetaprior(nt,4),theta0(nt) - DOUBLE PRECISION MEDT(max(1,INDT(nt+1))), - 1 SIGT(max(1,INDT(nt+1)),max(1,INDT(nt+1))) - - CHARACTER*2 tipo(nt) -C OUTPUT - INTEGER NEVAL(nt) - DOUBLE PRECISION theta(nt) -C LOCALS - INTEGER I,J,jj,NN,IFAIL,SEQ(nv) - INTEGER it,S(nobs,6) - DOUBLE PRECISION PN,PO,QN,QO,PA,v,AG,WORK((nt+2)*(nt+1)/2), - 1 SEGA(nt),WORK2(nt) - DOUBLE PRECISION genunf,ptheta,prior,mvnpdf -C DOUBLE PRECISION G05CAF - IF (nv.GT.0) THEN - DO 1 I = 1,nobs -1 CALL INT2SEQ(Z(I),nv,INFOS,SEQ(1:nv),S(I,1:6)) - ELSE - S(1:nobs,:) = 1 - ENDIF - -C -------------------------------------------- -C DRAW theta1 from p(theta1|Y,S) -C p(theta1|Y,S) prop p(Y|theta1,S) x p(theta1) -C -------------------------------------------- - NN = 0 - JJ = INDT(nt+1) - IF (JJ.GT.1) THEN ! Draw a set of theta via AMH -C MH proposal: -C theta ~ (1-beta)*N(MEDT,2.38^2*SIGT/JJ) + beta*N(MEDT,.1^2*I/JJ) -C7777 v = G05CAF(v) ! Sampling U(0,1) -7777 v = genunf(0.D0,1.D0) ! Sampling U(0,1) - IF (v.LE..95) THEN - IFAIL = -1 -c CALL G05EAF(MEDT,JJ,2.38**2*SIGT/DFLOAT(JJ),JJ,1.D-14, -c 1 WORK,(nt+2)*(nt+1)/2,IFAIL) -c CALL G05EZF(SEGA(1:JJ),JJ,WORK,(nt+2)*(nt+1)/2,IFAIL) - CALL setgmn(MEDT,2.38**2*SIGT/DFLOAT(JJ),JJ,JJ, +C along with DMM. If not, see <http://www.gnu.org/licenses/>. +C ---------------------------------------------------------------------- + SUBROUTINE DRAWTHETA(nobs,d,ny,nz,nx,nu,nv,ns,nt,INFOS,INDT, + 1 MEDT,SIGT,yk,IYK,Z,thetaprior,tipo,pdll, + 2 theta0,theta,NEVAL) +C INPUT + CHARACTER*1 fittizia + POINTER (pdll,fittizia) + INTEGER nobs,d(2),ny,nz,nx,nu,nv,ns(6),nt,Z(nobs), + 1 IYK(nobs,ny+1),INFOS(9,6),INDT(nt+2) + DOUBLE PRECISION yk(nobs,ny+nz),thetaprior(nt,4),theta0(nt) + DOUBLE PRECISION MEDT(max(1,INDT(nt+1))), + 1 SIGT(max(1,INDT(nt+1)),max(1,INDT(nt+1))) + + CHARACTER*2 tipo(nt) +C OUTPUT + INTEGER NEVAL(nt) + DOUBLE PRECISION theta(nt) +C LOCALS + INTEGER I,J,jj,NN,IFAIL,SEQ(nv) + INTEGER it,S(nobs,6) + DOUBLE PRECISION PN,PO,QN,QO,PA,v,AG,WORK((nt+2)*(nt+1)/2), + 1 SEGA(nt),WORK2(nt) + DOUBLE PRECISION genunf,ptheta,prior,mvnpdf +C DOUBLE PRECISION G05CAF + IF (nv.GT.0) THEN + DO 1 I = 1,nobs +1 CALL INT2SEQ(Z(I),nv,INFOS,SEQ(1:nv),S(I,1:6)) + ELSE + S(1:nobs,:) = 1 + ENDIF + +C -------------------------------------------- +C DRAW theta1 from p(theta1|Y,S) +C p(theta1|Y,S) prop p(Y|theta1,S) x p(theta1) +C -------------------------------------------- + NN = 0 + JJ = INDT(nt+1) + IF (JJ.GT.1) THEN ! Draw a set of theta via AMH +C MH proposal: +C theta ~ (1-beta)*N(MEDT,2.38^2*SIGT/JJ) + beta*N(MEDT,.1^2*I/JJ) +C7777 v = G05CAF(v) ! Sampling U(0,1) +7777 v = genunf(0.D0,1.D0) ! Sampling U(0,1) + IF (v.LE..95) THEN + IFAIL = -1 +c CALL G05EAF(MEDT,JJ,2.38**2*SIGT/DFLOAT(JJ),JJ,1.D-14, +c 1 WORK,(nt+2)*(nt+1)/2,IFAIL) +c CALL G05EZF(SEGA(1:JJ),JJ,WORK,(nt+2)*(nt+1)/2,IFAIL) + CALL setgmn(MEDT,2.38**2*SIGT/DFLOAT(JJ),JJ,JJ, # WORK(1:(JJ+2)*(JJ+1)/2)) - CALL genmn(WORK(1:(JJ+2)*(JJ+1)/2),SEGA(1:JJ),WORK2(1:JJ)) - ELSE - DO I = 1,JJ -c CALL G05EAF(MEDT(I),1,1D-2/DFLOAT(JJ),1,1.D-14, -c 1 WORK,(nt+2)*(nt+1)/2,IFAIL) -c CALL G05EZF(SEGA(I),1,WORK,(nt+2)*(nt+1)/2,IFAIL) + CALL genmn(WORK(1:(JJ+2)*(JJ+1)/2),SEGA(1:JJ),WORK2(1:JJ)) + ELSE + DO I = 1,JJ +c CALL G05EAF(MEDT(I),1,1D-2/DFLOAT(JJ),1,1.D-14, +c 1 WORK,(nt+2)*(nt+1)/2,IFAIL) +c CALL G05EZF(SEGA(I),1,WORK,(nt+2)*(nt+1)/2,IFAIL) CALL setgmn(MEDT(I),1D-2/DFLOAT(JJ),1,1,WORK(1:3)) - CALL genmn(WORK(1:3),SEGA(I),WORK2(1)) - ENDDO - ENDIF - NN = NN + 1 -C CHEK theta - DO I = 1,JJ - IF ((SEGA(I).LT.thetaprior(INDT(I),3)).OR. - # (SEGA(I).GT.thetaprior(INDT(I),4))) THEN - IF (NN.LE.1000) THEN - GOTO 7777 - ELSE - type *, ' ' - type *, 'Reduce skcriterium or use Slice sampling' - type *, 'Program aborting' - PAUSE - STOP - ENDIF - ENDIF - END DO -C f(theta1(new)|theta2,S,y) - theta(INDT(1:JJ)) = SEGA(1:JJ) - PN = PTHETA(INDT(1),nobs,d,ny,nz,nx,nu,ns,nt,S,yk,IYK,theta, - 1 thetaprior(INDT(1),:),tipo(INDT(1)),pdll) - DO I =2,JJ - PN = PN + PRIOR(theta(INDT(I)),thetaprior(INDT(I),:), - # tipo(INDT(I))) - ENDDO -C q(theta1(new)) - AG = 1.D0 - DO I = 1,JJ - AG = AG*mvnpdf(SEGA(I),MEDT(I),1D-2/DFLOAT(JJ),1) - END DO - QN = .95D0*mvnpdf(SEGA(1:JJ),MEDT,2.38**2*SIGT/DFLOAT(JJ),JJ) - + + .05D0*AG - -C f(theta1(old)|theta2,S,y) - PO = PTHETA(INDT(1),nobs,d,ny,nz,nx,nu,ns,nt,S,yk,IYK,theta0, - 1 thetaprior(INDT(1),:),tipo(INDT(1)),pdll) - DO I =2,JJ - PO = PO + PRIOR(theta0(INDT(I)),thetaprior(INDT(I),:), - # tipo(INDT(I))) - ENDDO -C q(theta1(old)) - AG = 1.D0 - DO I = 1,JJ - AG = AG*mvnpdf(theta0(INDT(1:JJ)),MEDT(I),1D-2/DFLOAT(JJ),1) - END DO - QO = .95D0*mvnpdf(theta0(INDT(1:JJ)),MEDT,2.38**2*SIGT/DFLOAT(JJ) - # ,JJ) + .05D0*AG - -C v = G05CAF(v) ! Sampling from U(0,1) - v = genunf(0.D0,1.D0) ! Sampling U(0,1) - - PA = DEXP(PN-PO)*QO/QN - IF (v.GT.MIN(1.D0,PA)) THEN - theta(INDT(1:JJ)) = theta0(INDT(1:JJ)) - NEVAL(INDT(1)) = 0 - ELSE - theta0(INDT(1:JJ)) = theta(INDT(1:JJ)) - NEVAL(INDT(1)) = 1 - ENDIF - ENDIF - -C The rest of theta by SLICE - DO J = 1,INDT(nt+2)-JJ - it = INDT(JJ+J) - CALL SLICE(it,nobs,d,ny,nz,nx,nu,ns,nt,S,yk,IYK,theta0, - 1 thetaprior(it,:),tipo(it),pdll,NEVAL(it),theta(it)) - theta0(it) = theta(it) - END DO - - RETURN + CALL genmn(WORK(1:3),SEGA(I),WORK2(1)) + ENDDO + ENDIF + NN = NN + 1 +C CHEK theta + DO I = 1,JJ + IF ((SEGA(I).LT.thetaprior(INDT(I),3)).OR. + # (SEGA(I).GT.thetaprior(INDT(I),4))) THEN + IF (NN.LE.1000) THEN + GOTO 7777 + ELSE + type *, ' ' + type *, 'Reduce skcriterium or use Slice sampling' + type *, 'Program aborting' + PAUSE + STOP + ENDIF + ENDIF + END DO +C f(theta1(new)|theta2,S,y) + theta(INDT(1:JJ)) = SEGA(1:JJ) + PN = PTHETA(INDT(1),nobs,d,ny,nz,nx,nu,ns,nt,S,yk,IYK,theta, + 1 thetaprior(INDT(1),:),tipo(INDT(1)),pdll) + DO I =2,JJ + PN = PN + PRIOR(theta(INDT(I)),thetaprior(INDT(I),:), + # tipo(INDT(I))) + ENDDO +C q(theta1(new)) + AG = 1.D0 + DO I = 1,JJ + AG = AG*mvnpdf(SEGA(I),MEDT(I),1D-2/DFLOAT(JJ),1) + END DO + QN = .95D0*mvnpdf(SEGA(1:JJ),MEDT,2.38**2*SIGT/DFLOAT(JJ),JJ) + + + .05D0*AG + +C f(theta1(old)|theta2,S,y) + PO = PTHETA(INDT(1),nobs,d,ny,nz,nx,nu,ns,nt,S,yk,IYK,theta0, + 1 thetaprior(INDT(1),:),tipo(INDT(1)),pdll) + DO I =2,JJ + PO = PO + PRIOR(theta0(INDT(I)),thetaprior(INDT(I),:), + # tipo(INDT(I))) + ENDDO +C q(theta1(old)) + AG = 1.D0 + DO I = 1,JJ + AG = AG*mvnpdf(theta0(INDT(1:JJ)),MEDT(I),1D-2/DFLOAT(JJ),1) + END DO + QO = .95D0*mvnpdf(theta0(INDT(1:JJ)),MEDT,2.38**2*SIGT/DFLOAT(JJ) + # ,JJ) + .05D0*AG + +C v = G05CAF(v) ! Sampling from U(0,1) + v = genunf(0.D0,1.D0) ! Sampling U(0,1) + + PA = DEXP(PN-PO)*QO/QN + IF (v.GT.MIN(1.D0,PA)) THEN + theta(INDT(1:JJ)) = theta0(INDT(1:JJ)) + NEVAL(INDT(1)) = 0 + ELSE + theta0(INDT(1:JJ)) = theta(INDT(1:JJ)) + NEVAL(INDT(1)) = 1 + ENDIF + ENDIF + +C The rest of theta by SLICE + DO J = 1,INDT(nt+2)-JJ + it = INDT(JJ+J) + CALL SLICE(it,nobs,d,ny,nz,nx,nu,ns,nt,S,yk,IYK,theta0, + 1 thetaprior(it,:),tipo(it),pdll,NEVAL(it),theta(it)) + theta0(it) = theta(it) + END DO + + RETURN END diff --git a/drawtheta2.for b/drawtheta2.for index 88520062fc5af9a6db4b1e5c1d1021bc93b69adc..19eb7f88fcd67fce8d79aa41df41f7c76c7e2424 100644 --- a/drawtheta2.for +++ b/drawtheta2.for @@ -1,32 +1,32 @@ -C ---------------------------------------------------------------------- -C DRAWTHETA2 draws model parameters theta (no missing values) -C Developed by A.Rossi, C.Planas and G.Fiorentini -C p(theta|Y,S,z) propto p(theta|Y,S,z) -C -C State-space format: y(t) = c(t)z(t) + H(t)x(t) + G(t)u(t) -C x(t) = a(t) + F(t)x(t-1) + R(t)u(t) -C -C y(t) (ny x 1) ny = # of endogenous series -C z(t) (nz x 1) nz = # of exogenous series -C x(t) (nx x 1) nx = # of continous states -C u(t) (nu x 1) nu = # of shocks -C c(t) (ny x nz x ns1) ns1 = # of states for c(t) -C H(t) (ny x nx x ns2) ns2 = # of states for H(t) -C G(t) (ny x nu x ns3) ns3 = # of states for G(t) -C a(t) (nx x ns4) ns4 = # of states for a(t) -C F(t) (nx x nx x ns5) ns5 = # of states for F(t) -C R(t) (nx x nu x ns6) ns6 = # of states for R(t) -C -C OUTPUT: -C theta (nt x 1) -C NEVAL # of runs of the Kalman Filter (KF) / MH acceptance prob -C -C Copyright (C) 2010-2014 European Commission -C +C ---------------------------------------------------------------------- +C DRAWTHETA2 draws model parameters theta (no missing values) +C Developed by A.Rossi, C.Planas and G.Fiorentini +C p(theta|Y,S,z) propto p(theta|Y,S,z) +C +C State-space format: y(t) = c(t)z(t) + H(t)x(t) + G(t)u(t) +C x(t) = a(t) + F(t)x(t-1) + R(t)u(t) +C +C y(t) (ny x 1) ny = # of endogenous series +C z(t) (nz x 1) nz = # of exogenous series +C x(t) (nx x 1) nx = # of continous states +C u(t) (nu x 1) nu = # of shocks +C c(t) (ny x nz x ns1) ns1 = # of states for c(t) +C H(t) (ny x nx x ns2) ns2 = # of states for H(t) +C G(t) (ny x nu x ns3) ns3 = # of states for G(t) +C a(t) (nx x ns4) ns4 = # of states for a(t) +C F(t) (nx x nx x ns5) ns5 = # of states for F(t) +C R(t) (nx x nu x ns6) ns6 = # of states for R(t) +C +C OUTPUT: +C theta (nt x 1) +C NEVAL # of runs of the Kalman Filter (KF) / MH acceptance prob +C +C Copyright (C) 2010-2014 European Commission +C C This file is part of Program DMM C -C DMM is free software developed at the Joint Research Centre of the -C European Commission: you can redistribute it and/or modify it under +C DMM is free software developed at the Joint Research Centre of the +C European Commission: you can redistribute it and/or modify it under C the terms of the GNU General Public License as published by C the Free Software Foundation, either version 3 of the License, or C (at your option) any later version. @@ -34,135 +34,135 @@ C C DMM is distributed in the hope that it will be useful, C but WITHOUT ANY WARRANTY; without even the implied warranty of C MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -C GNU General Public License for more details. -C +C GNU General Public License for more details. +C C You should have received a copy of the GNU General Public License -C along with DMM. If not, see <http://www.gnu.org/licenses/>. -C ---------------------------------------------------------------------- - SUBROUTINE DRAWTHETA2(nobs,d,ny,nz,nx,nu,nv,ns,nt,INFOS,INDT, - 1 MEDT,SIGT,yk,Z,thetaprior,tipo,pdll, - 2 theta0,theta,NEVAL) -C INPUT - CHARACTER*1 fittizia - POINTER (pdll,fittizia) - INTEGER nobs,d(2),ny,nz,nx,nu,nv,ns(6),nt,Z(nobs), - 1 INFOS(9,6),INDT(nt+2) - DOUBLE PRECISION yk(nobs,ny+nz),thetaprior(nt,4),theta0(nt) - DOUBLE PRECISION MEDT(max(1,INDT(nt+1))), - 1 SIGT(max(1,INDT(nt+1)),max(1,INDT(nt+1))) - CHARACTER*2 tipo(nt) -C OUTPUT - INTEGER NEVAL(nt) - DOUBLE PRECISION theta(nt) -C LOCALS - INTEGER I,J,JJ,NN,IFAIL,SEQ(nv) - INTEGER it,S(nobs,6) - DOUBLE PRECISION PN,PO,QN,QO,PA,v,AG,WORK((nt+2)*(nt+1)/2), - 1 SEGA(nt),WORK2(nt) - DOUBLE PRECISION genunf,ptheta2,prior,mvnpdf -C DOUBLE PRECISION G05CAF - - IF (nv.GT.0) THEN - DO 1 I = 1,nobs -1 CALL INT2SEQ(Z(I),nv,INFOS,SEQ(1:nv),S(I,1:6)) - ELSE - S(1:nobs,:) = 1 - ENDIF - -C -------------------------------------------- -C DRAW theta1 from p(theta1|Y,S) -C p(theta1|Y,S) prop p(Y|theta1,S) x p(theta1) -C -------------------------------------------- - NN = 0 - JJ = INDT(nt+1) - IF (JJ.GT.1) THEN ! Draw a set of theta via AMH -C MH proposal: -C theta ~ (1-beta)*N(MEDT,2.38^2*SIGT/JJ) + beta*N(MEDT,.1^2*I/JJ) -C7777 v = G05CAF(v) ! Sampling U(0,1) -7777 v = genunf(0.D0,1.D0) ! Sampling U(0,1) - IF (v.LE..95) THEN - IFAIL = -1 -c CALL G05EAF(MEDT,JJ,2.38**2*SIGT/DFLOAT(JJ),JJ,1.D-14, -c 1 WORK,(nt+2)*(nt+1)/2,IFAIL) -c CALL G05EZF(SEGA(1:JJ),JJ,WORK,(nt+2)*(nt+1)/2,IFAIL) - CALL setgmn(MEDT,2.38**2*SIGT/DFLOAT(JJ),JJ,JJ, +C along with DMM. If not, see <http://www.gnu.org/licenses/>. +C ---------------------------------------------------------------------- + SUBROUTINE DRAWTHETA2(nobs,d,ny,nz,nx,nu,nv,ns,nt,INFOS,INDT, + 1 MEDT,SIGT,yk,Z,thetaprior,tipo,pdll, + 2 theta0,theta,NEVAL) +C INPUT + CHARACTER*1 fittizia + POINTER (pdll,fittizia) + INTEGER nobs,d(2),ny,nz,nx,nu,nv,ns(6),nt,Z(nobs), + 1 INFOS(9,6),INDT(nt+2) + DOUBLE PRECISION yk(nobs,ny+nz),thetaprior(nt,4),theta0(nt) + DOUBLE PRECISION MEDT(max(1,INDT(nt+1))), + 1 SIGT(max(1,INDT(nt+1)),max(1,INDT(nt+1))) + CHARACTER*2 tipo(nt) +C OUTPUT + INTEGER NEVAL(nt) + DOUBLE PRECISION theta(nt) +C LOCALS + INTEGER I,J,JJ,NN,IFAIL,SEQ(nv) + INTEGER it,S(nobs,6) + DOUBLE PRECISION PN,PO,QN,QO,PA,v,AG,WORK((nt+2)*(nt+1)/2), + 1 SEGA(nt),WORK2(nt) + DOUBLE PRECISION genunf,ptheta2,prior,mvnpdf +C DOUBLE PRECISION G05CAF + + IF (nv.GT.0) THEN + DO 1 I = 1,nobs +1 CALL INT2SEQ(Z(I),nv,INFOS,SEQ(1:nv),S(I,1:6)) + ELSE + S(1:nobs,:) = 1 + ENDIF + +C -------------------------------------------- +C DRAW theta1 from p(theta1|Y,S) +C p(theta1|Y,S) prop p(Y|theta1,S) x p(theta1) +C -------------------------------------------- + NN = 0 + JJ = INDT(nt+1) + IF (JJ.GT.1) THEN ! Draw a set of theta via AMH +C MH proposal: +C theta ~ (1-beta)*N(MEDT,2.38^2*SIGT/JJ) + beta*N(MEDT,.1^2*I/JJ) +C7777 v = G05CAF(v) ! Sampling U(0,1) +7777 v = genunf(0.D0,1.D0) ! Sampling U(0,1) + IF (v.LE..95) THEN + IFAIL = -1 +c CALL G05EAF(MEDT,JJ,2.38**2*SIGT/DFLOAT(JJ),JJ,1.D-14, +c 1 WORK,(nt+2)*(nt+1)/2,IFAIL) +c CALL G05EZF(SEGA(1:JJ),JJ,WORK,(nt+2)*(nt+1)/2,IFAIL) + CALL setgmn(MEDT,2.38**2*SIGT/DFLOAT(JJ),JJ,JJ, # WORK(1:(JJ+2)*(JJ+1)/2)) - CALL genmn(WORK(1:(JJ+2)*(JJ+1)/2),SEGA(1:JJ),WORK2(1:JJ)) - ELSE - DO I = 1,JJ -c CALL G05EAF(MEDT(I),1,1D-2/DFLOAT(JJ),1,1.D-14, -c 1 WORK,(nt+2)*(nt+1)/2,IFAIL) -c CALL G05EZF(SEGA(I),1,WORK,(nt+2)*(nt+1)/2,IFAIL) + CALL genmn(WORK(1:(JJ+2)*(JJ+1)/2),SEGA(1:JJ),WORK2(1:JJ)) + ELSE + DO I = 1,JJ +c CALL G05EAF(MEDT(I),1,1D-2/DFLOAT(JJ),1,1.D-14, +c 1 WORK,(nt+2)*(nt+1)/2,IFAIL) +c CALL G05EZF(SEGA(I),1,WORK,(nt+2)*(nt+1)/2,IFAIL) CALL setgmn(MEDT(I),1D-2/DFLOAT(JJ),1,1,WORK(1:3)) - CALL genmn(WORK(1:3),SEGA(I),WORK2(1)) - ENDDO - ENDIF - NN = NN + 1 -C CHEK theta - DO I = 1,JJ - IF ((SEGA(I).LT.thetaprior(INDT(I),3)).OR. - # (SEGA(I).GT.thetaprior(INDT(I),4))) THEN - IF (NN.LE.1000) THEN - GOTO 7777 - ELSE - type *, ' ' - type *, 'Reduce skcriterium or use Slice sampling' - type *, 'Program aborting' - PAUSE - STOP - ENDIF - ENDIF - END DO -C f(theta1(new)|theta2,S,y) - theta(INDT(1:JJ)) = SEGA(1:JJ) - PN = PTHETA2(INDT(1),nobs,d,ny,nz,nx,nu,ns,nt,S,yk,theta, - 1 thetaprior(INDT(1),:),tipo(INDT(1)),pdll) - DO I =2,JJ - PN = PN + PRIOR(theta(INDT(I)),thetaprior(INDT(I),:), - # tipo(INDT(I))) - ENDDO -C q(theta1(new)) - AG = 1.D0 - DO I = 1,JJ - AG = AG*mvnpdf(SEGA(I),MEDT(I),1D-2/DFLOAT(JJ),1) - END DO - QN = .95D0*mvnpdf(SEGA(1:JJ),MEDT,2.38**2*SIGT/DFLOAT(JJ),JJ) - + + .05D0*AG - -C f(theta1(old)|theta2,S,y) - PO = PTHETA2(INDT(1),nobs,d,ny,nz,nx,nu,ns,nt,S,yk,theta0, - 1 thetaprior(INDT(1),:),tipo(INDT(1)),pdll) - DO I =2,JJ - PO = PO + PRIOR(theta0(INDT(I)),thetaprior(INDT(I),:), - # tipo(INDT(I))) - ENDDO -C q(theta1(old)) - AG = 1.D0 - DO I = 1,JJ - AG = AG*mvnpdf(theta0(INDT(1:JJ)),MEDT(I),1D-2/DFLOAT(JJ),1) - END DO - QO = .95D0*mvnpdf(theta0(INDT(1:JJ)),MEDT,2.38**2*SIGT/DFLOAT(JJ) - # ,JJ) + .05D0*AG - -c v = G05CAF(v) ! Sampling from U(0,1) - v = genunf(0.D0,1.D0) ! Sampling U(0,1) - PA = DEXP(PN-PO)*QO/QN - IF (v.GT.MIN(1.D0,PA)) THEN - theta(INDT(1:JJ)) = theta0(INDT(1:JJ)) - NEVAL(INDT(1)) = 0 - ELSE - theta0(INDT(1:JJ)) = theta(INDT(1:JJ)) - NEVAL(INDT(1)) = 1 - ENDIF - ENDIF - -C The rest of theta by SLICE - DO J = 1,INDT(nt+2)-JJ - it = INDT(JJ+J) - CALL SLICE2(it,nobs,d,ny,nz,nx,nu,ns,nt,S,yk,theta0, - 1 thetaprior(it,:),tipo(it),pdll,NEVAL(it),theta(it)) - theta0(it) = theta(it) - END DO - - RETURN + CALL genmn(WORK(1:3),SEGA(I),WORK2(1)) + ENDDO + ENDIF + NN = NN + 1 +C CHEK theta + DO I = 1,JJ + IF ((SEGA(I).LT.thetaprior(INDT(I),3)).OR. + # (SEGA(I).GT.thetaprior(INDT(I),4))) THEN + IF (NN.LE.1000) THEN + GOTO 7777 + ELSE + type *, ' ' + type *, 'Reduce skcriterium or use Slice sampling' + type *, 'Program aborting' + PAUSE + STOP + ENDIF + ENDIF + END DO +C f(theta1(new)|theta2,S,y) + theta(INDT(1:JJ)) = SEGA(1:JJ) + PN = PTHETA2(INDT(1),nobs,d,ny,nz,nx,nu,ns,nt,S,yk,theta, + 1 thetaprior(INDT(1),:),tipo(INDT(1)),pdll) + DO I =2,JJ + PN = PN + PRIOR(theta(INDT(I)),thetaprior(INDT(I),:), + # tipo(INDT(I))) + ENDDO +C q(theta1(new)) + AG = 1.D0 + DO I = 1,JJ + AG = AG*mvnpdf(SEGA(I),MEDT(I),1D-2/DFLOAT(JJ),1) + END DO + QN = .95D0*mvnpdf(SEGA(1:JJ),MEDT,2.38**2*SIGT/DFLOAT(JJ),JJ) + + + .05D0*AG + +C f(theta1(old)|theta2,S,y) + PO = PTHETA2(INDT(1),nobs,d,ny,nz,nx,nu,ns,nt,S,yk,theta0, + 1 thetaprior(INDT(1),:),tipo(INDT(1)),pdll) + DO I =2,JJ + PO = PO + PRIOR(theta0(INDT(I)),thetaprior(INDT(I),:), + # tipo(INDT(I))) + ENDDO +C q(theta1(old)) + AG = 1.D0 + DO I = 1,JJ + AG = AG*mvnpdf(theta0(INDT(1:JJ)),MEDT(I),1D-2/DFLOAT(JJ),1) + END DO + QO = .95D0*mvnpdf(theta0(INDT(1:JJ)),MEDT,2.38**2*SIGT/DFLOAT(JJ) + # ,JJ) + .05D0*AG + +c v = G05CAF(v) ! Sampling from U(0,1) + v = genunf(0.D0,1.D0) ! Sampling U(0,1) + PA = DEXP(PN-PO)*QO/QN + IF (v.GT.MIN(1.D0,PA)) THEN + theta(INDT(1:JJ)) = theta0(INDT(1:JJ)) + NEVAL(INDT(1)) = 0 + ELSE + theta0(INDT(1:JJ)) = theta(INDT(1:JJ)) + NEVAL(INDT(1)) = 1 + ENDIF + ENDIF + +C The rest of theta by SLICE + DO J = 1,INDT(nt+2)-JJ + it = INDT(JJ+J) + CALL SLICE2(it,nobs,d,ny,nz,nx,nu,ns,nt,S,yk,theta0, + 1 thetaprior(it,:),tipo(it),pdll,NEVAL(it),theta(it)) + theta0(it) = theta(it) + END DO + + RETURN END diff --git a/ergodic.for b/ergodic.for index 778e25900be37867b61a639a8f1a35b9404092fa..d735b07fd1e25f452c89177d4f032892315b7616 100644 --- a/ergodic.for +++ b/ergodic.for @@ -1,18 +1,18 @@ -C --------------------------------------------------------------------- -C ERGODIC solves the linear system: PE*(I-P') = 0 -C Developed by A.Rossi, C.Planas and G.Fiorentini -C PE=(PE1,PE2); PE1=PE(1),...,PE(n-1) and PE2=1-sum(PE(1:n-1)) -C A = I-P' = [a b -C n x n c d] -C where a = A(1:n-1,1:n-1); c = A(n,1:n-1) (1 x n-1) -C => PE1 = -c*(a-1*c)**(-1), 1 = (1,1,...1)' (n-1 x 1) -C -C Copyright (C) 2010-2014 European Commission -C +C --------------------------------------------------------------------- +C ERGODIC solves the linear system: PE*(I-P') = 0 +C Developed by A.Rossi, C.Planas and G.Fiorentini +C PE=(PE1,PE2); PE1=PE(1),...,PE(n-1) and PE2=1-sum(PE(1:n-1)) +C A = I-P' = [a b +C n x n c d] +C where a = A(1:n-1,1:n-1); c = A(n,1:n-1) (1 x n-1) +C => PE1 = -c*(a-1*c)**(-1), 1 = (1,1,...1)' (n-1 x 1) +C +C Copyright (C) 2010-2014 European Commission +C C This file is part of Program DMM C -C DMM is free software developed at the Joint Research Centre of the -C European Commission: you can redistribute it and/or modify it under +C DMM is free software developed at the Joint Research Centre of the +C European Commission: you can redistribute it and/or modify it under C the terms of the GNU General Public License as published by C the Free Software Foundation, either version 3 of the License, or C (at your option) any later version. @@ -23,43 +23,43 @@ C MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the C GNU General Public License for more details. C C You should have received a copy of the GNU General Public License -C along with DMM. If not, see <http://www.gnu.org/licenses/>. -C --------------------------------------------------------------------- - SUBROUTINE ERGODIC(n,P,PE) -C INPUT - INTEGER n - DOUBLE PRECISION P(n,n) -C OUTPUT - DOUBLE PRECISION PE(n) -C LOCALS - INTEGER I,IFAIL,LWORK,IPIV(n-1) - DOUBLE PRECISION A(n,n),AC(n-1,n-1) - DOUBLE PRECISION, ALLOCATABLE:: WORK(:) - - LWORK = 64*(n-1) - ALLOCATE(WORK(LWORK)) - -C A = I - P' - DO 10 I = 1,n - A(I,:) = -P(:,I) -10 A(I,I) = A(I,I) + 1.D0 - -C AC = a - 1*c - DO 20 I =1,n-1 -20 AC(I,1:n-1) = A(I,1:n-1) - A(n,1:n-1) - -C inv of AC -C CALL F07ADF(n-1,n-1,AC,n-1,IPIV,IFAIL) -C CALL F07AJF(n-1,AC,n-1,IPIV,WORK,LWORK,IFAIL) - CALL DGETRF(n-1,n-1,AC,n-1,IPIV,IFAIL) - CALL DGETRI(n-1,AC,n-1,IPIV,WORK,LWORK,IFAIL) - -C PE = -c*(A-1*c)**(-1) - DO 30 I=1,n-1 -30 PE(I) = -SUM(A(n,1:n-1)*AC(:,I)) - PE(n) = 1.D0-SUM(PE(1:n-1)) - - DEALLOCATE(WORK) - - RETURN +C along with DMM. If not, see <http://www.gnu.org/licenses/>. +C --------------------------------------------------------------------- + SUBROUTINE ERGODIC(n,P,PE) +C INPUT + INTEGER n + DOUBLE PRECISION P(n,n) +C OUTPUT + DOUBLE PRECISION PE(n) +C LOCALS + INTEGER I,IFAIL,LWORK,IPIV(n-1) + DOUBLE PRECISION A(n,n),AC(n-1,n-1) + DOUBLE PRECISION, ALLOCATABLE:: WORK(:) + + LWORK = 64*(n-1) + ALLOCATE(WORK(LWORK)) + +C A = I - P' + DO 10 I = 1,n + A(I,:) = -P(:,I) +10 A(I,I) = A(I,I) + 1.D0 + +C AC = a - 1*c + DO 20 I =1,n-1 +20 AC(I,1:n-1) = A(I,1:n-1) - A(n,1:n-1) + +C inv of AC +C CALL F07ADF(n-1,n-1,AC,n-1,IPIV,IFAIL) +C CALL F07AJF(n-1,AC,n-1,IPIV,WORK,LWORK,IFAIL) + CALL DGETRF(n-1,n-1,AC,n-1,IPIV,IFAIL) + CALL DGETRI(n-1,AC,n-1,IPIV,WORK,LWORK,IFAIL) + +C PE = -c*(A-1*c)**(-1) + DO 30 I=1,n-1 +30 PE(I) = -SUM(A(n,1:n-1)*AC(:,I)) + PE(n) = 1.D0-SUM(PE(1:n-1)) + + DEALLOCATE(WORK) + + RETURN END diff --git a/findinput.for b/findinput.for index 4546896b195c6499648b91dc256b2c20fb63fa10..fc950061c9888838ec7301e07f41dc326cd8a8dc 100644 --- a/findinput.for +++ b/findinput.for @@ -1,20 +1,20 @@ -C ------------------------------------------------------------- -C FINFINPUT finds input values in the inputfile -C Developed by A.Rossi, C.Planas and G.Fiorentini -C -C INPUT: -C STR1 -C STR2 -C -C OPUTPUT: -C NUM the value to be recovered -C -C Copyright (C) 2010-2014 European Commission -C +C ------------------------------------------------------------- +C FINFINPUT finds input values in the inputfile +C Developed by A.Rossi, C.Planas and G.Fiorentini +C +C INPUT: +C STR1 +C STR2 +C +C OPUTPUT: +C NUM the value to be recovered +C +C Copyright (C) 2010-2014 European Commission +C C This file is part of Program DMM C -C DMM is free software developed at the Joint Research Centre of the -C European Commission: you can redistribute it and/or modify it under +C DMM is free software developed at the Joint Research Centre of the +C European Commission: you can redistribute it and/or modify it under C the terms of the GNU General Public License as published by C the Free Software Foundation, either version 3 of the License, or C (at your option) any later version. @@ -25,47 +25,47 @@ C MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the C GNU General Public License for more details. C C You should have received a copy of the GNU General Public License -C along with DMM. If not, see <http://www.gnu.org/licenses/>. -C ------------------------------------------------------------- - SUBROUTINE FINDINPUT(STR1,N1,STR2,N2,NUM) -C INPUT - INTEGER N1,N2 - CHARACTER STR1*N1,STR2*N2 -C OUTPUT - DOUBLE PRECISION NUM -C LOCALS - INTEGER IPOS,IPOS2 - CHARACTER*1 :: OSTR - CHARACTER*300 ERRMSG - - NUM = 0.D0 - OSTR = ' ' - ERRMSG = 'INPUT ERROR: '// STR2 //' is not set' - IPOS = INDEX(TRIM(STR1),STR2) - IF (IPOS.EQ.0) THEN - WRITE(*,*) ERRMSG - PAUSE - STOP - ELSE - IPOS = IPOS+2 - DO WHILE ((OSTR.NE.'=').AND.(OSTR.NE.'$')) - READ(STR1(IPOS:IPOS),*) OSTR - IPOS = IPOS+1 - END DO - IPOS2 = IPOS - DO WHILE ((OSTR.NE.';').AND.(OSTR.NE.'$')) - READ(STR1(IPOS2:IPOS2),*) OSTR - IPOS2 = IPOS2 + 1 - END DO - IF (IPOS2-1.GT.IPOS) THEN - READ(STR1(IPOS:IPOS2-2),'(F20.10)') NUM - READ(STR1(IPOS:IPOS2-2),*) NUM - ELSE - WRITE(*,*) ERRMSG - PAUSE - STOP - ENDIF - ENDIF - - RETURN +C along with DMM. If not, see <http://www.gnu.org/licenses/>. +C ------------------------------------------------------------- + SUBROUTINE FINDINPUT(STR1,N1,STR2,N2,NUM) +C INPUT + INTEGER N1,N2 + CHARACTER STR1*N1,STR2*N2 +C OUTPUT + DOUBLE PRECISION NUM +C LOCALS + INTEGER IPOS,IPOS2 + CHARACTER*1 :: OSTR + CHARACTER*300 ERRMSG + + NUM = 0.D0 + OSTR = ' ' + ERRMSG = 'INPUT ERROR: '// STR2 //' is not set' + IPOS = INDEX(TRIM(STR1),STR2) + IF (IPOS.EQ.0) THEN + WRITE(*,*) ERRMSG + PAUSE + STOP + ELSE + IPOS = IPOS+2 + DO WHILE ((OSTR.NE.'=').AND.(OSTR.NE.'$')) + READ(STR1(IPOS:IPOS),*) OSTR + IPOS = IPOS+1 + END DO + IPOS2 = IPOS + DO WHILE ((OSTR.NE.';').AND.(OSTR.NE.'$')) + READ(STR1(IPOS2:IPOS2),*) OSTR + IPOS2 = IPOS2 + 1 + END DO + IF (IPOS2-1.GT.IPOS) THEN + READ(STR1(IPOS:IPOS2-2),'(F20.10)') NUM + READ(STR1(IPOS:IPOS2-2),*) NUM + ELSE + WRITE(*,*) ERRMSG + PAUSE + STOP + ENDIF + ENDIF + + RETURN END diff --git a/forecast.for b/forecast.for index 5e921c9eef557a055c83aeb28af56226d3dfe452..dd85e2960e605e2f25edc37912404c4cc5a1c0b7 100644 --- a/forecast.for +++ b/forecast.for @@ -1,31 +1,31 @@ -C ---------------------------------------------------------------------------- -C FORECAST simulates y(T+1),...,y(T+nf),x(T+1),...,x(T+nf),S(T+1),...,S(T+nf) -C Developed by A.Rossi, C.Planas and G.Fiorentini -C -C State-space format: y(t) = c(t)z(t) + H(t)x(t) + G(t)u(t) -C x(t) = a(t) + F(t)x(t-1) + R(t)u(t) -C -C y(t) (ny x 1) ny = # of endogenous series -C z(t) (nz x 1) nz = # of exogenous series -C x(t) (nx x 1) nx = # of continous states -C u(t) (nu x 1) nu = # of shocks -C c(t) (ny x nz x ns1) ns1 = # of states for c(t) -C H(t) (ny x nx x ns2) ns2 = # of states for S2(t) -C G(t) (ny x nu x ns3) ns3 = # of states for S3(t) -C a(t) (nx x ns4) ns4 = # of states for S4(t) -C F(t) (nx x nx x ns5) ns5 = # of states for S5(t) -C R(t) (nx x nu x ns6) ns6 = # of states for S6(t) -C -C OUTPUT: -C -C (nf x (ny+nx+1)) FORE: y(T+k),x(T+k),S(T+k) -C -C Copyright (C) 2010-2014 European Commission -C +C ---------------------------------------------------------------------------- +C FORECAST simulates y(T+1),...,y(T+nf),x(T+1),...,x(T+nf),S(T+1),...,S(T+nf) +C Developed by A.Rossi, C.Planas and G.Fiorentini +C +C State-space format: y(t) = c(t)z(t) + H(t)x(t) + G(t)u(t) +C x(t) = a(t) + F(t)x(t-1) + R(t)u(t) +C +C y(t) (ny x 1) ny = # of endogenous series +C z(t) (nz x 1) nz = # of exogenous series +C x(t) (nx x 1) nx = # of continous states +C u(t) (nu x 1) nu = # of shocks +C c(t) (ny x nz x ns1) ns1 = # of states for c(t) +C H(t) (ny x nx x ns2) ns2 = # of states for S2(t) +C G(t) (ny x nu x ns3) ns3 = # of states for S3(t) +C a(t) (nx x ns4) ns4 = # of states for S4(t) +C F(t) (nx x nx x ns5) ns5 = # of states for S5(t) +C R(t) (nx x nu x ns6) ns6 = # of states for S6(t) +C +C OUTPUT: +C +C (nf x (ny+nx+1)) FORE: y(T+k),x(T+k),S(T+k) +C +C Copyright (C) 2010-2014 European Commission +C C This file is part of Program DMM C -C DMM is free software developed at the Joint Research Centre of the -C European Commission: you can redistribute it and/or modify it under +C DMM is free software developed at the Joint Research Centre of the +C European Commission: you can redistribute it and/or modify it under C the terms of the GNU General Public License as published by C the Free Software Foundation, either version 3 of the License, or C (at your option) any later version. @@ -34,128 +34,128 @@ C DMM is distributed in the hope that it will be useful, C but WITHOUT ANY WARRANTY; without even the implied warranty of C MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the C GNU General Public License for more details. -C ---------------------------------------------------------------------------- - SUBROUTINE FORECAST(zk,nf,ny,nz,nx,nu,nv,ns,nstot,nt,np, - 1 theta,psi,INFOS,Z,STATE,pdll,FORE) - - USE dfwin - INTERFACE - SUBROUTINE DESIGN(ny,nz,nx,nu,ns,nt,theta,c,H,G,a,F,R) - INTEGER ny,nz,nx,nu,ns(6),nt - DOUBLE PRECISION theta(nt) - DOUBLE PRECISION c(ny,max(1,nz),ns(1)),H(ny,nx,ns(2)), - 1 G(ny,nu,ns(3)),a(nx,ns(4)),F(nx,nx,ns(5)),R(nx,nu,ns(6)) - END SUBROUTINE - END INTERFACE - CHARACTER*1 fittizia - POINTER (pdll,fittizia) ! ASSOCIATE pointer pdll alla DLL ad una varibile fittizia - POINTER (pdesign,DESIGN) - -C INPUT - INTEGER nf,ny,nz,nx,nu,nv,nt,np(3),ns(6),nstot,Z,INFOS(9,6) - DOUBLE PRECISION zk(nf,nz),theta(nt),psi(np(1)),STATE(nx) - -C OUTPUT - DOUBLE PRECISION FORE(nf,ny+nx+1) -C LOCALS - INTEGER ISEQ,SEQ(nv),inf,I,IFAIL - INTEGER S(6) - DOUBLE PRECISION,ALLOCATABLE::R(:,:,:),c(:,:,:),H(:,:,:), - 1 G(:,:,:),a(:,:),F(:,:,:) - DOUBLE PRECISION,ALLOCATABLE:: P1(:,:),P2(:,:),P3(:,:),P4(:,:), - 1 P5(:,:),P6(:,:),PMAT(:,:),PE(:) - DOUBLE PRECISION U,AUX - DOUBLE PRECISION MED(nu) -C DOUBLE PRECISION WORKU((nu+2)*(nu+1)/2) - -C EXTERNAL FUNCTIONS - DOUBLE PRECISION genunf,gennor -C EXTERNAL SUBROUTINES - EXTERNAL DESIGNZ,PPROD,ERGODIC,INT2SEQ - - - ALLOCATE(R(nx,nu,ns(6)),c(ny,max(nz,1),ns(1)),H(ny,nx,ns(2)), - 1 G(ny,nu,ns(3)),a(nx,ns(4)),F(nx,nx,ns(5))) - -C Call DESIGN - pdesign = getprocaddress(pdll, "design_"C) - CALL DESIGN(ny,nz,nx,nu,ns,nt,theta,c,H,G,a,F,R) - - IF (nv.GT.0) THEN - ALLOCATE (P1(INFOS(8,1),INFOS(8,1)), - 1 P2(INFOS(8,2),INFOS(8,2)),P3(INFOS(8,3),INFOS(8,3)), - 2 P4(INFOS(8,4),INFOS(8,4)),P5(INFOS(8,5),INFOS(8,5)), - 3 P6(INFOS(8,6),INFOS(8,6)),PMAT(nstot,nstot),PE(nstot)) - - CALL DESIGNZ(nv,np(1),psi,INFOS,P1,P2,P3,P4,P5,P6) -C PALL(i,j) = Pr[Z(t+1)=i|Z(t)=j], Z = S1 x S2 x ... x Snv - CALL PPROD(nv,nstot,INFOS,P1,P2,P3,P4,P5,P6,PMAT) -C ERGODIC solves PE: PE*(I-P') = 0 - CALL ERGODIC(nstot,PMAT,PE) - ENDIF - -C DRAW Z(T+1) ~ Pr[Z(T+1)|Z(T)] - S(1:6) = 1 - IF (nv.GT.0) THEN -C U = G05CAF(U) ! Sampling U(0,1) - U = genunf(0.D0,1.D0) - ISEQ = 1 - AUX = PMAT(ISEQ,Z) - DO 10 WHILE (AUX.LT.U) - ISEQ = ISEQ + 1 -10 AUX = AUX + PMAT(ISEQ,Z) - FORE(1,nx+ny+1) = ISEQ - CALL INT2SEQ(ISEQ,nv,INFOS,SEQ,S) - ENDIF - -C DRAW x(T+1) ~ f(x(T+1)|x(T),Z(T+1)) - IFAIL = -1 - DO I = 1,nu - MED(I) = gennor(0.D0,1.D0) - END DO - DO 20 I=1,nx -20 FORE(1,ny+I) = a(I,S(4)) + SUM(F(I,1:nx,S(5))*STATE(1:nx)) - + + SUM(R(I,1:nu,S(6))*MED(1:nu)) - -C DRAW yk(T+1) ~ f(yk(T+1)|x(T+1),Z(T+1),zk(T+1)) - DO 30 I=1,ny -30 FORE(1,I) = SUM(H(I,1:nx,S(2))*FORE(1,ny+1:ny+nx)) - + + SUM(c(I,1:nz,S(1))*zk(1,1:nz)) - + + SUM(G(I,1:nu,S(3))*MED(1:nu)) - - DO 100 inf = 2,nf -C DRAW Z(T+inf) ~ Pr[Z(T+inf)|Z(T+inf-1)] - IF (nv.GT.0) THEN -C U = G05CAF(U) ! Sampling U(0,1) - U = genunf(0.D0,1.D0) - ISEQ = 1 - AUX = PMAT(ISEQ,FORE(inf-1,nx+ny+1)) - DO 40 WHILE (AUX.LT.U) - ISEQ = ISEQ + 1 -40 AUX = AUX + PMAT(ISEQ,FORE(inf-1,nx+ny+1)) - FORE(inf,nx+ny+1) = ISEQ - CALL INT2SEQ(ISEQ,nv,INFOS,SEQ,S) - ENDIF - -C DRAW x(T+inf) ~ f(x(T+inf)|x(T+inf-1),Z(T+inf)) - DO I = 1,nu - MED(I) = gennor(0.D0,1.D0) - END DO - DO 50 I=1,nx -50 FORE(inf,ny+I) = a(I,S(4)) - + + SUM(F(I,1:nx,S(5))*FORE(inf-1,ny+1:ny+nx)) - + + SUM(R(I,1:nu,S(6))*MED(1:nu)) - -C DRAW y(T+inf) ~ f(y(T+1)|x(T+inf),Z(T+inf),zk(T+inf)) - DO 60 I=1,ny -60 FORE(inf,I) = SUM(H(I,1:nx,S(2))*FORE(inf,ny+1:ny+nx)) - + + SUM(c(I,1:nz,S(1))*zk(inf,1:nz)) - + + SUM(G(I,1:nu,S(3))*MED(1:nu)) - -100 CONTINUE - - DEALLOCATE (R,c,H,G,a,F) - IF(nv.GT.0) DEALLOCATE(P1,P2,P3,P4,P5,P6,PMAT,PE) - - RETURN +C ---------------------------------------------------------------------------- + SUBROUTINE FORECAST(zk,nf,ny,nz,nx,nu,nv,ns,nstot,nt,np, + 1 theta,psi,INFOS,Z,STATE,pdll,FORE) + + USE dfwin + INTERFACE + SUBROUTINE DESIGN(ny,nz,nx,nu,ns,nt,theta,c,H,G,a,F,R) + INTEGER ny,nz,nx,nu,ns(6),nt + DOUBLE PRECISION theta(nt) + DOUBLE PRECISION c(ny,max(1,nz),ns(1)),H(ny,nx,ns(2)), + 1 G(ny,nu,ns(3)),a(nx,ns(4)),F(nx,nx,ns(5)),R(nx,nu,ns(6)) + END SUBROUTINE + END INTERFACE + CHARACTER*1 fittizia + POINTER (pdll,fittizia) ! ASSOCIATE pointer pdll alla DLL ad una varibile fittizia + POINTER (pdesign,DESIGN) + +C INPUT + INTEGER nf,ny,nz,nx,nu,nv,nt,np(3),ns(6),nstot,Z,INFOS(9,6) + DOUBLE PRECISION zk(nf,nz),theta(nt),psi(np(1)),STATE(nx) + +C OUTPUT + DOUBLE PRECISION FORE(nf,ny+nx+1) +C LOCALS + INTEGER ISEQ,SEQ(nv),inf,I,IFAIL + INTEGER S(6) + DOUBLE PRECISION,ALLOCATABLE::R(:,:,:),c(:,:,:),H(:,:,:), + 1 G(:,:,:),a(:,:),F(:,:,:) + DOUBLE PRECISION,ALLOCATABLE:: P1(:,:),P2(:,:),P3(:,:),P4(:,:), + 1 P5(:,:),P6(:,:),PMAT(:,:),PE(:) + DOUBLE PRECISION U,AUX + DOUBLE PRECISION MED(nu) +C DOUBLE PRECISION WORKU((nu+2)*(nu+1)/2) + +C EXTERNAL FUNCTIONS + DOUBLE PRECISION genunf,gennor +C EXTERNAL SUBROUTINES + EXTERNAL DESIGNZ,PPROD,ERGODIC,INT2SEQ + + + ALLOCATE(R(nx,nu,ns(6)),c(ny,max(nz,1),ns(1)),H(ny,nx,ns(2)), + 1 G(ny,nu,ns(3)),a(nx,ns(4)),F(nx,nx,ns(5))) + +C Call DESIGN + pdesign = getprocaddress(pdll, "design_"C) + CALL DESIGN(ny,nz,nx,nu,ns,nt,theta,c,H,G,a,F,R) + + IF (nv.GT.0) THEN + ALLOCATE (P1(INFOS(8,1),INFOS(8,1)), + 1 P2(INFOS(8,2),INFOS(8,2)),P3(INFOS(8,3),INFOS(8,3)), + 2 P4(INFOS(8,4),INFOS(8,4)),P5(INFOS(8,5),INFOS(8,5)), + 3 P6(INFOS(8,6),INFOS(8,6)),PMAT(nstot,nstot),PE(nstot)) + + CALL DESIGNZ(nv,np(1),psi,INFOS,P1,P2,P3,P4,P5,P6) +C PALL(i,j) = Pr[Z(t+1)=i|Z(t)=j], Z = S1 x S2 x ... x Snv + CALL PPROD(nv,nstot,INFOS,P1,P2,P3,P4,P5,P6,PMAT) +C ERGODIC solves PE: PE*(I-P') = 0 + CALL ERGODIC(nstot,PMAT,PE) + ENDIF + +C DRAW Z(T+1) ~ Pr[Z(T+1)|Z(T)] + S(1:6) = 1 + IF (nv.GT.0) THEN +C U = G05CAF(U) ! Sampling U(0,1) + U = genunf(0.D0,1.D0) + ISEQ = 1 + AUX = PMAT(ISEQ,Z) + DO 10 WHILE (AUX.LT.U) + ISEQ = ISEQ + 1 +10 AUX = AUX + PMAT(ISEQ,Z) + FORE(1,nx+ny+1) = ISEQ + CALL INT2SEQ(ISEQ,nv,INFOS,SEQ,S) + ENDIF + +C DRAW x(T+1) ~ f(x(T+1)|x(T),Z(T+1)) + IFAIL = -1 + DO I = 1,nu + MED(I) = gennor(0.D0,1.D0) + END DO + DO 20 I=1,nx +20 FORE(1,ny+I) = a(I,S(4)) + SUM(F(I,1:nx,S(5))*STATE(1:nx)) + + + SUM(R(I,1:nu,S(6))*MED(1:nu)) + +C DRAW yk(T+1) ~ f(yk(T+1)|x(T+1),Z(T+1),zk(T+1)) + DO 30 I=1,ny +30 FORE(1,I) = SUM(H(I,1:nx,S(2))*FORE(1,ny+1:ny+nx)) + + + SUM(c(I,1:nz,S(1))*zk(1,1:nz)) + + + SUM(G(I,1:nu,S(3))*MED(1:nu)) + + DO 100 inf = 2,nf +C DRAW Z(T+inf) ~ Pr[Z(T+inf)|Z(T+inf-1)] + IF (nv.GT.0) THEN +C U = G05CAF(U) ! Sampling U(0,1) + U = genunf(0.D0,1.D0) + ISEQ = 1 + AUX = PMAT(ISEQ,FORE(inf-1,nx+ny+1)) + DO 40 WHILE (AUX.LT.U) + ISEQ = ISEQ + 1 +40 AUX = AUX + PMAT(ISEQ,FORE(inf-1,nx+ny+1)) + FORE(inf,nx+ny+1) = ISEQ + CALL INT2SEQ(ISEQ,nv,INFOS,SEQ,S) + ENDIF + +C DRAW x(T+inf) ~ f(x(T+inf)|x(T+inf-1),Z(T+inf)) + DO I = 1,nu + MED(I) = gennor(0.D0,1.D0) + END DO + DO 50 I=1,nx +50 FORE(inf,ny+I) = a(I,S(4)) + + + SUM(F(I,1:nx,S(5))*FORE(inf-1,ny+1:ny+nx)) + + + SUM(R(I,1:nu,S(6))*MED(1:nu)) + +C DRAW y(T+inf) ~ f(y(T+1)|x(T+inf),Z(T+inf),zk(T+inf)) + DO 60 I=1,ny +60 FORE(inf,I) = SUM(H(I,1:nx,S(2))*FORE(inf,ny+1:ny+nx)) + + + SUM(c(I,1:nz,S(1))*zk(inf,1:nz)) + + + SUM(G(I,1:nu,S(3))*MED(1:nu)) + +100 CONTINUE + + DEALLOCATE (R,c,H,G,a,F) + IF(nv.GT.0) DEALLOCATE(P1,P2,P3,P4,P5,P6,PMAT,PE) + + RETURN END diff --git a/funct1.for b/funct1.for index 6a4bcd0caed9e50d61c79673ce924774b307c1a0..35b7bf0cdce99eae6ddc17c436293c12f392cf90 100644 --- a/funct1.for +++ b/funct1.for @@ -1,13 +1,13 @@ -C ------------------------------------------------------------------------- -C FUNCT1 computes -loglikelihood and the numerical derivatives for E04UCF -C Developed by A.Rossi, C.Planas and G.Fiorentini -C -C Copyright (C) 2010-2014 European Commission -C +C ------------------------------------------------------------------------- +C FUNCT1 computes -loglikelihood and the numerical derivatives for E04UCF +C Developed by A.Rossi, C.Planas and G.Fiorentini +C +C Copyright (C) 2010-2014 European Commission +C C This file is part of Program DMM C -C DMM is free software developed at the Joint Research Centre of the -C European Commission: you can redistribute it and/or modify it under +C DMM is free software developed at the Joint Research Centre of the +C European Commission: you can redistribute it and/or modify it under C the terms of the GNU General Public License as published by C the Free Software Foundation, either version 3 of the License, or C (at your option) any later version. @@ -18,132 +18,132 @@ C MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the C GNU General Public License for more details. C C You should have received a copy of the GNU General Public License -C along with DMM. If not, see <http://www.gnu.org/licenses/>. -C -------------------------------------------------------------------------- - SUBROUTINE FUNCT1(MODE,NPAR,CHI,DLL,OBJGRD,NNN,IU,U) - - USE dfwin - INTERFACE - SUBROUTINE DESIGN(ny,nz,nx,nu,ns,nt,theta,c,H,G,a,F,R) - INTEGER ny,nz,nx,nu,ns(6),nt - DOUBLE PRECISION theta(nt) - DOUBLE PRECISION c(ny,max(1,nz),ns(1)),H(ny,nx,ns(2)), - 1 G(ny,nu,ns(3)),a(nx,ns(4)),F(nx,nx,ns(5)),R(nx,nu,ns(6)) - END SUBROUTINE - END INTERFACE - INTEGER POINTER pdll - POINTER (pdll,fittizia) ! ASSOCIATE pointer pdll alla DLL ad una varibile fittizia - POINTER (pdesign,DESIGN) - -C INPUT - INTEGER MODE,NPAR,NNN - INTEGER*8 IU(72) - DOUBLE PRECISION U(IU(1)*(2*IU(4)+IU(5)+7)+3*IU(8)+2), - 1 CHI(NPAR),OBJGRD(NPAR) - -C OUTPUT - DOUBLE PRECISION DLL - -C LOCALS - INTEGER nobs,d(2),ny,nz,nx,nu,nv,ns(6),nt,np,nmis,I,J,nstot, - 1 INFOS(9,6),IMSVAR - INTEGER, ALLOCATABLE:: INDT(:),IYK(:,:),S(:,:) - DOUBLE PRECISION, ALLOCATABLE:: theta(:),thetaprior(:,:),psi(:), - 1 yk(:,:) - DOUBLE PRECISION, ALLOCATABLE:: c(:,:,:),H(:,:,:),G(:,:,:), - 2 a(:,:),F(:,:,:),R(:,:,:) - DOUBLE PRECISION, ALLOCATABLE:: LIKE(:),XT(:,:),PT(:,:,:), - 1 Xdd(:,:),Pdd(:,:,:) - DOUBLE PRECISION, ALLOCATABLE:: XSMOOTH(:,:),XSSE(:,:), - 1 SSMOOTH(:,:),INN(:,:) - -C Retrive metainformation - nobs = IU(1) - d(1:2) = IU(2:3) - ny = IU(4) - nz = IU(5) - nx = IU(6) - nu = IU(7) - nt = IU(8) - ns(1:6)= IU(9:14) - pdll = IU(15) - nv = IU(16) - np = IU(71) - IMSVAR = IU(72) - - ALLOCATE(INDT(nt+2),IYK(nobs,ny+1),S(nobs,6)) - ALLOCATE(theta(nt),thetaprior(nt,4),psi(max(1,np)),yk(nobs,ny+nz)) - ALLOCATE(LIKE(nobs),XT(0:nobs,nx),PT(0:nobs,nx,nx), - 1 Xdd(max(d(1),1),nx),Pdd(max(d(1),1),nx,nx)) - - DO J=1,6 - INFOS(1:9,J) = IU(17+9*(J-1):16+J*9) - ENDDO - DO J=1,ny+nz - yk(:,J) = U(1+nobs*(J-1):J*nobs) - ENDDO - thetaprior(1:nt,3) = U(nobs*(ny+nz)+1:nobs*(ny+nz)+nt) - thetaprior(1:nt,4) = U(nobs*(ny+nz)+nt+1:nobs*(ny+nz)+2*nt) - I = nobs*(ny+nz)+2*nt+1 - INDT(1:nt+2) = U(I:I+nt+1) - I = I+nt+2 - DO J=1,ny+1 - IYK(1:nobs,J) = U(I+nobs*(J-1):I+nobs*J-1) - ENDDO - I = I+nobs*(ny+1) - DO J = 1,6 - S(1:nobs,J) = U(I+(J-1)*nobs:I-1+J*nobs) - ENDDO - -C Expand theta and psi - theta(1:nt) = thetaprior(1:nt,3) - theta(INDT(1:NPAR-np)) = CHI(1:NPAR-np) - IF (np.GT.0) psi(1:np) = CHI(NPAR-np+1:NPAR) - -C Evaluate the likelihood - ALLOCATE(c(ny,max(1,nz),ns(1)),H(ny,nx,ns(2)), - 1 G(ny,nu,ns(3)),a(nx,ns(4)),F(nx,nx,ns(5)),R(nx,nu,ns(6))) - pdesign = getprocaddress(pdll, "design_"C) - CALL DESIGN(ny,nz,nx,nu,ns,nt,theta,c,H,G,a,F,R) - nmis = ny*nobs-SUM(IYK(1:nobs,ny+1)) - IF (nv.EQ.0) THEN - IF (nmis.GT.0) THEN - CALL IKF(d,ny,nz,nx,nu,ns,S(1:max(d(1),1),1:6), - 1 yk(1:max(d(1),1),1:ny+nz),IYK(1:max(d(1),1),1:ny+1), - 2 c,H,G,a,F,R,Xdd,Pdd,LIKE(1:max(d(1),1))) - XT(d(1),1:nx) = Xdd(max(d(1),1),1:nx) - PT(d(1),1:nx,1:nx) = Pdd(max(d(1),1),1:nx,1:nx) - CALL KF(nobs,d,ny,nz,nx,nu,ns,S,yk,IYK,c,H,G,a,F,R,XT,PT,LIKE) - ELSE - CALL IKF2(d,ny,nz,nx,nu,ns,S(1:max(d(1),1),1:6), - 1 yk(1:max(d(1),1),1:ny+nz), - 2 c,H,G,a,F,R,Xdd,Pdd,LIKE(1:max(d(1),1))) - XT(d(1),1:nx) = Xdd(max(d(1),1),1:nx) - PT(d(1),1:nx,1:nx) = Pdd(max(d(1),1),1:nx,1:nx) - CALL KF2(nobs,d,ny,nz,nx,nu,ns,S,yk,c,H,G,a,F,R,XT,PT,LIKE) - ENDIF - ELSE - nstot = PRODUCT(INFOS(8,1:nv)) - IF (IMSVAR.EQ.1) THEN ! Hamilton (Ecoca 1989) filter - ALLOCATE(SSMOOTH(nobs,nstot),INN(nobs,ny)) - CALL HF(nobs,nx,nstot,nz,nu,ns,nv,np,psi,0,yk,IYK,INFOS, - 1 c,a,F,R,SSMOOTH,INN,LIKE) - DEALLOCATE(SSMOOTH,INN) - ELSE ! KIM (JoE 1994) algorithm - ALLOCATE(XSMOOTH(nobs,nx),XSSE(nobs,nx),SSMOOTH(nobs,nstot), - 1 INN(nobs,ny)) - CALL KIM(nobs,d,ny,nz,nx,nu,ns,nstot,nv,np,INFOS,yk,IYK, - 1 c,H,G,a,F,R,psi,0,XSMOOTH,XSSE,SSMOOTH,INN,LIKE) - DEALLOCATE(XSMOOTH,XSSE,SSMOOTH,INN) - ENDIF - - ENDIF - - DLL = -SUM(LIKE(d(1)+1:nobs)) - - DEALLOCATE(LIKE) - DEALLOCATE(c,H,G,a,F,R) - DEALLOCATE(INDT,IYK,S,theta,thetaprior,psi,yk,XT,PT,Xdd,Pdd) - - RETURN - END +C along with DMM. If not, see <http://www.gnu.org/licenses/>. +C -------------------------------------------------------------------------- + SUBROUTINE FUNCT1(MODE,NPAR,CHI,DLL,OBJGRD,NNN,IU,U) + + USE dfwin + INTERFACE + SUBROUTINE DESIGN(ny,nz,nx,nu,ns,nt,theta,c,H,G,a,F,R) + INTEGER ny,nz,nx,nu,ns(6),nt + DOUBLE PRECISION theta(nt) + DOUBLE PRECISION c(ny,max(1,nz),ns(1)),H(ny,nx,ns(2)), + 1 G(ny,nu,ns(3)),a(nx,ns(4)),F(nx,nx,ns(5)),R(nx,nu,ns(6)) + END SUBROUTINE + END INTERFACE + INTEGER POINTER pdll + POINTER (pdll,fittizia) ! ASSOCIATE pointer pdll alla DLL ad una varibile fittizia + POINTER (pdesign,DESIGN) + +C INPUT + INTEGER MODE,NPAR,NNN + INTEGER*8 IU(72) + DOUBLE PRECISION U(IU(1)*(2*IU(4)+IU(5)+7)+3*IU(8)+2), + 1 CHI(NPAR),OBJGRD(NPAR) + +C OUTPUT + DOUBLE PRECISION DLL + +C LOCALS + INTEGER nobs,d(2),ny,nz,nx,nu,nv,ns(6),nt,np,nmis,I,J,nstot, + 1 INFOS(9,6),IMSVAR + INTEGER, ALLOCATABLE:: INDT(:),IYK(:,:),S(:,:) + DOUBLE PRECISION, ALLOCATABLE:: theta(:),thetaprior(:,:),psi(:), + 1 yk(:,:) + DOUBLE PRECISION, ALLOCATABLE:: c(:,:,:),H(:,:,:),G(:,:,:), + 2 a(:,:),F(:,:,:),R(:,:,:) + DOUBLE PRECISION, ALLOCATABLE:: LIKE(:),XT(:,:),PT(:,:,:), + 1 Xdd(:,:),Pdd(:,:,:) + DOUBLE PRECISION, ALLOCATABLE:: XSMOOTH(:,:),XSSE(:,:), + 1 SSMOOTH(:,:),INN(:,:) + +C Retrive metainformation + nobs = IU(1) + d(1:2) = IU(2:3) + ny = IU(4) + nz = IU(5) + nx = IU(6) + nu = IU(7) + nt = IU(8) + ns(1:6)= IU(9:14) + pdll = IU(15) + nv = IU(16) + np = IU(71) + IMSVAR = IU(72) + + ALLOCATE(INDT(nt+2),IYK(nobs,ny+1),S(nobs,6)) + ALLOCATE(theta(nt),thetaprior(nt,4),psi(max(1,np)),yk(nobs,ny+nz)) + ALLOCATE(LIKE(nobs),XT(0:nobs,nx),PT(0:nobs,nx,nx), + 1 Xdd(max(d(1),1),nx),Pdd(max(d(1),1),nx,nx)) + + DO J=1,6 + INFOS(1:9,J) = IU(17+9*(J-1):16+J*9) + ENDDO + DO J=1,ny+nz + yk(:,J) = U(1+nobs*(J-1):J*nobs) + ENDDO + thetaprior(1:nt,3) = U(nobs*(ny+nz)+1:nobs*(ny+nz)+nt) + thetaprior(1:nt,4) = U(nobs*(ny+nz)+nt+1:nobs*(ny+nz)+2*nt) + I = nobs*(ny+nz)+2*nt+1 + INDT(1:nt+2) = U(I:I+nt+1) + I = I+nt+2 + DO J=1,ny+1 + IYK(1:nobs,J) = U(I+nobs*(J-1):I+nobs*J-1) + ENDDO + I = I+nobs*(ny+1) + DO J = 1,6 + S(1:nobs,J) = U(I+(J-1)*nobs:I-1+J*nobs) + ENDDO + +C Expand theta and psi + theta(1:nt) = thetaprior(1:nt,3) + theta(INDT(1:NPAR-np)) = CHI(1:NPAR-np) + IF (np.GT.0) psi(1:np) = CHI(NPAR-np+1:NPAR) + +C Evaluate the likelihood + ALLOCATE(c(ny,max(1,nz),ns(1)),H(ny,nx,ns(2)), + 1 G(ny,nu,ns(3)),a(nx,ns(4)),F(nx,nx,ns(5)),R(nx,nu,ns(6))) + pdesign = getprocaddress(pdll, "design_"C) + CALL DESIGN(ny,nz,nx,nu,ns,nt,theta,c,H,G,a,F,R) + nmis = ny*nobs-SUM(IYK(1:nobs,ny+1)) + IF (nv.EQ.0) THEN + IF (nmis.GT.0) THEN + CALL IKF(d,ny,nz,nx,nu,ns,S(1:max(d(1),1),1:6), + 1 yk(1:max(d(1),1),1:ny+nz),IYK(1:max(d(1),1),1:ny+1), + 2 c,H,G,a,F,R,Xdd,Pdd,LIKE(1:max(d(1),1))) + XT(d(1),1:nx) = Xdd(max(d(1),1),1:nx) + PT(d(1),1:nx,1:nx) = Pdd(max(d(1),1),1:nx,1:nx) + CALL KF(nobs,d,ny,nz,nx,nu,ns,S,yk,IYK,c,H,G,a,F,R,XT,PT,LIKE) + ELSE + CALL IKF2(d,ny,nz,nx,nu,ns,S(1:max(d(1),1),1:6), + 1 yk(1:max(d(1),1),1:ny+nz), + 2 c,H,G,a,F,R,Xdd,Pdd,LIKE(1:max(d(1),1))) + XT(d(1),1:nx) = Xdd(max(d(1),1),1:nx) + PT(d(1),1:nx,1:nx) = Pdd(max(d(1),1),1:nx,1:nx) + CALL KF2(nobs,d,ny,nz,nx,nu,ns,S,yk,c,H,G,a,F,R,XT,PT,LIKE) + ENDIF + ELSE + nstot = PRODUCT(INFOS(8,1:nv)) + IF (IMSVAR.EQ.1) THEN ! Hamilton (Ecoca 1989) filter + ALLOCATE(SSMOOTH(nobs,nstot),INN(nobs,ny)) + CALL HF(nobs,nx,nstot,nz,nu,ns,nv,np,psi,0,yk,IYK,INFOS, + 1 c,a,F,R,SSMOOTH,INN,LIKE) + DEALLOCATE(SSMOOTH,INN) + ELSE ! KIM (JoE 1994) algorithm + ALLOCATE(XSMOOTH(nobs,nx),XSSE(nobs,nx),SSMOOTH(nobs,nstot), + 1 INN(nobs,ny)) + CALL KIM(nobs,d,ny,nz,nx,nu,ns,nstot,nv,np,INFOS,yk,IYK, + 1 c,H,G,a,F,R,psi,0,XSMOOTH,XSSE,SSMOOTH,INN,LIKE) + DEALLOCATE(XSMOOTH,XSSE,SSMOOTH,INN) + ENDIF + + ENDIF + + DLL = -SUM(LIKE(d(1)+1:nobs)) + + DEALLOCATE(LIKE) + DEALLOCATE(c,H,G,a,F,R) + DEALLOCATE(INDT,IYK,S,theta,thetaprior,psi,yk,XT,PT,Xdd,Pdd) + + RETURN + END diff --git a/gammln.for b/gammln.for index e9a2c4718804752acf1480cfa00148a59e216720..7f335d28327a52ccb5c6a57b2ca3da92cd69c91c 100644 --- a/gammln.for +++ b/gammln.for @@ -1,11 +1,11 @@ -C ------------------------------------------------------------------------ -C GAMMLN returns the value for the natural logarithm of the Gamma function -C Numerical Recipes - Chapter 6 -C +C ------------------------------------------------------------------------ +C GAMMLN returns the value for the natural logarithm of the Gamma function +C Numerical Recipes - Chapter 6 +C C This file is part of Program DMM C -C DMM is free software developed at the Joint Research Centre of the -C European Commission: you can redistribute it and/or modify it under +C DMM is free software developed at the Joint Research Centre of the +C European Commission: you can redistribute it and/or modify it under C the terms of the GNU General Public License as published by C the Free Software Foundation, either version 3 of the License, or C (at your option) any later version. @@ -16,29 +16,29 @@ C MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the C GNU General Public License for more details. C C You should have received a copy of the GNU General Public License -C along with DMM. If not, see <http://www.gnu.org/licenses/>. -C -------------------------------------------------------------------------- - DOUBLE PRECISION FUNCTION gammln(xx) -C INPUT - DOUBLE PRECISION xx - INTEGER j - DOUBLE PRECISION ser,stp,tmp,x,y,cof(6) - SAVE cof,stp - DATA cof,stp/76.18009172947146d0,-86.50532032941677d0, - * 24.01409824083091d0,-1.231739572450155d0,.1208650973866179d-2, - * -.5395239384953d-5,2.5066282746310005d0/ - x=xx - y=x - tmp=x+5.5d0 - tmp=(x+0.5d0)*dlog(tmp)-tmp - ser=1.000000000190015d0 - do 11 j=1,6 - y=y+1.d0 - ser=ser+cof(j)/y -11 continue - gammln=tmp+log(stp*ser/x) - return - END - - - +C along with DMM. If not, see <http://www.gnu.org/licenses/>. +C -------------------------------------------------------------------------- + DOUBLE PRECISION FUNCTION gammln(xx) +C INPUT + DOUBLE PRECISION xx + INTEGER j + DOUBLE PRECISION ser,stp,tmp,x,y,cof(6) + SAVE cof,stp + DATA cof,stp/76.18009172947146d0,-86.50532032941677d0, + * 24.01409824083091d0,-1.231739572450155d0,.1208650973866179d-2, + * -.5395239384953d-5,2.5066282746310005d0/ + x=xx + y=x + tmp=x+5.5d0 + tmp=(x+0.5d0)*dlog(tmp)-tmp + ser=1.000000000190015d0 + do 11 j=1,6 + y=y+1.d0 + ser=ser+cof(j)/y +11 continue + gammln=tmp+log(stp*ser/x) + return + END + + + diff --git a/gck.for b/gck.for index ba5cc9c5d094f17b19e1d381982155bd6f93ddca..a5a66130f12b24540fb9f3d5395729f54cb09af0 100644 --- a/gck.for +++ b/gck.for @@ -1,51 +1,51 @@ -C ---------------------------------------------------------------------- -C GCK Implements the SINGLE-MOVE Sampler of -C Gerlach, Carter and Kohn (2000): Efficient Bayesian Inference -C for Dynamic Mixture Models, JASA, 95,451, pp.819-28 -C Developed by A.Rossi, C.Planas and G.Fiorentini -C -C Pr[Z(t)|Z(\t),Y] pto Pr[Y^(t+1,T)|Y^t,Z] x Pr[Y(t)|Y^(t-1),Z^t] -C x Pr[Z(t)|Z(\t)] -C -C State-space format: y(t) = c(t)z(t) + H(t)x(t) + G(t)u(t) -C x(t) = a(t) + F(t)x(t-1) + R(t)u(t) -C -C y(t) (ny x 1) ny = # of endogenous series -C z(t) (nz x 1) nz = # of exogenous series -C x(t) (nx x 1) nx = # of continous states -C u(t) (nu x 1) nu = # of shocks -C c(t) (ny x nz x ns1) ns1 = # of states for c(t) -C H(t) (ny x nx x ns2) ns2 = # of states for H(t) -C G(t) (ny x nu x ns3) ns3 = # of states for G(t) -C a(t) (nx x ns4) ns4 = # of states for a(t) -C F(t) (nx x nx x ns5) ns5 = # of states for F(t) -C R(t) (nx x nu x ns6) ns6 = # of states for R(t) -C -C FURTHER INPUT: -C -C nobs: # of observatios -C d(1): order of integration of the system -C d(2): number of non-stationary elements -C nv: # of discrete latent variables (S1,S2,...) -C ns: ns1,ns2,... -C nstot: total # of states (states of S1 x S2 x ...x Snv) -C nt: dimension of theta -C np: dimension of psi -C PMAT: (nstot x nstot) one-step transition probabilities -C PE: ergodic distribution of S1 x S2 x ...x Snv -C INFOS: (9 x 6) set latent variables -C nstot: total # of states i.e. ns1 x ns2 x ...x nsv -C -C OUTPUT: -C -C Z:(nobs x 1) takes values {1,2,...,nstot} -C -C Copyright (C) 2010-2014 European Commission -C +C ---------------------------------------------------------------------- +C GCK Implements the SINGLE-MOVE Sampler of +C Gerlach, Carter and Kohn (2000): Efficient Bayesian Inference +C for Dynamic Mixture Models, JASA, 95,451, pp.819-28 +C Developed by A.Rossi, C.Planas and G.Fiorentini +C +C Pr[Z(t)|Z(\t),Y] pto Pr[Y^(t+1,T)|Y^t,Z] x Pr[Y(t)|Y^(t-1),Z^t] +C x Pr[Z(t)|Z(\t)] +C +C State-space format: y(t) = c(t)z(t) + H(t)x(t) + G(t)u(t) +C x(t) = a(t) + F(t)x(t-1) + R(t)u(t) +C +C y(t) (ny x 1) ny = # of endogenous series +C z(t) (nz x 1) nz = # of exogenous series +C x(t) (nx x 1) nx = # of continous states +C u(t) (nu x 1) nu = # of shocks +C c(t) (ny x nz x ns1) ns1 = # of states for c(t) +C H(t) (ny x nx x ns2) ns2 = # of states for H(t) +C G(t) (ny x nu x ns3) ns3 = # of states for G(t) +C a(t) (nx x ns4) ns4 = # of states for a(t) +C F(t) (nx x nx x ns5) ns5 = # of states for F(t) +C R(t) (nx x nu x ns6) ns6 = # of states for R(t) +C +C FURTHER INPUT: +C +C nobs: # of observatios +C d(1): order of integration of the system +C d(2): number of non-stationary elements +C nv: # of discrete latent variables (S1,S2,...) +C ns: ns1,ns2,... +C nstot: total # of states (states of S1 x S2 x ...x Snv) +C nt: dimension of theta +C np: dimension of psi +C PMAT: (nstot x nstot) one-step transition probabilities +C PE: ergodic distribution of S1 x S2 x ...x Snv +C INFOS: (9 x 6) set latent variables +C nstot: total # of states i.e. ns1 x ns2 x ...x nsv +C +C OUTPUT: +C +C Z:(nobs x 1) takes values {1,2,...,nstot} +C +C Copyright (C) 2010-2014 European Commission +C C This file is part of Program DMM C -C DMM is free software developed at the Joint Research Centre of the -C European Commission: you can redistribute it and/or modify it under +C DMM is free software developed at the Joint Research Centre of the +C European Commission: you can redistribute it and/or modify it under C the terms of the GNU General Public License as published by C the Free Software Foundation, either version 3 of the License, or C (at your option) any later version. @@ -56,341 +56,341 @@ C MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the C GNU General Public License for more details. C C You should have received a copy of the GNU General Public License -C along with DMM. If not, see <http://www.gnu.org/licenses/>. -C ---------------------------------------------------------------------- - SUBROUTINE GCK(nobs,d,ny,nz,nx,nu,nv,ns,nstot,nt,np,yk,IYK, - 1 theta,psi,INFOS,pdll,Z,S) - - USE dfwin - INTERFACE - SUBROUTINE DESIGN(ny,nz,nx,nu,ns,nt,theta,c,H,G,a,F,R) - INTEGER ny,nz,nx,nu,ns(6),nt - DOUBLE PRECISION theta(nt) - DOUBLE PRECISION c(ny,max(1,nz),ns(1)),H(ny,nx,ns(2)), - 1 G(ny,nu,ns(3)),a(nx,ns(4)),F(nx,nx,ns(5)),R(nx,nu,ns(6)) - END SUBROUTINE - END INTERFACE - POINTER (pdll,fittizia) ! ASSOCIATE pointer P alla DLL ad una varibile fittizia - POINTER (pdesign,DESIGN) ! IMPORTANT associo il puntatore pdesign alla Interface definita - -C INPUT - INTEGER nobs,d(2),ny,nz,nx,nu,nv,ns(6),nstot,nt,np,IYK(nobs,ny+1), - 1 INFOS(9,6) - DOUBLE PRECISION yk(nobs,ny+nz),theta(nt),psi(np) - -C INPUT/OUTPUT - INTEGER Z(nobs),S(nobs,6) - -C LOCALS - INTEGER IT,I,J,K,IFAIL,ISEQ,IMAX(1),iny,NIFS,KKK - INTEGER IS(6),SH(3),IND(max(1,d(1)),6),SEQ(nv),IFS(nstot),dc(2) - DOUBLE PRECISION c(ny,max(nz,1),ns(1)),H(ny,nx,ns(2)), - 1 G(ny,nu,ns(3)),a(nx,ns(4)),F(nx,nx,ns(5)),R(nx,nu,ns(6)) - DOUBLE PRECISION PMAT(nstot,nstot),PE(nstot), - 1 P1(MAX(1,INFOS(8,1)*MIN(INFOS(9,1),1)), - 1 MAX(1,INFOS(8,1)*MIN(INFOS(9,1),1))), - 1 P2(MAX(1,INFOS(8,2)*MIN(INFOS(9,2),1)), - 1 MAX(1,INFOS(8,2)*MIN(INFOS(9,2),1))), - 1 P3(MAX(1,INFOS(8,3)*MIN(INFOS(9,3),1)), - 1 MAX(1,INFOS(8,3)*MIN(INFOS(9,3),1))), - 1 P4(MAX(1,INFOS(8,4)*MIN(INFOS(9,4),1)), - 1 MAX(1,INFOS(8,4)*MIN(INFOS(9,4),1))), - 1 P5(MAX(1,INFOS(8,5)*MIN(INFOS(9,5),1)), - 1 MAX(1,INFOS(8,5)*MIN(INFOS(9,5),1))), - 1 P6(MAX(1,INFOS(8,6)*MIN(INFOS(9,6),1)), - 1 MAX(1,INFOS(8,6)*MIN(INFOS(9,6),1))) - DOUBLE PRECISION OM(nobs,nx,nx),MU(nobs,nx) - DOUBLE PRECISION HRG(ny,nu),VV(ny,ny),HF(ny,nx),COM(ny+1,ny), - 1 HRGV(nu,ny),B(nx,ny),RR(nx,nx),BH(nx,nx),BHRG(nx,nu),DD(nx,nx), - 2 CS(nx,nx),CC(nx,nx),AA(nx,nx),DI(nx,nx),COM1(nx+1,nx),Ha(ny), - 3 OMC(nx,nx),OMCDIC(nx,nx),AOMCDIC(nx,nx),AOMCDICOM(nx,nx), - 4 VVHF(ny,nx),Xdd(0:max(1,d(1)),nx),Pdd(0:max(1,d(1)),nx,nx), - 5 WORK(3*nx),LAM(nx),AUX,U - INTEGER, ALLOCATABLE:: IRANK(:) - DOUBLE PRECISION, ALLOCATABLE:: DLL(:),PROB(:),PROBL(:), - 1 XT(:,:),PT(:,:,:),PMUL(:,:,:) - DOUBLE PRECISION EPS,ONE,ZERO - DATA EPS/1.D-14/,ONE/1.0D0/,ZERO/0.0D0/ - DOUBLE PRECISION genunf,LEMMA4,MARKOVP - - pdesign = getprocaddress(pdll, "design_"C) - CALL DESIGN(ny,nz,nx,nu,ns,nt,theta,c,H,G,a,F,R) - CALL DESIGNZ(nv,np,psi,INFOS,P1,P2,P3,P4,P5,P6) -C PALL(i,j) = Pr[Z(t+1)=i|Z(t)=j], Z = S1 x S2 x ... x Snv - CALL PPROD(nv,nstot,INFOS,P1,P2,P3,P4,P5,P6,PMAT) -C ERGODIC solves PE: PE*(I-P') = 0 - CALL ERGODIC(nstot,PMAT,PE) - -C OMEGA and MU RECURSIONS - OM(:,:,:)= ZERO - MU(:,:) = ZERO - DO 250 IT = nobs-1,1,-1 -C INT2SEQ map from Z(IT+1) to IS = (k1 k2 k3 k4 k5 k6) - CALL INT2SEQ(Z(IT+1),nv,INFOS,SEQ,IS) - iny = IYK(IT+1,ny+1) - - DO 10 I=1,iny - Ha(I) = SUM(H(IYK(IT+1,I),:,IS(2))*a(:,IS(4))) ! H*a (ny x 1) - DO 10 J=1,nu -10 HRG(I,J) = SUM(H(IYK(IT+1,I),:,IS(2))*R(:,J,IS(6))) - + + G(IYK(IT+1,I),J,IS(3)) ! HR+G (ny x nu) - - DO 20 I=1,iny - DO 20 J=1,iny -20 VV(I,J) = SUM(HRG(I,1:nu)*HRG(J,1:nu)) ! (HR+G)*(HR+G)' (ny x ny) - - DO 30 I=1,iny - DO 30 J=1,nx -30 HF(I,J)=SUM(H(IYK(IT+1,I),:,IS(2))*F(:,J,IS(5))) ! HF(ny x nx) - - COM(1:iny,1:iny) = VV(1:iny,1:iny) - IFAIL = -1 -C CALL F01ADF(iny,COM(1:iny+1,1:iny), iny+1, IFAIL) - CALL DPOTRF('L',iny,COM(1:iny,1:iny),iny,IFAIL) ! COM = L*L' - CALL DPOTRI('L',iny,COM(1:iny,1:iny),iny,IFAIL) ! COM = VV^-1 - DO 40 I=1,iny - DO 40 J=1,I - VV(I,J) = COM(I,J) -40 VV(J,I) = VV(I,J) ! inv[(HR+G)*(HR+G)'] (ny x ny) - -C B = R*(H*R+G)'*VV (nx x ny) - DO 50 I=1,nu - DO 50 J=1,iny -50 HRGV(I,J) = SUM(HRG(1:iny,I)*VV(1:iny,J)) ! (H*R+G)'*VV (nu x ny) - - DO 60 I=1,nx - DO 60 J=1,iny -60 B(I,J) = SUM(R(I,1:nu,IS(6))*HRGV(1:nu,J)) ! B (nx x ny) - - DO 70 I=1,nx - DO 70 J=1,nx - RR(I,J) = SUM(R(I,:,IS(6))*R(J,:,IS(6))) ! RR' (nx x nx) -70 BH(I,J) = SUM(B(I,1:iny)*H(IYK(IT+1,1:iny),J,IS(2))) ! BH (nx x nx) - -C FIND CS such that CS*CS' = RR'-B*HRG*R' (nx x nx) - DO 80 I=1,nx - DO 80 J=1,nu -80 BHRG(I,J) = SUM(B(I,1:iny)*HRG(1:iny,J)) - - DO 90 I=1,nx - DO 90 J=1,I -90 CC(I,J) = RR(I,J) - SUM(BHRG(I,1:nu)*R(J,1:nu,IS(6))) - - IFAIL=-1 -C CALL F02FAF('V','L',nx,CC,nx,LAM,WORK,3*nx,IFAIL) - CALL DSYEV( 'V','L',nx,CC,nx,LAM,WORK,3*nx,IFAIL) - DO 100 I=1,nx - IF (LAM(I).LE.EPS) LAM(I)= ZERO -100 CS(:,I) = CC(1:nx,I)*DSQRT(LAM(I)) - -C AA = F - B*HF (nx x nx) - DO 110 I=1,nx - DO 110 J=1,nx -110 AA(I,J) = F(I,J,IS(5)) - SUM(B(I,1:iny)*HF(1:iny,J)) - -C OMC = OM(+1)*CS (nx x nx) - DO 120 I=1,nx - DO 120 J=1,nx -120 OMC(I,J) = SUM(OM(IT+1,I,:)*CS(:,J)) - -C DD = I + CS'*OM(+1)*CS (nx x nx) - DD(:,:) = ZERO - DO 130 I=1,nx - DD(I,I) = ONE - DO 130 J=1,I - DD(I,J) = DD(I,J) + SUM(CS(:,I)*OMC(:,J)) -130 DD(J,I) = DD(I,J) - -C DI = inv(DD) (nx x nx) - COM1(1:nx,1:nx) = DD(1:nx,1:nx) - IFAIL = -1 -C CALL F01ADF(nx,COM1,nx+1,IFAIL) - CALL DPOTRF('L',nx,COM1(1:nx,1:nx),nx,IFAIL) ! COM1 = L*L' - CALL DPOTRI('L',nx,COM1(1:nx,1:nx),nx,IFAIL) ! COM1 = DD^-1 - - DO 135 I=1,nx - DO 135 J=1,I - DI(I,J) = COM1(I,j) -135 DI(J,I) = DI(I,J) - -C OMCDIC = I - OM(+1)*CS*DI*CS' (nx x nx) - DO 140 I=1,nx - DO 140 J=1,nx -140 COM1(I,J) = SUM(OMC(I,:)*DI(:,J)) ! OM(+1)*CS*DI (nx x nx) - - OMCDIC(:,:) = ZERO - DO 145 I=1,nx - OMCDIC(I,I) = ONE - DO 145 J=1,nx -145 OMCDIC(I,J) = OMCDIC(I,J)-SUM(COM1(I,:)*CS(J,:)) - -C AOMCDIC = AA'*(I - OM(+1)*CS*DINV CS') (nx x nx) - DO 150 I=1,nx - DO 150 J=1,nx -150 AOMCDIC(I,J) = SUM(AA(:,I)*OMCDIC(:,J)) - -C AOMCDICOM = AA'*(I - OM(+1)*CS*DINV*CS')*OM(+1) (nx x nx) - DO 160 I=1,nx - DO 160 J=1,nx -160 AOMCDICOM(I,J) = SUM(AOMCDIC(I,:)*OM(IT+1,:,J)) - -C VV*H*F (ny x nx) - DO 170 I=1,iny - DO 170 J=1,nx -170 VVHF(I,J) = SUM(VV(I,1:iny)*HF(1:iny,J)) - -C OM = AA*(I - OM(+1)*C*DI*C')*OM(+1)*AA' + -C + F'*H'*VV*H*F - DO 180 I=1,nx - DO 180 J=1,nx -180 OM(IT,I,J) = SUM(AOMCDICOM(I,:)*AA(:,J)) - + + SUM(HF(1:iny,I)*VVHF(1:iny,J)) - -C MU = AA'*(I - OM(+1)*C*DI* C')*MU(+1) + -C - AA'*(I - OM C DINV C')*OM(+1)*LAM -C + F'*H'*VV*(y(+1) - H*a - c*z) -C LAM = a - B*H*a + B*[y(+1)-c*z] (nx x 1) - COM(1:iny,1) = 0.D0 - DO 185 I=1,iny -185 COM(I,1) = SUM(c(IYK(IT+1,I),1:nz,IS(1))*yk(IT+1,ny+1:ny+nz)) - - DO 190 I=1,nx -190 LAM(I) = a(I,IS(4)) - SUM(BH(I,1:nx)*a(1:nx,IS(4))) - + + SUM(B(I,1:iny)*(yk(IT+1,IYK(IT+1,1:iny)) - + - COM(1:iny,1))) - DO 200 I=1,nx -200 MU(IT,I) = SUM(AOMCDIC(I,:)*MU(IT+1,:)) - + - SUM(AOMCDICOM(I,:)*LAM(:)) - + + SUM(VVHF(1:iny,I)*(yk(IT+1,IYK(IT+1,1:iny)) - # - Ha(1:iny)-COM(1:iny,1))) - -250 CONTINUE - -C --------------- -C START SAMPLING -C --------------- - ALLOCATE(DLL(nstot),PROB(nstot),PROBL(nstot),XT(0:nstot,nx), - 1 PT(0:nstot,nx,nx),IRANK(nstot),PMUL(nstot,nstot,2)) - PMUL(:,:,1) = PMAT(:,:) ! one-step ahead - PMUL(:,:,2) = 0.D0 ! two-step ahead - DO 260 I = 1,nstot - DO 260 J = 1,nstot - DO 260 K = 1,nstot -260 PMUL(I,J,2) = PMUL(I,J,2) + PMAT(I,K)*PMAT(K,J) - -C FEASIBLE Z-STATES - NIFS = 0 - IFS(:) = 0 - DO 265 K =1,nstot - IF (PE(K).GT.0.D0) THEN - NIFS = NIFS + 1 - IFS(NIFS) = K -265 ENDIF - dc(1:2) = 0 - DO 2000 IT = 1,nobs - DO 1000 KKK = 1,NIFS - K = IFS(KKK) - CALL INT2SEQ(K,nv,INFOS,SEQ,IS(:)) - IF ((IT.LE.d(1)).AND.(d(1).GT.0)) THEN - DO 300 I = 1,d(1) -300 CALL INT2SEQ(Z(I),nv,INFOS,SEQ,IND(I,:)) - IND(IT,:)= IS(:) - CALL IKF(d,ny,nz,nx,nu,ns,IND(1:d(1),:),yk(1:d(1),:), - 1 IYK(1:d(1),:),c,H,G,a,F,R,Xdd(1:d(1),:), - 2 Pdd(1:d(1),:,:),DLL(1:max(1,d(1)))) - XT(K,:) = Xdd(IT,:) ! xi(t|t) - PT(K,:,:) = Pdd(IT,:,:) ! P(t|t) - DLL(:) = ZERO ! log likelihood - ELSEIF ((IT.GT.d(1)).AND.(d(1).GT.0)) THEN -C Input XT(0) PT(0), Output XT(K),PT(K),DLL(K) - Xdd(0,:) = XT(0,:) - Pdd(0,:,:) = PT(0,:,:) - CALL KF(1,dc,ny,nz,nx,nu,ns,IS,yk(IT,:),IYK(IT,:),c,H,G,a,F,R, - 1 Xdd(0:1,:),Pdd(0:1,:,:),DLL(K)) - XT(K,:) = Xdd(1,:) - PT(K,:,:) = Pdd(1,:,:) - ELSEIF ((IT.EQ.1).AND.(d(1).EQ.0)) THEN - CALL IKF(d,ny,nz,nx,nu,ns,IS(:),yk(1,:),IYK(1,:),c,H,G,a,F,R, - 1 Xdd(0,:),Pdd(0,:,:),DLL(K)) - CALL KF(1,dc,ny,nz,nx,nu,ns,IS(:),yk(1,:),IYK(1,:),c,H,G,a, - 1 F,R,Xdd(0:1,:),Pdd(0:1,:,:),DLL(K)) ! log likelihood - XT(K,:) = Xdd(IT,:) ! xi(t|t) - PT(K,:,:) = Pdd(IT,:,:) ! P(t|t) - ELSEIF ((IT.GT.1).AND.(d(1).EQ.0)) THEN -C Input XT(0) PT(0), Output XT(K),PT(K),DLL(K) - Xdd(0,:) = XT(0,:) - Pdd(0,:,:) = PT(0,:,:) - CALL KF(1,dc,ny,nz,nx,nu,ns,IS(:),yk(IT,:),IYK(IT,:),c,H,G,a, - 1 F,R,Xdd(0:1,:),Pdd(0:1,:,:),DLL(K)) - XT(K,:) = Xdd(1,:) - PT(K,:,:) = Pdd(1,:,:) - ENDIF - - SH(1) = Z(max(1,IT-1)) - SH(2) = K - SH(3) = Z(min(nobs,IT+1)) - PROBL(K) = DLL(K) - + + LEMMA4(OM(IT,:,:),MU(IT,:),XT(K,:),PT(K,:,:),nx) - + + MARKOVP(PMUL,PE,nstot,1,IT,nobs,SH) - -1000 CONTINUE - -C --------------------------------------------- -C SAMPLING Z(t:t+h-1) using PROB -C ISEQ is the sampled sequence - out of nstot -C --------------------------------------------- -C To prevent exp overflow - PROB(:) = 0.D0 - IMAX = MAXLOC(PROBL(IFS(1:NIFS))) - KKK = IFS(IMAX(1)) - PROBL(IFS(1:NIFS)) = PROBL(IFS(1:NIFS))-PROBL(KKK) - PROB(IFS(1:NIFS)) = DEXP(PROBL(IFS(1:NIFS))) - # / SUM(DEXP(PROBL(IFS(1:NIFS)))) - -C U = G05CAF(U) ! Sampling from U(0,1) - U = genunf(0.D0,1.D0) - ISEQ = 1 - AUX = PROB(1) - DO 310 WHILE (AUX.LT.U) - ISEQ = ISEQ + 1 -310 AUX = AUX + PROB(ISEQ) - - Z(IT) = ISEQ - - XT(0,:) = XT(ISEQ,:) - PT(0,:,:) = PT(ISEQ,:,:) - -2000 CONTINUE - - DO I=1,nobs - CALL INT2SEQ(Z(I),nv,INFOS,SEQ,S(I,:)) - ENDDO - - DEALLOCATE(DLL,PROB,PROBL,XT,PT,IRANK,PMUL) - RETURN - END - -C **** da butta ****************** -c DO IT = 1,nobs-1 -c CALL INT2SEQ(Z(IT),nv,INFOS,SEQ,SS(IT,:)) -c ENDDO - -c SS(nobs,:) = 1 -c CALL IKF(d,ny,nz,nx,nu,ns,SS(1:max(d(1),1),1:6), -c 1 yk(1:max(d(1),1),1:ny+nz),IYK(1:max(d(1),1),1:ny+1), -c 2 c,H,G,a,F,R,Xdd,Pdd,LIKE(1:max(d(1),1))) -c XX(d(1),1:nx) = Xdd(max(d(1),1),1:nx) -c PP(d(1),1:nx,1:nx) = Pdd(max(d(1),1),1:nx,1:nx) -c CALL KF(nobs,d,ny,nz,nx,nu,ns,SS,yk,IYK,c,H,G,a,F,R,XX,PP,LIKE) - -c R1 = DEXP(SUM(LIKE))*P1(SS(nobs,4),SS(nobs-1,4)) - -c SS(nobs,4) = 2 -c CALL IKF(d,ny,nz,nx,nu,ns,SS(1:max(d(1),1),1:6), -c 1 yk(1:max(d(1),1),1:ny+nz),IYK(1:max(d(1),1),1:ny+1), -c 2 c,H,G,a,F,R,Xdd,Pdd,LIKE(1:max(d(1),1))) -c XX(d(1),1:nx) = Xdd(max(d(1),1),1:nx) -c PP(d(1),1:nx,1:nx) = Pdd(max(d(1),1),1:nx,1:nx) -c CALL KF(nobs,d,ny,nz,nx,nu,ns,SS,yk,IYK,c,H,G,a,F,R,XX,PP,LIKE) -c R2 = DEXP(SUM(LIKE))*P1(SS(nobs,4),SS(nobs-1,4)) -c R1 = R1/(R1+R2) +C along with DMM. If not, see <http://www.gnu.org/licenses/>. +C ---------------------------------------------------------------------- + SUBROUTINE GCK(nobs,d,ny,nz,nx,nu,nv,ns,nstot,nt,np,yk,IYK, + 1 theta,psi,INFOS,pdll,Z,S) + + USE dfwin + INTERFACE + SUBROUTINE DESIGN(ny,nz,nx,nu,ns,nt,theta,c,H,G,a,F,R) + INTEGER ny,nz,nx,nu,ns(6),nt + DOUBLE PRECISION theta(nt) + DOUBLE PRECISION c(ny,max(1,nz),ns(1)),H(ny,nx,ns(2)), + 1 G(ny,nu,ns(3)),a(nx,ns(4)),F(nx,nx,ns(5)),R(nx,nu,ns(6)) + END SUBROUTINE + END INTERFACE + POINTER (pdll,fittizia) ! ASSOCIATE pointer P alla DLL ad una varibile fittizia + POINTER (pdesign,DESIGN) ! IMPORTANT associo il puntatore pdesign alla Interface definita + +C INPUT + INTEGER nobs,d(2),ny,nz,nx,nu,nv,ns(6),nstot,nt,np,IYK(nobs,ny+1), + 1 INFOS(9,6) + DOUBLE PRECISION yk(nobs,ny+nz),theta(nt),psi(np) + +C INPUT/OUTPUT + INTEGER Z(nobs),S(nobs,6) + +C LOCALS + INTEGER IT,I,J,K,IFAIL,ISEQ,IMAX(1),iny,NIFS,KKK + INTEGER IS(6),SH(3),IND(max(1,d(1)),6),SEQ(nv),IFS(nstot),dc(2) + DOUBLE PRECISION c(ny,max(nz,1),ns(1)),H(ny,nx,ns(2)), + 1 G(ny,nu,ns(3)),a(nx,ns(4)),F(nx,nx,ns(5)),R(nx,nu,ns(6)) + DOUBLE PRECISION PMAT(nstot,nstot),PE(nstot), + 1 P1(MAX(1,INFOS(8,1)*MIN(INFOS(9,1),1)), + 1 MAX(1,INFOS(8,1)*MIN(INFOS(9,1),1))), + 1 P2(MAX(1,INFOS(8,2)*MIN(INFOS(9,2),1)), + 1 MAX(1,INFOS(8,2)*MIN(INFOS(9,2),1))), + 1 P3(MAX(1,INFOS(8,3)*MIN(INFOS(9,3),1)), + 1 MAX(1,INFOS(8,3)*MIN(INFOS(9,3),1))), + 1 P4(MAX(1,INFOS(8,4)*MIN(INFOS(9,4),1)), + 1 MAX(1,INFOS(8,4)*MIN(INFOS(9,4),1))), + 1 P5(MAX(1,INFOS(8,5)*MIN(INFOS(9,5),1)), + 1 MAX(1,INFOS(8,5)*MIN(INFOS(9,5),1))), + 1 P6(MAX(1,INFOS(8,6)*MIN(INFOS(9,6),1)), + 1 MAX(1,INFOS(8,6)*MIN(INFOS(9,6),1))) + DOUBLE PRECISION OM(nobs,nx,nx),MU(nobs,nx) + DOUBLE PRECISION HRG(ny,nu),VV(ny,ny),HF(ny,nx),COM(ny+1,ny), + 1 HRGV(nu,ny),B(nx,ny),RR(nx,nx),BH(nx,nx),BHRG(nx,nu),DD(nx,nx), + 2 CS(nx,nx),CC(nx,nx),AA(nx,nx),DI(nx,nx),COM1(nx+1,nx),Ha(ny), + 3 OMC(nx,nx),OMCDIC(nx,nx),AOMCDIC(nx,nx),AOMCDICOM(nx,nx), + 4 VVHF(ny,nx),Xdd(0:max(1,d(1)),nx),Pdd(0:max(1,d(1)),nx,nx), + 5 WORK(3*nx),LAM(nx),AUX,U + INTEGER, ALLOCATABLE:: IRANK(:) + DOUBLE PRECISION, ALLOCATABLE:: DLL(:),PROB(:),PROBL(:), + 1 XT(:,:),PT(:,:,:),PMUL(:,:,:) + DOUBLE PRECISION EPS,ONE,ZERO + DATA EPS/1.D-14/,ONE/1.0D0/,ZERO/0.0D0/ + DOUBLE PRECISION genunf,LEMMA4,MARKOVP + + pdesign = getprocaddress(pdll, "design_"C) + CALL DESIGN(ny,nz,nx,nu,ns,nt,theta,c,H,G,a,F,R) + CALL DESIGNZ(nv,np,psi,INFOS,P1,P2,P3,P4,P5,P6) +C PALL(i,j) = Pr[Z(t+1)=i|Z(t)=j], Z = S1 x S2 x ... x Snv + CALL PPROD(nv,nstot,INFOS,P1,P2,P3,P4,P5,P6,PMAT) +C ERGODIC solves PE: PE*(I-P') = 0 + CALL ERGODIC(nstot,PMAT,PE) + +C OMEGA and MU RECURSIONS + OM(:,:,:)= ZERO + MU(:,:) = ZERO + DO 250 IT = nobs-1,1,-1 +C INT2SEQ map from Z(IT+1) to IS = (k1 k2 k3 k4 k5 k6) + CALL INT2SEQ(Z(IT+1),nv,INFOS,SEQ,IS) + iny = IYK(IT+1,ny+1) + + DO 10 I=1,iny + Ha(I) = SUM(H(IYK(IT+1,I),:,IS(2))*a(:,IS(4))) ! H*a (ny x 1) + DO 10 J=1,nu +10 HRG(I,J) = SUM(H(IYK(IT+1,I),:,IS(2))*R(:,J,IS(6))) + + + G(IYK(IT+1,I),J,IS(3)) ! HR+G (ny x nu) + + DO 20 I=1,iny + DO 20 J=1,iny +20 VV(I,J) = SUM(HRG(I,1:nu)*HRG(J,1:nu)) ! (HR+G)*(HR+G)' (ny x ny) + + DO 30 I=1,iny + DO 30 J=1,nx +30 HF(I,J)=SUM(H(IYK(IT+1,I),:,IS(2))*F(:,J,IS(5))) ! HF(ny x nx) + + COM(1:iny,1:iny) = VV(1:iny,1:iny) + IFAIL = -1 +C CALL F01ADF(iny,COM(1:iny+1,1:iny), iny+1, IFAIL) + CALL DPOTRF('L',iny,COM(1:iny,1:iny),iny,IFAIL) ! COM = L*L' + CALL DPOTRI('L',iny,COM(1:iny,1:iny),iny,IFAIL) ! COM = VV^-1 + DO 40 I=1,iny + DO 40 J=1,I + VV(I,J) = COM(I,J) +40 VV(J,I) = VV(I,J) ! inv[(HR+G)*(HR+G)'] (ny x ny) + +C B = R*(H*R+G)'*VV (nx x ny) + DO 50 I=1,nu + DO 50 J=1,iny +50 HRGV(I,J) = SUM(HRG(1:iny,I)*VV(1:iny,J)) ! (H*R+G)'*VV (nu x ny) + + DO 60 I=1,nx + DO 60 J=1,iny +60 B(I,J) = SUM(R(I,1:nu,IS(6))*HRGV(1:nu,J)) ! B (nx x ny) + + DO 70 I=1,nx + DO 70 J=1,nx + RR(I,J) = SUM(R(I,:,IS(6))*R(J,:,IS(6))) ! RR' (nx x nx) +70 BH(I,J) = SUM(B(I,1:iny)*H(IYK(IT+1,1:iny),J,IS(2))) ! BH (nx x nx) + +C FIND CS such that CS*CS' = RR'-B*HRG*R' (nx x nx) + DO 80 I=1,nx + DO 80 J=1,nu +80 BHRG(I,J) = SUM(B(I,1:iny)*HRG(1:iny,J)) + + DO 90 I=1,nx + DO 90 J=1,I +90 CC(I,J) = RR(I,J) - SUM(BHRG(I,1:nu)*R(J,1:nu,IS(6))) + + IFAIL=-1 +C CALL F02FAF('V','L',nx,CC,nx,LAM,WORK,3*nx,IFAIL) + CALL DSYEV( 'V','L',nx,CC,nx,LAM,WORK,3*nx,IFAIL) + DO 100 I=1,nx + IF (LAM(I).LE.EPS) LAM(I)= ZERO +100 CS(:,I) = CC(1:nx,I)*DSQRT(LAM(I)) + +C AA = F - B*HF (nx x nx) + DO 110 I=1,nx + DO 110 J=1,nx +110 AA(I,J) = F(I,J,IS(5)) - SUM(B(I,1:iny)*HF(1:iny,J)) + +C OMC = OM(+1)*CS (nx x nx) + DO 120 I=1,nx + DO 120 J=1,nx +120 OMC(I,J) = SUM(OM(IT+1,I,:)*CS(:,J)) + +C DD = I + CS'*OM(+1)*CS (nx x nx) + DD(:,:) = ZERO + DO 130 I=1,nx + DD(I,I) = ONE + DO 130 J=1,I + DD(I,J) = DD(I,J) + SUM(CS(:,I)*OMC(:,J)) +130 DD(J,I) = DD(I,J) + +C DI = inv(DD) (nx x nx) + COM1(1:nx,1:nx) = DD(1:nx,1:nx) + IFAIL = -1 +C CALL F01ADF(nx,COM1,nx+1,IFAIL) + CALL DPOTRF('L',nx,COM1(1:nx,1:nx),nx,IFAIL) ! COM1 = L*L' + CALL DPOTRI('L',nx,COM1(1:nx,1:nx),nx,IFAIL) ! COM1 = DD^-1 + + DO 135 I=1,nx + DO 135 J=1,I + DI(I,J) = COM1(I,j) +135 DI(J,I) = DI(I,J) + +C OMCDIC = I - OM(+1)*CS*DI*CS' (nx x nx) + DO 140 I=1,nx + DO 140 J=1,nx +140 COM1(I,J) = SUM(OMC(I,:)*DI(:,J)) ! OM(+1)*CS*DI (nx x nx) + + OMCDIC(:,:) = ZERO + DO 145 I=1,nx + OMCDIC(I,I) = ONE + DO 145 J=1,nx +145 OMCDIC(I,J) = OMCDIC(I,J)-SUM(COM1(I,:)*CS(J,:)) + +C AOMCDIC = AA'*(I - OM(+1)*CS*DINV CS') (nx x nx) + DO 150 I=1,nx + DO 150 J=1,nx +150 AOMCDIC(I,J) = SUM(AA(:,I)*OMCDIC(:,J)) + +C AOMCDICOM = AA'*(I - OM(+1)*CS*DINV*CS')*OM(+1) (nx x nx) + DO 160 I=1,nx + DO 160 J=1,nx +160 AOMCDICOM(I,J) = SUM(AOMCDIC(I,:)*OM(IT+1,:,J)) + +C VV*H*F (ny x nx) + DO 170 I=1,iny + DO 170 J=1,nx +170 VVHF(I,J) = SUM(VV(I,1:iny)*HF(1:iny,J)) + +C OM = AA*(I - OM(+1)*C*DI*C')*OM(+1)*AA' + +C + F'*H'*VV*H*F + DO 180 I=1,nx + DO 180 J=1,nx +180 OM(IT,I,J) = SUM(AOMCDICOM(I,:)*AA(:,J)) + + + SUM(HF(1:iny,I)*VVHF(1:iny,J)) + +C MU = AA'*(I - OM(+1)*C*DI* C')*MU(+1) + +C - AA'*(I - OM C DINV C')*OM(+1)*LAM +C + F'*H'*VV*(y(+1) - H*a - c*z) +C LAM = a - B*H*a + B*[y(+1)-c*z] (nx x 1) + COM(1:iny,1) = 0.D0 + DO 185 I=1,iny +185 COM(I,1) = SUM(c(IYK(IT+1,I),1:nz,IS(1))*yk(IT+1,ny+1:ny+nz)) + + DO 190 I=1,nx +190 LAM(I) = a(I,IS(4)) - SUM(BH(I,1:nx)*a(1:nx,IS(4))) + + + SUM(B(I,1:iny)*(yk(IT+1,IYK(IT+1,1:iny)) + + - COM(1:iny,1))) + DO 200 I=1,nx +200 MU(IT,I) = SUM(AOMCDIC(I,:)*MU(IT+1,:)) + + - SUM(AOMCDICOM(I,:)*LAM(:)) + + + SUM(VVHF(1:iny,I)*(yk(IT+1,IYK(IT+1,1:iny)) + # - Ha(1:iny)-COM(1:iny,1))) + +250 CONTINUE + +C --------------- +C START SAMPLING +C --------------- + ALLOCATE(DLL(nstot),PROB(nstot),PROBL(nstot),XT(0:nstot,nx), + 1 PT(0:nstot,nx,nx),IRANK(nstot),PMUL(nstot,nstot,2)) + PMUL(:,:,1) = PMAT(:,:) ! one-step ahead + PMUL(:,:,2) = 0.D0 ! two-step ahead + DO 260 I = 1,nstot + DO 260 J = 1,nstot + DO 260 K = 1,nstot +260 PMUL(I,J,2) = PMUL(I,J,2) + PMAT(I,K)*PMAT(K,J) + +C FEASIBLE Z-STATES + NIFS = 0 + IFS(:) = 0 + DO 265 K =1,nstot + IF (PE(K).GT.0.D0) THEN + NIFS = NIFS + 1 + IFS(NIFS) = K +265 ENDIF + dc(1:2) = 0 + DO 2000 IT = 1,nobs + DO 1000 KKK = 1,NIFS + K = IFS(KKK) + CALL INT2SEQ(K,nv,INFOS,SEQ,IS(:)) + IF ((IT.LE.d(1)).AND.(d(1).GT.0)) THEN + DO 300 I = 1,d(1) +300 CALL INT2SEQ(Z(I),nv,INFOS,SEQ,IND(I,:)) + IND(IT,:)= IS(:) + CALL IKF(d,ny,nz,nx,nu,ns,IND(1:d(1),:),yk(1:d(1),:), + 1 IYK(1:d(1),:),c,H,G,a,F,R,Xdd(1:d(1),:), + 2 Pdd(1:d(1),:,:),DLL(1:max(1,d(1)))) + XT(K,:) = Xdd(IT,:) ! xi(t|t) + PT(K,:,:) = Pdd(IT,:,:) ! P(t|t) + DLL(:) = ZERO ! log likelihood + ELSEIF ((IT.GT.d(1)).AND.(d(1).GT.0)) THEN +C Input XT(0) PT(0), Output XT(K),PT(K),DLL(K) + Xdd(0,:) = XT(0,:) + Pdd(0,:,:) = PT(0,:,:) + CALL KF(1,dc,ny,nz,nx,nu,ns,IS,yk(IT,:),IYK(IT,:),c,H,G,a,F,R, + 1 Xdd(0:1,:),Pdd(0:1,:,:),DLL(K)) + XT(K,:) = Xdd(1,:) + PT(K,:,:) = Pdd(1,:,:) + ELSEIF ((IT.EQ.1).AND.(d(1).EQ.0)) THEN + CALL IKF(d,ny,nz,nx,nu,ns,IS(:),yk(1,:),IYK(1,:),c,H,G,a,F,R, + 1 Xdd(0,:),Pdd(0,:,:),DLL(K)) + CALL KF(1,dc,ny,nz,nx,nu,ns,IS(:),yk(1,:),IYK(1,:),c,H,G,a, + 1 F,R,Xdd(0:1,:),Pdd(0:1,:,:),DLL(K)) ! log likelihood + XT(K,:) = Xdd(IT,:) ! xi(t|t) + PT(K,:,:) = Pdd(IT,:,:) ! P(t|t) + ELSEIF ((IT.GT.1).AND.(d(1).EQ.0)) THEN +C Input XT(0) PT(0), Output XT(K),PT(K),DLL(K) + Xdd(0,:) = XT(0,:) + Pdd(0,:,:) = PT(0,:,:) + CALL KF(1,dc,ny,nz,nx,nu,ns,IS(:),yk(IT,:),IYK(IT,:),c,H,G,a, + 1 F,R,Xdd(0:1,:),Pdd(0:1,:,:),DLL(K)) + XT(K,:) = Xdd(1,:) + PT(K,:,:) = Pdd(1,:,:) + ENDIF + + SH(1) = Z(max(1,IT-1)) + SH(2) = K + SH(3) = Z(min(nobs,IT+1)) + PROBL(K) = DLL(K) + + + LEMMA4(OM(IT,:,:),MU(IT,:),XT(K,:),PT(K,:,:),nx) + + + MARKOVP(PMUL,PE,nstot,1,IT,nobs,SH) + +1000 CONTINUE + +C --------------------------------------------- +C SAMPLING Z(t:t+h-1) using PROB +C ISEQ is the sampled sequence - out of nstot +C --------------------------------------------- +C To prevent exp overflow + PROB(:) = 0.D0 + IMAX = MAXLOC(PROBL(IFS(1:NIFS))) + KKK = IFS(IMAX(1)) + PROBL(IFS(1:NIFS)) = PROBL(IFS(1:NIFS))-PROBL(KKK) + PROB(IFS(1:NIFS)) = DEXP(PROBL(IFS(1:NIFS))) + # / SUM(DEXP(PROBL(IFS(1:NIFS)))) + +C U = G05CAF(U) ! Sampling from U(0,1) + U = genunf(0.D0,1.D0) + ISEQ = 1 + AUX = PROB(1) + DO 310 WHILE (AUX.LT.U) + ISEQ = ISEQ + 1 +310 AUX = AUX + PROB(ISEQ) + + Z(IT) = ISEQ + + XT(0,:) = XT(ISEQ,:) + PT(0,:,:) = PT(ISEQ,:,:) + +2000 CONTINUE + + DO I=1,nobs + CALL INT2SEQ(Z(I),nv,INFOS,SEQ,S(I,:)) + ENDDO + + DEALLOCATE(DLL,PROB,PROBL,XT,PT,IRANK,PMUL) + RETURN + END + +C **** da butta ****************** +c DO IT = 1,nobs-1 +c CALL INT2SEQ(Z(IT),nv,INFOS,SEQ,SS(IT,:)) +c ENDDO + +c SS(nobs,:) = 1 +c CALL IKF(d,ny,nz,nx,nu,ns,SS(1:max(d(1),1),1:6), +c 1 yk(1:max(d(1),1),1:ny+nz),IYK(1:max(d(1),1),1:ny+1), +c 2 c,H,G,a,F,R,Xdd,Pdd,LIKE(1:max(d(1),1))) +c XX(d(1),1:nx) = Xdd(max(d(1),1),1:nx) +c PP(d(1),1:nx,1:nx) = Pdd(max(d(1),1),1:nx,1:nx) +c CALL KF(nobs,d,ny,nz,nx,nu,ns,SS,yk,IYK,c,H,G,a,F,R,XX,PP,LIKE) + +c R1 = DEXP(SUM(LIKE))*P1(SS(nobs,4),SS(nobs-1,4)) + +c SS(nobs,4) = 2 +c CALL IKF(d,ny,nz,nx,nu,ns,SS(1:max(d(1),1),1:6), +c 1 yk(1:max(d(1),1),1:ny+nz),IYK(1:max(d(1),1),1:ny+1), +c 2 c,H,G,a,F,R,Xdd,Pdd,LIKE(1:max(d(1),1))) +c XX(d(1),1:nx) = Xdd(max(d(1),1),1:nx) +c PP(d(1),1:nx,1:nx) = Pdd(max(d(1),1),1:nx,1:nx) +c CALL KF(nobs,d,ny,nz,nx,nu,ns,SS,yk,IYK,c,H,G,a,F,R,XX,PP,LIKE) +c R2 = DEXP(SUM(LIKE))*P1(SS(nobs,4),SS(nobs-1,4)) +c R1 = R1/(R1+R2) diff --git a/gck2.for b/gck2.for index 36d54cc3c6e2c31ceb8ba7366e42e3eb24a29a6f..c6c1370f912b0829b27d55fe2606da3b29a2eb36 100644 --- a/gck2.for +++ b/gck2.for @@ -1,51 +1,51 @@ -C ---------------------------------------------------------------------- -C GCK2 (no missing values) implements the SINGLE-MOVE Sampler of -C Gerlach, Carter and Kohn (2000): Efficient Bayesian Inference -C for Dynamic Mixture Models, JASA, 95,451, pp.819-28 -C Developed by A.Rossi, C.Planas and G.Fiorentini -C -C Pr[Z(t)|Z(\t),Y] pto Pr[Y^(t+1,T)|Y^t,Z] x Pr[Y(t)|Y^(t-1),Z^t] -C x Pr[Z(t)|Z(\t)] -C -C State-space format: y(t) = c(t)z(t) + H(t)x(t) + G(t)u(t) -C x(t) = a(t) + F(t)x(t-1) + R(t)u(t) -C -C y(t) (ny x 1) ny = # of endogenous series -C z(t) (nz x 1) nz = # of exogenous series -C x(t) (nx x 1) nx = # of continous states -C u(t) (nu x 1) nu = # of shocks -C c(t) (ny x nz x ns1) ns1 = # of states for c(t) -C H(t) (ny x nx x ns2) ns2 = # of states for H(t) -C G(t) (ny x nu x ns3) ns3 = # of states for G(t) -C a(t) (nx x ns4) ns4 = # of states for a(t) -C F(t) (nx x nx x ns5) ns5 = # of states for F(t) -C R(t) (nx x nu x ns6) ns6 = # of states for R(t) -C -C FURTHER INPUT: -C -C nobs: # of observatios -C d(1): order of integration of the system -C d(2): number of non-stationary elements -C nv: # of discrete latent variables (S1,S2,...) -C ns: ns1,ns2,... -C nstot: total # of states (states of S1 x S2 x ...x Snv) -C nt: dimension of theta -C np: dimension of psi -C PMAT: (nstot x nstot) one-step transition probabilities -C PE: ergodic distribution of S1 x S2 x ...x Snv -C INFOS: (9 x 6) set latent variables -C nstot: total # of states i.e. ns1 x ns2 x ...x nsv -C -C OUTPUT: -C -C Z:(nobs x 1) takes values {1,2,...,nstot} -C -C Copyright (C) 2010-2014 European Commission -C +C ---------------------------------------------------------------------- +C GCK2 (no missing values) implements the SINGLE-MOVE Sampler of +C Gerlach, Carter and Kohn (2000): Efficient Bayesian Inference +C for Dynamic Mixture Models, JASA, 95,451, pp.819-28 +C Developed by A.Rossi, C.Planas and G.Fiorentini +C +C Pr[Z(t)|Z(\t),Y] pto Pr[Y^(t+1,T)|Y^t,Z] x Pr[Y(t)|Y^(t-1),Z^t] +C x Pr[Z(t)|Z(\t)] +C +C State-space format: y(t) = c(t)z(t) + H(t)x(t) + G(t)u(t) +C x(t) = a(t) + F(t)x(t-1) + R(t)u(t) +C +C y(t) (ny x 1) ny = # of endogenous series +C z(t) (nz x 1) nz = # of exogenous series +C x(t) (nx x 1) nx = # of continous states +C u(t) (nu x 1) nu = # of shocks +C c(t) (ny x nz x ns1) ns1 = # of states for c(t) +C H(t) (ny x nx x ns2) ns2 = # of states for H(t) +C G(t) (ny x nu x ns3) ns3 = # of states for G(t) +C a(t) (nx x ns4) ns4 = # of states for a(t) +C F(t) (nx x nx x ns5) ns5 = # of states for F(t) +C R(t) (nx x nu x ns6) ns6 = # of states for R(t) +C +C FURTHER INPUT: +C +C nobs: # of observatios +C d(1): order of integration of the system +C d(2): number of non-stationary elements +C nv: # of discrete latent variables (S1,S2,...) +C ns: ns1,ns2,... +C nstot: total # of states (states of S1 x S2 x ...x Snv) +C nt: dimension of theta +C np: dimension of psi +C PMAT: (nstot x nstot) one-step transition probabilities +C PE: ergodic distribution of S1 x S2 x ...x Snv +C INFOS: (9 x 6) set latent variables +C nstot: total # of states i.e. ns1 x ns2 x ...x nsv +C +C OUTPUT: +C +C Z:(nobs x 1) takes values {1,2,...,nstot} +C +C Copyright (C) 2010-2014 European Commission +C C This file is part of Program DMM C -C DMM is free software developed at the Joint Research Centre of the -C European Commission: you can redistribute it and/or modify it under +C DMM is free software developed at the Joint Research Centre of the +C European Commission: you can redistribute it and/or modify it under C the terms of the GNU General Public License as published by C the Free Software Foundation, either version 3 of the License, or C (at your option) any later version. @@ -56,317 +56,317 @@ C MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the C GNU General Public License for more details. C C You should have received a copy of the GNU General Public License -C along with DMM. If not, see <http://www.gnu.org/licenses/>. -C ---------------------------------------------------------------------- - SUBROUTINE GCK2(nobs,d,ny,nz,nx,nu,nv,ns,nstot,nt,np,yk, - 1 theta,psi,INFOS,pdll,Z,S) - - USE dfwin - INTERFACE - SUBROUTINE DESIGN(ny,nz,nx,nu,ns,nt,theta,c,H,G,a,F,R) - INTEGER ny,nz,nx,nu,ns(6),nt - DOUBLE PRECISION theta(nt) - DOUBLE PRECISION c(ny,max(1,nz),ns(1)),H(ny,nx,ns(2)), - 1 G(ny,nu,ns(3)),a(nx,ns(4)),F(nx,nx,ns(5)),R(nx,nu,ns(6)) - END SUBROUTINE - END INTERFACE - POINTER (pdll,fittizia) ! ASSOCIATE pointer P alla DLL ad una varibile fittizia - POINTER (pdesign,DESIGN) ! IMPORTANT associo il puntatore pdesign alla Interface definita - -C INPUT - INTEGER nobs,d(2),ny,nz,nx,nu,nv,ns(6),nstot,nt,np, - 1 INFOS(9,6) - DOUBLE PRECISION yk(nobs,ny+nz),theta(nt),psi(np) - -C INPUT/OUTPUT - INTEGER Z(nobs),S(nobs,6) - -C LOCALS - INTEGER IT,I,J,K,IFAIL,ISEQ,IMAX(1),NIFS,KKK - INTEGER IS(6),SH(3),IND(max(1,d(1)),6),SEQ(nv),IFS(nstot),dc(2) - DOUBLE PRECISION c(ny,max(nz,1),ns(1)),H(ny,nx,ns(2)), - 1 G(ny,nu,ns(3)),a(nx,ns(4)),F(nx,nx,ns(5)),R(nx,nu,ns(6)) - DOUBLE PRECISION P1(INFOS(8,1),INFOS(8,1)), - 1 P2(INFOS(8,2),INFOS(8,2)),P3(INFOS(8,3),INFOS(8,3)), - 2 P4(INFOS(8,4),INFOS(8,4)),P5(INFOS(8,5),INFOS(8,5)), - 3 P6(INFOS(8,6),INFOS(8,6)),PMAT(nstot,nstot),PE(nstot) - DOUBLE PRECISION OM(nobs,nx,nx),MU(nobs,nx) - DOUBLE PRECISION HRG(ny,nu),VV(ny,ny),HF(ny,nx),COM(ny+1,ny), - 1 HRGV(nu,ny),B(nx,ny),RR(nx,nx),BH(nx,nx),BHRG(nx,nu),DD(nx,nx), - 2 CS(nx,nx),CC(nx,nx),AA(nx,nx),DI(nx,nx),COM1(nx+1,nx),Ha(ny), - 3 OMC(nx,nx),OMCDIC(nx,nx),AOMCDIC(nx,nx),AOMCDICOM(nx,nx), - 4 VVHF(ny,nx),Xdd(0:max(1,d(1)),nx),Pdd(0:max(1,d(1)),nx,nx), - 5 WORK(3*nx),LAM(nx),AUX,U - INTEGER, ALLOCATABLE:: IRANK(:) - DOUBLE PRECISION, ALLOCATABLE:: DLL(:),PROB(:),PROBL(:), - 1 XT(:,:),PT(:,:,:),PMUL(:,:,:) - DOUBLE PRECISION EPS,ONE,ZERO - DATA EPS/1.D-14/,ONE/1.0D0/,ZERO/0.0D0/ - DOUBLE PRECISION genunf,LEMMA4,MARKOVP - - pdesign = getprocaddress(pdll, "design_"C) - CALL DESIGN(ny,nz,nx,nu,ns,nt,theta,c,H,G,a,F,R) - CALL DESIGNZ(nv,np,psi,INFOS,P1,P2,P3,P4,P5,P6) -C PALL(i,j) = Pr[Z(t+1)=i|Z(t)=j], Z = S1 x S2 x ... x Snv - CALL PPROD(nv,nstot,INFOS,P1,P2,P3,P4,P5,P6,PMAT) -C ERGODIC solves PE: PE*(I-P') = 0 - CALL ERGODIC(nstot,PMAT,PE) - -C OMEGA and MU RECURSIONS - OM(:,:,:)= ZERO - MU(:,:) = ZERO - DO 250 IT = nobs-1,1,-1 -C INT2SEQ map from Z(IT+1) to IS = (k1 k2 k3 k4 k5 k6) - CALL INT2SEQ(Z(IT+1),nv,INFOS,SEQ,IS) - - DO 10 I=1,ny - Ha(I) = SUM(H(I,:,IS(2))*a(:,IS(4))) ! H*a (ny x 1) - DO 10 J=1,nu -10 HRG(I,J) = SUM(H(I,:,IS(2))*R(:,J,IS(6))) - + + G(I,J,IS(3)) ! HR+G (ny x nu) - - DO 20 I=1,ny - VV(I,I) = SUM(HRG(I,1:nu)*HRG(I,1:nu)) - DO 20 J=1,I-1 - VV(I,J) = SUM(HRG(I,1:nu)*HRG(J,1:nu)) ! (HR+G)*(HR+G)' (ny x ny) -20 VV(J,I) = VV(I,J) - - DO 30 I=1,ny - DO 30 J=1,nx -30 HF(I,J)=SUM(H(I,:,IS(2))*F(:,J,IS(5))) ! HF(ny x nx) - - COM(1:ny,1:ny) = VV(1:ny,1:ny) - IFAIL = -1 -C CALL F01ADF(ny,COM(1:ny+1,1:ny), ny+1, IFAIL) - CALL DPOTRF('L',ny,COM(1:ny,1:ny),ny,IFAIL) ! COM = L*L' - CALL DPOTRI('L',ny,COM(1:ny,1:ny),ny,IFAIL) ! COM = VV^-1 - - DO 40 I=1,ny - DO 40 J=1,I - VV(I,J) = COM(I,J) -40 VV(J,I) = VV(I,J) ! inv[(HR+G)*(HR+G)'] (ny x ny) - -C B = R*(H*R+G)'*VV (nx x ny) - DO 50 I=1,nu - DO 50 J=1,ny -50 HRGV(I,J) = SUM(HRG(1:ny,I)*VV(1:ny,J)) ! (H*R+G)'*VV (nu x ny) - - DO 60 I=1,nx - DO 60 J=1,ny -60 B(I,J) = SUM(R(I,1:nu,IS(6))*HRGV(1:nu,J)) ! B (nx x ny) - - DO 70 I=1,nx - DO 70 J=1,nx -70 BH(I,J) = SUM(B(I,1:ny)*H(1:ny,J,IS(2))) ! BH (nx x nx) - - DO 75 I=1,nx - RR(I,I) = SUM(R(I,:,IS(6))*R(I,:,IS(6))) - DO 75 J=1,I-1 - RR(I,J) = SUM(R(I,:,IS(6))*R(J,:,IS(6))) ! RR' (nx x nx) -75 RR(J,I) = RR(I,J) - -C FIND CS such that CS*CS' = RR'-B*HRG*R' (nx x nx) - DO 80 I=1,nx - DO 80 J=1,nu -80 BHRG(I,J) = SUM(B(I,1:ny)*HRG(1:ny,J)) - - DO 90 I=1,nx - DO 90 J=1,I -90 CC(I,J) = RR(I,J) - SUM(BHRG(I,1:nu)*R(J,1:nu,IS(6))) - - IFAIL=-1 -C CALL F02FAF('V','L',nx,CC,nx,LAM,WORK,3*nx,IFAIL) - CALL DSYEV( 'V','L',nx,CC,nx,LAM,WORK,3*nx,IFAIL) - DO 100 I=1,nx - IF (LAM(I).LE.EPS) LAM(I)= ZERO -100 CS(:,I) = CC(1:nx,I)*DSQRT(LAM(I)) - -C AA = F - B*HF (nx x nx) - DO 110 I=1,nx - DO 110 J=1,nx -110 AA(I,J) = F(I,J,IS(5)) - SUM(B(I,1:ny)*HF(1:ny,J)) - -C OMC = OM(+1)*CS (nx x nx) - DO 120 I=1,nx - DO 120 J=1,nx -120 OMC(I,J) = SUM(OM(IT+1,I,:)*CS(:,J)) - -C DD = I + CS'*OM(+1)*CS (nx x nx) - DD(:,:) = ZERO - DO 130 I=1,nx - DD(I,I) = ONE - DO 130 J=1,I - DD(I,J) = DD(I,J) + SUM(CS(:,I)*OMC(:,J)) -130 DD(J,I) = DD(I,J) - -C DI = inv(DD) (nx x nx) - COM1(1:nx,1:nx) = DD(1:nx,1:nx) - IFAIL = -1 -C CALL F01ADF(nx,COM1,nx+1,IFAIL) - CALL DPOTRF('L',nx,COM1(1:nx,1:nx),nx,IFAIL) ! COM1 = L*L' - CALL DPOTRI('L',nx,COM1(1:nx,1:nx),nx,IFAIL) ! COM1 = DD^-1 - - DO 135 I=1,nx - DO 135 J=1,I - DI(I,J) = COM1(I,j) -135 DI(J,I) = DI(I,J) - -C OMCDIC = I - OM(+1)*CS*DI*CS' (nx x nx) - DO 140 I=1,nx - DO 140 J=1,nx -140 COM1(I,J) = SUM(OMC(I,:)*DI(:,J)) ! OM(+1)*CS*DI (nx x nx) - - OMCDIC(:,:) = ZERO - DO 145 I=1,nx - OMCDIC(I,I) = ONE - DO 145 J=1,nx -145 OMCDIC(I,J) = OMCDIC(I,J)-SUM(COM1(I,:)*CS(J,:)) - -C AOMCDIC = AA'*(I - OM(+1)*CS*DINV CS') (nx x nx) - DO 150 I=1,nx - DO 150 J=1,nx -150 AOMCDIC(I,J) = SUM(AA(:,I)*OMCDIC(:,J)) - -C AOMCDICOM = AA'*(I - OM(+1)*CS*DINV*CS')*OM(+1) (nx x nx) - DO 160 I=1,nx - DO 160 J=1,nx -160 AOMCDICOM(I,J) = SUM(AOMCDIC(I,:)*OM(IT+1,:,J)) - -C VV*H*F (ny x nx) - DO 170 I=1,ny - DO 170 J=1,nx -170 VVHF(I,J) = SUM(VV(I,1:ny)*HF(1:ny,J)) - -C OM = AA*(I - OM(+1)*C*DI*C')*OM(+1)*AA' + -C + F'*H'*VV*H*F - DO 180 I=1,nx - OM(IT,I,I) = SUM(AOMCDICOM(I,:)*AA(:,I)) - + + SUM(HF(1:ny,I)*VVHF(1:ny,I)) - DO 180 J=1,I-1 - OM(IT,I,J) = SUM(AOMCDICOM(I,:)*AA(:,J)) - + + SUM(HF(1:ny,I)*VVHF(1:ny,J)) -180 OM(IT,J,I) = OM(IT,I,J) - -C MU = AA'*(I - OM(+1)*C*DI* C')*MU(+1) + -C - AA'*(I - OM C DINV C')*OM(+1)*LAM -C + F'*H'*VV*(y(+1) - H*a - c*z) -C LAM = a - B*H*a + B*[y(+1)-c*z] (nx x 1) - COM(1:ny,1) = 0.D0 - DO 185 I=1,ny -185 COM(I,1) = SUM(c(I,1:nz,IS(1))*yk(IT+1,ny+1:ny+nz)) - - DO 190 I=1,nx -190 LAM(I) = a(I,IS(4)) - SUM(BH(I,1:nx)*a(1:nx,IS(4))) - + + SUM(B(I,1:ny)*(yk(IT+1,1:ny) - + - COM(1:ny,1))) - DO 200 I=1,nx -200 MU(IT,I) = SUM(AOMCDIC(I,:)*MU(IT+1,:)) - + - SUM(AOMCDICOM(I,:)*LAM(:)) - + + SUM(VVHF(1:ny,I)*(yk(IT+1,1:ny) - # - Ha(1:ny)-COM(1:ny,1))) - -250 CONTINUE - -C --------------- -C START SAMPLING -C --------------- - ALLOCATE(DLL(nstot),PROB(nstot),PROBL(nstot),XT(0:nstot,nx), - 1 PT(0:nstot,nx,nx),IRANK(nstot),PMUL(nstot,nstot,2)) - PMUL(:,:,1) = PMAT(:,:) ! one-step ahead - PMUL(:,:,2) = 0.D0 ! two-step ahead - DO 260 I = 1,nstot - DO 260 J = 1,nstot - DO 260 K = 1,nstot -260 PMUL(I,J,2) = PMUL(I,J,2) + PMAT(I,K)*PMAT(K,J) - -C FEASIBLE Z-STATES - NIFS = 0 - IFS(:) = 0 - DO 265 K =1,nstot - IF (PE(K).GT.0.D0) THEN - NIFS = NIFS + 1 - IFS(NIFS) = K -265 ENDIF - dc(1:2) = 0 - DO 2000 IT = 1,nobs - DO 1000 KKK = 1,NIFS - K = IFS(KKK) - CALL INT2SEQ(K,nv,INFOS,SEQ,IS(:)) - IF ((IT.LE.d(1)).AND.(d(1).GT.0)) THEN - DO 300 I = 1,d(1) -300 CALL INT2SEQ(Z(I),nv,INFOS,SEQ,IND(I,:)) - IND(IT,:)= IS(:) - CALL IKF2(d,ny,nz,nx,nu,ns,IND(1:d(1),:),yk(1:d(1),:), - 1 c,H,G,a,F,R,Xdd(1:d(1),:), - 2 Pdd(1:d(1),:,:),DLL(1:max(1,d(1)))) - XT(K,:) = Xdd(IT,:) ! xi(t|t) - PT(K,:,:) = Pdd(IT,:,:) ! P(t|t) - DLL(:) = ZERO ! log likelihood - ELSEIF ((IT.GT.d(1)).AND.(d(1).GT.0)) THEN -C Input XT(0) PT(0), Output XT(K),PT(K),DLL(K) - Xdd(0,:) = XT(0,:) - Pdd(0,:,:) = PT(0,:,:) - CALL KF2(1,dc,ny,nz,nx,nu,ns,IS,yk(IT,:),c,H,G,a,F,R, - 1 Xdd(0:1,:),Pdd(0:1,:,:),DLL(K)) - XT(K,:) = Xdd(1,:) - PT(K,:,:) = Pdd(1,:,:) - ELSEIF ((IT.EQ.1).AND.(d(1).EQ.0)) THEN - CALL IKF2(d,ny,nz,nx,nu,ns,IS(:),yk(1,:),c,H,G,a,F,R, - 1 Xdd(0,:),Pdd(0,:,:),DLL(K)) - CALL KF2(1,dc,ny,nz,nx,nu,ns,IS(:),yk(1,:),c,H,G,a, - 1 F,R,Xdd(0:1,:),Pdd(0:1,:,:),DLL(K)) ! log likelihood - XT(K,:) = Xdd(IT,:) ! xi(t|t) - PT(K,:,:) = Pdd(IT,:,:) ! P(t|t) - ELSEIF ((IT.GT.1).AND.(d(1).EQ.0)) THEN -C Input XT(0) PT(0), Output XT(K),PT(K),DLL(K) - Xdd(0,:) = XT(0,:) - Pdd(0,:,:) = PT(0,:,:) - CALL KF2(1,dc,ny,nz,nx,nu,ns,IS(:),yk(IT,:),c,H,G,a, - 1 F,R,Xdd(0:1,:),Pdd(0:1,:,:),DLL(K)) - XT(K,:) = Xdd(1,:) - PT(K,:,:) = Pdd(1,:,:) - ENDIF - - SH(1) = Z(max(1,IT-1)) - SH(2) = K - SH(3) = Z(min(nobs,IT+1)) - PROBL(K) = DLL(K) - + + LEMMA4(OM(IT,:,:),MU(IT,:),XT(K,:),PT(K,:,:),nx) - + + MARKOVP(PMUL,PE,nstot,1,IT,nobs,SH) - -1000 CONTINUE - -C --------------------------------------------- -C SAMPLING Z(t:t+h-1) using PROB -C ISEQ is the sampled sequence - out of nstot -C --------------------------------------------- -C To prevent exp overflow - PROB(:) = 0.D0 - IMAX = MAXLOC(PROBL(IFS(1:NIFS))) - KKK = IFS(IMAX(1)) - PROBL(IFS(1:NIFS)) = PROBL(IFS(1:NIFS))-PROBL(KKK) - PROB(IFS(1:NIFS)) = DEXP(PROBL(IFS(1:NIFS))) - # / SUM(DEXP(PROBL(IFS(1:NIFS)))) - -C U = G05CAF(U) ! Sampling from U(0,1) - U = genunf(0.D0,1.D0) - ISEQ = 1 - AUX = PROB(1) - DO 310 WHILE (AUX.LT.U) - ISEQ = ISEQ + 1 -310 AUX = AUX + PROB(ISEQ) - - Z(IT) = ISEQ - - XT(0,:) = XT(ISEQ,:) - PT(0,:,:) = PT(ISEQ,:,:) - -2000 CONTINUE - - DO I=1,nobs - CALL INT2SEQ(Z(I),nv,INFOS,SEQ,S(I,:)) - ENDDO - - DEALLOCATE(DLL,PROB,PROBL,XT,PT,IRANK,PMUL) - RETURN +C along with DMM. If not, see <http://www.gnu.org/licenses/>. +C ---------------------------------------------------------------------- + SUBROUTINE GCK2(nobs,d,ny,nz,nx,nu,nv,ns,nstot,nt,np,yk, + 1 theta,psi,INFOS,pdll,Z,S) + + USE dfwin + INTERFACE + SUBROUTINE DESIGN(ny,nz,nx,nu,ns,nt,theta,c,H,G,a,F,R) + INTEGER ny,nz,nx,nu,ns(6),nt + DOUBLE PRECISION theta(nt) + DOUBLE PRECISION c(ny,max(1,nz),ns(1)),H(ny,nx,ns(2)), + 1 G(ny,nu,ns(3)),a(nx,ns(4)),F(nx,nx,ns(5)),R(nx,nu,ns(6)) + END SUBROUTINE + END INTERFACE + POINTER (pdll,fittizia) ! ASSOCIATE pointer P alla DLL ad una varibile fittizia + POINTER (pdesign,DESIGN) ! IMPORTANT associo il puntatore pdesign alla Interface definita + +C INPUT + INTEGER nobs,d(2),ny,nz,nx,nu,nv,ns(6),nstot,nt,np, + 1 INFOS(9,6) + DOUBLE PRECISION yk(nobs,ny+nz),theta(nt),psi(np) + +C INPUT/OUTPUT + INTEGER Z(nobs),S(nobs,6) + +C LOCALS + INTEGER IT,I,J,K,IFAIL,ISEQ,IMAX(1),NIFS,KKK + INTEGER IS(6),SH(3),IND(max(1,d(1)),6),SEQ(nv),IFS(nstot),dc(2) + DOUBLE PRECISION c(ny,max(nz,1),ns(1)),H(ny,nx,ns(2)), + 1 G(ny,nu,ns(3)),a(nx,ns(4)),F(nx,nx,ns(5)),R(nx,nu,ns(6)) + DOUBLE PRECISION P1(INFOS(8,1),INFOS(8,1)), + 1 P2(INFOS(8,2),INFOS(8,2)),P3(INFOS(8,3),INFOS(8,3)), + 2 P4(INFOS(8,4),INFOS(8,4)),P5(INFOS(8,5),INFOS(8,5)), + 3 P6(INFOS(8,6),INFOS(8,6)),PMAT(nstot,nstot),PE(nstot) + DOUBLE PRECISION OM(nobs,nx,nx),MU(nobs,nx) + DOUBLE PRECISION HRG(ny,nu),VV(ny,ny),HF(ny,nx),COM(ny+1,ny), + 1 HRGV(nu,ny),B(nx,ny),RR(nx,nx),BH(nx,nx),BHRG(nx,nu),DD(nx,nx), + 2 CS(nx,nx),CC(nx,nx),AA(nx,nx),DI(nx,nx),COM1(nx+1,nx),Ha(ny), + 3 OMC(nx,nx),OMCDIC(nx,nx),AOMCDIC(nx,nx),AOMCDICOM(nx,nx), + 4 VVHF(ny,nx),Xdd(0:max(1,d(1)),nx),Pdd(0:max(1,d(1)),nx,nx), + 5 WORK(3*nx),LAM(nx),AUX,U + INTEGER, ALLOCATABLE:: IRANK(:) + DOUBLE PRECISION, ALLOCATABLE:: DLL(:),PROB(:),PROBL(:), + 1 XT(:,:),PT(:,:,:),PMUL(:,:,:) + DOUBLE PRECISION EPS,ONE,ZERO + DATA EPS/1.D-14/,ONE/1.0D0/,ZERO/0.0D0/ + DOUBLE PRECISION genunf,LEMMA4,MARKOVP + + pdesign = getprocaddress(pdll, "design_"C) + CALL DESIGN(ny,nz,nx,nu,ns,nt,theta,c,H,G,a,F,R) + CALL DESIGNZ(nv,np,psi,INFOS,P1,P2,P3,P4,P5,P6) +C PALL(i,j) = Pr[Z(t+1)=i|Z(t)=j], Z = S1 x S2 x ... x Snv + CALL PPROD(nv,nstot,INFOS,P1,P2,P3,P4,P5,P6,PMAT) +C ERGODIC solves PE: PE*(I-P') = 0 + CALL ERGODIC(nstot,PMAT,PE) + +C OMEGA and MU RECURSIONS + OM(:,:,:)= ZERO + MU(:,:) = ZERO + DO 250 IT = nobs-1,1,-1 +C INT2SEQ map from Z(IT+1) to IS = (k1 k2 k3 k4 k5 k6) + CALL INT2SEQ(Z(IT+1),nv,INFOS,SEQ,IS) + + DO 10 I=1,ny + Ha(I) = SUM(H(I,:,IS(2))*a(:,IS(4))) ! H*a (ny x 1) + DO 10 J=1,nu +10 HRG(I,J) = SUM(H(I,:,IS(2))*R(:,J,IS(6))) + + + G(I,J,IS(3)) ! HR+G (ny x nu) + + DO 20 I=1,ny + VV(I,I) = SUM(HRG(I,1:nu)*HRG(I,1:nu)) + DO 20 J=1,I-1 + VV(I,J) = SUM(HRG(I,1:nu)*HRG(J,1:nu)) ! (HR+G)*(HR+G)' (ny x ny) +20 VV(J,I) = VV(I,J) + + DO 30 I=1,ny + DO 30 J=1,nx +30 HF(I,J)=SUM(H(I,:,IS(2))*F(:,J,IS(5))) ! HF(ny x nx) + + COM(1:ny,1:ny) = VV(1:ny,1:ny) + IFAIL = -1 +C CALL F01ADF(ny,COM(1:ny+1,1:ny), ny+1, IFAIL) + CALL DPOTRF('L',ny,COM(1:ny,1:ny),ny,IFAIL) ! COM = L*L' + CALL DPOTRI('L',ny,COM(1:ny,1:ny),ny,IFAIL) ! COM = VV^-1 + + DO 40 I=1,ny + DO 40 J=1,I + VV(I,J) = COM(I,J) +40 VV(J,I) = VV(I,J) ! inv[(HR+G)*(HR+G)'] (ny x ny) + +C B = R*(H*R+G)'*VV (nx x ny) + DO 50 I=1,nu + DO 50 J=1,ny +50 HRGV(I,J) = SUM(HRG(1:ny,I)*VV(1:ny,J)) ! (H*R+G)'*VV (nu x ny) + + DO 60 I=1,nx + DO 60 J=1,ny +60 B(I,J) = SUM(R(I,1:nu,IS(6))*HRGV(1:nu,J)) ! B (nx x ny) + + DO 70 I=1,nx + DO 70 J=1,nx +70 BH(I,J) = SUM(B(I,1:ny)*H(1:ny,J,IS(2))) ! BH (nx x nx) + + DO 75 I=1,nx + RR(I,I) = SUM(R(I,:,IS(6))*R(I,:,IS(6))) + DO 75 J=1,I-1 + RR(I,J) = SUM(R(I,:,IS(6))*R(J,:,IS(6))) ! RR' (nx x nx) +75 RR(J,I) = RR(I,J) + +C FIND CS such that CS*CS' = RR'-B*HRG*R' (nx x nx) + DO 80 I=1,nx + DO 80 J=1,nu +80 BHRG(I,J) = SUM(B(I,1:ny)*HRG(1:ny,J)) + + DO 90 I=1,nx + DO 90 J=1,I +90 CC(I,J) = RR(I,J) - SUM(BHRG(I,1:nu)*R(J,1:nu,IS(6))) + + IFAIL=-1 +C CALL F02FAF('V','L',nx,CC,nx,LAM,WORK,3*nx,IFAIL) + CALL DSYEV( 'V','L',nx,CC,nx,LAM,WORK,3*nx,IFAIL) + DO 100 I=1,nx + IF (LAM(I).LE.EPS) LAM(I)= ZERO +100 CS(:,I) = CC(1:nx,I)*DSQRT(LAM(I)) + +C AA = F - B*HF (nx x nx) + DO 110 I=1,nx + DO 110 J=1,nx +110 AA(I,J) = F(I,J,IS(5)) - SUM(B(I,1:ny)*HF(1:ny,J)) + +C OMC = OM(+1)*CS (nx x nx) + DO 120 I=1,nx + DO 120 J=1,nx +120 OMC(I,J) = SUM(OM(IT+1,I,:)*CS(:,J)) + +C DD = I + CS'*OM(+1)*CS (nx x nx) + DD(:,:) = ZERO + DO 130 I=1,nx + DD(I,I) = ONE + DO 130 J=1,I + DD(I,J) = DD(I,J) + SUM(CS(:,I)*OMC(:,J)) +130 DD(J,I) = DD(I,J) + +C DI = inv(DD) (nx x nx) + COM1(1:nx,1:nx) = DD(1:nx,1:nx) + IFAIL = -1 +C CALL F01ADF(nx,COM1,nx+1,IFAIL) + CALL DPOTRF('L',nx,COM1(1:nx,1:nx),nx,IFAIL) ! COM1 = L*L' + CALL DPOTRI('L',nx,COM1(1:nx,1:nx),nx,IFAIL) ! COM1 = DD^-1 + + DO 135 I=1,nx + DO 135 J=1,I + DI(I,J) = COM1(I,j) +135 DI(J,I) = DI(I,J) + +C OMCDIC = I - OM(+1)*CS*DI*CS' (nx x nx) + DO 140 I=1,nx + DO 140 J=1,nx +140 COM1(I,J) = SUM(OMC(I,:)*DI(:,J)) ! OM(+1)*CS*DI (nx x nx) + + OMCDIC(:,:) = ZERO + DO 145 I=1,nx + OMCDIC(I,I) = ONE + DO 145 J=1,nx +145 OMCDIC(I,J) = OMCDIC(I,J)-SUM(COM1(I,:)*CS(J,:)) + +C AOMCDIC = AA'*(I - OM(+1)*CS*DINV CS') (nx x nx) + DO 150 I=1,nx + DO 150 J=1,nx +150 AOMCDIC(I,J) = SUM(AA(:,I)*OMCDIC(:,J)) + +C AOMCDICOM = AA'*(I - OM(+1)*CS*DINV*CS')*OM(+1) (nx x nx) + DO 160 I=1,nx + DO 160 J=1,nx +160 AOMCDICOM(I,J) = SUM(AOMCDIC(I,:)*OM(IT+1,:,J)) + +C VV*H*F (ny x nx) + DO 170 I=1,ny + DO 170 J=1,nx +170 VVHF(I,J) = SUM(VV(I,1:ny)*HF(1:ny,J)) + +C OM = AA*(I - OM(+1)*C*DI*C')*OM(+1)*AA' + +C + F'*H'*VV*H*F + DO 180 I=1,nx + OM(IT,I,I) = SUM(AOMCDICOM(I,:)*AA(:,I)) + + + SUM(HF(1:ny,I)*VVHF(1:ny,I)) + DO 180 J=1,I-1 + OM(IT,I,J) = SUM(AOMCDICOM(I,:)*AA(:,J)) + + + SUM(HF(1:ny,I)*VVHF(1:ny,J)) +180 OM(IT,J,I) = OM(IT,I,J) + +C MU = AA'*(I - OM(+1)*C*DI* C')*MU(+1) + +C - AA'*(I - OM C DINV C')*OM(+1)*LAM +C + F'*H'*VV*(y(+1) - H*a - c*z) +C LAM = a - B*H*a + B*[y(+1)-c*z] (nx x 1) + COM(1:ny,1) = 0.D0 + DO 185 I=1,ny +185 COM(I,1) = SUM(c(I,1:nz,IS(1))*yk(IT+1,ny+1:ny+nz)) + + DO 190 I=1,nx +190 LAM(I) = a(I,IS(4)) - SUM(BH(I,1:nx)*a(1:nx,IS(4))) + + + SUM(B(I,1:ny)*(yk(IT+1,1:ny) + + - COM(1:ny,1))) + DO 200 I=1,nx +200 MU(IT,I) = SUM(AOMCDIC(I,:)*MU(IT+1,:)) + + - SUM(AOMCDICOM(I,:)*LAM(:)) + + + SUM(VVHF(1:ny,I)*(yk(IT+1,1:ny) + # - Ha(1:ny)-COM(1:ny,1))) + +250 CONTINUE + +C --------------- +C START SAMPLING +C --------------- + ALLOCATE(DLL(nstot),PROB(nstot),PROBL(nstot),XT(0:nstot,nx), + 1 PT(0:nstot,nx,nx),IRANK(nstot),PMUL(nstot,nstot,2)) + PMUL(:,:,1) = PMAT(:,:) ! one-step ahead + PMUL(:,:,2) = 0.D0 ! two-step ahead + DO 260 I = 1,nstot + DO 260 J = 1,nstot + DO 260 K = 1,nstot +260 PMUL(I,J,2) = PMUL(I,J,2) + PMAT(I,K)*PMAT(K,J) + +C FEASIBLE Z-STATES + NIFS = 0 + IFS(:) = 0 + DO 265 K =1,nstot + IF (PE(K).GT.0.D0) THEN + NIFS = NIFS + 1 + IFS(NIFS) = K +265 ENDIF + dc(1:2) = 0 + DO 2000 IT = 1,nobs + DO 1000 KKK = 1,NIFS + K = IFS(KKK) + CALL INT2SEQ(K,nv,INFOS,SEQ,IS(:)) + IF ((IT.LE.d(1)).AND.(d(1).GT.0)) THEN + DO 300 I = 1,d(1) +300 CALL INT2SEQ(Z(I),nv,INFOS,SEQ,IND(I,:)) + IND(IT,:)= IS(:) + CALL IKF2(d,ny,nz,nx,nu,ns,IND(1:d(1),:),yk(1:d(1),:), + 1 c,H,G,a,F,R,Xdd(1:d(1),:), + 2 Pdd(1:d(1),:,:),DLL(1:max(1,d(1)))) + XT(K,:) = Xdd(IT,:) ! xi(t|t) + PT(K,:,:) = Pdd(IT,:,:) ! P(t|t) + DLL(:) = ZERO ! log likelihood + ELSEIF ((IT.GT.d(1)).AND.(d(1).GT.0)) THEN +C Input XT(0) PT(0), Output XT(K),PT(K),DLL(K) + Xdd(0,:) = XT(0,:) + Pdd(0,:,:) = PT(0,:,:) + CALL KF2(1,dc,ny,nz,nx,nu,ns,IS,yk(IT,:),c,H,G,a,F,R, + 1 Xdd(0:1,:),Pdd(0:1,:,:),DLL(K)) + XT(K,:) = Xdd(1,:) + PT(K,:,:) = Pdd(1,:,:) + ELSEIF ((IT.EQ.1).AND.(d(1).EQ.0)) THEN + CALL IKF2(d,ny,nz,nx,nu,ns,IS(:),yk(1,:),c,H,G,a,F,R, + 1 Xdd(0,:),Pdd(0,:,:),DLL(K)) + CALL KF2(1,dc,ny,nz,nx,nu,ns,IS(:),yk(1,:),c,H,G,a, + 1 F,R,Xdd(0:1,:),Pdd(0:1,:,:),DLL(K)) ! log likelihood + XT(K,:) = Xdd(IT,:) ! xi(t|t) + PT(K,:,:) = Pdd(IT,:,:) ! P(t|t) + ELSEIF ((IT.GT.1).AND.(d(1).EQ.0)) THEN +C Input XT(0) PT(0), Output XT(K),PT(K),DLL(K) + Xdd(0,:) = XT(0,:) + Pdd(0,:,:) = PT(0,:,:) + CALL KF2(1,dc,ny,nz,nx,nu,ns,IS(:),yk(IT,:),c,H,G,a, + 1 F,R,Xdd(0:1,:),Pdd(0:1,:,:),DLL(K)) + XT(K,:) = Xdd(1,:) + PT(K,:,:) = Pdd(1,:,:) + ENDIF + + SH(1) = Z(max(1,IT-1)) + SH(2) = K + SH(3) = Z(min(nobs,IT+1)) + PROBL(K) = DLL(K) + + + LEMMA4(OM(IT,:,:),MU(IT,:),XT(K,:),PT(K,:,:),nx) + + + MARKOVP(PMUL,PE,nstot,1,IT,nobs,SH) + +1000 CONTINUE + +C --------------------------------------------- +C SAMPLING Z(t:t+h-1) using PROB +C ISEQ is the sampled sequence - out of nstot +C --------------------------------------------- +C To prevent exp overflow + PROB(:) = 0.D0 + IMAX = MAXLOC(PROBL(IFS(1:NIFS))) + KKK = IFS(IMAX(1)) + PROBL(IFS(1:NIFS)) = PROBL(IFS(1:NIFS))-PROBL(KKK) + PROB(IFS(1:NIFS)) = DEXP(PROBL(IFS(1:NIFS))) + # / SUM(DEXP(PROBL(IFS(1:NIFS)))) + +C U = G05CAF(U) ! Sampling from U(0,1) + U = genunf(0.D0,1.D0) + ISEQ = 1 + AUX = PROB(1) + DO 310 WHILE (AUX.LT.U) + ISEQ = ISEQ + 1 +310 AUX = AUX + PROB(ISEQ) + + Z(IT) = ISEQ + + XT(0,:) = XT(ISEQ,:) + PT(0,:,:) = PT(ISEQ,:,:) + +2000 CONTINUE + + DO I=1,nobs + CALL INT2SEQ(Z(I),nv,INFOS,SEQ,S(I,:)) + ENDDO + + DEALLOCATE(DLL,PROB,PROBL,XT,PT,IRANK,PMUL) + RETURN END diff --git a/harmonic.for b/harmonic.for index ce1c270051a84bc7d7cad540d3d7d3c8753dc126..43d27417ca33452cf59e62466764140cf74eabf9 100644 --- a/harmonic.for +++ b/harmonic.for @@ -1,18 +1,18 @@ -C -------------------------------------------------------------------------- -C HARMONIC computes the harmonic mean estimates of the Marginal Lilkelihood -C Developed by A.Rossi, C.Planas and G.Fiorentini -C -C 1 Modified HME (Geweke, 1999) -C 2 Modified and stabilized HME (Geweke, 1999) -C 1/ML = sum[f(S)f(THETA)/p(Y|THETA,S)P(S|THETA)p(THETA)], -C {S,THETA}~p(S,THETA|Y) -C -C Copyright (C) 2010-2014 European Commission -C +C -------------------------------------------------------------------------- +C HARMONIC computes the harmonic mean estimates of the Marginal Lilkelihood +C Developed by A.Rossi, C.Planas and G.Fiorentini +C +C 1 Modified HME (Geweke, 1999) +C 2 Modified and stabilized HME (Geweke, 1999) +C 1/ML = sum[f(S)f(THETA)/p(Y|THETA,S)P(S|THETA)p(THETA)], +C {S,THETA}~p(S,THETA|Y) +C +C Copyright (C) 2010-2014 European Commission +C C This file is part of Program DMM C -C DMM is free software developed at the Joint Research Centre of the -C European Commission: you can redistribute it and/or modify it under +C DMM is free software developed at the Joint Research Centre of the +C European Commission: you can redistribute it and/or modify it under C the terms of the GNU General Public License as published by C the Free Software Foundation, either version 3 of the License, or C (at your option) any later version. @@ -23,241 +23,241 @@ C MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the C GNU General Public License for more details. C C You should have received a copy of the GNU General Public License -C along with DMM. If not, see <http://www.gnu.org/licenses/>. -C -------------------------------------------------------------------------- - SUBROUTINE HARMONIC(G,nobs,d,ny,nz,nx,nu,nv,ns,nstot,nt,np, - 1 INFOS,yk,IYK,gibpar,gibZ,thetaprior, - 2 psiprior,tipo,pdll,MLH) - -C INPUT - INTEGER G,nobs,d(2),ny,nz,nx,nu,nv,ns(6),nstot,nt,np(3), - 1 INFOS(9,6),gibZ(G,nobs),IYK(nobs,ny+1) - DOUBLE PRECISION yk(nobs,ny+nz),gibpar(G,nt+np(1)), - 1 thetaprior(nt,4),psiprior(np(2),np(3)) - CHARACTER*2 tipo(nt) - POINTER (pdll,fittizia) ! ASSOCIATE pointer P alla DLL ad una varibile fittizia - -C OUTPUT - DOUBLE PRECISION MLH(11,2) - -C LOCALS - INTEGER NPAR,I,J,K,IG,NPOS(nt+np(1)),IFAIL,NQ,SEQ(nv),IS(nobs,6), - 1 NPVAL,IND1(1),NPARTH,NN,NSI,II,JJ - DOUBLE PRECISION, ALLOCATABLE:: DEN2(:),ub(:) - INTEGER,ALLOCATABLE::IND(:,:),NIND(:) - DOUBLE PRECISION parm(nt),SIGM(nt,nt),pval(11), - 1 COM(nt+1,nt),ISIGM(nt,nt),DET,CON(11) - DOUBLE PRECISION,ALLOCATABLE:: PTR(:,:,:),PMAT(:,:),PE(:), - 1 ALPHA(:,:),MOM(:,:) - DOUBLE PRECISION P1(INFOS(8,1),INFOS(8,1)), - 1 P2(INFOS(8,2),INFOS(8,2)),P3(INFOS(8,3),INFOS(8,3)), - 2 P4(INFOS(8,4),INFOS(8,4)),P5(INFOS(8,5),INFOS(8,5)), - 3 P6(INFOS(8,6),INFOS(8,6)) - dOUBLE PRECISION Ppar(nt+np(1)),Fpar,QTHETA,QPSI,PS,QS,QF,A0,SS(1,1) - DOUBLE PRECISION ZERO,ONE,PI - DATA ZERO/0.0D0/,ONE/1.0D0/,PI/3.141592653589793D0/ -C EXTERNAL FUNCTIONS - DOUBLE PRECISION PTHETA,PRIOR,PRIORDIR,CHI2INV !PPCHI2 or G01FCF -C EXTERNAL SUBROUTINES - EXTERNAL NEWEYWESTCOV2,DPOTRF,DPOTRI,DESIGNZ,PPROD,ERGODIC,INT2SEQ - - NPARTH = 0 - DO I = 1,nt - IF (GIBPAR(1,I).NE.GIBPAR(2,I)) THEN - NPARTH = NPARTH + 1 - NPOS(NPARTH) = I - ENDIF - ENDDO - DO I = 1,np(1) - NPOS(NPARTH+I) = nt+I - ENDDO - NPAR = NPARTH + np(1) - parm(:) = ZERO - DO I = 1,NPARTH - parm(I) = SUM(gibpar(:,NPOS(I)))/DFLOAT(G) - ENDDO - - NQ = 0 - CALL NEWEYWESTCOV2(G,NPARTH,NQ,gibpar(:,NPOS(1:NPARTH)), - 1 parm(1:NPARTH),SIGM(1:NPARTH,1:NPARTH)) ! THETA Var-covar - - COM(1:NPARTH,1:NPARTH) = SIGM(1:NPARTH,1:NPARTH) - IFAIL = -1 -C CALL F01ADF(NPARTH,COM(1:NPARTH+1,1:NPARTH),NPARTH+1,IFAIL) ! Inverse var-covar - CALL DPOTRF('L',NPARTH,COM(1:NPARTH,1:NPARTH),NPARTH,IFAIL) ! COM = L*L' - DET = 1.D0 ! det(SIGM) - DO I=1,NPARTH - DET = DET*COM(I,I)**2 - ENDDO - CALL DPOTRI('L',NPARTH,COM(1:NPARTH,1:NPARTH),NPARTH,IFAIL) ! COM = VV^-1 - - DO 30 I=1,NPARTH - ISIGM(I,I) = COM(I,I) - DO 30 J=1,I-1 - ISIGM(I,J) = COM(I,J) -30 ISIGM(J,I) = ISIGM(I,J) - -C COM(1:NPARTH,1:NPARTH) = SIGM(1:NPARTH,1:NPARTH) -C IFAIL = -1 -C CALL F03ABF(COM(1:NPARTH,1:NPARTH),NPARTH,NPARTH,DET, -C 1 WORK(1:NPARTH),IFAIL) ! det(SIGM) - -C p = .05, .55, ...,1 - NPVAL = 11 - ALLOCATE (DEN2(G),IND(G,NPVAL),NIND(NPVAL),ub(NPVAL)) - pval(NPVAL) = 1.D0 - DO 40 I = 1,NPVAL-1 - pval(I) = .05D0 + DFLOAT(I-1)*.1D0 -40 ub(I) = CHI2INV(I,NPARTH) ! only tabulated values -C40 ub(I) = PPCHI2(pval(I),DFLOAT(NPARTH),IFAIL) !G01FCF(pval(I),DFLOAT(NPARTH),IFAIL) - CON(:) = (2.D0*PI)**(-NPARTH/2.D0)*DET**(-.5D0)/pval(:) - - IF (nv.GT.0) THEN - ALLOCATE(PTR(nobs,nstot,nstot),PMAT(nstot,nstot),PE(nstot)) -C Transition prob for QS - DO 55 I = 1,nstot-1 -55 PTR(1,I,1) = SUM(ABS(gibZ(1:G,1).EQ.I))/DFLOAT(G) - PTR(1,nstot,1) = ONE-SUM(PTR(1,1:nstot-1,1)) - - DO 57 K = 2,nobs - DO 57 I = 1,nstot-1 - DO 57 J = 1,nstot - COM(1,1) = SUM(ABS(gibZ(1:G,K-1).EQ.J)) - IF (COM(1,1).GT.ZERO) THEN - PTR(K,I,J) = SUM(ABS((gibZ(1:G,K).EQ.I).AND.(gibZ(1:G,K-1).EQ.J - # )))/COM(1,1) - ELSE - PTR(K,I,J) = ONE/DFLOAT(nstot) - ENDIF -57 PTR(K,nstot,J) = ONE-SUM(PTR(K,1:nstot-1,J)) - -C Mean and VAR for PSI - ALLOCATE (ALPHA(np(2),np(3)),MOM(np(1),2)) - DO I=1,np(1) - MOM(I,1) = SUM(gibpar(:,nt+I))/DFLOAT(G) - MOM(I,2) = SUM(gibpar(:,nt+I)**2)/DFLOAT(G) - MOM(I,2) = MOM(I,2)-MOM(I,1)**2 - ENDDO - NN = 0 - K = 0 - DO I = 1,nv - NSI = INFOS(8,I) ! # of states for S - IF (INFOS(9,I).EQ.1) THEN ! S~IID - A0 = MOM(NN+1,1)*(1.D0-MOM(NN+1,1))/MOM(NN+1,2)+1.D0 !alpha0 - DO ii = 1,NSI-1 - ALPHA(K+1,ii) = MOM(NN+ii,1)*A0 - ENDDO - ALPHA(K+1,NSI) = A0-SUM(ALPHA(K+1,1:NSI-1)) - K = K + 1 - NN = NN + NSI-1 - ELSEIF (INFOS(9,I).EQ.2) THEN ! S~Markov - DO jj = 1,NSI - A0 = MOM(NN+1,1)*(1.D0-MOM(NN+1,1))/MOM(NN+1,2)+1.D0 !alpha0 - DO ii = 1,NSI-1 - ALPHA(K+1,ii) = MOM(NN+ii,1)*A0 - ENDDO - ALPHA(K+1,NSI) = A0-SUM(ALPHA(K+1,1:NSI-1)) - K = K + 1 - NN = NN + NSI-1 - ENDDO - ENDIF - ENDDO - ENDIF - - NIND(:) = 0 - QS = ZERO - PS = ZERO - IS(:,:) = 1 - Ppar(:) = 0.D0 - DO 110 IG = 1,G - IF (nv.GT.0) THEN - CALL DESIGNZ(nv,np(1),gibpar(IG,nt+1:nt+np(1)),INFOS, - 1 P1,P2,P3,P4,P5,P6) -C PMAT(i,j) = Pr[Z(t+1)=i|Z(t)=j], Z = S1 x S2 x ... x Snv - CALL PPROD(nv,nstot,INFOS,P1,P2,P3,P4,P5,P6,PMAT) -C ERGODIC solves PE: PE*(I-P') = 0 - CALL ERGODIC(nstot,PMAT,PE) - PS = DLOG(PE(gibZ(IG,1))) ! log P(S1) - QS = DLOG(PTR(1,gibZ(IG,1),1)) ! log Q(S1) - CALL INT2SEQ(gibZ(IG,1),nv,INFOS,SEQ,IS(1,:)) - DO 60 K = 2,nobs - CALL INT2SEQ(gibZ(IG,K),nv,INFOS,SEQ,IS(K,:)) - PS = PS + DLOG(PMAT(gibZ(IG,K),gibZ(IG,K-1))) -60 QS = QS + DLOG(PTR(K,gibZ(IG,K),gibZ(IG,K-1))) - ENDIF - -C Q(THETA)~Gaussian - QF = ZERO - DO 70 I = 1,NPARTH - DO 70 J = 1,NPARTH -70 QF = QF + (gibpar(IG,NPOS(I))-parm(I)) - # * (gibpar(IG,NPOS(J))-parm(J))*ISIGM(I,J) - QTHETA = -.5D0*QF - -C PRIOR for THETA - DO 80 I = 1,NPARTH -80 Ppar(I) = PRIOR(gibpar(IG,NPOS(I)),thetaprior(NPOS(I),:), - # tipo(NPOS(I))) - -C PRIOR for PSI and Q(PSI)~Dirichlet(a1,a2,...,aN) -C Mothod of Moments: a0 = m1(1-m1)/V1+1, ai = mi*a0, i=1,2,..,N - QPSI = ZERO - NN = NPARTH - K = 0 - DO 100 J = 1,nv - NSI = INFOS(8,J) - IF(INFOS(9,J).EQ.1) THEN ! S~IID - Ppar(NPARTH+K+1) = PRIORDIR(gibpar(IG,NPOS(NN+1:NN+NSI-1)), - 1 psiprior(K+1,1:NSI),NSI) - QPSI = QPSI+PRIORDIR(gibpar(IG,NPOS(NN+1:NN+NSI-1)), - 1 ALPHA(K+1,1:NSI),NSI) - K = K + 1 - NN = NN + NSI-1 - ELSEIF(INFOS(9,J).EQ.2) THEN ! S~Markov - DO 90 I = 1,NSI - Ppar(NPARTH+K+1) = PRIORDIR(gibpar(IG,NPOS(NN+1:NN+NSI-1)), - 1 psiprior(K+1,1:NSI),NSI) - QPSI = QPSI+PRIORDIR(gibpar(IG,NPOS(NN+1:NN+NSI-1)), - 1 ALPHA(K+1,1:NSI),NSI) - K = K + 1 -90 NN = NN + NSI-1 - ENDIF -100 CONTINUE - - Fpar = PTHETA(NPOS(1),nobs,d,ny,nz,nx,nu,ns,nt,IS,yk,IYK, - 1 gibpar(IG,1:nt),thetaprior(NPOS(1),:), - 2 tipo(NPOS(1)),pdll) - Fpar = Fpar + SUM(Ppar(2:NPARTH+K)) ! log[f(y|par,S)f(par)] - - DEN2(IG) = QTHETA+QPSI+QS-Fpar-PS - - DO 105 I=1,NPVAL-1 - IF (QF.GT.ub(I)) THEN - NIND(I) = NIND(I) + 1 ! count where to put 0s - IND(NIND(I),I) = IG ! those to discard -105 ENDIF -110 CONTINUE - - IND1 = MINLOC(DEN2) - DET = DEN2(IND1(1)) - DEN2(1:G) = DEXP(DEN2(1:G)-DET) - - MLH(NPVAL,1) = SUM(DEN2(1:G))/DFLOAT(G) - CALL NEWEYWESTCOV2(G,1,1,DEN2(1:G),MLH(NPVAL,1),SS) - MLH(NPVAL,2) = SS(1,1)/(DFLOAT(G)*MLH(NPVAL,1)**2) - MLH(NPVAL,1) = MLH(NPVAL,1)*CON(NPVAL) - DO 120 I=NPVAL-1,1,-1 - DEN2(IND(1:NIND(I),I)) = 0.D0 - MLH(I,1) = SUM(DEN2(1:G))/DFLOAT(G) - CALL NEWEYWESTCOV2(G,1,1,DEN2(1:G),MLH(I,1),SS) - MLH(I,2) = SS(1,1)/(DFLOAT(G)*MLH(I,1)**2) -120 MLH(I,1) = MLH(I,1)*CON(I) - - DO 130 I =1,NPVAL -130 IF (MLH(I,1).GT.ZERO) MLH(I,1) = -DLOG(MLH(I,1))-DET - - DEALLOCATE(DEN2,IND,NIND,ub) - IF (nv.GT.0) DEALLOCATE (PTR,PMAT,PE,ALPHA,MOM) - - RETURN +C along with DMM. If not, see <http://www.gnu.org/licenses/>. +C -------------------------------------------------------------------------- + SUBROUTINE HARMONIC(G,nobs,d,ny,nz,nx,nu,nv,ns,nstot,nt,np, + 1 INFOS,yk,IYK,gibpar,gibZ,thetaprior, + 2 psiprior,tipo,pdll,MLH) + +C INPUT + INTEGER G,nobs,d(2),ny,nz,nx,nu,nv,ns(6),nstot,nt,np(3), + 1 INFOS(9,6),gibZ(G,nobs),IYK(nobs,ny+1) + DOUBLE PRECISION yk(nobs,ny+nz),gibpar(G,nt+np(1)), + 1 thetaprior(nt,4),psiprior(np(2),np(3)) + CHARACTER*2 tipo(nt) + POINTER (pdll,fittizia) ! ASSOCIATE pointer P alla DLL ad una varibile fittizia + +C OUTPUT + DOUBLE PRECISION MLH(11,2) + +C LOCALS + INTEGER NPAR,I,J,K,IG,NPOS(nt+np(1)),IFAIL,NQ,SEQ(nv),IS(nobs,6), + 1 NPVAL,IND1(1),NPARTH,NN,NSI,II,JJ + DOUBLE PRECISION, ALLOCATABLE:: DEN2(:),ub(:) + INTEGER,ALLOCATABLE::IND(:,:),NIND(:) + DOUBLE PRECISION parm(nt),SIGM(nt,nt),pval(11), + 1 COM(nt+1,nt),ISIGM(nt,nt),DET,CON(11) + DOUBLE PRECISION,ALLOCATABLE:: PTR(:,:,:),PMAT(:,:),PE(:), + 1 ALPHA(:,:),MOM(:,:) + DOUBLE PRECISION P1(INFOS(8,1),INFOS(8,1)), + 1 P2(INFOS(8,2),INFOS(8,2)),P3(INFOS(8,3),INFOS(8,3)), + 2 P4(INFOS(8,4),INFOS(8,4)),P5(INFOS(8,5),INFOS(8,5)), + 3 P6(INFOS(8,6),INFOS(8,6)) + dOUBLE PRECISION Ppar(nt+np(1)),Fpar,QTHETA,QPSI,PS,QS,QF,A0,SS(1,1) + DOUBLE PRECISION ZERO,ONE,PI + DATA ZERO/0.0D0/,ONE/1.0D0/,PI/3.141592653589793D0/ +C EXTERNAL FUNCTIONS + DOUBLE PRECISION PTHETA,PRIOR,PRIORDIR,CHI2INV !PPCHI2 or G01FCF +C EXTERNAL SUBROUTINES + EXTERNAL NEWEYWESTCOV2,DPOTRF,DPOTRI,DESIGNZ,PPROD,ERGODIC,INT2SEQ + + NPARTH = 0 + DO I = 1,nt + IF (GIBPAR(1,I).NE.GIBPAR(2,I)) THEN + NPARTH = NPARTH + 1 + NPOS(NPARTH) = I + ENDIF + ENDDO + DO I = 1,np(1) + NPOS(NPARTH+I) = nt+I + ENDDO + NPAR = NPARTH + np(1) + parm(:) = ZERO + DO I = 1,NPARTH + parm(I) = SUM(gibpar(:,NPOS(I)))/DFLOAT(G) + ENDDO + + NQ = 0 + CALL NEWEYWESTCOV2(G,NPARTH,NQ,gibpar(:,NPOS(1:NPARTH)), + 1 parm(1:NPARTH),SIGM(1:NPARTH,1:NPARTH)) ! THETA Var-covar + + COM(1:NPARTH,1:NPARTH) = SIGM(1:NPARTH,1:NPARTH) + IFAIL = -1 +C CALL F01ADF(NPARTH,COM(1:NPARTH+1,1:NPARTH),NPARTH+1,IFAIL) ! Inverse var-covar + CALL DPOTRF('L',NPARTH,COM(1:NPARTH,1:NPARTH),NPARTH,IFAIL) ! COM = L*L' + DET = 1.D0 ! det(SIGM) + DO I=1,NPARTH + DET = DET*COM(I,I)**2 + ENDDO + CALL DPOTRI('L',NPARTH,COM(1:NPARTH,1:NPARTH),NPARTH,IFAIL) ! COM = VV^-1 + + DO 30 I=1,NPARTH + ISIGM(I,I) = COM(I,I) + DO 30 J=1,I-1 + ISIGM(I,J) = COM(I,J) +30 ISIGM(J,I) = ISIGM(I,J) + +C COM(1:NPARTH,1:NPARTH) = SIGM(1:NPARTH,1:NPARTH) +C IFAIL = -1 +C CALL F03ABF(COM(1:NPARTH,1:NPARTH),NPARTH,NPARTH,DET, +C 1 WORK(1:NPARTH),IFAIL) ! det(SIGM) + +C p = .05, .55, ...,1 + NPVAL = 11 + ALLOCATE (DEN2(G),IND(G,NPVAL),NIND(NPVAL),ub(NPVAL)) + pval(NPVAL) = 1.D0 + DO 40 I = 1,NPVAL-1 + pval(I) = .05D0 + DFLOAT(I-1)*.1D0 +40 ub(I) = CHI2INV(I,NPARTH) ! only tabulated values +C40 ub(I) = PPCHI2(pval(I),DFLOAT(NPARTH),IFAIL) !G01FCF(pval(I),DFLOAT(NPARTH),IFAIL) + CON(:) = (2.D0*PI)**(-NPARTH/2.D0)*DET**(-.5D0)/pval(:) + + IF (nv.GT.0) THEN + ALLOCATE(PTR(nobs,nstot,nstot),PMAT(nstot,nstot),PE(nstot)) +C Transition prob for QS + DO 55 I = 1,nstot-1 +55 PTR(1,I,1) = SUM(ABS(gibZ(1:G,1).EQ.I))/DFLOAT(G) + PTR(1,nstot,1) = ONE-SUM(PTR(1,1:nstot-1,1)) + + DO 57 K = 2,nobs + DO 57 I = 1,nstot-1 + DO 57 J = 1,nstot + COM(1,1) = SUM(ABS(gibZ(1:G,K-1).EQ.J)) + IF (COM(1,1).GT.ZERO) THEN + PTR(K,I,J) = SUM(ABS((gibZ(1:G,K).EQ.I).AND.(gibZ(1:G,K-1).EQ.J + # )))/COM(1,1) + ELSE + PTR(K,I,J) = ONE/DFLOAT(nstot) + ENDIF +57 PTR(K,nstot,J) = ONE-SUM(PTR(K,1:nstot-1,J)) + +C Mean and VAR for PSI + ALLOCATE (ALPHA(np(2),np(3)),MOM(np(1),2)) + DO I=1,np(1) + MOM(I,1) = SUM(gibpar(:,nt+I))/DFLOAT(G) + MOM(I,2) = SUM(gibpar(:,nt+I)**2)/DFLOAT(G) + MOM(I,2) = MOM(I,2)-MOM(I,1)**2 + ENDDO + NN = 0 + K = 0 + DO I = 1,nv + NSI = INFOS(8,I) ! # of states for S + IF (INFOS(9,I).EQ.1) THEN ! S~IID + A0 = MOM(NN+1,1)*(1.D0-MOM(NN+1,1))/MOM(NN+1,2)+1.D0 !alpha0 + DO ii = 1,NSI-1 + ALPHA(K+1,ii) = MOM(NN+ii,1)*A0 + ENDDO + ALPHA(K+1,NSI) = A0-SUM(ALPHA(K+1,1:NSI-1)) + K = K + 1 + NN = NN + NSI-1 + ELSEIF (INFOS(9,I).EQ.2) THEN ! S~Markov + DO jj = 1,NSI + A0 = MOM(NN+1,1)*(1.D0-MOM(NN+1,1))/MOM(NN+1,2)+1.D0 !alpha0 + DO ii = 1,NSI-1 + ALPHA(K+1,ii) = MOM(NN+ii,1)*A0 + ENDDO + ALPHA(K+1,NSI) = A0-SUM(ALPHA(K+1,1:NSI-1)) + K = K + 1 + NN = NN + NSI-1 + ENDDO + ENDIF + ENDDO + ENDIF + + NIND(:) = 0 + QS = ZERO + PS = ZERO + IS(:,:) = 1 + Ppar(:) = 0.D0 + DO 110 IG = 1,G + IF (nv.GT.0) THEN + CALL DESIGNZ(nv,np(1),gibpar(IG,nt+1:nt+np(1)),INFOS, + 1 P1,P2,P3,P4,P5,P6) +C PMAT(i,j) = Pr[Z(t+1)=i|Z(t)=j], Z = S1 x S2 x ... x Snv + CALL PPROD(nv,nstot,INFOS,P1,P2,P3,P4,P5,P6,PMAT) +C ERGODIC solves PE: PE*(I-P') = 0 + CALL ERGODIC(nstot,PMAT,PE) + PS = DLOG(PE(gibZ(IG,1))) ! log P(S1) + QS = DLOG(PTR(1,gibZ(IG,1),1)) ! log Q(S1) + CALL INT2SEQ(gibZ(IG,1),nv,INFOS,SEQ,IS(1,:)) + DO 60 K = 2,nobs + CALL INT2SEQ(gibZ(IG,K),nv,INFOS,SEQ,IS(K,:)) + PS = PS + DLOG(PMAT(gibZ(IG,K),gibZ(IG,K-1))) +60 QS = QS + DLOG(PTR(K,gibZ(IG,K),gibZ(IG,K-1))) + ENDIF + +C Q(THETA)~Gaussian + QF = ZERO + DO 70 I = 1,NPARTH + DO 70 J = 1,NPARTH +70 QF = QF + (gibpar(IG,NPOS(I))-parm(I)) + # * (gibpar(IG,NPOS(J))-parm(J))*ISIGM(I,J) + QTHETA = -.5D0*QF + +C PRIOR for THETA + DO 80 I = 1,NPARTH +80 Ppar(I) = PRIOR(gibpar(IG,NPOS(I)),thetaprior(NPOS(I),:), + # tipo(NPOS(I))) + +C PRIOR for PSI and Q(PSI)~Dirichlet(a1,a2,...,aN) +C Mothod of Moments: a0 = m1(1-m1)/V1+1, ai = mi*a0, i=1,2,..,N + QPSI = ZERO + NN = NPARTH + K = 0 + DO 100 J = 1,nv + NSI = INFOS(8,J) + IF(INFOS(9,J).EQ.1) THEN ! S~IID + Ppar(NPARTH+K+1) = PRIORDIR(gibpar(IG,NPOS(NN+1:NN+NSI-1)), + 1 psiprior(K+1,1:NSI),NSI) + QPSI = QPSI+PRIORDIR(gibpar(IG,NPOS(NN+1:NN+NSI-1)), + 1 ALPHA(K+1,1:NSI),NSI) + K = K + 1 + NN = NN + NSI-1 + ELSEIF(INFOS(9,J).EQ.2) THEN ! S~Markov + DO 90 I = 1,NSI + Ppar(NPARTH+K+1) = PRIORDIR(gibpar(IG,NPOS(NN+1:NN+NSI-1)), + 1 psiprior(K+1,1:NSI),NSI) + QPSI = QPSI+PRIORDIR(gibpar(IG,NPOS(NN+1:NN+NSI-1)), + 1 ALPHA(K+1,1:NSI),NSI) + K = K + 1 +90 NN = NN + NSI-1 + ENDIF +100 CONTINUE + + Fpar = PTHETA(NPOS(1),nobs,d,ny,nz,nx,nu,ns,nt,IS,yk,IYK, + 1 gibpar(IG,1:nt),thetaprior(NPOS(1),:), + 2 tipo(NPOS(1)),pdll) + Fpar = Fpar + SUM(Ppar(2:NPARTH+K)) ! log[f(y|par,S)f(par)] + + DEN2(IG) = QTHETA+QPSI+QS-Fpar-PS + + DO 105 I=1,NPVAL-1 + IF (QF.GT.ub(I)) THEN + NIND(I) = NIND(I) + 1 ! count where to put 0s + IND(NIND(I),I) = IG ! those to discard +105 ENDIF +110 CONTINUE + + IND1 = MINLOC(DEN2) + DET = DEN2(IND1(1)) + DEN2(1:G) = DEXP(DEN2(1:G)-DET) + + MLH(NPVAL,1) = SUM(DEN2(1:G))/DFLOAT(G) + CALL NEWEYWESTCOV2(G,1,1,DEN2(1:G),MLH(NPVAL,1),SS) + MLH(NPVAL,2) = SS(1,1)/(DFLOAT(G)*MLH(NPVAL,1)**2) + MLH(NPVAL,1) = MLH(NPVAL,1)*CON(NPVAL) + DO 120 I=NPVAL-1,1,-1 + DEN2(IND(1:NIND(I),I)) = 0.D0 + MLH(I,1) = SUM(DEN2(1:G))/DFLOAT(G) + CALL NEWEYWESTCOV2(G,1,1,DEN2(1:G),MLH(I,1),SS) + MLH(I,2) = SS(1,1)/(DFLOAT(G)*MLH(I,1)**2) +120 MLH(I,1) = MLH(I,1)*CON(I) + + DO 130 I =1,NPVAL +130 IF (MLH(I,1).GT.ZERO) MLH(I,1) = -DLOG(MLH(I,1))-DET + + DEALLOCATE(DEN2,IND,NIND,ub) + IF (nv.GT.0) DEALLOCATE (PTR,PMAT,PE,ALPHA,MOM) + + RETURN END diff --git a/harmonic2.for b/harmonic2.for index a027710e89c9791847e80a934c7f2416adf0bb60..502f0bc9fc0bd0a4baaca034dcc3804596e5549c 100644 --- a/harmonic2.for +++ b/harmonic2.for @@ -1,19 +1,19 @@ -C -------------------------------------------------------------------------- -C HARMONIC2 (no missing values) computes the harmonic mean estimates of -C the Marginal Lilkelihood -C Developed by A.Rossi, C.Planas and G.Fiorentini -C -C 1 Modified HME (Geweke, 1999) -C 2 Modified and stabilized HME (Geweke, 1999) -C 1/ML = sum[f(S)f(THETA)/p(Y|THETA,S)P(S|THETA)p(THETA)], -C {S,THETA}~p(S,THETA|Y) -C -C Copyright (C) 2010-2014 European Commission -C +C -------------------------------------------------------------------------- +C HARMONIC2 (no missing values) computes the harmonic mean estimates of +C the Marginal Lilkelihood +C Developed by A.Rossi, C.Planas and G.Fiorentini +C +C 1 Modified HME (Geweke, 1999) +C 2 Modified and stabilized HME (Geweke, 1999) +C 1/ML = sum[f(S)f(THETA)/p(Y|THETA,S)P(S|THETA)p(THETA)], +C {S,THETA}~p(S,THETA|Y) +C +C Copyright (C) 2010-2014 European Commission +C C This file is part of Program DMM C -C DMM is free software developed at the Joint Research Centre of the -C European Commission: you can redistribute it and/or modify it under +C DMM is free software developed at the Joint Research Centre of the +C European Commission: you can redistribute it and/or modify it under C the terms of the GNU General Public License as published by C the Free Software Foundation, either version 3 of the License, or C (at your option) any later version. @@ -24,241 +24,241 @@ C MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the C GNU General Public License for more details. C C You should have received a copy of the GNU General Public License -C along with DMM. If not, see <http://www.gnu.org/licenses/>. -C -------------------------------------------------------------------------- - SUBROUTINE HARMONIC2(G,nobs,d,ny,nz,nx,nu,nv,ns,nstot,nt,np, - 1 INFOS,yk,gibpar,gibZ,thetaprior,psiprior, - 2 tipo,pdll,MLH) - -C INPUT - INTEGER G,nobs,d(2),ny,nz,nx,nu,nv,ns(6),nstot,nt,np(3), - 1 INFOS(9,6),gibZ(G,nobs) - DOUBLE PRECISION yk(nobs,ny+nz),gibpar(G,nt+np(1)), - 1 thetaprior(nt,4),psiprior(np(2),np(3)) - CHARACTER*2 tipo(nt) - POINTER (pdll,fittizia) ! ASSOCIATE pointer P alla DLL ad una varibile fittizia - -C OUTPUT - DOUBLE PRECISION MLH(11,2) - -C LOCALS - INTEGER NPAR,I,J,K,IG,NPOS(nt+np(1)),IFAIL,NQ,SEQ(nv),IS(nobs,6), - 1 NPVAL,IND1(1),NPARTH,NN,NSI,II,JJ - DOUBLE PRECISION, ALLOCATABLE:: DEN2(:),ub(:) - INTEGER,ALLOCATABLE::IND(:,:),NIND(:) - DOUBLE PRECISION parm(nt),SIGM(nt,nt),pval(11), - 1 COM(nt+1,nt),ISIGM(nt,nt),DET,CON(11) - DOUBLE PRECISION,ALLOCATABLE:: PTR(:,:,:),PMAT(:,:),PE(:), - 1 ALPHA(:,:),MOM(:,:) - DOUBLE PRECISION P1(INFOS(8,1),INFOS(8,1)), - 1 P2(INFOS(8,2),INFOS(8,2)),P3(INFOS(8,3),INFOS(8,3)), - 2 P4(INFOS(8,4),INFOS(8,4)),P5(INFOS(8,5),INFOS(8,5)), - 3 P6(INFOS(8,6),INFOS(8,6)) - DOUBLE PRECISION Ppar(nt+np(1)),Fpar,QTHETA,QPSI,PS,QS,QF,A0,SS(1,1) - DOUBLE PRECISION ZERO,ONE,PI - DATA ZERO/0.0D0/,ONE/1.0D0/,PI/3.141592653589793D0/ -C EXTERNAL FUNCTIONS - DOUBLE PRECISION PTHETA2,PRIOR,PRIORDIR,CHI2INV !PPCHI2,G01FCF -C EXTERNAL SUBROUTINES - EXTERNAL NEWEYWESTCOV2,DPOTRF,DPOTRI,DESIGNZ,PPROD,ERGODIC,INT2SEQ - - NPARTH = 0 - DO I = 1,nt - IF (GIBPAR(1,I).NE.GIBPAR(2,I)) THEN - NPARTH = NPARTH + 1 - NPOS(NPARTH) = I - ENDIF - ENDDO - DO I = 1,np(1) - NPOS(NPARTH+I) = nt+I - ENDDO - NPAR = NPARTH + np(1) - parm(:) = ZERO - DO I = 1,NPARTH - parm(I) = SUM(gibpar(:,NPOS(I)))/DFLOAT(G) - ENDDO - - NQ = 0 - CALL NEWEYWESTCOV2(G,NPARTH,NQ,gibpar(:,NPOS(1:NPARTH)), - 1 parm(1:NPARTH),SIGM(1:NPARTH,1:NPARTH)) ! THETA Var-covar - - COM(1:NPARTH,1:NPARTH) = SIGM(1:NPARTH,1:NPARTH) - IFAIL = -1 -C CALL F01ADF(NPARTH,COM(1:NPARTH+1,1:NPARTH),NPARTH+1,IFAIL) ! Inverse var-covar - CALL DPOTRF('L',NPARTH,COM(1:NPARTH,1:NPARTH),NPARTH,IFAIL) ! COM = L*L' - DET = 1.D0 ! det(SIGM) - DO I=1,NPARTH - DET = DET*COM(I,I)**2 - ENDDO - CALL DPOTRI('L',NPARTH,COM(1:NPARTH,1:NPARTH),NPARTH,IFAIL) ! COM = VV^-1 - - DO 30 I=1,NPARTH - ISIGM(I,I) = COM(I,I) - DO 30 J=1,I-1 - ISIGM(I,J) = COM(I,J) -30 ISIGM(J,I) = ISIGM(I,J) - -c COM(1:NPARTH,1:NPARTH) = SIGM(1:NPARTH,1:NPARTH) -c IFAIL = -1 -c CALL F03ABF(COM(1:NPARTH,1:NPARTH),NPARTH,NPARTH,DET, -c 1 WORK(1:NPARTH),IFAIL) ! det(SIGM) - -C p = .05, .55, ...,1 - NPVAL = 11 - ALLOCATE (DEN2(G),IND(G,NPVAL),NIND(NPVAL),ub(NPVAL)) - pval(NPVAL) = 1.D0 - DO 40 I = 1,NPVAL-1 - pval(I) = 0.05D0 + DFLOAT(I-1)*.1D0 -40 ub(I) = CHI2INV(I,NPARTH) ! only tabulated values -C40 ub(I) = PPCHI2(pval(I),DFLOAT(NPARTH),IFAIL) ! G01FCF(pval(I),DFLOAT(NPARTH),IFAIL) - CON(:) = (2.D0*PI)**(-NPARTH/2.D0)*DET**(-.5D0)/pval(:) - - IF (nv.GT.0) THEN - ALLOCATE(PTR(nobs,nstot,nstot),PMAT(nstot,nstot),PE(nstot)) -C Transition prob for QS - DO 55 I = 1,nstot-1 -55 PTR(1,I,1) = SUM(ABS(gibZ(1:G,1).EQ.I))/DFLOAT(G) - PTR(1,nstot,1) = ONE-SUM(PTR(1,1:nstot-1,1)) - - DO 57 K = 2,nobs - DO 57 I = 1,nstot-1 - DO 57 J = 1,nstot - COM(1,1) = SUM(ABS(gibZ(1:G,K-1).EQ.J)) - IF (COM(1,1).GT.ZERO) THEN - PTR(K,I,J) = SUM(ABS((gibZ(1:G,K).EQ.I).AND.(gibZ(1:G,K-1).EQ.J - # )))/COM(1,1) - ELSE - PTR(K,I,J) = ONE/DFLOAT(nstot) - ENDIF -57 PTR(K,nstot,J) = ONE-SUM(PTR(K,1:nstot-1,J)) - -C Mean and VAR for PSI - ALLOCATE (ALPHA(np(2),np(3)),MOM(np(1),2)) - DO I=1,np(1) - MOM(I,1) = SUM(gibpar(:,nt+I))/DFLOAT(G) - MOM(I,2) = SUM(gibpar(:,nt+I)**2)/DFLOAT(G) - MOM(I,2) = MOM(I,2)-MOM(I,1)**2 - ENDDO - NN = 0 - K = 0 - DO I = 1,nv - NSI = INFOS(8,I) ! # of states for S - IF (INFOS(9,I).EQ.1) THEN ! S~IID - A0 = MOM(NN+1,1)*(1.D0-MOM(NN+1,1))/MOM(NN+1,2)+1.D0 !alpha0 - DO ii = 1,NSI-1 - ALPHA(K+1,ii) = MOM(NN+ii,1)*A0 - ENDDO - ALPHA(K+1,NSI) = A0-SUM(ALPHA(K+1,1:NSI-1)) - K = K + 1 - NN = NN + NSI-1 - ELSEIF (INFOS(9,I).EQ.2) THEN ! S~Markov - DO jj = 1,NSI - A0 = MOM(NN+1,1)*(1.D0-MOM(NN+1,1))/MOM(NN+1,2)+1.D0 !alpha0 - DO ii = 1,NSI-1 - ALPHA(K+1,ii) = MOM(NN+ii,1)*A0 - ENDDO - ALPHA(K+1,NSI) = A0-SUM(ALPHA(K+1,1:NSI-1)) - K = K + 1 - NN = NN + NSI-1 - ENDDO - ENDIF - ENDDO - ENDIF - - NIND(:) = 0 - QS = ZERO - PS = ZERO - IS(:,:) = 1 - Ppar(:) = 0.D0 - DO 110 IG = 1,G - IF (nv.GT.0) THEN - CALL DESIGNZ(nv,np(1),gibpar(IG,nt+1:nt+np(1)),INFOS, - 1 P1,P2,P3,P4,P5,P6) -C PMAT(i,j) = Pr[Z(t+1)=i|Z(t)=j], Z = S1 x S2 x ... x Snv - CALL PPROD(nv,nstot,INFOS,P1,P2,P3,P4,P5,P6,PMAT) -C ERGODIC solves PE: PE*(I-P') = 0 - CALL ERGODIC(nstot,PMAT,PE) - PS = DLOG(PE(gibZ(IG,1))) ! log P(S1) - QS = DLOG(PTR(1,gibZ(IG,1),1)) ! log Q(S1) - CALL INT2SEQ(gibZ(IG,1),nv,INFOS,SEQ,IS(1,:)) - DO 60 K = 2,nobs - CALL INT2SEQ(gibZ(IG,K),nv,INFOS,SEQ,IS(K,:)) - PS = PS + DLOG(PMAT(gibZ(IG,K),gibZ(IG,K-1))) -60 QS = QS + DLOG(PTR(K,gibZ(IG,K),gibZ(IG,K-1))) - ENDIF - -C Q(THETA)~Gaussian - QF = ZERO - DO 70 I = 1,NPARTH - DO 70 J = 1,NPARTH -70 QF = QF + (gibpar(IG,NPOS(I))-parm(I)) - # * (gibpar(IG,NPOS(J))-parm(J))*ISIGM(I,J) - QTHETA = -.5D0*QF - -C PRIOR for THETA - DO 80 I = 1,NPARTH -80 Ppar(I) = PRIOR(gibpar(IG,NPOS(I)),thetaprior(NPOS(I),:), - # tipo(NPOS(I))) - -C PRIOR for PSI and Q(PSI)~Dirichlet(a1,a2,...,aN) -C Mothod of Moments: a0 = m1(1-m1)/V1+1, ai = mi*a0, i=1,2,..,N - QPSI = ZERO - NN = NPARTH - K = 0 - DO 100 J = 1,nv - NSI = INFOS(8,J) - IF(INFOS(9,J).EQ.1) THEN ! S~IID - Ppar(NPARTH+K+1) = PRIORDIR(gibpar(IG,NPOS(NN+1:NN+NSI-1)), - 1 psiprior(K+1,1:NSI),NSI) - QPSI = QPSI+PRIORDIR(gibpar(IG,NPOS(NN+1:NN+NSI-1)), - 1 ALPHA(K+1,1:NSI),NSI) - K = K + 1 - NN = NN + NSI-1 - ELSEIF(INFOS(9,J).EQ.2) THEN ! S~Markov - DO 90 I = 1,NSI - Ppar(NPARTH+K+1) = PRIORDIR(gibpar(IG,NPOS(NN+1:NN+NSI-1)), - 1 psiprior(K+1,1:NSI),NSI) - QPSI = QPSI+PRIORDIR(gibpar(IG,NPOS(NN+1:NN+NSI-1)), - 1 ALPHA(K+1,1:NSI),NSI) - K = K + 1 -90 NN = NN + NSI-1 - ENDIF -100 CONTINUE - - Fpar = PTHETA2(NPOS(1),nobs,d,ny,nz,nx,nu,ns,nt,IS,yk, - 1 gibpar(IG,1:nt),thetaprior(NPOS(1),:), - 2 tipo(NPOS(1)),pdll) - Fpar = Fpar + SUM(Ppar(2:NPARTH+K)) ! log[f(y|par,S)f(par)] - - DEN2(IG) = QTHETA+QPSI+QS-Fpar-PS - - DO 105 I=1,NPVAL-1 - IF (QF.GT.ub(I)) THEN - NIND(I) = NIND(I) + 1 ! count where to put 0s - IND(NIND(I),I) = IG ! those to discard -105 ENDIF -110 CONTINUE - - IND1 = MINLOC(DEN2) - DET = DEN2(IND1(1)) - DEN2(1:G) = DEXP(DEN2(1:G)-DET) - - MLH(NPVAL,1) = SUM(DEN2(1:G))/DFLOAT(G) - CALL NEWEYWESTCOV2(G,1,1,DEN2(1:G),MLH(NPVAL,1),SS) - MLH(NPVAL,2) = SS(1,1)/(DFLOAT(G)*MLH(NPVAL,1)**2) - MLH(NPVAL,1) = MLH(NPVAL,1)*CON(NPVAL) - DO 120 I=NPVAL-1,1,-1 - DEN2(IND(1:NIND(I),I)) = 0.D0 - MLH(I,1) = SUM(DEN2(1:G))/DFLOAT(G) - CALL NEWEYWESTCOV2(G,1,1,DEN2(1:G),MLH(I,1),SS) - MLH(I,2) = SS(1,1)/(DFLOAT(G)*MLH(I,1)**2) -120 MLH(I,1) = MLH(I,1)*CON(I) - - DO 130 I =1,NPVAL -130 IF (MLH(I,1).GT.ZERO) MLH(I,1) = -DLOG(MLH(I,1))-DET - - DEALLOCATE(DEN2,IND,NIND,ub) - IF (nv.GT.0) DEALLOCATE (PTR,PMAT,PE,ALPHA,MOM) - - RETURN +C along with DMM. If not, see <http://www.gnu.org/licenses/>. +C -------------------------------------------------------------------------- + SUBROUTINE HARMONIC2(G,nobs,d,ny,nz,nx,nu,nv,ns,nstot,nt,np, + 1 INFOS,yk,gibpar,gibZ,thetaprior,psiprior, + 2 tipo,pdll,MLH) + +C INPUT + INTEGER G,nobs,d(2),ny,nz,nx,nu,nv,ns(6),nstot,nt,np(3), + 1 INFOS(9,6),gibZ(G,nobs) + DOUBLE PRECISION yk(nobs,ny+nz),gibpar(G,nt+np(1)), + 1 thetaprior(nt,4),psiprior(np(2),np(3)) + CHARACTER*2 tipo(nt) + POINTER (pdll,fittizia) ! ASSOCIATE pointer P alla DLL ad una varibile fittizia + +C OUTPUT + DOUBLE PRECISION MLH(11,2) + +C LOCALS + INTEGER NPAR,I,J,K,IG,NPOS(nt+np(1)),IFAIL,NQ,SEQ(nv),IS(nobs,6), + 1 NPVAL,IND1(1),NPARTH,NN,NSI,II,JJ + DOUBLE PRECISION, ALLOCATABLE:: DEN2(:),ub(:) + INTEGER,ALLOCATABLE::IND(:,:),NIND(:) + DOUBLE PRECISION parm(nt),SIGM(nt,nt),pval(11), + 1 COM(nt+1,nt),ISIGM(nt,nt),DET,CON(11) + DOUBLE PRECISION,ALLOCATABLE:: PTR(:,:,:),PMAT(:,:),PE(:), + 1 ALPHA(:,:),MOM(:,:) + DOUBLE PRECISION P1(INFOS(8,1),INFOS(8,1)), + 1 P2(INFOS(8,2),INFOS(8,2)),P3(INFOS(8,3),INFOS(8,3)), + 2 P4(INFOS(8,4),INFOS(8,4)),P5(INFOS(8,5),INFOS(8,5)), + 3 P6(INFOS(8,6),INFOS(8,6)) + DOUBLE PRECISION Ppar(nt+np(1)),Fpar,QTHETA,QPSI,PS,QS,QF,A0,SS(1,1) + DOUBLE PRECISION ZERO,ONE,PI + DATA ZERO/0.0D0/,ONE/1.0D0/,PI/3.141592653589793D0/ +C EXTERNAL FUNCTIONS + DOUBLE PRECISION PTHETA2,PRIOR,PRIORDIR,CHI2INV !PPCHI2,G01FCF +C EXTERNAL SUBROUTINES + EXTERNAL NEWEYWESTCOV2,DPOTRF,DPOTRI,DESIGNZ,PPROD,ERGODIC,INT2SEQ + + NPARTH = 0 + DO I = 1,nt + IF (GIBPAR(1,I).NE.GIBPAR(2,I)) THEN + NPARTH = NPARTH + 1 + NPOS(NPARTH) = I + ENDIF + ENDDO + DO I = 1,np(1) + NPOS(NPARTH+I) = nt+I + ENDDO + NPAR = NPARTH + np(1) + parm(:) = ZERO + DO I = 1,NPARTH + parm(I) = SUM(gibpar(:,NPOS(I)))/DFLOAT(G) + ENDDO + + NQ = 0 + CALL NEWEYWESTCOV2(G,NPARTH,NQ,gibpar(:,NPOS(1:NPARTH)), + 1 parm(1:NPARTH),SIGM(1:NPARTH,1:NPARTH)) ! THETA Var-covar + + COM(1:NPARTH,1:NPARTH) = SIGM(1:NPARTH,1:NPARTH) + IFAIL = -1 +C CALL F01ADF(NPARTH,COM(1:NPARTH+1,1:NPARTH),NPARTH+1,IFAIL) ! Inverse var-covar + CALL DPOTRF('L',NPARTH,COM(1:NPARTH,1:NPARTH),NPARTH,IFAIL) ! COM = L*L' + DET = 1.D0 ! det(SIGM) + DO I=1,NPARTH + DET = DET*COM(I,I)**2 + ENDDO + CALL DPOTRI('L',NPARTH,COM(1:NPARTH,1:NPARTH),NPARTH,IFAIL) ! COM = VV^-1 + + DO 30 I=1,NPARTH + ISIGM(I,I) = COM(I,I) + DO 30 J=1,I-1 + ISIGM(I,J) = COM(I,J) +30 ISIGM(J,I) = ISIGM(I,J) + +c COM(1:NPARTH,1:NPARTH) = SIGM(1:NPARTH,1:NPARTH) +c IFAIL = -1 +c CALL F03ABF(COM(1:NPARTH,1:NPARTH),NPARTH,NPARTH,DET, +c 1 WORK(1:NPARTH),IFAIL) ! det(SIGM) + +C p = .05, .55, ...,1 + NPVAL = 11 + ALLOCATE (DEN2(G),IND(G,NPVAL),NIND(NPVAL),ub(NPVAL)) + pval(NPVAL) = 1.D0 + DO 40 I = 1,NPVAL-1 + pval(I) = 0.05D0 + DFLOAT(I-1)*.1D0 +40 ub(I) = CHI2INV(I,NPARTH) ! only tabulated values +C40 ub(I) = PPCHI2(pval(I),DFLOAT(NPARTH),IFAIL) ! G01FCF(pval(I),DFLOAT(NPARTH),IFAIL) + CON(:) = (2.D0*PI)**(-NPARTH/2.D0)*DET**(-.5D0)/pval(:) + + IF (nv.GT.0) THEN + ALLOCATE(PTR(nobs,nstot,nstot),PMAT(nstot,nstot),PE(nstot)) +C Transition prob for QS + DO 55 I = 1,nstot-1 +55 PTR(1,I,1) = SUM(ABS(gibZ(1:G,1).EQ.I))/DFLOAT(G) + PTR(1,nstot,1) = ONE-SUM(PTR(1,1:nstot-1,1)) + + DO 57 K = 2,nobs + DO 57 I = 1,nstot-1 + DO 57 J = 1,nstot + COM(1,1) = SUM(ABS(gibZ(1:G,K-1).EQ.J)) + IF (COM(1,1).GT.ZERO) THEN + PTR(K,I,J) = SUM(ABS((gibZ(1:G,K).EQ.I).AND.(gibZ(1:G,K-1).EQ.J + # )))/COM(1,1) + ELSE + PTR(K,I,J) = ONE/DFLOAT(nstot) + ENDIF +57 PTR(K,nstot,J) = ONE-SUM(PTR(K,1:nstot-1,J)) + +C Mean and VAR for PSI + ALLOCATE (ALPHA(np(2),np(3)),MOM(np(1),2)) + DO I=1,np(1) + MOM(I,1) = SUM(gibpar(:,nt+I))/DFLOAT(G) + MOM(I,2) = SUM(gibpar(:,nt+I)**2)/DFLOAT(G) + MOM(I,2) = MOM(I,2)-MOM(I,1)**2 + ENDDO + NN = 0 + K = 0 + DO I = 1,nv + NSI = INFOS(8,I) ! # of states for S + IF (INFOS(9,I).EQ.1) THEN ! S~IID + A0 = MOM(NN+1,1)*(1.D0-MOM(NN+1,1))/MOM(NN+1,2)+1.D0 !alpha0 + DO ii = 1,NSI-1 + ALPHA(K+1,ii) = MOM(NN+ii,1)*A0 + ENDDO + ALPHA(K+1,NSI) = A0-SUM(ALPHA(K+1,1:NSI-1)) + K = K + 1 + NN = NN + NSI-1 + ELSEIF (INFOS(9,I).EQ.2) THEN ! S~Markov + DO jj = 1,NSI + A0 = MOM(NN+1,1)*(1.D0-MOM(NN+1,1))/MOM(NN+1,2)+1.D0 !alpha0 + DO ii = 1,NSI-1 + ALPHA(K+1,ii) = MOM(NN+ii,1)*A0 + ENDDO + ALPHA(K+1,NSI) = A0-SUM(ALPHA(K+1,1:NSI-1)) + K = K + 1 + NN = NN + NSI-1 + ENDDO + ENDIF + ENDDO + ENDIF + + NIND(:) = 0 + QS = ZERO + PS = ZERO + IS(:,:) = 1 + Ppar(:) = 0.D0 + DO 110 IG = 1,G + IF (nv.GT.0) THEN + CALL DESIGNZ(nv,np(1),gibpar(IG,nt+1:nt+np(1)),INFOS, + 1 P1,P2,P3,P4,P5,P6) +C PMAT(i,j) = Pr[Z(t+1)=i|Z(t)=j], Z = S1 x S2 x ... x Snv + CALL PPROD(nv,nstot,INFOS,P1,P2,P3,P4,P5,P6,PMAT) +C ERGODIC solves PE: PE*(I-P') = 0 + CALL ERGODIC(nstot,PMAT,PE) + PS = DLOG(PE(gibZ(IG,1))) ! log P(S1) + QS = DLOG(PTR(1,gibZ(IG,1),1)) ! log Q(S1) + CALL INT2SEQ(gibZ(IG,1),nv,INFOS,SEQ,IS(1,:)) + DO 60 K = 2,nobs + CALL INT2SEQ(gibZ(IG,K),nv,INFOS,SEQ,IS(K,:)) + PS = PS + DLOG(PMAT(gibZ(IG,K),gibZ(IG,K-1))) +60 QS = QS + DLOG(PTR(K,gibZ(IG,K),gibZ(IG,K-1))) + ENDIF + +C Q(THETA)~Gaussian + QF = ZERO + DO 70 I = 1,NPARTH + DO 70 J = 1,NPARTH +70 QF = QF + (gibpar(IG,NPOS(I))-parm(I)) + # * (gibpar(IG,NPOS(J))-parm(J))*ISIGM(I,J) + QTHETA = -.5D0*QF + +C PRIOR for THETA + DO 80 I = 1,NPARTH +80 Ppar(I) = PRIOR(gibpar(IG,NPOS(I)),thetaprior(NPOS(I),:), + # tipo(NPOS(I))) + +C PRIOR for PSI and Q(PSI)~Dirichlet(a1,a2,...,aN) +C Mothod of Moments: a0 = m1(1-m1)/V1+1, ai = mi*a0, i=1,2,..,N + QPSI = ZERO + NN = NPARTH + K = 0 + DO 100 J = 1,nv + NSI = INFOS(8,J) + IF(INFOS(9,J).EQ.1) THEN ! S~IID + Ppar(NPARTH+K+1) = PRIORDIR(gibpar(IG,NPOS(NN+1:NN+NSI-1)), + 1 psiprior(K+1,1:NSI),NSI) + QPSI = QPSI+PRIORDIR(gibpar(IG,NPOS(NN+1:NN+NSI-1)), + 1 ALPHA(K+1,1:NSI),NSI) + K = K + 1 + NN = NN + NSI-1 + ELSEIF(INFOS(9,J).EQ.2) THEN ! S~Markov + DO 90 I = 1,NSI + Ppar(NPARTH+K+1) = PRIORDIR(gibpar(IG,NPOS(NN+1:NN+NSI-1)), + 1 psiprior(K+1,1:NSI),NSI) + QPSI = QPSI+PRIORDIR(gibpar(IG,NPOS(NN+1:NN+NSI-1)), + 1 ALPHA(K+1,1:NSI),NSI) + K = K + 1 +90 NN = NN + NSI-1 + ENDIF +100 CONTINUE + + Fpar = PTHETA2(NPOS(1),nobs,d,ny,nz,nx,nu,ns,nt,IS,yk, + 1 gibpar(IG,1:nt),thetaprior(NPOS(1),:), + 2 tipo(NPOS(1)),pdll) + Fpar = Fpar + SUM(Ppar(2:NPARTH+K)) ! log[f(y|par,S)f(par)] + + DEN2(IG) = QTHETA+QPSI+QS-Fpar-PS + + DO 105 I=1,NPVAL-1 + IF (QF.GT.ub(I)) THEN + NIND(I) = NIND(I) + 1 ! count where to put 0s + IND(NIND(I),I) = IG ! those to discard +105 ENDIF +110 CONTINUE + + IND1 = MINLOC(DEN2) + DET = DEN2(IND1(1)) + DEN2(1:G) = DEXP(DEN2(1:G)-DET) + + MLH(NPVAL,1) = SUM(DEN2(1:G))/DFLOAT(G) + CALL NEWEYWESTCOV2(G,1,1,DEN2(1:G),MLH(NPVAL,1),SS) + MLH(NPVAL,2) = SS(1,1)/(DFLOAT(G)*MLH(NPVAL,1)**2) + MLH(NPVAL,1) = MLH(NPVAL,1)*CON(NPVAL) + DO 120 I=NPVAL-1,1,-1 + DEN2(IND(1:NIND(I),I)) = 0.D0 + MLH(I,1) = SUM(DEN2(1:G))/DFLOAT(G) + CALL NEWEYWESTCOV2(G,1,1,DEN2(1:G),MLH(I,1),SS) + MLH(I,2) = SS(1,1)/(DFLOAT(G)*MLH(I,1)**2) +120 MLH(I,1) = MLH(I,1)*CON(I) + + DO 130 I =1,NPVAL +130 IF (MLH(I,1).GT.ZERO) MLH(I,1) = -DLOG(MLH(I,1))-DET + + DEALLOCATE(DEN2,IND,NIND,ub) + IF (nv.GT.0) DEALLOCATE (PTR,PMAT,PE,ALPHA,MOM) + + RETURN END diff --git a/hf.for b/hf.for index f558538f674558d4a572099b97f83bf67a0920c8..ec21a2ca52ddd10d2add250d73759ec1a2c76356 100644 --- a/hf.for +++ b/hf.for @@ -1,18 +1,18 @@ -C ---------------------------------------------------------------------- -C HF computes the loglikelihood, the innovations, and the Hamilton (1989) -C Smoother for a Markov Switching VAR(1) -C Developed by A.Rossi, C.Planas and G.Fiorentini -C -C OUTPUT: LLILIKE: log-likelihood -C INN: innovations -C SSMOOTH: P(s(t)|y^T), t=1,2,...,T -C -C Copyright (C) 2010-2014 European Commission -C +C ---------------------------------------------------------------------- +C HF computes the loglikelihood, the innovations, and the Hamilton (1989) +C Smoother for a Markov Switching VAR(1) +C Developed by A.Rossi, C.Planas and G.Fiorentini +C +C OUTPUT: LLILIKE: log-likelihood +C INN: innovations +C SSMOOTH: P(s(t)|y^T), t=1,2,...,T +C +C Copyright (C) 2010-2014 European Commission +C C This file is part of Program DMM C -C DMM is free software developed at the Joint Research Centre of the -C European Commission: you can redistribute it and/or modify it under +C DMM is free software developed at the Joint Research Centre of the +C European Commission: you can redistribute it and/or modify it under C the terms of the GNU General Public License as published by C the Free Software Foundation, either version 3 of the License, or C (at your option) any later version. @@ -23,146 +23,146 @@ C MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the C GNU General Public License for more details. C C You should have received a copy of the GNU General Public License -C along with DMM. If not, see <http://www.gnu.org/licenses/>. -C ---------------------------------------------------------------------- - SUBROUTINE HF(nobs,nx,nk,nz,nu,ns,nv,np,psi,ismoo,yk,IYK,INFOS, - 1 c,a,F,R,SSMOOTH,INN,LLIKE) - -C INPUT - INTEGER nobs,nx,nk,nz,nu,nv,np,ns(6),ismoo,IYK(nobs,nx+1),INFOS(9,6) - DOUBLE PRECISION yk(nobs,nx+nz),c(nx,max(1,nz),ns(1)), - 1 a(nx,ns(4)),F(nx,nx,ns(5)),R(nx,nu,ns(6)),psi(max(1,np)) - -C OUTPUT - DOUBLE PRECISION SSMOOTH(nobs,nk),INN(nobs,nx),LLIKE(nobs) - -C LOCALS - INTEGER inobs,inx,I,J,K,IMAX(1),IS(6),SEQ(1) - DOUBLE PRECISION,ALLOCATABLE:: ZZ(:),gam(:),mu(:),SIG(:,:),FILT(:,:), - 1 P(:,:),PE(:),PP1(:,:),PP2(:,:),PP3(:,:),PP4(:,:),PP5(:,:), - 1 PP6(:,:) - - DOUBLE PRECISION logmvnpdf,mvnpdf,norm,Lmax - ALLOCATE(PP1(INFOS(8,1),INFOS(8,1)),PP2(INFOS(8,2),INFOS(8,2)), - 1 PP3(INFOS(8,3),INFOS(8,3)),PP4(INFOS(8,4),INFOS(8,4)), - 1 PP5(INFOS(8,5),INFOS(8,5)),PP6(INFOS(8,6),INFOS(8,6))) - ALLOCATE(ZZ(nk),gam(nk),mu(nx),SIG(nx,nx),FILT(nobs,nk), - 1 P(nk,nk),PE(nk)) - - FILT(:,:) = 0.D0 - LLIKE(:) = 0.D0 - CALL designz(nv,np,psi,INFOS,PP1,PP2,PP3,PP4,PP5,PP6) - CALL pprod(nv,nk,INFOS,PP1,PP2,PP3,PP4,PP5,PP6,P) -C Initial condition (stationary MS-VAR(1)) - CALL ergodic(nk,P,PE) - inx = IYK(1,nx+1) - DO J = 1,inx - mu(J) = a(IYK(1,J),IS(4))+ - # + SUM(F(IYK(1,J),IYK(1,1:inx),IS(5)) - # * yk(1,IYK(1,1:inx))) - # + SUM(c(IYK(1,J),1:nz,IS(1))*yk(1,nx+1:nx+nz)) - ENDDO -C SIG = R*R' - DO K=1,inx - SIG(K,K) = SUM(R(IYK(1,K),1:nu,IS(6)) - # * R(IYK(1,K),1:nu,IS(6))) - DO J=1,K-1 - SIG(K,J) = SUM(R(IYK(1,K),1:nu,IS(6)) - # * R(IYK(1,J),1:nu,IS(6))) - SIG(J,K) = SIG(K,J) - ENDDO - ENDDO - DO I = 1,nk - gam(I) = PE(I)*mvnpdf(yk(1,IYK(1,1:inx)),mu(1:inx), - # SIG(1:inx,1:inx),inx) - ENDDO - LLIKE(1) = dlog(sum(gam(1:nk))) - FILT(1,1:nk-1) = gam(1:nk-1)/sum(gam(1:nk)) - FILT(1,nk) = 1.D0-sum(FILT(1,1:nk-1)) - -C ---------------------------------------------------------- -C Filtering Z(t|t)=P*Z(t-1|t-1) (.*) F(j) / SUM of numerator -C ---------------------------------------------------------- - DO 100 inobs = 2,nobs - inx = IYK(inobs,nx+1) - DO I =1,nk - CALL int2seq(I,nv,INFOS,SEQ,IS) - ZZ(I) = SUM(P(I,1:nk)*FILT(inobs-1,1:nk)) -c y(t) = c(t)z(t) + x(t) -C x(t) = a(t) + F(t)x(t-1) + R(t)u(t) - DO J = 1,inx - mu(J) = a(IYK(inobs,J),IS(4))+ - # + SUM(F(IYK(inobs,J),IYK(inobs,1:inx),IS(5)) - # * yk(inobs-1,IYK(inobs-1,1:inx))) - # + SUM(c(IYK(inobs,J),1:nz,IS(1))*yk(inobs,nx+1:nx+nz)) - ENDDO -C SIG = R*R' - DO K=1,inx - SIG(K,K) = SUM(R(IYK(inobs,K),1:nu,IS(6)) - # * R(IYK(inobs,K),1:nu,IS(6))) - DO J=1,K-1 - SIG(K,J) = SUM(R(IYK(inobs,K),1:nu,IS(6)) - # * R(IYK(inobs,J),1:nu,IS(6))) - SIG(J,K) = SIG(K,J) - ENDDO - ENDDO - gam(I) = logmvnpdf(yk(inobs,IYK(inobs,1:inx)),mu(1:inx), - # SIG(1:inx,1:inx),inx) ! log - ENDDO -C --------------------------------------------------- -C Compute the log-likelihood and Normalise the filter -C --------------------------------------------------- - IMAX = MAXLOC(gam(1:nk)) - Lmax = gam(IMAX(1)) - gam(:) = dexp(gam(:)-Lmax) - FILT(inobs,1:nk) = ZZ(1:nk)*gam(1:nk) - norm = SUM(FILT(inobs,:)) - FILT(inobs,:) = FILT(inobs,:)/norm - LLIKE(inobs) = DLOG(norm) + Lmax -100 CONTINUE - -C ------------------------------------------------------------------------------------ -C Hamilton smoother for a MS-VAR(1) -C Z(t|T): Hamilton (94), pp 694 -C Innovations: -C INN(t) = y(y)-SUM(S(t),S(t-1)) P(S(t)|S(t-1)*P(S(t-1)|x^(t-1))*E(x(t)|S(t),x^(t-1)) -C ------------------------------------------------------------------------------------ - IF (ismoo.EQ.1) THEN - SSMOOTH(nobs,:) = FILT(nobs,:) - DO inobs = nobs-1,1,-1 - DO J=1,nk - gam(J) = SUM(P(J,1:nk)*FILT(inobs,1:nk)) - ENDDO - DO J=1,nk - ZZ(J) = 1.D0 - IF (gam(J).GT.1.D-13) ZZ(J) = SSMOOTH(inobs+1,J)/gam(J) - ENDDO - DO J=1,nk - gam(J) = SUM(P(1:nk,J)*ZZ(1:nk)) - ENDDO - SSMOOTH(inobs,1:nk) = FILT(inobs,1:nk)*gam(1:nk) - ENDDO - INN(:,:) = 0.D0 - DO inobs = 2,nobs - inx = IYK(inobs,nx+1) - DO I=1,nk - CALL int2seq(I,nv,INFOS,SEQ,IS) - DO K = 1,inx - mu(K) = a(IYK(inobs,K),IS(4))+ - # + SUM(F(IYK(inobs,K),IYK(inobs,1:inx),IS(5)) - # * yk(inobs-1,IYK(inobs-1,1:inx))) - # + SUM(c(IYK(inobs,K),1:nz,IS(1))*yk(inobs,nx+1:nx+nz)) - ENDDO - DO J=1,nk - INN(inobs,IYK(inobs,1:inx)) = INN(inobs,IYK(inobs,1:inx)) - 1 + mu(1:inx)*P(I,J)*FILT(inobs-1,J) - ENDDO - ENDDO - INN(inobs,IYK(inobs,1:inx)) = yk(inobs,IYK(inobs,1:inx)) - 1 - INN(inobs,IYK(inobs,1:inx)) - ENDDO - ENDIF - - DEALLOCATE(gam,mu,SIG) - RETURN +C along with DMM. If not, see <http://www.gnu.org/licenses/>. +C ---------------------------------------------------------------------- + SUBROUTINE HF(nobs,nx,nk,nz,nu,ns,nv,np,psi,ismoo,yk,IYK,INFOS, + 1 c,a,F,R,SSMOOTH,INN,LLIKE) + +C INPUT + INTEGER nobs,nx,nk,nz,nu,nv,np,ns(6),ismoo,IYK(nobs,nx+1),INFOS(9,6) + DOUBLE PRECISION yk(nobs,nx+nz),c(nx,max(1,nz),ns(1)), + 1 a(nx,ns(4)),F(nx,nx,ns(5)),R(nx,nu,ns(6)),psi(max(1,np)) + +C OUTPUT + DOUBLE PRECISION SSMOOTH(nobs,nk),INN(nobs,nx),LLIKE(nobs) + +C LOCALS + INTEGER inobs,inx,I,J,K,IMAX(1),IS(6),SEQ(1) + DOUBLE PRECISION,ALLOCATABLE:: ZZ(:),gam(:),mu(:),SIG(:,:),FILT(:,:), + 1 P(:,:),PE(:),PP1(:,:),PP2(:,:),PP3(:,:),PP4(:,:),PP5(:,:), + 1 PP6(:,:) + + DOUBLE PRECISION logmvnpdf,mvnpdf,norm,Lmax + ALLOCATE(PP1(INFOS(8,1),INFOS(8,1)),PP2(INFOS(8,2),INFOS(8,2)), + 1 PP3(INFOS(8,3),INFOS(8,3)),PP4(INFOS(8,4),INFOS(8,4)), + 1 PP5(INFOS(8,5),INFOS(8,5)),PP6(INFOS(8,6),INFOS(8,6))) + ALLOCATE(ZZ(nk),gam(nk),mu(nx),SIG(nx,nx),FILT(nobs,nk), + 1 P(nk,nk),PE(nk)) + + FILT(:,:) = 0.D0 + LLIKE(:) = 0.D0 + CALL designz(nv,np,psi,INFOS,PP1,PP2,PP3,PP4,PP5,PP6) + CALL pprod(nv,nk,INFOS,PP1,PP2,PP3,PP4,PP5,PP6,P) +C Initial condition (stationary MS-VAR(1)) + CALL ergodic(nk,P,PE) + inx = IYK(1,nx+1) + DO J = 1,inx + mu(J) = a(IYK(1,J),IS(4))+ + # + SUM(F(IYK(1,J),IYK(1,1:inx),IS(5)) + # * yk(1,IYK(1,1:inx))) + # + SUM(c(IYK(1,J),1:nz,IS(1))*yk(1,nx+1:nx+nz)) + ENDDO +C SIG = R*R' + DO K=1,inx + SIG(K,K) = SUM(R(IYK(1,K),1:nu,IS(6)) + # * R(IYK(1,K),1:nu,IS(6))) + DO J=1,K-1 + SIG(K,J) = SUM(R(IYK(1,K),1:nu,IS(6)) + # * R(IYK(1,J),1:nu,IS(6))) + SIG(J,K) = SIG(K,J) + ENDDO + ENDDO + DO I = 1,nk + gam(I) = PE(I)*mvnpdf(yk(1,IYK(1,1:inx)),mu(1:inx), + # SIG(1:inx,1:inx),inx) + ENDDO + LLIKE(1) = dlog(sum(gam(1:nk))) + FILT(1,1:nk-1) = gam(1:nk-1)/sum(gam(1:nk)) + FILT(1,nk) = 1.D0-sum(FILT(1,1:nk-1)) + +C ---------------------------------------------------------- +C Filtering Z(t|t)=P*Z(t-1|t-1) (.*) F(j) / SUM of numerator +C ---------------------------------------------------------- + DO 100 inobs = 2,nobs + inx = IYK(inobs,nx+1) + DO I =1,nk + CALL int2seq(I,nv,INFOS,SEQ,IS) + ZZ(I) = SUM(P(I,1:nk)*FILT(inobs-1,1:nk)) +c y(t) = c(t)z(t) + x(t) +C x(t) = a(t) + F(t)x(t-1) + R(t)u(t) + DO J = 1,inx + mu(J) = a(IYK(inobs,J),IS(4))+ + # + SUM(F(IYK(inobs,J),IYK(inobs,1:inx),IS(5)) + # * yk(inobs-1,IYK(inobs-1,1:inx))) + # + SUM(c(IYK(inobs,J),1:nz,IS(1))*yk(inobs,nx+1:nx+nz)) + ENDDO +C SIG = R*R' + DO K=1,inx + SIG(K,K) = SUM(R(IYK(inobs,K),1:nu,IS(6)) + # * R(IYK(inobs,K),1:nu,IS(6))) + DO J=1,K-1 + SIG(K,J) = SUM(R(IYK(inobs,K),1:nu,IS(6)) + # * R(IYK(inobs,J),1:nu,IS(6))) + SIG(J,K) = SIG(K,J) + ENDDO + ENDDO + gam(I) = logmvnpdf(yk(inobs,IYK(inobs,1:inx)),mu(1:inx), + # SIG(1:inx,1:inx),inx) ! log + ENDDO +C --------------------------------------------------- +C Compute the log-likelihood and Normalise the filter +C --------------------------------------------------- + IMAX = MAXLOC(gam(1:nk)) + Lmax = gam(IMAX(1)) + gam(:) = dexp(gam(:)-Lmax) + FILT(inobs,1:nk) = ZZ(1:nk)*gam(1:nk) + norm = SUM(FILT(inobs,:)) + FILT(inobs,:) = FILT(inobs,:)/norm + LLIKE(inobs) = DLOG(norm) + Lmax +100 CONTINUE + +C ------------------------------------------------------------------------------------ +C Hamilton smoother for a MS-VAR(1) +C Z(t|T): Hamilton (94), pp 694 +C Innovations: +C INN(t) = y(y)-SUM(S(t),S(t-1)) P(S(t)|S(t-1)*P(S(t-1)|x^(t-1))*E(x(t)|S(t),x^(t-1)) +C ------------------------------------------------------------------------------------ + IF (ismoo.EQ.1) THEN + SSMOOTH(nobs,:) = FILT(nobs,:) + DO inobs = nobs-1,1,-1 + DO J=1,nk + gam(J) = SUM(P(J,1:nk)*FILT(inobs,1:nk)) + ENDDO + DO J=1,nk + ZZ(J) = 1.D0 + IF (gam(J).GT.1.D-13) ZZ(J) = SSMOOTH(inobs+1,J)/gam(J) + ENDDO + DO J=1,nk + gam(J) = SUM(P(1:nk,J)*ZZ(1:nk)) + ENDDO + SSMOOTH(inobs,1:nk) = FILT(inobs,1:nk)*gam(1:nk) + ENDDO + INN(:,:) = 0.D0 + DO inobs = 2,nobs + inx = IYK(inobs,nx+1) + DO I=1,nk + CALL int2seq(I,nv,INFOS,SEQ,IS) + DO K = 1,inx + mu(K) = a(IYK(inobs,K),IS(4))+ + # + SUM(F(IYK(inobs,K),IYK(inobs,1:inx),IS(5)) + # * yk(inobs-1,IYK(inobs-1,1:inx))) + # + SUM(c(IYK(inobs,K),1:nz,IS(1))*yk(inobs,nx+1:nx+nz)) + ENDDO + DO J=1,nk + INN(inobs,IYK(inobs,1:inx)) = INN(inobs,IYK(inobs,1:inx)) + 1 + mu(1:inx)*P(I,J)*FILT(inobs-1,J) + ENDDO + ENDDO + INN(inobs,IYK(inobs,1:inx)) = yk(inobs,IYK(inobs,1:inx)) + 1 - INN(inobs,IYK(inobs,1:inx)) + ENDDO + ENDIF + + DEALLOCATE(gam,mu,SIG) + RETURN END diff --git a/ikf.for b/ikf.for index b5af0a3307f9b96a664024ec950f1a9af751be21..36b1f3e02aa362a919ab9c1599727e8d092f7b19 100644 --- a/ikf.for +++ b/ikf.for @@ -1,39 +1,39 @@ -C -------------------------------------------------------------------- -C IKF COMPUTES INITIAL VALUES FOR THE KALMAN RECURSIONS FOR STATIONARY -C AND NON-STATIONARY TIME SERIES MODELS. -C Stationary: Unconditional mean and variance of x1 as in -C A.C.Harvey 1989,"Forecasting strucural time series -C models and the Kalman filter", p.121 -C -C Non-stationary: Filtered state estimates and covaiance matrices -C as in S.J.Koopman (1997), "Exact initial Kalman -C Filtering and Smoothing for non-statonary Time -C Series models", JASA, 92, pp.1630-38 -C Developed by A.Rossi, C.Planas and G.Fiorentini -C -C State-space format: y(t) = c(t)z(t) + H(t)x(t) + G(t)u(t) -C x(t) = a(t) + F(t)x(t-1) + R(t)u(t) -C -C y(t) (ny x 1) ny = # of endogenous series -C z(t) (nz x 1) nz = # of exogenous series -C x(t) (nx x 1) nx = # of continous states -C u(t) (nu x 1) nu = # of shocks -C c(t) (ny x nz x ns1) ns1 = # of states for c(t) -C H(t) (ny x nx x ns2) ns2 = # of states for H(t) -C G(t) (ny x nu x ns3) ns3 = # of states for G(t) -C a(t) (nx x ns4) ns4 = # of states for a(t) -C F(t) (nx x nx x ns5) ns5 = # of states for F(t) -C R(t) (nx x nu x ns6) ns6 = # of states for R(t) -C -C d(1): order of integration of the system -C d(2): number of non-stationary elements -C -C Copyright (C) 2010-2014 European Commission -C +C -------------------------------------------------------------------- +C IKF COMPUTES INITIAL VALUES FOR THE KALMAN RECURSIONS FOR STATIONARY +C AND NON-STATIONARY TIME SERIES MODELS. +C Stationary: Unconditional mean and variance of x1 as in +C A.C.Harvey 1989,"Forecasting strucural time series +C models and the Kalman filter", p.121 +C +C Non-stationary: Filtered state estimates and covaiance matrices +C as in S.J.Koopman (1997), "Exact initial Kalman +C Filtering and Smoothing for non-statonary Time +C Series models", JASA, 92, pp.1630-38 +C Developed by A.Rossi, C.Planas and G.Fiorentini +C +C State-space format: y(t) = c(t)z(t) + H(t)x(t) + G(t)u(t) +C x(t) = a(t) + F(t)x(t-1) + R(t)u(t) +C +C y(t) (ny x 1) ny = # of endogenous series +C z(t) (nz x 1) nz = # of exogenous series +C x(t) (nx x 1) nx = # of continous states +C u(t) (nu x 1) nu = # of shocks +C c(t) (ny x nz x ns1) ns1 = # of states for c(t) +C H(t) (ny x nx x ns2) ns2 = # of states for H(t) +C G(t) (ny x nu x ns3) ns3 = # of states for G(t) +C a(t) (nx x ns4) ns4 = # of states for a(t) +C F(t) (nx x nx x ns5) ns5 = # of states for F(t) +C R(t) (nx x nu x ns6) ns6 = # of states for R(t) +C +C d(1): order of integration of the system +C d(2): number of non-stationary elements +C +C Copyright (C) 2010-2014 European Commission +C C This file is part of Program DMM C -C DMM is free software developed at the Joint Research Centre of the -C European Commission: you can redistribute it and/or modify it under +C DMM is free software developed at the Joint Research Centre of the +C European Commission: you can redistribute it and/or modify it under C the terms of the GNU General Public License as published by C the Free Software Foundation, either version 3 of the License, or C (at your option) any later version. @@ -44,291 +44,291 @@ C MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the C GNU General Public License for more details. C C You should have received a copy of the GNU General Public License -C along with DMM. If not, see <http://www.gnu.org/licenses/>. -C -------------------------------------------------------------------- - SUBROUTINE IKF(d,ny,nz,nx,nu,ns,S,yk,IYK,c,H,G,a,F,R, - 1 Xdd,Pdd,LIKE) -C INPUT - INTEGER d(2),ny,nz,nx,nu,ns(6),S(MAX(d(1),1),6), - 1 IYK(max(d(1),1),ny+1) - DOUBLE PRECISION yk(MAX(d(1),1),ny+nz),c(ny,max(1,nz),ns(1)), - 1 H(ny,nx,ns(2)),G(ny,nu,ns(3)),a(nx,ns(4)),F(nx,nx,ns(5)), - 2 R(nx,nu,ns(6)) -C OUTPUT - DOUBLE PRECISION Pdd(MAX(d(1),1),nx,nx),Xdd(MAX(d(1),1),nx), - 1 LIKE(MAX(d(1),1)) -C LOCALS - INTEGER I,J,IFAIL,imain,iny,FiRANK - INTEGER IPIV(nx) - DOUBLE PRECISION aa(nx),Ps(nx,nx),Pi(nx,nx) - DOUBLE PRECISION HPs(ny,nx),HPi(ny,nx), - 1 Fi(ny,ny),Fs(ny,ny),Fim(ny,ny),Fsm(ny,ny), - 2 PHFs(nx,ny),PHFi(nx,ny),FFF(ny,ny),Mi(nx,ny),Ci(nx,nx) - DOUBLE PRECISION W1(ny),WORK(64*nx),WORK1(64*ny), - 1 PFP(nx,nx),APPO(nx,nx),APPO1(nx,ny),COM(ny+1,ny),RG(nx,ny) - DOUBLE PRECISION ONE,ZERO,DETV,RSS,SUMW1 - DATA ONE/1.0D0/,ZERO/0.0D0/ - -C Unconditional mean and variance - LIKE(:) = ZERO - IF (d(1).EQ.0) THEN ! stationary models - IF(SUM(ABS(a(:,S(1,4)))).EQ.ZERO) THEN - Xdd(1,:) = ZERO - ELSE - APPO = -F(:,:,S(1,5)) - DO 1 I = 1,nx -1 APPO(I,I) = 1.D0+APPO(I,I) - IFAIL = -1 -C CALL F07ADF(nx,nx,APPO,nx,IPIV,IFAIL) -C CALL F07AJF(nx,APPO,nx,IPIV,WORK,64*nx,IFAIL) - CALL DGETRF(nx,nx,APPO,nx,IPIV,IFAIL) - CALL DGETRI(nx,APPO,nx,IPIV,WORK,64*nx,IFAIL) - DO 3 I =1,nx -3 Xdd(1,I) = SUM(APPO(I,:)*a(:,S(1,4))) ! inv(I-F)*a - ENDIF - -C Pdd - F*Pdd*F' = R*R' - CALL LYAP(nx,nu,1.D-3,F(:,:,S(1,5)),R(:,:,S(1,6)),Pdd) - ELSE -C ----------------------------------------------------------- -C Non-stationary models -C Define X(1) = aa + A*eta + B*delta (A*B' = 0) -C eta~N(0,I), delta~N(0,k*I) k -> +inf -C X(1)~N(aa,P), P=Ps+k*Pi, Ps=AA', Pi=BB'. -C ----------------------------------------------------------- - aa(1:nx) = ZERO - Ps(1:nx,1:nx) = ZERO - IF (d(2).LT.nx) THEN - IF(SUM(ABS(a(d(2)+1:nx,S(1,4)))).NE.0.D0) THEN - APPO(d(2)+1:nx,d(2)+1:nx) = -F(d(2)+1:nx,d(2)+1:nx,S(1,5)) - DO 5 I = d(2)+1,nx -5 APPO(I,I) = 1.D0+APPO(I,I) -C CALL F07ADF(nx-d(2),nx-d(2),APPO(d(2)+1:nx,d(2)+1:nx),nx-d(2), -C 1 IPIV(d(2)+1:nx),IFAIL) -C CALL F07AJF(nx-d(2),APPO(d(2)+1:nx,d(2)+1:nx),nx-d(2), -C 1 IPIV(d(2)+1:nx),WORK,64*nx,IFAIL) - CALL DGETRF(nx-d(2),nx-d(2),APPO(d(2)+1:nx,d(2)+1:nx),nx-d(2), - 1 IPIV(d(2)+1:nx),IFAIL) - CALL DGETRI(nx-d(2),APPO(d(2)+1:nx,d(2)+1:nx),nx-d(2), - 1 IPIV(d(2)+1:nx),WORK,64*nx,IFAIL) - DO 6 I = d(2)+1,nx -6 aa(I) = SUM(APPO(I,d(2)+1:nx)*a(d(2)+1:nx,S(1,4))) ! inv(I-F)*a - ENDIF - -C Lyapunov eqn - CALL LYAP(nx-d(2),nu,1.D-3,F(d(2)+1:nx,d(2)+1:nx,S(1,5)), - 1 R(d(2)+1:nx,1:nu,S(1,6)),Ps(d(2)+1:nx,d(2)+1:nx)) - - ENDIF - - Pi(1:nx,1:nx) = ZERO - DO 10 I = 1,d(2) -10 Pi(I,I) = ONE - - Xdd(:,:) = ZERO - Pdd(:,:,:) = ZERO - DO 1000 imain = 1,d(1) - iny = IYK(imain,ny+1) - DO 30 I=1,iny - DO 30 J=1,nx -30 HPs(I,J) = SUM(H(IYK(imain,I),:,S(imain,2))*Ps(:,J)) - - DO 40 I=1,iny - Fs(I,I) = SUM(HPs(I,:)*H(IYK(imain,I),:,S(imain,2)))+ - + SUM(G(IYK(imain,I),:,S(imain,3))*G(IYK(imain,I),:,S(imain,3))) - DO 40 J=1,I-1 - Fs(I,J) = SUM(HPs(I,:)*H(IYK(imain,J),:,S(imain,2)))+ - + SUM(G(IYK(imain,I),:,S(imain,3))*G(IYK(imain,J),:,S(imain,3))) -40 Fs(J,I) = Fs(I,J) - - DO 50 I=1,iny - DO 50 J=1,nx -50 HPi(I,J) = SUM(H(IYK(imain,I),:,S(imain,2))*Pi(:,J)) - - DO 60 I=1,iny - Fi(I,I) = SUM(HPi(I,:)*H(IYK(imain,I),:,S(imain,2))) - DO 60 J=1,I-1 - Fi(I,J) = SUM(HPi(I,:)*H(IYK(imain,J),:,S(imain,2))) -60 Fi(J,I) = Fi(I,J) - -C -------------------------------------------------------------------------- -C Computes inverse of the innovation variance matrix -C Cases: ny = 1, Fi is scalar >0 (or 0 not considered) -C ny > 1, Fi is full rank or singular (or 0 matrix not considered) -C -------------------------------------------------------------------------- - IF (iny.EQ.1) THEN - Fsm = ZERO - Fim = 1.D0/Fi - FFF = Fim*Fs*Fim - ELSE - - IFAIL = -1 - COM(1:iny,1:iny) = Fi(1:iny,1:iny) -C CALL F02FAF('N','U',iny,COM(1:iny,1:iny),iny,W1(1:iny), -C 1 WORK1,64*ny,IFAIL) - CALL DSYEV('N','U',iny,COM(1:iny,1:iny),iny,W1(1:iny),WORK1, - 1 64*ny,IFAIL) - FiRANK = 0 - SUMW1 = SUM(ABS(W1(1:iny))) - DO 70 I=1,iny - W1(I) = W1(I)/SUMW1 -70 IF (W1(I).GT.1.D-10) FiRANK=FiRANK+1 - FiRANK = min(FiRANK,d(2)) - - IF(FiRANK.EQ.iny) THEN - Fsm = ZERO - COM(1:iny,1:iny) = Fi(1:iny,1:iny) - IFAIL = -1 -C CALL F01ADF(iny,COM(1:iny+1,1:iny),iny+1,IFAIL) - CALL DPOTRF('L',iny,COM(1:iny,1:iny),iny,IFAIL) ! COM = L*L' - CALL DPOTRI('L',iny,COM(1:iny,1:iny),iny,IFAIL) ! COM = VV^-1 - - DO 80 I=1,iny - Fim(I,I) = COM(I,I) - DO 80 J=1,I-1 - Fim(I,J) = COM(I,J) -80 Fim(J,I) = Fim(I,J) - - DO 81 I=1,iny - DO 81 J=1,iny -81 COM(I,J) = SUM(Fim(I,1:iny)*Fs(1:iny,J)) ! Fim x Fs - - DO 82 I=1,iny - FFF(I,I) = SUM(COM(I,1:iny)*Fim(1:iny,I)) - DO 82 J=1,I-1 - FFF(I,J) = SUM(COM(I,1:iny)*Fim(1:iny,J)) ! Fim x Fs x Fim -82 FFF(J,I) = FFF(I,J) - - ELSE - SUMW1=0.D0 - DO I=Firank+1,iny - SUMW1 = SUMW1 + Fi(I,I) - ENDDO - IF (SUMW1.GT.0.D0) THEN - CALL INVFBIS(Fs(1:iny,1:iny),Fi(1:iny,1:iny),iny,FiRANK, - 1 Fsm(1:iny,1:iny),Fim(1:iny,1:iny),FFF(1:iny,1:iny)) - ELSE - CALL INVF(Fs(1:iny,1:iny),Fi(1:iny,1:iny),iny,FiRANK, - 1 Fsm(1:iny,1:iny),Fim(1:iny,1:iny),FFF(1:iny,1:iny)) - ENDIF - ENDIF - ENDIF -C ------------------------------------------------------------------ -C X(d|d) = X(d|d-1)+((Ps*H'+R*G')*Fsm+Pi*H'*Fim)*(Y(d)-H*X(d|d-1)-c) -C ------------------------------------------------------------------ - DO 85 I = 1,nx - DO 85 J = 1,iny - RG(I,J) = - # SUM(R(I,1:nu,S(imain,6))*G(IYK(imain,J),1:nu,S(imain,3))) -85 HPs(J,I) = HPs(J,I) + RG(I,J) ! HPs = (Ps*H'+R*G')' - - DO 90 I = 1,nx - DO 90 J = 1,iny - PHFs(I,J) = SUM(HPs(1:iny,I)*Fsm(1:iny,J)) -90 PHFi(I,J) = SUM(HPi(1:iny,I)*Fim(1:iny,J)) - -C Innovations - DO 100 I=1,iny -100 COM(I,1) = yk(imain,IYK(imain,I)) - + - SUM(H(IYK(imain,I),1:nx,S(imain,2))*aa(1:nx)) - + - SUM(c(IYK(imain,I),1:nz,S(imain,1))*yk(imain,ny+1:ny+nz)) - - DO 110 I=1,nx -110 Xdd(imain,I) = aa(I) - + + SUM((PHFs(I,1:iny)+PHFi(I,1:iny))*COM(1:iny,1)) - -C P(d|d) = P(d|d-1) + Pi*H'*Fim*Fs*Fim*H*Pi - Ps*H'*Fsm*H*Ps - Ps*H'*Fim*H*Pi - (Ps*H'*Fim*H*Pi)' -C - Ps*H'*Fsm*H*Ps - DO 120 I = 1,nx - APPO(I,I) = -SUM(PHFs(I,1:iny)*HPs(1:iny,I)) - DO 120 J = 1,I-1 - APPO(I,J) = -SUM(PHFs(I,1:iny)*HPs(1:iny,J)) -120 APPO(J,I) = APPO(I,J) - -C - Ps*H'*Fim*H*Pi - (Ps*H'*Fim*H*Pi)' - DO 130 I = 1,nx - APPO(I,I) = APPO(I,I) - SUM(HPs(1:iny,I)*PHFi(I,1:iny)) - + - SUM(PHFi(I,1:iny)*HPs(1:iny,I)) - DO 130 J = 1,I-1 - APPO(I,J) = APPO(I,J) - SUM(HPs(1:iny,I)*PHFi(J,1:iny)) - + - SUM(PHFi(I,1:iny)*HPs(1:iny,J)) -130 APPO(J,I) = APPO(I,J) - -C Pi*H'*Fim*Fs*Fim*H*Pi - DO 140 I = 1,nx - DO 140 J = 1,iny -140 APPO1(I,J) = SUM(HPi(1:iny,I)*FFF(1:iny,J)) - - DO 150 I = 1,nx - PFP(I,I) = SUM(APPO1(I,1:iny)*HPi(1:iny,I)) - DO 150 J = 1,I-1 - PFP(I,J) = SUM(APPO1(I,1:iny)*HPi(1:iny,J)) -150 PFP(J,I) = PFP(I,J) - - Pdd(imain,:,:) = Ps(:,:) + PFP(:,:) + APPO(:,:) - -C ---------------------------------------------- -C CONTRIBUTE TO THE LIKELIHOOD 1ST d INNOVATIONS -C ---------------------------------------------- - IFAIL = -1 -C CALL F03ABF(Fsm(1:iny,1:iny)+Fim(1:iny,1:iny),iny,iny, -C 1 DETV,WORK1(1:iny),IFAIL) - FFF(1:iny,1:iny) = Fsm(1:iny,1:iny)+Fim(1:iny,1:iny) - CALL DPOTRF('L',iny,FFF(1:iny,1:iny),iny,IFAIL) ! FFF = L*L' - DETV = 1.D0 - RSS = ZERO - DO 155 I=1,iny - DETV = DETV*FFF(I,I) - DO 155 J=1,iny -155 RSS = RSS + COM(I,1)*Fsm(I,J)*COM(J,1) - - LIKE(imain) = -.5D0*(RSS - 2.D0*DLOG(DETV)) - IF (LIKE(imain).NE.0.D0) THEN - LIKE(imain)=LIKE(imain)-iny/2.D0*DLOG(2.*3.141592653589793D0) - ENDIF -C ---------------------------------- -C Predictions X(d+1|d) and P(d+1|d) -C ---------------------------------- - IF (imain.LT.d(1)) THEN -C aa = a + F*Xdd - DO 160 I=1,nx -160 aa(I) = a(I,S(imain+1,4))+SUM(F(I,:,S(imain+1,5))*Xdd(imain,:)) - -C Pi = F*Pi*F'-Ci -C Ps = F*PddF'+R*R' - DO 170 I = 1,nx - DO 170 J = 1,nx - PFP(I,J) = SUM(F(I,:,S(imain+1,5))*Pi(:,J)) ! F*Pi -170 APPO(I,J) = SUM(F(I,:,S(imain+1,5))*Pdd(imain,:,J)) ! F*Pdd - -C Mi = F*Pi*H' ! H to be checked - DO 172 I = 1,nx - DO 172 J = 1,iny -172 Mi(I,J) = SUM(PFP(I,1:nx)*H(IYK(imain,J),1:nx,S(imain,2)))!S(+1,..) before - -C Ci = Mi*Fim*Mi' - DO 174 I = 1,nx - DO 174 J = 1,iny -174 RG(I,J) = SUM(Mi(I,1:iny)*Fim(1:iny,J)) ! Mi*Fim - - DO 176 I = 1,nx - Ci(I,I) = SUM(RG(I,1:iny)*Mi(I,1:iny)) - DO 176 J = 1,I-1 -176 Ci(I,J) = SUM(RG(I,1:iny)*Mi(J,1:iny)) - - DO 180 I = 1,nx - Pi(I,I) = SUM(PFP(I,1:nx)*F(I,1:nx,S(imain+1,5)))-Ci(I,I) - Ps(I,I) = SUM(APPO(I,1:nx)*F(I,1:nx,S(imain+1,5))) - + + SUM(R(I,1:nu,S(imain+1,6))*R(I,1:nu,S(imain+1,6))) - DO 180 J = 1,I-1 - Pi(I,J) = SUM(PFP(I,1:nx)*F(J,1:nx,S(imain+1,5)))-Ci(I,J) - Ps(I,J) = SUM(APPO(I,1:nx)*F(J,1:nx,S(imain+1,5))) - + + SUM(R(I,1:nu,S(imain+1,6))*R(J,1:nu,S(imain+1,6))) - Pi(J,I) = Pi(I,J) -180 Ps(J,I) = Ps(I,J) - - ENDIF -1000 CONTINUE - ENDIF - RETURN +C along with DMM. If not, see <http://www.gnu.org/licenses/>. +C -------------------------------------------------------------------- + SUBROUTINE IKF(d,ny,nz,nx,nu,ns,S,yk,IYK,c,H,G,a,F,R, + 1 Xdd,Pdd,LIKE) +C INPUT + INTEGER d(2),ny,nz,nx,nu,ns(6),S(MAX(d(1),1),6), + 1 IYK(max(d(1),1),ny+1) + DOUBLE PRECISION yk(MAX(d(1),1),ny+nz),c(ny,max(1,nz),ns(1)), + 1 H(ny,nx,ns(2)),G(ny,nu,ns(3)),a(nx,ns(4)),F(nx,nx,ns(5)), + 2 R(nx,nu,ns(6)) +C OUTPUT + DOUBLE PRECISION Pdd(MAX(d(1),1),nx,nx),Xdd(MAX(d(1),1),nx), + 1 LIKE(MAX(d(1),1)) +C LOCALS + INTEGER I,J,IFAIL,imain,iny,FiRANK + INTEGER IPIV(nx) + DOUBLE PRECISION aa(nx),Ps(nx,nx),Pi(nx,nx) + DOUBLE PRECISION HPs(ny,nx),HPi(ny,nx), + 1 Fi(ny,ny),Fs(ny,ny),Fim(ny,ny),Fsm(ny,ny), + 2 PHFs(nx,ny),PHFi(nx,ny),FFF(ny,ny),Mi(nx,ny),Ci(nx,nx) + DOUBLE PRECISION W1(ny),WORK(64*nx),WORK1(64*ny), + 1 PFP(nx,nx),APPO(nx,nx),APPO1(nx,ny),COM(ny+1,ny),RG(nx,ny) + DOUBLE PRECISION ONE,ZERO,DETV,RSS,SUMW1 + DATA ONE/1.0D0/,ZERO/0.0D0/ + +C Unconditional mean and variance + LIKE(:) = ZERO + IF (d(1).EQ.0) THEN ! stationary models + IF(SUM(ABS(a(:,S(1,4)))).EQ.ZERO) THEN + Xdd(1,:) = ZERO + ELSE + APPO = -F(:,:,S(1,5)) + DO 1 I = 1,nx +1 APPO(I,I) = 1.D0+APPO(I,I) + IFAIL = -1 +C CALL F07ADF(nx,nx,APPO,nx,IPIV,IFAIL) +C CALL F07AJF(nx,APPO,nx,IPIV,WORK,64*nx,IFAIL) + CALL DGETRF(nx,nx,APPO,nx,IPIV,IFAIL) + CALL DGETRI(nx,APPO,nx,IPIV,WORK,64*nx,IFAIL) + DO 3 I =1,nx +3 Xdd(1,I) = SUM(APPO(I,:)*a(:,S(1,4))) ! inv(I-F)*a + ENDIF + +C Pdd - F*Pdd*F' = R*R' + CALL LYAP(nx,nu,1.D-3,F(:,:,S(1,5)),R(:,:,S(1,6)),Pdd) + ELSE +C ----------------------------------------------------------- +C Non-stationary models +C Define X(1) = aa + A*eta + B*delta (A*B' = 0) +C eta~N(0,I), delta~N(0,k*I) k -> +inf +C X(1)~N(aa,P), P=Ps+k*Pi, Ps=AA', Pi=BB'. +C ----------------------------------------------------------- + aa(1:nx) = ZERO + Ps(1:nx,1:nx) = ZERO + IF (d(2).LT.nx) THEN + IF(SUM(ABS(a(d(2)+1:nx,S(1,4)))).NE.0.D0) THEN + APPO(d(2)+1:nx,d(2)+1:nx) = -F(d(2)+1:nx,d(2)+1:nx,S(1,5)) + DO 5 I = d(2)+1,nx +5 APPO(I,I) = 1.D0+APPO(I,I) +C CALL F07ADF(nx-d(2),nx-d(2),APPO(d(2)+1:nx,d(2)+1:nx),nx-d(2), +C 1 IPIV(d(2)+1:nx),IFAIL) +C CALL F07AJF(nx-d(2),APPO(d(2)+1:nx,d(2)+1:nx),nx-d(2), +C 1 IPIV(d(2)+1:nx),WORK,64*nx,IFAIL) + CALL DGETRF(nx-d(2),nx-d(2),APPO(d(2)+1:nx,d(2)+1:nx),nx-d(2), + 1 IPIV(d(2)+1:nx),IFAIL) + CALL DGETRI(nx-d(2),APPO(d(2)+1:nx,d(2)+1:nx),nx-d(2), + 1 IPIV(d(2)+1:nx),WORK,64*nx,IFAIL) + DO 6 I = d(2)+1,nx +6 aa(I) = SUM(APPO(I,d(2)+1:nx)*a(d(2)+1:nx,S(1,4))) ! inv(I-F)*a + ENDIF + +C Lyapunov eqn + CALL LYAP(nx-d(2),nu,1.D-3,F(d(2)+1:nx,d(2)+1:nx,S(1,5)), + 1 R(d(2)+1:nx,1:nu,S(1,6)),Ps(d(2)+1:nx,d(2)+1:nx)) + + ENDIF + + Pi(1:nx,1:nx) = ZERO + DO 10 I = 1,d(2) +10 Pi(I,I) = ONE + + Xdd(:,:) = ZERO + Pdd(:,:,:) = ZERO + DO 1000 imain = 1,d(1) + iny = IYK(imain,ny+1) + DO 30 I=1,iny + DO 30 J=1,nx +30 HPs(I,J) = SUM(H(IYK(imain,I),:,S(imain,2))*Ps(:,J)) + + DO 40 I=1,iny + Fs(I,I) = SUM(HPs(I,:)*H(IYK(imain,I),:,S(imain,2)))+ + + SUM(G(IYK(imain,I),:,S(imain,3))*G(IYK(imain,I),:,S(imain,3))) + DO 40 J=1,I-1 + Fs(I,J) = SUM(HPs(I,:)*H(IYK(imain,J),:,S(imain,2)))+ + + SUM(G(IYK(imain,I),:,S(imain,3))*G(IYK(imain,J),:,S(imain,3))) +40 Fs(J,I) = Fs(I,J) + + DO 50 I=1,iny + DO 50 J=1,nx +50 HPi(I,J) = SUM(H(IYK(imain,I),:,S(imain,2))*Pi(:,J)) + + DO 60 I=1,iny + Fi(I,I) = SUM(HPi(I,:)*H(IYK(imain,I),:,S(imain,2))) + DO 60 J=1,I-1 + Fi(I,J) = SUM(HPi(I,:)*H(IYK(imain,J),:,S(imain,2))) +60 Fi(J,I) = Fi(I,J) + +C -------------------------------------------------------------------------- +C Computes inverse of the innovation variance matrix +C Cases: ny = 1, Fi is scalar >0 (or 0 not considered) +C ny > 1, Fi is full rank or singular (or 0 matrix not considered) +C -------------------------------------------------------------------------- + IF (iny.EQ.1) THEN + Fsm = ZERO + Fim = 1.D0/Fi + FFF = Fim*Fs*Fim + ELSE + + IFAIL = -1 + COM(1:iny,1:iny) = Fi(1:iny,1:iny) +C CALL F02FAF('N','U',iny,COM(1:iny,1:iny),iny,W1(1:iny), +C 1 WORK1,64*ny,IFAIL) + CALL DSYEV('N','U',iny,COM(1:iny,1:iny),iny,W1(1:iny),WORK1, + 1 64*ny,IFAIL) + FiRANK = 0 + SUMW1 = SUM(ABS(W1(1:iny))) + DO 70 I=1,iny + W1(I) = W1(I)/SUMW1 +70 IF (W1(I).GT.1.D-10) FiRANK=FiRANK+1 + FiRANK = min(FiRANK,d(2)) + + IF(FiRANK.EQ.iny) THEN + Fsm = ZERO + COM(1:iny,1:iny) = Fi(1:iny,1:iny) + IFAIL = -1 +C CALL F01ADF(iny,COM(1:iny+1,1:iny),iny+1,IFAIL) + CALL DPOTRF('L',iny,COM(1:iny,1:iny),iny,IFAIL) ! COM = L*L' + CALL DPOTRI('L',iny,COM(1:iny,1:iny),iny,IFAIL) ! COM = VV^-1 + + DO 80 I=1,iny + Fim(I,I) = COM(I,I) + DO 80 J=1,I-1 + Fim(I,J) = COM(I,J) +80 Fim(J,I) = Fim(I,J) + + DO 81 I=1,iny + DO 81 J=1,iny +81 COM(I,J) = SUM(Fim(I,1:iny)*Fs(1:iny,J)) ! Fim x Fs + + DO 82 I=1,iny + FFF(I,I) = SUM(COM(I,1:iny)*Fim(1:iny,I)) + DO 82 J=1,I-1 + FFF(I,J) = SUM(COM(I,1:iny)*Fim(1:iny,J)) ! Fim x Fs x Fim +82 FFF(J,I) = FFF(I,J) + + ELSE + SUMW1=0.D0 + DO I=Firank+1,iny + SUMW1 = SUMW1 + Fi(I,I) + ENDDO + IF (SUMW1.GT.0.D0) THEN + CALL INVFBIS(Fs(1:iny,1:iny),Fi(1:iny,1:iny),iny,FiRANK, + 1 Fsm(1:iny,1:iny),Fim(1:iny,1:iny),FFF(1:iny,1:iny)) + ELSE + CALL INVF(Fs(1:iny,1:iny),Fi(1:iny,1:iny),iny,FiRANK, + 1 Fsm(1:iny,1:iny),Fim(1:iny,1:iny),FFF(1:iny,1:iny)) + ENDIF + ENDIF + ENDIF +C ------------------------------------------------------------------ +C X(d|d) = X(d|d-1)+((Ps*H'+R*G')*Fsm+Pi*H'*Fim)*(Y(d)-H*X(d|d-1)-c) +C ------------------------------------------------------------------ + DO 85 I = 1,nx + DO 85 J = 1,iny + RG(I,J) = + # SUM(R(I,1:nu,S(imain,6))*G(IYK(imain,J),1:nu,S(imain,3))) +85 HPs(J,I) = HPs(J,I) + RG(I,J) ! HPs = (Ps*H'+R*G')' + + DO 90 I = 1,nx + DO 90 J = 1,iny + PHFs(I,J) = SUM(HPs(1:iny,I)*Fsm(1:iny,J)) +90 PHFi(I,J) = SUM(HPi(1:iny,I)*Fim(1:iny,J)) + +C Innovations + DO 100 I=1,iny +100 COM(I,1) = yk(imain,IYK(imain,I)) + + - SUM(H(IYK(imain,I),1:nx,S(imain,2))*aa(1:nx)) + + - SUM(c(IYK(imain,I),1:nz,S(imain,1))*yk(imain,ny+1:ny+nz)) + + DO 110 I=1,nx +110 Xdd(imain,I) = aa(I) + + + SUM((PHFs(I,1:iny)+PHFi(I,1:iny))*COM(1:iny,1)) + +C P(d|d) = P(d|d-1) + Pi*H'*Fim*Fs*Fim*H*Pi - Ps*H'*Fsm*H*Ps - Ps*H'*Fim*H*Pi - (Ps*H'*Fim*H*Pi)' +C - Ps*H'*Fsm*H*Ps + DO 120 I = 1,nx + APPO(I,I) = -SUM(PHFs(I,1:iny)*HPs(1:iny,I)) + DO 120 J = 1,I-1 + APPO(I,J) = -SUM(PHFs(I,1:iny)*HPs(1:iny,J)) +120 APPO(J,I) = APPO(I,J) + +C - Ps*H'*Fim*H*Pi - (Ps*H'*Fim*H*Pi)' + DO 130 I = 1,nx + APPO(I,I) = APPO(I,I) - SUM(HPs(1:iny,I)*PHFi(I,1:iny)) + + - SUM(PHFi(I,1:iny)*HPs(1:iny,I)) + DO 130 J = 1,I-1 + APPO(I,J) = APPO(I,J) - SUM(HPs(1:iny,I)*PHFi(J,1:iny)) + + - SUM(PHFi(I,1:iny)*HPs(1:iny,J)) +130 APPO(J,I) = APPO(I,J) + +C Pi*H'*Fim*Fs*Fim*H*Pi + DO 140 I = 1,nx + DO 140 J = 1,iny +140 APPO1(I,J) = SUM(HPi(1:iny,I)*FFF(1:iny,J)) + + DO 150 I = 1,nx + PFP(I,I) = SUM(APPO1(I,1:iny)*HPi(1:iny,I)) + DO 150 J = 1,I-1 + PFP(I,J) = SUM(APPO1(I,1:iny)*HPi(1:iny,J)) +150 PFP(J,I) = PFP(I,J) + + Pdd(imain,:,:) = Ps(:,:) + PFP(:,:) + APPO(:,:) + +C ---------------------------------------------- +C CONTRIBUTE TO THE LIKELIHOOD 1ST d INNOVATIONS +C ---------------------------------------------- + IFAIL = -1 +C CALL F03ABF(Fsm(1:iny,1:iny)+Fim(1:iny,1:iny),iny,iny, +C 1 DETV,WORK1(1:iny),IFAIL) + FFF(1:iny,1:iny) = Fsm(1:iny,1:iny)+Fim(1:iny,1:iny) + CALL DPOTRF('L',iny,FFF(1:iny,1:iny),iny,IFAIL) ! FFF = L*L' + DETV = 1.D0 + RSS = ZERO + DO 155 I=1,iny + DETV = DETV*FFF(I,I) + DO 155 J=1,iny +155 RSS = RSS + COM(I,1)*Fsm(I,J)*COM(J,1) + + LIKE(imain) = -.5D0*(RSS - 2.D0*DLOG(DETV)) + IF (LIKE(imain).NE.0.D0) THEN + LIKE(imain)=LIKE(imain)-iny/2.D0*DLOG(2.*3.141592653589793D0) + ENDIF +C ---------------------------------- +C Predictions X(d+1|d) and P(d+1|d) +C ---------------------------------- + IF (imain.LT.d(1)) THEN +C aa = a + F*Xdd + DO 160 I=1,nx +160 aa(I) = a(I,S(imain+1,4))+SUM(F(I,:,S(imain+1,5))*Xdd(imain,:)) + +C Pi = F*Pi*F'-Ci +C Ps = F*PddF'+R*R' + DO 170 I = 1,nx + DO 170 J = 1,nx + PFP(I,J) = SUM(F(I,:,S(imain+1,5))*Pi(:,J)) ! F*Pi +170 APPO(I,J) = SUM(F(I,:,S(imain+1,5))*Pdd(imain,:,J)) ! F*Pdd + +C Mi = F*Pi*H' ! H to be checked + DO 172 I = 1,nx + DO 172 J = 1,iny +172 Mi(I,J) = SUM(PFP(I,1:nx)*H(IYK(imain,J),1:nx,S(imain,2)))!S(+1,..) before + +C Ci = Mi*Fim*Mi' + DO 174 I = 1,nx + DO 174 J = 1,iny +174 RG(I,J) = SUM(Mi(I,1:iny)*Fim(1:iny,J)) ! Mi*Fim + + DO 176 I = 1,nx + Ci(I,I) = SUM(RG(I,1:iny)*Mi(I,1:iny)) + DO 176 J = 1,I-1 +176 Ci(I,J) = SUM(RG(I,1:iny)*Mi(J,1:iny)) + + DO 180 I = 1,nx + Pi(I,I) = SUM(PFP(I,1:nx)*F(I,1:nx,S(imain+1,5)))-Ci(I,I) + Ps(I,I) = SUM(APPO(I,1:nx)*F(I,1:nx,S(imain+1,5))) + + + SUM(R(I,1:nu,S(imain+1,6))*R(I,1:nu,S(imain+1,6))) + DO 180 J = 1,I-1 + Pi(I,J) = SUM(PFP(I,1:nx)*F(J,1:nx,S(imain+1,5)))-Ci(I,J) + Ps(I,J) = SUM(APPO(I,1:nx)*F(J,1:nx,S(imain+1,5))) + + + SUM(R(I,1:nu,S(imain+1,6))*R(J,1:nu,S(imain+1,6))) + Pi(J,I) = Pi(I,J) +180 Ps(J,I) = Ps(I,J) + + ENDIF +1000 CONTINUE + ENDIF + RETURN END diff --git a/ikf2.for b/ikf2.for index 30cda8c965e238fcb9e5bd561e2c257d7c87e15a..0d6e83607df4d3b2c63799e025b0870e172d532e 100644 --- a/ikf2.for +++ b/ikf2.for @@ -1,39 +1,39 @@ -C -----------------C -------------------------------------------------------------------- -C IKF2 (no missing values) COMPUTES INITIAL VALUES FOR THE KALMAN RECURSIONS FOR STATIONARY -C AND NON-STATIONARY TIME SERIES MODELS. -C Stationary: Unconditional mean and variance of x1 as in -C A.C.Harvey 1989,"Forecasting strucural time series -C models and the Kalman filter", p.121 -C -C Non-stationary: Filtered state estimates and covaiance matrices -C as in S.J.Koopman (1997), "Exact initial Kalman -C Filtering and Smoothing for non-statonary Time -C Series models", JASA, 92, pp.1630-38 -C Developed by A.Rossi, C.Planas and G.Fiorentini -C -C State-space format: y(t) = c(t)z(t) + H(t)x(t) + G(t)u(t) -C x(t) = a(t) + F(t)x(t-1) + R(t)u(t) -C -C y(t) (ny x 1) ny = # of endogenous series -C z(t) (nz x 1) nz = # of exogenous series -C x(t) (nx x 1) nx = # of continous states -C u(t) (nu x 1) nu = # of shocks -C c(t) (ny x nz x ns1) ns1 = # of states for c(t) -C H(t) (ny x nx x ns2) ns2 = # of states for H(t) -C G(t) (ny x nu x ns3) ns3 = # of states for G(t) -C a(t) (nx x ns4) ns4 = # of states for a(t) -C F(t) (nx x nx x ns5) ns5 = # of states for F(t) -C R(t) (nx x nu x ns6) ns6 = # of states for R(t) -C -C d(1): order of integration of the system -C d(2): number of non-stationary elements -C -C Copyright (C) 2010-2014 European Commission -C +C -----------------C -------------------------------------------------------------------- +C IKF2 (no missing values) COMPUTES INITIAL VALUES FOR THE KALMAN RECURSIONS FOR STATIONARY +C AND NON-STATIONARY TIME SERIES MODELS. +C Stationary: Unconditional mean and variance of x1 as in +C A.C.Harvey 1989,"Forecasting strucural time series +C models and the Kalman filter", p.121 +C +C Non-stationary: Filtered state estimates and covaiance matrices +C as in S.J.Koopman (1997), "Exact initial Kalman +C Filtering and Smoothing for non-statonary Time +C Series models", JASA, 92, pp.1630-38 +C Developed by A.Rossi, C.Planas and G.Fiorentini +C +C State-space format: y(t) = c(t)z(t) + H(t)x(t) + G(t)u(t) +C x(t) = a(t) + F(t)x(t-1) + R(t)u(t) +C +C y(t) (ny x 1) ny = # of endogenous series +C z(t) (nz x 1) nz = # of exogenous series +C x(t) (nx x 1) nx = # of continous states +C u(t) (nu x 1) nu = # of shocks +C c(t) (ny x nz x ns1) ns1 = # of states for c(t) +C H(t) (ny x nx x ns2) ns2 = # of states for H(t) +C G(t) (ny x nu x ns3) ns3 = # of states for G(t) +C a(t) (nx x ns4) ns4 = # of states for a(t) +C F(t) (nx x nx x ns5) ns5 = # of states for F(t) +C R(t) (nx x nu x ns6) ns6 = # of states for R(t) +C +C d(1): order of integration of the system +C d(2): number of non-stationary elements +C +C Copyright (C) 2010-2014 European Commission +C C This file is part of Program DMM C -C DMM is free software developed at the Joint Research Centre of the -C European Commission: you can redistribute it and/or modify it under +C DMM is free software developed at the Joint Research Centre of the +C European Commission: you can redistribute it and/or modify it under C the terms of the GNU General Public License as published by C the Free Software Foundation, either version 3 of the License, or C (at your option) any later version. @@ -44,291 +44,291 @@ C MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the C GNU General Public License for more details. C C You should have received a copy of the GNU General Public License -C along with DMM. If not, see <http://www.gnu.org/licenses/>. -C -------------------------------------------------------------------- - SUBROUTINE IKF2(d,ny,nz,nx,nu,ns,S,yk,c,H,G,a,F,R, - 1 Xdd,Pdd,LIKE) -C INPUT - INTEGER d(2),ny,nz,nx,nu,ns(6),S(MAX(d(1),1),6) - DOUBLE PRECISION yk(MAX(d(1),1),ny+nz),c(ny,max(1,nz),ns(1)), - 1 H(ny,nx,ns(2)),G(ny,nu,ns(3)),a(nx,ns(4)),F(nx,nx,ns(5)), - 2 R(nx,nu,ns(6)) -C OUTPUT - DOUBLE PRECISION Pdd(MAX(d(1),1),nx,nx),Xdd(MAX(d(1),1),nx), - 1 LIKE(MAX(d(1),1)) -C LOCALS - INTEGER I,J,IFAIL,imain,FiRANK - INTEGER IPIV(nx) - DOUBLE PRECISION aa(nx),Ps(nx,nx),Pi(nx,nx) - DOUBLE PRECISION HPs(ny,nx),HPi(ny,nx), - 1 Fi(ny,ny),Fs(ny,ny),Fim(ny,ny),Fsm(ny,ny), - 2 PHFs(nx,ny),PHFi(nx,ny),FFF(ny,ny),Mi(nx,ny),Ci(nx,nx) - DOUBLE PRECISION W1(ny),WORK(64*nx),WORK1(64*ny), - 1 PFP(nx,nx),APPO(nx,nx),APPO1(nx,ny),COM(ny+1,ny),RG(nx,ny) - DOUBLE PRECISION ONE,ZERO,DETV,RSS,SUMW1 - DATA ONE/1.0D0/,ZERO/0.0D0/ - -C Unconditional mean and variance - LIKE(:) = ZERO - IF (d(1).EQ.0) THEN ! stationary models - IF(SUM(ABS(a(:,S(1,4)))).EQ.ZERO) THEN - Xdd(1,:) = ZERO - ELSE - APPO = -F(:,:,S(1,5)) - DO 1 I = 1,nx -1 APPO(I,I) = 1.D0+APPO(I,I) - IFAIL = -1 -C CALL F07ADF(nx,nx,APPO,nx,IPIV,IFAIL) -C CALL F07AJF(nx,APPO,nx,IPIV,WORK,64*nx,IFAIL) - CALL DGETRF(nx,nx,APPO,nx,IPIV,IFAIL) - CALL DGETRI(nx,APPO,nx,IPIV,WORK,64*nx,IFAIL) - DO 3 I =1,nx -3 Xdd(1,I) = SUM(APPO(I,:)*a(:,S(1,4))) ! inv(I-F)*a - ENDIF - -C Pdd - F*Pdd*F' = R*R' - CALL LYAP(nx,nu,1.D-3,F(:,:,S(1,5)),R(:,:,S(1,6)),Pdd) - ELSE -C ----------------------------------------------------------- -C Non-stationary models -C Define X(1) = aa + A*eta + B*delta (A*B' = 0) -C eta~N(0,I), delta~N(0,k*I) k -> +inf -C X(1)~N(aa,P), P=Ps+k*Pi, Ps=AA', Pi=BB'. -C ----------------------------------------------------------- - aa(1:nx) = ZERO - Ps(1:nx,1:nx) = ZERO - IF (d(2).LT.nx) THEN - IF(SUM(ABS(a(d(2)+1:nx,S(1,4)))).NE.0.D0) THEN - APPO(d(2)+1:nx,d(2)+1:nx) = -F(d(2)+1:nx,d(2)+1:nx,S(1,5)) - DO 5 I = d(2)+1,nx -5 APPO(I,I) = 1.D0+APPO(I,I) -C CALL F07ADF(nx-d(2),nx-d(2),APPO(d(2)+1:nx,d(2)+1:nx),nx-d(2), -C 1 IPIV(d(2)+1:nx),IFAIL) -C CALL F07AJF(nx-d(2),APPO(d(2)+1:nx,d(2)+1:nx),nx-d(2), -C 1 IPIV(d(2)+1:nx),WORK,64*nx,IFAIL) - CALL DGETRF(nx-d(2),nx-d(2),APPO(d(2)+1:nx,d(2)+1:nx),nx-d(2), - 1 IPIV(d(2)+1:nx),IFAIL) - CALL DGETRI(nx-d(2),APPO(d(2)+1:nx,d(2)+1:nx),nx-d(2), - 1 IPIV(d(2)+1:nx),WORK,64*nx,IFAIL) - DO 6 I = d(2)+1,nx -6 aa(I) = SUM(APPO(I,d(2)+1:nx)*a(d(2)+1:nx,S(1,4))) ! inv(I-F)*a - ENDIF - -C Lyapunov eqn - CALL LYAP(nx-d(2),nu,1.D-3,F(d(2)+1:nx,d(2)+1:nx,S(1,5)), - 1 R(d(2)+1:nx,1:nu,S(1,6)),Ps(d(2)+1:nx,d(2)+1:nx)) - - ENDIF - - Pi(1:nx,1:nx) = ZERO - DO 10 I = 1,d(2) -10 Pi(I,I) = ONE - - Xdd(:,:) = ZERO - Pdd(:,:,:) = ZERO - DO 1000 imain = 1,d(1) - DO 30 I=1,ny - DO 30 J=1,nx -30 HPs(I,J) = SUM(H(I,:,S(imain,2))*Ps(:,J)) - - DO 40 I=1,ny - Fs(I,I) = SUM(HPs(I,:)*H(I,:,S(imain,2))) - + +SUM(G(I,:,S(imain,3))*G(I,:,S(imain,3))) - DO 40 J=1,I-1 - Fs(I,J) = SUM(HPs(I,:)*H(J,:,S(imain,2))) - + +SUM(G(I,:,S(imain,3))*G(J,:,S(imain,3))) -40 Fs(J,I) = Fs(I,J) - - DO 50 I=1,ny - DO 50 J=1,nx -50 HPi(I,J) = SUM(H(I,:,S(imain,2))*Pi(:,J)) - - DO 60 I=1,ny - Fi(I,I) = SUM(HPi(I,:)*H(I,:,S(imain,2))) - DO 60 J=1,I-1 - Fi(I,J) = SUM(HPi(I,:)*H(J,:,S(imain,2))) -60 Fi(J,I) = Fi(I,J) - -C -------------------------------------------------------------------------- -C Computes inverse of the innovation variance matrix -C Cases: ny = 1, Fi is scalar >0 (or 0 not considered) -C ny > 1, Fi is full rank or singular (or 0 matrix not considered) -C -------------------------------------------------------------------------- - IF (ny.EQ.1) THEN - Fsm = ZERO - Fim = 1.D0/Fi - FFF = Fim*Fs*Fim - ELSE - - IFAIL = -1 - COM(1:ny,1:ny) = Fi(1:ny,1:ny) -C CALL F02FAF('N','U',ny,COM(1:ny,1:ny),ny,W1(1:ny),WORK1,64*ny,IFAIL) - CALL DSYEV('N','U',ny,COM(1:ny,1:ny),ny,W1(1:ny),WORK1, - 1 64*ny,IFAIL) - FiRANK = 0 - SUMW1 = SUM(ABS(W1(1:ny))) - DO 70 I=1,ny - W1(I) = W1(I)/SUMW1 -70 IF (W1(I).GT.1.D-10) FiRANK=FiRANK+1 - FiRANK = min(FiRANK,d(2)) - - IF(FiRANK.EQ.ny) THEN - Fsm = ZERO - COM(1:ny,1:ny) = Fi(1:ny,1:ny) - IFAIL = -1 -C CALL F01ADF(ny,COM(1:ny+1,1:ny),ny+1,IFAIL) - CALL DPOTRF('L',ny,COM(1:ny,1:ny),ny,IFAIL) ! COM = L*L' - CALL DPOTRI('L',ny,COM(1:ny,1:ny),ny,IFAIL) ! COM = VV^-1 - - DO 80 I=1,ny - Fim(I,I) = COM(I,I) - DO 80 J=1,I-1 - Fim(I,J) = COM(I,J) -80 Fim(J,I) = Fim(I,J) - - DO 81 I=1,ny - DO 81 J=1,ny -81 COM(I,J) = SUM(Fim(I,1:ny)*Fs(1:ny,J)) ! Fim x Fs - - DO 82 I=1,ny - FFF(I,I) = SUM(COM(I,1:ny)*Fim(1:ny,I)) - DO 82 J=1,I-1 - FFF(I,J) = SUM(COM(I,1:ny)*Fim(1:ny,J)) ! Fim x Fs x Fim -82 FFF(J,I) = FFF(I,J) - - ELSE - SUMW1=0.D0 - DO I=Firank+1,ny - SUMW1 = SUMW1 + Fi(I,I) - ENDDO - IF (SUMW1.GT.0.D0) THEN - CALL INVFBIS(Fs(1:ny,1:ny),Fi(1:ny,1:ny),ny,FiRANK, - 1 Fsm(1:ny,1:ny),Fim(1:ny,1:ny),FFF(1:ny,1:ny)) - ELSE - CALL INVF(Fs(1:ny,1:ny),Fi(1:ny,1:ny),ny,FiRANK, - 1 Fsm(1:ny,1:ny),Fim(1:ny,1:ny),FFF(1:ny,1:ny)) - ENDIF - ENDIF - ENDIF -C ------------------------------------------------------------------ -C X(d|d) = X(d|d-1)+((Ps*H'+R*G')*Fsm+Pi*H'*Fim)*(Y(d)-H*X(d|d-1)-c) -C ------------------------------------------------------------------ - DO 85 I = 1,nx - DO 85 J = 1,ny - RG(I,J) = - # SUM(R(I,1:nu,S(imain,6))*G(J,1:nu,S(imain,3))) -85 HPs(J,I) = HPs(J,I) + RG(I,J) ! HPs = (Ps*H'+R*G')' - - DO 90 I = 1,nx - DO 90 J = 1,ny - PHFs(I,J) = SUM(HPs(1:ny,I)*Fsm(1:ny,J)) -90 PHFi(I,J) = SUM(HPi(1:ny,I)*Fim(1:ny,J)) - -C Innovations - DO 100 I=1,ny -100 COM(I,1) = yk(imain,I) - + - SUM(H(I,1:nx,S(imain,2))*aa(1:nx)) - + - SUM(c(I,1:nz,S(imain,1))*yk(imain,ny+1:ny+nz)) - - DO 110 I=1,nx -110 Xdd(imain,I) = aa(I) - + + SUM((PHFs(I,1:ny)+PHFi(I,1:ny))*COM(1:ny,1)) - -C P(d|d) = P(d|d-1) + Pi*H'*Fim*Fs*Fim*H*Pi - Ps*H'*Fsm*H*Ps -C - Ps*H'*Fim*H*Pi - (Ps*H'*Fim*H*Pi)' - -C- Ps*H'*Fsm*H*Ps - DO 120 I = 1,nx - APPO(I,I) = -SUM(PHFs(I,1:ny)*HPs(1:ny,I)) - DO 120 J = 1,I-1 - APPO(I,J) = -SUM(PHFs(I,1:ny)*HPs(1:ny,J)) -120 APPO(J,I) = APPO(I,J) - -C - Ps*H'*Fim*H*Pi - (Ps*H'*Fim*H*Pi)' - DO 130 I = 1,nx - APPO(I,I) = APPO(I,I) - SUM(HPs(1:ny,I)*PHFi(I,1:ny)) - + - SUM(PHFi(I,1:ny)*HPs(1:ny,I)) - DO 130 J = 1,I-1 - APPO(I,J) = APPO(I,J) - SUM(HPs(1:ny,I)*PHFi(J,1:ny)) - + - SUM(PHFi(I,1:ny)*HPs(1:ny,J)) -130 APPO(J,I) = APPO(I,J) - -C Pi*H'*Fim*Fs*Fim*H*Pi - DO 140 I = 1,nx - DO 140 J = 1,ny -140 APPO1(I,J) = SUM(HPi(1:ny,I)*FFF(1:ny,J)) - - DO 150 I = 1,nx - PFP(I,I) = SUM(APPO1(I,1:ny)*HPi(1:ny,I)) - DO 150 J = 1,I-1 - PFP(I,J) = SUM(APPO1(I,1:ny)*HPi(1:ny,J)) -150 PFP(J,I) = PFP(I,J) - - Pdd(imain,:,:) = Ps(:,:) + PFP(:,:) + APPO(:,:) - -C ---------------------------------------------- -C CONTRIBUTE TO THE LIKELIHOOD 1ST d INNOVATIONS -C ---------------------------------------------- - IFAIL = -1 -C CALL F03ABF(Fsm(1:ny,1:ny)+Fim(1:ny,1:ny),ny,ny, -C 1 DETV,WORK1(1:ny),IFAIL) - FFF(1:ny,1:ny) = Fsm(1:ny,1:ny)+Fim(1:ny,1:ny) - CALL DPOTRF('L',ny,FFF(1:ny,1:ny),ny,IFAIL) ! FFF = L*L' - DETV = 1.D0 - RSS = ZERO - DO 155 I=1,ny - DETV = DETV*FFF(I,I) - DO 155 J=1,ny -155 RSS = RSS + COM(I,1)*Fsm(I,J)*COM(J,1) - - LIKE(imain) = -.5D0*(RSS - 2.D0*DLOG(DETV)) - IF (LIKE(imain).NE.0.D0) THEN - LIKE(imain)=LIKE(imain)-ny/2.D0*DLOG(2.*3.141592653589793D0) - ENDIF -C ---------------------------------- -C Predictions X(d+1|d) and P(d+1|d) -C ---------------------------------- - IF (imain.LT.d(1)) THEN -C aa = a + F*Xdd - DO 160 I=1,nx -160 aa(I) = a(I,S(imain+1,4))+SUM(F(I,:,S(imain+1,5))*Xdd(imain,:)) - -C Pi = F*Pi*F'-Ci -C Ps = F*PddF'+R*R' - DO 170 I = 1,nx - DO 170 J = 1,nx - PFP(I,J) = SUM(F(I,:,S(imain+1,5))*Pi(:,J)) ! F*Pi -170 APPO(I,J) = SUM(F(I,:,S(imain+1,5))*Pdd(imain,:,J)) ! F*Pdd - -C Mi = F*Pi*H' ! H to be checked - DO 172 I = 1,nx - DO 172 J = 1,ny -172 Mi(I,J) = SUM(PFP(I,1:nx)*H(J,1:nx,S(imain,2)))!S(+1,..) before - -C Ci = Mi*Fim*Mi' - DO 174 I = 1,nx - DO 174 J = 1,ny -174 RG(I,J) = SUM(Mi(I,1:ny)*Fim(1:ny,J)) ! Mi*Fim - - DO 176 I = 1,nx - Ci(I,I) = SUM(RG(I,1:ny)*Mi(I,1:ny)) - DO 176 J = 1,I-1 -176 Ci(I,J) = SUM(RG(I,1:ny)*Mi(J,1:ny)) - - DO 180 I = 1,nx - Pi(I,I) = SUM(PFP(I,1:nx)*F(I,1:nx,S(imain+1,5)))-Ci(I,I) - Ps(I,I) = SUM(APPO(I,1:nx)*F(I,1:nx,S(imain+1,5))) - + + SUM(R(I,1:nu,S(imain+1,6))*R(I,1:nu,S(imain+1,6))) - DO 180 J = 1,I-1 - Pi(I,J) = SUM(PFP(I,1:nx)*F(J,1:nx,S(imain+1,5)))-Ci(I,J) - Ps(I,J) = SUM(APPO(I,1:nx)*F(J,1:nx,S(imain+1,5))) - + + SUM(R(I,1:nu,S(imain+1,6))*R(J,1:nu,S(imain+1,6))) - Pi(J,I) = Pi(I,J) -180 Ps(J,I) = Ps(I,J) - - ENDIF -1000 CONTINUE - ENDIF - - RETURN +C along with DMM. If not, see <http://www.gnu.org/licenses/>. +C -------------------------------------------------------------------- + SUBROUTINE IKF2(d,ny,nz,nx,nu,ns,S,yk,c,H,G,a,F,R, + 1 Xdd,Pdd,LIKE) +C INPUT + INTEGER d(2),ny,nz,nx,nu,ns(6),S(MAX(d(1),1),6) + DOUBLE PRECISION yk(MAX(d(1),1),ny+nz),c(ny,max(1,nz),ns(1)), + 1 H(ny,nx,ns(2)),G(ny,nu,ns(3)),a(nx,ns(4)),F(nx,nx,ns(5)), + 2 R(nx,nu,ns(6)) +C OUTPUT + DOUBLE PRECISION Pdd(MAX(d(1),1),nx,nx),Xdd(MAX(d(1),1),nx), + 1 LIKE(MAX(d(1),1)) +C LOCALS + INTEGER I,J,IFAIL,imain,FiRANK + INTEGER IPIV(nx) + DOUBLE PRECISION aa(nx),Ps(nx,nx),Pi(nx,nx) + DOUBLE PRECISION HPs(ny,nx),HPi(ny,nx), + 1 Fi(ny,ny),Fs(ny,ny),Fim(ny,ny),Fsm(ny,ny), + 2 PHFs(nx,ny),PHFi(nx,ny),FFF(ny,ny),Mi(nx,ny),Ci(nx,nx) + DOUBLE PRECISION W1(ny),WORK(64*nx),WORK1(64*ny), + 1 PFP(nx,nx),APPO(nx,nx),APPO1(nx,ny),COM(ny+1,ny),RG(nx,ny) + DOUBLE PRECISION ONE,ZERO,DETV,RSS,SUMW1 + DATA ONE/1.0D0/,ZERO/0.0D0/ + +C Unconditional mean and variance + LIKE(:) = ZERO + IF (d(1).EQ.0) THEN ! stationary models + IF(SUM(ABS(a(:,S(1,4)))).EQ.ZERO) THEN + Xdd(1,:) = ZERO + ELSE + APPO = -F(:,:,S(1,5)) + DO 1 I = 1,nx +1 APPO(I,I) = 1.D0+APPO(I,I) + IFAIL = -1 +C CALL F07ADF(nx,nx,APPO,nx,IPIV,IFAIL) +C CALL F07AJF(nx,APPO,nx,IPIV,WORK,64*nx,IFAIL) + CALL DGETRF(nx,nx,APPO,nx,IPIV,IFAIL) + CALL DGETRI(nx,APPO,nx,IPIV,WORK,64*nx,IFAIL) + DO 3 I =1,nx +3 Xdd(1,I) = SUM(APPO(I,:)*a(:,S(1,4))) ! inv(I-F)*a + ENDIF + +C Pdd - F*Pdd*F' = R*R' + CALL LYAP(nx,nu,1.D-3,F(:,:,S(1,5)),R(:,:,S(1,6)),Pdd) + ELSE +C ----------------------------------------------------------- +C Non-stationary models +C Define X(1) = aa + A*eta + B*delta (A*B' = 0) +C eta~N(0,I), delta~N(0,k*I) k -> +inf +C X(1)~N(aa,P), P=Ps+k*Pi, Ps=AA', Pi=BB'. +C ----------------------------------------------------------- + aa(1:nx) = ZERO + Ps(1:nx,1:nx) = ZERO + IF (d(2).LT.nx) THEN + IF(SUM(ABS(a(d(2)+1:nx,S(1,4)))).NE.0.D0) THEN + APPO(d(2)+1:nx,d(2)+1:nx) = -F(d(2)+1:nx,d(2)+1:nx,S(1,5)) + DO 5 I = d(2)+1,nx +5 APPO(I,I) = 1.D0+APPO(I,I) +C CALL F07ADF(nx-d(2),nx-d(2),APPO(d(2)+1:nx,d(2)+1:nx),nx-d(2), +C 1 IPIV(d(2)+1:nx),IFAIL) +C CALL F07AJF(nx-d(2),APPO(d(2)+1:nx,d(2)+1:nx),nx-d(2), +C 1 IPIV(d(2)+1:nx),WORK,64*nx,IFAIL) + CALL DGETRF(nx-d(2),nx-d(2),APPO(d(2)+1:nx,d(2)+1:nx),nx-d(2), + 1 IPIV(d(2)+1:nx),IFAIL) + CALL DGETRI(nx-d(2),APPO(d(2)+1:nx,d(2)+1:nx),nx-d(2), + 1 IPIV(d(2)+1:nx),WORK,64*nx,IFAIL) + DO 6 I = d(2)+1,nx +6 aa(I) = SUM(APPO(I,d(2)+1:nx)*a(d(2)+1:nx,S(1,4))) ! inv(I-F)*a + ENDIF + +C Lyapunov eqn + CALL LYAP(nx-d(2),nu,1.D-3,F(d(2)+1:nx,d(2)+1:nx,S(1,5)), + 1 R(d(2)+1:nx,1:nu,S(1,6)),Ps(d(2)+1:nx,d(2)+1:nx)) + + ENDIF + + Pi(1:nx,1:nx) = ZERO + DO 10 I = 1,d(2) +10 Pi(I,I) = ONE + + Xdd(:,:) = ZERO + Pdd(:,:,:) = ZERO + DO 1000 imain = 1,d(1) + DO 30 I=1,ny + DO 30 J=1,nx +30 HPs(I,J) = SUM(H(I,:,S(imain,2))*Ps(:,J)) + + DO 40 I=1,ny + Fs(I,I) = SUM(HPs(I,:)*H(I,:,S(imain,2))) + + +SUM(G(I,:,S(imain,3))*G(I,:,S(imain,3))) + DO 40 J=1,I-1 + Fs(I,J) = SUM(HPs(I,:)*H(J,:,S(imain,2))) + + +SUM(G(I,:,S(imain,3))*G(J,:,S(imain,3))) +40 Fs(J,I) = Fs(I,J) + + DO 50 I=1,ny + DO 50 J=1,nx +50 HPi(I,J) = SUM(H(I,:,S(imain,2))*Pi(:,J)) + + DO 60 I=1,ny + Fi(I,I) = SUM(HPi(I,:)*H(I,:,S(imain,2))) + DO 60 J=1,I-1 + Fi(I,J) = SUM(HPi(I,:)*H(J,:,S(imain,2))) +60 Fi(J,I) = Fi(I,J) + +C -------------------------------------------------------------------------- +C Computes inverse of the innovation variance matrix +C Cases: ny = 1, Fi is scalar >0 (or 0 not considered) +C ny > 1, Fi is full rank or singular (or 0 matrix not considered) +C -------------------------------------------------------------------------- + IF (ny.EQ.1) THEN + Fsm = ZERO + Fim = 1.D0/Fi + FFF = Fim*Fs*Fim + ELSE + + IFAIL = -1 + COM(1:ny,1:ny) = Fi(1:ny,1:ny) +C CALL F02FAF('N','U',ny,COM(1:ny,1:ny),ny,W1(1:ny),WORK1,64*ny,IFAIL) + CALL DSYEV('N','U',ny,COM(1:ny,1:ny),ny,W1(1:ny),WORK1, + 1 64*ny,IFAIL) + FiRANK = 0 + SUMW1 = SUM(ABS(W1(1:ny))) + DO 70 I=1,ny + W1(I) = W1(I)/SUMW1 +70 IF (W1(I).GT.1.D-10) FiRANK=FiRANK+1 + FiRANK = min(FiRANK,d(2)) + + IF(FiRANK.EQ.ny) THEN + Fsm = ZERO + COM(1:ny,1:ny) = Fi(1:ny,1:ny) + IFAIL = -1 +C CALL F01ADF(ny,COM(1:ny+1,1:ny),ny+1,IFAIL) + CALL DPOTRF('L',ny,COM(1:ny,1:ny),ny,IFAIL) ! COM = L*L' + CALL DPOTRI('L',ny,COM(1:ny,1:ny),ny,IFAIL) ! COM = VV^-1 + + DO 80 I=1,ny + Fim(I,I) = COM(I,I) + DO 80 J=1,I-1 + Fim(I,J) = COM(I,J) +80 Fim(J,I) = Fim(I,J) + + DO 81 I=1,ny + DO 81 J=1,ny +81 COM(I,J) = SUM(Fim(I,1:ny)*Fs(1:ny,J)) ! Fim x Fs + + DO 82 I=1,ny + FFF(I,I) = SUM(COM(I,1:ny)*Fim(1:ny,I)) + DO 82 J=1,I-1 + FFF(I,J) = SUM(COM(I,1:ny)*Fim(1:ny,J)) ! Fim x Fs x Fim +82 FFF(J,I) = FFF(I,J) + + ELSE + SUMW1=0.D0 + DO I=Firank+1,ny + SUMW1 = SUMW1 + Fi(I,I) + ENDDO + IF (SUMW1.GT.0.D0) THEN + CALL INVFBIS(Fs(1:ny,1:ny),Fi(1:ny,1:ny),ny,FiRANK, + 1 Fsm(1:ny,1:ny),Fim(1:ny,1:ny),FFF(1:ny,1:ny)) + ELSE + CALL INVF(Fs(1:ny,1:ny),Fi(1:ny,1:ny),ny,FiRANK, + 1 Fsm(1:ny,1:ny),Fim(1:ny,1:ny),FFF(1:ny,1:ny)) + ENDIF + ENDIF + ENDIF +C ------------------------------------------------------------------ +C X(d|d) = X(d|d-1)+((Ps*H'+R*G')*Fsm+Pi*H'*Fim)*(Y(d)-H*X(d|d-1)-c) +C ------------------------------------------------------------------ + DO 85 I = 1,nx + DO 85 J = 1,ny + RG(I,J) = + # SUM(R(I,1:nu,S(imain,6))*G(J,1:nu,S(imain,3))) +85 HPs(J,I) = HPs(J,I) + RG(I,J) ! HPs = (Ps*H'+R*G')' + + DO 90 I = 1,nx + DO 90 J = 1,ny + PHFs(I,J) = SUM(HPs(1:ny,I)*Fsm(1:ny,J)) +90 PHFi(I,J) = SUM(HPi(1:ny,I)*Fim(1:ny,J)) + +C Innovations + DO 100 I=1,ny +100 COM(I,1) = yk(imain,I) + + - SUM(H(I,1:nx,S(imain,2))*aa(1:nx)) + + - SUM(c(I,1:nz,S(imain,1))*yk(imain,ny+1:ny+nz)) + + DO 110 I=1,nx +110 Xdd(imain,I) = aa(I) + + + SUM((PHFs(I,1:ny)+PHFi(I,1:ny))*COM(1:ny,1)) + +C P(d|d) = P(d|d-1) + Pi*H'*Fim*Fs*Fim*H*Pi - Ps*H'*Fsm*H*Ps +C - Ps*H'*Fim*H*Pi - (Ps*H'*Fim*H*Pi)' + +C- Ps*H'*Fsm*H*Ps + DO 120 I = 1,nx + APPO(I,I) = -SUM(PHFs(I,1:ny)*HPs(1:ny,I)) + DO 120 J = 1,I-1 + APPO(I,J) = -SUM(PHFs(I,1:ny)*HPs(1:ny,J)) +120 APPO(J,I) = APPO(I,J) + +C - Ps*H'*Fim*H*Pi - (Ps*H'*Fim*H*Pi)' + DO 130 I = 1,nx + APPO(I,I) = APPO(I,I) - SUM(HPs(1:ny,I)*PHFi(I,1:ny)) + + - SUM(PHFi(I,1:ny)*HPs(1:ny,I)) + DO 130 J = 1,I-1 + APPO(I,J) = APPO(I,J) - SUM(HPs(1:ny,I)*PHFi(J,1:ny)) + + - SUM(PHFi(I,1:ny)*HPs(1:ny,J)) +130 APPO(J,I) = APPO(I,J) + +C Pi*H'*Fim*Fs*Fim*H*Pi + DO 140 I = 1,nx + DO 140 J = 1,ny +140 APPO1(I,J) = SUM(HPi(1:ny,I)*FFF(1:ny,J)) + + DO 150 I = 1,nx + PFP(I,I) = SUM(APPO1(I,1:ny)*HPi(1:ny,I)) + DO 150 J = 1,I-1 + PFP(I,J) = SUM(APPO1(I,1:ny)*HPi(1:ny,J)) +150 PFP(J,I) = PFP(I,J) + + Pdd(imain,:,:) = Ps(:,:) + PFP(:,:) + APPO(:,:) + +C ---------------------------------------------- +C CONTRIBUTE TO THE LIKELIHOOD 1ST d INNOVATIONS +C ---------------------------------------------- + IFAIL = -1 +C CALL F03ABF(Fsm(1:ny,1:ny)+Fim(1:ny,1:ny),ny,ny, +C 1 DETV,WORK1(1:ny),IFAIL) + FFF(1:ny,1:ny) = Fsm(1:ny,1:ny)+Fim(1:ny,1:ny) + CALL DPOTRF('L',ny,FFF(1:ny,1:ny),ny,IFAIL) ! FFF = L*L' + DETV = 1.D0 + RSS = ZERO + DO 155 I=1,ny + DETV = DETV*FFF(I,I) + DO 155 J=1,ny +155 RSS = RSS + COM(I,1)*Fsm(I,J)*COM(J,1) + + LIKE(imain) = -.5D0*(RSS - 2.D0*DLOG(DETV)) + IF (LIKE(imain).NE.0.D0) THEN + LIKE(imain)=LIKE(imain)-ny/2.D0*DLOG(2.*3.141592653589793D0) + ENDIF +C ---------------------------------- +C Predictions X(d+1|d) and P(d+1|d) +C ---------------------------------- + IF (imain.LT.d(1)) THEN +C aa = a + F*Xdd + DO 160 I=1,nx +160 aa(I) = a(I,S(imain+1,4))+SUM(F(I,:,S(imain+1,5))*Xdd(imain,:)) + +C Pi = F*Pi*F'-Ci +C Ps = F*PddF'+R*R' + DO 170 I = 1,nx + DO 170 J = 1,nx + PFP(I,J) = SUM(F(I,:,S(imain+1,5))*Pi(:,J)) ! F*Pi +170 APPO(I,J) = SUM(F(I,:,S(imain+1,5))*Pdd(imain,:,J)) ! F*Pdd + +C Mi = F*Pi*H' ! H to be checked + DO 172 I = 1,nx + DO 172 J = 1,ny +172 Mi(I,J) = SUM(PFP(I,1:nx)*H(J,1:nx,S(imain,2)))!S(+1,..) before + +C Ci = Mi*Fim*Mi' + DO 174 I = 1,nx + DO 174 J = 1,ny +174 RG(I,J) = SUM(Mi(I,1:ny)*Fim(1:ny,J)) ! Mi*Fim + + DO 176 I = 1,nx + Ci(I,I) = SUM(RG(I,1:ny)*Mi(I,1:ny)) + DO 176 J = 1,I-1 +176 Ci(I,J) = SUM(RG(I,1:ny)*Mi(J,1:ny)) + + DO 180 I = 1,nx + Pi(I,I) = SUM(PFP(I,1:nx)*F(I,1:nx,S(imain+1,5)))-Ci(I,I) + Ps(I,I) = SUM(APPO(I,1:nx)*F(I,1:nx,S(imain+1,5))) + + + SUM(R(I,1:nu,S(imain+1,6))*R(I,1:nu,S(imain+1,6))) + DO 180 J = 1,I-1 + Pi(I,J) = SUM(PFP(I,1:nx)*F(J,1:nx,S(imain+1,5)))-Ci(I,J) + Ps(I,J) = SUM(APPO(I,1:nx)*F(J,1:nx,S(imain+1,5))) + + + SUM(R(I,1:nu,S(imain+1,6))*R(J,1:nu,S(imain+1,6))) + Pi(J,I) = Pi(I,J) +180 Ps(J,I) = Ps(I,J) + + ENDIF +1000 CONTINUE + ENDIF + + RETURN END diff --git a/initrand.for b/initrand.for index d94b585258e0562dbf0ff4496091be664b6d2a68..5381d35375488353f0e6bc02af6457d2ad19b127 100644 --- a/initrand.for +++ b/initrand.for @@ -1,14 +1,14 @@ -C ------------------------------------------------------------ -C INITRAND initializes the random number generator: -C INITIAL = 0 FIXED SEED, otherwise SEED set according to clock -C Developed by A.Rossi, C.Planas and G.Fiorentini -C -C Copyright (C) 2010-2014 European Commission -C +C ------------------------------------------------------------ +C INITRAND initializes the random number generator: +C INITIAL = 0 FIXED SEED, otherwise SEED set according to clock +C Developed by A.Rossi, C.Planas and G.Fiorentini +C +C Copyright (C) 2010-2014 European Commission +C C This file is part of Program DMM C -C DMM is free software developed at the Joint Research Centre of the -C European Commission: you can redistribute it and/or modify it under +C DMM is free software developed at the Joint Research Centre of the +C European Commission: you can redistribute it and/or modify it under C the terms of the GNU General Public License as published by C the Free Software Foundation, either version 3 of the License, or C (at your option) any later version. @@ -17,15 +17,15 @@ C DMM is distributed in the hope that it will be useful, C but WITHOUT ANY WARRANTY; without even the implied warranty of C MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the C GNU General Public License for more details. -C ------------------------------------------------------------ - SUBROUTINE INITRAND(INITIAL,DATE_ITIME) -C Input - INTEGER INITIAL,DATE_ITIME(8) - - IF(INITIAL.NE.0) THEN - CALL setall(DATE_ITIME(7),DATE_ITIME(8)) - ELSE - CALL setall(12345,54321) - ENDIF - RETURN +C ------------------------------------------------------------ + SUBROUTINE INITRAND(INITIAL,DATE_ITIME) +C Input + INTEGER INITIAL,DATE_ITIME(8) + + IF(INITIAL.NE.0) THEN + CALL setall(DATE_ITIME(7),DATE_ITIME(8)) + ELSE + CALL setall(12345,54321) + ENDIF + RETURN END diff --git a/innov.for b/innov.for index 9c295399f2d9ad737fb9f3896846ab04561587a1..a8879cc351f67d9949065f0d471671a125579c8a 100644 --- a/innov.for +++ b/innov.for @@ -1,30 +1,30 @@ -C -------------------------------------------------------------------- -C INNOV RETURNS MODEL INNOVATIONS -C Developed by A.Rossi, C.Planas and G.Fiorentini -C -C State-space format: y(t) = c(t)z(t) + H(t)x(t) + G(t)u(t) -C x(t) = a(t) + F(t)x(t-1) + R(t)u(t) -C -C y(t) (ny x 1) ny = # of endogenous series -C z(t) (nz x 1) nz = # of exogenous series -C x(t) (nx x 1) nx = # of continous states -C u(t) (nu x 1) nu = # of shocks -C c(t) (ny x nz x ns1) ns1 = # of states for c(t) -C H(t) (ny x nx x ns2) ns2 = # of states for S2(t) -C G(t) (ny x nu x ns3) ns3 = # of states for S3(t) -C a(t) (nx x ns4) ns4 = # of states for S4(t) -C F(t) (nx x nx x ns5) ns5 = # of states for S5(t) -C R(t) (nx x nu x ns6) ns6 = # of states for S6(t) -C -C d(1): order of integration of the system -C d(2): number of non-stationary elements -C -C Copyright (C) 2010-2014 European Commission -C +C -------------------------------------------------------------------- +C INNOV RETURNS MODEL INNOVATIONS +C Developed by A.Rossi, C.Planas and G.Fiorentini +C +C State-space format: y(t) = c(t)z(t) + H(t)x(t) + G(t)u(t) +C x(t) = a(t) + F(t)x(t-1) + R(t)u(t) +C +C y(t) (ny x 1) ny = # of endogenous series +C z(t) (nz x 1) nz = # of exogenous series +C x(t) (nx x 1) nx = # of continous states +C u(t) (nu x 1) nu = # of shocks +C c(t) (ny x nz x ns1) ns1 = # of states for c(t) +C H(t) (ny x nx x ns2) ns2 = # of states for S2(t) +C G(t) (ny x nu x ns3) ns3 = # of states for S3(t) +C a(t) (nx x ns4) ns4 = # of states for S4(t) +C F(t) (nx x nx x ns5) ns5 = # of states for S5(t) +C R(t) (nx x nu x ns6) ns6 = # of states for S6(t) +C +C d(1): order of integration of the system +C d(2): number of non-stationary elements +C +C Copyright (C) 2010-2014 European Commission +C C This file is part of Program DMM C -C DMM is free software developed at the Joint Research Centre of the -C European Commission: you can redistribute it and/or modify it under +C DMM is free software developed at the Joint Research Centre of the +C European Commission: you can redistribute it and/or modify it under C the terms of the GNU General Public License as published by C the Free Software Foundation, either version 3 of the License, or C (at your option) any later version. @@ -35,161 +35,161 @@ C MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the C GNU General Public License for more details. C C You should have received a copy of the GNU General Public License -C along with DMM. If not, see <http://www.gnu.org/licenses/>. -C -------------------------------------------------------------------- - SUBROUTINE INNOV(nobs,d,ny,nz,nx,nu,ns,nt,S,yk,IYK, - 1 theta,pdll,INN) - - USE dfwin - INTERFACE - SUBROUTINE DESIGN(ny,nz,nx,nu,ns,nt,theta,c,H,G,a,F,R) - INTEGER ny,nz,nx,nu,ns(6),nt - DOUBLE PRECISION theta(nt) - DOUBLE PRECISION c(ny,max(1,nz),ns(1)),H(ny,nx,ns(2)), - 1 G(ny,nu,ns(3)),a(nx,ns(4)),F(nx,nx,ns(5)),R(nx,nu,ns(6)) - END SUBROUTINE - END INTERFACE - POINTER (pdll,fittizia) ! ASSOCIATE pointer P alla DLL ad una varibile fittizia - POINTER (pdesign,DESIGN) - -C INPUT - INTEGER nobs,d(2),ny,nz,nx,nu,nt - INTEGER ns(6),IYK(nobs,ny+1),S(nobs,6) - DOUBLE PRECISION yk(nobs,ny+nz),theta(nt) - -C OUTPUT - DOUBLE PRECISION INN(nobs,ny) - -C LOCALS - INTEGER imain,iny,I,J,IFAIL - DOUBLE PRECISION,ALLOCATABLE::R(:,:,:),c(:,:,:),H(:,:,:), - 1 G(:,:,:),a(:,:),F(:,:,:) - DOUBLE PRECISION,ALLOCATABLE:: X1(:),P1(:,:),FP(:,:),HP1(:,:), - 1 V(:,:),Vinv(:,:),COM(:,:),RG(:,:),HPV(:,:),Xdd(:,:),Pdd(:,:,:), - 1 LIKE(:),XT(:),PT(:,:),INN0(:) - - ALLOCATE(c(ny,max(nz,1),ns(1)),H(ny,nx,ns(2)), - 1 G(ny,nu,ns(3)),a(nx,ns(4)),F(nx,nx,ns(5)),R(nx,nu,ns(6))) - ALLOCATE(X1(nx),P1(nx,nx),FP(nx,nx),HP1(ny,nx),V(ny,ny), - 1 Vinv(ny,ny),COM(ny+1,ny),RG(nx,ny),HPV(nx,ny), - 1 Xdd(max(d(1),1),nx),Pdd(max(d(1),1),nx,nx),LIKE(max(d(1),1)), - 1 XT(nx),PT(nx,nx),INN0(ny)) - - pdesign = getprocaddress(pdll, "design_"C) - INN(:,:) = 0.D0 - CALL DESIGN(ny,nz,nx,nu,ns,nt,theta,c,H,G,a,F,R) - CALL IKF(d,ny,nz,nx,nu,ns,S(1:max(d(1),1),1:6), - 1 yk(1:max(d(1),1),1:ny+nz),IYK(1:max(d(1),1),1:ny+1),c,H,G,a,F,R, - 2 Xdd,Pdd,LIKE(1:max(d(1),1))) - XT(1:nx) = Xdd(max(d(1),1),1:nx) - PT(1:nx,1:nx) = Pdd(max(d(1),1),1:nx,1:nx) - - DO 1000 imain = d(1)+1,nobs - iny = IYK(imain,ny+1) - -C ------------------------------------ -C Prediction x1 = c+F*x0 -C Prediction var. P1 = F*p0*F'+ R*R' -C ------------------------------------ - DO 10 I=1,nx -10 X1(I) = a(I,S(imain,4))+SUM(F(I,:,S(imain,5))*XT(:)) - - DO 20 I=1,nx - DO 20 J=1,nx -20 FP(I,J) = SUM(F(I,:,S(imain,5))*PT(:,J)) - - DO 30 I=1,nx - P1(I,I) = SUM(FP(I,:)*F(I,:,S(imain,5))) - + + SUM(R(I,1:nu,S(imain,6))*R(I,1:nu,S(imain,6))) - DO 30 J=1,I-1 - P1(I,J) = SUM(FP(I,:)*F(J,:,S(imain,5))) - + + SUM(R(I,1:nu,S(imain,6))*R(J,1:nu,S(imain,6))) -30 P1(J,I) = P1(I,J) - -C ------------------------------- -C Innovations: INN = yk-H*X1-c*z -C ------------------------------- - DO 40 I=1,iny -40 INN(imain,I) = yk(imain,IYK(imain,I)) - + - SUM(H(IYK(imain,I),1:nx,S(imain,2))*X1(1:nx)) - + - SUM(c(IYK(imain,I),1:nz,S(imain,1))*yk(imain,ny+1:ny+nz)) - - -C ---------------------------------------------------------- -C Innovation variance V = H*P1*H' + G*G' + H*R*G' + G*R'*H' -C ---------------------------------------------------------- - DO 50 I=1,iny - DO 50 J=1,nx -50 HP1(I,J) = SUM(H(IYK(imain,I),1:nx,S(imain,2))*P1(1:nx,J)) - - DO 55 I=1,nx - DO 55 J=1,iny -55 RG(I,J) = SUM(R(I,1:nu,S(imain,6)) - # * G(IYK(imain,J),1:nu,S(imain,3))) ! R*G' - - DO 56 I=1,iny - DO 56 J=1,iny -56 COM(I,J)=SUM(H(IYK(imain,I),1:nx,S(imain,2))*RG(1:nx,J)) ! H*R*G' - - DO 60 I=1,iny - V(I,I) = SUM(HP1(I,1:nx)*H(IYK(imain,I),1:nx,S(imain,2))) + - # SUM(G(IYK(imain,I),1:nu,S(imain,3))* - # G(IYK(imain,I),1:nu,S(imain,3)))+2.*COM(I,I) - DO 60 J=1,I-1 - V(I,J) = SUM(HP1(I,1:nx)*H(IYK(imain,J),1:nx,S(imain,2)))+ - # SUM(G(IYK(imain,I),1:nu,S(imain,3))* - # G(IYK(imain,J),1:nu,S(imain,3)))+COM(I,J)+COM(J,I) -60 V(J,I) = V(I,J) - -C ------------------------------------------------------------------- -C Updating equations: -C x0 = x1 + (P1*H'+R*G')*Vinv*INN -C p0 = p1 - (P1*H'+R*G')*Vinv*(P1*H'+R*G')' -C ------------------------------------------------------------------- - IF (iny.GT.0) THEN - COM(1:iny,1:iny) = V(1:iny,1:iny) - IFAIL = -1 -c CALL F01ADF(iny,COM(1:iny+1,1:iny),iny+1,IFAIL) - CALL DPOTRF('L',iny,COM(1:iny,1:iny),iny,IFAIL) ! COM = L*L' - CALL DPOTRI('L',iny,COM(1:iny,1:iny),iny,IFAIL) ! COM = VV^-1 - - DO 70 I=1,iny - Vinv(I,I) = COM(I,I) - DO 70 J=1,I-1 - Vinv(I,J) = COM(I,J) -70 Vinv(J,I) = Vinv(I,J) - - DO 90 I=1,nx - DO 90 J=1,iny -90 HPV(I,J) = SUM((HP1(1:iny,I)+RG(I,1:iny))*Vinv(1:iny,J)) - - DO 100 I=1,nx -100 XT(I) = X1(I)+SUM(HPV(I,1:iny)*INN(imain,1:iny)) - - DO 110 I=1,nx - PT(I,I) = P1(I,I) - + - SUM(HPV(I,1:iny)*(HP1(1:iny,I)+RG(I,1:iny))) - DO 110 J=1,I-1 - PT(I,J) = P1(I,J) - + - SUM(HPV(I,1:iny)*(HP1(1:iny,J)+RG(J,1:iny))) -110 PT(J,I) = PT(I,J) - - ELSE - - XT(1:nx) = X1(1:nx) - PT(1:nx,1:nx) = P1(1:nx,1:nx) - -1000 ENDIF - -C Put Innovations in the rigth place - DO I = 1,nobs - iny = IYK(I,ny+1) - INN0(1:ny) = 0.D0 - INN0(IYK(I,1:iny)) = INN(I,1:iny) - INN(I,1:ny) = INN0(1:ny) - ENDDO - - DEALLOCATE(R,c,H,G,a,F,X1,P1,FP,HP1,V,Vinv,COM,RG,HPV,Xdd,Pdd, - 1 LIKE,XT,PT,INN0) - RETURN +C along with DMM. If not, see <http://www.gnu.org/licenses/>. +C -------------------------------------------------------------------- + SUBROUTINE INNOV(nobs,d,ny,nz,nx,nu,ns,nt,S,yk,IYK, + 1 theta,pdll,INN) + + USE dfwin + INTERFACE + SUBROUTINE DESIGN(ny,nz,nx,nu,ns,nt,theta,c,H,G,a,F,R) + INTEGER ny,nz,nx,nu,ns(6),nt + DOUBLE PRECISION theta(nt) + DOUBLE PRECISION c(ny,max(1,nz),ns(1)),H(ny,nx,ns(2)), + 1 G(ny,nu,ns(3)),a(nx,ns(4)),F(nx,nx,ns(5)),R(nx,nu,ns(6)) + END SUBROUTINE + END INTERFACE + POINTER (pdll,fittizia) ! ASSOCIATE pointer P alla DLL ad una varibile fittizia + POINTER (pdesign,DESIGN) + +C INPUT + INTEGER nobs,d(2),ny,nz,nx,nu,nt + INTEGER ns(6),IYK(nobs,ny+1),S(nobs,6) + DOUBLE PRECISION yk(nobs,ny+nz),theta(nt) + +C OUTPUT + DOUBLE PRECISION INN(nobs,ny) + +C LOCALS + INTEGER imain,iny,I,J,IFAIL + DOUBLE PRECISION,ALLOCATABLE::R(:,:,:),c(:,:,:),H(:,:,:), + 1 G(:,:,:),a(:,:),F(:,:,:) + DOUBLE PRECISION,ALLOCATABLE:: X1(:),P1(:,:),FP(:,:),HP1(:,:), + 1 V(:,:),Vinv(:,:),COM(:,:),RG(:,:),HPV(:,:),Xdd(:,:),Pdd(:,:,:), + 1 LIKE(:),XT(:),PT(:,:),INN0(:) + + ALLOCATE(c(ny,max(nz,1),ns(1)),H(ny,nx,ns(2)), + 1 G(ny,nu,ns(3)),a(nx,ns(4)),F(nx,nx,ns(5)),R(nx,nu,ns(6))) + ALLOCATE(X1(nx),P1(nx,nx),FP(nx,nx),HP1(ny,nx),V(ny,ny), + 1 Vinv(ny,ny),COM(ny+1,ny),RG(nx,ny),HPV(nx,ny), + 1 Xdd(max(d(1),1),nx),Pdd(max(d(1),1),nx,nx),LIKE(max(d(1),1)), + 1 XT(nx),PT(nx,nx),INN0(ny)) + + pdesign = getprocaddress(pdll, "design_"C) + INN(:,:) = 0.D0 + CALL DESIGN(ny,nz,nx,nu,ns,nt,theta,c,H,G,a,F,R) + CALL IKF(d,ny,nz,nx,nu,ns,S(1:max(d(1),1),1:6), + 1 yk(1:max(d(1),1),1:ny+nz),IYK(1:max(d(1),1),1:ny+1),c,H,G,a,F,R, + 2 Xdd,Pdd,LIKE(1:max(d(1),1))) + XT(1:nx) = Xdd(max(d(1),1),1:nx) + PT(1:nx,1:nx) = Pdd(max(d(1),1),1:nx,1:nx) + + DO 1000 imain = d(1)+1,nobs + iny = IYK(imain,ny+1) + +C ------------------------------------ +C Prediction x1 = c+F*x0 +C Prediction var. P1 = F*p0*F'+ R*R' +C ------------------------------------ + DO 10 I=1,nx +10 X1(I) = a(I,S(imain,4))+SUM(F(I,:,S(imain,5))*XT(:)) + + DO 20 I=1,nx + DO 20 J=1,nx +20 FP(I,J) = SUM(F(I,:,S(imain,5))*PT(:,J)) + + DO 30 I=1,nx + P1(I,I) = SUM(FP(I,:)*F(I,:,S(imain,5))) + + + SUM(R(I,1:nu,S(imain,6))*R(I,1:nu,S(imain,6))) + DO 30 J=1,I-1 + P1(I,J) = SUM(FP(I,:)*F(J,:,S(imain,5))) + + + SUM(R(I,1:nu,S(imain,6))*R(J,1:nu,S(imain,6))) +30 P1(J,I) = P1(I,J) + +C ------------------------------- +C Innovations: INN = yk-H*X1-c*z +C ------------------------------- + DO 40 I=1,iny +40 INN(imain,I) = yk(imain,IYK(imain,I)) + + - SUM(H(IYK(imain,I),1:nx,S(imain,2))*X1(1:nx)) + + - SUM(c(IYK(imain,I),1:nz,S(imain,1))*yk(imain,ny+1:ny+nz)) + + +C ---------------------------------------------------------- +C Innovation variance V = H*P1*H' + G*G' + H*R*G' + G*R'*H' +C ---------------------------------------------------------- + DO 50 I=1,iny + DO 50 J=1,nx +50 HP1(I,J) = SUM(H(IYK(imain,I),1:nx,S(imain,2))*P1(1:nx,J)) + + DO 55 I=1,nx + DO 55 J=1,iny +55 RG(I,J) = SUM(R(I,1:nu,S(imain,6)) + # * G(IYK(imain,J),1:nu,S(imain,3))) ! R*G' + + DO 56 I=1,iny + DO 56 J=1,iny +56 COM(I,J)=SUM(H(IYK(imain,I),1:nx,S(imain,2))*RG(1:nx,J)) ! H*R*G' + + DO 60 I=1,iny + V(I,I) = SUM(HP1(I,1:nx)*H(IYK(imain,I),1:nx,S(imain,2))) + + # SUM(G(IYK(imain,I),1:nu,S(imain,3))* + # G(IYK(imain,I),1:nu,S(imain,3)))+2.*COM(I,I) + DO 60 J=1,I-1 + V(I,J) = SUM(HP1(I,1:nx)*H(IYK(imain,J),1:nx,S(imain,2)))+ + # SUM(G(IYK(imain,I),1:nu,S(imain,3))* + # G(IYK(imain,J),1:nu,S(imain,3)))+COM(I,J)+COM(J,I) +60 V(J,I) = V(I,J) + +C ------------------------------------------------------------------- +C Updating equations: +C x0 = x1 + (P1*H'+R*G')*Vinv*INN +C p0 = p1 - (P1*H'+R*G')*Vinv*(P1*H'+R*G')' +C ------------------------------------------------------------------- + IF (iny.GT.0) THEN + COM(1:iny,1:iny) = V(1:iny,1:iny) + IFAIL = -1 +c CALL F01ADF(iny,COM(1:iny+1,1:iny),iny+1,IFAIL) + CALL DPOTRF('L',iny,COM(1:iny,1:iny),iny,IFAIL) ! COM = L*L' + CALL DPOTRI('L',iny,COM(1:iny,1:iny),iny,IFAIL) ! COM = VV^-1 + + DO 70 I=1,iny + Vinv(I,I) = COM(I,I) + DO 70 J=1,I-1 + Vinv(I,J) = COM(I,J) +70 Vinv(J,I) = Vinv(I,J) + + DO 90 I=1,nx + DO 90 J=1,iny +90 HPV(I,J) = SUM((HP1(1:iny,I)+RG(I,1:iny))*Vinv(1:iny,J)) + + DO 100 I=1,nx +100 XT(I) = X1(I)+SUM(HPV(I,1:iny)*INN(imain,1:iny)) + + DO 110 I=1,nx + PT(I,I) = P1(I,I) + + - SUM(HPV(I,1:iny)*(HP1(1:iny,I)+RG(I,1:iny))) + DO 110 J=1,I-1 + PT(I,J) = P1(I,J) + + - SUM(HPV(I,1:iny)*(HP1(1:iny,J)+RG(J,1:iny))) +110 PT(J,I) = PT(I,J) + + ELSE + + XT(1:nx) = X1(1:nx) + PT(1:nx,1:nx) = P1(1:nx,1:nx) + +1000 ENDIF + +C Put Innovations in the rigth place + DO I = 1,nobs + iny = IYK(I,ny+1) + INN0(1:ny) = 0.D0 + INN0(IYK(I,1:iny)) = INN(I,1:iny) + INN(I,1:ny) = INN0(1:ny) + ENDDO + + DEALLOCATE(R,c,H,G,a,F,X1,P1,FP,HP1,V,Vinv,COM,RG,HPV,Xdd,Pdd, + 1 LIKE,XT,PT,INN0) + RETURN END diff --git a/innov2.for b/innov2.for index a45117aea94de4f522452aa195b5264be48fa8b3..dc5582e796ca4ca52ff55d06727464672fd843bf 100644 --- a/innov2.for +++ b/innov2.for @@ -1,30 +1,30 @@ -C -------------------------------------------------------------------- -C INNOV2 (no mising values) RETURNS MODEL INNOVATIONS -C Developed by A.Rossi, C.Planas and G.Fiorentini -C -C State-space format: y(t) = c(t)z(t) + H(t)x(t) + G(t)u(t) -C x(t) = a(t) + F(t)x(t-1) + R(t)u(t) -C -C y(t) (ny x 1) ny = # of endogenous series -C z(t) (nz x 1) nz = # of exogenous series -C x(t) (nx x 1) nx = # of continous states -C u(t) (nu x 1) nu = # of shocks -C c(t) (ny x nz x ns1) ns1 = # of states for c(t) -C H(t) (ny x nx x ns2) ns2 = # of states for S2(t) -C G(t) (ny x nu x ns3) ns3 = # of states for S3(t) -C a(t) (nx x ns4) ns4 = # of states for S4(t) -C F(t) (nx x nx x ns5) ns5 = # of states for S5(t) -C R(t) (nx x nu x ns6) ns6 = # of states for S6(t) -C -C d(1): order of integration of the system -C d(2): number of non-stationary elements -C -C Copyright (C) 2010-2014 European Commission -C +C -------------------------------------------------------------------- +C INNOV2 (no mising values) RETURNS MODEL INNOVATIONS +C Developed by A.Rossi, C.Planas and G.Fiorentini +C +C State-space format: y(t) = c(t)z(t) + H(t)x(t) + G(t)u(t) +C x(t) = a(t) + F(t)x(t-1) + R(t)u(t) +C +C y(t) (ny x 1) ny = # of endogenous series +C z(t) (nz x 1) nz = # of exogenous series +C x(t) (nx x 1) nx = # of continous states +C u(t) (nu x 1) nu = # of shocks +C c(t) (ny x nz x ns1) ns1 = # of states for c(t) +C H(t) (ny x nx x ns2) ns2 = # of states for S2(t) +C G(t) (ny x nu x ns3) ns3 = # of states for S3(t) +C a(t) (nx x ns4) ns4 = # of states for S4(t) +C F(t) (nx x nx x ns5) ns5 = # of states for S5(t) +C R(t) (nx x nu x ns6) ns6 = # of states for S6(t) +C +C d(1): order of integration of the system +C d(2): number of non-stationary elements +C +C Copyright (C) 2010-2014 European Commission +C C This file is part of Program DMM C -C DMM is free software developed at the Joint Research Centre of the -C European Commission: you can redistribute it and/or modify it under +C DMM is free software developed at the Joint Research Centre of the +C European Commission: you can redistribute it and/or modify it under C the terms of the GNU General Public License as published by C the Free Software Foundation, either version 3 of the License, or C (at your option) any later version. @@ -35,150 +35,150 @@ C MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the C GNU General Public License for more details. C C You should have received a copy of the GNU General Public License -C along with DMM. If not, see <http://www.gnu.org/licenses/>. -C -------------------------------------------------------------------- - SUBROUTINE INNOV2(nobs,d,ny,nz,nx,nu,ns,nt,S,yk, - 1 theta,pdll,INN) - - USE dfwin - INTERFACE - SUBROUTINE DESIGN(ny,nz,nx,nu,ns,nt,theta,c,H,G,a,F,R) - INTEGER ny,nz,nx,nu,ns(6),nt - DOUBLE PRECISION theta(nt) - DOUBLE PRECISION c(ny,max(1,nz),ns(1)),H(ny,nx,ns(2)), - 1 G(ny,nu,ns(3)),a(nx,ns(4)),F(nx,nx,ns(5)),R(nx,nu,ns(6)) - END SUBROUTINE - END INTERFACE - POINTER (pdll,fittizia) ! ASSOCIATE pointer P alla DLL ad una varibile fittizia - POINTER (pdesign,DESIGN) ! IMPORTANT associo il puntatore pdesign alla Interface definita - -C INPUT - INTEGER nobs,d(2),ny,nz,nx,nu,nt,ns(6),S(nobs,6) - DOUBLE PRECISION yk(nobs,ny+nz),theta(nt) - -C OUTPUT - DOUBLE PRECISION INN(nobs,ny) - -C LOCALS - INTEGER imain,I,J,IFAIL - DOUBLE PRECISION,ALLOCATABLE::R(:,:,:),c(:,:,:),H(:,:,:), - 1 G(:,:,:),a(:,:),F(:,:,:) - DOUBLE PRECISION,ALLOCATABLE:: X1(:),P1(:,:),FP(:,:),HP1(:,:), - 1 V(:,:),Vinv(:,:),COM(:,:),RG(:,:),HPV(:,:),Xdd(:,:),Pdd(:,:,:), - 1 LIKE(:),XT(:),PT(:,:) - - ALLOCATE(c(ny,max(nz,1),ns(1)),H(ny,nx,ns(2)), - 1 G(ny,nu,ns(3)),a(nx,ns(4)),F(nx,nx,ns(5)),R(nx,nu,ns(6))) - ALLOCATE(X1(nx),P1(nx,nx),FP(nx,nx),HP1(ny,nx),V(ny,ny), - 1 Vinv(ny,ny),COM(ny+1,ny),RG(nx,ny),HPV(nx,ny), - 1 Xdd(max(d(1),1),nx),Pdd(max(d(1),1),nx,nx),LIKE(max(d(1),1)), - 1 XT(nx),PT(nx,nx)) - - pdesign = getprocaddress(pdll, "design_"C) - INN(:,:) = 0.D0 - CALL DESIGN(ny,nz,nx,nu,ns,nt,theta,c,H,G,a,F,R) - CALL IKF2(d,ny,nz,nx,nu,ns,S(1:max(d(1),1),1:6), - 1 yk(1:max(d(1),1),1:ny+nz),c,H,G,a,F,R, - 2 Xdd,Pdd,LIKE(1:max(d(1),1))) - XT(1:nx) = Xdd(max(d(1),1),1:nx) - PT(1:nx,1:nx) = Pdd(max(d(1),1),1:nx,1:nx) - - DO 1000 imain = d(1)+1,nobs - -C ------------------------------------ -C Prediction x1 = c+F*x0 -C Prediction var. P1 = F*p0*F'+ R*R' -C ------------------------------------ - DO 10 I=1,nx -10 X1(I) = a(I,S(imain,4))+SUM(F(I,:,S(imain,5))*XT(:)) - - DO 20 I=1,nx - DO 20 J=1,nx -20 FP(I,J) = SUM(F(I,:,S(imain,5))*PT(:,J)) - - DO 30 I=1,nx - P1(I,I) = SUM(FP(I,:)*F(I,:,S(imain,5))) - + + SUM(R(I,1:nu,S(imain,6))*R(I,1:nu,S(imain,6))) - DO 30 J=1,I-1 - P1(I,J) = SUM(FP(I,:)*F(J,:,S(imain,5))) - + + SUM(R(I,1:nu,S(imain,6))*R(J,1:nu,S(imain,6))) -30 P1(J,I) = P1(I,J) - -C ------------------------------- -C Innovations: INN = yk-H*X1-c*z -C ------------------------------- - DO 40 I=1,ny -40 INN(imain,I) = yk(imain,I) - + - SUM(H(I,1:nx,S(imain,2))*X1(1:nx)) - + - SUM(c(I,1:nz,S(imain,1))*yk(imain,ny+1:ny+nz)) - -C ---------------------------------------------------------- -C Innovation variance V = H*P1*H' + G*G' + H*R*G' + G*R'*H' -C ---------------------------------------------------------- - DO 50 I=1,ny - DO 50 J=1,nx -50 HP1(I,J) = SUM(H(I,1:nx,S(imain,2))*P1(1:nx,J)) - - DO 55 I=1,nx - DO 55 J=1,ny -55 RG(I,J) = SUM(R(I,1:nu,S(imain,6)) - # * G(J,1:nu,S(imain,3))) ! R*G' - - DO 56 I=1,ny - DO 56 J=1,ny -56 COM(I,J)=SUM(H(I,1:nx,S(imain,2))*RG(1:nx,J)) ! H*R*G' - - DO 60 I=1,ny - V(I,I) = SUM(HP1(I,1:nx)*H(I,1:nx,S(imain,2))) + - # SUM(G(I,1:nu,S(imain,3))* - # G(I,1:nu,S(imain,3)))+2.*COM(I,I) - DO 60 J=1,I-1 - V(I,J) = SUM(HP1(I,1:nx)*H(J,1:nx,S(imain,2)))+ - # SUM(G(I,1:nu,S(imain,3))* - # G(J,1:nu,S(imain,3)))+COM(I,J)+COM(J,I) -60 V(J,I) = V(I,J) - -C ------------------------------------------------------------------- -C Updating equations: -C x0 = x1 + (P1*H'+R*G')*Vinv*INN -C p0 = p1 - (P1*H'+R*G')*Vinv*(P1*H'+R*G')' -C ------------------------------------------------------------------- - IF (ny.GT.0) THEN - COM(1:ny,1:ny) = V(1:ny,1:ny) - IFAIL = -1 -c CALL F01ADF(ny,COM(1:ny+1,1:ny),ny+1,IFAIL) - CALL DPOTRF('L',ny,COM(1:ny,1:ny),ny,IFAIL) ! COM = L*L' - CALL DPOTRI('L',ny,COM(1:ny,1:ny),ny,IFAIL) ! COM = VV^-1 - - DO 70 I=1,ny - Vinv(I,I) = COM(I,I) - DO 70 J=1,I-1 - Vinv(I,J) = COM(I,J) -70 Vinv(J,I) = Vinv(I,J) - - DO 90 I=1,nx - DO 90 J=1,ny -90 HPV(I,J) = SUM((HP1(1:ny,I)+RG(I,1:ny))*Vinv(1:ny,J)) - - DO 100 I=1,nx -100 XT(I) = X1(I)+SUM(HPV(I,1:ny)*INN(imain,1:ny)) - - DO 110 I=1,nx - PT(I,I) = P1(I,I) - + - SUM(HPV(I,1:ny)*(HP1(1:ny,I)+RG(I,1:ny))) - DO 110 J=1,I-1 - PT(I,J) = P1(I,J) - + - SUM(HPV(I,1:ny)*(HP1(1:ny,J)+RG(J,1:ny))) -110 PT(J,I) = PT(I,J) - - ELSE - - XT(1:nx) = X1(1:nx) - PT(1:nx,1:nx) = P1(1:nx,1:nx) - -1000 ENDIF - - DEALLOCATE(R,c,H,G,a,F,X1,P1,FP,HP1,V,Vinv,COM,RG,HPV,Xdd,Pdd, - 1 LIKE,XT,PT) - RETURN +C along with DMM. If not, see <http://www.gnu.org/licenses/>. +C -------------------------------------------------------------------- + SUBROUTINE INNOV2(nobs,d,ny,nz,nx,nu,ns,nt,S,yk, + 1 theta,pdll,INN) + + USE dfwin + INTERFACE + SUBROUTINE DESIGN(ny,nz,nx,nu,ns,nt,theta,c,H,G,a,F,R) + INTEGER ny,nz,nx,nu,ns(6),nt + DOUBLE PRECISION theta(nt) + DOUBLE PRECISION c(ny,max(1,nz),ns(1)),H(ny,nx,ns(2)), + 1 G(ny,nu,ns(3)),a(nx,ns(4)),F(nx,nx,ns(5)),R(nx,nu,ns(6)) + END SUBROUTINE + END INTERFACE + POINTER (pdll,fittizia) ! ASSOCIATE pointer P alla DLL ad una varibile fittizia + POINTER (pdesign,DESIGN) ! IMPORTANT associo il puntatore pdesign alla Interface definita + +C INPUT + INTEGER nobs,d(2),ny,nz,nx,nu,nt,ns(6),S(nobs,6) + DOUBLE PRECISION yk(nobs,ny+nz),theta(nt) + +C OUTPUT + DOUBLE PRECISION INN(nobs,ny) + +C LOCALS + INTEGER imain,I,J,IFAIL + DOUBLE PRECISION,ALLOCATABLE::R(:,:,:),c(:,:,:),H(:,:,:), + 1 G(:,:,:),a(:,:),F(:,:,:) + DOUBLE PRECISION,ALLOCATABLE:: X1(:),P1(:,:),FP(:,:),HP1(:,:), + 1 V(:,:),Vinv(:,:),COM(:,:),RG(:,:),HPV(:,:),Xdd(:,:),Pdd(:,:,:), + 1 LIKE(:),XT(:),PT(:,:) + + ALLOCATE(c(ny,max(nz,1),ns(1)),H(ny,nx,ns(2)), + 1 G(ny,nu,ns(3)),a(nx,ns(4)),F(nx,nx,ns(5)),R(nx,nu,ns(6))) + ALLOCATE(X1(nx),P1(nx,nx),FP(nx,nx),HP1(ny,nx),V(ny,ny), + 1 Vinv(ny,ny),COM(ny+1,ny),RG(nx,ny),HPV(nx,ny), + 1 Xdd(max(d(1),1),nx),Pdd(max(d(1),1),nx,nx),LIKE(max(d(1),1)), + 1 XT(nx),PT(nx,nx)) + + pdesign = getprocaddress(pdll, "design_"C) + INN(:,:) = 0.D0 + CALL DESIGN(ny,nz,nx,nu,ns,nt,theta,c,H,G,a,F,R) + CALL IKF2(d,ny,nz,nx,nu,ns,S(1:max(d(1),1),1:6), + 1 yk(1:max(d(1),1),1:ny+nz),c,H,G,a,F,R, + 2 Xdd,Pdd,LIKE(1:max(d(1),1))) + XT(1:nx) = Xdd(max(d(1),1),1:nx) + PT(1:nx,1:nx) = Pdd(max(d(1),1),1:nx,1:nx) + + DO 1000 imain = d(1)+1,nobs + +C ------------------------------------ +C Prediction x1 = c+F*x0 +C Prediction var. P1 = F*p0*F'+ R*R' +C ------------------------------------ + DO 10 I=1,nx +10 X1(I) = a(I,S(imain,4))+SUM(F(I,:,S(imain,5))*XT(:)) + + DO 20 I=1,nx + DO 20 J=1,nx +20 FP(I,J) = SUM(F(I,:,S(imain,5))*PT(:,J)) + + DO 30 I=1,nx + P1(I,I) = SUM(FP(I,:)*F(I,:,S(imain,5))) + + + SUM(R(I,1:nu,S(imain,6))*R(I,1:nu,S(imain,6))) + DO 30 J=1,I-1 + P1(I,J) = SUM(FP(I,:)*F(J,:,S(imain,5))) + + + SUM(R(I,1:nu,S(imain,6))*R(J,1:nu,S(imain,6))) +30 P1(J,I) = P1(I,J) + +C ------------------------------- +C Innovations: INN = yk-H*X1-c*z +C ------------------------------- + DO 40 I=1,ny +40 INN(imain,I) = yk(imain,I) + + - SUM(H(I,1:nx,S(imain,2))*X1(1:nx)) + + - SUM(c(I,1:nz,S(imain,1))*yk(imain,ny+1:ny+nz)) + +C ---------------------------------------------------------- +C Innovation variance V = H*P1*H' + G*G' + H*R*G' + G*R'*H' +C ---------------------------------------------------------- + DO 50 I=1,ny + DO 50 J=1,nx +50 HP1(I,J) = SUM(H(I,1:nx,S(imain,2))*P1(1:nx,J)) + + DO 55 I=1,nx + DO 55 J=1,ny +55 RG(I,J) = SUM(R(I,1:nu,S(imain,6)) + # * G(J,1:nu,S(imain,3))) ! R*G' + + DO 56 I=1,ny + DO 56 J=1,ny +56 COM(I,J)=SUM(H(I,1:nx,S(imain,2))*RG(1:nx,J)) ! H*R*G' + + DO 60 I=1,ny + V(I,I) = SUM(HP1(I,1:nx)*H(I,1:nx,S(imain,2))) + + # SUM(G(I,1:nu,S(imain,3))* + # G(I,1:nu,S(imain,3)))+2.*COM(I,I) + DO 60 J=1,I-1 + V(I,J) = SUM(HP1(I,1:nx)*H(J,1:nx,S(imain,2)))+ + # SUM(G(I,1:nu,S(imain,3))* + # G(J,1:nu,S(imain,3)))+COM(I,J)+COM(J,I) +60 V(J,I) = V(I,J) + +C ------------------------------------------------------------------- +C Updating equations: +C x0 = x1 + (P1*H'+R*G')*Vinv*INN +C p0 = p1 - (P1*H'+R*G')*Vinv*(P1*H'+R*G')' +C ------------------------------------------------------------------- + IF (ny.GT.0) THEN + COM(1:ny,1:ny) = V(1:ny,1:ny) + IFAIL = -1 +c CALL F01ADF(ny,COM(1:ny+1,1:ny),ny+1,IFAIL) + CALL DPOTRF('L',ny,COM(1:ny,1:ny),ny,IFAIL) ! COM = L*L' + CALL DPOTRI('L',ny,COM(1:ny,1:ny),ny,IFAIL) ! COM = VV^-1 + + DO 70 I=1,ny + Vinv(I,I) = COM(I,I) + DO 70 J=1,I-1 + Vinv(I,J) = COM(I,J) +70 Vinv(J,I) = Vinv(I,J) + + DO 90 I=1,nx + DO 90 J=1,ny +90 HPV(I,J) = SUM((HP1(1:ny,I)+RG(I,1:ny))*Vinv(1:ny,J)) + + DO 100 I=1,nx +100 XT(I) = X1(I)+SUM(HPV(I,1:ny)*INN(imain,1:ny)) + + DO 110 I=1,nx + PT(I,I) = P1(I,I) + + - SUM(HPV(I,1:ny)*(HP1(1:ny,I)+RG(I,1:ny))) + DO 110 J=1,I-1 + PT(I,J) = P1(I,J) + + - SUM(HPV(I,1:ny)*(HP1(1:ny,J)+RG(J,1:ny))) +110 PT(J,I) = PT(I,J) + + ELSE + + XT(1:nx) = X1(1:nx) + PT(1:nx,1:nx) = P1(1:nx,1:nx) + +1000 ENDIF + + DEALLOCATE(R,c,H,G,a,F,X1,P1,FP,HP1,V,Vinv,COM,RG,HPV,Xdd,Pdd, + 1 LIKE,XT,PT) + RETURN END diff --git a/input.for b/input.for index 3f5f8baa0390d1ccc0165eace909899696a63f69..34dac5768da1e45363b6ce0fc36f094c7c8f30d5 100644 --- a/input.for +++ b/input.for @@ -1,13 +1,13 @@ -C ----------------------------------------------------------------------- -C INPUT reads the input file *.nml -C Developed by A.Rossi, C.Planas and G.Fiorentini -C -C Copyright (C) 2010-2014 European Commission -C +C ----------------------------------------------------------------------- +C INPUT reads the input file *.nml +C Developed by A.Rossi, C.Planas and G.Fiorentini +C +C Copyright (C) 2010-2014 European Commission +C C This file is part of Program DMM C -C DMM is free software developed at the Joint Research Centre of the -C European Commission: you can redistribute it and/or modify it under +C DMM is free software developed at the Joint Research Centre of the +C European Commission: you can redistribute it and/or modify it under C the terms of the GNU General Public License as published by C the Free Software Foundation, either version 3 of the License, or C (at your option) any later version. @@ -18,1014 +18,1014 @@ C MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the C GNU General Public License for more details. C C You should have received a copy of the GNU General Public License -C along with DMM. If not, see <http://www.gnu.org/licenses/>. -C ----------------------------------------------------------------------- - SUBROUTINE input(FILEIN,NMLNAME,PATH,ny,nz,nx,nu,d,nv,ns, - 1 nstot,np,nf,INFOS,seed,thin,burnin,simulrec,sampler, - 2 datasim,dllname,check,estimation,nt,pdftheta,hyptheta, - 3 hypS,T,obs,Ssampler,hbl,MargLik) - -C INCLUDE 'iosdef.for' - INTEGER IERR -C INPUT - CHARACTER*200 FILEIN -C OUTPUT - NAMELIST /ssm/ nx,nu,d,nv,dllname,check,estimation - INTEGER nx,nu,d(2),nv - CHARACTER*200 dllname - CHARACTER*1 check - CHARACTER*2 estimation - - NAMELIST /S1/ dynS1,matS1,ns1,hypS1 - NAMELIST /S2/ dynS2,matS2,ns2,hypS2 - NAMELIST /S3/ dynS3,matS3,ns3,hypS3 - NAMELIST /S4/ dynS4,matS4,ns4,hypS4 - NAMELIST /S5/ dynS5,matS5,ns5,hypS5 - NAMELIST /S6/ dynS6,matS6,ns6,hypS6 - CHARACTER*1 dynS1,dynS2,dynS3,dynS4,dynS5,dynS6, - 1 matS1(6),matS2(6),matS3(6),matS4(6),matS5(6),matS6(6) - INTEGER ns1,ns2,ns3,ns4,ns5,ns6 - DOUBLE PRECISION hypS1(50,50),hypS2(50,50),hypS3(50,50), - 1 hypS4(50,50),hypS5(50,50),hypS6(50,50),hypS(50,50,6) - - NAMELIST /mcmc/ seed,thin,burnin,simulrec,sampler, - 1 Ssampler,hbl,marglik - INTEGER seed,thin,burnin,simulrec,hbl - CHARACTER*1 MargLik - CHARACTER*2 sampler - CHARACTER*3 Ssampler - - NAMELIST /prior/ nt,pdftheta,hyptheta - INTEGER nt - DOUBLE PRECISION hyptheta(4,200) - CHARACTER*2 pdftheta(200) - - NAMELIST /dataset/ T,ny,nz,nf,datasim,obs - INTEGER T,ny,nz,nf - DOUBLE PRECISION obs(30000) - CHARACTER*1 datasim - -C OUTPUT not in the namelist - INTEGER ns(6),INFOS(9,6),IMAX(1),np(3),nstot,IND - CHARACTER*200 NMLNAME,PATH - -C LOCALS - CHARACTER*3 IC - CHARACTER*200 STR - INTEGER I,J,K,IFAIL - INTEGER, ALLOCATABLE:: nstateS(:) - CHARACTER*1, ALLOCATABLE:: matS(:,:),dynS(:) - -C IDENTIFY the PATH and NAME of the .NML INPUT FILE - I = SCAN(FILEIN,'\', BACK = .TRUE.) - IF((I.LE.0).OR.(I.GE.200)) THEN - NMLNAME = FILEIN - PATH = '' - ELSE - NMLNAME = FILEIN(I+1:200) - PATH = FILEIN(1:I) - ENDIF - I = SCAN(NMLNAME,'.', BACK = .TRUE.) - NMLNAME = NMLNAME(1:I-1) - -C FIND namelist ssm - OPEN(1,File=TRIM(FILEIN), ACCESS='SEQUENTIAL', - 1 STATUS='OLD',IOSTAT=IERR, ERR=5000) - IFAIL = -1 - DO WHILE (.NOT.EOF(1)) - READ(1,'(A)') STR - IF (INDEX(STR,'&ssm').GT.0) IFAIL = 0 - ENDDO - CLOSE(1) - IF (IFAIL.EQ.-1) THEN - TYPE *, ' Namelist ssm not found' - TYPE *, ' Program aborting' - PAUSE - RETURN - ENDIF - -C READ namelist ssm - ns1=0 - ns2=0 - ns3=0 - ns4=0 - ns5=0 - ns6=0 - OPEN(1,File=TRIM(FILEIN), ACCESS='SEQUENTIAL') - nx = -1 - nu = -1 - d(:) = -1 - nv = 0 - dllname = '' - check = 'N' - estimation = 'BA' - READ(1,NML=ssm,END=5001,ERR=5001) - IF (nx.LE.0) THEN - TYPE *, ' Check nx in namelist ssm' - TYPE *, ' Program aborting' - PAUSE - STOP - ENDIF - IF(nu.LE.0) THEN - TYPE *, ' Check nu in namelist ssm' - TYPE *, ' Program aborting' - PAUSE - STOP - ENDIF - IF((d(1).LT.0).OR.(d(2).LT.0).OR.(d(2).GT.nx)) THEN - TYPE *, ' Check d in namelist ssm' - TYPE *, ' Program aborting' - PAUSE - STOP - ENDIF - IF((nv.LT.0).OR.(nv.GT.6)) THEN - TYPE *, ' Check nv in namelist ssm' - TYPE *, ' Program aborting' - PAUSE - STOP - ENDIF - IF(dllname.EQ.'') THEN - TYPE *, ' Check dllname in namelist ssm' - TYPE *, ' Program aborting' - PAUSE - STOP - ENDIF - CLOSE(1) - IF ((estimation.NE.'ML').AND.(estimation.NE.'ml').AND. - & (estimation.NE.'Ml').AND.(estimation.NE.'mL').AND. - & (estimation.NE.'BA').AND.(estimation.NE.'ba').AND. - & (estimation.NE.'Ba').AND.(estimation.NE.'bA')) THEN - estimation = 'BA' - ENDIF - - IF (nv.GT.0) THEN -C FIND namelist S1 - OPEN(1,File=TRIM(FILEIN), ACCESS='SEQUENTIAL') - IFAIL = -1 - DO WHILE (.NOT.EOF(1)) - READ(1,'(A)') STR - IF (INDEX(STR,'&S1').GT.0) IFAIL = 0 - ENDDO - CLOSE(1) - IF (IFAIL.EQ.-1) THEN - TYPE *, ' Namelist S1 not found' - TYPE *, ' Program aborting' - PAUSE - RETURN - ENDIF - -C READ namelist S1 - OPEN(1,File=TRIM(FILEIN), ACCESS='SEQUENTIAL') - dynS1 = '-' - ns1 = -1 - hypS1(:,:) = 1 - matS1(:) = '-' - READ(1,NML=S1,END=5002,ERR=5002) - - IF ((dynS1.NE.'I').AND.(dynS1.NE.'M'))THEN - TYPE *, ' Check dynS1 in namelist S1' - TYPE *, ' Program aborting' - PAUSE - STOP - ENDIF - - IF (ns1.LT.2) THEN - TYPE *, ' Check ns1 in namelist S1' - TYPE *, ' Program aborting' - PAUSE - STOP - ENDIF - - IF (dynS1.EQ.'I') THEN - DO J = 1,ns1 - IF (hypS1(J,1).LE.0) THEN - TYPE *, ' Check hypS1 in namelist S1' - TYPE *, ' Program aborting' - PAUSE - STOP - ENDIF - ENDDO - ELSEIF (dynS1.EQ.'M') THEN - DO J = 1,ns1 - DO K = 1,ns1 - IF (hypS1(J,K).LE.0) THEN - TYPE *, ' Check hypS1 in namelist S1' - TYPE *, ' Program aborting' - PAUSE - STOP - ENDIF - ENDDO - ENDDO - ENDIF - - IF ((matS1(1).EQ.'-').OR.((matS1(1).NE.'a') - # .AND.(matS1(1).NE.'H').AND.(matS1(1).NE.'G') - # .AND.(matS1(1).NE.'c').AND.(matS1(1).NE.'F') - # .AND.(matS1(1).NE.'R'))) THEN - TYPE *, ' Check matS1 in namelist S1' - TYPE *, ' Program aborting' - PAUSE - STOP - ENDIF - DO I = 2,6 - IF ((matS1(I).NE.'-').AND.(matS1(I).NE.'a') - # .AND.(matS1(I).NE.'H').AND.(matS1(I).NE.'G') - # .AND.(matS1(I).NE.'c').AND.(matS1(I).NE.'F') - # .AND.(matS1(I).NE.'R')) THEN - TYPE *, ' Check matS1 in namelist S1' - TYPE *, ' Program aborting' - PAUSE - STOP - ENDIF - ENDDO - ENDIF - CLOSE(1) - - IF (nv.GT.1) THEN -C FIND namelist S2 - OPEN(1,File=TRIM(FILEIN), ACCESS='SEQUENTIAL') - IFAIL = -1 - DO WHILE (.NOT.EOF(1)) - READ(1,'(A)') STR - IF (INDEX(STR,'&S2').GT.0) IFAIL = 0 - ENDDO - CLOSE(1) - IF (IFAIL.EQ.-1) THEN - TYPE *, ' Namelist S2 not found' - TYPE *, ' Program aborting' - PAUSE - RETURN - ENDIF -C READ namelist S2 - OPEN(1,File=TRIM(FILEIN), ACCESS='SEQUENTIAL') - dynS2 = '-' - ns2 = -1 - hypS2(:,:) = 1 ! Uniform - matS2(:) = '-' - READ(1,NML=S2,END=5003,ERR=5003) - - IF ((dynS2.NE.'I').AND.(dynS2.NE.'M'))THEN - TYPE *, ' Check dynS2 in namelist S2' - TYPE *, ' Program aborting' - PAUSE - STOP - ENDIF - - IF (ns2.LT.2) THEN - TYPE *, ' Check ns2 in namelist S2' - TYPE *, ' Program aborting' - PAUSE - STOP - ENDIF - - IF (dynS2.EQ.'I') THEN - DO J = 1,ns2 - IF (hypS2(J,1).LE.0) THEN - TYPE *, ' Check hypS2 in namelist S2' - TYPE *, ' Program aborting' - PAUSE - STOP - ENDIF - ENDDO - ELSEIF (dynS2.EQ.'M') THEN - DO J = 1,ns2 - DO K = 1,ns2 - IF (hypS2(J,K).LE.0) THEN - TYPE *, ' Check hypS2 in namelist S2' - TYPE *, ' Program aborting' - PAUSE - STOP - ENDIF - ENDDO - ENDDO - ENDIF - I = 1 - IF ((matS2(I).EQ.'-').OR.((matS2(I).NE.'a') - # .AND.(matS2(I).NE.'H').AND.(matS2(I).NE.'G') - # .AND.(matS2(I).NE.'c').AND.(matS2(I).NE.'F') - # .AND.(matS2(I).NE.'R'))) THEN - TYPE *, ' Check matS2 in namelist S2' - TYPE *, ' Program aborting' - PAUSE - STOP - ENDIF - DO I = 2,6 - IF ((matS2(I).NE.'-').AND.(matS2(I).NE.'a') - # .AND.(matS2(I).NE.'H').AND.(matS2(I).NE.'G') - # .AND.(matS2(I).NE.'c').AND.(matS2(I).NE.'F') - # .AND.(matS2(I).NE.'R')) THEN - PAUSE - TYPE *, ' Check matS2 in namelist S2' - TYPE *, ' Program aborting' - STOP - ENDIF - ENDDO - ENDIF - CLOSE(1) - - IF (nv.GT.2) THEN -C FIND namelist S3 - OPEN(1,File=TRIM(FILEIN), ACCESS='SEQUENTIAL') - IFAIL = -1 - DO WHILE (.NOT.EOF(1)) - READ(1,'(A)') STR - IF (INDEX(STR,'&S3').GT.0) IFAIL = 0 - ENDDO - CLOSE(1) - IF (IFAIL.EQ.-1) THEN - TYPE *, ' Namelist S3 not found' - TYPE *, ' Program aborting' - PAUSE - RETURN - ENDIF - -C READ namelist S3 - OPEN(1,File=TRIM(FILEIN), ACCESS='SEQUENTIAL') - dynS3 = '-' - ns3 = -1 - hypS3(:,:) = 1 - matS3(:) = '-' - READ(1,NML=S3,END=5004,ERR=5004) - - IF ((dynS3.NE.'I').AND.(dynS3.NE.'M'))THEN - TYPE *, ' Check dynS3 in namelist S3' - TYPE *, ' Program aborting' - PAUSE - STOP - ENDIF - - IF (ns3.LT.2) THEN - TYPE *, ' Check ns3 in namelist S3' - TYPE *, ' Program aborting' - PAUSE - STOP - ENDIF - - IF (dynS3.EQ.'I') THEN - DO J = 1,ns3 - IF (hypS3(J,1).LE.0) THEN - TYPE *, ' Check hypS3 in namelist S3' - TYPE *, ' Program aborting' - PAUSE - STOP - ENDIF - ENDDO - ELSEIF (dynS3.EQ.'M') THEN - DO J = 1,ns3 - DO K = 1,ns3 - IF (hypS3(J,K).LE.0) THEN - TYPE *, ' Check hypS3 in namelist S3' - TYPE *, ' Program aborting' - PAUSE - STOP - ENDIF - ENDDO - ENDDO - ENDIF - - IF ((matS3(1).EQ.'-').OR.((matS3(1).NE.'a') - # .AND.(matS3(1).NE.'H').AND.(matS3(1).NE.'G') - # .AND.(matS3(1).NE.'c').AND.(matS3(1).NE.'F') - # .AND.(matS3(1).NE.'R'))) THEN - TYPE *, ' Check matS3 in namelist S3' - TYPE *, ' Program aborting' - PAUSE - STOP - ENDIF - DO I = 2,6 - IF ((matS3(I).NE.'-').AND.(matS3(I).NE.'a') - # .AND.(matS3(I).NE.'H').AND.(matS3(I).NE.'G') - # .AND.(matS3(I).NE.'c').AND.(matS3(I).NE.'F') - # .AND.(matS3(I).NE.'R')) THEN - TYPE *, ' Check matS3 in namelist S3' - TYPE *, ' Program aborting' - PAUSE - STOP - ENDIF - ENDDO - ENDIF - CLOSE(1) - - IF (nv.GT.3) THEN -C FIND namelist S4 - OPEN(1,File=TRIM(FILEIN), ACCESS='SEQUENTIAL') - IFAIL = -1 - DO WHILE (.NOT.EOF(1)) - READ(1,'(A)') STR - IF (INDEX(STR,'&S4').GT.0) IFAIL = 0 - ENDDO - CLOSE(1) - IF (IFAIL.EQ.-1) THEN - TYPE *, ' Namlist S4 not found' - TYPE *, ' Program aborting' - PAUSE - RETURN - ENDIF - -C READ namelist S4 - OPEN(1,File=TRIM(FILEIN), ACCESS='SEQUENTIAL') - dynS4 = '-' - ns4 = -1 - hypS4(:,:) = 1 - matS4(:) = '-' - READ(1,NML=S4,END=5005,ERR=5005) - - IF ((dynS4.NE.'I').AND.(dynS4.NE.'M'))THEN - TYPE *, ' Check dynS4 in namelist S4' - TYPE *, ' Program aborting' - PAUSE - STOP - ENDIF - - IF (ns4.LT.2) THEN - TYPE *, ' Check ns4 in namelist S4' - TYPE *, ' Program aborting' - PAUSE - STOP - ENDIF - - IF (dynS4.EQ.'I') THEN - DO J = 1,ns4 - IF (hypS4(J,1).LE.0) THEN - TYPE *, ' Check hypS4 in namelist S4' - TYPE *, ' Program aborting' - PAUSE - STOP - ENDIF - ENDDO - ELSEIF (dynS4.EQ.'M') THEN - DO J = 1,ns4 - DO K = 1,ns4 - IF (hypS4(J,K).LE.0) THEN - TYPE *, ' Check hypS4 in namelist S4' - TYPE *, ' Program aborting' - PAUSE - STOP - ENDIF - ENDDO - ENDDO - ENDIF - - IF ((matS4(1).EQ.'-').OR.((matS4(1).NE.'a') - # .AND.(matS4(1).NE.'H').AND.(matS4(1).NE.'G') - # .AND.(matS4(1).NE.'c').AND.(matS4(1).NE.'F') - # .AND.(matS4(1).NE.'R'))) THEN - TYPE *, ' Check matS4 in namelist S4' - TYPE *, ' Program aborting' - PAUSE - STOP - ENDIF - DO I = 2,6 - IF ((matS4(I).NE.'-').AND.(matS4(I).NE.'a') - # .AND.(matS4(I).NE.'H').AND.(matS4(I).NE.'G') - # .AND.(matS4(I).NE.'c').AND.(matS4(I).NE.'F') - # .AND.(matS4(I).NE.'R')) THEN - TYPE *, ' Check matS4 in namelist S4' - TYPE *, ' Program aborting' - PAUSE - STOP - ENDIF - ENDDO - ENDIF - CLOSE(1) - - IF (nv.GT.4) THEN -C FIND namelist S5 - OPEN(1,File=TRIM(FILEIN), ACCESS='SEQUENTIAL') - IFAIL = -1 - DO WHILE (.NOT.EOF(1)) - READ(1,'(A)') STR - IF (INDEX(STR,'&S5').GT.0) IFAIL = 0 - ENDDO - CLOSE(1) - IF (IFAIL.EQ.-1) THEN - TYPE *, ' Namlist S5 not found' - TYPE *, ' Program aborting' - PAUSE - RETURN - ENDIF - -C READ namelist S5 - OPEN(1,File=TRIM(FILEIN), ACCESS='SEQUENTIAL') - dynS5 = '-' - ns5 = -1 - hypS5(:,:) = 1 - matS5(:) = '-' - READ(1,NML=S5,END=5006,ERR=5006) - - IF ((dynS5.NE.'I').AND.(dynS5.NE.'M'))THEN - TYPE *, ' Check dynS5 in namelist S5' - TYPE *, ' Program aborting' - PAUSE - STOP - ENDIF - - IF (ns5.LT.2) THEN - TYPE *, ' Check ns5 in namelist S5' - TYPE *, ' Program aborting' - PAUSE - STOP - ENDIF - - IF (dynS5.EQ.'I') THEN - DO J = 1,ns5 - IF (hypS5(J,1).LE.0) THEN - TYPE *, ' Check hypS5 in namelist S5' - TYPE *, ' Program aborting' - PAUSE - STOP - ENDIF - ENDDO - ELSEIF (dynS5.EQ.'M') THEN - DO J = 1,ns5 - DO K = 1,ns5 - IF (hypS5(J,K).LE.0) THEN - TYPE *, ' Check hypS5 in namelist S5' - TYPE *, ' Program aborting' - PAUSE - STOP - ENDIF - ENDDO - ENDDO - ENDIF - - IF ((matS5(1).EQ.'-').OR.((matS5(1).NE.'a') - # .AND.(matS5(1).NE.'H').AND.(matS5(1).NE.'G') - # .AND.(matS5(1).NE.'c').AND.(matS5(1).NE.'F') - # .AND.(matS5(1).NE.'R'))) THEN - TYPE *, ' Check matS5 in namelist S5' - TYPE *, ' Program aborting' - PAUSE - STOP - ENDIF - DO I = 2,6 - IF ((matS5(I).NE.'-').AND.(matS5(I).NE.'a') - # .AND.(matS5(I).NE.'H').AND.(matS5(I).NE.'G') - # .AND.(matS5(I).NE.'c').AND.(matS5(I).NE.'F') - # .AND.(matS5(I).NE.'R')) THEN - TYPE *, ' Check matS5 in namelist S5' - TYPE *, ' Program aborting' - PAUSE - STOP - ENDIF - ENDDO - ENDIF - CLOSE(1) - - IF (nv.GT.5) THEN -C FIND namelist S6 - OPEN(1,File=TRIM(FILEIN), ACCESS='SEQUENTIAL') - IFAIL = -1 - DO WHILE (.NOT.EOF(1)) - READ(1,'(A)') STR - IF (INDEX(STR,'&S6').GT.0) IFAIL = 0 - ENDDO - CLOSE(1) - IF (IFAIL.EQ.-1) THEN - TYPE *, ' Namlist S6 not found' - TYPE *, ' Program aborting' - PAUSE - RETURN - ENDIF - -C READ namelist S6 - OPEN(1,File=TRIM(FILEIN), ACCESS='SEQUENTIAL') - dynS6 = '-' - ns6 = -1 - hypS6(:,:) = 1 - matS6(:) = '-' - READ(1,NML=S6,END=5007,ERR=5007) - - IF ((dynS6.NE.'I').AND.(dynS6.NE.'M'))THEN - TYPE *, ' Check dynS6 in namelist S6' - TYPE *, ' Program aborting' - PAUSE - STOP - ENDIF - - IF (ns6.LT.2) THEN - TYPE *, ' Check ns6 in namelist S6' - TYPE *, ' Program aborting' - PAUSE - STOP - ENDIF - - IF (dynS6.EQ.'I') THEN - DO J = 1,ns6 - IF (hypS6(J,1).LE.0) THEN - TYPE *, ' Check hypS6 in namelist S6' - TYPE *, ' Program aborting' - PAUSE - STOP - ENDIF - ENDDO - ELSEIF (dynS6.EQ.'M') THEN - DO J = 1,ns6 - DO K = 1,ns6 - IF (hypS6(J,K).LE.0) THEN - TYPE *, ' Check hypS6 in namelist S6' - TYPE *, ' Program aborting' - PAUSE - STOP - ENDIF - ENDDO - ENDDO - ENDIF - - IF ((matS6(1).EQ.'-').OR.((matS6(1).NE.'a') - # .AND.(matS6(1).NE.'H').AND.(matS6(1).NE.'G') - # .AND.(matS6(1).NE.'c').AND.(matS6(1).NE.'F') - # .AND.(matS6(1).NE.'R'))) THEN - TYPE *, ' Check matS6 in namelist S6' - TYPE *, ' Program aborting' - PAUSE - STOP - ENDIF - DO I = 2,6 - IF ((matS6(I).NE.'-').AND.(matS6(I).NE.'a') - # .AND.(matS6(I).NE.'H').AND.(matS6(I).NE.'G') - # .AND.(matS6(I).NE.'c').AND.(matS6(I).NE.'F') - # .AND.(matS6(I).NE.'R')) THEN - TYPE *, ' Check matS6 in namelist S6' - TYPE *, ' Program aborting' - PAUSE - STOP - ENDIF - ENDDO - ENDIF - CLOSE(1) - -C FIND namelist prior - OPEN(1,File=TRIM(FILEIN), ACCESS='SEQUENTIAL') - IFAIL = -1 - DO WHILE (.NOT.EOF(1)) - READ(1,'(A)') STR - IF (INDEX(STR,'&prior').GT.0) IFAIL = 0 - ENDDO - CLOSE(1) - IF (IFAIL.EQ.-1) THEN - TYPE *, ' Namelist prior not found' - TYPE *, ' Program aborting' - PAUSE - RETURN - ENDIF -C READ namelist prior - OPEN(1,File=TRIM(FILEIN), ACCESS='SEQUENTIAL') - nt = 0 - pdftheta(:) = ' ' - hyptheta(:,:) = -1 - READ(1,NML = prior,END=5008,ERR=5008) - IF (nt.LE.0) THEN - TYPE *, ' Check nt in namelist prior' - TYPE *, ' Program aborting' - PAUSE - STOP - ENDIF - IF (nt.GT.200) THEN - TYPE *, ' nt is too large ' - TYPE *, ' Program aborting' - PAUSE - STOP - ENDIF - IF (estimation.EQ.'BA') THEN - DO I = 1,nt - WRITE(IC,'(I3)') I - IF ((pdftheta(I).NE.'BE').AND.(pdftheta(I).NE.'NT').AND. - # (pdftheta(I).NE.'IG')) THEN - TYPE *, ' Check pdftheta('//IC//') in namelist prior' - TYPE *, ' Program aborting' - PAUSE - STOP - ENDIF - IF (hyptheta(3,I).GT.hyptheta(4,I)) THEN - TYPE *, ' Check hyptheta('//IC//') in namelist prior' - TYPE *, ' Program aborting' - PAUSE - STOP - ENDIF - IF (pdftheta(I).EQ.'BE') THEN - IF (hyptheta(3,I).LT.hyptheta(4,I)) THEN - IF ((hyptheta(1,I).LE.0.).OR.(hyptheta(2,I).LE.0.).OR. - # (hyptheta(3,I).GT.hyptheta(4,I))) THEN - TYPE *, ' Check hyptheta('//IC//') in namelist prior' - TYPE *, ' Program aborting' - PAUSE - STOP - ENDIF - ENDIF - ELSEIF (pdftheta(I).EQ.'NT') THEN - IF (hyptheta(3,I).LT.hyptheta(4,I)) THEN - IF ((hyptheta(2,I).LE.0.).OR.(hyptheta(3,I).GT.hyptheta(4,I))) - # THEN - TYPE *, ' Check hyptheta('//IC//') in namelist prior' - TYPE *, ' Program aborting' - PAUSE - STOP - ENDIF - ENDIF - ELSEIF (pdftheta(I).EQ.'IG') THEN - IF (hyptheta(3,I).LT.hyptheta(4,I)) THEN - IF ((hyptheta(1,I).LE.0.).OR.(hyptheta(2,I).LE.0.).OR. - # (hyptheta(3,I).GT.hyptheta(4,I)).OR.(hyptheta(3,I).LT.0.))THEN - TYPE *, ' Check hyptheta('//IC//') in namelist prior' - TYPE *, ' Program aborting' - PAUSE - STOP - ENDIF - ENDIF - ENDIF - ENDDO - ELSE - DO I = 1,nt ! ML check - WRITE(IC,'(I3)') I - IF (hyptheta(3,I).GT.hyptheta(4,I)) THEN - TYPE *, ' Check hyptheta('//IC//') in namelist prior' - TYPE *, ' Program aborting' - PAUSE - STOP - ENDIF - ENDDO - ENDIF - CLOSE(1) - -C FIND namelist mcmc - OPEN(1,File=TRIM(FILEIN), ACCESS='SEQUENTIAL') - IFAIL = -1 - DO WHILE (.NOT.EOF(1)) - READ(1,'(A)') STR - IF (INDEX(STR,'&mcmc').GT.0) IFAIL = 0 - ENDDO - CLOSE(1) - IF (IFAIL.EQ.-1) THEN - TYPE *, ' Namelist mcmc not found' - TYPE *, ' Program aborting' - PAUSE - RETURN - ENDIF - -C READ namelist mcmc - OPEN(1,File=TRIM(FILEIN), ACCESS='SEQUENTIAL') - seed = 0 - thin = 1 - burnin = 1000 - simulrec = 5000 - sampler = 'SL' - Ssampler = 'GCK' - hbl = 1 - MargLik = 'N' - READ(1,NML=mcmc,END=5009,ERR=5009) - IF ((seed.LT.0).OR.(seed.GT.999)) THEN - TYPE *, ' Check seed in namelist mcmc' - TYPE *, ' Program aborting' - PAUSE - STOP - ENDIF - IF (thin.LT.1) THEN - TYPE *, ' Check thin in namelist mcmc' - TYPE *, ' Program aborting' - PAUSE - STOP - ENDIF - IF (burnin.LE.0) THEN - TYPE *, ' Check burnin in namelist mcmc' - TYPE *, ' Program aborting' - PAUSE - STOP - ENDIF - IF (simulrec.LE.1) THEN - TYPE *, ' Check simulrec in namelist mcmc' - TYPE *, ' Program aborting' - PAUSE - STOP - ENDIF - IF ((sampler.NE.'SL').AND.(sampler.NE.'MH')) THEN - TYPE *, ' Check sampler in namelist mcmc' - TYPE *, ' Program aborting' - PAUSE - STOP - ENDIF - -c IF ((Ssampler.NE.'GCK').AND.(Ssampler.NE.'AMH') -c # .AND.(Ssampler.NE.'MH ')) THEN -c TYPE *, ' Check Ssampler in namelist mcmc' -c TYPE *, ' Program aborting' -c PAUSE -c STOP -c ENDIF -c IF ((hbl.GT.1).AND.(Ssampler.EQ.'GCK')) THEN -c TYPE *, ' Check hbl in namelist mcmc' -c TYPE *, ' Program aborting' -c PAUSE -c STOP -c ENDIF - - CLOSE(1) - -C FIND namelist dataset - OPEN(1,File=TRIM(FILEIN), ACCESS='SEQUENTIAL') - IFAIL = -1 - DO WHILE (.NOT.EOF(1)) - READ(1,'(A)') STR - IF (INDEX(STR,'&dataset').GT.0) IFAIL = 0 - ENDDO - CLOSE(1) - IF (IFAIL.EQ.-1) THEN - TYPE *, ' Namelist dataset not found' - TYPE *, ' Program aborting' - PAUSE - RETURN - ENDIF -C READ namelist dataset - OPEN(1,File=TRIM(FILEIN), ACCESS='SEQUENTIAL') - ny = -1 - nz = -1 - nf = 0 - datasim = 'N' - READ(1,NML=dataset,END=5010,ERR=5010) - IF ((T.LE.0).OR.(T.GT.3000)) THEN - TYPE *, ' Check T in namelist dataset (T<=3000)' - TYPE *, ' Program aborting' - PAUSE - STOP - ENDIF - IF (ny.LE.0) THEN - TYPE *, ' Check ny in namelist dataset' - TYPE *, ' Program aborting' - PAUSE - STOP - ENDIF - IF (nz.LT.0) THEN - TYPE *, ' Check nz in namelist dataset' - TYPE *, ' Program aborting' - PAUSE - STOP - ENDIF - IF (nf.LT.0) THEN - TYPE *, ' Check nf in namelist dataset' - TYPE *, ' Program aborting' - PAUSE - STOP - ENDIF - IF (T.LT.hbl) THEN - TYPE *, ' Check hbl in namelist mcmc (hbl > T)' - TYPE *, ' Program aborting' - PAUSE - STOP - ENDIF - IF ((datasim.NE.'N').AND.(datasim.NE.'n').AND. - & (datasim.NE.'y').AND.(datasim.NE.'Y')) THEN - datasim = 'N' - ENDIF - - CLOSE(1) - -C ----------------------------------------------------------------------- -C ASSIGN discrete latent variables: INFOS (9 x nv) -C by cols: S1,S2,...,SNV; with nv <=6 -C by row: the 1st contains the # of matrices affected by Si -C the 2nd-3rd etc point to c (1),H (2),G (3),a (4),F (5),R (6) -C the 8-th row contains the # of states -C the 9-th row spec. the dynamic of Sj (0-deterministic,1=Indep,2=Markov) -C nstot: total # of states i.e. ns1 x ns2 x ...x nsv -C np(1): total # of psi parameters -C np(2): total # of idependent PSI-Dirichlet vectors -C np(3): max # of hyperparameters for psi -C ----------------------------------------------------------------------- - INFOS(:,:) = 0 - INFOS(8,:) = 1 ! number of states - ns(:) = 1 - np(:) = 0 - IF (nv.GT.0) THEN - ALLOCATE(matS(6,6),dynS(6),nstateS(6)) - matS(:,1) = matS1(:) - matS(:,2) = matS2(:) - matS(:,3) = matS3(:) - matS(:,4) = matS4(:) - matS(:,5) = matS5(:) - matS(:,6) = matS6(:) - hypS(:,:,1) = hypS1(:,:) - hypS(:,:,2) = hypS2(:,:) - hypS(:,:,3) = hypS3(:,:) - hypS(:,:,4) = hypS4(:,:) - hypS(:,:,5) = hypS5(:,:) - hypS(:,:,6) = hypS6(:,:) - dynS(1) = dynS1 - dynS(2) = dynS2 - dynS(3) = dynS3 - dynS(4) = dynS4 - dynS(5) = dynS5 - dynS(6) = dynS6 - nstateS(1) = ns1 - nstateS(2) = ns2 - nstateS(3) = ns3 - nstateS(4) = ns4 - nstateS(5) = ns5 - nstateS(6) = ns6 - IMAX = MAXLOC(nstateS(1:nv)) - np(2) = 0 - np(3) = nstateS(IMAX(1)) - DO 50 J = 1,nv - K = 0 - DO 40 I = 1,6 - IF(matS(I,J).EQ.'c') THEN - K = K + 1 - IND = 1 - INFOS(K+1,J) = IND ! Matrices affected by SJ - ENDIF - IF(matS(I,J).EQ.'H') THEN - K = K + 1 - IND = 2 - INFOS(K+1,J) = IND - ENDIF - IF(matS(I,J).EQ.'G') THEN - K = K + 1 - IND = 3 - INFOS(K+1,J) = IND - ENDIF - IF(matS(I,J).EQ.'a') THEN - K = K + 1 - IND = 4 - INFOS(K+1,J) = IND - ENDIF - IF(matS(I,J).EQ.'F') THEN - K = K + 1 - IND = 5 - INFOS(K+1,J) = IND - ENDIF - IF(matS(I,J).EQ.'R') THEN - K = K + 1 - IND = 6 - INFOS(K+1,J) = IND - ENDIF -40 CONTINUE - INFOS(1,J) = K ! # of matrix affected by SJ - INFOS(8,J) = nstateS(J) ! # of states for SJ - IF (dynS(J).EQ.'I') THEN - INFOS(9,J) = 1 ! dynamics for Sj - np(2) = np(2) + 1 - np(1) = np(1) + nstateS(J)-1 - ELSEIF (dynS(J).EQ.'M') THEN - INFOS(9,J) = 2 - np(2) = np(2) + nstateS(J) - np(1) = np(1) + (nstateS(J)-1)*nstateS(J) - ENDIF -50 CONTINUE - - DO 60 I = 1,nv - DO 60 J = 1,INFOS(1,I) -60 ns(INFOS(J+1,I)) = INFOS(8,I) - nstot = PRODUCT(INFOS(8,1:nv)) ! total # of states - - DEALLOCATE(matS,dynS,nstateS) - ENDIF - - GO TO 7777 - -5000 TYPE *,'Input file not found' - TYPE *,'Program aborting' - PAUSE - STOP - -5001 TYPE *,'Input error in namelist ssm' - TYPE *,'Program aborting' - PAUSE - STOP -5002 TYPE *,'Input error in namelist S1 ' - TYPE *,'Program aborting' - PAUSE - STOP -5003 TYPE *,'Input error in namelist S2 ' - TYPE *,'Program aborting' - PAUSE - STOP -5004 TYPE *,'Input error in namelist S3 ' - TYPE *,'Program aborting' - PAUSE - STOP -5005 TYPE *,'Input error in namelist S4 ' - TYPE *,'Program aborting' - PAUSE - STOP -5006 TYPE *,'Input error in namelist S5 ' - TYPE *,'Program aborting' - PAUSE - STOP -5007 TYPE *,'Input error in namelist S6 ' - TYPE *,'Program aborting' - PAUSE - STOP -5008 TYPE *,'Input error in namelist prior' - TYPE *,'Program aborting' - PAUSE - STOP -5009 TYPE *,'Input error in namelist mcmc' - TYPE *,'Program aborting' - PAUSE - STOP -5010 TYPE *,'Input error in namelist dataset' - TYPE *,'Program aborting' - PAUSE - STOP - -7777 RETURN +C along with DMM. If not, see <http://www.gnu.org/licenses/>. +C ----------------------------------------------------------------------- + SUBROUTINE input(FILEIN,NMLNAME,PATH,ny,nz,nx,nu,d,nv,ns, + 1 nstot,np,nf,INFOS,seed,thin,burnin,simulrec,sampler, + 2 datasim,dllname,check,estimation,nt,pdftheta,hyptheta, + 3 hypS,T,obs,Ssampler,hbl,MargLik) + +C INCLUDE 'iosdef.for' + INTEGER IERR +C INPUT + CHARACTER*200 FILEIN +C OUTPUT + NAMELIST /ssm/ nx,nu,d,nv,dllname,check,estimation + INTEGER nx,nu,d(2),nv + CHARACTER*200 dllname + CHARACTER*1 check + CHARACTER*2 estimation + + NAMELIST /S1/ dynS1,matS1,ns1,hypS1 + NAMELIST /S2/ dynS2,matS2,ns2,hypS2 + NAMELIST /S3/ dynS3,matS3,ns3,hypS3 + NAMELIST /S4/ dynS4,matS4,ns4,hypS4 + NAMELIST /S5/ dynS5,matS5,ns5,hypS5 + NAMELIST /S6/ dynS6,matS6,ns6,hypS6 + CHARACTER*1 dynS1,dynS2,dynS3,dynS4,dynS5,dynS6, + 1 matS1(6),matS2(6),matS3(6),matS4(6),matS5(6),matS6(6) + INTEGER ns1,ns2,ns3,ns4,ns5,ns6 + DOUBLE PRECISION hypS1(50,50),hypS2(50,50),hypS3(50,50), + 1 hypS4(50,50),hypS5(50,50),hypS6(50,50),hypS(50,50,6) + + NAMELIST /mcmc/ seed,thin,burnin,simulrec,sampler, + 1 Ssampler,hbl,marglik + INTEGER seed,thin,burnin,simulrec,hbl + CHARACTER*1 MargLik + CHARACTER*2 sampler + CHARACTER*3 Ssampler + + NAMELIST /prior/ nt,pdftheta,hyptheta + INTEGER nt + DOUBLE PRECISION hyptheta(4,200) + CHARACTER*2 pdftheta(200) + + NAMELIST /dataset/ T,ny,nz,nf,datasim,obs + INTEGER T,ny,nz,nf + DOUBLE PRECISION obs(30000) + CHARACTER*1 datasim + +C OUTPUT not in the namelist + INTEGER ns(6),INFOS(9,6),IMAX(1),np(3),nstot,IND + CHARACTER*200 NMLNAME,PATH + +C LOCALS + CHARACTER*3 IC + CHARACTER*200 STR + INTEGER I,J,K,IFAIL + INTEGER, ALLOCATABLE:: nstateS(:) + CHARACTER*1, ALLOCATABLE:: matS(:,:),dynS(:) + +C IDENTIFY the PATH and NAME of the .NML INPUT FILE + I = SCAN(FILEIN,'\', BACK = .TRUE.) + IF((I.LE.0).OR.(I.GE.200)) THEN + NMLNAME = FILEIN + PATH = '' + ELSE + NMLNAME = FILEIN(I+1:200) + PATH = FILEIN(1:I) + ENDIF + I = SCAN(NMLNAME,'.', BACK = .TRUE.) + NMLNAME = NMLNAME(1:I-1) + +C FIND namelist ssm + OPEN(1,File=TRIM(FILEIN), ACCESS='SEQUENTIAL', + 1 STATUS='OLD',IOSTAT=IERR, ERR=5000) + IFAIL = -1 + DO WHILE (.NOT.EOF(1)) + READ(1,'(A)') STR + IF (INDEX(STR,'&ssm').GT.0) IFAIL = 0 + ENDDO + CLOSE(1) + IF (IFAIL.EQ.-1) THEN + TYPE *, ' Namelist ssm not found' + TYPE *, ' Program aborting' + PAUSE + RETURN + ENDIF + +C READ namelist ssm + ns1=0 + ns2=0 + ns3=0 + ns4=0 + ns5=0 + ns6=0 + OPEN(1,File=TRIM(FILEIN), ACCESS='SEQUENTIAL') + nx = -1 + nu = -1 + d(:) = -1 + nv = 0 + dllname = '' + check = 'N' + estimation = 'BA' + READ(1,NML=ssm,END=5001,ERR=5001) + IF (nx.LE.0) THEN + TYPE *, ' Check nx in namelist ssm' + TYPE *, ' Program aborting' + PAUSE + STOP + ENDIF + IF(nu.LE.0) THEN + TYPE *, ' Check nu in namelist ssm' + TYPE *, ' Program aborting' + PAUSE + STOP + ENDIF + IF((d(1).LT.0).OR.(d(2).LT.0).OR.(d(2).GT.nx)) THEN + TYPE *, ' Check d in namelist ssm' + TYPE *, ' Program aborting' + PAUSE + STOP + ENDIF + IF((nv.LT.0).OR.(nv.GT.6)) THEN + TYPE *, ' Check nv in namelist ssm' + TYPE *, ' Program aborting' + PAUSE + STOP + ENDIF + IF(dllname.EQ.'') THEN + TYPE *, ' Check dllname in namelist ssm' + TYPE *, ' Program aborting' + PAUSE + STOP + ENDIF + CLOSE(1) + IF ((estimation.NE.'ML').AND.(estimation.NE.'ml').AND. + & (estimation.NE.'Ml').AND.(estimation.NE.'mL').AND. + & (estimation.NE.'BA').AND.(estimation.NE.'ba').AND. + & (estimation.NE.'Ba').AND.(estimation.NE.'bA')) THEN + estimation = 'BA' + ENDIF + + IF (nv.GT.0) THEN +C FIND namelist S1 + OPEN(1,File=TRIM(FILEIN), ACCESS='SEQUENTIAL') + IFAIL = -1 + DO WHILE (.NOT.EOF(1)) + READ(1,'(A)') STR + IF (INDEX(STR,'&S1').GT.0) IFAIL = 0 + ENDDO + CLOSE(1) + IF (IFAIL.EQ.-1) THEN + TYPE *, ' Namelist S1 not found' + TYPE *, ' Program aborting' + PAUSE + RETURN + ENDIF + +C READ namelist S1 + OPEN(1,File=TRIM(FILEIN), ACCESS='SEQUENTIAL') + dynS1 = '-' + ns1 = -1 + hypS1(:,:) = 1 + matS1(:) = '-' + READ(1,NML=S1,END=5002,ERR=5002) + + IF ((dynS1.NE.'I').AND.(dynS1.NE.'M'))THEN + TYPE *, ' Check dynS1 in namelist S1' + TYPE *, ' Program aborting' + PAUSE + STOP + ENDIF + + IF (ns1.LT.2) THEN + TYPE *, ' Check ns1 in namelist S1' + TYPE *, ' Program aborting' + PAUSE + STOP + ENDIF + + IF (dynS1.EQ.'I') THEN + DO J = 1,ns1 + IF (hypS1(J,1).LE.0) THEN + TYPE *, ' Check hypS1 in namelist S1' + TYPE *, ' Program aborting' + PAUSE + STOP + ENDIF + ENDDO + ELSEIF (dynS1.EQ.'M') THEN + DO J = 1,ns1 + DO K = 1,ns1 + IF (hypS1(J,K).LE.0) THEN + TYPE *, ' Check hypS1 in namelist S1' + TYPE *, ' Program aborting' + PAUSE + STOP + ENDIF + ENDDO + ENDDO + ENDIF + + IF ((matS1(1).EQ.'-').OR.((matS1(1).NE.'a') + # .AND.(matS1(1).NE.'H').AND.(matS1(1).NE.'G') + # .AND.(matS1(1).NE.'c').AND.(matS1(1).NE.'F') + # .AND.(matS1(1).NE.'R'))) THEN + TYPE *, ' Check matS1 in namelist S1' + TYPE *, ' Program aborting' + PAUSE + STOP + ENDIF + DO I = 2,6 + IF ((matS1(I).NE.'-').AND.(matS1(I).NE.'a') + # .AND.(matS1(I).NE.'H').AND.(matS1(I).NE.'G') + # .AND.(matS1(I).NE.'c').AND.(matS1(I).NE.'F') + # .AND.(matS1(I).NE.'R')) THEN + TYPE *, ' Check matS1 in namelist S1' + TYPE *, ' Program aborting' + PAUSE + STOP + ENDIF + ENDDO + ENDIF + CLOSE(1) + + IF (nv.GT.1) THEN +C FIND namelist S2 + OPEN(1,File=TRIM(FILEIN), ACCESS='SEQUENTIAL') + IFAIL = -1 + DO WHILE (.NOT.EOF(1)) + READ(1,'(A)') STR + IF (INDEX(STR,'&S2').GT.0) IFAIL = 0 + ENDDO + CLOSE(1) + IF (IFAIL.EQ.-1) THEN + TYPE *, ' Namelist S2 not found' + TYPE *, ' Program aborting' + PAUSE + RETURN + ENDIF +C READ namelist S2 + OPEN(1,File=TRIM(FILEIN), ACCESS='SEQUENTIAL') + dynS2 = '-' + ns2 = -1 + hypS2(:,:) = 1 ! Uniform + matS2(:) = '-' + READ(1,NML=S2,END=5003,ERR=5003) + + IF ((dynS2.NE.'I').AND.(dynS2.NE.'M'))THEN + TYPE *, ' Check dynS2 in namelist S2' + TYPE *, ' Program aborting' + PAUSE + STOP + ENDIF + + IF (ns2.LT.2) THEN + TYPE *, ' Check ns2 in namelist S2' + TYPE *, ' Program aborting' + PAUSE + STOP + ENDIF + + IF (dynS2.EQ.'I') THEN + DO J = 1,ns2 + IF (hypS2(J,1).LE.0) THEN + TYPE *, ' Check hypS2 in namelist S2' + TYPE *, ' Program aborting' + PAUSE + STOP + ENDIF + ENDDO + ELSEIF (dynS2.EQ.'M') THEN + DO J = 1,ns2 + DO K = 1,ns2 + IF (hypS2(J,K).LE.0) THEN + TYPE *, ' Check hypS2 in namelist S2' + TYPE *, ' Program aborting' + PAUSE + STOP + ENDIF + ENDDO + ENDDO + ENDIF + I = 1 + IF ((matS2(I).EQ.'-').OR.((matS2(I).NE.'a') + # .AND.(matS2(I).NE.'H').AND.(matS2(I).NE.'G') + # .AND.(matS2(I).NE.'c').AND.(matS2(I).NE.'F') + # .AND.(matS2(I).NE.'R'))) THEN + TYPE *, ' Check matS2 in namelist S2' + TYPE *, ' Program aborting' + PAUSE + STOP + ENDIF + DO I = 2,6 + IF ((matS2(I).NE.'-').AND.(matS2(I).NE.'a') + # .AND.(matS2(I).NE.'H').AND.(matS2(I).NE.'G') + # .AND.(matS2(I).NE.'c').AND.(matS2(I).NE.'F') + # .AND.(matS2(I).NE.'R')) THEN + PAUSE + TYPE *, ' Check matS2 in namelist S2' + TYPE *, ' Program aborting' + STOP + ENDIF + ENDDO + ENDIF + CLOSE(1) + + IF (nv.GT.2) THEN +C FIND namelist S3 + OPEN(1,File=TRIM(FILEIN), ACCESS='SEQUENTIAL') + IFAIL = -1 + DO WHILE (.NOT.EOF(1)) + READ(1,'(A)') STR + IF (INDEX(STR,'&S3').GT.0) IFAIL = 0 + ENDDO + CLOSE(1) + IF (IFAIL.EQ.-1) THEN + TYPE *, ' Namelist S3 not found' + TYPE *, ' Program aborting' + PAUSE + RETURN + ENDIF + +C READ namelist S3 + OPEN(1,File=TRIM(FILEIN), ACCESS='SEQUENTIAL') + dynS3 = '-' + ns3 = -1 + hypS3(:,:) = 1 + matS3(:) = '-' + READ(1,NML=S3,END=5004,ERR=5004) + + IF ((dynS3.NE.'I').AND.(dynS3.NE.'M'))THEN + TYPE *, ' Check dynS3 in namelist S3' + TYPE *, ' Program aborting' + PAUSE + STOP + ENDIF + + IF (ns3.LT.2) THEN + TYPE *, ' Check ns3 in namelist S3' + TYPE *, ' Program aborting' + PAUSE + STOP + ENDIF + + IF (dynS3.EQ.'I') THEN + DO J = 1,ns3 + IF (hypS3(J,1).LE.0) THEN + TYPE *, ' Check hypS3 in namelist S3' + TYPE *, ' Program aborting' + PAUSE + STOP + ENDIF + ENDDO + ELSEIF (dynS3.EQ.'M') THEN + DO J = 1,ns3 + DO K = 1,ns3 + IF (hypS3(J,K).LE.0) THEN + TYPE *, ' Check hypS3 in namelist S3' + TYPE *, ' Program aborting' + PAUSE + STOP + ENDIF + ENDDO + ENDDO + ENDIF + + IF ((matS3(1).EQ.'-').OR.((matS3(1).NE.'a') + # .AND.(matS3(1).NE.'H').AND.(matS3(1).NE.'G') + # .AND.(matS3(1).NE.'c').AND.(matS3(1).NE.'F') + # .AND.(matS3(1).NE.'R'))) THEN + TYPE *, ' Check matS3 in namelist S3' + TYPE *, ' Program aborting' + PAUSE + STOP + ENDIF + DO I = 2,6 + IF ((matS3(I).NE.'-').AND.(matS3(I).NE.'a') + # .AND.(matS3(I).NE.'H').AND.(matS3(I).NE.'G') + # .AND.(matS3(I).NE.'c').AND.(matS3(I).NE.'F') + # .AND.(matS3(I).NE.'R')) THEN + TYPE *, ' Check matS3 in namelist S3' + TYPE *, ' Program aborting' + PAUSE + STOP + ENDIF + ENDDO + ENDIF + CLOSE(1) + + IF (nv.GT.3) THEN +C FIND namelist S4 + OPEN(1,File=TRIM(FILEIN), ACCESS='SEQUENTIAL') + IFAIL = -1 + DO WHILE (.NOT.EOF(1)) + READ(1,'(A)') STR + IF (INDEX(STR,'&S4').GT.0) IFAIL = 0 + ENDDO + CLOSE(1) + IF (IFAIL.EQ.-1) THEN + TYPE *, ' Namlist S4 not found' + TYPE *, ' Program aborting' + PAUSE + RETURN + ENDIF + +C READ namelist S4 + OPEN(1,File=TRIM(FILEIN), ACCESS='SEQUENTIAL') + dynS4 = '-' + ns4 = -1 + hypS4(:,:) = 1 + matS4(:) = '-' + READ(1,NML=S4,END=5005,ERR=5005) + + IF ((dynS4.NE.'I').AND.(dynS4.NE.'M'))THEN + TYPE *, ' Check dynS4 in namelist S4' + TYPE *, ' Program aborting' + PAUSE + STOP + ENDIF + + IF (ns4.LT.2) THEN + TYPE *, ' Check ns4 in namelist S4' + TYPE *, ' Program aborting' + PAUSE + STOP + ENDIF + + IF (dynS4.EQ.'I') THEN + DO J = 1,ns4 + IF (hypS4(J,1).LE.0) THEN + TYPE *, ' Check hypS4 in namelist S4' + TYPE *, ' Program aborting' + PAUSE + STOP + ENDIF + ENDDO + ELSEIF (dynS4.EQ.'M') THEN + DO J = 1,ns4 + DO K = 1,ns4 + IF (hypS4(J,K).LE.0) THEN + TYPE *, ' Check hypS4 in namelist S4' + TYPE *, ' Program aborting' + PAUSE + STOP + ENDIF + ENDDO + ENDDO + ENDIF + + IF ((matS4(1).EQ.'-').OR.((matS4(1).NE.'a') + # .AND.(matS4(1).NE.'H').AND.(matS4(1).NE.'G') + # .AND.(matS4(1).NE.'c').AND.(matS4(1).NE.'F') + # .AND.(matS4(1).NE.'R'))) THEN + TYPE *, ' Check matS4 in namelist S4' + TYPE *, ' Program aborting' + PAUSE + STOP + ENDIF + DO I = 2,6 + IF ((matS4(I).NE.'-').AND.(matS4(I).NE.'a') + # .AND.(matS4(I).NE.'H').AND.(matS4(I).NE.'G') + # .AND.(matS4(I).NE.'c').AND.(matS4(I).NE.'F') + # .AND.(matS4(I).NE.'R')) THEN + TYPE *, ' Check matS4 in namelist S4' + TYPE *, ' Program aborting' + PAUSE + STOP + ENDIF + ENDDO + ENDIF + CLOSE(1) + + IF (nv.GT.4) THEN +C FIND namelist S5 + OPEN(1,File=TRIM(FILEIN), ACCESS='SEQUENTIAL') + IFAIL = -1 + DO WHILE (.NOT.EOF(1)) + READ(1,'(A)') STR + IF (INDEX(STR,'&S5').GT.0) IFAIL = 0 + ENDDO + CLOSE(1) + IF (IFAIL.EQ.-1) THEN + TYPE *, ' Namlist S5 not found' + TYPE *, ' Program aborting' + PAUSE + RETURN + ENDIF + +C READ namelist S5 + OPEN(1,File=TRIM(FILEIN), ACCESS='SEQUENTIAL') + dynS5 = '-' + ns5 = -1 + hypS5(:,:) = 1 + matS5(:) = '-' + READ(1,NML=S5,END=5006,ERR=5006) + + IF ((dynS5.NE.'I').AND.(dynS5.NE.'M'))THEN + TYPE *, ' Check dynS5 in namelist S5' + TYPE *, ' Program aborting' + PAUSE + STOP + ENDIF + + IF (ns5.LT.2) THEN + TYPE *, ' Check ns5 in namelist S5' + TYPE *, ' Program aborting' + PAUSE + STOP + ENDIF + + IF (dynS5.EQ.'I') THEN + DO J = 1,ns5 + IF (hypS5(J,1).LE.0) THEN + TYPE *, ' Check hypS5 in namelist S5' + TYPE *, ' Program aborting' + PAUSE + STOP + ENDIF + ENDDO + ELSEIF (dynS5.EQ.'M') THEN + DO J = 1,ns5 + DO K = 1,ns5 + IF (hypS5(J,K).LE.0) THEN + TYPE *, ' Check hypS5 in namelist S5' + TYPE *, ' Program aborting' + PAUSE + STOP + ENDIF + ENDDO + ENDDO + ENDIF + + IF ((matS5(1).EQ.'-').OR.((matS5(1).NE.'a') + # .AND.(matS5(1).NE.'H').AND.(matS5(1).NE.'G') + # .AND.(matS5(1).NE.'c').AND.(matS5(1).NE.'F') + # .AND.(matS5(1).NE.'R'))) THEN + TYPE *, ' Check matS5 in namelist S5' + TYPE *, ' Program aborting' + PAUSE + STOP + ENDIF + DO I = 2,6 + IF ((matS5(I).NE.'-').AND.(matS5(I).NE.'a') + # .AND.(matS5(I).NE.'H').AND.(matS5(I).NE.'G') + # .AND.(matS5(I).NE.'c').AND.(matS5(I).NE.'F') + # .AND.(matS5(I).NE.'R')) THEN + TYPE *, ' Check matS5 in namelist S5' + TYPE *, ' Program aborting' + PAUSE + STOP + ENDIF + ENDDO + ENDIF + CLOSE(1) + + IF (nv.GT.5) THEN +C FIND namelist S6 + OPEN(1,File=TRIM(FILEIN), ACCESS='SEQUENTIAL') + IFAIL = -1 + DO WHILE (.NOT.EOF(1)) + READ(1,'(A)') STR + IF (INDEX(STR,'&S6').GT.0) IFAIL = 0 + ENDDO + CLOSE(1) + IF (IFAIL.EQ.-1) THEN + TYPE *, ' Namlist S6 not found' + TYPE *, ' Program aborting' + PAUSE + RETURN + ENDIF + +C READ namelist S6 + OPEN(1,File=TRIM(FILEIN), ACCESS='SEQUENTIAL') + dynS6 = '-' + ns6 = -1 + hypS6(:,:) = 1 + matS6(:) = '-' + READ(1,NML=S6,END=5007,ERR=5007) + + IF ((dynS6.NE.'I').AND.(dynS6.NE.'M'))THEN + TYPE *, ' Check dynS6 in namelist S6' + TYPE *, ' Program aborting' + PAUSE + STOP + ENDIF + + IF (ns6.LT.2) THEN + TYPE *, ' Check ns6 in namelist S6' + TYPE *, ' Program aborting' + PAUSE + STOP + ENDIF + + IF (dynS6.EQ.'I') THEN + DO J = 1,ns6 + IF (hypS6(J,1).LE.0) THEN + TYPE *, ' Check hypS6 in namelist S6' + TYPE *, ' Program aborting' + PAUSE + STOP + ENDIF + ENDDO + ELSEIF (dynS6.EQ.'M') THEN + DO J = 1,ns6 + DO K = 1,ns6 + IF (hypS6(J,K).LE.0) THEN + TYPE *, ' Check hypS6 in namelist S6' + TYPE *, ' Program aborting' + PAUSE + STOP + ENDIF + ENDDO + ENDDO + ENDIF + + IF ((matS6(1).EQ.'-').OR.((matS6(1).NE.'a') + # .AND.(matS6(1).NE.'H').AND.(matS6(1).NE.'G') + # .AND.(matS6(1).NE.'c').AND.(matS6(1).NE.'F') + # .AND.(matS6(1).NE.'R'))) THEN + TYPE *, ' Check matS6 in namelist S6' + TYPE *, ' Program aborting' + PAUSE + STOP + ENDIF + DO I = 2,6 + IF ((matS6(I).NE.'-').AND.(matS6(I).NE.'a') + # .AND.(matS6(I).NE.'H').AND.(matS6(I).NE.'G') + # .AND.(matS6(I).NE.'c').AND.(matS6(I).NE.'F') + # .AND.(matS6(I).NE.'R')) THEN + TYPE *, ' Check matS6 in namelist S6' + TYPE *, ' Program aborting' + PAUSE + STOP + ENDIF + ENDDO + ENDIF + CLOSE(1) + +C FIND namelist prior + OPEN(1,File=TRIM(FILEIN), ACCESS='SEQUENTIAL') + IFAIL = -1 + DO WHILE (.NOT.EOF(1)) + READ(1,'(A)') STR + IF (INDEX(STR,'&prior').GT.0) IFAIL = 0 + ENDDO + CLOSE(1) + IF (IFAIL.EQ.-1) THEN + TYPE *, ' Namelist prior not found' + TYPE *, ' Program aborting' + PAUSE + RETURN + ENDIF +C READ namelist prior + OPEN(1,File=TRIM(FILEIN), ACCESS='SEQUENTIAL') + nt = 0 + pdftheta(:) = ' ' + hyptheta(:,:) = -1 + READ(1,NML = prior,END=5008,ERR=5008) + IF (nt.LE.0) THEN + TYPE *, ' Check nt in namelist prior' + TYPE *, ' Program aborting' + PAUSE + STOP + ENDIF + IF (nt.GT.200) THEN + TYPE *, ' nt is too large ' + TYPE *, ' Program aborting' + PAUSE + STOP + ENDIF + IF (estimation.EQ.'BA') THEN + DO I = 1,nt + WRITE(IC,'(I3)') I + IF ((pdftheta(I).NE.'BE').AND.(pdftheta(I).NE.'NT').AND. + # (pdftheta(I).NE.'IG')) THEN + TYPE *, ' Check pdftheta('//IC//') in namelist prior' + TYPE *, ' Program aborting' + PAUSE + STOP + ENDIF + IF (hyptheta(3,I).GT.hyptheta(4,I)) THEN + TYPE *, ' Check hyptheta('//IC//') in namelist prior' + TYPE *, ' Program aborting' + PAUSE + STOP + ENDIF + IF (pdftheta(I).EQ.'BE') THEN + IF (hyptheta(3,I).LT.hyptheta(4,I)) THEN + IF ((hyptheta(1,I).LE.0.).OR.(hyptheta(2,I).LE.0.).OR. + # (hyptheta(3,I).GT.hyptheta(4,I))) THEN + TYPE *, ' Check hyptheta('//IC//') in namelist prior' + TYPE *, ' Program aborting' + PAUSE + STOP + ENDIF + ENDIF + ELSEIF (pdftheta(I).EQ.'NT') THEN + IF (hyptheta(3,I).LT.hyptheta(4,I)) THEN + IF ((hyptheta(2,I).LE.0.).OR.(hyptheta(3,I).GT.hyptheta(4,I))) + # THEN + TYPE *, ' Check hyptheta('//IC//') in namelist prior' + TYPE *, ' Program aborting' + PAUSE + STOP + ENDIF + ENDIF + ELSEIF (pdftheta(I).EQ.'IG') THEN + IF (hyptheta(3,I).LT.hyptheta(4,I)) THEN + IF ((hyptheta(1,I).LE.0.).OR.(hyptheta(2,I).LE.0.).OR. + # (hyptheta(3,I).GT.hyptheta(4,I)).OR.(hyptheta(3,I).LT.0.))THEN + TYPE *, ' Check hyptheta('//IC//') in namelist prior' + TYPE *, ' Program aborting' + PAUSE + STOP + ENDIF + ENDIF + ENDIF + ENDDO + ELSE + DO I = 1,nt ! ML check + WRITE(IC,'(I3)') I + IF (hyptheta(3,I).GT.hyptheta(4,I)) THEN + TYPE *, ' Check hyptheta('//IC//') in namelist prior' + TYPE *, ' Program aborting' + PAUSE + STOP + ENDIF + ENDDO + ENDIF + CLOSE(1) + +C FIND namelist mcmc + OPEN(1,File=TRIM(FILEIN), ACCESS='SEQUENTIAL') + IFAIL = -1 + DO WHILE (.NOT.EOF(1)) + READ(1,'(A)') STR + IF (INDEX(STR,'&mcmc').GT.0) IFAIL = 0 + ENDDO + CLOSE(1) + IF (IFAIL.EQ.-1) THEN + TYPE *, ' Namelist mcmc not found' + TYPE *, ' Program aborting' + PAUSE + RETURN + ENDIF + +C READ namelist mcmc + OPEN(1,File=TRIM(FILEIN), ACCESS='SEQUENTIAL') + seed = 0 + thin = 1 + burnin = 1000 + simulrec = 5000 + sampler = 'SL' + Ssampler = 'GCK' + hbl = 1 + MargLik = 'N' + READ(1,NML=mcmc,END=5009,ERR=5009) + IF ((seed.LT.0).OR.(seed.GT.999)) THEN + TYPE *, ' Check seed in namelist mcmc' + TYPE *, ' Program aborting' + PAUSE + STOP + ENDIF + IF (thin.LT.1) THEN + TYPE *, ' Check thin in namelist mcmc' + TYPE *, ' Program aborting' + PAUSE + STOP + ENDIF + IF (burnin.LE.0) THEN + TYPE *, ' Check burnin in namelist mcmc' + TYPE *, ' Program aborting' + PAUSE + STOP + ENDIF + IF (simulrec.LE.1) THEN + TYPE *, ' Check simulrec in namelist mcmc' + TYPE *, ' Program aborting' + PAUSE + STOP + ENDIF + IF ((sampler.NE.'SL').AND.(sampler.NE.'MH')) THEN + TYPE *, ' Check sampler in namelist mcmc' + TYPE *, ' Program aborting' + PAUSE + STOP + ENDIF + +c IF ((Ssampler.NE.'GCK').AND.(Ssampler.NE.'AMH') +c # .AND.(Ssampler.NE.'MH ')) THEN +c TYPE *, ' Check Ssampler in namelist mcmc' +c TYPE *, ' Program aborting' +c PAUSE +c STOP +c ENDIF +c IF ((hbl.GT.1).AND.(Ssampler.EQ.'GCK')) THEN +c TYPE *, ' Check hbl in namelist mcmc' +c TYPE *, ' Program aborting' +c PAUSE +c STOP +c ENDIF + + CLOSE(1) + +C FIND namelist dataset + OPEN(1,File=TRIM(FILEIN), ACCESS='SEQUENTIAL') + IFAIL = -1 + DO WHILE (.NOT.EOF(1)) + READ(1,'(A)') STR + IF (INDEX(STR,'&dataset').GT.0) IFAIL = 0 + ENDDO + CLOSE(1) + IF (IFAIL.EQ.-1) THEN + TYPE *, ' Namelist dataset not found' + TYPE *, ' Program aborting' + PAUSE + RETURN + ENDIF +C READ namelist dataset + OPEN(1,File=TRIM(FILEIN), ACCESS='SEQUENTIAL') + ny = -1 + nz = -1 + nf = 0 + datasim = 'N' + READ(1,NML=dataset,END=5010,ERR=5010) + IF ((T.LE.0).OR.(T.GT.3000)) THEN + TYPE *, ' Check T in namelist dataset (T<=3000)' + TYPE *, ' Program aborting' + PAUSE + STOP + ENDIF + IF (ny.LE.0) THEN + TYPE *, ' Check ny in namelist dataset' + TYPE *, ' Program aborting' + PAUSE + STOP + ENDIF + IF (nz.LT.0) THEN + TYPE *, ' Check nz in namelist dataset' + TYPE *, ' Program aborting' + PAUSE + STOP + ENDIF + IF (nf.LT.0) THEN + TYPE *, ' Check nf in namelist dataset' + TYPE *, ' Program aborting' + PAUSE + STOP + ENDIF + IF (T.LT.hbl) THEN + TYPE *, ' Check hbl in namelist mcmc (hbl > T)' + TYPE *, ' Program aborting' + PAUSE + STOP + ENDIF + IF ((datasim.NE.'N').AND.(datasim.NE.'n').AND. + & (datasim.NE.'y').AND.(datasim.NE.'Y')) THEN + datasim = 'N' + ENDIF + + CLOSE(1) + +C ----------------------------------------------------------------------- +C ASSIGN discrete latent variables: INFOS (9 x nv) +C by cols: S1,S2,...,SNV; with nv <=6 +C by row: the 1st contains the # of matrices affected by Si +C the 2nd-3rd etc point to c (1),H (2),G (3),a (4),F (5),R (6) +C the 8-th row contains the # of states +C the 9-th row spec. the dynamic of Sj (0-deterministic,1=Indep,2=Markov) +C nstot: total # of states i.e. ns1 x ns2 x ...x nsv +C np(1): total # of psi parameters +C np(2): total # of idependent PSI-Dirichlet vectors +C np(3): max # of hyperparameters for psi +C ----------------------------------------------------------------------- + INFOS(:,:) = 0 + INFOS(8,:) = 1 ! number of states + ns(:) = 1 + np(:) = 0 + IF (nv.GT.0) THEN + ALLOCATE(matS(6,6),dynS(6),nstateS(6)) + matS(:,1) = matS1(:) + matS(:,2) = matS2(:) + matS(:,3) = matS3(:) + matS(:,4) = matS4(:) + matS(:,5) = matS5(:) + matS(:,6) = matS6(:) + hypS(:,:,1) = hypS1(:,:) + hypS(:,:,2) = hypS2(:,:) + hypS(:,:,3) = hypS3(:,:) + hypS(:,:,4) = hypS4(:,:) + hypS(:,:,5) = hypS5(:,:) + hypS(:,:,6) = hypS6(:,:) + dynS(1) = dynS1 + dynS(2) = dynS2 + dynS(3) = dynS3 + dynS(4) = dynS4 + dynS(5) = dynS5 + dynS(6) = dynS6 + nstateS(1) = ns1 + nstateS(2) = ns2 + nstateS(3) = ns3 + nstateS(4) = ns4 + nstateS(5) = ns5 + nstateS(6) = ns6 + IMAX = MAXLOC(nstateS(1:nv)) + np(2) = 0 + np(3) = nstateS(IMAX(1)) + DO 50 J = 1,nv + K = 0 + DO 40 I = 1,6 + IF(matS(I,J).EQ.'c') THEN + K = K + 1 + IND = 1 + INFOS(K+1,J) = IND ! Matrices affected by SJ + ENDIF + IF(matS(I,J).EQ.'H') THEN + K = K + 1 + IND = 2 + INFOS(K+1,J) = IND + ENDIF + IF(matS(I,J).EQ.'G') THEN + K = K + 1 + IND = 3 + INFOS(K+1,J) = IND + ENDIF + IF(matS(I,J).EQ.'a') THEN + K = K + 1 + IND = 4 + INFOS(K+1,J) = IND + ENDIF + IF(matS(I,J).EQ.'F') THEN + K = K + 1 + IND = 5 + INFOS(K+1,J) = IND + ENDIF + IF(matS(I,J).EQ.'R') THEN + K = K + 1 + IND = 6 + INFOS(K+1,J) = IND + ENDIF +40 CONTINUE + INFOS(1,J) = K ! # of matrix affected by SJ + INFOS(8,J) = nstateS(J) ! # of states for SJ + IF (dynS(J).EQ.'I') THEN + INFOS(9,J) = 1 ! dynamics for Sj + np(2) = np(2) + 1 + np(1) = np(1) + nstateS(J)-1 + ELSEIF (dynS(J).EQ.'M') THEN + INFOS(9,J) = 2 + np(2) = np(2) + nstateS(J) + np(1) = np(1) + (nstateS(J)-1)*nstateS(J) + ENDIF +50 CONTINUE + + DO 60 I = 1,nv + DO 60 J = 1,INFOS(1,I) +60 ns(INFOS(J+1,I)) = INFOS(8,I) + nstot = PRODUCT(INFOS(8,1:nv)) ! total # of states + + DEALLOCATE(matS,dynS,nstateS) + ENDIF + + GO TO 7777 + +5000 TYPE *,'Input file not found' + TYPE *,'Program aborting' + PAUSE + STOP + +5001 TYPE *,'Input error in namelist ssm' + TYPE *,'Program aborting' + PAUSE + STOP +5002 TYPE *,'Input error in namelist S1 ' + TYPE *,'Program aborting' + PAUSE + STOP +5003 TYPE *,'Input error in namelist S2 ' + TYPE *,'Program aborting' + PAUSE + STOP +5004 TYPE *,'Input error in namelist S3 ' + TYPE *,'Program aborting' + PAUSE + STOP +5005 TYPE *,'Input error in namelist S4 ' + TYPE *,'Program aborting' + PAUSE + STOP +5006 TYPE *,'Input error in namelist S5 ' + TYPE *,'Program aborting' + PAUSE + STOP +5007 TYPE *,'Input error in namelist S6 ' + TYPE *,'Program aborting' + PAUSE + STOP +5008 TYPE *,'Input error in namelist prior' + TYPE *,'Program aborting' + PAUSE + STOP +5009 TYPE *,'Input error in namelist mcmc' + TYPE *,'Program aborting' + PAUSE + STOP +5010 TYPE *,'Input error in namelist dataset' + TYPE *,'Program aborting' + PAUSE + STOP + +7777 RETURN END diff --git a/int2seq.for b/int2seq.for index d7038bf139398ef9b6f58ab9b5f658ab091cb268..a1df49a636bc7a9ade5e22f23f7530c28d549513 100644 --- a/int2seq.for +++ b/int2seq.for @@ -1,18 +1,18 @@ -C ------------------------------------------------------------ -C INT2SEQ converts integers into the S-sequence -C int = integer to be converted -C nv = # of S variables -C INFOS = info for S-var -C SEQ = S-sequence -C IS = map to c, H, G, etc -C Developed by A.Rossi, C.Planas and G.Fiorentini -C -C Copyright (C) 2010-2014 European Commission -C +C ------------------------------------------------------------ +C INT2SEQ converts integers into the S-sequence +C int = integer to be converted +C nv = # of S variables +C INFOS = info for S-var +C SEQ = S-sequence +C IS = map to c, H, G, etc +C Developed by A.Rossi, C.Planas and G.Fiorentini +C +C Copyright (C) 2010-2014 European Commission +C C This file is part of Program DMM C -C DMM is free software developed at the Joint Research Centre of the -C European Commission: you can redistribute it and/or modify it under +C DMM is free software developed at the Joint Research Centre of the +C European Commission: you can redistribute it and/or modify it under C the terms of the GNU General Public License as published by C the Free Software Foundation, either version 3 of the License, or C (at your option) any later version. @@ -23,35 +23,35 @@ C MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the C GNU General Public License for more details. C C You should have received a copy of the GNU General Public License -C along with DMM. If not, see <http://www.gnu.org/licenses/>. -C ----------------------------------------------------------------------- - SUBROUTINE INT2SEQ(int,nv,INFOS,SEQ,IS) -C INPUT - INTEGER int,nv,INFOS(9,6) -C OUTPUT - INTEGER SEQ(nv),IS(6) -C LOCALS - INTEGER M,i,j,k,ns(nv) - - IS(:) = 1 - SEQ(:) = 1 - ns(1:nv) = INFOS(8,1:nv) - j = int - i = nv - DO WHILE (i.GT.1) - M = PRODUCT(ns(nv-i+2:nv)) - DO 10 k = 1,ns(nv-i+1) - IF (j.LE.k*M) THEN - SEQ(nv-i+1) = k - GOTO 11 - ENDIF -10 CONTINUE -11 j = j-(k-1)*M - i = i - 1 - ENDDO - SEQ(nv) = j - DO 20 i = 1,nv - DO 20 j = 1,INFOS(1,i) -20 IS(INFOS(j+1,i)) = SEQ(i) - RETURN +C along with DMM. If not, see <http://www.gnu.org/licenses/>. +C ----------------------------------------------------------------------- + SUBROUTINE INT2SEQ(int,nv,INFOS,SEQ,IS) +C INPUT + INTEGER int,nv,INFOS(9,6) +C OUTPUT + INTEGER SEQ(nv),IS(6) +C LOCALS + INTEGER M,i,j,k,ns(nv) + + IS(:) = 1 + SEQ(:) = 1 + ns(1:nv) = INFOS(8,1:nv) + j = int + i = nv + DO WHILE (i.GT.1) + M = PRODUCT(ns(nv-i+2:nv)) + DO 10 k = 1,ns(nv-i+1) + IF (j.LE.k*M) THEN + SEQ(nv-i+1) = k + GOTO 11 + ENDIF +10 CONTINUE +11 j = j-(k-1)*M + i = i - 1 + ENDDO + SEQ(nv) = j + DO 20 i = 1,nv + DO 20 j = 1,INFOS(1,i) +20 IS(INFOS(j+1,i)) = SEQ(i) + RETURN END diff --git a/int2seq2.for b/int2seq2.for index f7c68fc0032531f585fc1b44289836963c8bc9ad..7be780e87869d9b7404429f496f9789a2a1dfbef 100644 --- a/int2seq2.for +++ b/int2seq2.for @@ -1,17 +1,17 @@ -C ------------------------------------------------------------ -C INT2SEQ2 converts integers into the S-sequence -C int = integer to be converted -C nv = # of S variables -C INFOS = info for S-var -C SEQ = S-sequence -C Developed by A.Rossi, C.Planas and G.Fiorentini -C -C Copyright (C) 2010-2014 European Commission -C +C ------------------------------------------------------------ +C INT2SEQ2 converts integers into the S-sequence +C int = integer to be converted +C nv = # of S variables +C INFOS = info for S-var +C SEQ = S-sequence +C Developed by A.Rossi, C.Planas and G.Fiorentini +C +C Copyright (C) 2010-2014 European Commission +C C This file is part of Program DMM C -C DMM is free software developed at the Joint Research Centre of the -C European Commission: you can redistribute it and/or modify it under +C DMM is free software developed at the Joint Research Centre of the +C European Commission: you can redistribute it and/or modify it under C the terms of the GNU General Public License as published by C the Free Software Foundation, either version 3 of the License, or C (at your option) any later version. @@ -22,24 +22,24 @@ C MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the C GNU General Public License for more details. C C You should have received a copy of the GNU General Public License -C along with DMM. If not, see <http://www.gnu.org/licenses/>. -C ----------------------------------------------------------------------- - SUBROUTINE int2seq2(int,nv,ns,SEQ) -C INPUT - INTEGER nv,ns - INTEGER(KIND=8) int -C OUTPUT - INTEGER SEQ(nv) -C LOCALS - INTEGER I - INTEGER(KIND=8) ik - - SEQ(:) = 1 - ik = int-1 - DO i = 1,nv - SEQ(i) = mod(ik,ns)+1 - ik = ik/ns - ENDDO - - RETURN +C along with DMM. If not, see <http://www.gnu.org/licenses/>. +C ----------------------------------------------------------------------- + SUBROUTINE int2seq2(int,nv,ns,SEQ) +C INPUT + INTEGER nv,ns + INTEGER(KIND=8) int +C OUTPUT + INTEGER SEQ(nv) +C LOCALS + INTEGER I + INTEGER(KIND=8) ik + + SEQ(:) = 1 + ik = int-1 + DO i = 1,nv + SEQ(i) = mod(ik,ns)+1 + ik = ik/ns + ENDDO + + RETURN END diff --git a/invf.for b/invf.for index 7429c9f1433384e53fbd5961b1e8fb9324cb08d3..e7fa291261cf07f2a45a989af8c9801a8e49227a 100644 --- a/invf.for +++ b/invf.for @@ -1,23 +1,23 @@ -C ---------------------------------------------------------------------- -C INVF computes the inverse of the np x np matrix (A + k*B) when k->inf. -C Developed by A.Rossi, C.Planas and G.Fiorentini -C -C CARE!! A and B must have the following structure: -C A = [a11 a12 -C a12' a22], where a22 is (np-nq) x (np-nq) of full rank -C -C B = [b1 0 -C 0 0], where b1 is nq x nq of full rank -C -C OUTPUT: Am, Bm: inv(A+kB) = Am+(1/k)Bm-(1/k^2)Bm*A*Bm+O(1/k^3) -C FFF: Bm*A*Bm -C -C Copyright (C) 2010-2014 European Commission -C +C ---------------------------------------------------------------------- +C INVF computes the inverse of the np x np matrix (A + k*B) when k->inf. +C Developed by A.Rossi, C.Planas and G.Fiorentini +C +C CARE!! A and B must have the following structure: +C A = [a11 a12 +C a12' a22], where a22 is (np-nq) x (np-nq) of full rank +C +C B = [b1 0 +C 0 0], where b1 is nq x nq of full rank +C +C OUTPUT: Am, Bm: inv(A+kB) = Am+(1/k)Bm-(1/k^2)Bm*A*Bm+O(1/k^3) +C FFF: Bm*A*Bm +C +C Copyright (C) 2010-2014 European Commission +C C This file is part of Program DMM C -C DMM is free software developed at the Joint Research Centre of the -C European Commission: you can redistribute it and/or modify it under +C DMM is free software developed at the Joint Research Centre of the +C European Commission: you can redistribute it and/or modify it under C the terms of the GNU General Public License as published by C the Free Software Foundation, either version 3 of the License, or C (at your option) any later version. @@ -28,101 +28,101 @@ C MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the C GNU General Public License for more details. C C You should have received a copy of the GNU General Public License -C along with DMM. If not, see <http://www.gnu.org/licenses/>. -C ----------------------------------------------------------------------- - SUBROUTINE INVF(A,B,np,nq,Am,Bm,FFF) -C INPUT - INTEGER np,nq - DOUBLE PRECISION A(np,np),B(np,np) -C OUTPUT - DOUBLE PRECISION Am(np,np),Bm(np,np),FFF(np,np) -C LOCALS - INTEGER IFAIL,IPIV(np),I,J - DOUBLE PRECISION Q1(np,nq),Q2(np,np-nq),V(np-nq,np-nq), - 1 VV(nq,nq),M(nq,np-nq),Q1A(nq,np-nq),Q2Ainv(np-nq,np-nq), - 3 AQ2inv(np-nq,np-nq),AQ2(np-nq,np-nq),BmA(np,np) - DOUBLE PRECISION W(np),WORK(64*np) - DOUBLE PRECISION ZERO - DATA ZERO/0.0D0/ - EXTERNAL DSYEV,DGETRF,DGETRI - - Q1(:,:) = ZERO - Q2(:,:) = ZERO - V(:,:) = A(nq+1:np,nq+1:np) ! V = A22 - -C [V,W] = eig(A(nq+1:np,nq+1:np)) - IFAIL = 0 -c CALL F02FAF('V','U',np-nq,V,np-nq,W(1:np-nq),WORK,64*np,IFAIL) - CALL DSYEV('V','U',np-nq,V,np-nq,W(1:np-nq),WORK,64*np,IFAIL) - -C Q2(nq+1:np,:) = V*W^-.5 - DO 10 J = 1,np-nq -10 Q2(nq+1:np,J) = V(:,J)/dsqrt(W(J)) - -c [VV,W]=eig(B(1:nq,1:nq)); - VV(:,:) = B(1:nq,1:nq) - IFAIL = 0 -c CALL F02FAF('V','U',nq,VV,nq,W(1:nq),WORK,64*np,IFAIL) - CALL DSYEV('V','U',nq,VV,nq,W(1:nq),WORK,64*np,IFAIL) - -C Q1(1:nq,1:nq) = VV*W^-.5; - DO 20 I = 1,nq -20 Q1(1:nq,I) = VV(1:nq,I)/dsqrt(W(I)) - -c M =-Q1(1:nq,:)'*A(1:nq,nq+1:np)*Q2(nq+1:np,:)*inv(A(nq+1:np,nq+1:np)*Q2(nq+1:np,:)) - DO 30 I = 1, np-nq - DO 30 J = 1, np-nq -30 AQ2(I,J) = SUM(A(I+nq,1+nq:np)*Q2(1+nq:np,J)) - - IFAIL = 0 -C CALL F07ADF(np-nq,np-nq,AQ2,np-nq,IPIV(1:np-nq),IFAIL) -C CALL F07AJF(np-nq,AQ2,np-nq,IPIV(1:np-nq),WORK,64*np,IFAIL) - CALL DGETRF(np-nq,np-nq,AQ2,np-nq,IPIV(1:np-nq),IFAIL) - CALL DGETRI(np-nq,AQ2,np-nq,IPIV(1:np-nq),WORK,64*np,IFAIL) - - AQ2inv(:,:) = AQ2(:,:) - - DO 40 I=1,nq - DO 40 J=1,np-nq -40 Q1A(I,J) = SUM(Q1(:,I)*A(1:nq,J+nq)) - -C Q2(nq+1:np,:)*inv(A(nq+1:np,nq+1:np)*Q2(nq+1:np,:)) - DO 50 I=1,np-nq - DO 50 J=1,np-nq -50 Q2Ainv(I,J) = SUM(Q2(I+nq,1:np-nq)*AQ2inv(1:np-nq,J)) - - DO 60 I=1,nq - DO 60 J=1,np-nq -60 M(I,J) = -SUM(Q1A(I,1:np-nq)*Q2Ainv(1:np-nq,J)) - -c Q1(nq+1:np,:) = M' - DO 70 I = 1,nq - DO 70 J = 1,np-nq -70 Q1(nq+J,I) = M(I,J) - -C Am = Q2*Q2' - Am(:,:) = ZERO - DO 80 I=nq+1,np - Am(I,I) = SUM(Q2(I,1:np-nq)*Q2(I,1:np-nq)) - DO 80 J=nq+1,I-1 - Am(I,J) = SUM(Q2(I,1:np-nq)*Q2(J,1:np-nq)) -80 Am(J,I) = Am(I,J) - -C Bm = Q1*Q1' - DO 90 I=1,np - DO 90 J=1,I - Bm(I,J) = SUM(Q1(I,1:nq)*Q1(J,1:nq)) -90 Bm(J,I) = Bm(I,J) - -C FFF = Bm*A*Bm - DO 100 I=1,np - DO 100 J=1,np -100 BmA(I,J) = SUM(Bm(I,1:np)*A(1:np,J)) - - DO 110 I=1,np - DO 110 J=1,I - FFF(I,J) = SUM(BmA(I,1:np)*Bm(1:np,J)) -110 FFF(J,I) = FFF(I,J) - - RETURN +C along with DMM. If not, see <http://www.gnu.org/licenses/>. +C ----------------------------------------------------------------------- + SUBROUTINE INVF(A,B,np,nq,Am,Bm,FFF) +C INPUT + INTEGER np,nq + DOUBLE PRECISION A(np,np),B(np,np) +C OUTPUT + DOUBLE PRECISION Am(np,np),Bm(np,np),FFF(np,np) +C LOCALS + INTEGER IFAIL,IPIV(np),I,J + DOUBLE PRECISION Q1(np,nq),Q2(np,np-nq),V(np-nq,np-nq), + 1 VV(nq,nq),M(nq,np-nq),Q1A(nq,np-nq),Q2Ainv(np-nq,np-nq), + 3 AQ2inv(np-nq,np-nq),AQ2(np-nq,np-nq),BmA(np,np) + DOUBLE PRECISION W(np),WORK(64*np) + DOUBLE PRECISION ZERO + DATA ZERO/0.0D0/ + EXTERNAL DSYEV,DGETRF,DGETRI + + Q1(:,:) = ZERO + Q2(:,:) = ZERO + V(:,:) = A(nq+1:np,nq+1:np) ! V = A22 + +C [V,W] = eig(A(nq+1:np,nq+1:np)) + IFAIL = 0 +c CALL F02FAF('V','U',np-nq,V,np-nq,W(1:np-nq),WORK,64*np,IFAIL) + CALL DSYEV('V','U',np-nq,V,np-nq,W(1:np-nq),WORK,64*np,IFAIL) + +C Q2(nq+1:np,:) = V*W^-.5 + DO 10 J = 1,np-nq +10 Q2(nq+1:np,J) = V(:,J)/dsqrt(W(J)) + +c [VV,W]=eig(B(1:nq,1:nq)); + VV(:,:) = B(1:nq,1:nq) + IFAIL = 0 +c CALL F02FAF('V','U',nq,VV,nq,W(1:nq),WORK,64*np,IFAIL) + CALL DSYEV('V','U',nq,VV,nq,W(1:nq),WORK,64*np,IFAIL) + +C Q1(1:nq,1:nq) = VV*W^-.5; + DO 20 I = 1,nq +20 Q1(1:nq,I) = VV(1:nq,I)/dsqrt(W(I)) + +c M =-Q1(1:nq,:)'*A(1:nq,nq+1:np)*Q2(nq+1:np,:)*inv(A(nq+1:np,nq+1:np)*Q2(nq+1:np,:)) + DO 30 I = 1, np-nq + DO 30 J = 1, np-nq +30 AQ2(I,J) = SUM(A(I+nq,1+nq:np)*Q2(1+nq:np,J)) + + IFAIL = 0 +C CALL F07ADF(np-nq,np-nq,AQ2,np-nq,IPIV(1:np-nq),IFAIL) +C CALL F07AJF(np-nq,AQ2,np-nq,IPIV(1:np-nq),WORK,64*np,IFAIL) + CALL DGETRF(np-nq,np-nq,AQ2,np-nq,IPIV(1:np-nq),IFAIL) + CALL DGETRI(np-nq,AQ2,np-nq,IPIV(1:np-nq),WORK,64*np,IFAIL) + + AQ2inv(:,:) = AQ2(:,:) + + DO 40 I=1,nq + DO 40 J=1,np-nq +40 Q1A(I,J) = SUM(Q1(:,I)*A(1:nq,J+nq)) + +C Q2(nq+1:np,:)*inv(A(nq+1:np,nq+1:np)*Q2(nq+1:np,:)) + DO 50 I=1,np-nq + DO 50 J=1,np-nq +50 Q2Ainv(I,J) = SUM(Q2(I+nq,1:np-nq)*AQ2inv(1:np-nq,J)) + + DO 60 I=1,nq + DO 60 J=1,np-nq +60 M(I,J) = -SUM(Q1A(I,1:np-nq)*Q2Ainv(1:np-nq,J)) + +c Q1(nq+1:np,:) = M' + DO 70 I = 1,nq + DO 70 J = 1,np-nq +70 Q1(nq+J,I) = M(I,J) + +C Am = Q2*Q2' + Am(:,:) = ZERO + DO 80 I=nq+1,np + Am(I,I) = SUM(Q2(I,1:np-nq)*Q2(I,1:np-nq)) + DO 80 J=nq+1,I-1 + Am(I,J) = SUM(Q2(I,1:np-nq)*Q2(J,1:np-nq)) +80 Am(J,I) = Am(I,J) + +C Bm = Q1*Q1' + DO 90 I=1,np + DO 90 J=1,I + Bm(I,J) = SUM(Q1(I,1:nq)*Q1(J,1:nq)) +90 Bm(J,I) = Bm(I,J) + +C FFF = Bm*A*Bm + DO 100 I=1,np + DO 100 J=1,np +100 BmA(I,J) = SUM(Bm(I,1:np)*A(1:np,J)) + + DO 110 I=1,np + DO 110 J=1,I + FFF(I,J) = SUM(BmA(I,1:np)*Bm(1:np,J)) +110 FFF(J,I) = FFF(I,J) + + RETURN END diff --git a/invfbis.for b/invfbis.for index 353c32f61690361dac19f366eb7129a7cd593299..dedc621888ba6bba53e2e59efd029452fb47ab5b 100644 --- a/invfbis.for +++ b/invfbis.for @@ -1,23 +1,23 @@ -C ---------------------------------------------------------------------- -C INVFBIS computes the inverse of the np x np matrix (A + k*B) when k->inf. -C Developed by A.Rossi, C.Planas and G.Fiorentini -C -C CARE!! A and B must have the following form -C A = [a11 a12 -C a12' a22], where a22 is a (np-nq)x(np-nq) matrix of full rank -C -C B psd with rank(B) = nq <= np -C -C -C OUTPUT: Am, Bm: inv(A+kB) = Am + (1/k)Bm - (1/k^2)Bm*A*Bm + O(1/k^3) -C FFF: Bm*A*Bm -C -C Copyright (C) 2010-2014 European Commission -C +C ---------------------------------------------------------------------- +C INVFBIS computes the inverse of the np x np matrix (A + k*B) when k->inf. +C Developed by A.Rossi, C.Planas and G.Fiorentini +C +C CARE!! A and B must have the following form +C A = [a11 a12 +C a12' a22], where a22 is a (np-nq)x(np-nq) matrix of full rank +C +C B psd with rank(B) = nq <= np +C +C +C OUTPUT: Am, Bm: inv(A+kB) = Am + (1/k)Bm - (1/k^2)Bm*A*Bm + O(1/k^3) +C FFF: Bm*A*Bm +C +C Copyright (C) 2010-2014 European Commission +C C This file is part of Program DMM C -C DMM is free software developed at the Joint Research Centre of the -C European Commission: you can redistribute it and/or modify it under +C DMM is free software developed at the Joint Research Centre of the +C European Commission: you can redistribute it and/or modify it under C the terms of the GNU General Public License as published by C the Free Software Foundation, either version 3 of the License, or C (at your option) any later version. @@ -28,87 +28,87 @@ C MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the C GNU General Public License for more details. C C You should have received a copy of the GNU General Public License -C along with DMM. If not, see <http://www.gnu.org/licenses/>. -C ----------------------------------------------------------------------- - SUBROUTINE INVFBIS(A,B,np,nq,Am,Bm,FFF) -C INPUT - INTEGER NP,NQ - DOUBLE PRECISION A(np,np),B(np,np) -C OUTPUT - DOUBLE PRECISION Am(np,np),Bm(np,np),FFF(np,np) -C LOCALS - INTEGER IFAIL,i,j - DOUBLE PRECISION ZERO - - DOUBLE PRECISION Q(np,np) - DOUBLE PRECISION DM(np),PM(np,np),PMA(np,np),COM(np,np), - 1 WORK(3*np),W(np) - - EXTERNAL DSYEV - DATA ZERO/0.0D0/ - -C Inverse of A + k*M, A, M NxN, A psd, M pd -C Write M = PM*DM*PM' -C MA = (PM*DM^-.5)'*A*(PM*DM^-.5) -C and MA = PMA * DMA * PMA' -C then Q = PM*DM^-.5*PMA verifies: -C Q'*M*Q = I and Q'*A*Q = DMA -C implying: A + k*M = inv(Q)'*DMA*inv(Q) + k inv(Q)'*inv(Q) -C = inv(Q)'*(DMA + k I) inv(Q) -C so inv(A + k*M) = Q * inv(DMA + k I) * Q' -C -C CARE!!!! inv (k*A + (1-k)*M) = (1/k) * Q *inv(DMA + (1-k)/k)) Q' -C --------------------------------------------- -C [COM DM] = eig(M) - IFAIL = -1 - PM(:,:) = A(:,:) -C CALL F02FAF('V','U',np,PM,np,DM,WORK,3*np,IFAIL) ! COM = P - CALL DSYEV('V','U',np,PM,np,DM,WORK,3*np,IFAIL) ! COM = P - -C PM = PM * DM^-.5 - DO 10 J = 1,np -10 PM(:,J) = PM(:,J)/dsqrt(DM(J)) - -C COM = (PM*DM^-.5)'*FI - COM(:,:) = ZERO - DO 20 I = 1,np - DO 20 J = 1,np -20 COM(I,J) = SUM(PM(1:np,I)*B(1:np,J)) - -C Q = (PM*DM^-.5)'*FI*(PM*DM^-.5) - PMA(:,:) = ZERO - DO 30 I = 1,np - PMA(I,I) = SUM(COM(I,1:np)*PM(1:np,I)) - DO 30 J = 1,I-1 - PMA(I,J) = SUM(COM(I,1:np)*PM(1:np,J)) -30 PMA(J,I)=PMA(I,J) - -C [PMA,W] = eig(A2) - IFAIL = -1 -C CALL F02FAF('V','U',np,PMA,np,W,WORK,3*np,IFAIL) - CALL DSYEV('V','U',np,PMA,np,W,WORK,3*np,IFAIL) -C Q = PM*DM^-.5*PMA - Q(:,:)=ZERO - DO 40 I = 1,np - DO 40 J = 1,np -40 Q(I,J) = SUM(PM(I,1:np)*PMA(1:np,J)) - -C Am = Q1*Q1' Q1 p x p-q - DO 110 I=1,np - Am(I,I) = SUM(Q(I,1:np-nq)*Q(I,1:np-nq)) - DO 110 J=1,I-1 - Am(I,J) = SUM(Q(I,1:np-nq)*Q(J,1:np-nq)) -110 Am(J,I) = Am(I,J) - -C Bm = Q2*Q2'/W(np-nq+1:np) Q2 p x q - DO 120 I=1,np - DO 120 J=1,np -120 Bm(I,J) = SUM(Q(I,np-nq+1:np)*Q(J,np-nq+1:np)/W(np-nq+1:np)) - -C FFF is Q2 * Q2 / W^2 - DO 130 I=1,np - DO 130 J=1,np -130 FFF(I,J) =SUM(Q(I,np-nq+1:np)*Q(J,np-nq+1:np)/W(np-nq+1:np)**2.D0) - - RETURN +C along with DMM. If not, see <http://www.gnu.org/licenses/>. +C ----------------------------------------------------------------------- + SUBROUTINE INVFBIS(A,B,np,nq,Am,Bm,FFF) +C INPUT + INTEGER NP,NQ + DOUBLE PRECISION A(np,np),B(np,np) +C OUTPUT + DOUBLE PRECISION Am(np,np),Bm(np,np),FFF(np,np) +C LOCALS + INTEGER IFAIL,i,j + DOUBLE PRECISION ZERO + + DOUBLE PRECISION Q(np,np) + DOUBLE PRECISION DM(np),PM(np,np),PMA(np,np),COM(np,np), + 1 WORK(3*np),W(np) + + EXTERNAL DSYEV + DATA ZERO/0.0D0/ + +C Inverse of A + k*M, A, M NxN, A psd, M pd +C Write M = PM*DM*PM' +C MA = (PM*DM^-.5)'*A*(PM*DM^-.5) +C and MA = PMA * DMA * PMA' +C then Q = PM*DM^-.5*PMA verifies: +C Q'*M*Q = I and Q'*A*Q = DMA +C implying: A + k*M = inv(Q)'*DMA*inv(Q) + k inv(Q)'*inv(Q) +C = inv(Q)'*(DMA + k I) inv(Q) +C so inv(A + k*M) = Q * inv(DMA + k I) * Q' +C +C CARE!!!! inv (k*A + (1-k)*M) = (1/k) * Q *inv(DMA + (1-k)/k)) Q' +C --------------------------------------------- +C [COM DM] = eig(M) + IFAIL = -1 + PM(:,:) = A(:,:) +C CALL F02FAF('V','U',np,PM,np,DM,WORK,3*np,IFAIL) ! COM = P + CALL DSYEV('V','U',np,PM,np,DM,WORK,3*np,IFAIL) ! COM = P + +C PM = PM * DM^-.5 + DO 10 J = 1,np +10 PM(:,J) = PM(:,J)/dsqrt(DM(J)) + +C COM = (PM*DM^-.5)'*FI + COM(:,:) = ZERO + DO 20 I = 1,np + DO 20 J = 1,np +20 COM(I,J) = SUM(PM(1:np,I)*B(1:np,J)) + +C Q = (PM*DM^-.5)'*FI*(PM*DM^-.5) + PMA(:,:) = ZERO + DO 30 I = 1,np + PMA(I,I) = SUM(COM(I,1:np)*PM(1:np,I)) + DO 30 J = 1,I-1 + PMA(I,J) = SUM(COM(I,1:np)*PM(1:np,J)) +30 PMA(J,I)=PMA(I,J) + +C [PMA,W] = eig(A2) + IFAIL = -1 +C CALL F02FAF('V','U',np,PMA,np,W,WORK,3*np,IFAIL) + CALL DSYEV('V','U',np,PMA,np,W,WORK,3*np,IFAIL) +C Q = PM*DM^-.5*PMA + Q(:,:)=ZERO + DO 40 I = 1,np + DO 40 J = 1,np +40 Q(I,J) = SUM(PM(I,1:np)*PMA(1:np,J)) + +C Am = Q1*Q1' Q1 p x p-q + DO 110 I=1,np + Am(I,I) = SUM(Q(I,1:np-nq)*Q(I,1:np-nq)) + DO 110 J=1,I-1 + Am(I,J) = SUM(Q(I,1:np-nq)*Q(J,1:np-nq)) +110 Am(J,I) = Am(I,J) + +C Bm = Q2*Q2'/W(np-nq+1:np) Q2 p x q + DO 120 I=1,np + DO 120 J=1,np +120 Bm(I,J) = SUM(Q(I,np-nq+1:np)*Q(J,np-nq+1:np)/W(np-nq+1:np)) + +C FFF is Q2 * Q2 / W^2 + DO 130 I=1,np + DO 130 J=1,np +130 FFF(I,J) =SUM(Q(I,np-nq+1:np)*Q(J,np-nq+1:np)/W(np-nq+1:np)**2.D0) + + RETURN END diff --git a/invnormcdf.for b/invnormcdf.for index 7b9e4cd9173dfbba95d6f2ff36676909b5534ee2..b11cb4af247ef0897b6560837ce2daccf42927af 100644 --- a/invnormcdf.for +++ b/invnormcdf.for @@ -1,18 +1,18 @@ -C -------------------------------------------------------------------------------- -C INVNORMCDF Computes the inverse of the N(0,1) cdf according to -C the algorithm shown in Wichura, M.J. (1988). -C Algorithm AS 241: The Percentage Points of the Normal Distribution. -C Applied Statistics, 37, 477-484. -C -C Copyright (C) 2002 Przemyslaw Sliwa and Jason H. Stover. -C -C Recoded in Fortran by A. Rossi +C -------------------------------------------------------------------------------- +C INVNORMCDF Computes the inverse of the N(0,1) cdf according to +C the algorithm shown in Wichura, M.J. (1988). +C Algorithm AS 241: The Percentage Points of the Normal Distribution. +C Applied Statistics, 37, 477-484. +C +C Copyright (C) 2002 Przemyslaw Sliwa and Jason H. Stover. +C +C Recoded in Fortran by A. Rossi C Copyright (C) 2014 European Commission -C +C C This file is part of Program DMM C -C DMM is free software developed at the Joint Research Centre of the -C European Commission: you can redistribute it and/or modify it under +C DMM is free software developed at the Joint Research Centre of the +C European Commission: you can redistribute it and/or modify it under C the terms of the GNU General Public License as published by C the Free Software Foundation, either version 3 of the License, or C (at your option) any later version. @@ -23,126 +23,126 @@ C MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the C GNU General Public License for more details. C C You should have received a copy of the GNU General Public License -C along with DMM. If not, see <http://www.gnu.org/licenses/>. -C -------------------------------------------------------------------------------- - DOUBLE PRECISION FUNCTION INVNORMCDF(P) -C INPUT - DOUBLE PRECISION P -C LOCALS - DOUBLE PRECISION r,x,pp,dP -C EXTERNAL FUNCIONS - DOUBLE PRECISION small,intermediate,tail - - IF (P.GE.1.D0) THEN - INVNORMCDF = 1.D100 - RETURN - ENDIF - - IF (P.LE.0.D0) THEN - INVNORMCDF = -1.D100 - RETURN - ENDIF - - dP = P - 0.5D0 - IF (DABS(dP).LE.0.425D0) THEN - INVNORMCDF = small(dP) - RETURN - ENDIF - - IF (P.LT.0.5D0) THEN - pp = P - ELSE - pp = 1.D0-P - ENDIF - - r = dsqrt(-dlog(pp)) - IF (r.LE.5.D0) THEN - x = intermediate(r) - ELSE - x = tail(r) - ENDIF - - IF (P.LT.0.5D0) THEN - INVNORMCDF = -x - ELSE - INVNORMCDF = x - ENDIF - - RETURN - END - -C ************************************************************* - double precision function small(q) - double precision q,r,a(8),b(8) - double precision rat_eval - data a/3.387132872796366608,133.14166789178437745, - * 1971.5909503065514427, 13731.693765509461125, - * 45921.953931549871457, 67265.770927008700853, - * 33430.575583588128105, 2509.0809287301226727/ - data b/ 1.D0,42.313330701600911252, - * 687.1870074920579083, 5394.1960214247511077, - * 21213.794301586595867, 39307.89580009271061, - * 28729.085735721942674, 5226.495278852854561/ - - r = .180625D0 - q * q - small = q * rat_eval(a, 8, b, 8, r) - - return - end -C ************************************************************* - double precision function intermediate(r) - double precision r,a(8),b(8) - double precision rat_eval - data a/1.42343711074968357734, 4.6303378461565452959, - * 5.7694972214606914055, 3.64784832476320460504, - * 1.27045825245236838258, 0.24178072517745061177, - * 0.0227238449892691845833, 7.7454501427834140764d-4/ - data b/ 1.D0, 2.05319162663775882187, - * 1.6763848301838038494, 0.68976733498510000455, - * 0.14810397642748007459, 0.0151986665636164571966, - * 5.475938084995344946d-4, 1.05075007164441684324d-9/ - - intermediate = rat_eval(a, 8, b, 8, r-1.6D0) - - return - end -C ************************************************************* - double precision function tail(r) - double precision r,a(8),b(8) - double precision rat_eval - data a/6.6579046435011037772, 5.4637849111641143699, - * 1.7848265399172913358, 0.29656057182850489123, - * 0.026532189526576123093, 0.0012426609473880784386, - * 2.71155556874348757815d-5, 2.01033439929228813265d-7/ - data b/ 1.D0, 0.59983220655588793769, - * 0.13692988092273580531, 0.0148753612908506148525, - * 7.868691311456132591d-4, 1.8463183175100546818d-5, - * 1.4215117583164458887d-7, 2.04426310338993978564d-15/ - - tail = rat_eval(a, 8, b, 8, (r - 5.D0)) - - return - end -C ************************************************************* - double precision function rat_eval(a,na,b,nb,x) - integer na,nb,i - double precision a(na),b(nb),x,u,v - - u = a(na) - do i=na,2,-1 - u = x*u+a(i-1) - enddo - - v = b(nb) - do i=nb,2,-1 - v = x*v+b(i-1) - enddo - rat_eval = u/v - - return - end -C ************************************************************* - - - - +C along with DMM. If not, see <http://www.gnu.org/licenses/>. +C -------------------------------------------------------------------------------- + DOUBLE PRECISION FUNCTION INVNORMCDF(P) +C INPUT + DOUBLE PRECISION P +C LOCALS + DOUBLE PRECISION r,x,pp,dP +C EXTERNAL FUNCIONS + DOUBLE PRECISION small,intermediate,tail + + IF (P.GE.1.D0) THEN + INVNORMCDF = 1.D100 + RETURN + ENDIF + + IF (P.LE.0.D0) THEN + INVNORMCDF = -1.D100 + RETURN + ENDIF + + dP = P - 0.5D0 + IF (DABS(dP).LE.0.425D0) THEN + INVNORMCDF = small(dP) + RETURN + ENDIF + + IF (P.LT.0.5D0) THEN + pp = P + ELSE + pp = 1.D0-P + ENDIF + + r = dsqrt(-dlog(pp)) + IF (r.LE.5.D0) THEN + x = intermediate(r) + ELSE + x = tail(r) + ENDIF + + IF (P.LT.0.5D0) THEN + INVNORMCDF = -x + ELSE + INVNORMCDF = x + ENDIF + + RETURN + END + +C ************************************************************* + double precision function small(q) + double precision q,r,a(8),b(8) + double precision rat_eval + data a/3.387132872796366608,133.14166789178437745, + * 1971.5909503065514427, 13731.693765509461125, + * 45921.953931549871457, 67265.770927008700853, + * 33430.575583588128105, 2509.0809287301226727/ + data b/ 1.D0,42.313330701600911252, + * 687.1870074920579083, 5394.1960214247511077, + * 21213.794301586595867, 39307.89580009271061, + * 28729.085735721942674, 5226.495278852854561/ + + r = .180625D0 - q * q + small = q * rat_eval(a, 8, b, 8, r) + + return + end +C ************************************************************* + double precision function intermediate(r) + double precision r,a(8),b(8) + double precision rat_eval + data a/1.42343711074968357734, 4.6303378461565452959, + * 5.7694972214606914055, 3.64784832476320460504, + * 1.27045825245236838258, 0.24178072517745061177, + * 0.0227238449892691845833, 7.7454501427834140764d-4/ + data b/ 1.D0, 2.05319162663775882187, + * 1.6763848301838038494, 0.68976733498510000455, + * 0.14810397642748007459, 0.0151986665636164571966, + * 5.475938084995344946d-4, 1.05075007164441684324d-9/ + + intermediate = rat_eval(a, 8, b, 8, r-1.6D0) + + return + end +C ************************************************************* + double precision function tail(r) + double precision r,a(8),b(8) + double precision rat_eval + data a/6.6579046435011037772, 5.4637849111641143699, + * 1.7848265399172913358, 0.29656057182850489123, + * 0.026532189526576123093, 0.0012426609473880784386, + * 2.71155556874348757815d-5, 2.01033439929228813265d-7/ + data b/ 1.D0, 0.59983220655588793769, + * 0.13692988092273580531, 0.0148753612908506148525, + * 7.868691311456132591d-4, 1.8463183175100546818d-5, + * 1.4215117583164458887d-7, 2.04426310338993978564d-15/ + + tail = rat_eval(a, 8, b, 8, (r - 5.D0)) + + return + end +C ************************************************************* + double precision function rat_eval(a,na,b,nb,x) + integer na,nb,i + double precision a(na),b(nb),x,u,v + + u = a(na) + do i=na,2,-1 + u = x*u+a(i-1) + enddo + + v = b(nb) + do i=nb,2,-1 + v = x*v+b(i-1) + enddo + rat_eval = u/v + + return + end +C ************************************************************* + + + + diff --git a/kf.for b/kf.for index 889766e044d8e7d803306b4e7152634125cdaff1..971e2a834ae9642c039ca08a54930e11c69e7b71 100644 --- a/kf.for +++ b/kf.for @@ -1,32 +1,32 @@ -C -------------------------------------------------------------------- -C KF implements the Kalman filter recursions and returns -C XT = E[x(t)|t], PT = V[x(t)|t] -C LIKE(t) = log-likelihood(t), t = 1,...,nobs -C Developed by A.Rossi, C.Planas and G.Fiorentini -C -C State-space format: y(t) = c(t)z(t) + H(t)x(t) + G(t)u(t) -C x(t) = a(t) + F(t)x(t-1) + R(t)u(t) -C -C y(t) (ny x 1) ny = # of endogenous series -C z(t) (nz x 1) nz = # of exogenous series -C x(t) (nx x 1) nx = # of continous states -C u(t) (nu x 1) nu = # of shocks -C c(t) (ny x nz x ns1) ns1 = # of states for c(t) -C H(t) (ny x nx x ns2) ns2 = # of states for S2(t) -C G(t) (ny x nu x ns3) ns3 = # of states for S3(t) -C a(t) (nx x ns4) ns4 = # of states for S4(t) -C F(t) (nx x nx x ns5) ns5 = # of states for S5(t) -C R(t) (nx x nu x ns6) ns6 = # of states for S6(t) -C -C d(1): order of integration of the system -C d(2): number of non-stationary elements -C -C Copyright (C) 2010-2014 European Commission -C +C -------------------------------------------------------------------- +C KF implements the Kalman filter recursions and returns +C XT = E[x(t)|t], PT = V[x(t)|t] +C LIKE(t) = log-likelihood(t), t = 1,...,nobs +C Developed by A.Rossi, C.Planas and G.Fiorentini +C +C State-space format: y(t) = c(t)z(t) + H(t)x(t) + G(t)u(t) +C x(t) = a(t) + F(t)x(t-1) + R(t)u(t) +C +C y(t) (ny x 1) ny = # of endogenous series +C z(t) (nz x 1) nz = # of exogenous series +C x(t) (nx x 1) nx = # of continous states +C u(t) (nu x 1) nu = # of shocks +C c(t) (ny x nz x ns1) ns1 = # of states for c(t) +C H(t) (ny x nx x ns2) ns2 = # of states for S2(t) +C G(t) (ny x nu x ns3) ns3 = # of states for S3(t) +C a(t) (nx x ns4) ns4 = # of states for S4(t) +C F(t) (nx x nx x ns5) ns5 = # of states for S5(t) +C R(t) (nx x nu x ns6) ns6 = # of states for S6(t) +C +C d(1): order of integration of the system +C d(2): number of non-stationary elements +C +C Copyright (C) 2010-2014 European Commission +C C This file is part of Program DMM C -C DMM is free software developed at the Joint Research Centre of the -C European Commission: you can redistribute it and/or modify it under +C DMM is free software developed at the Joint Research Centre of the +C European Commission: you can redistribute it and/or modify it under C the terms of the GNU General Public License as published by C the Free Software Foundation, either version 3 of the License, or C (at your option) any later version. @@ -37,141 +37,141 @@ C MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the C GNU General Public License for more details. C C You should have received a copy of the GNU General Public License -C along with DMM. If not, see <http://www.gnu.org/licenses/>. -C -------------------------------------------------------------------- - SUBROUTINE KF(nobs,d,ny,nz,nx,nu,ns,S,yk,IYK,c,H,G,a,F,R, - 1 XT,PT,LIKE) -C INPUT - INTEGER nobs,d(2),ny,nz,nx,nu,ns(6),S(nobs,6),IYK(nobs,ny+1) - DOUBLE PRECISION yk(nobs,ny+nz),c(ny,max(nz,1),ns(1)), - 1 H(ny,nx,ns(2)),G(ny,nu,ns(3)),a(nx,ns(4)),F(nx,nx,ns(5)), - 2 R(nx,nu,ns(6)) - -C OUTPUT - DOUBLE PRECISION LIKE(nobs) - DOUBLE PRECISION XT(0:nobs,nx),PT(0:nobs,nx,nx) - -C LOCALS - INTEGER imain,iny,I,J,IFAIL - DOUBLE PRECISION RSS,DETV,X1(nx),P1(nx,nx),FP(nx,nx), - 1 INN(ny),HP1(ny,nx),V(ny,ny),Vinv(ny,ny),COM(ny+1,ny), - 2 RG(nx,ny),HPV(nx,ny) - - LIKE(d(1)+1:nobs) = 0.D0 - DO 1000 imain = d(1)+1,nobs - iny = IYK(imain,ny+1) - -C ------------------------------------ -C Prediction x1 = c+F*x0 -C Prediction var. P1 = F*p0*F'+ R*R' -C ------------------------------------ - DO 10 I=1,nx -10 X1(I) = a(I,S(imain,4))+SUM(F(I,:,S(imain,5))*XT(imain-1,:)) - - DO 20 I=1,nx - DO 20 J=1,nx -20 FP(I,J) = SUM(F(I,:,S(imain,5))*PT(imain-1,:,J)) - - DO 30 I=1,nx - P1(I,I) = SUM(FP(I,:)*F(I,:,S(imain,5))) - + + SUM(R(I,1:nu,S(imain,6))*R(I,1:nu,S(imain,6))) - DO 30 J=1,I-1 - P1(I,J) = SUM(FP(I,:)*F(J,:,S(imain,5))) - + + SUM(R(I,1:nu,S(imain,6))*R(J,1:nu,S(imain,6))) -30 P1(J,I) = P1(I,J) - -C ------------------------------- -C Innovations: INN = yk-H*X1-c*z -C ------------------------------- - DO 40 I=1,iny -40 INN(I)= yk(imain,IYK(imain,I)) - + - SUM(H(IYK(imain,I),1:nx,S(imain,2))*X1(1:nx)) - + - SUM(c(IYK(imain,I),1:nz,S(imain,1))*yk(imain,ny+1:ny+nz)) - -C --------------------------------------------------------- -C Innovation variance V = H*P1*H' + G*G' + H*R*G' + G*R'*H' -C --------------------------------------------------------- - DO 50 I=1,iny - DO 50 J=1,nx -50 HP1(I,J) = SUM(H(IYK(imain,I),1:nx,S(imain,2))*P1(1:nx,J)) - - DO 55 I=1,nx - DO 55 J=1,iny -55 RG(I,J) = SUM(R(I,1:nu,S(imain,6)) - # * G(IYK(imain,J),1:nu,S(imain,3))) ! R*G' - - DO 56 I=1,iny - DO 56 J=1,iny -56 COM(I,J)=SUM(H(IYK(imain,I),1:nx,S(imain,2))*RG(1:nx,J)) ! H*R*G' - - DO 60 I=1,iny - V(I,I) = SUM(HP1(I,1:nx)*H(IYK(imain,I),1:nx,S(imain,2))) + - # SUM(G(IYK(imain,I),1:nu,S(imain,3))* - # G(IYK(imain,I),1:nu,S(imain,3))) + 2.*COM(I,I) - - DO 60 J=1,I-1 - V(I,J) = SUM(HP1(I,1:nx)*H(IYK(imain,J),1:nx,S(imain,2)))+ - # SUM(G(IYK(imain,I),1:nu,S(imain,3))* - # G(IYK(imain,J),1:nu,S(imain,3)))+COM(I,J)+COM(J,I) -60 V(J,I) = V(I,J) - -C ------------------------------------------------------------------- -C Updating equations: -C x0 = x1 + (P1*H'+R*G')*Vinv*INN -C p0 = p1 - (P1*H'+R*G')*Vinv*(P1*H'+R*G')' -C ------------------------------------------------------------------- - IF (iny.GT.0) THEN - COM(1:iny,1:iny) = V(1:iny,1:iny) - IFAIL = -1 -C CALL F01ADF(iny,COM(1:iny+1,1:iny),iny+1,IFAIL) - CALL DPOTRF('L',iny,COM(1:iny,1:iny),iny,IFAIL) ! COM = L*L' - DETV = 1.D0 ! det(L) - DO I=1,iny - DETV = DETV*COM(I,I) - ENDDO - CALL DPOTRI('L',iny,COM(1:iny,1:ny),iny,IFAIL) ! COM = VV^-1 - - DO 70 I=1,iny - Vinv(I,I) = COM(I,I) - DO 70 J=1,I-1 - Vinv(I,J) = COM(I,J) -70 Vinv(J,I) = Vinv(I,J) - - DO 90 I=1,nx - DO 90 J=1,iny -90 HPV(I,J) = SUM((HP1(1:iny,I)+RG(I,1:iny))*Vinv(1:iny,J)) - - DO 100 I=1,nx -100 XT(imain,I) = X1(I)+SUM(HPV(I,1:iny)*INN(1:iny)) - - DO 110 I=1,nx - PT(imain,I,I) = P1(I,I) - + - SUM(HPV(I,1:iny)*(HP1(1:iny,I)+RG(I,1:iny))) - DO 110 J=1,I-1 - PT(imain,I,J) = P1(I,J) - + - SUM(HPV(I,1:iny)*(HP1(1:iny,J)+RG(J,1:iny))) -110 PT(imain,J,I) = PT(imain,I,J) - -C --------------------------------------------- -C Log-Likelihood = -(RSS + ln(det(V))/2 -C RSS = INN'*Vinv*INN -C --------------------------------------------- -c IFAIL=-1 -c CALL F03ABF(V(1:iny,1:iny),iny,iny,DETV,COM(1:iny,1),IFAIL) - - RSS = 0.D0 - DO 120 I=1,iny - DO 120 J=1,iny -120 RSS = RSS + INN(I)*Vinv(I,J)*INN(J) - - LIKE(imain) = -.5D0*(RSS + 2.D0*DLOG(DETV)) - # - iny/2.D0*DLOG(2.*3.141592653589793D0) - ELSE - - XT(imain,1:nx) = X1(1:nx) - PT(imain,1:nx,1:nx) = P1(1:nx,1:nx) - -1000 ENDIF - - RETURN +C along with DMM. If not, see <http://www.gnu.org/licenses/>. +C -------------------------------------------------------------------- + SUBROUTINE KF(nobs,d,ny,nz,nx,nu,ns,S,yk,IYK,c,H,G,a,F,R, + 1 XT,PT,LIKE) +C INPUT + INTEGER nobs,d(2),ny,nz,nx,nu,ns(6),S(nobs,6),IYK(nobs,ny+1) + DOUBLE PRECISION yk(nobs,ny+nz),c(ny,max(nz,1),ns(1)), + 1 H(ny,nx,ns(2)),G(ny,nu,ns(3)),a(nx,ns(4)),F(nx,nx,ns(5)), + 2 R(nx,nu,ns(6)) + +C OUTPUT + DOUBLE PRECISION LIKE(nobs) + DOUBLE PRECISION XT(0:nobs,nx),PT(0:nobs,nx,nx) + +C LOCALS + INTEGER imain,iny,I,J,IFAIL + DOUBLE PRECISION RSS,DETV,X1(nx),P1(nx,nx),FP(nx,nx), + 1 INN(ny),HP1(ny,nx),V(ny,ny),Vinv(ny,ny),COM(ny+1,ny), + 2 RG(nx,ny),HPV(nx,ny) + + LIKE(d(1)+1:nobs) = 0.D0 + DO 1000 imain = d(1)+1,nobs + iny = IYK(imain,ny+1) + +C ------------------------------------ +C Prediction x1 = c+F*x0 +C Prediction var. P1 = F*p0*F'+ R*R' +C ------------------------------------ + DO 10 I=1,nx +10 X1(I) = a(I,S(imain,4))+SUM(F(I,:,S(imain,5))*XT(imain-1,:)) + + DO 20 I=1,nx + DO 20 J=1,nx +20 FP(I,J) = SUM(F(I,:,S(imain,5))*PT(imain-1,:,J)) + + DO 30 I=1,nx + P1(I,I) = SUM(FP(I,:)*F(I,:,S(imain,5))) + + + SUM(R(I,1:nu,S(imain,6))*R(I,1:nu,S(imain,6))) + DO 30 J=1,I-1 + P1(I,J) = SUM(FP(I,:)*F(J,:,S(imain,5))) + + + SUM(R(I,1:nu,S(imain,6))*R(J,1:nu,S(imain,6))) +30 P1(J,I) = P1(I,J) + +C ------------------------------- +C Innovations: INN = yk-H*X1-c*z +C ------------------------------- + DO 40 I=1,iny +40 INN(I)= yk(imain,IYK(imain,I)) + + - SUM(H(IYK(imain,I),1:nx,S(imain,2))*X1(1:nx)) + + - SUM(c(IYK(imain,I),1:nz,S(imain,1))*yk(imain,ny+1:ny+nz)) + +C --------------------------------------------------------- +C Innovation variance V = H*P1*H' + G*G' + H*R*G' + G*R'*H' +C --------------------------------------------------------- + DO 50 I=1,iny + DO 50 J=1,nx +50 HP1(I,J) = SUM(H(IYK(imain,I),1:nx,S(imain,2))*P1(1:nx,J)) + + DO 55 I=1,nx + DO 55 J=1,iny +55 RG(I,J) = SUM(R(I,1:nu,S(imain,6)) + # * G(IYK(imain,J),1:nu,S(imain,3))) ! R*G' + + DO 56 I=1,iny + DO 56 J=1,iny +56 COM(I,J)=SUM(H(IYK(imain,I),1:nx,S(imain,2))*RG(1:nx,J)) ! H*R*G' + + DO 60 I=1,iny + V(I,I) = SUM(HP1(I,1:nx)*H(IYK(imain,I),1:nx,S(imain,2))) + + # SUM(G(IYK(imain,I),1:nu,S(imain,3))* + # G(IYK(imain,I),1:nu,S(imain,3))) + 2.*COM(I,I) + + DO 60 J=1,I-1 + V(I,J) = SUM(HP1(I,1:nx)*H(IYK(imain,J),1:nx,S(imain,2)))+ + # SUM(G(IYK(imain,I),1:nu,S(imain,3))* + # G(IYK(imain,J),1:nu,S(imain,3)))+COM(I,J)+COM(J,I) +60 V(J,I) = V(I,J) + +C ------------------------------------------------------------------- +C Updating equations: +C x0 = x1 + (P1*H'+R*G')*Vinv*INN +C p0 = p1 - (P1*H'+R*G')*Vinv*(P1*H'+R*G')' +C ------------------------------------------------------------------- + IF (iny.GT.0) THEN + COM(1:iny,1:iny) = V(1:iny,1:iny) + IFAIL = -1 +C CALL F01ADF(iny,COM(1:iny+1,1:iny),iny+1,IFAIL) + CALL DPOTRF('L',iny,COM(1:iny,1:iny),iny,IFAIL) ! COM = L*L' + DETV = 1.D0 ! det(L) + DO I=1,iny + DETV = DETV*COM(I,I) + ENDDO + CALL DPOTRI('L',iny,COM(1:iny,1:ny),iny,IFAIL) ! COM = VV^-1 + + DO 70 I=1,iny + Vinv(I,I) = COM(I,I) + DO 70 J=1,I-1 + Vinv(I,J) = COM(I,J) +70 Vinv(J,I) = Vinv(I,J) + + DO 90 I=1,nx + DO 90 J=1,iny +90 HPV(I,J) = SUM((HP1(1:iny,I)+RG(I,1:iny))*Vinv(1:iny,J)) + + DO 100 I=1,nx +100 XT(imain,I) = X1(I)+SUM(HPV(I,1:iny)*INN(1:iny)) + + DO 110 I=1,nx + PT(imain,I,I) = P1(I,I) + + - SUM(HPV(I,1:iny)*(HP1(1:iny,I)+RG(I,1:iny))) + DO 110 J=1,I-1 + PT(imain,I,J) = P1(I,J) + + - SUM(HPV(I,1:iny)*(HP1(1:iny,J)+RG(J,1:iny))) +110 PT(imain,J,I) = PT(imain,I,J) + +C --------------------------------------------- +C Log-Likelihood = -(RSS + ln(det(V))/2 +C RSS = INN'*Vinv*INN +C --------------------------------------------- +c IFAIL=-1 +c CALL F03ABF(V(1:iny,1:iny),iny,iny,DETV,COM(1:iny,1),IFAIL) + + RSS = 0.D0 + DO 120 I=1,iny + DO 120 J=1,iny +120 RSS = RSS + INN(I)*Vinv(I,J)*INN(J) + + LIKE(imain) = -.5D0*(RSS + 2.D0*DLOG(DETV)) + # - iny/2.D0*DLOG(2.*3.141592653589793D0) + ELSE + + XT(imain,1:nx) = X1(1:nx) + PT(imain,1:nx,1:nx) = P1(1:nx,1:nx) + +1000 ENDIF + + RETURN END diff --git a/kf2.for b/kf2.for index 2f81f7677468031777cc84958deab8c742fb4695..84a018986972223c703b1e9c5a62de119dc60e48 100644 --- a/kf2.for +++ b/kf2.for @@ -1,32 +1,32 @@ -C -------------------------------------------------------------------- -C KF2 (no missing values) implements the Kalman filter recursions and returns -C XT = E[x(t)|t], PT = V[x(t)|t] -C LIKE(t) = log-likelihood(t), t = 1,...,nobs -C Developed by A.Rossi, C.Planas and G.Fiorentini -C -C State-space format: y(t) = c(t)z(t) + H(t)x(t) + G(t)u(t) -C x(t) = a(t) + F(t)x(t-1) + R(t)u(t) -C -C y(t) (ny x 1) ny = # of endogenous series -C z(t) (nz x 1) nz = # of exogenous series -C x(t) (nx x 1) nx = # of continous states -C u(t) (nu x 1) nu = # of shocks -C c(t) (ny x nz x ns1) ns1 = # of states for c(t) -C H(t) (ny x nx x ns2) ns2 = # of states for S2(t) -C G(t) (ny x nu x ns3) ns3 = # of states for S3(t) -C a(t) (nx x ns4) ns4 = # of states for S4(t) -C F(t) (nx x nx x ns5) ns5 = # of states for S5(t) -C R(t) (nx x nu x ns6) ns6 = # of states for S6(t) -C -C d(1): order of integration of the system -C d(2): number of non-stationary elements -C -C Copyright (C) 2010-2014 European Commission -C +C -------------------------------------------------------------------- +C KF2 (no missing values) implements the Kalman filter recursions and returns +C XT = E[x(t)|t], PT = V[x(t)|t] +C LIKE(t) = log-likelihood(t), t = 1,...,nobs +C Developed by A.Rossi, C.Planas and G.Fiorentini +C +C State-space format: y(t) = c(t)z(t) + H(t)x(t) + G(t)u(t) +C x(t) = a(t) + F(t)x(t-1) + R(t)u(t) +C +C y(t) (ny x 1) ny = # of endogenous series +C z(t) (nz x 1) nz = # of exogenous series +C x(t) (nx x 1) nx = # of continous states +C u(t) (nu x 1) nu = # of shocks +C c(t) (ny x nz x ns1) ns1 = # of states for c(t) +C H(t) (ny x nx x ns2) ns2 = # of states for S2(t) +C G(t) (ny x nu x ns3) ns3 = # of states for S3(t) +C a(t) (nx x ns4) ns4 = # of states for S4(t) +C F(t) (nx x nx x ns5) ns5 = # of states for S5(t) +C R(t) (nx x nu x ns6) ns6 = # of states for S6(t) +C +C d(1): order of integration of the system +C d(2): number of non-stationary elements +C +C Copyright (C) 2010-2014 European Commission +C C This file is part of Program DMM C -C DMM is free software developed at the Joint Research Centre of the -C European Commission: you can redistribute it and/or modify it under +C DMM is free software developed at the Joint Research Centre of the +C European Commission: you can redistribute it and/or modify it under C the terms of the GNU General Public License as published by C the Free Software Foundation, either version 3 of the License, or C (at your option) any later version. @@ -37,136 +37,136 @@ C MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the C GNU General Public License for more details. C C You should have received a copy of the GNU General Public License -C along with DMM. If not, see <http://www.gnu.org/licenses/>. -C -------------------------------------------------------------------- - SUBROUTINE KF2(nobs,d,ny,nz,nx,nu,ns,S,yk,c,H,G,a,F,R, - 1 XT,PT,LIKE) -C INPUT - INTEGER nobs,d(2),ny,nz,nx,nu,ns(6),S(nobs,6) - DOUBLE PRECISION yk(nobs,ny+nz),c(ny,max(nz,1),ns(1)), - 1 H(ny,nx,ns(2)),G(ny,nu,ns(3)),a(nx,ns(4)),F(nx,nx,ns(5)), - 2 R(nx,nu,ns(6)) - -C OUTPUT - DOUBLE PRECISION LIKE(nobs) - DOUBLE PRECISION XT(0:nobs,nx),PT(0:nobs,nx,nx) - -C LOCALS - INTEGER imain,I,J,IFAIL - DOUBLE PRECISION RSS,DETV,X1(nx),P1(nx,nx),FP(nx,nx), - 1 INN(ny),HP1(ny,nx),V(ny,ny),Vinv(ny,ny),COM(ny+1,ny), - 2 RG(nx,ny),HPV(nx,ny) - - LIKE(d(1)+1:nobs) = 0.D0 - DO 1000 imain = d(1)+1,nobs - -C ------------------------------------ -C Prediction x1 = a+F*x0 -C Prediction var. P1 = F*p0*F'+ R*R' -C ------------------------------------ - DO 10 I=1,nx -10 X1(I) = a(I,S(imain,4))+SUM(F(I,:,S(imain,5))*XT(imain-1,:)) - - DO 20 I=1,nx - DO 20 J=1,nx -20 FP(I,J) = SUM(F(I,:,S(imain,5))*PT(imain-1,:,J)) - - DO 30 I=1,nx - P1(I,I) = SUM(FP(I,:)*F(I,:,S(imain,5))) - + + SUM(R(I,1:nu,S(imain,6))*R(I,1:nu,S(imain,6))) - DO 30 J=1,I-1 - P1(I,J) = SUM(FP(I,:)*F(J,:,S(imain,5))) - + + SUM(R(I,1:nu,S(imain,6))*R(J,1:nu,S(imain,6))) -30 P1(J,I) = P1(I,J) - -C ------------------------------- -C Innovations: INN = yk-H*X1-c*z -C ------------------------------- - DO 40 I=1,ny -40 INN(I) = yk(imain,I) - + - SUM(H(I,1:nx,S(imain,2))*X1(1:nx)) - + - SUM(c(I,1:nz,S(imain,1))*yk(imain,ny+1:ny+nz)) - -C --------------------------------------------------------- -C Innovation variance V = H*P1*H' + G*G' + H*R*G' + G*R'*H' -C --------------------------------------------------------- - DO 50 I=1,ny - DO 50 J=1,nx -50 HP1(I,J) = SUM(H(I,1:nx,S(imain,2))*P1(1:nx,J)) - - DO 55 I=1,nx - DO 55 J=1,ny -55 RG(I,J) = SUM(R(I,1:nu,S(imain,6)) - # * G(J,1:nu,S(imain,3))) ! R*G' - - DO 56 I=1,ny - DO 56 J=1,ny -56 COM(I,J)=SUM(H(I,1:nx,S(imain,2))*RG(1:nx,J)) ! H*R*G' - - DO 60 I=1,ny - V(I,I) = SUM(HP1(I,1:nx)*H(I,1:nx,S(imain,2))) + - # SUM(G(I,1:nu,S(imain,3))* - # G(I,1:nu,S(imain,3))) + 2.*COM(I,I) - - DO 60 J=1,I-1 - V(I,J) = SUM(HP1(I,1:nx)*H(J,1:nx,S(imain,2)))+ - # SUM(G(I,1:nu,S(imain,3))* - # G(J,1:nu,S(imain,3)))+COM(I,J)+COM(J,I) -60 V(J,I) = V(I,J) - -C ------------------------------------------------------------------- -C Updating equations: -C x0 = x1 + (P1*H'+R*G')*Vinv*INN -C p0 = p1 - (P1*H'+R*G')*Vinv*(P1*H'+R*G')' -C ------------------------------------------------------------------- - COM(1:ny,1:ny) = V(1:ny,1:ny) - IFAIL = -1 -c CALL F01ADF(ny,COM(1:ny+1,1:ny),ny+1,IFAIL) - CALL DPOTRF('L',ny,COM(1:ny,1:ny),ny,IFAIL) ! COM = L*L' - DETV = 1.D0 ! det(L) - DO I=1,ny - DETV = DETV*COM(I,I) - ENDDO - CALL DPOTRI('L',ny,COM(1:ny,1:ny),ny,IFAIL) ! COM = VV^-1 - - DO 70 I=1,ny - Vinv(I,I) = COM(I,I) - DO 70 J=1,I-1 - Vinv(I,J) = COM(I,J) -70 Vinv(J,I) = Vinv(I,J) - - DO 90 I=1,nx - DO 90 J=1,ny -90 HPV(I,J) = SUM((HP1(1:ny,I)+RG(I,1:ny))*Vinv(1:ny,J)) - - DO 100 I=1,nx -100 XT(imain,I) = X1(I)+SUM(HPV(I,1:ny)*INN(1:ny)) - - DO 110 I=1,nx - PT(imain,I,I) = P1(I,I) - + - SUM(HPV(I,1:ny)*(HP1(1:ny,I)+RG(I,1:ny))) - DO 110 J=1,I-1 - PT(imain,I,J) = P1(I,J) - + - SUM(HPV(I,1:ny)*(HP1(1:ny,J)+RG(J,1:ny))) -110 PT(imain,J,I) = PT(imain,I,J) - -C --------------------------------------------- -C Log-Likelihood = -(RSS + ln(det(V))/2 -C RSS = INN'*Vinv*INN -C --------------------------------------------- -C IFAIL=-1 -C CALL F03ABF(V(1:ny,1:ny),ny,ny,DETV,COM(1:ny,1),IFAIL) - - RSS = 0.D0 - DO 120 I=1,ny - DO 120 J=1,ny -120 RSS = RSS + INN(I)*Vinv(I,J)*INN(J) - - LIKE(imain) = -.5D0*(RSS + 2.D0*DLOG(DETV)) - # - ny/2.D0*DLOG(2.*3.141592653589793D0) - - -1000 CONTINUE - - RETURN +C along with DMM. If not, see <http://www.gnu.org/licenses/>. +C -------------------------------------------------------------------- + SUBROUTINE KF2(nobs,d,ny,nz,nx,nu,ns,S,yk,c,H,G,a,F,R, + 1 XT,PT,LIKE) +C INPUT + INTEGER nobs,d(2),ny,nz,nx,nu,ns(6),S(nobs,6) + DOUBLE PRECISION yk(nobs,ny+nz),c(ny,max(nz,1),ns(1)), + 1 H(ny,nx,ns(2)),G(ny,nu,ns(3)),a(nx,ns(4)),F(nx,nx,ns(5)), + 2 R(nx,nu,ns(6)) + +C OUTPUT + DOUBLE PRECISION LIKE(nobs) + DOUBLE PRECISION XT(0:nobs,nx),PT(0:nobs,nx,nx) + +C LOCALS + INTEGER imain,I,J,IFAIL + DOUBLE PRECISION RSS,DETV,X1(nx),P1(nx,nx),FP(nx,nx), + 1 INN(ny),HP1(ny,nx),V(ny,ny),Vinv(ny,ny),COM(ny+1,ny), + 2 RG(nx,ny),HPV(nx,ny) + + LIKE(d(1)+1:nobs) = 0.D0 + DO 1000 imain = d(1)+1,nobs + +C ------------------------------------ +C Prediction x1 = a+F*x0 +C Prediction var. P1 = F*p0*F'+ R*R' +C ------------------------------------ + DO 10 I=1,nx +10 X1(I) = a(I,S(imain,4))+SUM(F(I,:,S(imain,5))*XT(imain-1,:)) + + DO 20 I=1,nx + DO 20 J=1,nx +20 FP(I,J) = SUM(F(I,:,S(imain,5))*PT(imain-1,:,J)) + + DO 30 I=1,nx + P1(I,I) = SUM(FP(I,:)*F(I,:,S(imain,5))) + + + SUM(R(I,1:nu,S(imain,6))*R(I,1:nu,S(imain,6))) + DO 30 J=1,I-1 + P1(I,J) = SUM(FP(I,:)*F(J,:,S(imain,5))) + + + SUM(R(I,1:nu,S(imain,6))*R(J,1:nu,S(imain,6))) +30 P1(J,I) = P1(I,J) + +C ------------------------------- +C Innovations: INN = yk-H*X1-c*z +C ------------------------------- + DO 40 I=1,ny +40 INN(I) = yk(imain,I) + + - SUM(H(I,1:nx,S(imain,2))*X1(1:nx)) + + - SUM(c(I,1:nz,S(imain,1))*yk(imain,ny+1:ny+nz)) + +C --------------------------------------------------------- +C Innovation variance V = H*P1*H' + G*G' + H*R*G' + G*R'*H' +C --------------------------------------------------------- + DO 50 I=1,ny + DO 50 J=1,nx +50 HP1(I,J) = SUM(H(I,1:nx,S(imain,2))*P1(1:nx,J)) + + DO 55 I=1,nx + DO 55 J=1,ny +55 RG(I,J) = SUM(R(I,1:nu,S(imain,6)) + # * G(J,1:nu,S(imain,3))) ! R*G' + + DO 56 I=1,ny + DO 56 J=1,ny +56 COM(I,J)=SUM(H(I,1:nx,S(imain,2))*RG(1:nx,J)) ! H*R*G' + + DO 60 I=1,ny + V(I,I) = SUM(HP1(I,1:nx)*H(I,1:nx,S(imain,2))) + + # SUM(G(I,1:nu,S(imain,3))* + # G(I,1:nu,S(imain,3))) + 2.*COM(I,I) + + DO 60 J=1,I-1 + V(I,J) = SUM(HP1(I,1:nx)*H(J,1:nx,S(imain,2)))+ + # SUM(G(I,1:nu,S(imain,3))* + # G(J,1:nu,S(imain,3)))+COM(I,J)+COM(J,I) +60 V(J,I) = V(I,J) + +C ------------------------------------------------------------------- +C Updating equations: +C x0 = x1 + (P1*H'+R*G')*Vinv*INN +C p0 = p1 - (P1*H'+R*G')*Vinv*(P1*H'+R*G')' +C ------------------------------------------------------------------- + COM(1:ny,1:ny) = V(1:ny,1:ny) + IFAIL = -1 +c CALL F01ADF(ny,COM(1:ny+1,1:ny),ny+1,IFAIL) + CALL DPOTRF('L',ny,COM(1:ny,1:ny),ny,IFAIL) ! COM = L*L' + DETV = 1.D0 ! det(L) + DO I=1,ny + DETV = DETV*COM(I,I) + ENDDO + CALL DPOTRI('L',ny,COM(1:ny,1:ny),ny,IFAIL) ! COM = VV^-1 + + DO 70 I=1,ny + Vinv(I,I) = COM(I,I) + DO 70 J=1,I-1 + Vinv(I,J) = COM(I,J) +70 Vinv(J,I) = Vinv(I,J) + + DO 90 I=1,nx + DO 90 J=1,ny +90 HPV(I,J) = SUM((HP1(1:ny,I)+RG(I,1:ny))*Vinv(1:ny,J)) + + DO 100 I=1,nx +100 XT(imain,I) = X1(I)+SUM(HPV(I,1:ny)*INN(1:ny)) + + DO 110 I=1,nx + PT(imain,I,I) = P1(I,I) + + - SUM(HPV(I,1:ny)*(HP1(1:ny,I)+RG(I,1:ny))) + DO 110 J=1,I-1 + PT(imain,I,J) = P1(I,J) + + - SUM(HPV(I,1:ny)*(HP1(1:ny,J)+RG(J,1:ny))) +110 PT(imain,J,I) = PT(imain,I,J) + +C --------------------------------------------- +C Log-Likelihood = -(RSS + ln(det(V))/2 +C RSS = INN'*Vinv*INN +C --------------------------------------------- +C IFAIL=-1 +C CALL F03ABF(V(1:ny,1:ny),ny,ny,DETV,COM(1:ny,1),IFAIL) + + RSS = 0.D0 + DO 120 I=1,ny + DO 120 J=1,ny +120 RSS = RSS + INN(I)*Vinv(I,J)*INN(J) + + LIKE(imain) = -.5D0*(RSS + 2.D0*DLOG(DETV)) + # - ny/2.D0*DLOG(2.*3.141592653589793D0) + + +1000 CONTINUE + + RETURN END diff --git a/kim.for b/kim.for index 9add4071d7a8f25a2a9410c7515643f1d96ced26..24c0d420c11fb26b0b098b28b41eac9525d8b694 100644 --- a/kim.for +++ b/kim.for @@ -1,50 +1,50 @@ -C ------------------------------------------------------------- -C KIM implements the filtering and smoothing algorithm of -C Kim, Journal of Econometrics, 1994 -C Developed by A.Rossi, C.Planas and G.Fiorentini -C -C State-space format: y(t) = c(t)z(t) + H(t)x(t) + G(t)u(t) -C x(t) = a(t) + F(t)x(t-1) + R(t)u(t) -C -C y(t) (ny x 1) ny = # of endogenous series -C z(t) (nz x 1) nz = # of exogenous series -C x(t) (nx x 1) nx = # of continous states -C u(t) (nu x 1) nu = # of shocks -C c(t) (ny x nz x ns1) ns1 = # of states for c(t) -C H(t) (ny x nx x ns2) ns2 = # of states for S2(t) -C G(t) (ny x nu x ns3) ns3 = # of states for S3(t) -C a(t) (nx x ns4) ns4 = # of states for S4(t) -C F(t) (nx x nx x ns5) ns5 = # of states for S5(t) -C R(t) (nx x nu x ns6) ns6 = # of states for S6(t) - -C OUTPUT: -C SFILT = Pr(S(t)|y^t), (nobs x nk) -C SSMOOTH = Pr(S(t)|y^T), (nobs x nk) -C XFILT = E(x(t)|y^t), (nobs x nx) -C XSMOOTH = E(x(t)|y^T), (nobs x nx) -C INN = E(y(t)|y^t-1),(nobs x ny -C -C INTERMEDIATE: -C SP1 = Pr(S(t-1)=i,S(t)=j|y^t) nk x nk -C SP0 = Pr(S(t)=i,S(t+1)=j|y^(t+1)) nk x nk -C X1 = x(t|t-1,i,j) nobs x nx x nk x nk -C P1 = E[(x(t)-X1)^2|y^(t-1)] nobs x nx x nx x nk x nk -C X0 = x(t|t,i,j) nx x nk x nk -C P0 = E[(x(t)-X0)^2|y^t] nx x nx x nk x nk -C XI = x(t|t,i) nobs x nx x nk -C PI = E[(x(t)-XI)^2|y^t] nobs x nx x nx x nk -C V = Var(INN) ny x ny x nk x nk -C -C SPT1 = Pr(S(t)=j,S(t+1)=k|y^T) nk x nk -C XS = E(x(t)|S(t)=j,S(t+1)=k,y^T) nx x nk x nk -C PS = E[(x(t)-XS)^2|S(t)=j,S(t+1)=k,y^T] nx x nx x nk x nk -C -C Copyright (C) 2010-2014 European Commission -C +C ------------------------------------------------------------- +C KIM implements the filtering and smoothing algorithm of +C Kim, Journal of Econometrics, 1994 +C Developed by A.Rossi, C.Planas and G.Fiorentini +C +C State-space format: y(t) = c(t)z(t) + H(t)x(t) + G(t)u(t) +C x(t) = a(t) + F(t)x(t-1) + R(t)u(t) +C +C y(t) (ny x 1) ny = # of endogenous series +C z(t) (nz x 1) nz = # of exogenous series +C x(t) (nx x 1) nx = # of continous states +C u(t) (nu x 1) nu = # of shocks +C c(t) (ny x nz x ns1) ns1 = # of states for c(t) +C H(t) (ny x nx x ns2) ns2 = # of states for S2(t) +C G(t) (ny x nu x ns3) ns3 = # of states for S3(t) +C a(t) (nx x ns4) ns4 = # of states for S4(t) +C F(t) (nx x nx x ns5) ns5 = # of states for S5(t) +C R(t) (nx x nu x ns6) ns6 = # of states for S6(t) + +C OUTPUT: +C SFILT = Pr(S(t)|y^t), (nobs x nk) +C SSMOOTH = Pr(S(t)|y^T), (nobs x nk) +C XFILT = E(x(t)|y^t), (nobs x nx) +C XSMOOTH = E(x(t)|y^T), (nobs x nx) +C INN = E(y(t)|y^t-1),(nobs x ny +C +C INTERMEDIATE: +C SP1 = Pr(S(t-1)=i,S(t)=j|y^t) nk x nk +C SP0 = Pr(S(t)=i,S(t+1)=j|y^(t+1)) nk x nk +C X1 = x(t|t-1,i,j) nobs x nx x nk x nk +C P1 = E[(x(t)-X1)^2|y^(t-1)] nobs x nx x nx x nk x nk +C X0 = x(t|t,i,j) nx x nk x nk +C P0 = E[(x(t)-X0)^2|y^t] nx x nx x nk x nk +C XI = x(t|t,i) nobs x nx x nk +C PI = E[(x(t)-XI)^2|y^t] nobs x nx x nx x nk +C V = Var(INN) ny x ny x nk x nk +C +C SPT1 = Pr(S(t)=j,S(t+1)=k|y^T) nk x nk +C XS = E(x(t)|S(t)=j,S(t+1)=k,y^T) nx x nk x nk +C PS = E[(x(t)-XS)^2|S(t)=j,S(t+1)=k,y^T] nx x nx x nk x nk +C +C Copyright (C) 2010-2014 European Commission +C C This file is part of Program DMM C -C DMM is free software developed at the Joint Research Centre of the -C European Commission: you can redistribute it and/or modify it under +C DMM is free software developed at the Joint Research Centre of the +C European Commission: you can redistribute it and/or modify it under C the terms of the GNU General Public License as published by C the Free Software Foundation, either version 3 of the License, or C (at your option) any later version. @@ -55,372 +55,372 @@ C MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the C GNU General Public License for more details. C C You should have received a copy of the GNU General Public License -C along with DMM. If not, see <http://www.gnu.org/licenses/>. -C ------------------------------------------------------------------------- - SUBROUTINE KIM(nobs,d,ny,nz,nx,nu,ns,nk,nv,np,INFOS,yk,IYK, - 1 c,H,G,a,F,R,psi,ismoother,XSMOOTH,XSSE,SSMOOTH,INN,LIKE) -C INPUT - INTEGER nobs,ny,nz,nx,nu,ns(6),nk,nv,np,ismoother, - 1 d(2),IYK(nobs,ny+1),INFOS(9,6) - DOUBLE PRECISION yk(nobs,ny+nz),c(ny,max(nz,1),ns(1)), - 1 H(ny,nx,ns(2)),G(ny,nu,ns(3)),a(nx,ns(4)),F(nx,nx,ns(5)), - 2 R(nx,nu,ns(6)),psi(max(1,np)) -C OUTPUT - DOUBLE PRECISION XSMOOTH(nobs,nx),XSSE(nobs,nx),SSMOOTH(nobs,nk), - 1 LIKE(nobs),INN(nobs,ny) - -C LOCALS - INTEGER imain,iny,I,J,K,L,IFAIL - INTEGER IPIV(nx),IMAX(1),IS(max(1,d(1)),6),SEQ(1) - DOUBLE PRECISION DETV,RSS,lfy,maxfyss,fsum - DOUBLE PRECISION, ALLOCATABLE:: SP1(:,:),SP0(:,:),X0(:,:,:), - 1 P0(:,:,:,:),X1(:,:,:,:),P1(:,:,:,:,:),fyss(:,:), - 1 XI(:,:,:),PI(:,:,:,:),Pdd(:,:,:),Xdd(:,:),INNIJ(:), - 1 V(:,:),AUX(:,:),AUX1(:,:,:,:),XFILT(:,:),SFILT(:,:), - 1 SPT1(:,:),XS(:,:,:),PS(:,:,:,:),XSC(:,:),PSC(:,:,:),PTIL(:,:), - 1 FP(:,:),HP1(:,:),RG(:,:),COM(:,:),VINV(:,:),HPV(:,:),W(:), - 1 PP1(:,:),PP2(:,:),PP3(:,:),PP4(:,:),PP5(:,:),PP6(:,:),P(:,:) - -C EXTERNAL SUBROUTINES - EXTERNAL DESIGNZ,PPROD,ERGODIC,INT2SEQ,IKF2,KF2,DPOTRF,DPOTRI, - 1 DGETRF,DGETRS - - LIKE(:) = 0.D0 - INN(:,:) = 0.D0 - ALLOCATE(PP1(INFOS(8,1),INFOS(8,1)),PP2(INFOS(8,2),INFOS(8,2)), - 1 PP3(INFOS(8,3),INFOS(8,3)),PP4(INFOS(8,4),INFOS(8,4)), - 1 PP5(INFOS(8,5),INFOS(8,5)),PP6(INFOS(8,6),INFOS(8,6)), - 1 P(nk,nk)) - CALL DESIGNZ(nv,np,psi,INFOS,PP1,PP2,PP3,PP4,PP5,PP6) - CALL PPROD(nv,nk,INFOS,PP1,PP2,PP3,PP4,PP5,PP6,P) - DEALLOCATE(PP1,PP2,PP3,PP4,PP5,PP6) - -C S-filter initialization Pr[S(d-1),S(d)|y^d] -C X-filter initialization - ALLOCATE(SP1(nk,nk),SP0(nk,nk),X0(nx,nk,nk),P0(nx,nx,nk,nk), - 1 X1(nobs,nx,nk,nk),P1(nobs,nx,nx,nk,nk),INNIJ(ny), - 1 XI(nobs,nx,nk),PI(nobs,nx,nx,nk),fyss(nk,nk),V(ny,ny), - 1 AUX(nx,nx),AUX1(nx,nx,nk,nk),XFILT(nobs,nx),SFILT(nobs,nk), - 1 Pdd(MAX(d(1),1),nx,nx),Xdd(MAX(d(1),1),nx),FP(nx,nx),HP1(ny,nx), - 1 RG(nx,ny),COM(ny+1,ny),VINV(ny,ny),HPV(nx,ny)) - - CALL ERGODIC(nk,P,fyss(1:nk,1)) - IF (d(1).LE.1) THEN - RSS = 0.D0 - DO J = 1,nk ! S(d) - DO I = 1,nk ! S(d-1) - CALL INT2SEQ(J,nv,INFOS,SEQ,IS(max(1,d(1)),:)) - CALL IKF2(d,ny,nz,nx,nu,ns,IS(1,:),yk(1,:), - 1 c,H,G,a,F,R,Xdd(1,:),Pdd(1,:,:),LIKE(1)) - - IF (d(1).EQ.0) THEN - X1(1,:,1,1) = Xdd(1,:) ! 0|0 - P1(1,:,:,1,1) = Pdd(1,:,:) - CALL KF2(1,d,ny,nz,nx,nu,ns,IS,yk(1,:),c,H,G,a,F,R, - 1 X1(1:2,:,1,1),P1(1:2,:,:,1,1),LIKE(1)) - SP0(I,J) = P(J,I)*fyss(I,1)*LIKE(1) - - X0(:,I,J) = X1(2,:,1,1) - P0(:,:,I,J) = P1(2,:,:,1,1) - XI(1,:,J) = X1(2,:,1,1) - PI(1,:,:,J) = P1(2,:,:,1,1) - ELSE - SP0(I,J) = P(J,I)*fyss(I,1) - X0(:,I,J) = Xdd(1,:) ! 1|1 - P0(:,:,I,J) = Pdd(1,:,:) - XI(1,:,J) = Xdd(1,:) - PI(1,:,:,J) = Pdd(1,:,:) - ENDIF - RSS = RSS+SP0(I,J) - ENDDO - - ENDDO - ELSE - WRITE(*,*) 'WARNING: d(1)=2 not implemeted yet' - PAUSE - STOP - ENDIF - SP0(:,:) = SP0(:,:)/RSS - DO I =1,nk - SFILT(max(1,d(1)),I) = SUM(SP0(:,I)) - ENDDO - DEALLOCATE(Xdd,Pdd) - -C --------- -C Filtering -C --------- - XFILT(:,:) = 0.D0 - DO 1000 imain=max(2,d(1)+1),nobs - iny = IYK(imain,ny+1) - DO I = 1,nk - DO J = 1,nk - CALL INT2SEQ(J,nv,INFOS,SEQ,IS(1,:)) -C ------------------------------------ -C Prediction x1 = a+F*x0 -C Prediction var. P1 = F*p0*F'+ R*R' -C ------------------------------------ - DO 10 K=1,nx -10 X1(imain,K,I,J)=a(K,IS(1,4))+SUM(F(K,:,IS(1,5))*XI(imain-1,:,I)) - - DO 20 K=1,nx - DO 20 L=1,nx -20 FP(K,L) = SUM(F(K,:,IS(1,5))*PI(imain-1,:,L,I)) - - DO 30 K=1,nx - P1(imain,K,K,I,J) = SUM(FP(K,:)*F(K,:,IS(1,5))) - + + SUM(R(K,1:nu,IS(1,6))*R(K,1:nu,IS(1,6))) - DO 30 L=1,K-1 - P1(imain,K,L,I,J) = SUM(FP(K,:)*F(L,:,IS(1,5))) - + + SUM(R(K,1:nu,IS(1,6))*R(L,1:nu,IS(1,6))) -30 P1(imain,L,K,I,J) = P1(imain,K,L,I,J) - -C ------------------------------- -C Innovations: INN = yk-H*X1-c*z -C ------------------------------- - DO 40 K=1,iny -40 INNIJ(K) = yk(imain,IYK(imain,K)) - + - SUM(H(IYK(imain,K),1:nx,IS(1,2))*X1(imain,:,I,J)) - + - SUM(c(IYK(imain,K),1:nz,IS(1,1))*yk(imain,ny+1:ny+nz)) - INN(imain,1:ny) = INN(imain,1:ny) - + + INNIJ(1:ny)*P(J,I)*SFILT(imain-1,I) - -C --------------------------------------------------------- -C Innovation variance V = H*P1*H' + G*G' + H*R*G' + G*R'*H' -C --------------------------------------------------------- - DO 50 K=1,iny - DO 50 L=1,nx -50 HP1(K,L)=SUM(H(IYK(imain,K),1:nx,IS(1,2))*P1(imain,1:nx,L,I,J)) - - DO 55 K=1,nx - DO 55 L=1,iny -55 RG(K,L) = SUM(R(K,1:nu,IS(1,6))*G(IYK(imain,L),1:nu,IS(1,3))) ! R*G' - - DO 56 K=1,iny - DO 56 L=1,iny -56 COM(K,L)=SUM(H(IYK(imain,K),1:nx,IS(1,2))*RG(1:nx,L)) ! H*R*G' - - DO 60 K=1,iny - V(K,K) = SUM(HP1(K,1:nx)*H(IYK(imain,K),1:nx,IS(1,2))) - # + SUM(G(IYK(imain,K),1:nu,IS(1,3)) - # * G(IYK(imain,K),1:nu,IS(1,3)))+2.*COM(K,K) - - DO 60 L=1,K-1 - V(K,L) = SUM(HP1(K,1:nx)*H(IYK(imain,L),1:nx,IS(1,2))) - # + SUM(G(IYK(imain,K),1:nu,IS(1,3)) - # * G(IYK(imain,L),1:nu,IS(1,3)))+COM(K,L)+COM(L,K) -60 V(L,K) = V(K,L) - -C ------------------------------------------------------------------- -C Updating equations: -C x0 = x1 + (P1*H'+R*G')*Vinv*INN -C p0 = p1 - (P1*H'+R*G')*Vinv*(P1*H'+R*G')' -C ------------------------------------------------------------------- - IF (iny.GT.0) THEN - COM(1:iny,1:iny) = V(1:iny,1:iny) - IFAIL = -1 -C CALL F01ADF(iny,COM(1:iny+1,1:iny),iny+1,IFAIL) - CALL DPOTRF('L',iny,COM(1:iny,1:iny),iny,IFAIL) ! COM = L*L' - DETV = 1.D0 ! det(L) - DO K=1,iny - DETV = DETV*COM(K,K) - ENDDO - CALL DPOTRI('L',iny,COM(1:iny,1:ny),iny,IFAIL) ! COM = VV^-1 - - DO 70 K=1,iny - VINV(K,K) = COM(K,K) - DO 70 L=1,K-1 - VINV(K,L) = COM(K,L) -70 VINV(L,K) = VINV(K,L) - - DO 90 K=1,nx - DO 90 L=1,iny -90 HPV(K,L) = SUM((HP1(1:iny,K)+RG(K,1:iny))*VINV(1:iny,L)) - - DO 100 K=1,nx -100 X0(K,I,J)=X1(imain,K,I,J)+SUM(HPV(K,1:iny)*INNIJ(1:iny)) - - DO 110 K=1,nx - P0(K,K,I,J) = P1(imain,K,K,I,J) - + - SUM(HPV(K,1:iny)*(HP1(1:iny,K)+RG(K,1:iny))) - DO 110 L=1,K-1 - P0(K,L,I,J) = P1(imain,K,L,I,J) - + - SUM(HPV(K,1:iny)*(HP1(1:iny,L)+RG(L,1:iny))) -110 P0(L,K,I,J) = P0(K,L,I,J) - -C --------------------------------------------- -C log f(y(t)|S(t-1)=i,S(t)=j,y^(t-1)) -C Log-Likelihood = -(RSS + ln(det(V))/2 -C RSS = INN'*VINV*INN -C --------------------------------------------- -C IFAIL=-1 -C CALL F03ABF(V(1:iny,1:iny),iny,iny,DETV,COM(1:iny,1),IFAIL) - RSS = 0.D0 - DO 120 K=1,iny - DO 120 L=1,iny -120 RSS = RSS + INNIJ(K)*VINV(K,L)*INNIJ(L) - - lfy=-.5D0*(RSS+2.*DLOG(DETV)+iny*DLOG(2.*3.141592653589793D0)) - fyss(I,J) = lfy + DLOG(P(J,I)) + DLOG(SUM(SP0(:,I))) - - ELSE - - X0(:,I,J) = X1(imain,:,I,J) - P0(:,:,I,J) = P1(imain,:,:,I,J) - - ENDIF - - ENDDO - ENDDO - -C log f(y(t)|y^(t-1)) - IF (iny.GT.0) THEN - IMAX = MAXLOC(fyss(:,1)) - maxfyss = fyss(IMAX(1),1) - DO 130 K = 2,nk - IMAX = MAXLOC(fyss(:,K)) -130 maxfyss = MAX(fyss(IMAX(1),K),maxfyss) - - fyss(:,:) = fyss(:,:) - maxfyss - - fsum = 0.D0 - DO 140 I=1,nk - DO 140 J=1,nk -140 fsum = fsum + dexp(fyss(I,J)) - - LIKE(imain) = maxfyss+DLOG(fsum) - -C Compute SP1 = Pr(S(t-1)=i,S(t)=j|y^t) - SP1(:,:) = DEXP(fyss(:,:)-DLOG(fsum)) - - ELSE - -C Compute SP1 = Pr(S(t-1)=i,S(t)=j|y^t-1)=Pr(S(t)=j|S(t-1)=i)*Pr(S(t-1)=i|y^t-1) - DO I = 1,nk - DO J = 1,nk - SP1(I,J) = P(J,I)*SFILT(imain-1,I) - ENDDO - ENDDO - ENDIF - -C Compute Pr(S(t)=j|y^t) - DO 145 J = 1,nk -145 SFILT(imain,J) = SUM(SP1(:,J)) - -C Shrinking XJ - DO 150 J = 1,nk - DO 150 K = 1,nx -150 XI(imain,K,J) = SUM(SP1(:,J)*X0(K,:,J))/SFILT(imain,J) - -C Shrinking PJ - DO 160 I=1,nk - DO 160 J=1,nk - DO 160 K=1,nx - DO 160 L=1,nx -160 AUX1(K,L,I,J) = P0(K,L,I,J) - # + (XI(imain,K,J)-X0(K,I,J))*(XI(imain,L,J)-X0(L,I,J)) - - DO 170 J=1,nk - DO 170 K=1,nx - DO 170 L=1,nx -170 PI(imain,K,L,J) = SUM(SP1(:,J)*AUX1(K,L,:,J))/SFILT(imain,J) - -C Computing E(x(t)|y^t) - DO 175 J=1,nk -175 XFILT(imain,:)=XFILT(imain,:)+XI(imain,:,J)*SFILT(imain,J) - -1000 SP0(:,:) = SP1(:,:) - - DEALLOCATE(SP1,SP0,X0,P0,AUX1,fyss,VINV,INNIJ) - -C Smoothing S and X - IF (ismoother.EQ.1) THEN - ALLOCATE(SPT1(nk,nk),XS(nx,nk,nk),PS(nx,nx,nk,nk),XSC(nx,nk), - 1 PSC(nx,nx,nk),PTIL(nx,nx),W(nk)) - - SSMOOTH(nobs,:) = SFILT(nobs,:) - XSMOOTH(nobs,:) = XFILT(nobs,:) - DO I=1,nx - XSSE(nobs,I) = dsqrt(SUM(SFILT(nobs,1:nk)*PI(nobs,I,I,1:nk))) - ENDDO - XSC(:,:) = XI(nobs,:,:) - PSC(:,:,:) = PI(nobs,:,:,:) - DO 2000 imain = nobs-1,1,-1 -C SPT1:= Pr(S(t)=j,S(t+1)=k|y^T)=Pr(S(t+1)=k|y^T)*Pr(S(t)=j|y^t)*Pr(S(t+1)=k|S(t)=j)/Pr(S(t+1)=k|y^t) - (2.20') -C Pr(S(t+1)=k|y^t) = sum_i Pr(S(t+1)=k|S(t)=i)*Pr(S(t)=i|y^t) -C XS:= E(x(t)|S(t)=j,S(t+1)=k,y^T) nx x nk x nk (2.24) -C PS:= E[(x(t)-XS)^2|S(t)=j,S(t+1)=k,y^T] nx x nx x nk x nk (2.25) - DO J=1,nk - DO K=1,nk - CALL INT2SEQ(K,nv,INFOS,SEQ,IS(1,:)) - SPT1(J,K) = SSMOOTH(imain+1,K)*SFILT(imain,J)*P(K,J) - # / SUM(P(K,1:nk)*SFILT(imain,1:nk)) -C PTIL=(PI(imain,:,:,J)*PHI((K-1)*nx+1:K*nx,(K-1)*nx+1:K*nx)')/P1(imain+1,:,:,J,K) -C the traspose is stored - DO 180 I=1,nx - DO 180 L=1,nx -180 PTIL(L,I) = SUM(PI(imain,I,:,J)*F(L,:,IS(1,5))) - -C P1(imain+1,:,:,J,K) * PTIL' = PHI((K-1)*nx+1:K*nx,(K-1)*nx+1:K*nx)*PI(imain,:,:,J)' -C nx,nx nx,nx nx,nx - AUX(:,:) = P1(imain+1,:,:,J,K) -C CALL F07ADF(nx,nx,AUX,nx,IPIV(1:nx),IFAIL) -C CALL F07AEF('N',nx,nx,AUX,nx,IPIV(1:nx),PTIL,nx,IFAIL) ! this gives PTIL' - CALL DGETRF(nx,nx,AUX,nx,IPIV(1:nx),IFAIL) - CALL DGETRS('N',nx,nx,AUX,nx,IPIV(1:nx),PTIL,nx,IFAIL) ! this gives PTIL' - -C XS(:,J,K) = XI(imain,:,J) + PTIL*(XSC(:,K)-X1(imain+1,:,J,K)') - DO 190 I=1,nx -190 XS(I,J,K) = XI(imain,I,J) - # + SUM(PTIL(:,I)*(XSC(:,K)-X1(imain+1,:,J,K))) - -C PS(:,:,J,K) = PI(imain,:,:,J) + PTIL*(PSC(:,:,K)-P1(imain+1,:,:,J,K))*PTIL'; - DO 200 I=1,nx - DO 200 L=1,nx -200 AUX(I,L) = SUM(PTIL(:,I)*(PSC(:,L,K)-P1(imain+1,:,L,J,K))) - - DO 210 I=1,nx - PS(I,I,J,K) = PI(imain,I,I,J)+SUM(AUX(I,:)*PTIL(:,I)) - DO 210 L=1,I-1 - PS(I,L,J,K) = PI(imain,I,L,J)+SUM(AUX(I,:)*PTIL(:,L)) -210 PS(L,I,J,K) = PS(I,L,J,K) - ENDDO - -C SSMOOTH Kim eqn (2.21) - SSMOOTH(imain,J) = SUM(SPT1(J,:)) - - IF (SSMOOTH(imain,J).GT.10.D-12) THEN - DO I=1,nk - W(I)=SPT1(J,I)/SSMOOTH(imain,J) - ENDDO - ELSE - W(1:nk)=1.D0/DFLOAT(nk) - ENDIF - -C XSC(:,J) = XS(:,J,1:nk)*SPT1(J,1:nk)'/SSMOOTH(imain,J) Kim eqn (2.26) - DO 220 I=1,nx -220 XSC(I,J) = SUM(XS(I,J,1:nk)*W(1:nk)) - -C PSC(:,:,J) = PSC(:,:,J)+SPT1(J,K)*(PS(:,:,J,K)+AUX)/SSMOOTH(imain,J) Kim eqn (2.27) -C AUX = (XSC(:,J)-X1(imain,:,J,K))*(XSC(:,J)-X1(imain,:,J,K))' - PSC(:,:,J) = 0.D0 - DO 235 K = 1,nk - HPV(1:nx,1) = XSC(1:nx,J)-X1(imain,1:nx,J,K) - DO 230 I=1,nx - AUX(I,I) = HPV(I,1)*HPV(I,1) - DO 230 L=1,I-1 - AUX(I,L) = HPV(I,1)*HPV(L,1) -230 AUX(L,I) = AUX(I,L) -235 PSC(:,:,J) = PSC(:,:,J) + W(K)*(PS(:,:,J,K) + AUX(:,:)) - ENDDO - -C Kim eqn (2.28) - DO 240 I=1,nx - XSMOOTH(imain,I) = SUM(SSMOOTH(imain,1:nk)*XSC(I,1:nk)) -240 XSSE(imain,I) = dsqrt(SUM(SSMOOTH(imain,1:nk)*PSC(I,I,1:nk))) - -2000 CONTINUE - DEALLOCATE(X1,P1,XI,PI,AUX,SPT1,XS,PS,XSC,PSC,PTIL,XFILT,SFILT,P,W) - - ENDIF - RETURN +C along with DMM. If not, see <http://www.gnu.org/licenses/>. +C ------------------------------------------------------------------------- + SUBROUTINE KIM(nobs,d,ny,nz,nx,nu,ns,nk,nv,np,INFOS,yk,IYK, + 1 c,H,G,a,F,R,psi,ismoother,XSMOOTH,XSSE,SSMOOTH,INN,LIKE) +C INPUT + INTEGER nobs,ny,nz,nx,nu,ns(6),nk,nv,np,ismoother, + 1 d(2),IYK(nobs,ny+1),INFOS(9,6) + DOUBLE PRECISION yk(nobs,ny+nz),c(ny,max(nz,1),ns(1)), + 1 H(ny,nx,ns(2)),G(ny,nu,ns(3)),a(nx,ns(4)),F(nx,nx,ns(5)), + 2 R(nx,nu,ns(6)),psi(max(1,np)) +C OUTPUT + DOUBLE PRECISION XSMOOTH(nobs,nx),XSSE(nobs,nx),SSMOOTH(nobs,nk), + 1 LIKE(nobs),INN(nobs,ny) + +C LOCALS + INTEGER imain,iny,I,J,K,L,IFAIL + INTEGER IPIV(nx),IMAX(1),IS(max(1,d(1)),6),SEQ(1) + DOUBLE PRECISION DETV,RSS,lfy,maxfyss,fsum + DOUBLE PRECISION, ALLOCATABLE:: SP1(:,:),SP0(:,:),X0(:,:,:), + 1 P0(:,:,:,:),X1(:,:,:,:),P1(:,:,:,:,:),fyss(:,:), + 1 XI(:,:,:),PI(:,:,:,:),Pdd(:,:,:),Xdd(:,:),INNIJ(:), + 1 V(:,:),AUX(:,:),AUX1(:,:,:,:),XFILT(:,:),SFILT(:,:), + 1 SPT1(:,:),XS(:,:,:),PS(:,:,:,:),XSC(:,:),PSC(:,:,:),PTIL(:,:), + 1 FP(:,:),HP1(:,:),RG(:,:),COM(:,:),VINV(:,:),HPV(:,:),W(:), + 1 PP1(:,:),PP2(:,:),PP3(:,:),PP4(:,:),PP5(:,:),PP6(:,:),P(:,:) + +C EXTERNAL SUBROUTINES + EXTERNAL DESIGNZ,PPROD,ERGODIC,INT2SEQ,IKF2,KF2,DPOTRF,DPOTRI, + 1 DGETRF,DGETRS + + LIKE(:) = 0.D0 + INN(:,:) = 0.D0 + ALLOCATE(PP1(INFOS(8,1),INFOS(8,1)),PP2(INFOS(8,2),INFOS(8,2)), + 1 PP3(INFOS(8,3),INFOS(8,3)),PP4(INFOS(8,4),INFOS(8,4)), + 1 PP5(INFOS(8,5),INFOS(8,5)),PP6(INFOS(8,6),INFOS(8,6)), + 1 P(nk,nk)) + CALL DESIGNZ(nv,np,psi,INFOS,PP1,PP2,PP3,PP4,PP5,PP6) + CALL PPROD(nv,nk,INFOS,PP1,PP2,PP3,PP4,PP5,PP6,P) + DEALLOCATE(PP1,PP2,PP3,PP4,PP5,PP6) + +C S-filter initialization Pr[S(d-1),S(d)|y^d] +C X-filter initialization + ALLOCATE(SP1(nk,nk),SP0(nk,nk),X0(nx,nk,nk),P0(nx,nx,nk,nk), + 1 X1(nobs,nx,nk,nk),P1(nobs,nx,nx,nk,nk),INNIJ(ny), + 1 XI(nobs,nx,nk),PI(nobs,nx,nx,nk),fyss(nk,nk),V(ny,ny), + 1 AUX(nx,nx),AUX1(nx,nx,nk,nk),XFILT(nobs,nx),SFILT(nobs,nk), + 1 Pdd(MAX(d(1),1),nx,nx),Xdd(MAX(d(1),1),nx),FP(nx,nx),HP1(ny,nx), + 1 RG(nx,ny),COM(ny+1,ny),VINV(ny,ny),HPV(nx,ny)) + + CALL ERGODIC(nk,P,fyss(1:nk,1)) + IF (d(1).LE.1) THEN + RSS = 0.D0 + DO J = 1,nk ! S(d) + DO I = 1,nk ! S(d-1) + CALL INT2SEQ(J,nv,INFOS,SEQ,IS(max(1,d(1)),:)) + CALL IKF2(d,ny,nz,nx,nu,ns,IS(1,:),yk(1,:), + 1 c,H,G,a,F,R,Xdd(1,:),Pdd(1,:,:),LIKE(1)) + + IF (d(1).EQ.0) THEN + X1(1,:,1,1) = Xdd(1,:) ! 0|0 + P1(1,:,:,1,1) = Pdd(1,:,:) + CALL KF2(1,d,ny,nz,nx,nu,ns,IS,yk(1,:),c,H,G,a,F,R, + 1 X1(1:2,:,1,1),P1(1:2,:,:,1,1),LIKE(1)) + SP0(I,J) = P(J,I)*fyss(I,1)*LIKE(1) + + X0(:,I,J) = X1(2,:,1,1) + P0(:,:,I,J) = P1(2,:,:,1,1) + XI(1,:,J) = X1(2,:,1,1) + PI(1,:,:,J) = P1(2,:,:,1,1) + ELSE + SP0(I,J) = P(J,I)*fyss(I,1) + X0(:,I,J) = Xdd(1,:) ! 1|1 + P0(:,:,I,J) = Pdd(1,:,:) + XI(1,:,J) = Xdd(1,:) + PI(1,:,:,J) = Pdd(1,:,:) + ENDIF + RSS = RSS+SP0(I,J) + ENDDO + + ENDDO + ELSE + WRITE(*,*) 'WARNING: d(1)=2 not implemeted yet' + PAUSE + STOP + ENDIF + SP0(:,:) = SP0(:,:)/RSS + DO I =1,nk + SFILT(max(1,d(1)),I) = SUM(SP0(:,I)) + ENDDO + DEALLOCATE(Xdd,Pdd) + +C --------- +C Filtering +C --------- + XFILT(:,:) = 0.D0 + DO 1000 imain=max(2,d(1)+1),nobs + iny = IYK(imain,ny+1) + DO I = 1,nk + DO J = 1,nk + CALL INT2SEQ(J,nv,INFOS,SEQ,IS(1,:)) +C ------------------------------------ +C Prediction x1 = a+F*x0 +C Prediction var. P1 = F*p0*F'+ R*R' +C ------------------------------------ + DO 10 K=1,nx +10 X1(imain,K,I,J)=a(K,IS(1,4))+SUM(F(K,:,IS(1,5))*XI(imain-1,:,I)) + + DO 20 K=1,nx + DO 20 L=1,nx +20 FP(K,L) = SUM(F(K,:,IS(1,5))*PI(imain-1,:,L,I)) + + DO 30 K=1,nx + P1(imain,K,K,I,J) = SUM(FP(K,:)*F(K,:,IS(1,5))) + + + SUM(R(K,1:nu,IS(1,6))*R(K,1:nu,IS(1,6))) + DO 30 L=1,K-1 + P1(imain,K,L,I,J) = SUM(FP(K,:)*F(L,:,IS(1,5))) + + + SUM(R(K,1:nu,IS(1,6))*R(L,1:nu,IS(1,6))) +30 P1(imain,L,K,I,J) = P1(imain,K,L,I,J) + +C ------------------------------- +C Innovations: INN = yk-H*X1-c*z +C ------------------------------- + DO 40 K=1,iny +40 INNIJ(K) = yk(imain,IYK(imain,K)) + + - SUM(H(IYK(imain,K),1:nx,IS(1,2))*X1(imain,:,I,J)) + + - SUM(c(IYK(imain,K),1:nz,IS(1,1))*yk(imain,ny+1:ny+nz)) + INN(imain,1:ny) = INN(imain,1:ny) + + + INNIJ(1:ny)*P(J,I)*SFILT(imain-1,I) + +C --------------------------------------------------------- +C Innovation variance V = H*P1*H' + G*G' + H*R*G' + G*R'*H' +C --------------------------------------------------------- + DO 50 K=1,iny + DO 50 L=1,nx +50 HP1(K,L)=SUM(H(IYK(imain,K),1:nx,IS(1,2))*P1(imain,1:nx,L,I,J)) + + DO 55 K=1,nx + DO 55 L=1,iny +55 RG(K,L) = SUM(R(K,1:nu,IS(1,6))*G(IYK(imain,L),1:nu,IS(1,3))) ! R*G' + + DO 56 K=1,iny + DO 56 L=1,iny +56 COM(K,L)=SUM(H(IYK(imain,K),1:nx,IS(1,2))*RG(1:nx,L)) ! H*R*G' + + DO 60 K=1,iny + V(K,K) = SUM(HP1(K,1:nx)*H(IYK(imain,K),1:nx,IS(1,2))) + # + SUM(G(IYK(imain,K),1:nu,IS(1,3)) + # * G(IYK(imain,K),1:nu,IS(1,3)))+2.*COM(K,K) + + DO 60 L=1,K-1 + V(K,L) = SUM(HP1(K,1:nx)*H(IYK(imain,L),1:nx,IS(1,2))) + # + SUM(G(IYK(imain,K),1:nu,IS(1,3)) + # * G(IYK(imain,L),1:nu,IS(1,3)))+COM(K,L)+COM(L,K) +60 V(L,K) = V(K,L) + +C ------------------------------------------------------------------- +C Updating equations: +C x0 = x1 + (P1*H'+R*G')*Vinv*INN +C p0 = p1 - (P1*H'+R*G')*Vinv*(P1*H'+R*G')' +C ------------------------------------------------------------------- + IF (iny.GT.0) THEN + COM(1:iny,1:iny) = V(1:iny,1:iny) + IFAIL = -1 +C CALL F01ADF(iny,COM(1:iny+1,1:iny),iny+1,IFAIL) + CALL DPOTRF('L',iny,COM(1:iny,1:iny),iny,IFAIL) ! COM = L*L' + DETV = 1.D0 ! det(L) + DO K=1,iny + DETV = DETV*COM(K,K) + ENDDO + CALL DPOTRI('L',iny,COM(1:iny,1:ny),iny,IFAIL) ! COM = VV^-1 + + DO 70 K=1,iny + VINV(K,K) = COM(K,K) + DO 70 L=1,K-1 + VINV(K,L) = COM(K,L) +70 VINV(L,K) = VINV(K,L) + + DO 90 K=1,nx + DO 90 L=1,iny +90 HPV(K,L) = SUM((HP1(1:iny,K)+RG(K,1:iny))*VINV(1:iny,L)) + + DO 100 K=1,nx +100 X0(K,I,J)=X1(imain,K,I,J)+SUM(HPV(K,1:iny)*INNIJ(1:iny)) + + DO 110 K=1,nx + P0(K,K,I,J) = P1(imain,K,K,I,J) + + - SUM(HPV(K,1:iny)*(HP1(1:iny,K)+RG(K,1:iny))) + DO 110 L=1,K-1 + P0(K,L,I,J) = P1(imain,K,L,I,J) + + - SUM(HPV(K,1:iny)*(HP1(1:iny,L)+RG(L,1:iny))) +110 P0(L,K,I,J) = P0(K,L,I,J) + +C --------------------------------------------- +C log f(y(t)|S(t-1)=i,S(t)=j,y^(t-1)) +C Log-Likelihood = -(RSS + ln(det(V))/2 +C RSS = INN'*VINV*INN +C --------------------------------------------- +C IFAIL=-1 +C CALL F03ABF(V(1:iny,1:iny),iny,iny,DETV,COM(1:iny,1),IFAIL) + RSS = 0.D0 + DO 120 K=1,iny + DO 120 L=1,iny +120 RSS = RSS + INNIJ(K)*VINV(K,L)*INNIJ(L) + + lfy=-.5D0*(RSS+2.*DLOG(DETV)+iny*DLOG(2.*3.141592653589793D0)) + fyss(I,J) = lfy + DLOG(P(J,I)) + DLOG(SUM(SP0(:,I))) + + ELSE + + X0(:,I,J) = X1(imain,:,I,J) + P0(:,:,I,J) = P1(imain,:,:,I,J) + + ENDIF + + ENDDO + ENDDO + +C log f(y(t)|y^(t-1)) + IF (iny.GT.0) THEN + IMAX = MAXLOC(fyss(:,1)) + maxfyss = fyss(IMAX(1),1) + DO 130 K = 2,nk + IMAX = MAXLOC(fyss(:,K)) +130 maxfyss = MAX(fyss(IMAX(1),K),maxfyss) + + fyss(:,:) = fyss(:,:) - maxfyss + + fsum = 0.D0 + DO 140 I=1,nk + DO 140 J=1,nk +140 fsum = fsum + dexp(fyss(I,J)) + + LIKE(imain) = maxfyss+DLOG(fsum) + +C Compute SP1 = Pr(S(t-1)=i,S(t)=j|y^t) + SP1(:,:) = DEXP(fyss(:,:)-DLOG(fsum)) + + ELSE + +C Compute SP1 = Pr(S(t-1)=i,S(t)=j|y^t-1)=Pr(S(t)=j|S(t-1)=i)*Pr(S(t-1)=i|y^t-1) + DO I = 1,nk + DO J = 1,nk + SP1(I,J) = P(J,I)*SFILT(imain-1,I) + ENDDO + ENDDO + ENDIF + +C Compute Pr(S(t)=j|y^t) + DO 145 J = 1,nk +145 SFILT(imain,J) = SUM(SP1(:,J)) + +C Shrinking XJ + DO 150 J = 1,nk + DO 150 K = 1,nx +150 XI(imain,K,J) = SUM(SP1(:,J)*X0(K,:,J))/SFILT(imain,J) + +C Shrinking PJ + DO 160 I=1,nk + DO 160 J=1,nk + DO 160 K=1,nx + DO 160 L=1,nx +160 AUX1(K,L,I,J) = P0(K,L,I,J) + # + (XI(imain,K,J)-X0(K,I,J))*(XI(imain,L,J)-X0(L,I,J)) + + DO 170 J=1,nk + DO 170 K=1,nx + DO 170 L=1,nx +170 PI(imain,K,L,J) = SUM(SP1(:,J)*AUX1(K,L,:,J))/SFILT(imain,J) + +C Computing E(x(t)|y^t) + DO 175 J=1,nk +175 XFILT(imain,:)=XFILT(imain,:)+XI(imain,:,J)*SFILT(imain,J) + +1000 SP0(:,:) = SP1(:,:) + + DEALLOCATE(SP1,SP0,X0,P0,AUX1,fyss,VINV,INNIJ) + +C Smoothing S and X + IF (ismoother.EQ.1) THEN + ALLOCATE(SPT1(nk,nk),XS(nx,nk,nk),PS(nx,nx,nk,nk),XSC(nx,nk), + 1 PSC(nx,nx,nk),PTIL(nx,nx),W(nk)) + + SSMOOTH(nobs,:) = SFILT(nobs,:) + XSMOOTH(nobs,:) = XFILT(nobs,:) + DO I=1,nx + XSSE(nobs,I) = dsqrt(SUM(SFILT(nobs,1:nk)*PI(nobs,I,I,1:nk))) + ENDDO + XSC(:,:) = XI(nobs,:,:) + PSC(:,:,:) = PI(nobs,:,:,:) + DO 2000 imain = nobs-1,1,-1 +C SPT1:= Pr(S(t)=j,S(t+1)=k|y^T)=Pr(S(t+1)=k|y^T)*Pr(S(t)=j|y^t)*Pr(S(t+1)=k|S(t)=j)/Pr(S(t+1)=k|y^t) - (2.20') +C Pr(S(t+1)=k|y^t) = sum_i Pr(S(t+1)=k|S(t)=i)*Pr(S(t)=i|y^t) +C XS:= E(x(t)|S(t)=j,S(t+1)=k,y^T) nx x nk x nk (2.24) +C PS:= E[(x(t)-XS)^2|S(t)=j,S(t+1)=k,y^T] nx x nx x nk x nk (2.25) + DO J=1,nk + DO K=1,nk + CALL INT2SEQ(K,nv,INFOS,SEQ,IS(1,:)) + SPT1(J,K) = SSMOOTH(imain+1,K)*SFILT(imain,J)*P(K,J) + # / SUM(P(K,1:nk)*SFILT(imain,1:nk)) +C PTIL=(PI(imain,:,:,J)*PHI((K-1)*nx+1:K*nx,(K-1)*nx+1:K*nx)')/P1(imain+1,:,:,J,K) +C the traspose is stored + DO 180 I=1,nx + DO 180 L=1,nx +180 PTIL(L,I) = SUM(PI(imain,I,:,J)*F(L,:,IS(1,5))) + +C P1(imain+1,:,:,J,K) * PTIL' = PHI((K-1)*nx+1:K*nx,(K-1)*nx+1:K*nx)*PI(imain,:,:,J)' +C nx,nx nx,nx nx,nx + AUX(:,:) = P1(imain+1,:,:,J,K) +C CALL F07ADF(nx,nx,AUX,nx,IPIV(1:nx),IFAIL) +C CALL F07AEF('N',nx,nx,AUX,nx,IPIV(1:nx),PTIL,nx,IFAIL) ! this gives PTIL' + CALL DGETRF(nx,nx,AUX,nx,IPIV(1:nx),IFAIL) + CALL DGETRS('N',nx,nx,AUX,nx,IPIV(1:nx),PTIL,nx,IFAIL) ! this gives PTIL' + +C XS(:,J,K) = XI(imain,:,J) + PTIL*(XSC(:,K)-X1(imain+1,:,J,K)') + DO 190 I=1,nx +190 XS(I,J,K) = XI(imain,I,J) + # + SUM(PTIL(:,I)*(XSC(:,K)-X1(imain+1,:,J,K))) + +C PS(:,:,J,K) = PI(imain,:,:,J) + PTIL*(PSC(:,:,K)-P1(imain+1,:,:,J,K))*PTIL'; + DO 200 I=1,nx + DO 200 L=1,nx +200 AUX(I,L) = SUM(PTIL(:,I)*(PSC(:,L,K)-P1(imain+1,:,L,J,K))) + + DO 210 I=1,nx + PS(I,I,J,K) = PI(imain,I,I,J)+SUM(AUX(I,:)*PTIL(:,I)) + DO 210 L=1,I-1 + PS(I,L,J,K) = PI(imain,I,L,J)+SUM(AUX(I,:)*PTIL(:,L)) +210 PS(L,I,J,K) = PS(I,L,J,K) + ENDDO + +C SSMOOTH Kim eqn (2.21) + SSMOOTH(imain,J) = SUM(SPT1(J,:)) + + IF (SSMOOTH(imain,J).GT.10.D-12) THEN + DO I=1,nk + W(I)=SPT1(J,I)/SSMOOTH(imain,J) + ENDDO + ELSE + W(1:nk)=1.D0/DFLOAT(nk) + ENDIF + +C XSC(:,J) = XS(:,J,1:nk)*SPT1(J,1:nk)'/SSMOOTH(imain,J) Kim eqn (2.26) + DO 220 I=1,nx +220 XSC(I,J) = SUM(XS(I,J,1:nk)*W(1:nk)) + +C PSC(:,:,J) = PSC(:,:,J)+SPT1(J,K)*(PS(:,:,J,K)+AUX)/SSMOOTH(imain,J) Kim eqn (2.27) +C AUX = (XSC(:,J)-X1(imain,:,J,K))*(XSC(:,J)-X1(imain,:,J,K))' + PSC(:,:,J) = 0.D0 + DO 235 K = 1,nk + HPV(1:nx,1) = XSC(1:nx,J)-X1(imain,1:nx,J,K) + DO 230 I=1,nx + AUX(I,I) = HPV(I,1)*HPV(I,1) + DO 230 L=1,I-1 + AUX(I,L) = HPV(I,1)*HPV(L,1) +230 AUX(L,I) = AUX(I,L) +235 PSC(:,:,J) = PSC(:,:,J) + W(K)*(PS(:,:,J,K) + AUX(:,:)) + ENDDO + +C Kim eqn (2.28) + DO 240 I=1,nx + XSMOOTH(imain,I) = SUM(SSMOOTH(imain,1:nk)*XSC(I,1:nk)) +240 XSSE(imain,I) = dsqrt(SUM(SSMOOTH(imain,1:nk)*PSC(I,I,1:nk))) + +2000 CONTINUE + DEALLOCATE(X1,P1,XI,PI,AUX,SPT1,XS,PS,XSC,PSC,PTIL,XFILT,SFILT,P,W) + + ENDIF + RETURN END diff --git a/ks.for b/ks.for index 89353488b4f8769bddabbdd7b0677041f7931a8f..8a1343c78ea1c89f1c9702f9d2afb9b5b8e4a48d 100644 --- a/ks.for +++ b/ks.for @@ -1,34 +1,34 @@ -C -------------------------------------------------------------------- -C KS IMPLEMENTS THE KALMAN SMMOOTHER RECURSIONS in -C Koopman (1997), JASA, 92, 440, 1630-38 -C Developed by A.Rossi, C.Planas and G.Fiorentini -C -C XS = E[x(t)|y(1),...,y(nobs)] -C PS = V[x(t)|y(1),...,y(nobs)], t = 1,2,...,nobs -C -C State-space format: y(t) = c(t)z(t) + H(t)x(t) + G(t)u(t) -C x(t) = a(t) + F(t)x(t-1) + R(t)u(t) -C -C y(t) (ny x 1) ny = # of endogenous series -C z(t) (nz x 1) nz = # of exogenous series -C x(t) (nx x 1) nx = # of continous states -C u(t) (nu x 1) nu = # of shocks -C c(t) (ny x nz x ns1) ns1 = # of states for c(t) -C H(t) (ny x nx x ns2) ns2 = # of states for S2(t) -C G(t) (ny x nu x ns3) ns3 = # of states for S3(t) -C a(t) (nx x ns4) ns4 = # of states for S4(t) -C F(t) (nx x nx x ns5) ns5 = # of states for S5(t) -C R(t) (nx x nu x ns6) ns6 = # of states for S6(t) -C -C d(1): order of integration of the system -C d(2): number of non-stationary elements -C -C Copyright (C) 2010-2014 European Commission -C +C -------------------------------------------------------------------- +C KS IMPLEMENTS THE KALMAN SMMOOTHER RECURSIONS in +C Koopman (1997), JASA, 92, 440, 1630-38 +C Developed by A.Rossi, C.Planas and G.Fiorentini +C +C XS = E[x(t)|y(1),...,y(nobs)] +C PS = V[x(t)|y(1),...,y(nobs)], t = 1,2,...,nobs +C +C State-space format: y(t) = c(t)z(t) + H(t)x(t) + G(t)u(t) +C x(t) = a(t) + F(t)x(t-1) + R(t)u(t) +C +C y(t) (ny x 1) ny = # of endogenous series +C z(t) (nz x 1) nz = # of exogenous series +C x(t) (nx x 1) nx = # of continous states +C u(t) (nu x 1) nu = # of shocks +C c(t) (ny x nz x ns1) ns1 = # of states for c(t) +C H(t) (ny x nx x ns2) ns2 = # of states for S2(t) +C G(t) (ny x nu x ns3) ns3 = # of states for S3(t) +C a(t) (nx x ns4) ns4 = # of states for S4(t) +C F(t) (nx x nx x ns5) ns5 = # of states for S5(t) +C R(t) (nx x nu x ns6) ns6 = # of states for S6(t) +C +C d(1): order of integration of the system +C d(2): number of non-stationary elements +C +C Copyright (C) 2010-2014 European Commission +C C This file is part of Program DMM C -C DMM is free software developed at the Joint Research Centre of the -C European Commission: you can redistribute it and/or modify it under +C DMM is free software developed at the Joint Research Centre of the +C European Commission: you can redistribute it and/or modify it under C the terms of the GNU General Public License as published by C the Free Software Foundation, either version 3 of the License, or C (at your option) any later version. @@ -39,560 +39,560 @@ C MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the C GNU General Public License for more details. C C You should have received a copy of the GNU General Public License -C along with DMM. If not, see <http://www.gnu.org/licenses/>. -C -------------------------------------------------------------------- - SUBROUTINE KS(nobs,d,ny,nz,nx,nu,ns,S,yk,IYK,c,H,G,a,F,R,XS,PS) -C INPUT - INTEGER nobs,d(2),ny,nz,nx,nu,ns(6),S(nobs,6),IYK(nobs,ny+1) - DOUBLE PRECISION yk(nobs,ny+nz),c(ny,max(nz,1),ns(1)), - 1 H(ny,nx,ns(2)),G(ny,nu,ns(3)),a(nx,ns(4)),F(nx,nx,ns(5)), - 2 R(nx,nu,ns(6)) - -C OUTPUT - DOUBLE PRECISION XS(nobs,nx),PS(nobs,nx,nx) - -C LOCALS - INTEGER imain,iny,I,J,IFAIL,FiRANK,ITIME - INTEGER IPIV(nx) - DOUBLE PRECISION TOL,SUMW1 - DOUBLE PRECISION,ALLOCATABLE:: Pi(:,:,:),HPs(:,:),HPi(:,:), - 1 Fi(:,:),Fs(:,:),Fim(:,:),Fsm(:,:),PHFs(:,:),PHFi(:,:),FFF(:,:), - 2 Mi(:,:),Ms(:,:),Ci(:,:),Kst(:,:,:),Kit(:,:,:),W1(:),WORK(:), - 3 WORK1(:),PFP(:,:),APPO(:,:),APPO1(:,:),COM(:,:),RG(:,:), - 4 FP(:,:),HP1(:,:),V(:,:),CC(:,:),HPV(:,:),X0(:),P0(:,:), - 5 RECR(:),RECRI(:),RECN(:,:),XT(:,:),PT(:,:,:),INN(:,:), - 1 Vinv(:,:,:),Vis(:,:,:),Vii(:,:,:) - -C EXTERNAL SUBROUTINES - EXTERNAL INVF,INVFBIS,LYAP,DSYEV,DPOTRF,DPOTRI,DGETRF,DGETRI - - ALLOCATE(Pi(d(1),nx,nx),HPs(ny,nx),HPi(ny,nx), - 1 Fi(ny,ny),Fs(ny,ny),Fim(ny,ny),Fsm(ny,ny), - 2 PHFs(nx,ny),PHFi(nx,ny),FFF(ny,ny),Mi(nx,ny),Ms(nx,ny),Ci(nx,nx), - 3 Kst(d(1),nx,ny),Kit(d(1),nx,ny)) - - ALLOCATE(W1(ny),WORK(64*nx),WORK1(64*ny), - 1 PFP(nx,nx),APPO(nx,nx),APPO1(nx,ny),COM(ny+1,ny),RG(nx,ny)) - - ALLOCATE(FP(nx,nx),HP1(ny,nx),V(ny,ny),CC(nx,nx), - 1 HPV(nx,ny),X0(nx),P0(nx,nx),RECR(nx),RECRI(nx),RECN(nx,nx)) - - ALLOCATE(XT(nobs,nx),PT(nobs,nx,nx),INN(nobs,ny), - 1 Vinv(nobs,ny,ny),Vis(d(1),ny,ny),Vii(d(1),ny,ny)) - - TOL = 1.D-3 -C Unconditional mean and variance - IF (d(1).EQ.0) THEN ! stationary models - IF(SUM(ABS(a(:,S(1,4)))).EQ.0.D0) THEN - XT(1,:) = 0.D0 ! X(1|0) - ELSE - APPO = -F(:,:,S(1,5)) - DO 1 I = 1,nx -1 APPO(I,I) = 1.D0+APPO(I,I) -C CALL F07ADF(nx,nx,APPO,nx,IPIV,IFAIL) -C CALL F07AJF(nx,APPO,nx,IPIV,WORK,64*nx,IFAIL) - CALL DGETRF(nx,nx,APPO,nx,IPIV,IFAIL) - CALL DGETRI(nx,APPO,nx,IPIV,WORK,64*nx,IFAIL) - - DO 2 I =1,nx -2 XT(1,I) = SUM(APPO(I,:)*a(:,S(1,4))) ! inv(I-F)*a - ENDIF - -C P(1|0) - F*P(1|0)*F' = R*R' - CALL LYAP(nx,nu,TOL,F(:,:,S(1,5)),R(:,:,S(1,6)),PT(1,:,:)) - ELSE -C ----------------------------------------------------------- -C Non-stationary models -C Define X(1) = aa + A*eta + B*delta (A*B' = 0) -C eta~N(0,I), delta~N(0,k*I) k -> +inf -C X(1)~N(aa,P), P=Ps+k*Pi, Ps=AA', Pi=BB'. -C CARE!! aa (uncond. mean),Ps, and Pi to be filled by users -C ----------------------------------------------------------- - XT(1,1:nx) = 0.D0 ! X(1|0) - PT(1,1:nx,1:nx) = 0.D0 ! P(1|0) - IF (d(2).LT.nx) THEN - IF(SUM(ABS(a(d(2)+1:nx,S(1,4)))).NE.0.D0) THEN - APPO(d(2)+1:nx,d(2)+1:nx) = -F(d(2)+1:nx,d(2)+1:nx,S(1,5)) - DO 3 I = d(2)+1,nx -3 APPO(I,I) = 1.D0+APPO(I,I) -C CALL F07ADF(nx-d(2),nx-d(2),APPO(d(2)+1:nx,d(2)+1:nx),nx-d(2), -C 1 IPIV(d(2)+1:nx),IFAIL) -C CALL F07AJF(nx-d(2),APPO(d(2)+1:nx,d(2)+1:nx),nx-d(2), -C 1 IPIV(d(2)+1:nx),WORK,64*nx,IFAIL) - CALL DGETRF(nx-d(2),nx-d(2),APPO(d(2)+1:nx,d(2)+1:nx),nx-d(2), - 1 IPIV(d(2)+1:nx),IFAIL) - CALL DGETRI(nx-d(2),APPO(d(2)+1:nx,d(2)+1:nx),nx-d(2), - 1 IPIV(d(2)+1:nx),WORK,64*nx,IFAIL) - - DO 4 I = d(2)+1,nx -4 XT(1,I) = SUM(APPO(I,d(2)+1:nx)*a(d(2)+1:nx,S(1,4))) ! inv(I-F)*a - ENDIF - -C Lyapunov eqn - CALL LYAP(nx-d(2),nu,TOL,F(d(2)+1:nx,d(2)+1:nx,S(1,5)), - 1 R(d(2)+1:nx,1:nu,S(1,6)),PT(1,d(2)+1:nx,d(2)+1:nx)) - ENDIF - - Pi(:,:,:) = 0.D0 - DO 5 I = 1,d(2) -5 Pi(1,I,I) = 1.D0 - - DO 200 imain = 1,d(1) - iny = IYK(imain,ny+1) - DO 30 I=1,iny - DO 30 J=1,nx -30 HPs(I,J) = SUM(H(IYK(imain,I),:,S(imain,2))*PT(imain,:,J)) - - DO 40 I=1,iny - Fs(I,I) = SUM(HPs(I,:)*H(IYK(imain,I),:,S(imain,2))) - + +SUM(G(IYK(imain,I),:,S(imain,3))*G(IYK(imain,I),:,S(imain,3))) - DO 40 J=1,I-1 - Fs(I,J) = SUM(HPs(I,:)*H(IYK(imain,J),:,S(imain,2))) - + +SUM(G(IYK(imain,I),:,S(imain,3))*G(IYK(imain,J),:,S(imain,3))) -40 Fs(J,I) = Fs(I,J) - - DO 50 I=1,iny - DO 50 J=1,nx -50 HPi(I,J) = SUM(H(IYK(imain,I),:,S(imain,2))*Pi(imain,:,J)) - - DO 60 I=1,iny - Fi(I,I) = SUM(HPi(I,:)*H(IYK(imain,I),:,S(imain,2))) - DO 60 J=1,I-1 - Fi(I,J) = SUM(HPi(I,:)*H(IYK(imain,J),:,S(imain,2))) -60 Fi(J,I) = Fi(I,J) - -C -------------------------------------------------------------------------- -C Computes inverse of the innovation variance matrix -C Cases: ny = 1, Fi is scalar >0 (or 0 not considered) -C ny > 1, Fi is full rank or singular (or 0 matrix not considered) -C -------------------------------------------------------------------------- - IF (iny.EQ.1) THEN - Fsm = 0.D0 - Fim = 1.D0/Fi - FFF = Fim*Fs*Fim - ELSE - - IFAIL = -1 - COM(1:iny,1:iny) = Fi(1:iny,1:iny) -C CALL F02FAF('N','U',iny,COM(1:iny,1:iny),iny,W1(1:iny), -C 1 WORK1,64*iny,IFAIL) - CALL DSYEV('N','U',iny,COM(1:iny,1:iny),iny,W1(1:iny), - 1 WORK1,64*iny,IFAIL) - - FiRANK = 0 - SUMW1 = SUM(ABS(W1(1:iny))) - DO 70 I=1,iny - W1(I) = W1(I)/SUMW1 -70 IF (W1(I).GT.1.D-10) FiRANK=FiRANK+1 - FiRANK = min(FiRANK,d(2)) - - IF(FiRANK.EQ.iny) THEN - Fsm = 0.D0 - COM(1:iny,1:iny) = Fi(1:iny,1:iny) - IFAIL = -1 -C CALL F01ADF(iny,COM(1:iny+1,1:iny),iny+1,IFAIL) - CALL DPOTRF('L',iny,COM(1:iny,1:iny),iny,IFAIL) ! COM = L*L' - CALL DPOTRI('L',iny,COM(1:iny,1:iny),iny,IFAIL) ! COM = VV^-1 - - DO 80 I=1,iny - Fim(I,I) = COM(I,I) - DO 80 J=1,I-1 - Fim(I,J) = COM(I,J) -80 Fim(J,I) = Fim(I,J) - - DO 81 I=1,iny - DO 81 J=1,iny -81 COM(I,J) = SUM(Fim(I,1:iny)*Fs(1:iny,J)) ! Fim x Fs - - DO 82 I=1,iny - FFF(I,I) = SUM(COM(I,1:iny)*Fim(1:iny,I)) - DO 82 J=1,I-1 - FFF(I,J) = SUM(COM(I,1:iny)*Fim(1:iny,J)) ! Fim x Fs x Fim -82 FFF(J,I) = FFF(I,J) - ELSE - SUMW1=0.D0 - DO I=Firank+1,iny - SUMW1 = SUMW1 + Fi(I,I) - ENDDO - IF (SUMW1.GT.0.D0) THEN - CALL INVFBIS(Fs(1:iny,1:iny),Fi(1:iny,1:iny),iny,FiRANK, - 1 Fsm(1:iny,1:iny),Fim(1:iny,1:iny),FFF(1:iny,1:iny)) - ELSE - CALL INVF(Fs(1:iny,1:iny),Fi(1:iny,1:iny),iny,FiRANK, - 1 Fsm(1:iny,1:iny),Fim(1:iny,1:iny),FFF(1:iny,1:iny)) - ENDIF - ENDIF - ENDIF - Vis(imain,1:iny,1:iny) = Fsm(1:iny,1:iny) - Vii(imain,1:iny,1:iny) = Fim(1:iny,1:iny) - -C ------------------------------------------------------------------ -C X(d|d) = X(d|d-1)+((Ps*H'+R*G')*Fsm+Pi*H'*Fim)*(Y(d)-H*X(d|d-1)-c) -C ------------------------------------------------------------------ - DO 85 I = 1,nx - DO 85 J = 1,iny - RG(I,J) = - # SUM(R(I,1:nu,S(imain,6))*G(IYK(imain,J),1:nu,S(imain,3))) -85 HPs(J,I) = HPs(J,I) + RG(I,J) ! HPs = (Ps*H'+R*G')' - - DO 90 I = 1,nx - DO 90 J = 1,iny - PHFs(I,J) = SUM(HPs(1:iny,I)*Fsm(1:iny,J)) -90 PHFi(I,J) = SUM(HPi(1:iny,I)*Fim(1:iny,J)) - -C Innovations - DO 100 I=1,iny -100 INN(imain,I) = yk(imain,IYK(imain,I)) - + - SUM(H(IYK(imain,I),1:nx,S(imain,2))*XT(imain,1:nx)) - + - SUM(c(IYK(imain,I),1:nz,S(imain,1))*yk(imain,ny+1:ny+nz)) - - DO 110 I=1,nx -110 X0(I) = XT(imain,I) - + + SUM((PHFs(I,1:iny)+PHFi(I,1:iny))*INN(imain,1:iny)) - -C P(d|d) = P(d|d-1) + Pi*H'*Fim*Fs*Fim*H*Pi - Ps*H'*Fsm*H*Ps - Ps*H'*Fim*H*Pi - (Ps*H'*Fim*H*Pi)' -C - Ps*H'*Fsm*H*Ps - DO 120 I = 1,nx - APPO(I,I) = -SUM(PHFs(I,1:iny)*HPs(1:iny,I)) - DO 120 J = 1,I-1 - APPO(I,J) = -SUM(PHFs(I,1:iny)*HPs(1:iny,J)) -120 APPO(J,I) = APPO(I,J) - -C - Ps*H'*Fim*H*Pi - (Ps*H'*Fim*H*Pi)' - DO 130 I = 1,nx - APPO(I,I) = APPO(I,I) - SUM(HPs(1:iny,I)*PHFi(I,1:iny)) - + - SUM(PHFi(I,1:iny)*HPs(1:iny,I)) - DO 130 J = 1,I-1 - APPO(I,J) = APPO(I,J) - SUM(HPs(1:iny,I)*PHFi(J,1:iny)) - + - SUM(PHFi(I,1:iny)*HPs(1:iny,J)) -130 APPO(J,I) = APPO(I,J) - -C Pi*H'*Fim*Fs*Fim*H*Pi - DO 140 I = 1,nx - DO 140 J = 1,iny -140 APPO1(I,J) = SUM(HPi(1:iny,I)*FFF(1:iny,J)) - - DO 150 I = 1,nx - PFP(I,I) = SUM(APPO1(I,1:iny)*HPi(1:iny,I)) - DO 150 J = 1,I-1 - PFP(I,J) = SUM(APPO1(I,1:iny)*HPi(1:iny,J)) -150 PFP(J,I) = PFP(I,J) - - P0(:,:) = PT(imain,:,:) + PFP(:,:) + APPO(:,:) - -C Mi = F*Pi*H' - DO 151 I = 1,nx - DO 151 J = 1,nx -151 PFP(I,J) = SUM(F(I,1:nx,S(imain,5))*Pi(imain,1:nx,J)) ! F*Pi - - DO 152 I = 1,nx - DO 152 J = 1,iny -152 Mi(I,J) = SUM(PFP(I,1:nx)*H(IYK(imain,J),1:nx,S(imain,2))) - -C Ms = F*Ps*H' + R*G' - DO 153 I = 1,nx - DO 153 J = 1,nx -153 FP(I,J) = SUM(F(I,:,S(imain,5))*PT(imain,:,J)) ! F*Ps - - DO 154 I = 1,nx - DO 154 J = 1,iny -154 Ms(I,J)=RG(I,J)+SUM(FP(I,1:nx)*H(IYK(imain,J),1:nx,S(imain,2))) - -C Kit = Ms*Fim - Mi*FFF -C Kst = Ms*Fsm + Mi*Fim - DO 155 I = 1,nx - DO 155 J = 1,iny - Kit(imain,I,J) = SUM(Ms(I,1:iny)*Fim(1:iny,J)) - + - SUM(Mi(I,1:iny)*FFF(1:iny,J)) -155 Kst(imain,I,J) = SUM(Ms(I,1:iny)*Fsm(1:iny,J)) - + + SUM(Mi(I,1:iny)*Fim(1:iny,J)) - -C ---------------------------------- -C Predictions X(t+1|t) and P(t+1|t) -C ---------------------------------- - IF (imain.LT.d(1)) THEN -C Pi+1 = F*Pi*F'-Ci - -C Ci = Mi*Fim*Mi' - DO 164 I = 1,nx - DO 164 J = 1,iny -164 RG(I,J) = SUM(Mi(I,1:iny)*Fim(1:iny,J)) ! Mi*Fim - - DO 166 I = 1,nx - Ci(I,I) = SUM(RG(I,1:iny)*Mi(I,1:iny)) - DO 166 J = 1,I-1 -166 Ci(I,J) = SUM(RG(I,1:iny)*Mi(J,1:iny)) - - DO 168 I = 1,nx - Pi(imain+1,I,I)=SUM(PFP(I,1:nx)*F(I,1:nx,S(imain+1,5)))-Ci(I,I) - DO 168 J = 1,I-1 - Pi(imain+1,I,J)=SUM(PFP(I,1:nx)*F(J,1:nx,S(imain+1,5)))-Ci(I,J) -168 Pi(imain+1,J,I) = Pi(imain+1,I,J) - - ENDIF - -C X(t+1|t) = a + F*X(t|t) - DO 170 I=1,nx -170 XT(imain+1,I) = a(I,S(imain+1,4)) - + + SUM(F(I,1:nx,S(imain+1,5))*X0(1:nx)) - -C P(t+1|t) = F*PddF' + R*R' - DO 172 I = 1,nx - DO 172 J = 1,nx -172 APPO(I,J) = SUM(F(I,:,S(imain+1,5))*P0(:,J)) ! F*Pdd - - DO 180 I = 1,nx - PT(imain+1,I,I) = SUM(APPO(I,1:nx)*F(I,1:nx,S(imain+1,5))) - + + SUM(R(I,1:nu,S(imain+1,6))*R(I,1:nu,S(imain+1,6))) - DO 180 J = 1,I-1 - PT(imain+1,I,J) = SUM(APPO(I,1:nx)*F(J,1:nx,S(imain+1,5))) - + + SUM(R(I,1:nu,S(imain+1,6))*R(J,1:nu,S(imain+1,6))) -180 PT(imain+1,J,I) = PT(imain+1,I,J) - -200 CONTINUE - ENDIF - - DO 400 imain = d(1)+1,nobs - iny = IYK(imain,ny+1) -C ------------------------------- -C Innovations: INN = yk-H*X1-c*z -C ------------------------------- - DO 210 I=1,iny -210 INN(imain,I) = yk(imain,IYK(imain,I)) - + - SUM(H(IYK(imain,I),1:nx,S(imain,2))*XT(imain,:)) - + - SUM(c(IYK(imain,I),1:nz,S(imain,1))*yk(imain,ny+1:ny+nz)) - -C ---------------------------------------------------------- -C Innovation variance V = H*P1*H' + G*G' + H*R*G' + G*R'*H' -C ---------------------------------------------------------- - DO 220 I=1,iny - DO 220 J=1,nx -220 HP1(I,J) = SUM(H(IYK(imain,I),1:nx,S(imain,2))*PT(imain,1:nx,J)) - - DO 221 I=1,nx - DO 221 J=1,iny -221 RG(I,J)=SUM(R(I,1:nu,S(imain,6))*G(IYK(imain,J),1:nu,S(imain,3))) - - DO 222 I=1,iny - DO 222 J=1,iny -222 COM(I,J)=SUM(H(IYK(imain,I),1:nx,S(imain,2))*RG(1:nx,J)) ! H*R*G' - - DO 230 I=1,iny - V(I,I) = SUM(HP1(I,1:nx)*H(IYK(imain,I),1:nx,S(imain,2))) - # + SUM(G(IYK(imain,I),1:nu,S(imain,3))* - # G(IYK(imain,I),1:nu,S(imain,3))) + 2.*COM(I,I) - DO 230 J=1,I-1 - V(I,J) = SUM(HP1(I,1:nx)*H(IYK(imain,J),1:nx,S(imain,2)))+ - # SUM(G(IYK(imain,I),1:nu,S(imain,3))* - # G(IYK(imain,J),1:nu,S(imain,3)))+COM(I,J)+COM(J,I) -230 V(J,I) = V(I,J) - -C ------------------------------------------------------------------- -C Updating equations: -C x0 = x1 + (P1*H'+R*G')*Vinv*INN -C p0 = p1 - (P1*H'+R*G')*Vinv*(P1*H'+R*G')' -C ------------------------------------------------------------------- - IF (iny.GT.0) THEN - COM(1:iny,1:iny) = V(1:iny,1:iny) - IFAIL = -1 -C CALL F01ADF(iny,COM(1:iny+1,1:iny),iny+1,IFAIL) - CALL DPOTRF('L',iny,COM(1:iny,1:iny),iny,IFAIL) ! COM = L*L' - CALL DPOTRI('L',iny,COM(1:iny,1:iny),iny,IFAIL) ! COM = VV^-1 - - DO 240 I=1,iny - Vinv(imain,I,I) = COM(I,I) - DO 240 J=1,I-1 - Vinv(imain,I,J) = COM(I,J) -240 Vinv(imain,J,I) = Vinv(imain,I,J) - - DO 260 I=1,nx - DO 260 J=1,iny -260 HPV(I,J) = SUM((HP1(1:iny,I)+RG(I,1:iny))*Vinv(imain,1:iny,J)) - - DO 270 I=1,nx -270 X0(I) = XT(imain,I)+SUM(HPV(I,1:iny)*INN(imain,1:iny)) - - DO 280 I=1,nx - P0(I,I) = PT(imain,I,I) - + - SUM(HPV(I,1:iny)*(HP1(1:iny,I)+RG(I,1:iny))) - DO 280 J=1,I-1 - P0(I,J) = PT(imain,I,J) - + - SUM(HPV(I,1:iny)*(HP1(1:iny,J)+RG(J,1:iny))) -280 P0(J,I) = P0(I,J) - - ELSE - - X0(1:nx) = XT(imain,1:nx) - P0(1:nx,1:nx) = PT(imain,1:nx,1:nx) - - ENDIF - -C ------------------------------------ -C Prediction x1 = c+F*x0 -C Prediction var. P1 = F*p0*F'+ R*R' -C ------------------------------------ - IF (imain.LT.nobs) THEN - DO 290 I=1,nx -290 XT(imain+1,I) = a(I,S(imain+1,4)) - + + SUM(F(I,1:nx,S(imain+1,5))*X0(1:nx)) - - DO 300 I=1,nx - DO 300 J=1,nx -300 FP(I,J) = SUM(F(I,1:nx,S(imain+1,5))*P0(1:nx,J)) - - DO 310 I=1,nx - PT(imain+1,I,I) = SUM(FP(I,:)*F(I,:,S(imain+1,5))) - + + SUM(R(I,1:nu,S(imain+1,6))*R(I,1:nu,S(imain+1,6))) - DO 310 J=1,I-1 - PT(imain+1,I,J) = SUM(FP(I,:)*F(J,:,S(imain+1,5))) - + + SUM(R(I,1:nu,S(imain+1,6))*R(J,1:nu,S(imain+1,6))) -310 PT(imain+1,J,I) = PT(imain+1,I,J) - ENDIF -400 CONTINUE - -C **** SMOOTHING BAKWARD RECURSIONS **** - RECR(1:nx) = 0.D0 - RECN(1:nx,1:nx) = 0.D0 - DO 600 ITIME = nobs,d(1)+1,-1 - iny = IYK(ITIME,ny+1) - -C R*G' and H'*Vinv - DO 420 J=1,iny - DO 420 I=1,nx - RG(I,J)=SUM(R(I,1:nu,S(ITIME,6))*G(IYK(ITIME,J),1:nu,S(ITIME,3))) -420 PHFs(I,J) = - # SUM(H(IYK(ITIME,1:iny),I,S(ITIME,2))*Vinv(ITIME,1:iny,J)) - -C F(t+1)*P(t|t-1) - DO 430 I=1,nx - DO 430 J=1,nx -430 FP(I,J) = SUM(F(I,1:nx,S(min(nobs,ITIME+1),5))*PT(ITIME,1:nx,J)) - -C H'*Vinv*H - DO 440 I=1,nx - APPO(I,I) = SUM(PHFs(I,1:iny)*H(IYK(ITIME,1:iny),I,S(ITIME,2))) - DO 440 J=1,I-1 - APPO(I,J) = SUM(PHFs(I,1:iny)*H(IYK(ITIME,1:iny),J,S(ITIME,2))) -440 APPO(J,I) = APPO(I,J) - -C L(t) = F(t+1)-(F(t+1)*P(t|t-1)*H(t)'+R(t)*G(t)')*Vinv(t)*H(t) - DO 450 I=1,nx - DO 450 J=1,nx -450 PFP(I,J) = F(I,J,S(min(nobs,ITIME+1),5)) - + - SUM(FP(I,1:nx)*APPO(1:nx,J)) - + - SUM(RG(I,1:iny)*PHFs(J,1:iny)) - -C r(t-1) = H(t)'*Vinv(t)*INN(t)+L(t)'*r(t) - DO 460 I=1,nx -460 WORK(I) = SUM(PFP(1:nx,I)*RECR(1:nx)) - - DO 470 I=1,nx -470 RECR(I) = WORK(I) + SUM(PHFs(I,1:iny)*INN(ITIME,1:iny)) - -C N(t-1) = H(t)'*Vinv(t)*H(t)+L(t)'*N(t)*L(t) - DO 480 I=1,nx - DO 480 J=1,nx -480 CC(I,J) = SUM(PFP(1:nx,I)*RECN(1:nx,J)) ! L(t)'*N(t) - - DO 490 I=1,nx - RECN(I,I) = APPO(I,I) + SUM(CC(I,1:nx)*PFP(1:nx,I)) - DO 490 J=1,I-1 - RECN(I,J) = APPO(I,J) + SUM(CC(I,1:nx)*PFP(1:nx,J)) -490 RECN(J,I) = RECN(I,J) - -C X(t|T) = X(t|t-1) + P(t|t-1)*r(t-1) - DO 500 I = 1,nx -500 XS(ITIME,I) = XT(ITIME,I) + SUM(PT(ITIME,I,1:nx)*RECR(1:nx)) - -C P(t|T) = P(t|t-1) - P(t|t-1)*N(t-1)*P(t|t-1) - DO 510 I=1,nx - DO 510 J=1,nx -510 CC(I,J) = SUM(PT(ITIME,I,1:nx)*RECN(1:nx,J)) ! P(t|t-1)*N(t-1) - - DO 520 I=1,nx - PS(ITIME,I,I) = PT(ITIME,I,I) - SUM(CC(I,1:nx)*PT(ITIME,1:nx,I)) - DO 520 J=1,I-1 - PS(ITIME,I,J) = PT(ITIME,I,J) - SUM(CC(I,1:nx)*PT(ITIME,1:nx,J)) -520 PS(ITIME,J,I) = PS(ITIME,I,J) - -600 CONTINUE - -C INITIAL KALMAN SAMOOTING - RECRI(1:nx) = 0.D0 - DO 800 ITIME = d(1),1,-1 - iny = IYK(ITIME,ny+1) -C L(t) = F(t)-Kst(t)*H(t) - DO 610 I=1,nx - DO 610 J=1,nx -610 PFP(I,J) = F(I,J,S(ITIME,5)) - + - SUM(Kst(ITIME,I,1:iny)*H(IYK(ITIME,1:iny),J,S(ITIME,2))) - -C r(t-1) = H(t)'*Fsm*INN(t) + L(t)'*r(t) -C ri(t-1) = H(t)'*Fim*INN(t) + L(t)'*ri(t) + Li(t)'*r(t) - DO 620 I=1,nx - WORK(I) = SUM(PFP(1:nx,I)*RECR(1:nx)) ! L(t)'*r(t) -620 WORK(nx+I) = SUM(PFP(1:nx,I)*RECRI(1:nx)) ! L(t)'*ri(t) - -C Li(t) = -Kit(t)*H(t) - DO 621 I=1,nx - DO 621 J=1,nx -621 PFP(I,J) = - # - SUM(Kit(ITIME,I,1:iny)*H(IYK(ITIME,1:iny),J,S(ITIME,2))) - -C L(t)'*ri(t) + Li(t)'*r(t) - DO 622 I=1,nx -622 WORK(nx+I) = WORK(nx+I)+SUM(PFP(1:nx,I)*RECR(1:nx)) - -C H'*Fsm - DO 625 I=1,nx - DO 625 J=1,iny -625 PHFs(I,J) = - # SUM(H(IYK(ITIME,1:iny),I,S(ITIME,2))*Vis(ITIME,1:iny,J)) - - DO 630 I=1,nx -630 RECR(I) = WORK(I) + SUM(PHFs(I,1:iny)*INN(ITIME,1:iny)) - -C H'*Fim - DO 631 I=1,nx - DO 631 J=1,iny -631 PHFs(I,J) = - # SUM(H(IYK(ITIME,1:iny),I,S(ITIME,2))*Vii(ITIME,1:iny,J)) - - DO 632 I=1,nx -632 RECRI(I) = WORK(nx+I) + SUM(PHFs(I,1:iny)*INN(ITIME,1:iny)) - -C X(d|T) = X(d|d-1) + Psd*r(t-1) + Pid*ri(t-1) - DO 660 I = 1,nx -660 XS(ITIME,I) = XT(ITIME,I) + SUM(PT(ITIME,I,1:nx)*RECR(1:nx)) - + + SUM(Pi(ITIME,I,1:nx)*RECRI(1:nx)) - -800 CONTINUE - - DEALLOCATE(Pi,HPs,HPi,Fi,Fs,Fim,Fsm,PHFs,PHFi,FFF,Mi,Ms,Ci, - 1 Kst,Kit,W1,WORK,WORK1,PFP,APPO,APPO1,COM,RG,FP,HP1,V,CC,HPV, - 2 X0,P0,RECR,RECRI,RECN,XT,PT,INN,Vinv,Vis,Vii) - - RETURN - END - -C This is the variance and must be completed!! -C N(t-1) = H(t)'*Vinv(t)*H(t)+L(t)'*N(t)*L(t) -c DO 640 I=1,nx -c DO 640 J=1,nx -c640 CC(I,J) = SUM(PFP(1:nx,I)*RECN(1:nx,J)) ! L(t)'*N(t) -c DO 650 I=1,nx -c RECN(I,I) = APPO(I,I) + SUM(CC(I,1:nx)*PFP(1:nx,I)) -c DO 650 J=1,I-1 -c RECN(I,J) = APPO(I,J) + SUM(CC(I,1:nx)*PFP(1:nx,J)) -c650 RECN(J,I) = RECN(I,J) -C P(t|T) = P(t|t-1) - P(t|t-1)*N(t-1)*P(t|t-1) -c DO 670 I=1,nx -c DO 670 J=1,nx -c670 CC(I,J) = SUM(PT(ITIME,I,1:nx)*RECN(1:nx,J)) ! P(t|t-1)*N(t-1) -c -c DO 680 I=1,nx -c PS(ITIME,I,I) = PT(ITIME,I,I) - SUM(CC(I,1:nx)*PT(ITIME,1:nx,I)) -c DO 680 J=1,I-1 -c PS(ITIME,I,J) = PT(ITIME,I,J) - SUM(CC(I,1:nx)*PT(ITIME,1:nx,J)) -c680 PS(ITIME,J,I) = PS(ITIME,I,J) - +C along with DMM. If not, see <http://www.gnu.org/licenses/>. +C -------------------------------------------------------------------- + SUBROUTINE KS(nobs,d,ny,nz,nx,nu,ns,S,yk,IYK,c,H,G,a,F,R,XS,PS) +C INPUT + INTEGER nobs,d(2),ny,nz,nx,nu,ns(6),S(nobs,6),IYK(nobs,ny+1) + DOUBLE PRECISION yk(nobs,ny+nz),c(ny,max(nz,1),ns(1)), + 1 H(ny,nx,ns(2)),G(ny,nu,ns(3)),a(nx,ns(4)),F(nx,nx,ns(5)), + 2 R(nx,nu,ns(6)) + +C OUTPUT + DOUBLE PRECISION XS(nobs,nx),PS(nobs,nx,nx) + +C LOCALS + INTEGER imain,iny,I,J,IFAIL,FiRANK,ITIME + INTEGER IPIV(nx) + DOUBLE PRECISION TOL,SUMW1 + DOUBLE PRECISION,ALLOCATABLE:: Pi(:,:,:),HPs(:,:),HPi(:,:), + 1 Fi(:,:),Fs(:,:),Fim(:,:),Fsm(:,:),PHFs(:,:),PHFi(:,:),FFF(:,:), + 2 Mi(:,:),Ms(:,:),Ci(:,:),Kst(:,:,:),Kit(:,:,:),W1(:),WORK(:), + 3 WORK1(:),PFP(:,:),APPO(:,:),APPO1(:,:),COM(:,:),RG(:,:), + 4 FP(:,:),HP1(:,:),V(:,:),CC(:,:),HPV(:,:),X0(:),P0(:,:), + 5 RECR(:),RECRI(:),RECN(:,:),XT(:,:),PT(:,:,:),INN(:,:), + 1 Vinv(:,:,:),Vis(:,:,:),Vii(:,:,:) + +C EXTERNAL SUBROUTINES + EXTERNAL INVF,INVFBIS,LYAP,DSYEV,DPOTRF,DPOTRI,DGETRF,DGETRI + + ALLOCATE(Pi(d(1),nx,nx),HPs(ny,nx),HPi(ny,nx), + 1 Fi(ny,ny),Fs(ny,ny),Fim(ny,ny),Fsm(ny,ny), + 2 PHFs(nx,ny),PHFi(nx,ny),FFF(ny,ny),Mi(nx,ny),Ms(nx,ny),Ci(nx,nx), + 3 Kst(d(1),nx,ny),Kit(d(1),nx,ny)) + + ALLOCATE(W1(ny),WORK(64*nx),WORK1(64*ny), + 1 PFP(nx,nx),APPO(nx,nx),APPO1(nx,ny),COM(ny+1,ny),RG(nx,ny)) + + ALLOCATE(FP(nx,nx),HP1(ny,nx),V(ny,ny),CC(nx,nx), + 1 HPV(nx,ny),X0(nx),P0(nx,nx),RECR(nx),RECRI(nx),RECN(nx,nx)) + + ALLOCATE(XT(nobs,nx),PT(nobs,nx,nx),INN(nobs,ny), + 1 Vinv(nobs,ny,ny),Vis(d(1),ny,ny),Vii(d(1),ny,ny)) + + TOL = 1.D-3 +C Unconditional mean and variance + IF (d(1).EQ.0) THEN ! stationary models + IF(SUM(ABS(a(:,S(1,4)))).EQ.0.D0) THEN + XT(1,:) = 0.D0 ! X(1|0) + ELSE + APPO = -F(:,:,S(1,5)) + DO 1 I = 1,nx +1 APPO(I,I) = 1.D0+APPO(I,I) +C CALL F07ADF(nx,nx,APPO,nx,IPIV,IFAIL) +C CALL F07AJF(nx,APPO,nx,IPIV,WORK,64*nx,IFAIL) + CALL DGETRF(nx,nx,APPO,nx,IPIV,IFAIL) + CALL DGETRI(nx,APPO,nx,IPIV,WORK,64*nx,IFAIL) + + DO 2 I =1,nx +2 XT(1,I) = SUM(APPO(I,:)*a(:,S(1,4))) ! inv(I-F)*a + ENDIF + +C P(1|0) - F*P(1|0)*F' = R*R' + CALL LYAP(nx,nu,TOL,F(:,:,S(1,5)),R(:,:,S(1,6)),PT(1,:,:)) + ELSE +C ----------------------------------------------------------- +C Non-stationary models +C Define X(1) = aa + A*eta + B*delta (A*B' = 0) +C eta~N(0,I), delta~N(0,k*I) k -> +inf +C X(1)~N(aa,P), P=Ps+k*Pi, Ps=AA', Pi=BB'. +C CARE!! aa (uncond. mean),Ps, and Pi to be filled by users +C ----------------------------------------------------------- + XT(1,1:nx) = 0.D0 ! X(1|0) + PT(1,1:nx,1:nx) = 0.D0 ! P(1|0) + IF (d(2).LT.nx) THEN + IF(SUM(ABS(a(d(2)+1:nx,S(1,4)))).NE.0.D0) THEN + APPO(d(2)+1:nx,d(2)+1:nx) = -F(d(2)+1:nx,d(2)+1:nx,S(1,5)) + DO 3 I = d(2)+1,nx +3 APPO(I,I) = 1.D0+APPO(I,I) +C CALL F07ADF(nx-d(2),nx-d(2),APPO(d(2)+1:nx,d(2)+1:nx),nx-d(2), +C 1 IPIV(d(2)+1:nx),IFAIL) +C CALL F07AJF(nx-d(2),APPO(d(2)+1:nx,d(2)+1:nx),nx-d(2), +C 1 IPIV(d(2)+1:nx),WORK,64*nx,IFAIL) + CALL DGETRF(nx-d(2),nx-d(2),APPO(d(2)+1:nx,d(2)+1:nx),nx-d(2), + 1 IPIV(d(2)+1:nx),IFAIL) + CALL DGETRI(nx-d(2),APPO(d(2)+1:nx,d(2)+1:nx),nx-d(2), + 1 IPIV(d(2)+1:nx),WORK,64*nx,IFAIL) + + DO 4 I = d(2)+1,nx +4 XT(1,I) = SUM(APPO(I,d(2)+1:nx)*a(d(2)+1:nx,S(1,4))) ! inv(I-F)*a + ENDIF + +C Lyapunov eqn + CALL LYAP(nx-d(2),nu,TOL,F(d(2)+1:nx,d(2)+1:nx,S(1,5)), + 1 R(d(2)+1:nx,1:nu,S(1,6)),PT(1,d(2)+1:nx,d(2)+1:nx)) + ENDIF + + Pi(:,:,:) = 0.D0 + DO 5 I = 1,d(2) +5 Pi(1,I,I) = 1.D0 + + DO 200 imain = 1,d(1) + iny = IYK(imain,ny+1) + DO 30 I=1,iny + DO 30 J=1,nx +30 HPs(I,J) = SUM(H(IYK(imain,I),:,S(imain,2))*PT(imain,:,J)) + + DO 40 I=1,iny + Fs(I,I) = SUM(HPs(I,:)*H(IYK(imain,I),:,S(imain,2))) + + +SUM(G(IYK(imain,I),:,S(imain,3))*G(IYK(imain,I),:,S(imain,3))) + DO 40 J=1,I-1 + Fs(I,J) = SUM(HPs(I,:)*H(IYK(imain,J),:,S(imain,2))) + + +SUM(G(IYK(imain,I),:,S(imain,3))*G(IYK(imain,J),:,S(imain,3))) +40 Fs(J,I) = Fs(I,J) + + DO 50 I=1,iny + DO 50 J=1,nx +50 HPi(I,J) = SUM(H(IYK(imain,I),:,S(imain,2))*Pi(imain,:,J)) + + DO 60 I=1,iny + Fi(I,I) = SUM(HPi(I,:)*H(IYK(imain,I),:,S(imain,2))) + DO 60 J=1,I-1 + Fi(I,J) = SUM(HPi(I,:)*H(IYK(imain,J),:,S(imain,2))) +60 Fi(J,I) = Fi(I,J) + +C -------------------------------------------------------------------------- +C Computes inverse of the innovation variance matrix +C Cases: ny = 1, Fi is scalar >0 (or 0 not considered) +C ny > 1, Fi is full rank or singular (or 0 matrix not considered) +C -------------------------------------------------------------------------- + IF (iny.EQ.1) THEN + Fsm = 0.D0 + Fim = 1.D0/Fi + FFF = Fim*Fs*Fim + ELSE + + IFAIL = -1 + COM(1:iny,1:iny) = Fi(1:iny,1:iny) +C CALL F02FAF('N','U',iny,COM(1:iny,1:iny),iny,W1(1:iny), +C 1 WORK1,64*iny,IFAIL) + CALL DSYEV('N','U',iny,COM(1:iny,1:iny),iny,W1(1:iny), + 1 WORK1,64*iny,IFAIL) + + FiRANK = 0 + SUMW1 = SUM(ABS(W1(1:iny))) + DO 70 I=1,iny + W1(I) = W1(I)/SUMW1 +70 IF (W1(I).GT.1.D-10) FiRANK=FiRANK+1 + FiRANK = min(FiRANK,d(2)) + + IF(FiRANK.EQ.iny) THEN + Fsm = 0.D0 + COM(1:iny,1:iny) = Fi(1:iny,1:iny) + IFAIL = -1 +C CALL F01ADF(iny,COM(1:iny+1,1:iny),iny+1,IFAIL) + CALL DPOTRF('L',iny,COM(1:iny,1:iny),iny,IFAIL) ! COM = L*L' + CALL DPOTRI('L',iny,COM(1:iny,1:iny),iny,IFAIL) ! COM = VV^-1 + + DO 80 I=1,iny + Fim(I,I) = COM(I,I) + DO 80 J=1,I-1 + Fim(I,J) = COM(I,J) +80 Fim(J,I) = Fim(I,J) + + DO 81 I=1,iny + DO 81 J=1,iny +81 COM(I,J) = SUM(Fim(I,1:iny)*Fs(1:iny,J)) ! Fim x Fs + + DO 82 I=1,iny + FFF(I,I) = SUM(COM(I,1:iny)*Fim(1:iny,I)) + DO 82 J=1,I-1 + FFF(I,J) = SUM(COM(I,1:iny)*Fim(1:iny,J)) ! Fim x Fs x Fim +82 FFF(J,I) = FFF(I,J) + ELSE + SUMW1=0.D0 + DO I=Firank+1,iny + SUMW1 = SUMW1 + Fi(I,I) + ENDDO + IF (SUMW1.GT.0.D0) THEN + CALL INVFBIS(Fs(1:iny,1:iny),Fi(1:iny,1:iny),iny,FiRANK, + 1 Fsm(1:iny,1:iny),Fim(1:iny,1:iny),FFF(1:iny,1:iny)) + ELSE + CALL INVF(Fs(1:iny,1:iny),Fi(1:iny,1:iny),iny,FiRANK, + 1 Fsm(1:iny,1:iny),Fim(1:iny,1:iny),FFF(1:iny,1:iny)) + ENDIF + ENDIF + ENDIF + Vis(imain,1:iny,1:iny) = Fsm(1:iny,1:iny) + Vii(imain,1:iny,1:iny) = Fim(1:iny,1:iny) + +C ------------------------------------------------------------------ +C X(d|d) = X(d|d-1)+((Ps*H'+R*G')*Fsm+Pi*H'*Fim)*(Y(d)-H*X(d|d-1)-c) +C ------------------------------------------------------------------ + DO 85 I = 1,nx + DO 85 J = 1,iny + RG(I,J) = + # SUM(R(I,1:nu,S(imain,6))*G(IYK(imain,J),1:nu,S(imain,3))) +85 HPs(J,I) = HPs(J,I) + RG(I,J) ! HPs = (Ps*H'+R*G')' + + DO 90 I = 1,nx + DO 90 J = 1,iny + PHFs(I,J) = SUM(HPs(1:iny,I)*Fsm(1:iny,J)) +90 PHFi(I,J) = SUM(HPi(1:iny,I)*Fim(1:iny,J)) + +C Innovations + DO 100 I=1,iny +100 INN(imain,I) = yk(imain,IYK(imain,I)) + + - SUM(H(IYK(imain,I),1:nx,S(imain,2))*XT(imain,1:nx)) + + - SUM(c(IYK(imain,I),1:nz,S(imain,1))*yk(imain,ny+1:ny+nz)) + + DO 110 I=1,nx +110 X0(I) = XT(imain,I) + + + SUM((PHFs(I,1:iny)+PHFi(I,1:iny))*INN(imain,1:iny)) + +C P(d|d) = P(d|d-1) + Pi*H'*Fim*Fs*Fim*H*Pi - Ps*H'*Fsm*H*Ps - Ps*H'*Fim*H*Pi - (Ps*H'*Fim*H*Pi)' +C - Ps*H'*Fsm*H*Ps + DO 120 I = 1,nx + APPO(I,I) = -SUM(PHFs(I,1:iny)*HPs(1:iny,I)) + DO 120 J = 1,I-1 + APPO(I,J) = -SUM(PHFs(I,1:iny)*HPs(1:iny,J)) +120 APPO(J,I) = APPO(I,J) + +C - Ps*H'*Fim*H*Pi - (Ps*H'*Fim*H*Pi)' + DO 130 I = 1,nx + APPO(I,I) = APPO(I,I) - SUM(HPs(1:iny,I)*PHFi(I,1:iny)) + + - SUM(PHFi(I,1:iny)*HPs(1:iny,I)) + DO 130 J = 1,I-1 + APPO(I,J) = APPO(I,J) - SUM(HPs(1:iny,I)*PHFi(J,1:iny)) + + - SUM(PHFi(I,1:iny)*HPs(1:iny,J)) +130 APPO(J,I) = APPO(I,J) + +C Pi*H'*Fim*Fs*Fim*H*Pi + DO 140 I = 1,nx + DO 140 J = 1,iny +140 APPO1(I,J) = SUM(HPi(1:iny,I)*FFF(1:iny,J)) + + DO 150 I = 1,nx + PFP(I,I) = SUM(APPO1(I,1:iny)*HPi(1:iny,I)) + DO 150 J = 1,I-1 + PFP(I,J) = SUM(APPO1(I,1:iny)*HPi(1:iny,J)) +150 PFP(J,I) = PFP(I,J) + + P0(:,:) = PT(imain,:,:) + PFP(:,:) + APPO(:,:) + +C Mi = F*Pi*H' + DO 151 I = 1,nx + DO 151 J = 1,nx +151 PFP(I,J) = SUM(F(I,1:nx,S(imain,5))*Pi(imain,1:nx,J)) ! F*Pi + + DO 152 I = 1,nx + DO 152 J = 1,iny +152 Mi(I,J) = SUM(PFP(I,1:nx)*H(IYK(imain,J),1:nx,S(imain,2))) + +C Ms = F*Ps*H' + R*G' + DO 153 I = 1,nx + DO 153 J = 1,nx +153 FP(I,J) = SUM(F(I,:,S(imain,5))*PT(imain,:,J)) ! F*Ps + + DO 154 I = 1,nx + DO 154 J = 1,iny +154 Ms(I,J)=RG(I,J)+SUM(FP(I,1:nx)*H(IYK(imain,J),1:nx,S(imain,2))) + +C Kit = Ms*Fim - Mi*FFF +C Kst = Ms*Fsm + Mi*Fim + DO 155 I = 1,nx + DO 155 J = 1,iny + Kit(imain,I,J) = SUM(Ms(I,1:iny)*Fim(1:iny,J)) + + - SUM(Mi(I,1:iny)*FFF(1:iny,J)) +155 Kst(imain,I,J) = SUM(Ms(I,1:iny)*Fsm(1:iny,J)) + + + SUM(Mi(I,1:iny)*Fim(1:iny,J)) + +C ---------------------------------- +C Predictions X(t+1|t) and P(t+1|t) +C ---------------------------------- + IF (imain.LT.d(1)) THEN +C Pi+1 = F*Pi*F'-Ci + +C Ci = Mi*Fim*Mi' + DO 164 I = 1,nx + DO 164 J = 1,iny +164 RG(I,J) = SUM(Mi(I,1:iny)*Fim(1:iny,J)) ! Mi*Fim + + DO 166 I = 1,nx + Ci(I,I) = SUM(RG(I,1:iny)*Mi(I,1:iny)) + DO 166 J = 1,I-1 +166 Ci(I,J) = SUM(RG(I,1:iny)*Mi(J,1:iny)) + + DO 168 I = 1,nx + Pi(imain+1,I,I)=SUM(PFP(I,1:nx)*F(I,1:nx,S(imain+1,5)))-Ci(I,I) + DO 168 J = 1,I-1 + Pi(imain+1,I,J)=SUM(PFP(I,1:nx)*F(J,1:nx,S(imain+1,5)))-Ci(I,J) +168 Pi(imain+1,J,I) = Pi(imain+1,I,J) + + ENDIF + +C X(t+1|t) = a + F*X(t|t) + DO 170 I=1,nx +170 XT(imain+1,I) = a(I,S(imain+1,4)) + + + SUM(F(I,1:nx,S(imain+1,5))*X0(1:nx)) + +C P(t+1|t) = F*PddF' + R*R' + DO 172 I = 1,nx + DO 172 J = 1,nx +172 APPO(I,J) = SUM(F(I,:,S(imain+1,5))*P0(:,J)) ! F*Pdd + + DO 180 I = 1,nx + PT(imain+1,I,I) = SUM(APPO(I,1:nx)*F(I,1:nx,S(imain+1,5))) + + + SUM(R(I,1:nu,S(imain+1,6))*R(I,1:nu,S(imain+1,6))) + DO 180 J = 1,I-1 + PT(imain+1,I,J) = SUM(APPO(I,1:nx)*F(J,1:nx,S(imain+1,5))) + + + SUM(R(I,1:nu,S(imain+1,6))*R(J,1:nu,S(imain+1,6))) +180 PT(imain+1,J,I) = PT(imain+1,I,J) + +200 CONTINUE + ENDIF + + DO 400 imain = d(1)+1,nobs + iny = IYK(imain,ny+1) +C ------------------------------- +C Innovations: INN = yk-H*X1-c*z +C ------------------------------- + DO 210 I=1,iny +210 INN(imain,I) = yk(imain,IYK(imain,I)) + + - SUM(H(IYK(imain,I),1:nx,S(imain,2))*XT(imain,:)) + + - SUM(c(IYK(imain,I),1:nz,S(imain,1))*yk(imain,ny+1:ny+nz)) + +C ---------------------------------------------------------- +C Innovation variance V = H*P1*H' + G*G' + H*R*G' + G*R'*H' +C ---------------------------------------------------------- + DO 220 I=1,iny + DO 220 J=1,nx +220 HP1(I,J) = SUM(H(IYK(imain,I),1:nx,S(imain,2))*PT(imain,1:nx,J)) + + DO 221 I=1,nx + DO 221 J=1,iny +221 RG(I,J)=SUM(R(I,1:nu,S(imain,6))*G(IYK(imain,J),1:nu,S(imain,3))) + + DO 222 I=1,iny + DO 222 J=1,iny +222 COM(I,J)=SUM(H(IYK(imain,I),1:nx,S(imain,2))*RG(1:nx,J)) ! H*R*G' + + DO 230 I=1,iny + V(I,I) = SUM(HP1(I,1:nx)*H(IYK(imain,I),1:nx,S(imain,2))) + # + SUM(G(IYK(imain,I),1:nu,S(imain,3))* + # G(IYK(imain,I),1:nu,S(imain,3))) + 2.*COM(I,I) + DO 230 J=1,I-1 + V(I,J) = SUM(HP1(I,1:nx)*H(IYK(imain,J),1:nx,S(imain,2)))+ + # SUM(G(IYK(imain,I),1:nu,S(imain,3))* + # G(IYK(imain,J),1:nu,S(imain,3)))+COM(I,J)+COM(J,I) +230 V(J,I) = V(I,J) + +C ------------------------------------------------------------------- +C Updating equations: +C x0 = x1 + (P1*H'+R*G')*Vinv*INN +C p0 = p1 - (P1*H'+R*G')*Vinv*(P1*H'+R*G')' +C ------------------------------------------------------------------- + IF (iny.GT.0) THEN + COM(1:iny,1:iny) = V(1:iny,1:iny) + IFAIL = -1 +C CALL F01ADF(iny,COM(1:iny+1,1:iny),iny+1,IFAIL) + CALL DPOTRF('L',iny,COM(1:iny,1:iny),iny,IFAIL) ! COM = L*L' + CALL DPOTRI('L',iny,COM(1:iny,1:iny),iny,IFAIL) ! COM = VV^-1 + + DO 240 I=1,iny + Vinv(imain,I,I) = COM(I,I) + DO 240 J=1,I-1 + Vinv(imain,I,J) = COM(I,J) +240 Vinv(imain,J,I) = Vinv(imain,I,J) + + DO 260 I=1,nx + DO 260 J=1,iny +260 HPV(I,J) = SUM((HP1(1:iny,I)+RG(I,1:iny))*Vinv(imain,1:iny,J)) + + DO 270 I=1,nx +270 X0(I) = XT(imain,I)+SUM(HPV(I,1:iny)*INN(imain,1:iny)) + + DO 280 I=1,nx + P0(I,I) = PT(imain,I,I) + + - SUM(HPV(I,1:iny)*(HP1(1:iny,I)+RG(I,1:iny))) + DO 280 J=1,I-1 + P0(I,J) = PT(imain,I,J) + + - SUM(HPV(I,1:iny)*(HP1(1:iny,J)+RG(J,1:iny))) +280 P0(J,I) = P0(I,J) + + ELSE + + X0(1:nx) = XT(imain,1:nx) + P0(1:nx,1:nx) = PT(imain,1:nx,1:nx) + + ENDIF + +C ------------------------------------ +C Prediction x1 = c+F*x0 +C Prediction var. P1 = F*p0*F'+ R*R' +C ------------------------------------ + IF (imain.LT.nobs) THEN + DO 290 I=1,nx +290 XT(imain+1,I) = a(I,S(imain+1,4)) + + + SUM(F(I,1:nx,S(imain+1,5))*X0(1:nx)) + + DO 300 I=1,nx + DO 300 J=1,nx +300 FP(I,J) = SUM(F(I,1:nx,S(imain+1,5))*P0(1:nx,J)) + + DO 310 I=1,nx + PT(imain+1,I,I) = SUM(FP(I,:)*F(I,:,S(imain+1,5))) + + + SUM(R(I,1:nu,S(imain+1,6))*R(I,1:nu,S(imain+1,6))) + DO 310 J=1,I-1 + PT(imain+1,I,J) = SUM(FP(I,:)*F(J,:,S(imain+1,5))) + + + SUM(R(I,1:nu,S(imain+1,6))*R(J,1:nu,S(imain+1,6))) +310 PT(imain+1,J,I) = PT(imain+1,I,J) + ENDIF +400 CONTINUE + +C **** SMOOTHING BAKWARD RECURSIONS **** + RECR(1:nx) = 0.D0 + RECN(1:nx,1:nx) = 0.D0 + DO 600 ITIME = nobs,d(1)+1,-1 + iny = IYK(ITIME,ny+1) + +C R*G' and H'*Vinv + DO 420 J=1,iny + DO 420 I=1,nx + RG(I,J)=SUM(R(I,1:nu,S(ITIME,6))*G(IYK(ITIME,J),1:nu,S(ITIME,3))) +420 PHFs(I,J) = + # SUM(H(IYK(ITIME,1:iny),I,S(ITIME,2))*Vinv(ITIME,1:iny,J)) + +C F(t+1)*P(t|t-1) + DO 430 I=1,nx + DO 430 J=1,nx +430 FP(I,J) = SUM(F(I,1:nx,S(min(nobs,ITIME+1),5))*PT(ITIME,1:nx,J)) + +C H'*Vinv*H + DO 440 I=1,nx + APPO(I,I) = SUM(PHFs(I,1:iny)*H(IYK(ITIME,1:iny),I,S(ITIME,2))) + DO 440 J=1,I-1 + APPO(I,J) = SUM(PHFs(I,1:iny)*H(IYK(ITIME,1:iny),J,S(ITIME,2))) +440 APPO(J,I) = APPO(I,J) + +C L(t) = F(t+1)-(F(t+1)*P(t|t-1)*H(t)'+R(t)*G(t)')*Vinv(t)*H(t) + DO 450 I=1,nx + DO 450 J=1,nx +450 PFP(I,J) = F(I,J,S(min(nobs,ITIME+1),5)) + + - SUM(FP(I,1:nx)*APPO(1:nx,J)) + + - SUM(RG(I,1:iny)*PHFs(J,1:iny)) + +C r(t-1) = H(t)'*Vinv(t)*INN(t)+L(t)'*r(t) + DO 460 I=1,nx +460 WORK(I) = SUM(PFP(1:nx,I)*RECR(1:nx)) + + DO 470 I=1,nx +470 RECR(I) = WORK(I) + SUM(PHFs(I,1:iny)*INN(ITIME,1:iny)) + +C N(t-1) = H(t)'*Vinv(t)*H(t)+L(t)'*N(t)*L(t) + DO 480 I=1,nx + DO 480 J=1,nx +480 CC(I,J) = SUM(PFP(1:nx,I)*RECN(1:nx,J)) ! L(t)'*N(t) + + DO 490 I=1,nx + RECN(I,I) = APPO(I,I) + SUM(CC(I,1:nx)*PFP(1:nx,I)) + DO 490 J=1,I-1 + RECN(I,J) = APPO(I,J) + SUM(CC(I,1:nx)*PFP(1:nx,J)) +490 RECN(J,I) = RECN(I,J) + +C X(t|T) = X(t|t-1) + P(t|t-1)*r(t-1) + DO 500 I = 1,nx +500 XS(ITIME,I) = XT(ITIME,I) + SUM(PT(ITIME,I,1:nx)*RECR(1:nx)) + +C P(t|T) = P(t|t-1) - P(t|t-1)*N(t-1)*P(t|t-1) + DO 510 I=1,nx + DO 510 J=1,nx +510 CC(I,J) = SUM(PT(ITIME,I,1:nx)*RECN(1:nx,J)) ! P(t|t-1)*N(t-1) + + DO 520 I=1,nx + PS(ITIME,I,I) = PT(ITIME,I,I) - SUM(CC(I,1:nx)*PT(ITIME,1:nx,I)) + DO 520 J=1,I-1 + PS(ITIME,I,J) = PT(ITIME,I,J) - SUM(CC(I,1:nx)*PT(ITIME,1:nx,J)) +520 PS(ITIME,J,I) = PS(ITIME,I,J) + +600 CONTINUE + +C INITIAL KALMAN SAMOOTING + RECRI(1:nx) = 0.D0 + DO 800 ITIME = d(1),1,-1 + iny = IYK(ITIME,ny+1) +C L(t) = F(t)-Kst(t)*H(t) + DO 610 I=1,nx + DO 610 J=1,nx +610 PFP(I,J) = F(I,J,S(ITIME,5)) + + - SUM(Kst(ITIME,I,1:iny)*H(IYK(ITIME,1:iny),J,S(ITIME,2))) + +C r(t-1) = H(t)'*Fsm*INN(t) + L(t)'*r(t) +C ri(t-1) = H(t)'*Fim*INN(t) + L(t)'*ri(t) + Li(t)'*r(t) + DO 620 I=1,nx + WORK(I) = SUM(PFP(1:nx,I)*RECR(1:nx)) ! L(t)'*r(t) +620 WORK(nx+I) = SUM(PFP(1:nx,I)*RECRI(1:nx)) ! L(t)'*ri(t) + +C Li(t) = -Kit(t)*H(t) + DO 621 I=1,nx + DO 621 J=1,nx +621 PFP(I,J) = + # - SUM(Kit(ITIME,I,1:iny)*H(IYK(ITIME,1:iny),J,S(ITIME,2))) + +C L(t)'*ri(t) + Li(t)'*r(t) + DO 622 I=1,nx +622 WORK(nx+I) = WORK(nx+I)+SUM(PFP(1:nx,I)*RECR(1:nx)) + +C H'*Fsm + DO 625 I=1,nx + DO 625 J=1,iny +625 PHFs(I,J) = + # SUM(H(IYK(ITIME,1:iny),I,S(ITIME,2))*Vis(ITIME,1:iny,J)) + + DO 630 I=1,nx +630 RECR(I) = WORK(I) + SUM(PHFs(I,1:iny)*INN(ITIME,1:iny)) + +C H'*Fim + DO 631 I=1,nx + DO 631 J=1,iny +631 PHFs(I,J) = + # SUM(H(IYK(ITIME,1:iny),I,S(ITIME,2))*Vii(ITIME,1:iny,J)) + + DO 632 I=1,nx +632 RECRI(I) = WORK(nx+I) + SUM(PHFs(I,1:iny)*INN(ITIME,1:iny)) + +C X(d|T) = X(d|d-1) + Psd*r(t-1) + Pid*ri(t-1) + DO 660 I = 1,nx +660 XS(ITIME,I) = XT(ITIME,I) + SUM(PT(ITIME,I,1:nx)*RECR(1:nx)) + + + SUM(Pi(ITIME,I,1:nx)*RECRI(1:nx)) + +800 CONTINUE + + DEALLOCATE(Pi,HPs,HPi,Fi,Fs,Fim,Fsm,PHFs,PHFi,FFF,Mi,Ms,Ci, + 1 Kst,Kit,W1,WORK,WORK1,PFP,APPO,APPO1,COM,RG,FP,HP1,V,CC,HPV, + 2 X0,P0,RECR,RECRI,RECN,XT,PT,INN,Vinv,Vis,Vii) + + RETURN + END + +C This is the variance and must be completed!! +C N(t-1) = H(t)'*Vinv(t)*H(t)+L(t)'*N(t)*L(t) +c DO 640 I=1,nx +c DO 640 J=1,nx +c640 CC(I,J) = SUM(PFP(1:nx,I)*RECN(1:nx,J)) ! L(t)'*N(t) +c DO 650 I=1,nx +c RECN(I,I) = APPO(I,I) + SUM(CC(I,1:nx)*PFP(1:nx,I)) +c DO 650 J=1,I-1 +c RECN(I,J) = APPO(I,J) + SUM(CC(I,1:nx)*PFP(1:nx,J)) +c650 RECN(J,I) = RECN(I,J) +C P(t|T) = P(t|t-1) - P(t|t-1)*N(t-1)*P(t|t-1) +c DO 670 I=1,nx +c DO 670 J=1,nx +c670 CC(I,J) = SUM(PT(ITIME,I,1:nx)*RECN(1:nx,J)) ! P(t|t-1)*N(t-1) +c +c DO 680 I=1,nx +c PS(ITIME,I,I) = PT(ITIME,I,I) - SUM(CC(I,1:nx)*PT(ITIME,1:nx,I)) +c DO 680 J=1,I-1 +c PS(ITIME,I,J) = PT(ITIME,I,J) - SUM(CC(I,1:nx)*PT(ITIME,1:nx,J)) +c680 PS(ITIME,J,I) = PS(ITIME,I,J) + diff --git a/ks2.for b/ks2.for index e279dbbbb4d67a6263fb90b952ec30b6f5dadc5f..33850caaf56e28ff3fa1e772a64e2d647fb75626 100644 --- a/ks2.for +++ b/ks2.for @@ -1,34 +1,34 @@ -C -------------------------------------------------------------------- -C KS2 (no missing values) IMPLEMENTS THE KALMAN SMMOOTHER RECURSIONS in -C Koopman (1997), JASA, 92, 440, 1630-38 -C Developed by A.Rossi, C.Planas and G.Fiorentini -C -C XS = E[x(t)|y(1),...,y(nobs)] -C PS = V[x(t)|y(1),...,y(nobs)], t = 1,2,...,nobs -C -C State-space format: y(t) = c(t)z(t) + H(t)x(t) + G(t)u(t) -C x(t) = a(t) + F(t)x(t-1) + R(t)u(t) -C -C y(t) (ny x 1) ny = # of endogenous series -C z(t) (nz x 1) nz = # of exogenous series -C x(t) (nx x 1) nx = # of continous states -C u(t) (nu x 1) nu = # of shocks -C c(t) (ny x nz x ns1) ns1 = # of states for c(t) -C H(t) (ny x nx x ns2) ns2 = # of states for S2(t) -C G(t) (ny x nu x ns3) ns3 = # of states for S3(t) -C a(t) (nx x ns4) ns4 = # of states for S4(t) -C F(t) (nx x nx x ns5) ns5 = # of states for S5(t) -C R(t) (nx x nu x ns6) ns6 = # of states for S6(t) -C -C d(1): order of integration of the system -C d(2): number of non-stationary elements -C -C Copyright (C) 2010-2014 European Commission -C +C -------------------------------------------------------------------- +C KS2 (no missing values) IMPLEMENTS THE KALMAN SMMOOTHER RECURSIONS in +C Koopman (1997), JASA, 92, 440, 1630-38 +C Developed by A.Rossi, C.Planas and G.Fiorentini +C +C XS = E[x(t)|y(1),...,y(nobs)] +C PS = V[x(t)|y(1),...,y(nobs)], t = 1,2,...,nobs +C +C State-space format: y(t) = c(t)z(t) + H(t)x(t) + G(t)u(t) +C x(t) = a(t) + F(t)x(t-1) + R(t)u(t) +C +C y(t) (ny x 1) ny = # of endogenous series +C z(t) (nz x 1) nz = # of exogenous series +C x(t) (nx x 1) nx = # of continous states +C u(t) (nu x 1) nu = # of shocks +C c(t) (ny x nz x ns1) ns1 = # of states for c(t) +C H(t) (ny x nx x ns2) ns2 = # of states for S2(t) +C G(t) (ny x nu x ns3) ns3 = # of states for S3(t) +C a(t) (nx x ns4) ns4 = # of states for S4(t) +C F(t) (nx x nx x ns5) ns5 = # of states for S5(t) +C R(t) (nx x nu x ns6) ns6 = # of states for S6(t) +C +C d(1): order of integration of the system +C d(2): number of non-stationary elements +C +C Copyright (C) 2010-2014 European Commission +C C This file is part of Program DMM C -C DMM is free software developed at the Joint Research Centre of the -C European Commission: you can redistribute it and/or modify it under +C DMM is free software developed at the Joint Research Centre of the +C European Commission: you can redistribute it and/or modify it under C the terms of the GNU General Public License as published by C the Free Software Foundation, either version 3 of the License, or C (at your option) any later version. @@ -39,559 +39,559 @@ C MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the C GNU General Public License for more details. C C You should have received a copy of the GNU General Public License -C along with DMM. If not, see <http://www.gnu.org/licenses/>. -C -------------------------------------------------------------------- - SUBROUTINE KS2(nobs,d,ny,nz,nx,nu,ns,S,yk,c,H,G,a,F,R,XS) -C INPUT - INTEGER nobs,d(2),ny,nz,nx,nu,ns(6),S(nobs,6) - DOUBLE PRECISION yk(nobs,ny+nz),c(ny,max(nz,1),ns(1)), - 1 H(ny,nx,ns(2)),G(ny,nu,ns(3)),a(nx,ns(4)),F(nx,nx,ns(5)), - 2 R(nx,nu,ns(6)) - -C OUTPUT - DOUBLE PRECISION XS(nobs,nx) - -C LOCALS - INTEGER imain,I,J,IFAIL,FiRANK,ITIME - INTEGER IPIV(nx) - DOUBLE PRECISION TOL,SUMW1 - DOUBLE PRECISION,ALLOCATABLE:: Pi(:,:,:),HPs(:,:),HPi(:,:), - 1 Fi(:,:),Fs(:,:),Fim(:,:),Fsm(:,:),PHFs(:,:),PHFi(:,:),FFF(:,:), - 2 Mi(:,:),Ms(:,:),Ci(:,:),Kst(:,:,:),Kit(:,:,:),W1(:),WORK(:), - 3 WORK1(:),PFP(:,:),APPO(:,:),APPO1(:,:),COM(:,:),RG(:,:), - 4 FP(:,:),HP1(:,:),V(:,:),CC(:,:),HPV(:,:),X0(:),P0(:,:), - 5 RECR(:),RECRI(:),RECN(:,:),XT(:,:),PT(:,:,:),INN(:,:), - 1 Vinv(:,:,:),Vis(:,:,:),Vii(:,:,:) - -C EXTERNAL SUBROUTINES - EXTERNAL INVF,INVFBIS,LYAP,DSYEV,DPOTRF,DPOTRI,DGETRF,DGETRI - - ALLOCATE(Pi(d(1),nx,nx),HPs(ny,nx),HPi(ny,nx), - 1 Fi(ny,ny),Fs(ny,ny),Fim(ny,ny),Fsm(ny,ny), - 2 PHFs(nx,ny),PHFi(nx,ny),FFF(ny,ny),Mi(nx,ny),Ms(nx,ny),Ci(nx,nx), - 3 Kst(d(1),nx,ny),Kit(d(1),nx,ny)) - - ALLOCATE(W1(ny),WORK(64*nx),WORK1(64*ny), - 1 PFP(nx,nx),APPO(nx,nx),APPO1(nx,ny),COM(ny+1,ny),RG(nx,ny)) - - ALLOCATE(FP(nx,nx),HP1(ny,nx),V(ny,ny),CC(nx,nx), - 1 HPV(nx,ny),X0(nx),P0(nx,nx),RECR(nx),RECRI(nx),RECN(nx,nx)) - - ALLOCATE(XT(nobs,nx),PT(nobs,nx,nx),INN(nobs,ny), - 1 Vinv(nobs,ny,ny),Vis(d(1),ny,ny),Vii(d(1),ny,ny)) - - - TOL = 1.D-3 -C Unconditional mean and variance - IF (d(1).EQ.0) THEN ! stationary models - IF(SUM(ABS(a(:,S(1,4)))).EQ.0.D0) THEN - XT(1,:) = 0.D0 ! X(1|0) - ELSE - APPO = -F(:,:,S(1,5)) - DO 1 I = 1,nx -1 APPO(I,I) = 1.D0+APPO(I,I) -C CALL F07ADF(nx,nx,APPO,nx,IPIV,IFAIL) -C CALL F07AJF(nx,APPO,nx,IPIV,WORK,64*nx,IFAIL) - CALL DGETRF(nx,nx,APPO,nx,IPIV,IFAIL) - CALL DGETRI(nx,APPO,nx,IPIV,WORK,64*nx,IFAIL) - DO 2 I =1,nx -2 XT(1,I) = SUM(APPO(I,:)*a(:,S(1,4))) ! inv(I-F)*a - ENDIF - -C P(1|0) - F*P(1|0)*F' = R*R' - CALL LYAP(nx,nu,TOL,F(:,:,S(1,5)),R(:,:,S(1,6)),PT(1,:,:)) - ELSE -C ----------------------------------------------------------- -C Non-stationary models -C Define X(1) = aa + A*eta + B*delta (A*B' = 0) -C eta~N(0,I), delta~N(0,k*I) k -> +inf -C X(1)~N(aa,P), P=Ps+k*Pi, Ps=AA', Pi=BB'. -C CARE!! aa (uncond. mean),Ps, and Pi to be filled by users -C ----------------------------------------------------------- - XT(1,1:nx) = 0.D0 ! X(1|0) - PT(1,1:nx,1:nx) = 0.D0 ! P(1|0) - IF (d(2).LT.nx) THEN - IF(SUM(ABS(a(d(2)+1:nx,S(1,4)))).NE.0.D0) THEN - APPO(d(2)+1:nx,d(2)+1:nx) = -F(d(2)+1:nx,d(2)+1:nx,S(1,5)) - DO 3 I = d(2)+1,nx -3 APPO(I,I) = 1.D0+APPO(I,I) -C CALL F07ADF(nx-d(2),nx-d(2),APPO(d(2)+1:nx,d(2)+1:nx),nx-d(2), -C 1 IPIV(d(2)+1:nx),IFAIL) -C CALL F07AJF(nx-d(2),APPO(d(2)+1:nx,d(2)+1:nx),nx-d(2), -C 1 IPIV(d(2)+1:nx),WORK,64*nx,IFAIL) - CALL DGETRF(nx-d(2),nx-d(2),APPO(d(2)+1:nx,d(2)+1:nx),nx-d(2), - 1 IPIV(d(2)+1:nx),IFAIL) - CALL DGETRI(nx-d(2),APPO(d(2)+1:nx,d(2)+1:nx),nx-d(2), - 1 IPIV(d(2)+1:nx),WORK,64*nx,IFAIL) - - DO 4 I = d(2)+1,nx -4 XT(1,I) = SUM(APPO(I,d(2)+1:nx)*a(d(2)+1:nx,S(1,4))) ! inv(I-F)*a - ENDIF -C Lyapunov eqn - CALL LYAP(nx-d(2),nu,TOL,F(d(2)+1:nx,d(2)+1:nx,S(1,5)), - 1 R(d(2)+1:nx,1:nu,S(1,6)),PT(1,d(2)+1:nx,d(2)+1:nx)) - ENDIF - - Pi(:,:,:) = 0.D0 - DO 5 I = 1,d(2) -5 Pi(1,I,I) = 1.D0 - - DO 200 imain = 1,d(1) - DO 30 I=1,ny - DO 30 J=1,nx -30 HPs(I,J) = SUM(H(I,:,S(imain,2))*PT(imain,:,J)) - - DO 40 I=1,ny - Fs(I,I) = SUM(HPs(I,:)*H(I,:,S(imain,2))) - + + SUM(G(I,:,S(imain,3))*G(I,:,S(imain,3))) - DO 40 J=1,I-1 - Fs(I,J) = SUM(HPs(I,:)*H(J,:,S(imain,2))) - + + SUM(G(I,:,S(imain,3))*G(J,:,S(imain,3))) -40 Fs(J,I) = Fs(I,J) - - DO 50 I=1,ny - DO 50 J=1,nx -50 HPi(I,J) = SUM(H(I,:,S(imain,2))*Pi(imain,:,J)) - - DO 60 I=1,ny - Fi(I,I) = SUM(HPi(I,:)*H(I,:,S(imain,2))) - DO 60 J=1,I-1 - Fi(I,J) = SUM(HPi(I,:)*H(J,:,S(imain,2))) -60 Fi(J,I) = Fi(I,J) - -C -------------------------------------------------------------------------- -C Computes inverse of the innovation variance matrix -C Cases: ny = 1, Fi is scalar >0 (or 0 not considered) -C ny > 1, Fi is full rank or singular (or 0 matrix not considered) -C -------------------------------------------------------------------------- - IF (ny.EQ.1) THEN - Fsm = 0.D0 - Fim = 1.D0/Fi - FFF = Fim*Fs*Fim - ELSE - - IFAIL = -1 - COM(1:ny,1:ny) = Fi(1:ny,1:ny) -C CALL F02FAF('N','U',ny,COM(1:ny,1:ny),ny,W1(1:ny), -C 1 WORK1,64*ny,IFAIL) - CALL DSYEV('N','U',ny,COM(1:ny,1:ny),ny,W1(1:ny), - 1 WORK1,64*ny,IFAIL) - - FiRANK = 0 - SUMW1 = SUM(ABS(W1(1:ny))) - DO 70 I=1,ny - W1(I) = W1(I)/SUMW1 -70 IF (W1(I).GT.1.D-10) FiRANK=FiRANK+1 - FiRANK = min(FiRANK,d(2)) - -c CALL SCHOLLU(Fi(1:ny,1:ny),FFF,ny,NULLITY,EPS,IFAIL) -c FiRANK = ny-NULLITY - - IF(FiRANK.EQ.ny) THEN - Fsm = 0.D0 - COM(1:ny,1:ny) = Fi(1:ny,1:ny) - IFAIL = -1 -c CALL F01ADF(ny,COM(1:ny+1,1:ny),ny+1,IFAIL) - CALL DPOTRF('L',ny,COM(1:ny,1:ny),ny,IFAIL) ! COM = L*L' - CALL DPOTRI('L',ny,COM(1:ny,1:ny),ny,IFAIL) ! COM = VV^-1 - - DO 80 I=1,ny - Fim(I,I) = COM(I,I) - DO 80 J=1,I-1 - Fim(I,J) = COM(I,J) -80 Fim(J,I) = Fim(I,J) - - DO 81 I=1,ny - DO 81 J=1,ny -81 COM(I,J) = SUM(Fim(I,1:ny)*Fs(1:ny,J)) ! Fim x Fs - - DO 82 I=1,ny - FFF(I,I) = SUM(COM(I,1:ny)*Fim(1:ny,I)) - DO 82 J=1,I-1 - FFF(I,J) = SUM(COM(I,1:ny)*Fim(1:ny,J)) ! Fim x Fs x Fim -82 FFF(J,I) = FFF(I,J) - - ELSE - - SUMW1=0.D0 - DO I=Firank+1,ny - SUMW1 = SUMW1 + Fi(I,I) - ENDDO - IF (SUMW1.GT.0.D0) THEN - CALL INVFBIS(Fs(1:ny,1:ny),Fi(1:ny,1:ny),ny,FiRANK, - 1 Fsm(1:ny,1:ny),Fim(1:ny,1:ny),FFF(1:ny,1:ny)) - ELSE - CALL INVF(Fs(1:ny,1:ny),Fi(1:ny,1:ny),ny,FiRANK, - 1 Fsm(1:ny,1:ny),Fim(1:ny,1:ny),FFF(1:ny,1:ny)) - ENDIF - - ENDIF - ENDIF - Vis(imain,1:ny,1:ny) = Fsm(1:ny,1:ny) - Vii(imain,1:ny,1:ny) = Fim(1:ny,1:ny) - -C ------------------------------------------------------------------ -C X(d|d) = X(d|d-1)+((Ps*H'+R*G')*Fsm+Pi*H'*Fim)*(Y(d)-H*X(d|d-1)-c) -C ------------------------------------------------------------------ - DO 85 I = 1,nx - DO 85 J = 1,ny - RG(I,J) = - # SUM(R(I,1:nu,S(imain,6))*G(J,1:nu,S(imain,3))) -85 HPs(J,I) = HPs(J,I) + RG(I,J) ! HPs = (Ps*H'+R*G')' - - DO 90 I = 1,nx - DO 90 J = 1,ny - PHFs(I,J) = SUM(HPs(1:ny,I)*Fsm(1:ny,J)) -90 PHFi(I,J) = SUM(HPi(1:ny,I)*Fim(1:ny,J)) - -C Innovations - DO 100 I=1,ny -100 INN(imain,I) = yk(imain,I) - + - SUM(H(I,1:nx,S(imain,2))*XT(imain,1:nx)) - + - SUM(c(I,1:nz,S(imain,1))*yk(imain,ny+1:ny+nz)) - - DO 110 I=1,nx -110 X0(I) = XT(imain,I) - + + SUM((PHFs(I,1:ny)+PHFi(I,1:ny))*INN(imain,1:ny)) - -C P(d|d) = P(d|d-1) + Pi*H'*Fim*Fs*Fim*H*Pi - Ps*H'*Fsm*H*Ps - Ps*H'*Fim*H*Pi - (Ps*H'*Fim*H*Pi)' -C - Ps*H'*Fsm*H*Ps - DO 120 I = 1,nx - APPO(I,I) = -SUM(PHFs(I,1:ny)*HPs(1:ny,I)) - DO 120 J = 1,I-1 - APPO(I,J) = -SUM(PHFs(I,1:ny)*HPs(1:ny,J)) -120 APPO(J,I) = APPO(I,J) - -C - Ps*H'*Fim*H*Pi - (Ps*H'*Fim*H*Pi)' - DO 130 I = 1,nx - APPO(I,I) = APPO(I,I) - SUM(HPs(1:ny,I)*PHFi(I,1:ny)) - + - SUM(PHFi(I,1:ny)*HPs(1:ny,I)) - DO 130 J = 1,I-1 - APPO(I,J) = APPO(I,J) - SUM(HPs(1:ny,I)*PHFi(J,1:ny)) - + - SUM(PHFi(I,1:ny)*HPs(1:ny,J)) -130 APPO(J,I) = APPO(I,J) - -C Pi*H'*Fim*Fs*Fim*H*Pi - DO 140 I = 1,nx - DO 140 J = 1,ny -140 APPO1(I,J) = SUM(HPi(1:ny,I)*FFF(1:ny,J)) - - DO 150 I = 1,nx - PFP(I,I) = SUM(APPO1(I,1:ny)*HPi(1:ny,I)) - DO 150 J = 1,I-1 - PFP(I,J) = SUM(APPO1(I,1:ny)*HPi(1:ny,J)) -150 PFP(J,I) = PFP(I,J) - - P0(:,:) = PT(imain,:,:) + PFP(:,:) + APPO(:,:) - -C Mi = F*Pi*H' - DO 151 I = 1,nx - DO 151 J = 1,nx -151 PFP(I,J) = SUM(F(I,1:nx,S(imain,5))*Pi(imain,1:nx,J)) ! F*Pi - - DO 152 I = 1,nx - DO 152 J = 1,ny -152 Mi(I,J) = SUM(PFP(I,1:nx)*H(J,1:nx,S(imain,2))) - -C Ms = F*Ps*H' + R*G' - DO 153 I = 1,nx - DO 153 J = 1,nx -153 FP(I,J) = SUM(F(I,:,S(imain,5))*PT(imain,:,J)) ! F*Ps - - DO 154 I = 1,nx - DO 154 J = 1,ny -154 Ms(I,J)=RG(I,J)+SUM(FP(I,1:nx)*H(J,1:nx,S(imain,2))) - -C Kit = Ms*Fim - Mi*FFF -C Kst = Ms*Fsm + Mi*Fim - DO 155 I = 1,nx - DO 155 J = 1,ny - Kit(imain,I,J) = SUM(Ms(I,1:ny)*Fim(1:ny,J)) - + - SUM(Mi(I,1:ny)*FFF(1:ny,J)) -155 Kst(imain,I,J) = SUM(Ms(I,1:ny)*Fsm(1:ny,J)) - + + SUM(Mi(I,1:ny)*Fim(1:ny,J)) - -C ---------------------------------- -C Predictions X(t+1|t) and P(t+1|t) -C ---------------------------------- - IF (imain.LT.d(1)) THEN -C Pi+1 = F*Pi*F'-Ci - -C Ci = Mi*Fim*Mi' - DO 164 I = 1,nx - DO 164 J = 1,ny -164 RG(I,J) = SUM(Mi(I,1:ny)*Fim(1:ny,J)) ! Mi*Fim - - DO 166 I = 1,nx - Ci(I,I) = SUM(RG(I,1:ny)*Mi(I,1:ny)) - DO 166 J = 1,I-1 -166 Ci(I,J) = SUM(RG(I,1:ny)*Mi(J,1:ny)) - - DO 168 I = 1,nx - Pi(imain+1,I,I)=SUM(PFP(I,1:nx)*F(I,1:nx,S(imain+1,5)))-Ci(I,I) - DO 168 J = 1,I-1 - Pi(imain+1,I,J)=SUM(PFP(I,1:nx)*F(J,1:nx,S(imain+1,5)))-Ci(I,J) -168 Pi(imain+1,J,I) = Pi(imain+1,I,J) - - ENDIF - -C X(t+1|t) = a + F*X(t|t) - DO 170 I=1,nx -170 XT(imain+1,I) = a(I,S(imain+1,4)) - + + SUM(F(I,1:nx,S(imain+1,5))*X0(1:nx)) - -C P(t+1|t) = F*PddF' + R*R' - DO 172 I = 1,nx - DO 172 J = 1,nx -172 APPO(I,J) = SUM(F(I,:,S(imain+1,5))*P0(:,J)) ! F*Pdd - - DO 180 I = 1,nx - PT(imain+1,I,I) = SUM(APPO(I,1:nx)*F(I,1:nx,S(imain+1,5))) - + + SUM(R(I,1:nu,S(imain+1,6))*R(I,1:nu,S(imain+1,6))) - DO 180 J = 1,I-1 - PT(imain+1,I,J) = SUM(APPO(I,1:nx)*F(J,1:nx,S(imain+1,5))) - + + SUM(R(I,1:nu,S(imain+1,6))*R(J,1:nu,S(imain+1,6))) -180 PT(imain+1,J,I) = PT(imain+1,I,J) - -200 CONTINUE - ENDIF - - DO 400 imain = d(1)+1,nobs -C ------------------------------- -C Innovations: INN = yk-H*X1-c*z -C ------------------------------- - DO 210 I=1,ny -210 INN(imain,I) = yk(imain,I) - + - SUM(H(I,1:nx,S(imain,2))*XT(imain,:)) - + - SUM(c(I,1:nz,S(imain,1))*yk(imain,ny+1:ny+nz)) - -C ---------------------------------------------------------- -C Innovation variance V = H*P1*H' + G*G' + H*R*G' + G*R'*H' -C ---------------------------------------------------------- - DO 220 I=1,ny - DO 220 J=1,nx -220 HP1(I,J) = SUM(H(I,1:nx,S(imain,2))*PT(imain,1:nx,J)) - - DO 221 I=1,nx - DO 221 J=1,ny -221 RG(I,J)=SUM(R(I,1:nu,S(imain,6))*G(J,1:nu,S(imain,3))) - - DO 222 I=1,ny - DO 222 J=1,ny -222 COM(I,J)=SUM(H(I,1:nx,S(imain,2))*RG(1:nx,J)) ! H*R*G' - - DO 230 I=1,ny - V(I,I) = SUM(HP1(I,1:nx)*H(I,1:nx,S(imain,2))) - # + SUM(G(I,1:nu,S(imain,3))* - # G(I,1:nu,S(imain,3))) + 2.*COM(I,I) - DO 230 J=1,I-1 - V(I,J) = SUM(HP1(I,1:nx)*H(J,1:nx,S(imain,2)))+ - # SUM(G(I,1:nu,S(imain,3))* - # G(J,1:nu,S(imain,3)))+COM(I,J)+COM(J,I) -230 V(J,I) = V(I,J) - -C ------------------------------------------------------------------- -C Updating equations: -C x0 = x1 + (P1*H'+R*G')*Vinv*INN -C p0 = p1 - (P1*H'+R*G')*Vinv*(P1*H'+R*G')' -C ------------------------------------------------------------------- - IF (ny.GT.0) THEN - COM(1:ny,1:ny) = V(1:ny,1:ny) - IFAIL = -1 -C CALL F01ADF(ny,COM(1:ny+1,1:ny),ny+1,IFAIL) - CALL DPOTRF('L',ny,COM(1:ny,1:ny),ny,IFAIL) ! COM = L*L' - CALL DPOTRI('L',ny,COM(1:ny,1:ny),ny,IFAIL) ! COM = VV^-1 - - DO 240 I=1,ny - Vinv(imain,I,I) = COM(I,I) - DO 240 J=1,I-1 - Vinv(imain,I,J) = COM(I,J) -240 Vinv(imain,J,I) = Vinv(imain,I,J) - - DO 260 I=1,nx - DO 260 J=1,ny -260 HPV(I,J) = SUM((HP1(1:ny,I)+RG(I,1:ny))*Vinv(imain,1:ny,J)) - - DO 270 I=1,nx -270 X0(I) = XT(imain,I)+SUM(HPV(I,1:ny)*INN(imain,1:ny)) - - DO 280 I=1,nx - P0(I,I) = PT(imain,I,I) - + - SUM(HPV(I,1:ny)*(HP1(1:ny,I)+RG(I,1:ny))) - DO 280 J=1,I-1 - P0(I,J) = PT(imain,I,J) - + - SUM(HPV(I,1:ny)*(HP1(1:ny,J)+RG(J,1:ny))) -280 P0(J,I) = P0(I,J) - ELSE - - X0(1:nx) = XT(imain,1:nx) - P0(1:nx,1:nx) = PT(imain,1:nx,1:nx) - - ENDIF - -C ------------------------------------ -C Prediction x1 = c+F*x0 -C Prediction var. P1 = F*p0*F'+ R*R' -C ------------------------------------ - IF (imain.LT.nobs) THEN - DO 290 I=1,nx -290 XT(imain+1,I) = a(I,S(imain+1,4)) - + + SUM(F(I,1:nx,S(imain+1,5))*X0(1:nx)) - - DO 300 I=1,nx - DO 300 J=1,nx -300 FP(I,J) = SUM(F(I,1:nx,S(imain+1,5))*P0(1:nx,J)) - - DO 310 I=1,nx - PT(imain+1,I,I) = SUM(FP(I,:)*F(I,:,S(imain+1,5))) - + + SUM(R(I,1:nu,S(imain+1,6))*R(I,1:nu,S(imain+1,6))) - DO 310 J=1,I-1 - PT(imain+1,I,J) = SUM(FP(I,:)*F(J,:,S(imain+1,5))) - + + SUM(R(I,1:nu,S(imain+1,6))*R(J,1:nu,S(imain+1,6))) -310 PT(imain+1,J,I) = PT(imain+1,I,J) - ENDIF -400 CONTINUE - -C **** SMOOTHING BAKWARD RECURSIONS **** - RECR(1:nx) = 0.D0 - RECN(1:nx,1:nx) = 0.D0 - DO 600 ITIME = nobs,d(1)+1,-1 -C R*G' and H'*Vinv - DO 420 J=1,ny - DO 420 I=1,nx - RG(I,J)=SUM(R(I,1:nu,S(ITIME,6))*G(J,1:nu,S(ITIME,3))) -420 PHFs(I,J) = - # SUM(H(1:ny,I,S(ITIME,2))*Vinv(ITIME,1:ny,J)) - -C F(t+1)*P(t|t-1) - DO 430 I=1,nx - DO 430 J=1,nx -430 FP(I,J) = SUM(F(I,1:nx,S(min(nobs,ITIME+1),5))*PT(ITIME,1:nx,J)) - -C H'*Vinv*H - DO 440 I=1,nx - APPO(I,I) = SUM(PHFs(I,1:ny)*H(1:ny,I,S(ITIME,2))) - DO 440 J=1,I-1 - APPO(I,J) = SUM(PHFs(I,1:ny)*H(1:ny,J,S(ITIME,2))) -440 APPO(J,I) = APPO(I,J) - -C L(t) = F(t+1)-(F(t+1)*P(t|t-1)*H(t)'+R(t)*G(t)')*Vinv(t)*H(t) - DO 450 I=1,nx - DO 450 J=1,nx -450 PFP(I,J) = F(I,J,S(min(nobs,ITIME+1),5)) - + - SUM(FP(I,1:nx)*APPO(1:nx,J)) - + - SUM(RG(I,1:ny)*PHFs(J,1:ny)) - -C r(t-1) = H(t)'*Vinv(t)*INN(t)+L(t)'*r(t) - DO 460 I=1,nx -460 WORK(I) = SUM(PFP(1:nx,I)*RECR(1:nx)) - - DO 470 I=1,nx -470 RECR(I) = WORK(I) + SUM(PHFs(I,1:ny)*INN(ITIME,1:ny)) - -C N(t-1) = H(t)'*Vinv(t)*H(t)+L(t)'*N(t)*L(t) - DO 480 I=1,nx - DO 480 J=1,nx -480 CC(I,J) = SUM(PFP(1:nx,I)*RECN(1:nx,J)) ! L(t)'*N(t) - - DO 490 I=1,nx - RECN(I,I) = APPO(I,I) + SUM(CC(I,1:nx)*PFP(1:nx,I)) - DO 490 J=1,I-1 - RECN(I,J) = APPO(I,J) + SUM(CC(I,1:nx)*PFP(1:nx,J)) -490 RECN(J,I) = RECN(I,J) - -C X(t|T) = X(t|t-1) + P(t|t-1)*r(t-1) - DO 500 I = 1,nx -500 XS(ITIME,I) = XT(ITIME,I) + SUM(PT(ITIME,I,1:nx)*RECR(1:nx)) - -C P(t|T) = P(t|t-1) - P(t|t-1)*N(t-1)*P(t|t-1) - DO 510 I=1,nx - DO 510 J=1,nx -510 CC(I,J) = SUM(PT(ITIME,I,1:nx)*RECN(1:nx,J)) ! P(t|t-1)*N(t-1) - -c DO 520 I=1,nx -c PS(ITIME,I,I) = PT(ITIME,I,I) - SUM(CC(I,1:nx)*PT(ITIME,1:nx,I)) -c DO 520 J=1,I-1 -c PS(ITIME,I,J) = PT(ITIME,I,J) - SUM(CC(I,1:nx)*PT(ITIME,1:nx,J)) -c520 PS(ITIME,J,I) = PS(ITIME,I,J) - -600 CONTINUE - -C INITIAL KALMAN SAMOOTING - RECRI(1:nx) = 0.D0 - DO 800 ITIME = d(1),1,-1 -C L(t) = F(t)-Kst(t)*H(t) - DO 610 I=1,nx - DO 610 J=1,nx -610 PFP(I,J) = F(I,J,S(ITIME,5)) - + - SUM(Kst(ITIME,I,1:ny)*H(1:ny,J,S(ITIME,2))) - -C r(t-1) = H(t)'*Fsm*INN(t) + L(t)'*r(t) -C ri(t-1) = H(t)'*Fim*INN(t) + L(t)'*ri(t) + Li(t)'*r(t) - DO 620 I=1,nx - WORK(I) = SUM(PFP(1:nx,I)*RECR(1:nx)) ! L(t)'*r(t) -620 WORK(nx+I) = SUM(PFP(1:nx,I)*RECRI(1:nx)) ! L(t)'*ri(t) - -C Li(t) = -Kit(t)*H(t) - DO 621 I=1,nx - DO 621 J=1,nx -621 PFP(I,J) = - # - SUM(Kit(ITIME,I,1:ny)*H(1:ny,J,S(ITIME,2))) - -C L(t)'*ri(t) + Li(t)'*r(t) - DO 622 I=1,nx -622 WORK(nx+I) = WORK(nx+I)+SUM(PFP(1:nx,I)*RECR(1:nx)) - -C H'*Fsm - DO 625 I=1,nx - DO 625 J=1,ny -625 PHFs(I,J) = - # SUM(H(1:ny,I,S(ITIME,2))*Vis(ITIME,1:ny,J)) - - DO 630 I=1,nx -630 RECR(I) = WORK(I) + SUM(PHFs(I,1:ny)*INN(ITIME,1:ny)) - -C H'*Fim - DO 631 I=1,nx - DO 631 J=1,ny -631 PHFs(I,J) = - # SUM(H(1:ny,I,S(ITIME,2))*Vii(ITIME,1:ny,J)) - - DO 632 I=1,nx -632 RECRI(I) = WORK(nx+I) + SUM(PHFs(I,1:ny)*INN(ITIME,1:ny)) - -C X(d|T) = X(d|d-1) + Psd*r(t-1) + Pid*ri(t-1) - DO 660 I = 1,nx -660 XS(ITIME,I) = XT(ITIME,I) + SUM(PT(ITIME,I,1:nx)*RECR(1:nx)) - + + SUM(Pi(ITIME,I,1:nx)*RECRI(1:nx)) - -800 CONTINUE - - DEALLOCATE(Pi,HPs,HPi,Fi,Fs,Fim,Fsm,PHFs,PHFi,FFF,Mi,Ms,Ci, - 1 Kst,Kit,W1,WORK,WORK1,PFP,APPO,APPO1,COM,RG,FP,HP1,V,CC,HPV, - 2 X0,P0,RECR,RECRI,RECN,XT,PT,INN,Vinv,Vis,Vii) - - RETURN - END - -C This is the variance and must be completed!! -C N(t-1) = H(t)'*Vinv(t)*H(t)+L(t)'*N(t)*L(t) -c DO 640 I=1,nx -c DO 640 J=1,nx -c640 CC(I,J) = SUM(PFP(1:nx,I)*RECN(1:nx,J)) ! L(t)'*N(t) -c DO 650 I=1,nx -c RECN(I,I) = APPO(I,I) + SUM(CC(I,1:nx)*PFP(1:nx,I)) -c DO 650 J=1,I-1 -c RECN(I,J) = APPO(I,J) + SUM(CC(I,1:nx)*PFP(1:nx,J)) -c650 RECN(J,I) = RECN(I,J) -C P(t|T) = P(t|t-1) - P(t|t-1)*N(t-1)*P(t|t-1) -c DO 670 I=1,nx -c DO 670 J=1,nx -c670 CC(I,J) = SUM(PT(ITIME,I,1:nx)*RECN(1:nx,J)) ! P(t|t-1)*N(t-1) -c -c DO 680 I=1,nx -c PS(ITIME,I,I) = PT(ITIME,I,I) - SUM(CC(I,1:nx)*PT(ITIME,1:nx,I)) -c DO 680 J=1,I-1 -c PS(ITIME,I,J) = PT(ITIME,I,J) - SUM(CC(I,1:nx)*PT(ITIME,1:nx,J)) -c680 PS(ITIME,J,I) = PS(ITIME,I,J) - +C along with DMM. If not, see <http://www.gnu.org/licenses/>. +C -------------------------------------------------------------------- + SUBROUTINE KS2(nobs,d,ny,nz,nx,nu,ns,S,yk,c,H,G,a,F,R,XS) +C INPUT + INTEGER nobs,d(2),ny,nz,nx,nu,ns(6),S(nobs,6) + DOUBLE PRECISION yk(nobs,ny+nz),c(ny,max(nz,1),ns(1)), + 1 H(ny,nx,ns(2)),G(ny,nu,ns(3)),a(nx,ns(4)),F(nx,nx,ns(5)), + 2 R(nx,nu,ns(6)) + +C OUTPUT + DOUBLE PRECISION XS(nobs,nx) + +C LOCALS + INTEGER imain,I,J,IFAIL,FiRANK,ITIME + INTEGER IPIV(nx) + DOUBLE PRECISION TOL,SUMW1 + DOUBLE PRECISION,ALLOCATABLE:: Pi(:,:,:),HPs(:,:),HPi(:,:), + 1 Fi(:,:),Fs(:,:),Fim(:,:),Fsm(:,:),PHFs(:,:),PHFi(:,:),FFF(:,:), + 2 Mi(:,:),Ms(:,:),Ci(:,:),Kst(:,:,:),Kit(:,:,:),W1(:),WORK(:), + 3 WORK1(:),PFP(:,:),APPO(:,:),APPO1(:,:),COM(:,:),RG(:,:), + 4 FP(:,:),HP1(:,:),V(:,:),CC(:,:),HPV(:,:),X0(:),P0(:,:), + 5 RECR(:),RECRI(:),RECN(:,:),XT(:,:),PT(:,:,:),INN(:,:), + 1 Vinv(:,:,:),Vis(:,:,:),Vii(:,:,:) + +C EXTERNAL SUBROUTINES + EXTERNAL INVF,INVFBIS,LYAP,DSYEV,DPOTRF,DPOTRI,DGETRF,DGETRI + + ALLOCATE(Pi(d(1),nx,nx),HPs(ny,nx),HPi(ny,nx), + 1 Fi(ny,ny),Fs(ny,ny),Fim(ny,ny),Fsm(ny,ny), + 2 PHFs(nx,ny),PHFi(nx,ny),FFF(ny,ny),Mi(nx,ny),Ms(nx,ny),Ci(nx,nx), + 3 Kst(d(1),nx,ny),Kit(d(1),nx,ny)) + + ALLOCATE(W1(ny),WORK(64*nx),WORK1(64*ny), + 1 PFP(nx,nx),APPO(nx,nx),APPO1(nx,ny),COM(ny+1,ny),RG(nx,ny)) + + ALLOCATE(FP(nx,nx),HP1(ny,nx),V(ny,ny),CC(nx,nx), + 1 HPV(nx,ny),X0(nx),P0(nx,nx),RECR(nx),RECRI(nx),RECN(nx,nx)) + + ALLOCATE(XT(nobs,nx),PT(nobs,nx,nx),INN(nobs,ny), + 1 Vinv(nobs,ny,ny),Vis(d(1),ny,ny),Vii(d(1),ny,ny)) + + + TOL = 1.D-3 +C Unconditional mean and variance + IF (d(1).EQ.0) THEN ! stationary models + IF(SUM(ABS(a(:,S(1,4)))).EQ.0.D0) THEN + XT(1,:) = 0.D0 ! X(1|0) + ELSE + APPO = -F(:,:,S(1,5)) + DO 1 I = 1,nx +1 APPO(I,I) = 1.D0+APPO(I,I) +C CALL F07ADF(nx,nx,APPO,nx,IPIV,IFAIL) +C CALL F07AJF(nx,APPO,nx,IPIV,WORK,64*nx,IFAIL) + CALL DGETRF(nx,nx,APPO,nx,IPIV,IFAIL) + CALL DGETRI(nx,APPO,nx,IPIV,WORK,64*nx,IFAIL) + DO 2 I =1,nx +2 XT(1,I) = SUM(APPO(I,:)*a(:,S(1,4))) ! inv(I-F)*a + ENDIF + +C P(1|0) - F*P(1|0)*F' = R*R' + CALL LYAP(nx,nu,TOL,F(:,:,S(1,5)),R(:,:,S(1,6)),PT(1,:,:)) + ELSE +C ----------------------------------------------------------- +C Non-stationary models +C Define X(1) = aa + A*eta + B*delta (A*B' = 0) +C eta~N(0,I), delta~N(0,k*I) k -> +inf +C X(1)~N(aa,P), P=Ps+k*Pi, Ps=AA', Pi=BB'. +C CARE!! aa (uncond. mean),Ps, and Pi to be filled by users +C ----------------------------------------------------------- + XT(1,1:nx) = 0.D0 ! X(1|0) + PT(1,1:nx,1:nx) = 0.D0 ! P(1|0) + IF (d(2).LT.nx) THEN + IF(SUM(ABS(a(d(2)+1:nx,S(1,4)))).NE.0.D0) THEN + APPO(d(2)+1:nx,d(2)+1:nx) = -F(d(2)+1:nx,d(2)+1:nx,S(1,5)) + DO 3 I = d(2)+1,nx +3 APPO(I,I) = 1.D0+APPO(I,I) +C CALL F07ADF(nx-d(2),nx-d(2),APPO(d(2)+1:nx,d(2)+1:nx),nx-d(2), +C 1 IPIV(d(2)+1:nx),IFAIL) +C CALL F07AJF(nx-d(2),APPO(d(2)+1:nx,d(2)+1:nx),nx-d(2), +C 1 IPIV(d(2)+1:nx),WORK,64*nx,IFAIL) + CALL DGETRF(nx-d(2),nx-d(2),APPO(d(2)+1:nx,d(2)+1:nx),nx-d(2), + 1 IPIV(d(2)+1:nx),IFAIL) + CALL DGETRI(nx-d(2),APPO(d(2)+1:nx,d(2)+1:nx),nx-d(2), + 1 IPIV(d(2)+1:nx),WORK,64*nx,IFAIL) + + DO 4 I = d(2)+1,nx +4 XT(1,I) = SUM(APPO(I,d(2)+1:nx)*a(d(2)+1:nx,S(1,4))) ! inv(I-F)*a + ENDIF +C Lyapunov eqn + CALL LYAP(nx-d(2),nu,TOL,F(d(2)+1:nx,d(2)+1:nx,S(1,5)), + 1 R(d(2)+1:nx,1:nu,S(1,6)),PT(1,d(2)+1:nx,d(2)+1:nx)) + ENDIF + + Pi(:,:,:) = 0.D0 + DO 5 I = 1,d(2) +5 Pi(1,I,I) = 1.D0 + + DO 200 imain = 1,d(1) + DO 30 I=1,ny + DO 30 J=1,nx +30 HPs(I,J) = SUM(H(I,:,S(imain,2))*PT(imain,:,J)) + + DO 40 I=1,ny + Fs(I,I) = SUM(HPs(I,:)*H(I,:,S(imain,2))) + + + SUM(G(I,:,S(imain,3))*G(I,:,S(imain,3))) + DO 40 J=1,I-1 + Fs(I,J) = SUM(HPs(I,:)*H(J,:,S(imain,2))) + + + SUM(G(I,:,S(imain,3))*G(J,:,S(imain,3))) +40 Fs(J,I) = Fs(I,J) + + DO 50 I=1,ny + DO 50 J=1,nx +50 HPi(I,J) = SUM(H(I,:,S(imain,2))*Pi(imain,:,J)) + + DO 60 I=1,ny + Fi(I,I) = SUM(HPi(I,:)*H(I,:,S(imain,2))) + DO 60 J=1,I-1 + Fi(I,J) = SUM(HPi(I,:)*H(J,:,S(imain,2))) +60 Fi(J,I) = Fi(I,J) + +C -------------------------------------------------------------------------- +C Computes inverse of the innovation variance matrix +C Cases: ny = 1, Fi is scalar >0 (or 0 not considered) +C ny > 1, Fi is full rank or singular (or 0 matrix not considered) +C -------------------------------------------------------------------------- + IF (ny.EQ.1) THEN + Fsm = 0.D0 + Fim = 1.D0/Fi + FFF = Fim*Fs*Fim + ELSE + + IFAIL = -1 + COM(1:ny,1:ny) = Fi(1:ny,1:ny) +C CALL F02FAF('N','U',ny,COM(1:ny,1:ny),ny,W1(1:ny), +C 1 WORK1,64*ny,IFAIL) + CALL DSYEV('N','U',ny,COM(1:ny,1:ny),ny,W1(1:ny), + 1 WORK1,64*ny,IFAIL) + + FiRANK = 0 + SUMW1 = SUM(ABS(W1(1:ny))) + DO 70 I=1,ny + W1(I) = W1(I)/SUMW1 +70 IF (W1(I).GT.1.D-10) FiRANK=FiRANK+1 + FiRANK = min(FiRANK,d(2)) + +c CALL SCHOLLU(Fi(1:ny,1:ny),FFF,ny,NULLITY,EPS,IFAIL) +c FiRANK = ny-NULLITY + + IF(FiRANK.EQ.ny) THEN + Fsm = 0.D0 + COM(1:ny,1:ny) = Fi(1:ny,1:ny) + IFAIL = -1 +c CALL F01ADF(ny,COM(1:ny+1,1:ny),ny+1,IFAIL) + CALL DPOTRF('L',ny,COM(1:ny,1:ny),ny,IFAIL) ! COM = L*L' + CALL DPOTRI('L',ny,COM(1:ny,1:ny),ny,IFAIL) ! COM = VV^-1 + + DO 80 I=1,ny + Fim(I,I) = COM(I,I) + DO 80 J=1,I-1 + Fim(I,J) = COM(I,J) +80 Fim(J,I) = Fim(I,J) + + DO 81 I=1,ny + DO 81 J=1,ny +81 COM(I,J) = SUM(Fim(I,1:ny)*Fs(1:ny,J)) ! Fim x Fs + + DO 82 I=1,ny + FFF(I,I) = SUM(COM(I,1:ny)*Fim(1:ny,I)) + DO 82 J=1,I-1 + FFF(I,J) = SUM(COM(I,1:ny)*Fim(1:ny,J)) ! Fim x Fs x Fim +82 FFF(J,I) = FFF(I,J) + + ELSE + + SUMW1=0.D0 + DO I=Firank+1,ny + SUMW1 = SUMW1 + Fi(I,I) + ENDDO + IF (SUMW1.GT.0.D0) THEN + CALL INVFBIS(Fs(1:ny,1:ny),Fi(1:ny,1:ny),ny,FiRANK, + 1 Fsm(1:ny,1:ny),Fim(1:ny,1:ny),FFF(1:ny,1:ny)) + ELSE + CALL INVF(Fs(1:ny,1:ny),Fi(1:ny,1:ny),ny,FiRANK, + 1 Fsm(1:ny,1:ny),Fim(1:ny,1:ny),FFF(1:ny,1:ny)) + ENDIF + + ENDIF + ENDIF + Vis(imain,1:ny,1:ny) = Fsm(1:ny,1:ny) + Vii(imain,1:ny,1:ny) = Fim(1:ny,1:ny) + +C ------------------------------------------------------------------ +C X(d|d) = X(d|d-1)+((Ps*H'+R*G')*Fsm+Pi*H'*Fim)*(Y(d)-H*X(d|d-1)-c) +C ------------------------------------------------------------------ + DO 85 I = 1,nx + DO 85 J = 1,ny + RG(I,J) = + # SUM(R(I,1:nu,S(imain,6))*G(J,1:nu,S(imain,3))) +85 HPs(J,I) = HPs(J,I) + RG(I,J) ! HPs = (Ps*H'+R*G')' + + DO 90 I = 1,nx + DO 90 J = 1,ny + PHFs(I,J) = SUM(HPs(1:ny,I)*Fsm(1:ny,J)) +90 PHFi(I,J) = SUM(HPi(1:ny,I)*Fim(1:ny,J)) + +C Innovations + DO 100 I=1,ny +100 INN(imain,I) = yk(imain,I) + + - SUM(H(I,1:nx,S(imain,2))*XT(imain,1:nx)) + + - SUM(c(I,1:nz,S(imain,1))*yk(imain,ny+1:ny+nz)) + + DO 110 I=1,nx +110 X0(I) = XT(imain,I) + + + SUM((PHFs(I,1:ny)+PHFi(I,1:ny))*INN(imain,1:ny)) + +C P(d|d) = P(d|d-1) + Pi*H'*Fim*Fs*Fim*H*Pi - Ps*H'*Fsm*H*Ps - Ps*H'*Fim*H*Pi - (Ps*H'*Fim*H*Pi)' +C - Ps*H'*Fsm*H*Ps + DO 120 I = 1,nx + APPO(I,I) = -SUM(PHFs(I,1:ny)*HPs(1:ny,I)) + DO 120 J = 1,I-1 + APPO(I,J) = -SUM(PHFs(I,1:ny)*HPs(1:ny,J)) +120 APPO(J,I) = APPO(I,J) + +C - Ps*H'*Fim*H*Pi - (Ps*H'*Fim*H*Pi)' + DO 130 I = 1,nx + APPO(I,I) = APPO(I,I) - SUM(HPs(1:ny,I)*PHFi(I,1:ny)) + + - SUM(PHFi(I,1:ny)*HPs(1:ny,I)) + DO 130 J = 1,I-1 + APPO(I,J) = APPO(I,J) - SUM(HPs(1:ny,I)*PHFi(J,1:ny)) + + - SUM(PHFi(I,1:ny)*HPs(1:ny,J)) +130 APPO(J,I) = APPO(I,J) + +C Pi*H'*Fim*Fs*Fim*H*Pi + DO 140 I = 1,nx + DO 140 J = 1,ny +140 APPO1(I,J) = SUM(HPi(1:ny,I)*FFF(1:ny,J)) + + DO 150 I = 1,nx + PFP(I,I) = SUM(APPO1(I,1:ny)*HPi(1:ny,I)) + DO 150 J = 1,I-1 + PFP(I,J) = SUM(APPO1(I,1:ny)*HPi(1:ny,J)) +150 PFP(J,I) = PFP(I,J) + + P0(:,:) = PT(imain,:,:) + PFP(:,:) + APPO(:,:) + +C Mi = F*Pi*H' + DO 151 I = 1,nx + DO 151 J = 1,nx +151 PFP(I,J) = SUM(F(I,1:nx,S(imain,5))*Pi(imain,1:nx,J)) ! F*Pi + + DO 152 I = 1,nx + DO 152 J = 1,ny +152 Mi(I,J) = SUM(PFP(I,1:nx)*H(J,1:nx,S(imain,2))) + +C Ms = F*Ps*H' + R*G' + DO 153 I = 1,nx + DO 153 J = 1,nx +153 FP(I,J) = SUM(F(I,:,S(imain,5))*PT(imain,:,J)) ! F*Ps + + DO 154 I = 1,nx + DO 154 J = 1,ny +154 Ms(I,J)=RG(I,J)+SUM(FP(I,1:nx)*H(J,1:nx,S(imain,2))) + +C Kit = Ms*Fim - Mi*FFF +C Kst = Ms*Fsm + Mi*Fim + DO 155 I = 1,nx + DO 155 J = 1,ny + Kit(imain,I,J) = SUM(Ms(I,1:ny)*Fim(1:ny,J)) + + - SUM(Mi(I,1:ny)*FFF(1:ny,J)) +155 Kst(imain,I,J) = SUM(Ms(I,1:ny)*Fsm(1:ny,J)) + + + SUM(Mi(I,1:ny)*Fim(1:ny,J)) + +C ---------------------------------- +C Predictions X(t+1|t) and P(t+1|t) +C ---------------------------------- + IF (imain.LT.d(1)) THEN +C Pi+1 = F*Pi*F'-Ci + +C Ci = Mi*Fim*Mi' + DO 164 I = 1,nx + DO 164 J = 1,ny +164 RG(I,J) = SUM(Mi(I,1:ny)*Fim(1:ny,J)) ! Mi*Fim + + DO 166 I = 1,nx + Ci(I,I) = SUM(RG(I,1:ny)*Mi(I,1:ny)) + DO 166 J = 1,I-1 +166 Ci(I,J) = SUM(RG(I,1:ny)*Mi(J,1:ny)) + + DO 168 I = 1,nx + Pi(imain+1,I,I)=SUM(PFP(I,1:nx)*F(I,1:nx,S(imain+1,5)))-Ci(I,I) + DO 168 J = 1,I-1 + Pi(imain+1,I,J)=SUM(PFP(I,1:nx)*F(J,1:nx,S(imain+1,5)))-Ci(I,J) +168 Pi(imain+1,J,I) = Pi(imain+1,I,J) + + ENDIF + +C X(t+1|t) = a + F*X(t|t) + DO 170 I=1,nx +170 XT(imain+1,I) = a(I,S(imain+1,4)) + + + SUM(F(I,1:nx,S(imain+1,5))*X0(1:nx)) + +C P(t+1|t) = F*PddF' + R*R' + DO 172 I = 1,nx + DO 172 J = 1,nx +172 APPO(I,J) = SUM(F(I,:,S(imain+1,5))*P0(:,J)) ! F*Pdd + + DO 180 I = 1,nx + PT(imain+1,I,I) = SUM(APPO(I,1:nx)*F(I,1:nx,S(imain+1,5))) + + + SUM(R(I,1:nu,S(imain+1,6))*R(I,1:nu,S(imain+1,6))) + DO 180 J = 1,I-1 + PT(imain+1,I,J) = SUM(APPO(I,1:nx)*F(J,1:nx,S(imain+1,5))) + + + SUM(R(I,1:nu,S(imain+1,6))*R(J,1:nu,S(imain+1,6))) +180 PT(imain+1,J,I) = PT(imain+1,I,J) + +200 CONTINUE + ENDIF + + DO 400 imain = d(1)+1,nobs +C ------------------------------- +C Innovations: INN = yk-H*X1-c*z +C ------------------------------- + DO 210 I=1,ny +210 INN(imain,I) = yk(imain,I) + + - SUM(H(I,1:nx,S(imain,2))*XT(imain,:)) + + - SUM(c(I,1:nz,S(imain,1))*yk(imain,ny+1:ny+nz)) + +C ---------------------------------------------------------- +C Innovation variance V = H*P1*H' + G*G' + H*R*G' + G*R'*H' +C ---------------------------------------------------------- + DO 220 I=1,ny + DO 220 J=1,nx +220 HP1(I,J) = SUM(H(I,1:nx,S(imain,2))*PT(imain,1:nx,J)) + + DO 221 I=1,nx + DO 221 J=1,ny +221 RG(I,J)=SUM(R(I,1:nu,S(imain,6))*G(J,1:nu,S(imain,3))) + + DO 222 I=1,ny + DO 222 J=1,ny +222 COM(I,J)=SUM(H(I,1:nx,S(imain,2))*RG(1:nx,J)) ! H*R*G' + + DO 230 I=1,ny + V(I,I) = SUM(HP1(I,1:nx)*H(I,1:nx,S(imain,2))) + # + SUM(G(I,1:nu,S(imain,3))* + # G(I,1:nu,S(imain,3))) + 2.*COM(I,I) + DO 230 J=1,I-1 + V(I,J) = SUM(HP1(I,1:nx)*H(J,1:nx,S(imain,2)))+ + # SUM(G(I,1:nu,S(imain,3))* + # G(J,1:nu,S(imain,3)))+COM(I,J)+COM(J,I) +230 V(J,I) = V(I,J) + +C ------------------------------------------------------------------- +C Updating equations: +C x0 = x1 + (P1*H'+R*G')*Vinv*INN +C p0 = p1 - (P1*H'+R*G')*Vinv*(P1*H'+R*G')' +C ------------------------------------------------------------------- + IF (ny.GT.0) THEN + COM(1:ny,1:ny) = V(1:ny,1:ny) + IFAIL = -1 +C CALL F01ADF(ny,COM(1:ny+1,1:ny),ny+1,IFAIL) + CALL DPOTRF('L',ny,COM(1:ny,1:ny),ny,IFAIL) ! COM = L*L' + CALL DPOTRI('L',ny,COM(1:ny,1:ny),ny,IFAIL) ! COM = VV^-1 + + DO 240 I=1,ny + Vinv(imain,I,I) = COM(I,I) + DO 240 J=1,I-1 + Vinv(imain,I,J) = COM(I,J) +240 Vinv(imain,J,I) = Vinv(imain,I,J) + + DO 260 I=1,nx + DO 260 J=1,ny +260 HPV(I,J) = SUM((HP1(1:ny,I)+RG(I,1:ny))*Vinv(imain,1:ny,J)) + + DO 270 I=1,nx +270 X0(I) = XT(imain,I)+SUM(HPV(I,1:ny)*INN(imain,1:ny)) + + DO 280 I=1,nx + P0(I,I) = PT(imain,I,I) + + - SUM(HPV(I,1:ny)*(HP1(1:ny,I)+RG(I,1:ny))) + DO 280 J=1,I-1 + P0(I,J) = PT(imain,I,J) + + - SUM(HPV(I,1:ny)*(HP1(1:ny,J)+RG(J,1:ny))) +280 P0(J,I) = P0(I,J) + ELSE + + X0(1:nx) = XT(imain,1:nx) + P0(1:nx,1:nx) = PT(imain,1:nx,1:nx) + + ENDIF + +C ------------------------------------ +C Prediction x1 = c+F*x0 +C Prediction var. P1 = F*p0*F'+ R*R' +C ------------------------------------ + IF (imain.LT.nobs) THEN + DO 290 I=1,nx +290 XT(imain+1,I) = a(I,S(imain+1,4)) + + + SUM(F(I,1:nx,S(imain+1,5))*X0(1:nx)) + + DO 300 I=1,nx + DO 300 J=1,nx +300 FP(I,J) = SUM(F(I,1:nx,S(imain+1,5))*P0(1:nx,J)) + + DO 310 I=1,nx + PT(imain+1,I,I) = SUM(FP(I,:)*F(I,:,S(imain+1,5))) + + + SUM(R(I,1:nu,S(imain+1,6))*R(I,1:nu,S(imain+1,6))) + DO 310 J=1,I-1 + PT(imain+1,I,J) = SUM(FP(I,:)*F(J,:,S(imain+1,5))) + + + SUM(R(I,1:nu,S(imain+1,6))*R(J,1:nu,S(imain+1,6))) +310 PT(imain+1,J,I) = PT(imain+1,I,J) + ENDIF +400 CONTINUE + +C **** SMOOTHING BAKWARD RECURSIONS **** + RECR(1:nx) = 0.D0 + RECN(1:nx,1:nx) = 0.D0 + DO 600 ITIME = nobs,d(1)+1,-1 +C R*G' and H'*Vinv + DO 420 J=1,ny + DO 420 I=1,nx + RG(I,J)=SUM(R(I,1:nu,S(ITIME,6))*G(J,1:nu,S(ITIME,3))) +420 PHFs(I,J) = + # SUM(H(1:ny,I,S(ITIME,2))*Vinv(ITIME,1:ny,J)) + +C F(t+1)*P(t|t-1) + DO 430 I=1,nx + DO 430 J=1,nx +430 FP(I,J) = SUM(F(I,1:nx,S(min(nobs,ITIME+1),5))*PT(ITIME,1:nx,J)) + +C H'*Vinv*H + DO 440 I=1,nx + APPO(I,I) = SUM(PHFs(I,1:ny)*H(1:ny,I,S(ITIME,2))) + DO 440 J=1,I-1 + APPO(I,J) = SUM(PHFs(I,1:ny)*H(1:ny,J,S(ITIME,2))) +440 APPO(J,I) = APPO(I,J) + +C L(t) = F(t+1)-(F(t+1)*P(t|t-1)*H(t)'+R(t)*G(t)')*Vinv(t)*H(t) + DO 450 I=1,nx + DO 450 J=1,nx +450 PFP(I,J) = F(I,J,S(min(nobs,ITIME+1),5)) + + - SUM(FP(I,1:nx)*APPO(1:nx,J)) + + - SUM(RG(I,1:ny)*PHFs(J,1:ny)) + +C r(t-1) = H(t)'*Vinv(t)*INN(t)+L(t)'*r(t) + DO 460 I=1,nx +460 WORK(I) = SUM(PFP(1:nx,I)*RECR(1:nx)) + + DO 470 I=1,nx +470 RECR(I) = WORK(I) + SUM(PHFs(I,1:ny)*INN(ITIME,1:ny)) + +C N(t-1) = H(t)'*Vinv(t)*H(t)+L(t)'*N(t)*L(t) + DO 480 I=1,nx + DO 480 J=1,nx +480 CC(I,J) = SUM(PFP(1:nx,I)*RECN(1:nx,J)) ! L(t)'*N(t) + + DO 490 I=1,nx + RECN(I,I) = APPO(I,I) + SUM(CC(I,1:nx)*PFP(1:nx,I)) + DO 490 J=1,I-1 + RECN(I,J) = APPO(I,J) + SUM(CC(I,1:nx)*PFP(1:nx,J)) +490 RECN(J,I) = RECN(I,J) + +C X(t|T) = X(t|t-1) + P(t|t-1)*r(t-1) + DO 500 I = 1,nx +500 XS(ITIME,I) = XT(ITIME,I) + SUM(PT(ITIME,I,1:nx)*RECR(1:nx)) + +C P(t|T) = P(t|t-1) - P(t|t-1)*N(t-1)*P(t|t-1) + DO 510 I=1,nx + DO 510 J=1,nx +510 CC(I,J) = SUM(PT(ITIME,I,1:nx)*RECN(1:nx,J)) ! P(t|t-1)*N(t-1) + +c DO 520 I=1,nx +c PS(ITIME,I,I) = PT(ITIME,I,I) - SUM(CC(I,1:nx)*PT(ITIME,1:nx,I)) +c DO 520 J=1,I-1 +c PS(ITIME,I,J) = PT(ITIME,I,J) - SUM(CC(I,1:nx)*PT(ITIME,1:nx,J)) +c520 PS(ITIME,J,I) = PS(ITIME,I,J) + +600 CONTINUE + +C INITIAL KALMAN SAMOOTING + RECRI(1:nx) = 0.D0 + DO 800 ITIME = d(1),1,-1 +C L(t) = F(t)-Kst(t)*H(t) + DO 610 I=1,nx + DO 610 J=1,nx +610 PFP(I,J) = F(I,J,S(ITIME,5)) + + - SUM(Kst(ITIME,I,1:ny)*H(1:ny,J,S(ITIME,2))) + +C r(t-1) = H(t)'*Fsm*INN(t) + L(t)'*r(t) +C ri(t-1) = H(t)'*Fim*INN(t) + L(t)'*ri(t) + Li(t)'*r(t) + DO 620 I=1,nx + WORK(I) = SUM(PFP(1:nx,I)*RECR(1:nx)) ! L(t)'*r(t) +620 WORK(nx+I) = SUM(PFP(1:nx,I)*RECRI(1:nx)) ! L(t)'*ri(t) + +C Li(t) = -Kit(t)*H(t) + DO 621 I=1,nx + DO 621 J=1,nx +621 PFP(I,J) = + # - SUM(Kit(ITIME,I,1:ny)*H(1:ny,J,S(ITIME,2))) + +C L(t)'*ri(t) + Li(t)'*r(t) + DO 622 I=1,nx +622 WORK(nx+I) = WORK(nx+I)+SUM(PFP(1:nx,I)*RECR(1:nx)) + +C H'*Fsm + DO 625 I=1,nx + DO 625 J=1,ny +625 PHFs(I,J) = + # SUM(H(1:ny,I,S(ITIME,2))*Vis(ITIME,1:ny,J)) + + DO 630 I=1,nx +630 RECR(I) = WORK(I) + SUM(PHFs(I,1:ny)*INN(ITIME,1:ny)) + +C H'*Fim + DO 631 I=1,nx + DO 631 J=1,ny +631 PHFs(I,J) = + # SUM(H(1:ny,I,S(ITIME,2))*Vii(ITIME,1:ny,J)) + + DO 632 I=1,nx +632 RECRI(I) = WORK(nx+I) + SUM(PHFs(I,1:ny)*INN(ITIME,1:ny)) + +C X(d|T) = X(d|d-1) + Psd*r(t-1) + Pid*ri(t-1) + DO 660 I = 1,nx +660 XS(ITIME,I) = XT(ITIME,I) + SUM(PT(ITIME,I,1:nx)*RECR(1:nx)) + + + SUM(Pi(ITIME,I,1:nx)*RECRI(1:nx)) + +800 CONTINUE + + DEALLOCATE(Pi,HPs,HPi,Fi,Fs,Fim,Fsm,PHFs,PHFi,FFF,Mi,Ms,Ci, + 1 Kst,Kit,W1,WORK,WORK1,PFP,APPO,APPO1,COM,RG,FP,HP1,V,CC,HPV, + 2 X0,P0,RECR,RECRI,RECN,XT,PT,INN,Vinv,Vis,Vii) + + RETURN + END + +C This is the variance and must be completed!! +C N(t-1) = H(t)'*Vinv(t)*H(t)+L(t)'*N(t)*L(t) +c DO 640 I=1,nx +c DO 640 J=1,nx +c640 CC(I,J) = SUM(PFP(1:nx,I)*RECN(1:nx,J)) ! L(t)'*N(t) +c DO 650 I=1,nx +c RECN(I,I) = APPO(I,I) + SUM(CC(I,1:nx)*PFP(1:nx,I)) +c DO 650 J=1,I-1 +c RECN(I,J) = APPO(I,J) + SUM(CC(I,1:nx)*PFP(1:nx,J)) +c650 RECN(J,I) = RECN(I,J) +C P(t|T) = P(t|t-1) - P(t|t-1)*N(t-1)*P(t|t-1) +c DO 670 I=1,nx +c DO 670 J=1,nx +c670 CC(I,J) = SUM(PT(ITIME,I,1:nx)*RECN(1:nx,J)) ! P(t|t-1)*N(t-1) +c +c DO 680 I=1,nx +c PS(ITIME,I,I) = PT(ITIME,I,I) - SUM(CC(I,1:nx)*PT(ITIME,1:nx,I)) +c DO 680 J=1,I-1 +c PS(ITIME,I,J) = PT(ITIME,I,J) - SUM(CC(I,1:nx)*PT(ITIME,1:nx,J)) +c680 PS(ITIME,J,I) = PS(ITIME,I,J) + diff --git a/lemma4.for b/lemma4.for index a847f2cc4fd32a0dcbac7d325fc7b92572d2d839..e1b6d700852d605824269d593110ce57b4f6639d 100644 --- a/lemma4.for +++ b/lemma4.for @@ -1,14 +1,14 @@ -C ------------------------------------------------------------ -C LEMMA4 returns log(f(y(t+1),...,y(T)|y(1),...,y(t),theta,S)) -C For details see lemma 4 in Gerlach et al. JASA, 2000 -C Developed by A.Rossi, C.Planas and G.Fiorentini -C -C Copyright (C) 2010-2014 European Commission -C +C ------------------------------------------------------------ +C LEMMA4 returns log(f(y(t+1),...,y(T)|y(1),...,y(t),theta,S)) +C For details see lemma 4 in Gerlach et al. JASA, 2000 +C Developed by A.Rossi, C.Planas and G.Fiorentini +C +C Copyright (C) 2010-2014 European Commission +C C This file is part of Program DMM C -C DMM is free software developed at the Joint Research Centre of the -C European Commission: you can redistribute it and/or modify it under +C DMM is free software developed at the Joint Research Centre of the +C European Commission: you can redistribute it and/or modify it under C the terms of the GNU General Public License as published by C the Free Software Foundation, either version 3 of the License, or C (at your option) any later version. @@ -19,75 +19,75 @@ C MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the C GNU General Public License for more details. C C You should have received a copy of the GNU General Public License -C along with DMM. If not, see <http://www.gnu.org/licenses/>. -C ------------------------------------------------------------ - DOUBLE PRECISION FUNCTION LEMMA4(OM,MU,X0,P0,nx) - -! INPUT - INTEGER nx - DOUBLE PRECISION OM(nx,nx),MU(nx),X0(nx),P0(nx,nx) - -! LOCALS - INTEGER I,J,NULLITY,IFAIL - DOUBLE PRECISION COM(nx+1,nx),OMC(nx,nx),C(nx,nx),T(nx,nx), - 1 DETV,AUX,EPS ! W(nx),LAM(nx),WORK(3*nx) - -! EXTERNAL SUBROUTINES - EXTERNAL SCHOLLU,DPOTRF,DPOTRI - - EPS = 1.D-14 - T(:,:) = 0.D0 - CALL SCHOLLU(P0,T,nx,NULLITY,EPS,IFAIL) - -C OMC = T' OM T + I - DO 20 I=1,nx - DO 20 J=1,nx -20 COM(I,J) = SUM(T(:,I)*OM(:,J)) - - OMC(:,:) = 0.D0 - DO 30 I=1,nx - OMC(I,I) = 1.D0 - DO 30 J=1,I - OMC(I,J) = SUM(COM(I,:)*T(:,J)) + OMC(I,J) -30 OMC(J,I) = OMC(I,J) - -C OMC = inv(T' OM T + I ) - COM(1:nx,:) = OMC(:,:) - IFAIL = -1 -C CALL F01ADF(nx, COM, nx+1, IFAIL) - CALL DPOTRF('L',nx,COM(1:nx,1:nx),nx,IFAIL) ! COM = L*L' - DETV = 1.D0 ! det(L) - DO I =1,nx - DETV = DETV*COM(I,I) - ENDDO - CALL DPOTRI('L',nx,COM(1:nx,1:nx),nx,IFAIL) ! COM = VV^-1 - - DO 40 I=1,nx - OMC(I,I) = COM(I,I) - DO 40 J=1,I-1 - OMC(I,J) = COM(I,J) -40 OMC(J,I) = OMC(I,J) - -C COM(1:nx,:) = OMC(:,:) ! CARE OMC IS INVERTED -C IFAIL=-1 -C CALL F03ABF(COM(1:nx,1:nx),nx,nx,DETV,W,IFAIL) - -C AUX = -.5*m' OM m + MU'*m +.5*(mu-om*m)'*T(T'omT+I)^-1*T'*(mu-om*m) - AUX = SUM(MU(:)*X0(:)) ! MU'*m - DO 50 I=1,nx -50 C(I,1) = SUM(X0(:)*OM(:,I)) ! OM*m - AUX = AUX - .5D0*SUM(C(:,1)*X0(:)) ! -.5*m' OM m - - DO 60 I=1,nx -60 COM(I,1) = SUM((MU(:)-C(:,1))*T(:,I)) !(mu-om*m)'*T - -C .5*(mu-om*m)'*T(T'omT+I)^-1*T'*(mu-om*m) - DO 70 I=1,nx - DO 70 J=1,nx -70 AUX = AUX + .5D0*COM(I,1)*COM(J,1)*OMC(I,J) - -c LEMMA4 = .5D0*DLOG(DETV) + AUX - LEMMA4 = -1.D0*DLOG(DETV) + AUX - - RETURN +C along with DMM. If not, see <http://www.gnu.org/licenses/>. +C ------------------------------------------------------------ + DOUBLE PRECISION FUNCTION LEMMA4(OM,MU,X0,P0,nx) + +! INPUT + INTEGER nx + DOUBLE PRECISION OM(nx,nx),MU(nx),X0(nx),P0(nx,nx) + +! LOCALS + INTEGER I,J,NULLITY,IFAIL + DOUBLE PRECISION COM(nx+1,nx),OMC(nx,nx),C(nx,nx),T(nx,nx), + 1 DETV,AUX,EPS ! W(nx),LAM(nx),WORK(3*nx) + +! EXTERNAL SUBROUTINES + EXTERNAL SCHOLLU,DPOTRF,DPOTRI + + EPS = 1.D-14 + T(:,:) = 0.D0 + CALL SCHOLLU(P0,T,nx,NULLITY,EPS,IFAIL) + +C OMC = T' OM T + I + DO 20 I=1,nx + DO 20 J=1,nx +20 COM(I,J) = SUM(T(:,I)*OM(:,J)) + + OMC(:,:) = 0.D0 + DO 30 I=1,nx + OMC(I,I) = 1.D0 + DO 30 J=1,I + OMC(I,J) = SUM(COM(I,:)*T(:,J)) + OMC(I,J) +30 OMC(J,I) = OMC(I,J) + +C OMC = inv(T' OM T + I ) + COM(1:nx,:) = OMC(:,:) + IFAIL = -1 +C CALL F01ADF(nx, COM, nx+1, IFAIL) + CALL DPOTRF('L',nx,COM(1:nx,1:nx),nx,IFAIL) ! COM = L*L' + DETV = 1.D0 ! det(L) + DO I =1,nx + DETV = DETV*COM(I,I) + ENDDO + CALL DPOTRI('L',nx,COM(1:nx,1:nx),nx,IFAIL) ! COM = VV^-1 + + DO 40 I=1,nx + OMC(I,I) = COM(I,I) + DO 40 J=1,I-1 + OMC(I,J) = COM(I,J) +40 OMC(J,I) = OMC(I,J) + +C COM(1:nx,:) = OMC(:,:) ! CARE OMC IS INVERTED +C IFAIL=-1 +C CALL F03ABF(COM(1:nx,1:nx),nx,nx,DETV,W,IFAIL) + +C AUX = -.5*m' OM m + MU'*m +.5*(mu-om*m)'*T(T'omT+I)^-1*T'*(mu-om*m) + AUX = SUM(MU(:)*X0(:)) ! MU'*m + DO 50 I=1,nx +50 C(I,1) = SUM(X0(:)*OM(:,I)) ! OM*m + AUX = AUX - .5D0*SUM(C(:,1)*X0(:)) ! -.5*m' OM m + + DO 60 I=1,nx +60 COM(I,1) = SUM((MU(:)-C(:,1))*T(:,I)) !(mu-om*m)'*T + +C .5*(mu-om*m)'*T(T'omT+I)^-1*T'*(mu-om*m) + DO 70 I=1,nx + DO 70 J=1,nx +70 AUX = AUX + .5D0*COM(I,1)*COM(J,1)*OMC(I,J) + +c LEMMA4 = .5D0*DLOG(DETV) + AUX + LEMMA4 = -1.D0*DLOG(DETV) + AUX + + RETURN END diff --git a/logmvnpdf.for b/logmvnpdf.for index 80b8816a3382e9aa8a52ca65505e0406e9d473a9..e1a55feb02ff6cc4ac10754413a0c6162363719c 100644 --- a/logmvnpdf.for +++ b/logmvnpdf.for @@ -1,17 +1,17 @@ -C ------------------------------------------------------------------------ -C LOGMVNPDF returns the Multivariate Normal pdf with parameters mu, SIG, -C evaluated at x. -C mu (px1),SIG (pxp), x (px1) -C Bauwens et al. (1999): "Bayesian Inference in Dynamic Econometric -C models", Oxford University Press, page 298 -C Developed by A.Rossi, C.Planas and G.Fiorentini -C -C Copyright (C) 2010-2014 European Commission -C +C ------------------------------------------------------------------------ +C LOGMVNPDF returns the Multivariate Normal pdf with parameters mu, SIG, +C evaluated at x. +C mu (px1),SIG (pxp), x (px1) +C Bauwens et al. (1999): "Bayesian Inference in Dynamic Econometric +C models", Oxford University Press, page 298 +C Developed by A.Rossi, C.Planas and G.Fiorentini +C +C Copyright (C) 2010-2014 European Commission +C C This file is part of Program DMM C -C DMM is free software developed at the Joint Research Centre of the -C European Commission: you can redistribute it and/or modify it under +C DMM is free software developed at the Joint Research Centre of the +C European Commission: you can redistribute it and/or modify it under C the terms of the GNU General Public License as published by C the Free Software Foundation, either version 3 of the License, or C (at your option) any later version. @@ -22,54 +22,54 @@ C MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the C GNU General Public License for more details. C C You should have received a copy of the GNU General Public License -C along with DMM. If not, see <http://www.gnu.org/licenses/>. -C -------------------------------------------------------------------------- - DOUBLE PRECISION FUNCTION logmvnpdf(X,mu,SIG,p) - -C INPUT - INTEGER p - DOUBLE PRECISION X(p),mu(p),SIG(p,p) -C LOCALS - INTEGER I,J,IFAIL - DOUBLE PRECISION,ALLOCATABLE:: ISIG(:,:),COM(:,:) - DOUBLE PRECISION PI,H,DET,KER - DATA PI/3.141592653589793D0/,H/-.5D0/ -C EXTERNAL SUBROUTINES - EXTERNAL DPOTRF,DPOTRI - - ALLOCATE(ISIG(p,p),COM(p+1,p)) - -C INVERT SIG - COM(1:p,1:p) = SIG(1:p,1:p) - IFAIL = -1 -C CALL F01ADF(p,COM(1:p+1,1:p),p+1,IFAIL) - CALL DPOTRF('L',p,COM(1:p,1:p),p,IFAIL) ! COM = L*L' - DET = 1.D0 ! det(L) - DO I =1,p - DET = DET*COM(I,I) - ENDDO - CALL DPOTRI('L',p,COM(1:p,1:p),p,IFAIL) ! COM = VV^-1 - - DO 10 I=1,p - ISIG(I,I) = COM(I,I) - DO 10 J=1,I-1 - ISIG(I,J) = COM(I,J) -10 ISIG(J,I) = ISIG(I,J) - -C DETERMINANT of SIG -c COM(1:p,1:p) = SIG(1:p,1:p) -c IFAIL = -1 -c CALL F03ABF(COM(1:p,1:p),p,p,DET,WKSPCE,IFAIL) - -C QUADRATIC FORM (log) - KER = 0.D0 - DO 20 I=1,p - DO 20 J=1,p -20 KER = KER + (X(I)-mu(I))*ISIG(I,J)*(X(J)-mu(J)) - -C LOG PDF - logmvnpdf = H*p*dlog(2.*PI)-1.D0*dlog(DET)+H*KER - - DEALLOCATE(ISIG,COM) - RETURN +C along with DMM. If not, see <http://www.gnu.org/licenses/>. +C -------------------------------------------------------------------------- + DOUBLE PRECISION FUNCTION logmvnpdf(X,mu,SIG,p) + +C INPUT + INTEGER p + DOUBLE PRECISION X(p),mu(p),SIG(p,p) +C LOCALS + INTEGER I,J,IFAIL + DOUBLE PRECISION,ALLOCATABLE:: ISIG(:,:),COM(:,:) + DOUBLE PRECISION PI,H,DET,KER + DATA PI/3.141592653589793D0/,H/-.5D0/ +C EXTERNAL SUBROUTINES + EXTERNAL DPOTRF,DPOTRI + + ALLOCATE(ISIG(p,p),COM(p+1,p)) + +C INVERT SIG + COM(1:p,1:p) = SIG(1:p,1:p) + IFAIL = -1 +C CALL F01ADF(p,COM(1:p+1,1:p),p+1,IFAIL) + CALL DPOTRF('L',p,COM(1:p,1:p),p,IFAIL) ! COM = L*L' + DET = 1.D0 ! det(L) + DO I =1,p + DET = DET*COM(I,I) + ENDDO + CALL DPOTRI('L',p,COM(1:p,1:p),p,IFAIL) ! COM = VV^-1 + + DO 10 I=1,p + ISIG(I,I) = COM(I,I) + DO 10 J=1,I-1 + ISIG(I,J) = COM(I,J) +10 ISIG(J,I) = ISIG(I,J) + +C DETERMINANT of SIG +c COM(1:p,1:p) = SIG(1:p,1:p) +c IFAIL = -1 +c CALL F03ABF(COM(1:p,1:p),p,p,DET,WKSPCE,IFAIL) + +C QUADRATIC FORM (log) + KER = 0.D0 + DO 20 I=1,p + DO 20 J=1,p +20 KER = KER + (X(I)-mu(I))*ISIG(I,J)*(X(J)-mu(J)) + +C LOG PDF + logmvnpdf = H*p*dlog(2.*PI)-1.D0*dlog(DET)+H*KER + + DEALLOCATE(ISIG,COM) + RETURN END diff --git a/lyapunov.for b/lyapunov.for index 66964fd7451408845a2288edac15de0627a2d5e2..d0c292b9bb87c54c1b611124614820b1b96d854d 100644 --- a/lyapunov.for +++ b/lyapunov.for @@ -1,16 +1,16 @@ -C ------------------------------------------------------------- -C LYAP solves the Lyapunov equation Ps-F*Ps*F'=RR -C where RR and Ps are symmetric matrices. -C Developed by DYNARE team -C Recoded in Fortran by A.Rossi, C.Planas and G.Fiorentini -C +C ------------------------------------------------------------- +C LYAP solves the Lyapunov equation Ps-F*Ps*F'=RR +C where RR and Ps are symmetric matrices. +C Developed by DYNARE team +C Recoded in Fortran by A.Rossi, C.Planas and G.Fiorentini +C C Copyright (C) 2006-2012 Dynare Team -C Copyright (C) 2010-2014 European Commission -C +C Copyright (C) 2010-2014 European Commission +C C This file is part of Program DMM C -C DMM is free software developed at the Joint Research Centre of the -C European Commission: you can redistribute it and/or modify it under +C DMM is free software developed at the Joint Research Centre of the +C European Commission: you can redistribute it and/or modify it under C the terms of the GNU General Public License as published by C the Free Software Foundation, either version 3 of the License, or C (at your option) any later version. @@ -21,190 +21,190 @@ C MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the C GNU General Public License for more details. C C You should have received a copy of the GNU General Public License -C along with DMM. If not, see <http://www.gnu.org/licenses/>. -C ------------------------------------------------------------- - SUBROUTINE LYAP(nx,nu,compt,F,R,Ps) -C INPUT - INTEGER nx,nu - DOUBLE PRECISION compt,F(nx,nx),R(nx,nu) -C OUTPUT - DOUBLE PRECISION Ps(nx,nx) -C LOCALS - INTEGER I,J,IFAIL,LWORK,IPIV(nx**2) - LOGICAL BWORK(nx),SELECT - DOUBLE PRECISION, ALLOCATABLE:: WORK(:),RR(:,:),WR(:),WI(:), - 1 Z(:,:),T(:,:),ZR(:,:),ZRZ(:,:),Q(:,:),WR1(:),Z1(:) -C EXTERNAL SUBROUTINES - EXTERNAL DGETRF,DGETRI,DGEES,SELECT - -C RR = R*R' - ALLOCATE(RR(nx,nx)) - DO 10 I = 1,nx - RR(I,I) = SUM(R(I,:)*R(I,:)) - DO 10 J = 1,I-1 - RR(I,J) = SUM(R(I,:)*R(J,:)) -10 RR(J,I) = RR(I,J) - - IF (nx.EQ.1) THEN - Ps(1,1) = RR(1,1)/(1.D0-F(1,1)**2) - DEALLOCATE(RR) - GOTO 7777 - ENDIF - - LWORK = 3*nx - ALLOCATE(T(nx,nx),WORK(LWORK),WR(nx),WI(nx),Z(nx,nx),ZRZ(nx,nx), - 1 ZR(nx,nx),Q(2*nx,2*nx),WR1(nx),Z1(2*nx)) - - T(1:nx,1:nx) = F(1:nx,1:nx) - IFAIL = -1 -C CALL F02EAF('V',nx,T,nx,WR,WI,Z,nx,WORK,LWORK,IFAIL) ! F = ZTZ' - I = 0 - CALL DGEES('V','N',SELECT,nx,T,nx,I,WR,WI,Z,nx,WORK,LWORK, - # BWORK,IFAIL) - DO I = 1,nx - IF (WI(I)**2+WR(I)**2.GE.1.D0) THEN - TYPE *, ' ' - TYPE *, ' LYAPUNOV SUBROUTINE: Some parameters out of ' - TYPE *, ' stationary region. Check hyptheta in namelist prior.' - TYPE *, ' Program aborting' - PAUSE - STOP - ENDIF - ENDDO - -C ZRZ = Z'*RR*Z (B in Matlab) - DO 20 I = 1,nx - DO 20 J = 1,nx -20 ZR(I,J) = SUM(Z(:,I)*RR(:,J)) ! Z'*RR - - DO 30 I = 1,nx - DO 30 J = 1,nx -30 ZRZ(I,J) = SUM(ZR(I,:)*Z(:,J)) - - I = nx - WR(:) = 0.D0 !(c in Matalab) - WR1(:) = 0.D0 !(c1 in Matalab) - Ps(:,:) = 0.D0 !(x in Matalab) - DO WHILE (I.GE.2) - IF (DABS(T(I,I-1)).LT.compt) THEN - IF (I.LT.nx) THEN -c c = T(1:i,:)*(x(:,i+1:end)*T(i,i+1:end)') + ... -c T(i,i)*T(1:i,i+1:end)*x(i+1:end,i); - DO 40 J = 1,nx -40 WI(J) = SUM(Ps(J,I+1:nx)*T(I,I+1:nx)) - DO 50 J = 1,I -50 WR(J) = SUM(T(J,1:nx)*WI(1:nx)) - + + T(I,I)*SUM(T(J,I+1:nx)*Ps(I+1:nx,I)) - - ENDIF -c q = eye(i)-T(1:i,1:i)*T(i,i); -c x(1:i,i) = q\(B(1:i,i)+c); x = inv(q)*(B(1:i,i)+c) -c x(i,1:i-1) = x(1:i-1,i)'; -c i = i - 1; - Q(1:I,1:I) = -T(I,I)*T(1:I,1:I) - DO 60 J = 1,I -60 Q(J,J) = Q(J,J) + 1.D0 - - IFAIL = -1 - ZR(1:I,1:I) = Q(1:I,1:I) -c CALL F07ADF(I,I,ZR(1:I,1:I),I,IPIV(1:I),IFAIL) -c CALL F07AJF(I,ZR(1:I,1:I),I,IPIV(1:I),WORK(1:64*I),64*I,IFAIL) - CALL DGETRF(I,I,ZR(1:I,1:I),I,IPIV(1:I),IFAIL) - CALL DGETRI(I,ZR(1:I,1:I),I,IPIV(1:I),WORK(1:64*I),64*I,IFAIL) - DO 70 J = 1,I -70 Ps(J,I) = SUM(ZR(J,1:I)*(ZRZ(1:I,I)+WR(1:I))) - Ps(I,1:I-1) = Ps(1:I-1,I) - I = I - 1 - ELSE - IF (I.LT.nx) THEN -c c = T(1:i,:)*(x(:,i+1:end)*T(i,i+1:end)') + ... -c T(i,i)*T(1:i,i+1:end)*x(i+1:end,i) + ... -c T(i,i-1)*T(1:i,i+1:end)*x(i+1:end,i-1); - DO 90 J = 1,nx -90 WI(J) = SUM(Ps(J,I+1:nx)*T(I,I+1:nx)) - DO 100 J = 1,I -100 WR(J) = SUM(T(J,1:nx)*WI(1:nx)) - + + T(I,I)*SUM(T(J,I+1:nx)*Ps(I+1:nx,I)) - + + T(I,I-1)*SUM(T(J,I+1:nx)*Ps(I+1:nx,I-1)) -c c1 = T(1:i,:)*(x(:,i+1:end)*T(i-1,i+1:end)') + ... -c T(i-1,i-1)*T(1:i,i+1:end)*x(i+1:end,i-1) + ... -c T(i-1,i)*T(1:i,i+1:end)*x(i+1:end,i); - DO 110 J = 1,nx -110 WI(J) = SUM(Ps(J,I+1:nx)*T(I-1,I+1:nx)) - - DO 120 J = 1,I -120 WR1(J) = SUM(T(J,1:nx)*WI(1:nx)) - + + T(I-1,I-1)*SUM(T(J,I+1:nx)*Ps(I+1:nx,I-1)) - + + T(I-1,I)*SUM(T(J,I+1:nx)*Ps(I+1:nx,I)) - ENDIF -c q = [ eye(i)-T(1:i,1:i)*T(i,i) , -T(1:i,1:i)*T(i,i-1) ; ... -c -T(1:i,1:i)*T(i-1,i) , eye(i)-T(1:i,1:i)*T(i-1,i-1) ]; - Q(1:I,1:I) = -T(I,I)*T(1:I,1:I) - Q(I+1:2*I,I+1:2*I) = -T(I-1,I-1)*T(1:I,1:I) - Q(1:I,I+1:2*I) = -T(I,I-1)*T(1:I,1:I) - Q(I+1:2*I,1:I) = -T(I-1,I)*T(1:I,1:I) - DO 130 J = 1,2*I -130 Q(J,J) = Q(J,J) + 1.D0 -c z = q\[ B(1:i,i)+c ; B(1:i,i-1) + c1 ]; - IFAIL = -1 -C CALL F07ADF(2*I,2*I,Q(1:2*I,1:2*I),2*I,IPIV(1:2*I),IFAIL) -C CALL F07AJF(2*I,Q(1:2*I,1:2*I),2*I,IPIV(1:2*I),WORK(1:64*2*I), -C # 64*2*I,IFAIL) - CALL DGETRF(2*I,2*I,Q(1:2*I,1:2*I),2*I,IPIV(1:2*I),IFAIL) - CALL DGETRI(2*I,Q(1:2*I,1:2*I),2*I,IPIV(1:2*I),WORK(1:64*2*I), - # 64*2*I,IFAIL) - - DO 140 J = 1,2*I -140 Z1(J) = SUM(Q(J,1:I)*(ZRZ(1:I,I) + WR(1:I))) - + + SUM(Q(J,I+1:2*I)*(ZRZ(1:I,I-1) + WR1(1:I))) -c x(1:i,i) = z(1:i); -c x(1:i,i-1) = z(i+1:end); -c x(i,1:i-1) = x(1:i-1,i)'; -c x(i-1,1:i-2) = x(1:i-2,i-1)'; - Ps(1:I,I) = Z1(1:i) - Ps(1:I,I-1) = Z1(I+1:2*I) - Ps(I,1:I-1) = Ps(1:I-1,I) - Ps(I-1,1:I-2) = Ps(1:I-2,I-1) - I = I - 2 - ENDIF - END DO -c if i == 1 -c c = T(1,:)*(x(:,2:end)*T(1,2:end)') + T(1,1)*T(1,2:end)*x(2:end,1); -c x(1,1) = (B(1,1)+c)/(1-T(1,1)*T(1,1)); -c end - IF (I.EQ.1) THEN - DO 150 J =1,nx - WI(J) = SUM(Ps(J,2:nx)*T(1,2:nx)) -150 WR(1) = SUM(T(1,1:nx)*WI(1:nx)) - + + T(1,1)*SUM(T(1,2:nx)*Ps(2:nx,1)) - Ps(1,1) = (ZRZ(1,1)+WR(1))/(1.D0-T(1,1)**2) - ENDIF -c x = U(:,:)*x*U(:,:)'; - DO 160 I = 1,nx - DO 160 J = 1,nx -160 ZR(I,J) = SUM(Z(I,1:nx)*Ps(1:nx,J)) - - DO 170 I = 1,nx - Ps(I,I) = SUM(ZR(I,1:nx)*Z(I,1:nx)) - DO 170 J = 1,I-1 - Ps(I,J) = SUM(ZR(I,1:nx)*Z(J,1:nx)) -170 Ps(J,I) = Ps(I,J) - - DEALLOCATE(WORK,RR,WR,WI,Z,T,ZRZ,ZR,Q,WR1,Z1) - -7777 RETURN +C along with DMM. If not, see <http://www.gnu.org/licenses/>. +C ------------------------------------------------------------- + SUBROUTINE LYAP(nx,nu,compt,F,R,Ps) +C INPUT + INTEGER nx,nu + DOUBLE PRECISION compt,F(nx,nx),R(nx,nu) +C OUTPUT + DOUBLE PRECISION Ps(nx,nx) +C LOCALS + INTEGER I,J,IFAIL,LWORK,IPIV(nx**2) + LOGICAL BWORK(nx),SELECT + DOUBLE PRECISION, ALLOCATABLE:: WORK(:),RR(:,:),WR(:),WI(:), + 1 Z(:,:),T(:,:),ZR(:,:),ZRZ(:,:),Q(:,:),WR1(:),Z1(:) +C EXTERNAL SUBROUTINES + EXTERNAL DGETRF,DGETRI,DGEES,SELECT + +C RR = R*R' + ALLOCATE(RR(nx,nx)) + DO 10 I = 1,nx + RR(I,I) = SUM(R(I,:)*R(I,:)) + DO 10 J = 1,I-1 + RR(I,J) = SUM(R(I,:)*R(J,:)) +10 RR(J,I) = RR(I,J) + + IF (nx.EQ.1) THEN + Ps(1,1) = RR(1,1)/(1.D0-F(1,1)**2) + DEALLOCATE(RR) + GOTO 7777 + ENDIF + + LWORK = 3*nx + ALLOCATE(T(nx,nx),WORK(LWORK),WR(nx),WI(nx),Z(nx,nx),ZRZ(nx,nx), + 1 ZR(nx,nx),Q(2*nx,2*nx),WR1(nx),Z1(2*nx)) + + T(1:nx,1:nx) = F(1:nx,1:nx) + IFAIL = -1 +C CALL F02EAF('V',nx,T,nx,WR,WI,Z,nx,WORK,LWORK,IFAIL) ! F = ZTZ' + I = 0 + CALL DGEES('V','N',SELECT,nx,T,nx,I,WR,WI,Z,nx,WORK,LWORK, + # BWORK,IFAIL) + DO I = 1,nx + IF (WI(I)**2+WR(I)**2.GE.1.D0) THEN + TYPE *, ' ' + TYPE *, ' LYAPUNOV SUBROUTINE: Some parameters out of ' + TYPE *, ' stationary region. Check hyptheta in namelist prior.' + TYPE *, ' Program aborting' + PAUSE + STOP + ENDIF + ENDDO + +C ZRZ = Z'*RR*Z (B in Matlab) + DO 20 I = 1,nx + DO 20 J = 1,nx +20 ZR(I,J) = SUM(Z(:,I)*RR(:,J)) ! Z'*RR + + DO 30 I = 1,nx + DO 30 J = 1,nx +30 ZRZ(I,J) = SUM(ZR(I,:)*Z(:,J)) + + I = nx + WR(:) = 0.D0 !(c in Matalab) + WR1(:) = 0.D0 !(c1 in Matalab) + Ps(:,:) = 0.D0 !(x in Matalab) + DO WHILE (I.GE.2) + IF (DABS(T(I,I-1)).LT.compt) THEN + IF (I.LT.nx) THEN +c c = T(1:i,:)*(x(:,i+1:end)*T(i,i+1:end)') + ... +c T(i,i)*T(1:i,i+1:end)*x(i+1:end,i); + DO 40 J = 1,nx +40 WI(J) = SUM(Ps(J,I+1:nx)*T(I,I+1:nx)) + DO 50 J = 1,I +50 WR(J) = SUM(T(J,1:nx)*WI(1:nx)) + + + T(I,I)*SUM(T(J,I+1:nx)*Ps(I+1:nx,I)) + + ENDIF +c q = eye(i)-T(1:i,1:i)*T(i,i); +c x(1:i,i) = q\(B(1:i,i)+c); x = inv(q)*(B(1:i,i)+c) +c x(i,1:i-1) = x(1:i-1,i)'; +c i = i - 1; + Q(1:I,1:I) = -T(I,I)*T(1:I,1:I) + DO 60 J = 1,I +60 Q(J,J) = Q(J,J) + 1.D0 + + IFAIL = -1 + ZR(1:I,1:I) = Q(1:I,1:I) +c CALL F07ADF(I,I,ZR(1:I,1:I),I,IPIV(1:I),IFAIL) +c CALL F07AJF(I,ZR(1:I,1:I),I,IPIV(1:I),WORK(1:64*I),64*I,IFAIL) + CALL DGETRF(I,I,ZR(1:I,1:I),I,IPIV(1:I),IFAIL) + CALL DGETRI(I,ZR(1:I,1:I),I,IPIV(1:I),WORK(1:64*I),64*I,IFAIL) + DO 70 J = 1,I +70 Ps(J,I) = SUM(ZR(J,1:I)*(ZRZ(1:I,I)+WR(1:I))) + Ps(I,1:I-1) = Ps(1:I-1,I) + I = I - 1 + ELSE + IF (I.LT.nx) THEN +c c = T(1:i,:)*(x(:,i+1:end)*T(i,i+1:end)') + ... +c T(i,i)*T(1:i,i+1:end)*x(i+1:end,i) + ... +c T(i,i-1)*T(1:i,i+1:end)*x(i+1:end,i-1); + DO 90 J = 1,nx +90 WI(J) = SUM(Ps(J,I+1:nx)*T(I,I+1:nx)) + DO 100 J = 1,I +100 WR(J) = SUM(T(J,1:nx)*WI(1:nx)) + + + T(I,I)*SUM(T(J,I+1:nx)*Ps(I+1:nx,I)) + + + T(I,I-1)*SUM(T(J,I+1:nx)*Ps(I+1:nx,I-1)) +c c1 = T(1:i,:)*(x(:,i+1:end)*T(i-1,i+1:end)') + ... +c T(i-1,i-1)*T(1:i,i+1:end)*x(i+1:end,i-1) + ... +c T(i-1,i)*T(1:i,i+1:end)*x(i+1:end,i); + DO 110 J = 1,nx +110 WI(J) = SUM(Ps(J,I+1:nx)*T(I-1,I+1:nx)) + + DO 120 J = 1,I +120 WR1(J) = SUM(T(J,1:nx)*WI(1:nx)) + + + T(I-1,I-1)*SUM(T(J,I+1:nx)*Ps(I+1:nx,I-1)) + + + T(I-1,I)*SUM(T(J,I+1:nx)*Ps(I+1:nx,I)) + ENDIF +c q = [ eye(i)-T(1:i,1:i)*T(i,i) , -T(1:i,1:i)*T(i,i-1) ; ... +c -T(1:i,1:i)*T(i-1,i) , eye(i)-T(1:i,1:i)*T(i-1,i-1) ]; + Q(1:I,1:I) = -T(I,I)*T(1:I,1:I) + Q(I+1:2*I,I+1:2*I) = -T(I-1,I-1)*T(1:I,1:I) + Q(1:I,I+1:2*I) = -T(I,I-1)*T(1:I,1:I) + Q(I+1:2*I,1:I) = -T(I-1,I)*T(1:I,1:I) + DO 130 J = 1,2*I +130 Q(J,J) = Q(J,J) + 1.D0 +c z = q\[ B(1:i,i)+c ; B(1:i,i-1) + c1 ]; + IFAIL = -1 +C CALL F07ADF(2*I,2*I,Q(1:2*I,1:2*I),2*I,IPIV(1:2*I),IFAIL) +C CALL F07AJF(2*I,Q(1:2*I,1:2*I),2*I,IPIV(1:2*I),WORK(1:64*2*I), +C # 64*2*I,IFAIL) + CALL DGETRF(2*I,2*I,Q(1:2*I,1:2*I),2*I,IPIV(1:2*I),IFAIL) + CALL DGETRI(2*I,Q(1:2*I,1:2*I),2*I,IPIV(1:2*I),WORK(1:64*2*I), + # 64*2*I,IFAIL) + + DO 140 J = 1,2*I +140 Z1(J) = SUM(Q(J,1:I)*(ZRZ(1:I,I) + WR(1:I))) + + + SUM(Q(J,I+1:2*I)*(ZRZ(1:I,I-1) + WR1(1:I))) +c x(1:i,i) = z(1:i); +c x(1:i,i-1) = z(i+1:end); +c x(i,1:i-1) = x(1:i-1,i)'; +c x(i-1,1:i-2) = x(1:i-2,i-1)'; + Ps(1:I,I) = Z1(1:i) + Ps(1:I,I-1) = Z1(I+1:2*I) + Ps(I,1:I-1) = Ps(1:I-1,I) + Ps(I-1,1:I-2) = Ps(1:I-2,I-1) + I = I - 2 + ENDIF + END DO +c if i == 1 +c c = T(1,:)*(x(:,2:end)*T(1,2:end)') + T(1,1)*T(1,2:end)*x(2:end,1); +c x(1,1) = (B(1,1)+c)/(1-T(1,1)*T(1,1)); +c end + IF (I.EQ.1) THEN + DO 150 J =1,nx + WI(J) = SUM(Ps(J,2:nx)*T(1,2:nx)) +150 WR(1) = SUM(T(1,1:nx)*WI(1:nx)) + + + T(1,1)*SUM(T(1,2:nx)*Ps(2:nx,1)) + Ps(1,1) = (ZRZ(1,1)+WR(1))/(1.D0-T(1,1)**2) + ENDIF +c x = U(:,:)*x*U(:,:)'; + DO 160 I = 1,nx + DO 160 J = 1,nx +160 ZR(I,J) = SUM(Z(I,1:nx)*Ps(1:nx,J)) + + DO 170 I = 1,nx + Ps(I,I) = SUM(ZR(I,1:nx)*Z(I,1:nx)) + DO 170 J = 1,I-1 + Ps(I,J) = SUM(ZR(I,1:nx)*Z(J,1:nx)) +170 Ps(J,I) = Ps(I,J) + + DEALLOCATE(WORK,RR,WR,WI,Z,T,ZRZ,ZR,Q,WR1,Z1) + +7777 RETURN + END + +C For DEEGS - not used + LOGICAL FUNCTION SELECT(A,B) + DOUBLE PRECISION A,B + RETURN END - -C For DEEGS - not used - LOGICAL FUNCTION SELECT(A,B) - DOUBLE PRECISION A,B - RETURN - END - - -c SUBROUTINE PROVA(A) -c DOUBLE PRECISION A -c DIMENSION A( * ) -c A(4) = 1.D0 -c RETURN + + +c SUBROUTINE PROVA(A) +c DOUBLE PRECISION A +c DIMENSION A( * ) +c A(4) = 1.D0 +c RETURN c END diff --git a/main.for b/main.for index 2e2b58f571683edde4abf1467916da1eaaba8dd4..4ea6121d9ec01f614b90938e902ff54f52a54393 100644 --- a/main.for +++ b/main.for @@ -1,27 +1,27 @@ -C -------------------------------------------------------------------------------------- -C Program DMM: Bayesian and Classical Inference of Dynamic Mixture Models -C Developed by A.Rossi, C.Planas and G.Fiorentini -C -C State-space format: y(t) = c(t)z(t) + H(t)x(t) + G(t)u(t) -C x(t) = a(t) + F(t)x(t-1) + R(t)u(t) -C -C y(t) (ny x 1) ny = # of endogenous series -C z(t) (nz x 1) nz = # of exogenous series -C x(t) (nx x 1) nx = # of continous states -C u(t) (nu x 1) nu = # of shocks -C c(t) (ny x nz x ns1) ns1 = # of states for c(t) -C H(t) (ny x nx x ns2) ns2 = # of states for H(t) -C G(t) (ny x nu x ns3) ns3 = # of states for G(t) -C a(t) (nx x ns4) ns4 = # of states for a(t) -C F(t) (nx x nx x ns5) ns5 = # of states for F(t) -C R(t) (nx x nu x ns6) ns6 = # of states for R(t) -C -C Copyright (C) 2010-2014 European Commission -C +C -------------------------------------------------------------------------------------- +C Program DMM: Bayesian and Classical Inference of Dynamic Mixture Models +C Developed by A.Rossi, C.Planas and G.Fiorentini +C +C State-space format: y(t) = c(t)z(t) + H(t)x(t) + G(t)u(t) +C x(t) = a(t) + F(t)x(t-1) + R(t)u(t) +C +C y(t) (ny x 1) ny = # of endogenous series +C z(t) (nz x 1) nz = # of exogenous series +C x(t) (nx x 1) nx = # of continous states +C u(t) (nu x 1) nu = # of shocks +C c(t) (ny x nz x ns1) ns1 = # of states for c(t) +C H(t) (ny x nx x ns2) ns2 = # of states for H(t) +C G(t) (ny x nu x ns3) ns3 = # of states for G(t) +C a(t) (nx x ns4) ns4 = # of states for a(t) +C F(t) (nx x nx x ns5) ns5 = # of states for F(t) +C R(t) (nx x nu x ns6) ns6 = # of states for R(t) +C +C Copyright (C) 2010-2014 European Commission +C C This file is part of Program DMM C -C DMM is free software developed at the Joint Research Centre of the -C European Commission: you can redistribute it and/or modify it under +C DMM is free software developed at the Joint Research Centre of the +C European Commission: you can redistribute it and/or modify it under C the terms of the GNU General Public License as published by C the Free Software Foundation, either version 3 of the License, or C (at your option) any later version. @@ -32,795 +32,795 @@ C MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the C GNU General Public License for more details. C C You should have received a copy of the GNU General Public License -C along with DMM. If not, see <http://www.gnu.org/licenses/>. -C -------------------------------------------------------------------------------------- - PROGRAM DMM - USE dfwin -C DECLARE an "interface block" to the .DLL that contains DESIGN - - INTERFACE - SUBROUTINE DESIGN(ny,nz,nx,nu,ns,nt,theta,c,H,G,a,F,R) - INTEGER ny,nz,nx,nu,ns(6),nt - DOUBLE PRECISION theta(nt) - DOUBLE PRECISION c(ny,max(1,nz),ns(1)),H(ny,nx,ns(2)), - 1 G(ny,nu,ns(3)),a(nx,ns(4)),F(nx,nx,ns(5)),R(nx,nu,ns(6)) - END SUBROUTINE - END INTERFACE - CHARACTER*1 fittizia - POINTER (pdll,fittizia) ! ASSOCIATE pointer pdll alla DLL ad una varibile fittizia - POINTER (pdesign,DESIGN) -C DECLARE an "interface block" to the .DLL that contains SETFILEM - INTERFACE - SUBROUTINE SETFILEM(mfile,pathmfile) - CHARACTER*200 mfile,pathmfile - END SUBROUTINE - END INTERFACE - POINTER (psetfilem,SETFILEM) -C DECLARE an "interface block" to the .DLL that contains GETERRSTR - INTERFACE - SUBROUTINE GETERRSTR(matlaberror) - CHARACTER*1024 matlaberror - END SUBROUTINE - END INTERFACE - POINTER (pgeterrstr,GETERRSTR) - - LOGICAL status - CHARACTER*200 DLLNAME ! name of the DLL (defined by the user) - -C NAMELIST DECLARATIONS - INTEGER ny,nz,nx,nu,d(2),nv,nt,nf,nobs - INTEGER seed,thin,burnin,GGG,HBL - CHARACTER*1 MargLik,datasim,check - CHARACTER*2 thetasampler,estimation - CHARACTER*3 Ssampler - DOUBLE PRECISION, ALLOCATABLE:: hypS(:,:,:),hyptheta(:,:), - 1 obs(:) - CHARACTER(2), ALLOCATABLE:: pdftheta(:) -C LOCALS - INTEGER, ALLOCATABLE:: Z(:),ZW(:),S(:,:),NEVAL(:), - 1 CUMN(:),IYK(:,:),INDT(:),ACCRATE(:),gibZ(:,:), - 1 IT1(:),IT2(:),DATE_ITIME(:),np(:),ns(:),INFOS(:,:) - DOUBLE PRECISION, ALLOCATABLE:: yk(:,:),STATE(:,:),theta(:), - 1 theta0(:),thetaprior(:,:),psi(:),psi0(:),psiprior(:,:), - 2 INN(:,:),FORE(:,:),ykmis(:),PTR(:,:,:),PM(:,:), - 3 gibtheta(:,:),MLHM(:,:),MLMW(:,:),thetase(:),AKMSE(:,:),HESS(:), - 4 psise(:),SSMOOTH(:,:) - DOUBLE PRECISION,ALLOCATABLE::c(:,:,:),H(:,:,:), - 1 G(:,:,:),a(:,:),F(:,:,:),R(:,:,:) - CHARACTER(12), ALLOCATABLE:: REAL_CLOCK(:) - INTEGER ntf,nstot,nmis,indmis,IT,I,J,K,L1,jjj,IND,IFAIL,IMAX(1), - 1 IMIN(1),IMSVAR - DOUBLE PRECISION AUX,lastl,lasth - CHARACTER*1 DEB - CHARACTER*3 DLLEXT - CHARACTER*200 mfile,pathmfile - CHARACTER*200 FILEIN,NMLNAME,PATH,FILEOUT,DMMTITLE,CURDIR - CHARACTER*1024 matlaberror - -C EXTERNAL SUBROUTINES - EXTERNAL GETARG -C EXTERNAL FUNCTIONS - DOUBLE PRECISION genbet - -C TIME - ALLOCATE(np(3),ns(6),INFOS(9,6),IT1(7),IT2(7),DATE_ITIME(8), - 1 REAL_CLOCK(3)) - CALL DATE_AND_TIME(REAL_CLOCK(1),REAL_CLOCK(2),REAL_CLOCK(3), - 1 DATE_ITIME) - IT1(1:3) = DATE_ITIME(1:3) - IT1(4:7) = DATE_ITIME(5:8) - -C GET the namelist specified by FILEIN - DEB = 'D' - IF (DEB.EQ.'R') THEN - CALL GETARG(1,FILEIN) ! load name of input file - ELSE - FILEIN = 'H:\AROSSI\DMM\NILE\nile.nml' -C FILEIN = 'H:\arossi\dmm\tfpf\tfpf_es.nml' - ENDIF - -C CHECK FILEIN - IF (TRIM(FILEIN).EQ.'') THEN - TYPE *, ' ' - TYPE *, ' No input file provided' - TYPE *, ' Program aborting' - PAUSE - STOP - ENDIF - -C LOAD input from FILEIN - ALLOCATE(obs(30000),hyptheta(4,200),hypS(50,50,6),pdftheta(200)) - CALL input(FILEIN,NMLNAME,PATH, - 1 ny,nz,nx,nu,d,nv,ns,nstot,np,nf,INFOS, - 2 seed,thin,burnin,GGG,thetasampler,datasim,DLLNAME,check, - 3 estimation,nt,pdftheta,hyptheta,hypS,nobs,obs, - 4 Ssampler,HBL,MargLik) - -C CHECK DLL NAME AND FIND FILE EXTENSION (.dll or .m) - J = SCAN(DLLNAME,'\', BACK = .TRUE.) - I = SCAN(DLLNAME,'.', BACK = .TRUE.) - DLLEXT = DLLNAME(I+1:I+3) - IF ((DLLEXT.EQ.'M ').OR.(DLLEXT.EQ.'m ')) THEN - mfile = DLLNAME(J+1:I-1) - pathmfile = DLLNAME(1:J-1) - DLLNAME = 'H:\arossi\dmm64\matlabdll\debug\matlabdll.dll' ! provvisorio - IND = GETCWD(CURDIR) ! current directory -C DLLNAME = TRIM(CURDIR) // '\matlabdll.dll' ! definitivo - ENDIF - -C FIND the DLL and LOAD it into the memory - pdll = loadlibrary(DLLNAME) - IF (pdll.EQ.0) THEN - TYPE *, ' ' - TYPE *, TRIM(DLLNAME) // ' cannot be found or opened' - TYPE *, ' Program aborting' - PAUSE - STOP - ENDIF - -C SET UP the pointer to the DLL function - pdesign = getprocaddress(pdll, "design_"C) - IF (pdesign.EQ.0) THEN - TYPE *, ' ' - TYPE *, ' Sub DESIGN cannot be found into '// DLLNAME - TYPE *, ' Program aborting' - PAUSE - STOP - ENDIF - -C CHECK the MatLab file if needed - IF ((DLLEXT.EQ.'M ').OR.(DLLEXT.EQ.'m ')) THEN -C SET UP the pointer to the DLL function - psetfilem = getprocaddress(pdll, "setfilem_"C) - IF (psetfilem.EQ.0) THEN - TYPE *, ' ' - TYPE *, ' Sub SETFILEM cannot be found into '// DLLNAME - TYPE *, ' Program aborting' - PAUSE - STOP - ENDIF - -C SET UP the pointer to the DLL function - pgeterrstr = getprocaddress(pdll, "geterrstr_"C) - IF (pgeterrstr.EQ.0) THEN - TYPE *, ' ' - TYPE *, ' Sub GETERRSTR cannot be found into '// DLLNAME - TYPE *, ' Program aborting' - PAUSE - STOP - ENDIF - -C Assign the name of the matlab file - ALLOCATE( c(ny,max(nz,1),ns(1)),H(ny,nx,ns(2)), - 1 G(ny,nu,ns(3)),a(nx,ns(4)),F(nx,nx,ns(5)),R(nx,nu,ns(6)), - 1 theta(nt)) - CALL SETFILEM(mfile,pathmfile) ! ONLY THE FIRST TIME - theta(:) = 1.D0 - CALL DESIGN(ny,nz,nx,nu,ns,nt,theta,c,H,G,a,F,R) - DEALLOCATE(c,H,G,a,F,R,theta) - IF (ny.EQ.0) THEN - TYPE *, ' ' - TYPE *, ' Can''t start MATLAB engine' - TYPE *, ' Program aborting' - PAUSE - STOP - ELSEIF (ny.EQ.-1) THEN - TYPE *, ' ' - TYPE *, ' Can''t read ny in the MATLAB file' - TYPE *, ' Program aborting' - PAUSE - STOP - ELSEIF (ny.EQ.-2) THEN - TYPE *, ' ' - TYPE *, ' Can''t read nz in the MATLAB file' - TYPE *, ' Program aborting' - PAUSE - STOP - ELSEIF (ny.EQ.-3) THEN - TYPE *, ' ' - TYPE *, ' Can''t read nx in the MATLAB file' - TYPE *, ' Program aborting' - PAUSE - STOP - ELSEIF (ny.EQ.-4) THEN - TYPE *, ' ' - TYPE *, ' Can''t read nu in the MATLAB file' - TYPE *, ' Program aborting' - PAUSE - STOP - ELSEIF (ny.EQ.-5) THEN - TYPE *, ' ' - TYPE *, ' Can''t read ns in the MATLAB file' - TYPE *, ' Program aborting' - PAUSE - STOP - ELSEIF (ny.EQ.-6) THEN - TYPE *, ' ' - TYPE *, ' Can''t read nt in the MATLAB file' - TYPE *, ' Program aborting' - PAUSE - STOP - ELSEIF (ny.EQ.-7) THEN - TYPE *, ' ' - TYPE *, ' Can''t find or open the MatLab function' - TYPE *, ' Program aborting' - PAUSE - STOP - ELSEIF (ny.EQ.-8) THEN - CALL GETERRSTR(matlaberror) - TYPE *, ' ' - TYPE *, ' the MATLAB funtion can not be executed:' - TYPE *, trim(matlaberror) - TYPE *, ' Program aborting' - PAUSE - STOP - ELSEIF (ny.LT.-100) THEN - TYPE *, ' ' - TYPE *, ' One of the output canot be assigned during the call ' - TYPE *, ' ' // trim(DLLNAME) - TYPE *, ' Program aborting' - PAUSE - STOP - ENDIF - ENDIF - -C SET SHELL title - DMMTITLE = 'title DMM input:' // TRIM(PATH) // TRIM(NMLNAME) - # // '.nml' // ' - ' // TRIM(DLLNAME) - CALL system(DMMTITLE) - -C INITIALISE THE RANDOM NUMBER GENERATOR - CALL INITRAND(SEED,DATE_ITIME) - -C ASSIGN DATA and MISSING VALUES - ALLOCATE(yk(nobs+nf,ny+nz),IYK(nobs,ny+1)) - K = 0 - DO 10 I = 1,nobs+nf - DO 10 J = 1,ny+nz - K = K+1 -10 yk(I,J) = obs(K) - - IYK(:,:) = 0 - INDMIS = 1 - DO 11 I = 1,nobs - K = 0 - DO 11 J = 1,ny - IF(yk(I,J).NE.-99999.D0) THEN - K = K+1 - IYK(I,K) = J - ELSE - DO JJJ=1,nz - IF (yk(I,ny+JJJ).EQ.-99999.D0)indmis=0 - END DO - ENDIF -11 IYK(I,ny+1) = K - nmis = ny*nobs-SUM(IYK(1:nobs,ny+1)) - DEALLOCATE(obs) - -C Allocate and Assign S - ALLOCATE(S(nobs,6),Z(nobs)) - S(1:nobs,1:6) = 1 - -C ASSIGN THETA-PRIORS - ALLOCATE(thetaprior(nt,4)) - DO 30 I = 1,nt -30 thetaprior(I,1:4) = hyptheta(1:4,I) - DEALLOCATE(hyptheta) - -C ASSIGN PSI hyperparameters (# ind. Dirichelet x max # hyp) - IF (nv.GT.0) THEN - ALLOCATE(psiprior(np(2),np(3))) - K = 0 - DO I = 1,nv - IF (INFOS(9,I).EQ.1) THEN ! S~iid - psiprior(K+1,1:INFOS(8,I)) = hypS(1:INFOS(8,I),1,I) - K = K+1 - ELSEIF (INFOS(9,I).EQ.2) THEN ! S~Markov - DO J = 1,INFOS(8,I) - psiprior(K+J,1:INFOS(8,I)) = hypS(1:INFOS(8,I),J,I) - ENDDO - K = K+INFOS(8,I) - ENDIF - END DO - ENDIF - DEALLOCATE(hypS) - -C THETA STARTING VALUES & TRACK FREE PARAMETERS - ALLOCATE(theta0(nt),theta(nt),INDT(nt+2)) - CALL SIMPRIOR(estimation,nt,thetaprior,pdftheta(1:nt),ntf,INDT, - 1 theta0) - theta(1:nt) = theta0(1:nt) - -C PSI STARTING VALUES - IF (nv.GT.0) THEN - ALLOCATE(psi0(np(1)),psi(np(1)),ZW(2*nobs)) - ENDIF - K = 0 - DO 80 J=1,nv - IF (INFOS(9,J).EQ.1) THEN ! S-IID - DO jjj = 1,INFOS(8,J)-1 - psi0(K+jjj) = genbet(1.D0,1.D0) - ENDDO - AUX = genbet(1.D0,1.D0) -c CALL G05FEF(1.D0,1.D0,INFOS(8,J)-1,psi0(K+1:K+INFOS(8,J)-1), -c 1 IFAIL) ! beta -c CALL G05FEF(1.D0,1.D0,1,AUX,IFAIL) - - psi0(K+1:K+INFOS(8,J)-1) = psi0(K+1:K+INFOS(8,J)-1)/ - # (SUM(psi0(K+1:K+INFOS(8,J)-1))+AUX) - K = K + INFOS(8,J)-1 - ELSE IF (INFOS(9,J).EQ.2) THEN ! S-MARKOV - DO I = 1,INFOS(8,J) -c CALL G05FEF(1.D0,1.D0,INFOS(8,J)-1,psi0(K+1:K+INFOS(8,J)-1), -c 1 IFAIL) -c CALL G05FEF(1.D0,1.D0,1,AUX,IFAIL) - DO jjj = 1,INFOS(8,J)-1 - psi0(K+jjj) = genbet(1.D0,1.D0) - ENDDO - AUX = genbet(1.D0,1.D0) - psi0(K+1:K+INFOS(8,J)-1) = psi0(K+1:K+INFOS(8,J)-1)/ - # (SUM(psi0(K+1:K+INFOS(8,J)-1))+AUX) - K = K + INFOS(8,J)-1 - ENDDO -80 ENDIF - -C WRITE HYPERPARAMTERS for THETA and PSI plus DATA - FILEOUT = TRIM(PATH)//TRIM(NMLNAME)//'.PRI' - OPEN(10,FILE = FILEOUT, ACCESS='SEQUENTIAL') - WRITE(10,'(<11+nv>(I6))') nt,np(1:3),nf,nz,seed,nx,ny,nobs, - 1 nv,INFOS(8,1:nv) - WRITE(10,'(A2)') estimation - DO I =1,nt - WRITE(10,1111) thetaprior(I,1:4),pdftheta(I) - END DO - K = 0 - DO I = 1,nv - IF (INFOS(9,I).EQ.1) THEN - WRITE(10,1112) INFOS(8,I),psiprior(K+1,:),INFOS(9,I) - K = K+1 - ELSEIF (INFOS(9,I).EQ.2) THEN - DO J = 1,INFOS(8,I) - WRITE(10,1112) INFOS(8,I),psiprior(K+1,:),INFOS(9,I) - K = K + 1 - END DO - ENDIF - END DO - DO I =1,nobs+nf - WRITE(10,'(<ny+nz>(F20.10))') yk(I,1:ny+nz) - END DO - CLOSE(10) - - ALLOCATE(STATE(nobs,nx),NEVAL(nt),CUMN(nt)) - -C CHECK DESIGN.dll - IF ((check.EQ.'Y').OR.(check.EQ.'y')) THEN - CALL CHECKDESIGN(ny,nz,nx,nu,ns,nt,d,theta0,pdll,PATH,NMLNAME) - GOTO 7777 - ENDIF - -C SIMULATION of DATA and UNOBSERVABLES - IF ((datasim.EQ.'Y').OR.(datasim.EQ.'y')) THEN - CALL OPENFILES(ESTIMATION,SEED,NV,0,0,datasim,MARGLIK, - 1 PATH,NMLNAME) - CALL SIMDATA(nobs,d,ny,nz,nx,nu,ns,nstot,nt,nv,np,INFOS,pdll, - 2 theta0,psi0,Z,STATE,yk) - IF (nv.EQ.0) THEN - WRITE(9,'((F25.15))') theta0(1:nt) - ELSE - WRITE(9,'((F25.15))') theta0(1:nt),psi0(1:np(1)) - WRITE(11,'(<1>(I3))') Z(:) - ENDIF - WRITE(10,'(<nx>(F20.10))') (STATE(I,1:nx),I=1,nobs) - WRITE(15,'(<ny>(F20.10))') (yk(I,1:ny),I=1,nobs) - CLOSE(9) - CLOSE(10) - CLOSE(11) - CLOSE(15) - GOTO 7777 - ENDIF - -C MAXIMUM LIKELIHOOD ESTIMATION - IF ((estimation.EQ.'ML').OR.(estimation.EQ.'ml').OR. - & (estimation.EQ.'Ml').OR.(estimation.EQ.'mL')) THEN - TYPE *, ' ' - TYPE *, ' Maximum Likelihood inference not allowed ' - TYPE *, ' Program aborting' - PAUSE - STOP - CALL OPENFILES(estimation,seed,nv,nf,0,datasim,marglik, - 1 path,nmlname) - ALLOCATE(HESS((nt+np(1))*(nt+np(1)+1)/2)) -c CALL ML(nobs,d,ny,nz,nx,nu,nt,nv,ns,np(1),INFOS,pdll,INDT,yk,IYK,S, -c 1 thetaprior,theta0,psi0,IMSVAR,HESS,AUX) - ALLOCATE(THETASE(nt),AKMSE(nobs,nx),INN(nobs,ny)) - IF (nv.EQ.0) THEN - CALL OPG(nobs,d,ny,nz,nx,nu,nt,ns,pdll,yk,IYK,S, - 1 theta0,thetaprior,HESS,thetase,STATE,AKMSE,INN,IFAIL) - WRITE(9,'(<2>(F25.15))') (theta0(I),thetase(I),I=1,nt) - WRITE(9,'(<2>(F25.15))') AUX,IFAIL - WRITE(10,'(<nx>(F20.10))') (STATE(I,1:nx),I=1,nobs) - WRITE(10,'(<nx>(F20.10))') (AKMSE(I,1:nx),I=1,nobs) - WRITE(12,'(<ny>(F20.10))') (INN(I,1:ny),I=1,nobs) - ELSE - ALLOCATE(psise(np(1)),SSMOOTH(nobs,nstot)) - IF(IMSVAR.EQ.1)THEN - CALL OPGH(nobs,ny,nz,nx,nu,nt,nv,ns,nstot,np(1),pdll,yk,IYK, - 1 INFOS,theta0,psi0,thetaprior,HESS,thetase,psise, - 1 SSMOOTH,INN,IFAIL) - ELSE - CALL OPGKIM(nobs,d,ny,nz,nx,nu,nt,nv,ns,nstot,np(1),pdll, - 1 yk,IYK,INFOS,theta0,psi0,thetaprior,HESS, - 1 thetase,psise,STATE,AKMSE,SSMOOTH,INN,IFAIL) - WRITE(10,'(<nx>(F20.10))') (STATE(I,1:nx),I=1,nobs) - WRITE(10,'(<nx>(F20.10))') (AKMSE(I,1:nx),I=1,nobs) - ENDIF - WRITE(9,'(<2>(F25.15))') (theta0(I),thetase(I),I=1,nt) - WRITE(9,'(<2>(F25.15))') (psi0(I),psise(I),I=1,np(1)) - WRITE(9,'(<2>(F25.15))') AUX,IFAIL - WRITE(11,'(<nstot>(F20.10))') (SSMOOTH(I,1:nstot),I=1,nobs) - WRITE(12,'(<ny>(F20.10))') (INN(I,1:ny),I=1,nobs) - CLOSE(11) - DEALLOCATE(PSISE,SSMOOTH,HESS) - ENDIF - CLOSE(9) - CLOSE(10) - CLOSE(12) - DEALLOCATE(THETASE,AKMSE,INN) - GOTO 7777 - ENDIF - -C MCMC BURN-IN - IF ((nv.GT.0).AND.(HBL.GT.1)) THEN - ALLOCATE(PTR(nobs,nstot,nstot),PM(nobs,nstot),ACCRATE(nobs)) - PM(:,:) = 1.D0/DFLOAT(nstot) - PTR(:,:,:) = 1.D0/DFLOAT(nstot) - ACCRATE(:) = 0 - ENDIF - CUMN(1:nt) = 0 - NEVAL(1:nt)= 0 - IND = 100 - Z(:) = 1 - ZW(:) = 1 - L1 = 0 - IF (nmis.GT.0) THEN ! MISSINGS - DO jjj = 1,burnin - IF (nv.GT.0) THEN - CALL GCK(nobs,d,ny,nz,nx,nu,nv,ns,nstot,nt,np(1), - 1 yk(1:nobs,:),IYK(1:nobs,:),theta0,psi0, - 2 INFOS,pdll,Z,S) - IF (HBL.GT.1) THEN - CALL RECPR(jjj,nstot,nobs,Z,ZW,PM,PTR) - ENDIF - CALL DRAWPSI(nobs,nv,np,INFOS,Z,psiprior,psi0,psi) - ENDIF - DO it = 1,nt - IF (thetaprior(it,3).LT.thetaprior(it,4)) THEN - CALL SLICE(it,nobs,d,ny,nz,nx,nu,ns,nt,S, - 1 yk(1:nobs,:),IYK(1:nobs,:),theta0, - 2 thetaprior(it,:),pdftheta(it),pdll, - 3 NEVAL(it),theta(it)) - theta0(it) = theta(it) - ENDIF - END DO - CUMN = CUMN + NEVAL - IF (jjj/IND*IND.EQ.jjj) THEN - IMIN = MINLOC(CUMN(INDT(1:ntf))) - IMIN(1) = CUMN(INDT(IMIN(1))) !CUMN(IMIN(1)) - IMAX = MAXLOC(CUMN(INDT(1:ntf))) - IMAX(1) = CUMN(INDT(IMAX(1))) !CUMN(IMAX(1)) - CALL system('cls') - WRITE(6,1113) jjj,ntf,IMIN(1)/dfloat(jjj), - # IMAX(1)/dfloat(jjj) - ENDIF - ENDDO - ELSE ! NO MISSING - DO jjj = 1,burnin - IF (nv.GT.0) THEN - CALL GCK2(nobs,d,ny,nz,nx,nu,nv,ns,nstot,nt,np(1), - 1 yk(1:nobs,:),theta0,psi0,INFOS,pdll,Z,S) - IF (HBL.GT.1) THEN - CALL RECPR(jjj,nstot,nobs,Z,ZW,PM,PTR) - ENDIF - CALL DRAWPSI(nobs,nv,np,INFOS,Z,psiprior,psi0,psi) - ENDIF - DO it = 1,nt - IF (thetaprior(it,3).LT.thetaprior(it,4)) THEN - CALL SLICE2(it,nobs,d,ny,nz,nx,nu,ns,nt,S,yk(1:nobs,:), - 1 theta0,thetaprior(it,:),pdftheta(it),pdll, - 2 NEVAL(it),theta(it)) - theta0(it) = theta(it) - ENDIF - END DO - CUMN = CUMN + NEVAL - IF (jjj/IND*IND.EQ.jjj) THEN - IMIN = MINLOC(CUMN(INDT(1:ntf))) - IMIN(1) = CUMN(INDT(IMIN(1))) !CUMN(IMIN(1)) - IMAX = MAXLOC(CUMN(INDT(1:ntf))) - IMAX(1) = CUMN(INDT(IMAX(1))) !CUMN(IMAX(1)) - CALL system('cls') - WRITE(6,1113) jjj,ntf,IMIN(1)/dfloat(jjj), - # IMAX(1)/dfloat(jjj) - ENDIF - ENDDO - ENDIF - lastl = IMIN(1)/DFLOAT(burnin) - lasth = IMAX(1)/DFLOAT(burnin) - CUMN(1:nt) = 0 - NEVAL(:) = 0 - -C OPEN OUTPUT FILES -C 9 '.PAR', 10 '.UNB', 11 '.DIS', 12 '.INN', 13 '.FST', 14 '.MIS', 15 '.ML' o '.DAT' - CALL OPENFILES(estimation,seed,nv,nf,nmis*INDMIS,datasim,Marglik, - 1 PATH,NMLNAME) - -C MCMC RECORDING phase - ALLOCATE(INN(nobs,ny)) - IF (nf.GT.0) THEN - ALLOCATE(FORE(nf,ny+nx+1)) - ENDIF - IF (indmis*NMIS.GE.1) THEN - ALLOCATE(ykmis(nmis)) - ENDIF - IF ((MargLik.EQ.'Y').OR.(MargLik.EQ.'y')) THEN - ALLOCATE(gibtheta(GGG,nt+np(1)),gibZ(GGG,nobs),MLHM(11,2), - 1 MLMW(2,2)) - ENDIF - IF (nmis.GT.0) THEN ! MISSINGS - DO jjj = 1,GGG*thin - IF (nv.GT.0) THEN - IF (HBL.EQ.1) THEN - CALL GCK(nobs,d,ny,nz,nx,nu,nv,ns,nstot,nt,np(1), - 1 yk(1:nobs,:),IYK(1:nobs,:),theta0,psi0, - 2 INFOS,pdll,Z,S) - ELSE - CALL AMH(HBL,nobs,d,ny,nz,nx,nu,nv,ns,nstot,nt,np(1), - 1 yk(1:nobs,:),IYK(1:nobs,:),theta0,psi0, - 2 PTR,PM,INFOS,pdll,Z,S,ACCRATE) - CALL RECPR(jjj+burnin,nstot,nobs,Z,ZW,PM,PTR) - ENDIF - CALL DRAWPSI(nobs,nv,np,INFOS,Z,psiprior,psi0,psi) - ENDIF - DO it = 1,nt - IF (thetaprior(it,3).LT.thetaprior(it,4)) THEN - CALL SLICE(it,nobs,d,ny,nz,nx,nu,ns,nt,S,yk(1:nobs,:), - 1 IYK(1:nobs,:),theta0,thetaprior(it,:), - 2 pdftheta(it),pdll,NEVAL(it),theta(it)) - theta0(it) = theta(it) - ENDIF - END DO - CUMN = CUMN+NEVAL - CALL SIMSTATE(nobs,d,ny,nz,nx,nu,ns,nt,yk(1:nobs,:), - 1 IYK(1:nobs,:),theta,S,pdll,STATE) - CALL INNOV(nobs,d,ny,nz,nx,nu,ns,nt,S, - 1 yk(1:nobs,:),IYK(1:nobs,:),theta,pdll,INN) - IF (nf.GT.0) THEN - CALL FORECAST(yk(nobs+1:nobs+nf,ny+1:ny+nz),nf,ny,nz,nx,nu,nv, - 1 ns,nstot,nt,np,theta,psi,INFOS,Z(nobs), - 2 STATE(nobs,:),pdll,FORE) - ENDIF - IF (INDMIS*nmis.GE.1) THEN - J = 1 - DO I = 1,nobs - IF (IYK(I,ny+1).LT.ny) THEN - K = ny-IYK(I,ny+1) - CALL MISSING(yk(I,:),ny,nz,nx,nu,ns,nt,K,theta, - 1 S(I,1:6),STATE(I,:),pdll,ykmis(J:J+K-1)) - J = J+K - ENDIF - ENDDO - ENDIF - IF (jjj/IND*IND.EQ.jjj) THEN - IMIN = MINLOC(CUMN(INDT(L1+1:ntf))) - IMIN(1) = CUMN(INDT(L1+IMIN(1))) - IMAX = MAXLOC(CUMN(INDT(L1+1:ntf))) - IMAX(1) = CUMN(INDT(L1+IMAX(1))) - CALL system('cls') - WRITE(6,1113) BURNIN,ntf,lastl,lasth - IF ((HBL.EQ.1).OR.(nv.EQ.0)) THEN - WRITE(6,1114) jjj,ntf,IMIN(1)/dfloat(jjj), - # IMAX(1)/dfloat(jjj) - ELSEIF ((HBL.GT.1).AND.(nv.GT.0)) THEN - WRITE(6,1115) jjj,ntf,IMIN(1)/dfloat(jjj), - # IMAX(1)/dfloat(jjj), - # SUM(1.D0-ACCRATE(1:nobs)/DFLOAT(jjj))/DFLOAT(nobs) - ENDIF - ENDIF - IF (jjj/thin*thin.EQ.jjj) THEN - WRITE(12,'(<nobs*ny>(F20.10))') (INN(1:nobs,I),I=1,ny) - WRITE(10,'(<nobs*nx>(F20.10))') (STATE(1:nobs,I),I=1,nx) - IF ((MargLik.EQ.'Y').OR.(MargLik.EQ.'y')) THEN - gibtheta(jjj/thin,1:nt) = theta(1:nt) - ENDIF - IF (nv.EQ.0) THEN - WRITE(9,'(<nt>(F25.15))') theta(1:nt) - ELSE - IF ((MargLik.EQ.'Y').OR.(MargLik.EQ.'y')) THEN - gibtheta(jjj/thin,nt+1:nt+np(1)) = psi(1:np(1)) - gibZ(jjj/thin,1:nobs) = Z(1:nobs) - ENDIF - WRITE(9,'(<nt+np(1)>(F25.15))') theta(1:nt),psi(1:np(1)) - WRITE(11,'(<nobs>(I3))') Z(:) - ENDIF - IF (nf.GT.0) THEN - J = min(nv,1) - WRITE(13,'(<nf*(nx+ny+J)>(F20.10))') (FORE(1:nf,I),I=1,nx+ny+J) - ENDIF - IF (INDMIS*nmis.GE.1) WRITE(14,'(<nmis>(F20.10))') ykmis(1:nmis) - ENDIF - ENDDO - ELSE ! NO MISSINGS - DO jjj = 1,GGG*thin - IF (nv.GT.0) THEN - IF (HBL.EQ.1) THEN - CALL GCK2(nobs,d,ny,nz,nx,nu,nv,ns,nstot,nt,np(1), - 1 yk(1:nobs,:),theta0,psi0,INFOS,pdll,Z,S) - ELSE - CALL AMH2(hbl,nobs,d,ny,nz,nx,nu,nv,ns,nstot,nt,np(1), - 1 yk(1:nobs,:),theta0,psi0, - 2 PTR,PM,INFOS,pdll,Z,S,ACCRATE) - CALL RECPR(jjj+burnin,nstot,nobs,Z,ZW,PM,PTR) - ENDIF - CALL DRAWPSI(nobs,nv,np,INFOS,Z,psiprior,psi0,psi) - ENDIF - DO it = 1,nt - IF (thetaprior(it,3).LT.thetaprior(it,4)) THEN - CALL SLICE2(it,nobs,d,ny,nz,nx,nu,ns,nt,S,yk(1:nobs,:), - 1 theta0,thetaprior(it,:),pdftheta(it),pdll, - 2 NEVAL(it),theta(it)) - theta0(it) = theta(it) - ENDIF - END DO - CUMN = CUMN+NEVAL - CALL SIMSTATE2(nobs,d,ny,nz,nx,nu,ns,nt,yk(1:nobs,:), - 1 theta,S,pdll,STATE) - CALL INNOV2(nobs,d,ny,nz,nx,nu,ns,nt,S, - 1 yk(1:nobs,:),theta,pdll,INN) - IF (nf.GT.0) THEN - CALL FORECAST(yk(nobs+1:nobs+nf,ny+1:ny+nz),nf,ny,nz,nx,nu,nv, - 1 ns,nstot,nt,np,theta,psi,INFOS,Z(nobs), - 2 STATE(nobs,:),pdll,FORE) - ENDIF - IF (jjj/IND*IND.EQ.jjj) THEN - IMIN = MINLOC(CUMN(INDT(L1+1:ntf))) - IMIN(1) = CUMN(INDT(L1+IMIN(1))) - IMAX = MAXLOC(CUMN(INDT(L1+1:ntf))) - IMAX(1) = CUMN(INDT(L1+IMAX(1))) - CALL system('cls') - WRITE(6,1113) BURNIN,ntf,lastl,lasth - IF ((HBL.EQ.1).OR.(nv.EQ.0)) THEN - WRITE(6,1114) jjj,ntf,IMIN(1)/dfloat(jjj), - # IMAX(1)/dfloat(jjj) - ELSEIF ((HBL.GT.1).AND.(nv.GT.0)) THEN - WRITE(6,1115) jjj,ntf,IMIN(1)/dfloat(jjj), - # IMAX(1)/dfloat(jjj), - # SUM(1.D0-ACCRATE(1:nobs)/DFLOAT(jjj))/DFLOAT(nobs) - ENDIF - ENDIF - IF (jjj/thin*thin.EQ.jjj) THEN - IF ((MargLik.EQ.'Y').OR.(MargLik.EQ.'y')) THEN - gibtheta(jjj/thin,1:nt) = theta(1:nt) - ENDIF - WRITE(12,'(<nobs*ny>(F20.10))') (INN(1:nobs,I),I=1,ny) - WRITE(10,'(<nobs*nx>(F20.10))') (STATE(1:nobs,I),I=1,nx) - IF (nv.EQ.0) THEN - WRITE(9,'(<nt>(F25.15))') theta(1:nt) - ELSE - IF ((MargLik.EQ.'Y').OR.(MargLik.EQ.'y')) THEN - gibtheta(jjj/thin,nt+1:nt+np(1)) = psi(1:np(1)) - gibZ(jjj/thin,1:nobs) = Z(1:nobs) - ENDIF - WRITE(9,'(<nt+np(1)>(F25.15))') theta(1:nt),psi(1:np(1)) - WRITE(11,'(<nobs>(I3))') Z(:) - ENDIF - IF (nf.GT.0) THEN - J = min(nv,1) - WRITE(13,'(<nf*(nx+ny+J)>(F20.10))') (FORE(1:nf,I),I=1,nx+ny+J) - ENDIF - ENDIF - ENDDO - ENDIF - CLOSE(9) - CLOSE(10) - IF (nv.GT.0) CLOSE(11) - CLOSE(12) - IF (nf.GT.0) CLOSE(13) - IF (indmis*nmis.GE.1) THEN - CLOSE(14) - DEALLOCATE(ykmis) - ENDIF - DEALLOCATE(INN) - IF ((nv.GT.0).AND.(HBL.GT.1)) THEN - DEALLOCATE(PTR,PM,ACCRATE) - ENDIF - -C MARGINAL LIKELIHOOD - IF ((MargLik.EQ.'Y').OR.(MargLik.EQ.'y')) THEN - WRITE(*,*) ' ' - WRITE(*,*) 'Computing the marginal likelihood. Please wait ...' - IF (nmis.GT.0) THEN - CALL HARMONIC(GGG,nobs,d,ny,nz,nx,nu,nv,ns,nstot,nt,np, - 1 INFOS,yk(1:nobs,:),IYK(1:nobs,:),gibtheta,gibZ, - 2 thetaprior,psiprior,pdftheta,pdll,MLHM) - WRITE(*,*) 'Modified harmonic mean: done!' - CALL MENGWONG(GGG,nobs,d,ny,nz,nx,nu,nv,ns,nstot,nt,np, - 1 INFOS,yk(1:nobs,:),IYK(1:nobs,:),gibtheta,gibZ, - 2 thetaprior,psiprior,pdftheta,pdll,MLHM(5,1),MLMW) - WRITE(*,*) 'Bridge sampling: done!' - WRITE(*,*) ' ' - ELSE - CALL HARMONIC2(GGG,nobs,d,ny,nz,nx,nu,nv,ns,nstot,nt,np, - 1 INFOS,yk(1:nobs,:),gibtheta,gibZ,thetaprior, - 2 psiprior,pdftheta,pdll,MLHM) - WRITE(*,*) 'Modified harmonic mean: done!' - CALL MENGWONG2(GGG,nobs,d,ny,nz,nx,nu,nv,ns,nstot,nt,np, - 1 INFOS,yk(1:nobs,:),gibtheta,gibZ,thetaprior, - 2 psiprior,pdftheta,pdll,MLHM(5,1),MLMW) - WRITE(*,*) 'Bridge sampling: done!' - WRITE(*,*) ' ' - ENDIF - WRITE(15,*) 'Modified Harmonic mean (ML and Var)' - WRITE(15,'(<2>(F20.10))') (MLHM(I,:),I=1,11) - WRITE(15,*) 'Bridge Sampling' - WRITE(15,'(<2>(F20.10))') (MLMW(I,:),I=1,2) - CLOSE(15) - DEALLOCATE(gibtheta,gibZ,MLHM,MLMW) - ENDIF - -7777 DEALLOCATE(yk,STATE,Z,S,theta0,theta,thetaprior,pdftheta,NEVAL, - 1 CUMN,IYK,INDT) - IF (nv.GT.0) THEN - DEALLOCATE(psi0,psi,psiprior,ZW) - ENDIF - - STATUS = freelibrary(pdll) !libero la DLL dalla memoria alla fine del programma - IF (TRIM(PATH).EQ.'') THEN - STATUS = getcwd(PATH) ! get current directory - ENDIF - - CALL DATE_AND_TIME(REAL_CLOCK(1),REAL_CLOCK(2),REAL_CLOCK(3), - 1 DATE_ITIME) - IT2(1:3) = DATE_ITIME(1:3) - IT2(4:7) = DATE_ITIME(5:8) - IT=(IT2(4)-IT1(4))*3600+(IT2(5)-IT1(5))*60+(IT2(6)-IT1(6)) - IF ((check.EQ.'Y').OR.(check.EQ.'y')) THEN - WRITE(6,1117) TRIM(PATH) - ELSE - IF ((datasim.EQ.'Y').OR.(datasim.EQ.'y')) THEN - WRITE(6,1118) TRIM(PATH) - ELSE - IF ((estimation.EQ.'ML').OR.(estimation.EQ.'ml').OR. - & (estimation.EQ.'Ml').OR.(estimation.EQ.'mL')) THEN - WRITE(6,1119) IT,TRIM(PATH) - ELSE - WRITE(6,1116) IT,TRIM(PATH) - ENDIF - ENDIF - ENDIF - DEALLOCATE(np,ns,INFOS,IT1,IT2,DATE_ITIME,REAL_CLOCK) - -1111 FORMAT((<4>(F25.12)), ' ',A2) -1112 FORMAT(I10,(<np(3)>(F25.12)), ' ',I2) -1113 FORMAT(/,' Burn-in draws = ',I8, - # /,' Parameters sampled by SLICE ',I5, - # /,' SLICE likelihood eval. Min/Max = ',F6.2, ' / ',F6.2) -1114 FORMAT(/,' Recording draws = ',I8, - # /,' Parameters sampled by SLICE ',I5, - # /,' SLICE likelihood eval. Min/Max = ',F6.2, ' / ',F6.2) -1115 FORMAT(/,' Recording draws = ',I8, - # /,' Parameters sampled by SLICE ',I5, - # /,' SLICE likelihood eval. Min/Max = ',F6.2, ' / ',F6.2, - # /,' Adaptive MH accettance rate = ',F6.2) -1116 FORMAT(/,' MCMC completed', - # /,' CPU-time (sec)=', I10, - # /,' Output printed in ',A) -1117 FORMAT(/,' Check completed', - # /,' Output printed in ',A) -1118 FORMAT(/,' Data simulation completed', - # /,' Output printed in 'A) -1119 FORMAT(/,' Maximum Likelihood completed', - # /,' CPU-time (sec)=', I10, - # /,' Output printed in ',A) - - PAUSE - STOP +C along with DMM. If not, see <http://www.gnu.org/licenses/>. +C -------------------------------------------------------------------------------------- + PROGRAM DMM + USE dfwin +C DECLARE an "interface block" to the .DLL that contains DESIGN + + INTERFACE + SUBROUTINE DESIGN(ny,nz,nx,nu,ns,nt,theta,c,H,G,a,F,R) + INTEGER ny,nz,nx,nu,ns(6),nt + DOUBLE PRECISION theta(nt) + DOUBLE PRECISION c(ny,max(1,nz),ns(1)),H(ny,nx,ns(2)), + 1 G(ny,nu,ns(3)),a(nx,ns(4)),F(nx,nx,ns(5)),R(nx,nu,ns(6)) + END SUBROUTINE + END INTERFACE + CHARACTER*1 fittizia + POINTER (pdll,fittizia) ! ASSOCIATE pointer pdll alla DLL ad una varibile fittizia + POINTER (pdesign,DESIGN) +C DECLARE an "interface block" to the .DLL that contains SETFILEM + INTERFACE + SUBROUTINE SETFILEM(mfile,pathmfile) + CHARACTER*200 mfile,pathmfile + END SUBROUTINE + END INTERFACE + POINTER (psetfilem,SETFILEM) +C DECLARE an "interface block" to the .DLL that contains GETERRSTR + INTERFACE + SUBROUTINE GETERRSTR(matlaberror) + CHARACTER*1024 matlaberror + END SUBROUTINE + END INTERFACE + POINTER (pgeterrstr,GETERRSTR) + + LOGICAL status + CHARACTER*200 DLLNAME ! name of the DLL (defined by the user) + +C NAMELIST DECLARATIONS + INTEGER ny,nz,nx,nu,d(2),nv,nt,nf,nobs + INTEGER seed,thin,burnin,GGG,HBL + CHARACTER*1 MargLik,datasim,check + CHARACTER*2 thetasampler,estimation + CHARACTER*3 Ssampler + DOUBLE PRECISION, ALLOCATABLE:: hypS(:,:,:),hyptheta(:,:), + 1 obs(:) + CHARACTER(2), ALLOCATABLE:: pdftheta(:) +C LOCALS + INTEGER, ALLOCATABLE:: Z(:),ZW(:),S(:,:),NEVAL(:), + 1 CUMN(:),IYK(:,:),INDT(:),ACCRATE(:),gibZ(:,:), + 1 IT1(:),IT2(:),DATE_ITIME(:),np(:),ns(:),INFOS(:,:) + DOUBLE PRECISION, ALLOCATABLE:: yk(:,:),STATE(:,:),theta(:), + 1 theta0(:),thetaprior(:,:),psi(:),psi0(:),psiprior(:,:), + 2 INN(:,:),FORE(:,:),ykmis(:),PTR(:,:,:),PM(:,:), + 3 gibtheta(:,:),MLHM(:,:),MLMW(:,:),thetase(:),AKMSE(:,:),HESS(:), + 4 psise(:),SSMOOTH(:,:) + DOUBLE PRECISION,ALLOCATABLE::c(:,:,:),H(:,:,:), + 1 G(:,:,:),a(:,:),F(:,:,:),R(:,:,:) + CHARACTER(12), ALLOCATABLE:: REAL_CLOCK(:) + INTEGER ntf,nstot,nmis,indmis,IT,I,J,K,L1,jjj,IND,IFAIL,IMAX(1), + 1 IMIN(1),IMSVAR + DOUBLE PRECISION AUX,lastl,lasth + CHARACTER*1 DEB + CHARACTER*3 DLLEXT + CHARACTER*200 mfile,pathmfile + CHARACTER*200 FILEIN,NMLNAME,PATH,FILEOUT,DMMTITLE,CURDIR + CHARACTER*1024 matlaberror + +C EXTERNAL SUBROUTINES + EXTERNAL GETARG +C EXTERNAL FUNCTIONS + DOUBLE PRECISION genbet + +C TIME + ALLOCATE(np(3),ns(6),INFOS(9,6),IT1(7),IT2(7),DATE_ITIME(8), + 1 REAL_CLOCK(3)) + CALL DATE_AND_TIME(REAL_CLOCK(1),REAL_CLOCK(2),REAL_CLOCK(3), + 1 DATE_ITIME) + IT1(1:3) = DATE_ITIME(1:3) + IT1(4:7) = DATE_ITIME(5:8) + +C GET the namelist specified by FILEIN + DEB = 'D' + IF (DEB.EQ.'R') THEN + CALL GETARG(1,FILEIN) ! load name of input file + ELSE + FILEIN = 'H:\AROSSI\DMM\NILE\nile.nml' +C FILEIN = 'H:\arossi\dmm\tfpf\tfpf_es.nml' + ENDIF + +C CHECK FILEIN + IF (TRIM(FILEIN).EQ.'') THEN + TYPE *, ' ' + TYPE *, ' No input file provided' + TYPE *, ' Program aborting' + PAUSE + STOP + ENDIF + +C LOAD input from FILEIN + ALLOCATE(obs(30000),hyptheta(4,200),hypS(50,50,6),pdftheta(200)) + CALL input(FILEIN,NMLNAME,PATH, + 1 ny,nz,nx,nu,d,nv,ns,nstot,np,nf,INFOS, + 2 seed,thin,burnin,GGG,thetasampler,datasim,DLLNAME,check, + 3 estimation,nt,pdftheta,hyptheta,hypS,nobs,obs, + 4 Ssampler,HBL,MargLik) + +C CHECK DLL NAME AND FIND FILE EXTENSION (.dll or .m) + J = SCAN(DLLNAME,'\', BACK = .TRUE.) + I = SCAN(DLLNAME,'.', BACK = .TRUE.) + DLLEXT = DLLNAME(I+1:I+3) + IF ((DLLEXT.EQ.'M ').OR.(DLLEXT.EQ.'m ')) THEN + mfile = DLLNAME(J+1:I-1) + pathmfile = DLLNAME(1:J-1) + DLLNAME = 'H:\arossi\dmm64\matlabdll\debug\matlabdll.dll' ! provvisorio + IND = GETCWD(CURDIR) ! current directory +C DLLNAME = TRIM(CURDIR) // '\matlabdll.dll' ! definitivo + ENDIF + +C FIND the DLL and LOAD it into the memory + pdll = loadlibrary(DLLNAME) + IF (pdll.EQ.0) THEN + TYPE *, ' ' + TYPE *, TRIM(DLLNAME) // ' cannot be found or opened' + TYPE *, ' Program aborting' + PAUSE + STOP + ENDIF + +C SET UP the pointer to the DLL function + pdesign = getprocaddress(pdll, "design_"C) + IF (pdesign.EQ.0) THEN + TYPE *, ' ' + TYPE *, ' Sub DESIGN cannot be found into '// DLLNAME + TYPE *, ' Program aborting' + PAUSE + STOP + ENDIF + +C CHECK the MatLab file if needed + IF ((DLLEXT.EQ.'M ').OR.(DLLEXT.EQ.'m ')) THEN +C SET UP the pointer to the DLL function + psetfilem = getprocaddress(pdll, "setfilem_"C) + IF (psetfilem.EQ.0) THEN + TYPE *, ' ' + TYPE *, ' Sub SETFILEM cannot be found into '// DLLNAME + TYPE *, ' Program aborting' + PAUSE + STOP + ENDIF + +C SET UP the pointer to the DLL function + pgeterrstr = getprocaddress(pdll, "geterrstr_"C) + IF (pgeterrstr.EQ.0) THEN + TYPE *, ' ' + TYPE *, ' Sub GETERRSTR cannot be found into '// DLLNAME + TYPE *, ' Program aborting' + PAUSE + STOP + ENDIF + +C Assign the name of the matlab file + ALLOCATE( c(ny,max(nz,1),ns(1)),H(ny,nx,ns(2)), + 1 G(ny,nu,ns(3)),a(nx,ns(4)),F(nx,nx,ns(5)),R(nx,nu,ns(6)), + 1 theta(nt)) + CALL SETFILEM(mfile,pathmfile) ! ONLY THE FIRST TIME + theta(:) = 1.D0 + CALL DESIGN(ny,nz,nx,nu,ns,nt,theta,c,H,G,a,F,R) + DEALLOCATE(c,H,G,a,F,R,theta) + IF (ny.EQ.0) THEN + TYPE *, ' ' + TYPE *, ' Can''t start MATLAB engine' + TYPE *, ' Program aborting' + PAUSE + STOP + ELSEIF (ny.EQ.-1) THEN + TYPE *, ' ' + TYPE *, ' Can''t read ny in the MATLAB file' + TYPE *, ' Program aborting' + PAUSE + STOP + ELSEIF (ny.EQ.-2) THEN + TYPE *, ' ' + TYPE *, ' Can''t read nz in the MATLAB file' + TYPE *, ' Program aborting' + PAUSE + STOP + ELSEIF (ny.EQ.-3) THEN + TYPE *, ' ' + TYPE *, ' Can''t read nx in the MATLAB file' + TYPE *, ' Program aborting' + PAUSE + STOP + ELSEIF (ny.EQ.-4) THEN + TYPE *, ' ' + TYPE *, ' Can''t read nu in the MATLAB file' + TYPE *, ' Program aborting' + PAUSE + STOP + ELSEIF (ny.EQ.-5) THEN + TYPE *, ' ' + TYPE *, ' Can''t read ns in the MATLAB file' + TYPE *, ' Program aborting' + PAUSE + STOP + ELSEIF (ny.EQ.-6) THEN + TYPE *, ' ' + TYPE *, ' Can''t read nt in the MATLAB file' + TYPE *, ' Program aborting' + PAUSE + STOP + ELSEIF (ny.EQ.-7) THEN + TYPE *, ' ' + TYPE *, ' Can''t find or open the MatLab function' + TYPE *, ' Program aborting' + PAUSE + STOP + ELSEIF (ny.EQ.-8) THEN + CALL GETERRSTR(matlaberror) + TYPE *, ' ' + TYPE *, ' the MATLAB funtion can not be executed:' + TYPE *, trim(matlaberror) + TYPE *, ' Program aborting' + PAUSE + STOP + ELSEIF (ny.LT.-100) THEN + TYPE *, ' ' + TYPE *, ' One of the output canot be assigned during the call ' + TYPE *, ' ' // trim(DLLNAME) + TYPE *, ' Program aborting' + PAUSE + STOP + ENDIF + ENDIF + +C SET SHELL title + DMMTITLE = 'title DMM input:' // TRIM(PATH) // TRIM(NMLNAME) + # // '.nml' // ' - ' // TRIM(DLLNAME) + CALL system(DMMTITLE) + +C INITIALISE THE RANDOM NUMBER GENERATOR + CALL INITRAND(SEED,DATE_ITIME) + +C ASSIGN DATA and MISSING VALUES + ALLOCATE(yk(nobs+nf,ny+nz),IYK(nobs,ny+1)) + K = 0 + DO 10 I = 1,nobs+nf + DO 10 J = 1,ny+nz + K = K+1 +10 yk(I,J) = obs(K) + + IYK(:,:) = 0 + INDMIS = 1 + DO 11 I = 1,nobs + K = 0 + DO 11 J = 1,ny + IF(yk(I,J).NE.-99999.D0) THEN + K = K+1 + IYK(I,K) = J + ELSE + DO JJJ=1,nz + IF (yk(I,ny+JJJ).EQ.-99999.D0)indmis=0 + END DO + ENDIF +11 IYK(I,ny+1) = K + nmis = ny*nobs-SUM(IYK(1:nobs,ny+1)) + DEALLOCATE(obs) + +C Allocate and Assign S + ALLOCATE(S(nobs,6),Z(nobs)) + S(1:nobs,1:6) = 1 + +C ASSIGN THETA-PRIORS + ALLOCATE(thetaprior(nt,4)) + DO 30 I = 1,nt +30 thetaprior(I,1:4) = hyptheta(1:4,I) + DEALLOCATE(hyptheta) + +C ASSIGN PSI hyperparameters (# ind. Dirichelet x max # hyp) + IF (nv.GT.0) THEN + ALLOCATE(psiprior(np(2),np(3))) + K = 0 + DO I = 1,nv + IF (INFOS(9,I).EQ.1) THEN ! S~iid + psiprior(K+1,1:INFOS(8,I)) = hypS(1:INFOS(8,I),1,I) + K = K+1 + ELSEIF (INFOS(9,I).EQ.2) THEN ! S~Markov + DO J = 1,INFOS(8,I) + psiprior(K+J,1:INFOS(8,I)) = hypS(1:INFOS(8,I),J,I) + ENDDO + K = K+INFOS(8,I) + ENDIF + END DO + ENDIF + DEALLOCATE(hypS) + +C THETA STARTING VALUES & TRACK FREE PARAMETERS + ALLOCATE(theta0(nt),theta(nt),INDT(nt+2)) + CALL SIMPRIOR(estimation,nt,thetaprior,pdftheta(1:nt),ntf,INDT, + 1 theta0) + theta(1:nt) = theta0(1:nt) + +C PSI STARTING VALUES + IF (nv.GT.0) THEN + ALLOCATE(psi0(np(1)),psi(np(1)),ZW(2*nobs)) + ENDIF + K = 0 + DO 80 J=1,nv + IF (INFOS(9,J).EQ.1) THEN ! S-IID + DO jjj = 1,INFOS(8,J)-1 + psi0(K+jjj) = genbet(1.D0,1.D0) + ENDDO + AUX = genbet(1.D0,1.D0) +c CALL G05FEF(1.D0,1.D0,INFOS(8,J)-1,psi0(K+1:K+INFOS(8,J)-1), +c 1 IFAIL) ! beta +c CALL G05FEF(1.D0,1.D0,1,AUX,IFAIL) + + psi0(K+1:K+INFOS(8,J)-1) = psi0(K+1:K+INFOS(8,J)-1)/ + # (SUM(psi0(K+1:K+INFOS(8,J)-1))+AUX) + K = K + INFOS(8,J)-1 + ELSE IF (INFOS(9,J).EQ.2) THEN ! S-MARKOV + DO I = 1,INFOS(8,J) +c CALL G05FEF(1.D0,1.D0,INFOS(8,J)-1,psi0(K+1:K+INFOS(8,J)-1), +c 1 IFAIL) +c CALL G05FEF(1.D0,1.D0,1,AUX,IFAIL) + DO jjj = 1,INFOS(8,J)-1 + psi0(K+jjj) = genbet(1.D0,1.D0) + ENDDO + AUX = genbet(1.D0,1.D0) + psi0(K+1:K+INFOS(8,J)-1) = psi0(K+1:K+INFOS(8,J)-1)/ + # (SUM(psi0(K+1:K+INFOS(8,J)-1))+AUX) + K = K + INFOS(8,J)-1 + ENDDO +80 ENDIF + +C WRITE HYPERPARAMTERS for THETA and PSI plus DATA + FILEOUT = TRIM(PATH)//TRIM(NMLNAME)//'.PRI' + OPEN(10,FILE = FILEOUT, ACCESS='SEQUENTIAL') + WRITE(10,'(<11+nv>(I6))') nt,np(1:3),nf,nz,seed,nx,ny,nobs, + 1 nv,INFOS(8,1:nv) + WRITE(10,'(A2)') estimation + DO I =1,nt + WRITE(10,1111) thetaprior(I,1:4),pdftheta(I) + END DO + K = 0 + DO I = 1,nv + IF (INFOS(9,I).EQ.1) THEN + WRITE(10,1112) INFOS(8,I),psiprior(K+1,:),INFOS(9,I) + K = K+1 + ELSEIF (INFOS(9,I).EQ.2) THEN + DO J = 1,INFOS(8,I) + WRITE(10,1112) INFOS(8,I),psiprior(K+1,:),INFOS(9,I) + K = K + 1 + END DO + ENDIF + END DO + DO I =1,nobs+nf + WRITE(10,'(<ny+nz>(F20.10))') yk(I,1:ny+nz) + END DO + CLOSE(10) + + ALLOCATE(STATE(nobs,nx),NEVAL(nt),CUMN(nt)) + +C CHECK DESIGN.dll + IF ((check.EQ.'Y').OR.(check.EQ.'y')) THEN + CALL CHECKDESIGN(ny,nz,nx,nu,ns,nt,d,theta0,pdll,PATH,NMLNAME) + GOTO 7777 + ENDIF + +C SIMULATION of DATA and UNOBSERVABLES + IF ((datasim.EQ.'Y').OR.(datasim.EQ.'y')) THEN + CALL OPENFILES(ESTIMATION,SEED,NV,0,0,datasim,MARGLIK, + 1 PATH,NMLNAME) + CALL SIMDATA(nobs,d,ny,nz,nx,nu,ns,nstot,nt,nv,np,INFOS,pdll, + 2 theta0,psi0,Z,STATE,yk) + IF (nv.EQ.0) THEN + WRITE(9,'((F25.15))') theta0(1:nt) + ELSE + WRITE(9,'((F25.15))') theta0(1:nt),psi0(1:np(1)) + WRITE(11,'(<1>(I3))') Z(:) + ENDIF + WRITE(10,'(<nx>(F20.10))') (STATE(I,1:nx),I=1,nobs) + WRITE(15,'(<ny>(F20.10))') (yk(I,1:ny),I=1,nobs) + CLOSE(9) + CLOSE(10) + CLOSE(11) + CLOSE(15) + GOTO 7777 + ENDIF + +C MAXIMUM LIKELIHOOD ESTIMATION + IF ((estimation.EQ.'ML').OR.(estimation.EQ.'ml').OR. + & (estimation.EQ.'Ml').OR.(estimation.EQ.'mL')) THEN + TYPE *, ' ' + TYPE *, ' Maximum Likelihood inference not allowed ' + TYPE *, ' Program aborting' + PAUSE + STOP + CALL OPENFILES(estimation,seed,nv,nf,0,datasim,marglik, + 1 path,nmlname) + ALLOCATE(HESS((nt+np(1))*(nt+np(1)+1)/2)) +c CALL ML(nobs,d,ny,nz,nx,nu,nt,nv,ns,np(1),INFOS,pdll,INDT,yk,IYK,S, +c 1 thetaprior,theta0,psi0,IMSVAR,HESS,AUX) + ALLOCATE(THETASE(nt),AKMSE(nobs,nx),INN(nobs,ny)) + IF (nv.EQ.0) THEN + CALL OPG(nobs,d,ny,nz,nx,nu,nt,ns,pdll,yk,IYK,S, + 1 theta0,thetaprior,HESS,thetase,STATE,AKMSE,INN,IFAIL) + WRITE(9,'(<2>(F25.15))') (theta0(I),thetase(I),I=1,nt) + WRITE(9,'(<2>(F25.15))') AUX,IFAIL + WRITE(10,'(<nx>(F20.10))') (STATE(I,1:nx),I=1,nobs) + WRITE(10,'(<nx>(F20.10))') (AKMSE(I,1:nx),I=1,nobs) + WRITE(12,'(<ny>(F20.10))') (INN(I,1:ny),I=1,nobs) + ELSE + ALLOCATE(psise(np(1)),SSMOOTH(nobs,nstot)) + IF(IMSVAR.EQ.1)THEN + CALL OPGH(nobs,ny,nz,nx,nu,nt,nv,ns,nstot,np(1),pdll,yk,IYK, + 1 INFOS,theta0,psi0,thetaprior,HESS,thetase,psise, + 1 SSMOOTH,INN,IFAIL) + ELSE + CALL OPGKIM(nobs,d,ny,nz,nx,nu,nt,nv,ns,nstot,np(1),pdll, + 1 yk,IYK,INFOS,theta0,psi0,thetaprior,HESS, + 1 thetase,psise,STATE,AKMSE,SSMOOTH,INN,IFAIL) + WRITE(10,'(<nx>(F20.10))') (STATE(I,1:nx),I=1,nobs) + WRITE(10,'(<nx>(F20.10))') (AKMSE(I,1:nx),I=1,nobs) + ENDIF + WRITE(9,'(<2>(F25.15))') (theta0(I),thetase(I),I=1,nt) + WRITE(9,'(<2>(F25.15))') (psi0(I),psise(I),I=1,np(1)) + WRITE(9,'(<2>(F25.15))') AUX,IFAIL + WRITE(11,'(<nstot>(F20.10))') (SSMOOTH(I,1:nstot),I=1,nobs) + WRITE(12,'(<ny>(F20.10))') (INN(I,1:ny),I=1,nobs) + CLOSE(11) + DEALLOCATE(PSISE,SSMOOTH,HESS) + ENDIF + CLOSE(9) + CLOSE(10) + CLOSE(12) + DEALLOCATE(THETASE,AKMSE,INN) + GOTO 7777 + ENDIF + +C MCMC BURN-IN + IF ((nv.GT.0).AND.(HBL.GT.1)) THEN + ALLOCATE(PTR(nobs,nstot,nstot),PM(nobs,nstot),ACCRATE(nobs)) + PM(:,:) = 1.D0/DFLOAT(nstot) + PTR(:,:,:) = 1.D0/DFLOAT(nstot) + ACCRATE(:) = 0 + ENDIF + CUMN(1:nt) = 0 + NEVAL(1:nt)= 0 + IND = 100 + Z(:) = 1 + ZW(:) = 1 + L1 = 0 + IF (nmis.GT.0) THEN ! MISSINGS + DO jjj = 1,burnin + IF (nv.GT.0) THEN + CALL GCK(nobs,d,ny,nz,nx,nu,nv,ns,nstot,nt,np(1), + 1 yk(1:nobs,:),IYK(1:nobs,:),theta0,psi0, + 2 INFOS,pdll,Z,S) + IF (HBL.GT.1) THEN + CALL RECPR(jjj,nstot,nobs,Z,ZW,PM,PTR) + ENDIF + CALL DRAWPSI(nobs,nv,np,INFOS,Z,psiprior,psi0,psi) + ENDIF + DO it = 1,nt + IF (thetaprior(it,3).LT.thetaprior(it,4)) THEN + CALL SLICE(it,nobs,d,ny,nz,nx,nu,ns,nt,S, + 1 yk(1:nobs,:),IYK(1:nobs,:),theta0, + 2 thetaprior(it,:),pdftheta(it),pdll, + 3 NEVAL(it),theta(it)) + theta0(it) = theta(it) + ENDIF + END DO + CUMN = CUMN + NEVAL + IF (jjj/IND*IND.EQ.jjj) THEN + IMIN = MINLOC(CUMN(INDT(1:ntf))) + IMIN(1) = CUMN(INDT(IMIN(1))) !CUMN(IMIN(1)) + IMAX = MAXLOC(CUMN(INDT(1:ntf))) + IMAX(1) = CUMN(INDT(IMAX(1))) !CUMN(IMAX(1)) + CALL system('cls') + WRITE(6,1113) jjj,ntf,IMIN(1)/dfloat(jjj), + # IMAX(1)/dfloat(jjj) + ENDIF + ENDDO + ELSE ! NO MISSING + DO jjj = 1,burnin + IF (nv.GT.0) THEN + CALL GCK2(nobs,d,ny,nz,nx,nu,nv,ns,nstot,nt,np(1), + 1 yk(1:nobs,:),theta0,psi0,INFOS,pdll,Z,S) + IF (HBL.GT.1) THEN + CALL RECPR(jjj,nstot,nobs,Z,ZW,PM,PTR) + ENDIF + CALL DRAWPSI(nobs,nv,np,INFOS,Z,psiprior,psi0,psi) + ENDIF + DO it = 1,nt + IF (thetaprior(it,3).LT.thetaprior(it,4)) THEN + CALL SLICE2(it,nobs,d,ny,nz,nx,nu,ns,nt,S,yk(1:nobs,:), + 1 theta0,thetaprior(it,:),pdftheta(it),pdll, + 2 NEVAL(it),theta(it)) + theta0(it) = theta(it) + ENDIF + END DO + CUMN = CUMN + NEVAL + IF (jjj/IND*IND.EQ.jjj) THEN + IMIN = MINLOC(CUMN(INDT(1:ntf))) + IMIN(1) = CUMN(INDT(IMIN(1))) !CUMN(IMIN(1)) + IMAX = MAXLOC(CUMN(INDT(1:ntf))) + IMAX(1) = CUMN(INDT(IMAX(1))) !CUMN(IMAX(1)) + CALL system('cls') + WRITE(6,1113) jjj,ntf,IMIN(1)/dfloat(jjj), + # IMAX(1)/dfloat(jjj) + ENDIF + ENDDO + ENDIF + lastl = IMIN(1)/DFLOAT(burnin) + lasth = IMAX(1)/DFLOAT(burnin) + CUMN(1:nt) = 0 + NEVAL(:) = 0 + +C OPEN OUTPUT FILES +C 9 '.PAR', 10 '.UNB', 11 '.DIS', 12 '.INN', 13 '.FST', 14 '.MIS', 15 '.ML' o '.DAT' + CALL OPENFILES(estimation,seed,nv,nf,nmis*INDMIS,datasim,Marglik, + 1 PATH,NMLNAME) + +C MCMC RECORDING phase + ALLOCATE(INN(nobs,ny)) + IF (nf.GT.0) THEN + ALLOCATE(FORE(nf,ny+nx+1)) + ENDIF + IF (indmis*NMIS.GE.1) THEN + ALLOCATE(ykmis(nmis)) + ENDIF + IF ((MargLik.EQ.'Y').OR.(MargLik.EQ.'y')) THEN + ALLOCATE(gibtheta(GGG,nt+np(1)),gibZ(GGG,nobs),MLHM(11,2), + 1 MLMW(2,2)) + ENDIF + IF (nmis.GT.0) THEN ! MISSINGS + DO jjj = 1,GGG*thin + IF (nv.GT.0) THEN + IF (HBL.EQ.1) THEN + CALL GCK(nobs,d,ny,nz,nx,nu,nv,ns,nstot,nt,np(1), + 1 yk(1:nobs,:),IYK(1:nobs,:),theta0,psi0, + 2 INFOS,pdll,Z,S) + ELSE + CALL AMH(HBL,nobs,d,ny,nz,nx,nu,nv,ns,nstot,nt,np(1), + 1 yk(1:nobs,:),IYK(1:nobs,:),theta0,psi0, + 2 PTR,PM,INFOS,pdll,Z,S,ACCRATE) + CALL RECPR(jjj+burnin,nstot,nobs,Z,ZW,PM,PTR) + ENDIF + CALL DRAWPSI(nobs,nv,np,INFOS,Z,psiprior,psi0,psi) + ENDIF + DO it = 1,nt + IF (thetaprior(it,3).LT.thetaprior(it,4)) THEN + CALL SLICE(it,nobs,d,ny,nz,nx,nu,ns,nt,S,yk(1:nobs,:), + 1 IYK(1:nobs,:),theta0,thetaprior(it,:), + 2 pdftheta(it),pdll,NEVAL(it),theta(it)) + theta0(it) = theta(it) + ENDIF + END DO + CUMN = CUMN+NEVAL + CALL SIMSTATE(nobs,d,ny,nz,nx,nu,ns,nt,yk(1:nobs,:), + 1 IYK(1:nobs,:),theta,S,pdll,STATE) + CALL INNOV(nobs,d,ny,nz,nx,nu,ns,nt,S, + 1 yk(1:nobs,:),IYK(1:nobs,:),theta,pdll,INN) + IF (nf.GT.0) THEN + CALL FORECAST(yk(nobs+1:nobs+nf,ny+1:ny+nz),nf,ny,nz,nx,nu,nv, + 1 ns,nstot,nt,np,theta,psi,INFOS,Z(nobs), + 2 STATE(nobs,:),pdll,FORE) + ENDIF + IF (INDMIS*nmis.GE.1) THEN + J = 1 + DO I = 1,nobs + IF (IYK(I,ny+1).LT.ny) THEN + K = ny-IYK(I,ny+1) + CALL MISSING(yk(I,:),ny,nz,nx,nu,ns,nt,K,theta, + 1 S(I,1:6),STATE(I,:),pdll,ykmis(J:J+K-1)) + J = J+K + ENDIF + ENDDO + ENDIF + IF (jjj/IND*IND.EQ.jjj) THEN + IMIN = MINLOC(CUMN(INDT(L1+1:ntf))) + IMIN(1) = CUMN(INDT(L1+IMIN(1))) + IMAX = MAXLOC(CUMN(INDT(L1+1:ntf))) + IMAX(1) = CUMN(INDT(L1+IMAX(1))) + CALL system('cls') + WRITE(6,1113) BURNIN,ntf,lastl,lasth + IF ((HBL.EQ.1).OR.(nv.EQ.0)) THEN + WRITE(6,1114) jjj,ntf,IMIN(1)/dfloat(jjj), + # IMAX(1)/dfloat(jjj) + ELSEIF ((HBL.GT.1).AND.(nv.GT.0)) THEN + WRITE(6,1115) jjj,ntf,IMIN(1)/dfloat(jjj), + # IMAX(1)/dfloat(jjj), + # SUM(1.D0-ACCRATE(1:nobs)/DFLOAT(jjj))/DFLOAT(nobs) + ENDIF + ENDIF + IF (jjj/thin*thin.EQ.jjj) THEN + WRITE(12,'(<nobs*ny>(F20.10))') (INN(1:nobs,I),I=1,ny) + WRITE(10,'(<nobs*nx>(F20.10))') (STATE(1:nobs,I),I=1,nx) + IF ((MargLik.EQ.'Y').OR.(MargLik.EQ.'y')) THEN + gibtheta(jjj/thin,1:nt) = theta(1:nt) + ENDIF + IF (nv.EQ.0) THEN + WRITE(9,'(<nt>(F25.15))') theta(1:nt) + ELSE + IF ((MargLik.EQ.'Y').OR.(MargLik.EQ.'y')) THEN + gibtheta(jjj/thin,nt+1:nt+np(1)) = psi(1:np(1)) + gibZ(jjj/thin,1:nobs) = Z(1:nobs) + ENDIF + WRITE(9,'(<nt+np(1)>(F25.15))') theta(1:nt),psi(1:np(1)) + WRITE(11,'(<nobs>(I3))') Z(:) + ENDIF + IF (nf.GT.0) THEN + J = min(nv,1) + WRITE(13,'(<nf*(nx+ny+J)>(F20.10))') (FORE(1:nf,I),I=1,nx+ny+J) + ENDIF + IF (INDMIS*nmis.GE.1) WRITE(14,'(<nmis>(F20.10))') ykmis(1:nmis) + ENDIF + ENDDO + ELSE ! NO MISSINGS + DO jjj = 1,GGG*thin + IF (nv.GT.0) THEN + IF (HBL.EQ.1) THEN + CALL GCK2(nobs,d,ny,nz,nx,nu,nv,ns,nstot,nt,np(1), + 1 yk(1:nobs,:),theta0,psi0,INFOS,pdll,Z,S) + ELSE + CALL AMH2(hbl,nobs,d,ny,nz,nx,nu,nv,ns,nstot,nt,np(1), + 1 yk(1:nobs,:),theta0,psi0, + 2 PTR,PM,INFOS,pdll,Z,S,ACCRATE) + CALL RECPR(jjj+burnin,nstot,nobs,Z,ZW,PM,PTR) + ENDIF + CALL DRAWPSI(nobs,nv,np,INFOS,Z,psiprior,psi0,psi) + ENDIF + DO it = 1,nt + IF (thetaprior(it,3).LT.thetaprior(it,4)) THEN + CALL SLICE2(it,nobs,d,ny,nz,nx,nu,ns,nt,S,yk(1:nobs,:), + 1 theta0,thetaprior(it,:),pdftheta(it),pdll, + 2 NEVAL(it),theta(it)) + theta0(it) = theta(it) + ENDIF + END DO + CUMN = CUMN+NEVAL + CALL SIMSTATE2(nobs,d,ny,nz,nx,nu,ns,nt,yk(1:nobs,:), + 1 theta,S,pdll,STATE) + CALL INNOV2(nobs,d,ny,nz,nx,nu,ns,nt,S, + 1 yk(1:nobs,:),theta,pdll,INN) + IF (nf.GT.0) THEN + CALL FORECAST(yk(nobs+1:nobs+nf,ny+1:ny+nz),nf,ny,nz,nx,nu,nv, + 1 ns,nstot,nt,np,theta,psi,INFOS,Z(nobs), + 2 STATE(nobs,:),pdll,FORE) + ENDIF + IF (jjj/IND*IND.EQ.jjj) THEN + IMIN = MINLOC(CUMN(INDT(L1+1:ntf))) + IMIN(1) = CUMN(INDT(L1+IMIN(1))) + IMAX = MAXLOC(CUMN(INDT(L1+1:ntf))) + IMAX(1) = CUMN(INDT(L1+IMAX(1))) + CALL system('cls') + WRITE(6,1113) BURNIN,ntf,lastl,lasth + IF ((HBL.EQ.1).OR.(nv.EQ.0)) THEN + WRITE(6,1114) jjj,ntf,IMIN(1)/dfloat(jjj), + # IMAX(1)/dfloat(jjj) + ELSEIF ((HBL.GT.1).AND.(nv.GT.0)) THEN + WRITE(6,1115) jjj,ntf,IMIN(1)/dfloat(jjj), + # IMAX(1)/dfloat(jjj), + # SUM(1.D0-ACCRATE(1:nobs)/DFLOAT(jjj))/DFLOAT(nobs) + ENDIF + ENDIF + IF (jjj/thin*thin.EQ.jjj) THEN + IF ((MargLik.EQ.'Y').OR.(MargLik.EQ.'y')) THEN + gibtheta(jjj/thin,1:nt) = theta(1:nt) + ENDIF + WRITE(12,'(<nobs*ny>(F20.10))') (INN(1:nobs,I),I=1,ny) + WRITE(10,'(<nobs*nx>(F20.10))') (STATE(1:nobs,I),I=1,nx) + IF (nv.EQ.0) THEN + WRITE(9,'(<nt>(F25.15))') theta(1:nt) + ELSE + IF ((MargLik.EQ.'Y').OR.(MargLik.EQ.'y')) THEN + gibtheta(jjj/thin,nt+1:nt+np(1)) = psi(1:np(1)) + gibZ(jjj/thin,1:nobs) = Z(1:nobs) + ENDIF + WRITE(9,'(<nt+np(1)>(F25.15))') theta(1:nt),psi(1:np(1)) + WRITE(11,'(<nobs>(I3))') Z(:) + ENDIF + IF (nf.GT.0) THEN + J = min(nv,1) + WRITE(13,'(<nf*(nx+ny+J)>(F20.10))') (FORE(1:nf,I),I=1,nx+ny+J) + ENDIF + ENDIF + ENDDO + ENDIF + CLOSE(9) + CLOSE(10) + IF (nv.GT.0) CLOSE(11) + CLOSE(12) + IF (nf.GT.0) CLOSE(13) + IF (indmis*nmis.GE.1) THEN + CLOSE(14) + DEALLOCATE(ykmis) + ENDIF + DEALLOCATE(INN) + IF ((nv.GT.0).AND.(HBL.GT.1)) THEN + DEALLOCATE(PTR,PM,ACCRATE) + ENDIF + +C MARGINAL LIKELIHOOD + IF ((MargLik.EQ.'Y').OR.(MargLik.EQ.'y')) THEN + WRITE(*,*) ' ' + WRITE(*,*) 'Computing the marginal likelihood. Please wait ...' + IF (nmis.GT.0) THEN + CALL HARMONIC(GGG,nobs,d,ny,nz,nx,nu,nv,ns,nstot,nt,np, + 1 INFOS,yk(1:nobs,:),IYK(1:nobs,:),gibtheta,gibZ, + 2 thetaprior,psiprior,pdftheta,pdll,MLHM) + WRITE(*,*) 'Modified harmonic mean: done!' + CALL MENGWONG(GGG,nobs,d,ny,nz,nx,nu,nv,ns,nstot,nt,np, + 1 INFOS,yk(1:nobs,:),IYK(1:nobs,:),gibtheta,gibZ, + 2 thetaprior,psiprior,pdftheta,pdll,MLHM(5,1),MLMW) + WRITE(*,*) 'Bridge sampling: done!' + WRITE(*,*) ' ' + ELSE + CALL HARMONIC2(GGG,nobs,d,ny,nz,nx,nu,nv,ns,nstot,nt,np, + 1 INFOS,yk(1:nobs,:),gibtheta,gibZ,thetaprior, + 2 psiprior,pdftheta,pdll,MLHM) + WRITE(*,*) 'Modified harmonic mean: done!' + CALL MENGWONG2(GGG,nobs,d,ny,nz,nx,nu,nv,ns,nstot,nt,np, + 1 INFOS,yk(1:nobs,:),gibtheta,gibZ,thetaprior, + 2 psiprior,pdftheta,pdll,MLHM(5,1),MLMW) + WRITE(*,*) 'Bridge sampling: done!' + WRITE(*,*) ' ' + ENDIF + WRITE(15,*) 'Modified Harmonic mean (ML and Var)' + WRITE(15,'(<2>(F20.10))') (MLHM(I,:),I=1,11) + WRITE(15,*) 'Bridge Sampling' + WRITE(15,'(<2>(F20.10))') (MLMW(I,:),I=1,2) + CLOSE(15) + DEALLOCATE(gibtheta,gibZ,MLHM,MLMW) + ENDIF + +7777 DEALLOCATE(yk,STATE,Z,S,theta0,theta,thetaprior,pdftheta,NEVAL, + 1 CUMN,IYK,INDT) + IF (nv.GT.0) THEN + DEALLOCATE(psi0,psi,psiprior,ZW) + ENDIF + + STATUS = freelibrary(pdll) !libero la DLL dalla memoria alla fine del programma + IF (TRIM(PATH).EQ.'') THEN + STATUS = getcwd(PATH) ! get current directory + ENDIF + + CALL DATE_AND_TIME(REAL_CLOCK(1),REAL_CLOCK(2),REAL_CLOCK(3), + 1 DATE_ITIME) + IT2(1:3) = DATE_ITIME(1:3) + IT2(4:7) = DATE_ITIME(5:8) + IT=(IT2(4)-IT1(4))*3600+(IT2(5)-IT1(5))*60+(IT2(6)-IT1(6)) + IF ((check.EQ.'Y').OR.(check.EQ.'y')) THEN + WRITE(6,1117) TRIM(PATH) + ELSE + IF ((datasim.EQ.'Y').OR.(datasim.EQ.'y')) THEN + WRITE(6,1118) TRIM(PATH) + ELSE + IF ((estimation.EQ.'ML').OR.(estimation.EQ.'ml').OR. + & (estimation.EQ.'Ml').OR.(estimation.EQ.'mL')) THEN + WRITE(6,1119) IT,TRIM(PATH) + ELSE + WRITE(6,1116) IT,TRIM(PATH) + ENDIF + ENDIF + ENDIF + DEALLOCATE(np,ns,INFOS,IT1,IT2,DATE_ITIME,REAL_CLOCK) + +1111 FORMAT((<4>(F25.12)), ' ',A2) +1112 FORMAT(I10,(<np(3)>(F25.12)), ' ',I2) +1113 FORMAT(/,' Burn-in draws = ',I8, + # /,' Parameters sampled by SLICE ',I5, + # /,' SLICE likelihood eval. Min/Max = ',F6.2, ' / ',F6.2) +1114 FORMAT(/,' Recording draws = ',I8, + # /,' Parameters sampled by SLICE ',I5, + # /,' SLICE likelihood eval. Min/Max = ',F6.2, ' / ',F6.2) +1115 FORMAT(/,' Recording draws = ',I8, + # /,' Parameters sampled by SLICE ',I5, + # /,' SLICE likelihood eval. Min/Max = ',F6.2, ' / ',F6.2, + # /,' Adaptive MH accettance rate = ',F6.2) +1116 FORMAT(/,' MCMC completed', + # /,' CPU-time (sec)=', I10, + # /,' Output printed in ',A) +1117 FORMAT(/,' Check completed', + # /,' Output printed in ',A) +1118 FORMAT(/,' Data simulation completed', + # /,' Output printed in 'A) +1119 FORMAT(/,' Maximum Likelihood completed', + # /,' CPU-time (sec)=', I10, + # /,' Output printed in ',A) + + PAUSE + STOP END diff --git a/markovp.for b/markovp.for index 76e2c56ba8873a75c1cdaac3f14fe9c6077cf076..a480fcc0d8adf6e00f78bd46a374095dc8e83061 100644 --- a/markovp.for +++ b/markovp.for @@ -1,20 +1,20 @@ -C --------------------------------------------------------------------------- -C MARKOVP computes the conditional Log-Probability of a Block of S variables: -C log{P[S(t+1),...,S(t+h)|S(1),...,S(t),S(t+h+1),...,S(T)]} -C HFIX = block length -C NH = 1 first block; -C NH > 1 and NH < nobs/HFIX middle block -C NH = nob/HFIX last block -C S = {S(t),S(t+1),...,S(t+h),S(t+h+1)} -C S(t) takes values in {1,2,...,N} -C Developed by A.Rossi, C.Planas and G.Fiorentini -C -C Copyright (C) 2010-2014 European Commission -C +C --------------------------------------------------------------------------- +C MARKOVP computes the conditional Log-Probability of a Block of S variables: +C log{P[S(t+1),...,S(t+h)|S(1),...,S(t),S(t+h+1),...,S(T)]} +C HFIX = block length +C NH = 1 first block; +C NH > 1 and NH < nobs/HFIX middle block +C NH = nob/HFIX last block +C S = {S(t),S(t+1),...,S(t+h),S(t+h+1)} +C S(t) takes values in {1,2,...,N} +C Developed by A.Rossi, C.Planas and G.Fiorentini +C +C Copyright (C) 2010-2014 European Commission +C C This file is part of Program DMM C -C DMM is free software developed at the Joint Research Centre of the -C European Commission: you can redistribute it and/or modify it under +C DMM is free software developed at the Joint Research Centre of the +C European Commission: you can redistribute it and/or modify it under C the terms of the GNU General Public License as published by C the Free Software Foundation, either version 3 of the License, or C (at your option) any later version. @@ -25,40 +25,40 @@ C MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the C GNU General Public License for more details. C C You should have received a copy of the GNU General Public License -C along with DMM. If not, see <http://www.gnu.org/licenses/>. -C --------------------------------------------------------------------------- - DOUBLE PRECISION FUNCTION MARKOVP(PMAT,PE,N,HFIX,NH,nobs,S) - -C INPUT - INTEGER N,HFIX,NH,S(HFIX+2),nobs - DOUBLE PRECISION PMAT(N,N,HFIX+1),PE(N) - -C LOCALS - INTEGER IT - - IF (NH.EQ.1) THEN - - MARKOVP = DLOG(PMAT(S(HFIX+2),S(2),HFIX))+DLOG(PE(S(2))) - + - DLOG(PE(S(HFIX+2))) - DO 10 IT=2,HFIX -10 MARKOVP = MARKOVP + DLOG(PMAT(S(IT+1),S(IT),1)) - + + DLOG(PMAT(S(HFIX+2),S(IT+1),HFIX+1-IT)) - + - DLOG(PMAT(S(HFIX+2),S(IT),HFIX+2-IT)) - - ELSEIF ((NH.GT.1).AND.(NH.LT.nobs/HFIX)) THEN - - MARKOVP = 0.D0 - DO 20 IT=1,HFIX -20 MARKOVP = MARKOVP + DLOG(PMAT(S(IT+1),S(IT),1)) - + + DLOG(PMAT(S(HFIX+2),S(IT+1),HFIX+1-IT)) - + - DLOG(PMAT(S(HFIX+2),S(IT),HFIX+2-IT)) - - ELSE - - MARKOVP = 0.D0 - DO 30 IT=1,HFIX -30 MARKOVP = MARKOVP + DLOG(PMAT(S(IT+1),S(IT),1)) - - ENDIF - RETURN +C along with DMM. If not, see <http://www.gnu.org/licenses/>. +C --------------------------------------------------------------------------- + DOUBLE PRECISION FUNCTION MARKOVP(PMAT,PE,N,HFIX,NH,nobs,S) + +C INPUT + INTEGER N,HFIX,NH,S(HFIX+2),nobs + DOUBLE PRECISION PMAT(N,N,HFIX+1),PE(N) + +C LOCALS + INTEGER IT + + IF (NH.EQ.1) THEN + + MARKOVP = DLOG(PMAT(S(HFIX+2),S(2),HFIX))+DLOG(PE(S(2))) + + - DLOG(PE(S(HFIX+2))) + DO 10 IT=2,HFIX +10 MARKOVP = MARKOVP + DLOG(PMAT(S(IT+1),S(IT),1)) + + + DLOG(PMAT(S(HFIX+2),S(IT+1),HFIX+1-IT)) + + - DLOG(PMAT(S(HFIX+2),S(IT),HFIX+2-IT)) + + ELSEIF ((NH.GT.1).AND.(NH.LT.nobs/HFIX)) THEN + + MARKOVP = 0.D0 + DO 20 IT=1,HFIX +20 MARKOVP = MARKOVP + DLOG(PMAT(S(IT+1),S(IT),1)) + + + DLOG(PMAT(S(HFIX+2),S(IT+1),HFIX+1-IT)) + + - DLOG(PMAT(S(HFIX+2),S(IT),HFIX+2-IT)) + + ELSE + + MARKOVP = 0.D0 + DO 30 IT=1,HFIX +30 MARKOVP = MARKOVP + DLOG(PMAT(S(IT+1),S(IT),1)) + + ENDIF + RETURN END diff --git a/mengwong.for b/mengwong.for index 6ca47fd01bbab30548cb9975dbffd34ee7113afc..3af811483caff8fcc050757e14b1fec80c5f7375 100644 --- a/mengwong.for +++ b/mengwong.for @@ -1,25 +1,25 @@ -C ------------------------------------------------------------------- -C MENGWONG computes the Marginal Lilkelihood estimates as deteiled -C by Meng and Wong, Statistica Sinica, 1996 -C Developed by A.Rossi, C.Planas and G.Fiorentini -C -C OUTPUT: -C MLMW(:,1) all parameters, -C MLMW(:,2) non-var params -C MLMW(1,:) no iteration, -C MLMW(2,:) SD, -C MLMW(3,:) 10 iterations -C -C Remarks: -C NPAR is total # of params, -C NPARD = NPAR - #Variances -C -C Copyright (C) 2010-2014 European Commission -C +C ------------------------------------------------------------------- +C MENGWONG computes the Marginal Lilkelihood estimates as deteiled +C by Meng and Wong, Statistica Sinica, 1996 +C Developed by A.Rossi, C.Planas and G.Fiorentini +C +C OUTPUT: +C MLMW(:,1) all parameters, +C MLMW(:,2) non-var params +C MLMW(1,:) no iteration, +C MLMW(2,:) SD, +C MLMW(3,:) 10 iterations +C +C Remarks: +C NPAR is total # of params, +C NPARD = NPAR - #Variances +C +C Copyright (C) 2010-2014 European Commission +C C This file is part of Program DMM C -C DMM is free software developed at the Joint Research Centre of the -C European Commission: you can redistribute it and/or modify it under +C DMM is free software developed at the Joint Research Centre of the +C European Commission: you can redistribute it and/or modify it under C the terms of the GNU General Public License as published by C the Free Software Foundation, either version 3 of the License, or C (at your option) any later version. @@ -30,393 +30,393 @@ C MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the C GNU General Public License for more details. C C You should have received a copy of the GNU General Public License -C along with DMM. If not, see <http://www.gnu.org/licenses/>. -C ------------------------------------------------------------------- - SUBROUTINE MENGWONG(G,nobs,d,ny,nz,nx,nu,nv,ns,nstot,nt,np, - 1 INFOS,yk,IYK,gibpar,gibZ,thetaprior,psiprior, - 2 tipo,pdll,MLSTART,MLMW) - -C INPUT - INTEGER G,nobs,d(2),ny,nz,nx,nu,nv,ns(6),nstot,nt,np(3), - 1 INFOS(9,6),gibZ(G,nobs),IYK(nobs,ny+1) - DOUBLE PRECISION yk(nobs,ny+nz),gibpar(G,nt+np(1)), - 1 thetaprior(nt,4),psiprior(np(2),np(3)),MLSTART - CHARACTER*2 tipo(nt) - POINTER (pdll,fittizia) ! ASSOCIATE pointer P alla DLL ad una varibile fittizia - -C OUTPUT - DOUBLE PRECISION MLMW(2,2) - -C LOCALS - INTEGER NPAR,I,J,K,IG,NPOS(nt+np(1)),IFAIL,NQ,ISEQ,ISEQ0,SEQ(nv), - 1 IS(nobs,6),NIM,NI,IND(1),NPARTH,NN,NSI,II,JJ - DOUBLE PRECISION,ALLOCATABLE::MAT(:,:),VQN(:,:),VQD(:,:), - 1 VHN(:,:),VHD(:,:) - DOUBLE PRECISION parm(nt),SIGM(nt,nt), - 1 COM(nt+1,nt),ISIGM(nt,nt),par(nt+np(1)),SEGA(nt+np(1)), - 2 ub(nt),lb(nt),R3((nt+1)*(nt+2)/2),WORK(nt) - DOUBLE PRECISION,ALLOCATABLE:: PTR(:,:,:),PMAT(:,:),PE(:),GAM(:), - 1 ALPHA(:,:),MOM(:,:) - DOUBLE PRECISION P1(INFOS(8,1),INFOS(8,1)), - 1 P2(INFOS(8,2),INFOS(8,2)),P3(INFOS(8,3),INFOS(8,3)), - 2 P4(INFOS(8,4),INFOS(8,4)),P5(INFOS(8,5),INFOS(8,5)), - 3 P6(INFOS(8,6),INFOS(8,6)) - DOUBLE PRECISION Ppar(nt+np(1)),Fpar,PS,QS,QPSI,C,DET,TRC,A0 - DOUBLE PRECISION ERRM,ERR,U,AUX,INDC(1),MUC,SS(2,2),MWNUM,MWDEN - DOUBLE PRECISION ZERO,ONE,PI - DATA ZERO/0.0D0/,ONE/1.0D0/,PI/3.141592653589793D0/ - -C EXTERNAL SUBROUTINES - EXTERNAL NEWEYWESTCOV,NEWEYWESTCOV2,mvncdf,DPOTRF,DPOTRI,setgmn, - 1 genmn,gengam,DESIGNZ,PPROD,ERGODIC,INT2SEQ - -C EXTERNAL FUNCTIONS - DOUBLE PRECISION PTHETA,PRIOR,PRIORDIR,genunf,gengam - - - PAR(:) = GIBPAR(1,:) ! set constant values - NPARTH = 0 - DO I = 1,nt - IF (GIBPAR(1,I).NE.GIBPAR(2,I)) THEN - NPARTH = NPARTH + 1 - NPOS(NPARTH) = I - ENDIF - ENDDO - DO I = 1,np(1) - NPOS(NPARTH+I) = nt+I - ENDDO - NPAR=NPARTH+np(1) - Ppar(:) = 0.D0 - parm(:) = ZERO - DO I = 1,NPARTH - parm(I) = SUM(gibpar(:,NPOS(I)))/DFLOAT(G) - ENDDO - - NQ = 0 - CALL NEWEYWESTCOV2(G,NPARTH,NQ,gibpar(:,NPOS(1:NPARTH)), - 1 parm(1:NPARTH),SIGM(1:NPARTH,1:NPARTH)) ! THETA Var-covar - - IF (nv.GT.0) THEN - ALLOCATE(PTR(nobs,nstot,nstot),PMAT(nstot,nstot),PE(nstot)) - -C Transition prob for QS - DO I = 1,nstot-1 - PTR(1,I,1) = SUM(ABS(gibZ(1:G,1).EQ.I))/DFLOAT(G) - ENDDO - PTR(1,nstot,1) = ONE-SUM(PTR(1,1:nstot-1,1)) - - DO 50 K = 2,nobs - DO 50 I = 1,nstot-1 - DO 50 J = 1,nstot - COM(1,1) = SUM(ABS(gibZ(1:G,K-1).EQ.J)) - IF (COM(1,1).GT.ZERO) THEN - PTR(K,I,J) = SUM(ABS((gibZ(1:G,K).EQ.I).AND. - # (gibZ(1:G,K-1).EQ.J)))/COM(1,1) - ELSE - PTR(K,I,J) = ONE/DFLOAT(nstot) - ENDIF -50 PTR(K,nstot,J) = ONE-SUM(PTR(K,1:nstot-1,J)) - -C Mean and Var of PSI - ALLOCATE (ALPHA(np(2),np(3)),MOM(np(1),2)) - DO I=1,np(1) - MOM(I,1) = SUM(gibpar(:,nt+I))/DFLOAT(G) - MOM(I,2) = SUM(gibpar(:,nt+I)**2)/DFLOAT(G) - MOM(I,2) = MOM(I,2)-MOM(I,1)**2 - ENDDO -C Hyperparameters of Dirichelt for Q(PSI) -C Mothod of Moments: a0 = m1(1-m1)/V1+1, ai = mi*a0, i=1,2,..,N - NN = 0 - K = 0 - DO I = 1,nv - NSI = INFOS(8,I) ! # of states for S - IF (INFOS(9,I).EQ.1) THEN ! S~IID - A0 = MOM(NN+1,1)*(1.D0-MOM(NN+1,1))/MOM(NN+1,2)+1.D0 !alpha0 - DO ii = 1,NSI-1 - ALPHA(K+1,ii) = MOM(NN+ii,1)*A0 - ENDDO - ALPHA(K+1,NSI) = A0-SUM(ALPHA(K+1,1:NSI-1)) - K = K + 1 - NN = NN + NSI-1 - ELSEIF (INFOS(9,I).EQ.2) THEN ! S~Markov - DO jj = 1,NSI - A0 = MOM(NN+1,1)*(1.D0-MOM(NN+1,1))/MOM(NN+1,2)+1.D0 !alpha0 - DO ii = 1,NSI-1 - ALPHA(K+1,ii) = MOM(NN+ii,1)*A0 - ENDDO - ALPHA(K+1,NSI) = A0-SUM(ALPHA(K+1,1:NSI-1)) - K = K + 1 - NN = NN + NSI-1 - ENDDO - ENDIF - ENDDO - ENDIF -C Importance sampling -C Sample THIS from N(THHAT,SIGHAT) with boundaries -C Evaluate p(THIS) ~ N(THHAT,SIGHAT) - NIM = 1000000 - ERRM = 1.D-8 - -C Normalization constants TRC and TRCD - lb(1:NPARTH) = thetaprior(NPOS(1:NPARTH),3) - ub(1:NPARTH) = thetaprior(NPOS(1:NPARTH),4) - CALL mvncdf(lb(1:NPARTH),ub(1:NPARTH),parm(1:NPARTH), - 1 SIGM(1:NPARTH,1:NPARTH),NPARTH,ERRM,NIM,TRC,ERR,NI) - -C Inverse SIGM & det for NPARTH - COM(1:NPARTH,1:NPARTH) = SIGM(1:NPARTH,1:NPARTH) - IFAIL = -1 -C CALL F01ADF(NPARTH,COM(1:NPARTH+1,1:NPARTH),NPARTH+1,IFAIL) ! Inverse var-covar - CALL DPOTRF('L',NPARTH,COM(1:NPARTH,1:NPARTH),NPARTH,IFAIL) ! COM = L*L' - DET = 1.D0 ! det(SIGM) - DO I=1,NPARTH - DET = DET*COM(I,I)**2 - ENDDO - CALL DPOTRI('L',NPARTH,COM(1:NPARTH,1:NPARTH),NPARTH,IFAIL) ! COM = VV^-1 - - DO 60 I=1,NPARTH - ISIGM(I,I) = COM(I,I) - DO 60 J=1,I-1 - ISIGM(I,J) = COM(I,J) -60 ISIGM(J,I) = ISIGM(I,J) - -c COM(1:NPARTH,1:NPARTH) = SIGM(1:NPARTH,1:NPARTH) -c IFAIL = -1 -c CALL F03ABF(COM(1:NPARTH,1:NPARTH),NPARTH,NPARTH,DET, -c 1 WORK(1:NPARTH),IFAIL) - - C = (2.D0*PI)**(-.5D0*NPARTH)/DSQRT(DET) ! constant - - ALLOCATE (MAT(G,2),VHN(G,2),VHD(G,2),VQN(G,2),VQD(G,2)) - QS = ONE - PS = ONE - IS(:,:) = 1 - DO 200 IG = 1,G -C SAMPLING THETA - SEGA(:) = -1.D0 - IFAIL = -1 - IND(1) = 0 - INDC(1) = -1.D0 - DO WHILE (INDC(1).LT.ZERO) - INDC(1) = ZERO - IND(1) = IND(1) + 1 - IF (IND(1).GT.G) EXIT -C CALL G05EAF(parm(1:NPARTH),NPARTH,SIGM(1:NPARTH,1:NPARTH), -C 1 NPARTH,EPS,R3,(NPARTH+1)*(NPARTH+2)/2,IFAIL) -C CALL G05EZF(SEGA(1:NPARTH),NPARTH,R3,(NPARTH+1)*(NPARTH+2)/2, -C 1 IFAIL) - COM(1:NPARTH,1:NPARTH) = SIGM(1:NPARTH,1:NPARTH) - CALL setgmn(parm(1:NPARTH),COM(1:NPARTH,1:NPARTH),NPARTH, +C along with DMM. If not, see <http://www.gnu.org/licenses/>. +C ------------------------------------------------------------------- + SUBROUTINE MENGWONG(G,nobs,d,ny,nz,nx,nu,nv,ns,nstot,nt,np, + 1 INFOS,yk,IYK,gibpar,gibZ,thetaprior,psiprior, + 2 tipo,pdll,MLSTART,MLMW) + +C INPUT + INTEGER G,nobs,d(2),ny,nz,nx,nu,nv,ns(6),nstot,nt,np(3), + 1 INFOS(9,6),gibZ(G,nobs),IYK(nobs,ny+1) + DOUBLE PRECISION yk(nobs,ny+nz),gibpar(G,nt+np(1)), + 1 thetaprior(nt,4),psiprior(np(2),np(3)),MLSTART + CHARACTER*2 tipo(nt) + POINTER (pdll,fittizia) ! ASSOCIATE pointer P alla DLL ad una varibile fittizia + +C OUTPUT + DOUBLE PRECISION MLMW(2,2) + +C LOCALS + INTEGER NPAR,I,J,K,IG,NPOS(nt+np(1)),IFAIL,NQ,ISEQ,ISEQ0,SEQ(nv), + 1 IS(nobs,6),NIM,NI,IND(1),NPARTH,NN,NSI,II,JJ + DOUBLE PRECISION,ALLOCATABLE::MAT(:,:),VQN(:,:),VQD(:,:), + 1 VHN(:,:),VHD(:,:) + DOUBLE PRECISION parm(nt),SIGM(nt,nt), + 1 COM(nt+1,nt),ISIGM(nt,nt),par(nt+np(1)),SEGA(nt+np(1)), + 2 ub(nt),lb(nt),R3((nt+1)*(nt+2)/2),WORK(nt) + DOUBLE PRECISION,ALLOCATABLE:: PTR(:,:,:),PMAT(:,:),PE(:),GAM(:), + 1 ALPHA(:,:),MOM(:,:) + DOUBLE PRECISION P1(INFOS(8,1),INFOS(8,1)), + 1 P2(INFOS(8,2),INFOS(8,2)),P3(INFOS(8,3),INFOS(8,3)), + 2 P4(INFOS(8,4),INFOS(8,4)),P5(INFOS(8,5),INFOS(8,5)), + 3 P6(INFOS(8,6),INFOS(8,6)) + DOUBLE PRECISION Ppar(nt+np(1)),Fpar,PS,QS,QPSI,C,DET,TRC,A0 + DOUBLE PRECISION ERRM,ERR,U,AUX,INDC(1),MUC,SS(2,2),MWNUM,MWDEN + DOUBLE PRECISION ZERO,ONE,PI + DATA ZERO/0.0D0/,ONE/1.0D0/,PI/3.141592653589793D0/ + +C EXTERNAL SUBROUTINES + EXTERNAL NEWEYWESTCOV,NEWEYWESTCOV2,mvncdf,DPOTRF,DPOTRI,setgmn, + 1 genmn,gengam,DESIGNZ,PPROD,ERGODIC,INT2SEQ + +C EXTERNAL FUNCTIONS + DOUBLE PRECISION PTHETA,PRIOR,PRIORDIR,genunf,gengam + + + PAR(:) = GIBPAR(1,:) ! set constant values + NPARTH = 0 + DO I = 1,nt + IF (GIBPAR(1,I).NE.GIBPAR(2,I)) THEN + NPARTH = NPARTH + 1 + NPOS(NPARTH) = I + ENDIF + ENDDO + DO I = 1,np(1) + NPOS(NPARTH+I) = nt+I + ENDDO + NPAR=NPARTH+np(1) + Ppar(:) = 0.D0 + parm(:) = ZERO + DO I = 1,NPARTH + parm(I) = SUM(gibpar(:,NPOS(I)))/DFLOAT(G) + ENDDO + + NQ = 0 + CALL NEWEYWESTCOV2(G,NPARTH,NQ,gibpar(:,NPOS(1:NPARTH)), + 1 parm(1:NPARTH),SIGM(1:NPARTH,1:NPARTH)) ! THETA Var-covar + + IF (nv.GT.0) THEN + ALLOCATE(PTR(nobs,nstot,nstot),PMAT(nstot,nstot),PE(nstot)) + +C Transition prob for QS + DO I = 1,nstot-1 + PTR(1,I,1) = SUM(ABS(gibZ(1:G,1).EQ.I))/DFLOAT(G) + ENDDO + PTR(1,nstot,1) = ONE-SUM(PTR(1,1:nstot-1,1)) + + DO 50 K = 2,nobs + DO 50 I = 1,nstot-1 + DO 50 J = 1,nstot + COM(1,1) = SUM(ABS(gibZ(1:G,K-1).EQ.J)) + IF (COM(1,1).GT.ZERO) THEN + PTR(K,I,J) = SUM(ABS((gibZ(1:G,K).EQ.I).AND. + # (gibZ(1:G,K-1).EQ.J)))/COM(1,1) + ELSE + PTR(K,I,J) = ONE/DFLOAT(nstot) + ENDIF +50 PTR(K,nstot,J) = ONE-SUM(PTR(K,1:nstot-1,J)) + +C Mean and Var of PSI + ALLOCATE (ALPHA(np(2),np(3)),MOM(np(1),2)) + DO I=1,np(1) + MOM(I,1) = SUM(gibpar(:,nt+I))/DFLOAT(G) + MOM(I,2) = SUM(gibpar(:,nt+I)**2)/DFLOAT(G) + MOM(I,2) = MOM(I,2)-MOM(I,1)**2 + ENDDO +C Hyperparameters of Dirichelt for Q(PSI) +C Mothod of Moments: a0 = m1(1-m1)/V1+1, ai = mi*a0, i=1,2,..,N + NN = 0 + K = 0 + DO I = 1,nv + NSI = INFOS(8,I) ! # of states for S + IF (INFOS(9,I).EQ.1) THEN ! S~IID + A0 = MOM(NN+1,1)*(1.D0-MOM(NN+1,1))/MOM(NN+1,2)+1.D0 !alpha0 + DO ii = 1,NSI-1 + ALPHA(K+1,ii) = MOM(NN+ii,1)*A0 + ENDDO + ALPHA(K+1,NSI) = A0-SUM(ALPHA(K+1,1:NSI-1)) + K = K + 1 + NN = NN + NSI-1 + ELSEIF (INFOS(9,I).EQ.2) THEN ! S~Markov + DO jj = 1,NSI + A0 = MOM(NN+1,1)*(1.D0-MOM(NN+1,1))/MOM(NN+1,2)+1.D0 !alpha0 + DO ii = 1,NSI-1 + ALPHA(K+1,ii) = MOM(NN+ii,1)*A0 + ENDDO + ALPHA(K+1,NSI) = A0-SUM(ALPHA(K+1,1:NSI-1)) + K = K + 1 + NN = NN + NSI-1 + ENDDO + ENDIF + ENDDO + ENDIF +C Importance sampling +C Sample THIS from N(THHAT,SIGHAT) with boundaries +C Evaluate p(THIS) ~ N(THHAT,SIGHAT) + NIM = 1000000 + ERRM = 1.D-8 + +C Normalization constants TRC and TRCD + lb(1:NPARTH) = thetaprior(NPOS(1:NPARTH),3) + ub(1:NPARTH) = thetaprior(NPOS(1:NPARTH),4) + CALL mvncdf(lb(1:NPARTH),ub(1:NPARTH),parm(1:NPARTH), + 1 SIGM(1:NPARTH,1:NPARTH),NPARTH,ERRM,NIM,TRC,ERR,NI) + +C Inverse SIGM & det for NPARTH + COM(1:NPARTH,1:NPARTH) = SIGM(1:NPARTH,1:NPARTH) + IFAIL = -1 +C CALL F01ADF(NPARTH,COM(1:NPARTH+1,1:NPARTH),NPARTH+1,IFAIL) ! Inverse var-covar + CALL DPOTRF('L',NPARTH,COM(1:NPARTH,1:NPARTH),NPARTH,IFAIL) ! COM = L*L' + DET = 1.D0 ! det(SIGM) + DO I=1,NPARTH + DET = DET*COM(I,I)**2 + ENDDO + CALL DPOTRI('L',NPARTH,COM(1:NPARTH,1:NPARTH),NPARTH,IFAIL) ! COM = VV^-1 + + DO 60 I=1,NPARTH + ISIGM(I,I) = COM(I,I) + DO 60 J=1,I-1 + ISIGM(I,J) = COM(I,J) +60 ISIGM(J,I) = ISIGM(I,J) + +c COM(1:NPARTH,1:NPARTH) = SIGM(1:NPARTH,1:NPARTH) +c IFAIL = -1 +c CALL F03ABF(COM(1:NPARTH,1:NPARTH),NPARTH,NPARTH,DET, +c 1 WORK(1:NPARTH),IFAIL) + + C = (2.D0*PI)**(-.5D0*NPARTH)/DSQRT(DET) ! constant + + ALLOCATE (MAT(G,2),VHN(G,2),VHD(G,2),VQN(G,2),VQD(G,2)) + QS = ONE + PS = ONE + IS(:,:) = 1 + DO 200 IG = 1,G +C SAMPLING THETA + SEGA(:) = -1.D0 + IFAIL = -1 + IND(1) = 0 + INDC(1) = -1.D0 + DO WHILE (INDC(1).LT.ZERO) + INDC(1) = ZERO + IND(1) = IND(1) + 1 + IF (IND(1).GT.G) EXIT +C CALL G05EAF(parm(1:NPARTH),NPARTH,SIGM(1:NPARTH,1:NPARTH), +C 1 NPARTH,EPS,R3,(NPARTH+1)*(NPARTH+2)/2,IFAIL) +C CALL G05EZF(SEGA(1:NPARTH),NPARTH,R3,(NPARTH+1)*(NPARTH+2)/2, +C 1 IFAIL) + COM(1:NPARTH,1:NPARTH) = SIGM(1:NPARTH,1:NPARTH) + CALL setgmn(parm(1:NPARTH),COM(1:NPARTH,1:NPARTH),NPARTH, 1 NPARTH,R3(1:(NPARTH+2)*(NPARTH+1)/2)) - CALL genmn(R3(1:(NPARTH+2)*(NPARTH+1)/2),SEGA(1:NPARTH), - 1 WORK(1:NPARTH)) - DO I=1,NPARTH - IF (SEGA(I).LT.thetaprior(NPOS(I),3)) INDC(1)=-1 - IF (SEGA(I).GT.thetaprior(NPOS(I),4)) INDC(1)=-2 - ENDDO - END DO -C SAMPLING PSI from Dirichlet(ALPHA) - NN = NPARTH - K = 0 - DO 70 I = 1,nv - NSI = INFOS(8,I) ! # of states for SI - ALLOCATE(GAM(NSI)) - IF (INFOS(9,I).EQ.1) THEN ! S~IID - DO ii = 1,NSI - IFAIL = -1 -C CALL G05FFF(ALPHA(K+1,ii),1.D0,1,GAM(ii),IFAIL) - GAM(ii) = gengam(1.D0,ALPHA(K+1,ii)) - ENDDO - SEGA(NN+1:NN+NSI-1) = GAM(1:NSI-1)/SUM(GAM(1:NSI)) - K = K + 1 - NN = NN + NSI-1 - ELSEIF (INFOS(9,I).EQ.2) THEN ! S~Markov - DO jj = 1,NSI - DO ii = 1,NSI - IFAIL = -1 -C CALL G05FFF(ALPHA(K+1,ii),1.D0,1,GAM(ii),IFAIL) - GAM(ii) = gengam(1.D0,ALPHA(K+1,ii)) - ENDDO - SEGA(NN+1:NN+NSI-1) = GAM(1:NSI-1)/SUM(GAM(1:NSI)) - K = K + 1 - NN = NN + NSI-1 - ENDDO - ENDIF -70 DEALLOCATE(GAM) - -C SAMPLING S - IF (nv.GT.0) THEN - CALL DESIGNZ(nv,np(1),SEGA(NPARTH+1:NPAR),INFOS, - 1 P1,P2,P3,P4,P5,P6) -C PMAT(i,j) = Pr[Z(t+1)=i|Z(t)=j], Z = S1 x S2 x ... x Snv - CALL PPROD(nv,nstot,INFOS,P1,P2,P3,P4,P5,P6,PMAT) -C ERGODIC solves PE: PE*(I-P') = 0 - CALL ERGODIC(nstot,PMAT,PE) -C S(1) -C U = G05CAF(U) ! Sampling from U(0,1) - U = genunf(0.D0,1.D0) - ISEQ = 1 - AUX = PTR(1,ISEQ,1) - DO 80 WHILE (AUX.LT.U) - ISEQ = ISEQ + 1 -80 AUX = AUX + PTR(1,ISEQ,1) - CALL INT2SEQ(ISEQ,nv,INFOS,SEQ,IS(1,:)) - QS = PTR(1,ISEQ,1) - PS = PE(ISEQ) ! P(S1) - ISEQ0 = ISEQ -C S(2),...,S(nobs) - DO 90 K = 2,nobs -C U = G05CAF(U) ! Sampling from U(0,1) - U = genunf(0.D0,1.D0) - ISEQ = 1 - AUX = PTR(K,ISEQ,ISEQ0) - DO 85 WHILE (AUX.LT.U) - ISEQ = ISEQ + 1 -85 AUX = AUX + PTR(K,ISEQ,ISEQ0) - CALL INT2SEQ(ISEQ,nv,INFOS,SEQ,IS(K,:)) - QS = QS*PTR(K,ISEQ,ISEQ0) - PS = PS*PMAT(ISEQ,ISEQ0) -90 ISEQ0 = ISEQ - ENDIF - -C QUADRATIC FORM FOR for THETA - DO 91 I = 1,NPARTH -91 COM(I,1) = SUM((SEGA(1:NPARTH)-parm(1:NPARTH))*ISIGM(1:NPARTH,I)) - MUC = SUM(COM(1:NPARTH,1)*(SEGA(1:NPARTH)-parm(1:NPARTH))) - -C VQN(IG,1) = QS*C*DEXP(-.5D0*MUC)/TRC - - par(NPOS(1:NPARTH+np(1))) = SEGA(1:NPARTH+np(1)) ! (THETA,PSI) - -C PRIOR for THETA - DO 92 I = 2,NPARTH -92 Ppar(I) = PRIOR(par(NPOS(I)),thetaprior(NPOS(I),:),tipo(NPOS(I))) - -C PRIOR for PSI and Q(PSI)~Dirichlet(a1,a2,...,aN) - QPSI = 0.D0 - NN = NPARTH - K = 0 - DO 100 J = 1,nv - NSI = INFOS(8,J) - IF(INFOS(9,J).EQ.1) THEN ! S~IID - Ppar(NPARTH+K+1) = PRIORDIR(par(NPOS(NN+1:NN+NSI-1)), - 1 psiprior(K+1,1:NSI),NSI) - QPSI = QPSI+PRIORDIR(par(NPOS(NN+1:NN+NSI-1)), - 1 ALPHA(K+1,1:NSI),NSI) - K = K + 1 - NN = NN + NSI-1 - ELSEIF(INFOS(9,J).EQ.2) THEN ! S~Markov - DO 99 I = 1,NSI - Ppar(NPARTH+K+1) = PRIORDIR(par(NPOS(NN+1:NN+NSI-1)), - 1 psiprior(K+1,1:NSI),NSI) - QPSI = QPSI+PRIORDIR(par(NPOS(NN+1:NN+NSI-1)), - 1 ALPHA(K+1,1:NSI),NSI) - K = K + 1 -99 NN = NN + NSI-1 - ENDIF -100 CONTINUE - - Fpar = PTHETA(NPOS(1),nobs,d,ny,nz,nx,nu,ns,nt,IS,yk,IYK, - 1 par(1:nt),thetaprior(NPOS(1),:), - 2 tipo(NPOS(1)),pdll) - Fpar = Fpar + SUM(Ppar(2:NPARTH+K)) ! log f(y|par,S)f(par,S) - - VQN(IG,1) = DEXP(QPSI)*QS*C*DEXP(-.5D0*MUC)/TRC - -200 VHN(IG,1) = Fpar + DLOG(PS) - -C --------------------- -C Meng-Wong denominator -C --------------------- - QS = ONE - PS = ONE - DO 400 IG = 1,G - IF (nv.GT.0) THEN - CALL DESIGNZ(nv,np(1),gibpar(IG,nt+1:nt+np(1)),INFOS, - 1 P1,P2,P3,P4,P5,P6) -C PMAT(i,j) = Pr[Z(t+1)=i|Z(t)=j], Z = S1 x S2 x ... x Snv - CALL PPROD(nv,nstot,INFOS,P1,P2,P3,P4,P5,P6,PMAT) -C ERGODIC solves PE: PE*(I-P') = 0 - CALL ERGODIC(nstot,PMAT,PE) - - QS = PTR(1,gibZ(IG,1),1) - PS = PE(gibZ(IG,1)) - CALL INT2SEQ(gibZ(IG,1),nv,INFOS,SEQ,IS(1,:)) - DO 210 K = 2,nobs - QS = QS*PTR(K,gibZ(IG,K),gibZ(IG,K-1)) - PS = PS*PMAT(gibZ(IG,K),gibZ(IG,K-1)) -210 CALL INT2SEQ(gibZ(IG,K),nv,INFOS,SEQ,IS(K,:)) - ENDIF - -C PRIOR for THETA - DO 310 I = 2,NPARTH -310 Ppar(I) = PRIOR(gibpar(IG,NPOS(I)),thetaprior(NPOS(I),:), - 1 tipo(NPOS(I))) - -C PRIOR for PSI and Q(PSI)~Dirichlet(a1,a2,...,aN) - QPSI = 0.D0 - NN = NPARTH - K = 0 - DO 305 J = 1,nv - NSI = INFOS(8,J) - IF(INFOS(9,J).EQ.1) THEN ! S~IID - Ppar(NPARTH+K+1) = PRIORDIR(gibpar(IG,NPOS(NN+1:NN+NSI-1)), - 1 psiprior(K+1,1:NSI),NSI) - QPSI = QPSI+PRIORDIR(gibpar(IG,NPOS(NN+1:NN+NSI-1)), - 1 ALPHA(K+1,1:NSI),NSI) - K = K + 1 - NN = NN + NSI-1 - ELSEIF(INFOS(9,J).EQ.2) THEN ! S~Markov - DO 304 I = 1,NSI - Ppar(NPARTH+K+1) = PRIORDIR(gibpar(IG,NPOS(NN+1:NN+NSI-1)), - 1 psiprior(K+1,1:NSI),NSI) - QPSI = QPSI+PRIORDIR(gibpar(IG,NPOS(NN+1:NN+NSI-1)), - 1 ALPHA(K+1,1:NSI),NSI) - K = K + 1 -304 NN = NN + NSI-1 - ENDIF -305 CONTINUE - - Fpar = PTHETA(NPOS(1),nobs,d,ny,nz,nx,nu,ns,nt,IS,yk,IYK, - 1 gibpar(IG,1:nt),thetaprior(NPOS(1),:), - 2 tipo(NPOS(1)),pdll) - Fpar = Fpar + SUM(Ppar(2:NPARTH+K)) ! log f(y|par,S)f(par,S) - - VHD(IG,1) = Fpar + DLOG(PS) - - COM(:,1) = ZERO - DO 320 I = 1,NPARTH -320 COM(I,1) = SUM((gibpar(IG,NPOS(1:NPARTH))-parm(1:NPARTH)) - # * ISIGM(1:NPARTH,I)) - MUC = SUM(COM(1:NPARTH,1)*(gibpar(IG,NPOS(1:NPARTH)) - # - parm(1:NPARTH))) - - VQD(IG,1) = DEXP(QPSI)*QS*DEXP(-.5D0*MUC)*C/TRC -400 CONTINUE - - IND = MAXLOC(VHN(:,1)) - DET = VHN(IND(1),1) - - MAT(:,1) = DEXP(VHN(:,1)-DET)/(DEXP(VHN(:,1)-MLSTART)+VQN(:,1)) - MAT(:,2) = VQD(:,1)/(DEXP(VHD(:,1)-MLSTART)+VQD(:,1)) - - CALL NEWEYWESTCOV(G,2,1,MAT(:,1:2),SS) - MLMW(2,1) = SUM(MAT(:,1))/SUM(MAT(:,2)) - MLMW(1,1) = DLOG(MLMW(2,1)) + DET - MLMW(1:2,2) = SS(1,1)*G/SUM(MAT(:,1))**2 + - + SS(2,2)*G/SUM(MAT(:,2))**2 + - + - 2.D0*SS(1,2)*G/(SUM(MAT(:,1))*SUM(MAT(:,2))) - - MLMW(2,1) = MLMW(1,1) ! log scale - DO 500 I=1,10 - MWNUM = SUM(DEXP(VHN(:,1)-DET) - 1 / (DEXP(VHN(:,1)-MLMW(2,1))+VQN(:,1))) - MWDEN = SUM(VQD(:,1)/(DEXP(VHD(:,1)-MLMW(2,1))+VQD(:,1))) - MLMW(2,1) = DLOG(MWNUM/MWDEN) + DET ! log-scale -500 CONTINUE - - DEALLOCATE (MAT,VHN,VHD,VQN,VQD) - IF (nv.GT.0) DEALLOCATE (PTR,PMAT,PE,ALPHA,MOM) - - RETURN + CALL genmn(R3(1:(NPARTH+2)*(NPARTH+1)/2),SEGA(1:NPARTH), + 1 WORK(1:NPARTH)) + DO I=1,NPARTH + IF (SEGA(I).LT.thetaprior(NPOS(I),3)) INDC(1)=-1 + IF (SEGA(I).GT.thetaprior(NPOS(I),4)) INDC(1)=-2 + ENDDO + END DO +C SAMPLING PSI from Dirichlet(ALPHA) + NN = NPARTH + K = 0 + DO 70 I = 1,nv + NSI = INFOS(8,I) ! # of states for SI + ALLOCATE(GAM(NSI)) + IF (INFOS(9,I).EQ.1) THEN ! S~IID + DO ii = 1,NSI + IFAIL = -1 +C CALL G05FFF(ALPHA(K+1,ii),1.D0,1,GAM(ii),IFAIL) + GAM(ii) = gengam(1.D0,ALPHA(K+1,ii)) + ENDDO + SEGA(NN+1:NN+NSI-1) = GAM(1:NSI-1)/SUM(GAM(1:NSI)) + K = K + 1 + NN = NN + NSI-1 + ELSEIF (INFOS(9,I).EQ.2) THEN ! S~Markov + DO jj = 1,NSI + DO ii = 1,NSI + IFAIL = -1 +C CALL G05FFF(ALPHA(K+1,ii),1.D0,1,GAM(ii),IFAIL) + GAM(ii) = gengam(1.D0,ALPHA(K+1,ii)) + ENDDO + SEGA(NN+1:NN+NSI-1) = GAM(1:NSI-1)/SUM(GAM(1:NSI)) + K = K + 1 + NN = NN + NSI-1 + ENDDO + ENDIF +70 DEALLOCATE(GAM) + +C SAMPLING S + IF (nv.GT.0) THEN + CALL DESIGNZ(nv,np(1),SEGA(NPARTH+1:NPAR),INFOS, + 1 P1,P2,P3,P4,P5,P6) +C PMAT(i,j) = Pr[Z(t+1)=i|Z(t)=j], Z = S1 x S2 x ... x Snv + CALL PPROD(nv,nstot,INFOS,P1,P2,P3,P4,P5,P6,PMAT) +C ERGODIC solves PE: PE*(I-P') = 0 + CALL ERGODIC(nstot,PMAT,PE) +C S(1) +C U = G05CAF(U) ! Sampling from U(0,1) + U = genunf(0.D0,1.D0) + ISEQ = 1 + AUX = PTR(1,ISEQ,1) + DO 80 WHILE (AUX.LT.U) + ISEQ = ISEQ + 1 +80 AUX = AUX + PTR(1,ISEQ,1) + CALL INT2SEQ(ISEQ,nv,INFOS,SEQ,IS(1,:)) + QS = PTR(1,ISEQ,1) + PS = PE(ISEQ) ! P(S1) + ISEQ0 = ISEQ +C S(2),...,S(nobs) + DO 90 K = 2,nobs +C U = G05CAF(U) ! Sampling from U(0,1) + U = genunf(0.D0,1.D0) + ISEQ = 1 + AUX = PTR(K,ISEQ,ISEQ0) + DO 85 WHILE (AUX.LT.U) + ISEQ = ISEQ + 1 +85 AUX = AUX + PTR(K,ISEQ,ISEQ0) + CALL INT2SEQ(ISEQ,nv,INFOS,SEQ,IS(K,:)) + QS = QS*PTR(K,ISEQ,ISEQ0) + PS = PS*PMAT(ISEQ,ISEQ0) +90 ISEQ0 = ISEQ + ENDIF + +C QUADRATIC FORM FOR for THETA + DO 91 I = 1,NPARTH +91 COM(I,1) = SUM((SEGA(1:NPARTH)-parm(1:NPARTH))*ISIGM(1:NPARTH,I)) + MUC = SUM(COM(1:NPARTH,1)*(SEGA(1:NPARTH)-parm(1:NPARTH))) + +C VQN(IG,1) = QS*C*DEXP(-.5D0*MUC)/TRC + + par(NPOS(1:NPARTH+np(1))) = SEGA(1:NPARTH+np(1)) ! (THETA,PSI) + +C PRIOR for THETA + DO 92 I = 2,NPARTH +92 Ppar(I) = PRIOR(par(NPOS(I)),thetaprior(NPOS(I),:),tipo(NPOS(I))) + +C PRIOR for PSI and Q(PSI)~Dirichlet(a1,a2,...,aN) + QPSI = 0.D0 + NN = NPARTH + K = 0 + DO 100 J = 1,nv + NSI = INFOS(8,J) + IF(INFOS(9,J).EQ.1) THEN ! S~IID + Ppar(NPARTH+K+1) = PRIORDIR(par(NPOS(NN+1:NN+NSI-1)), + 1 psiprior(K+1,1:NSI),NSI) + QPSI = QPSI+PRIORDIR(par(NPOS(NN+1:NN+NSI-1)), + 1 ALPHA(K+1,1:NSI),NSI) + K = K + 1 + NN = NN + NSI-1 + ELSEIF(INFOS(9,J).EQ.2) THEN ! S~Markov + DO 99 I = 1,NSI + Ppar(NPARTH+K+1) = PRIORDIR(par(NPOS(NN+1:NN+NSI-1)), + 1 psiprior(K+1,1:NSI),NSI) + QPSI = QPSI+PRIORDIR(par(NPOS(NN+1:NN+NSI-1)), + 1 ALPHA(K+1,1:NSI),NSI) + K = K + 1 +99 NN = NN + NSI-1 + ENDIF +100 CONTINUE + + Fpar = PTHETA(NPOS(1),nobs,d,ny,nz,nx,nu,ns,nt,IS,yk,IYK, + 1 par(1:nt),thetaprior(NPOS(1),:), + 2 tipo(NPOS(1)),pdll) + Fpar = Fpar + SUM(Ppar(2:NPARTH+K)) ! log f(y|par,S)f(par,S) + + VQN(IG,1) = DEXP(QPSI)*QS*C*DEXP(-.5D0*MUC)/TRC + +200 VHN(IG,1) = Fpar + DLOG(PS) + +C --------------------- +C Meng-Wong denominator +C --------------------- + QS = ONE + PS = ONE + DO 400 IG = 1,G + IF (nv.GT.0) THEN + CALL DESIGNZ(nv,np(1),gibpar(IG,nt+1:nt+np(1)),INFOS, + 1 P1,P2,P3,P4,P5,P6) +C PMAT(i,j) = Pr[Z(t+1)=i|Z(t)=j], Z = S1 x S2 x ... x Snv + CALL PPROD(nv,nstot,INFOS,P1,P2,P3,P4,P5,P6,PMAT) +C ERGODIC solves PE: PE*(I-P') = 0 + CALL ERGODIC(nstot,PMAT,PE) + + QS = PTR(1,gibZ(IG,1),1) + PS = PE(gibZ(IG,1)) + CALL INT2SEQ(gibZ(IG,1),nv,INFOS,SEQ,IS(1,:)) + DO 210 K = 2,nobs + QS = QS*PTR(K,gibZ(IG,K),gibZ(IG,K-1)) + PS = PS*PMAT(gibZ(IG,K),gibZ(IG,K-1)) +210 CALL INT2SEQ(gibZ(IG,K),nv,INFOS,SEQ,IS(K,:)) + ENDIF + +C PRIOR for THETA + DO 310 I = 2,NPARTH +310 Ppar(I) = PRIOR(gibpar(IG,NPOS(I)),thetaprior(NPOS(I),:), + 1 tipo(NPOS(I))) + +C PRIOR for PSI and Q(PSI)~Dirichlet(a1,a2,...,aN) + QPSI = 0.D0 + NN = NPARTH + K = 0 + DO 305 J = 1,nv + NSI = INFOS(8,J) + IF(INFOS(9,J).EQ.1) THEN ! S~IID + Ppar(NPARTH+K+1) = PRIORDIR(gibpar(IG,NPOS(NN+1:NN+NSI-1)), + 1 psiprior(K+1,1:NSI),NSI) + QPSI = QPSI+PRIORDIR(gibpar(IG,NPOS(NN+1:NN+NSI-1)), + 1 ALPHA(K+1,1:NSI),NSI) + K = K + 1 + NN = NN + NSI-1 + ELSEIF(INFOS(9,J).EQ.2) THEN ! S~Markov + DO 304 I = 1,NSI + Ppar(NPARTH+K+1) = PRIORDIR(gibpar(IG,NPOS(NN+1:NN+NSI-1)), + 1 psiprior(K+1,1:NSI),NSI) + QPSI = QPSI+PRIORDIR(gibpar(IG,NPOS(NN+1:NN+NSI-1)), + 1 ALPHA(K+1,1:NSI),NSI) + K = K + 1 +304 NN = NN + NSI-1 + ENDIF +305 CONTINUE + + Fpar = PTHETA(NPOS(1),nobs,d,ny,nz,nx,nu,ns,nt,IS,yk,IYK, + 1 gibpar(IG,1:nt),thetaprior(NPOS(1),:), + 2 tipo(NPOS(1)),pdll) + Fpar = Fpar + SUM(Ppar(2:NPARTH+K)) ! log f(y|par,S)f(par,S) + + VHD(IG,1) = Fpar + DLOG(PS) + + COM(:,1) = ZERO + DO 320 I = 1,NPARTH +320 COM(I,1) = SUM((gibpar(IG,NPOS(1:NPARTH))-parm(1:NPARTH)) + # * ISIGM(1:NPARTH,I)) + MUC = SUM(COM(1:NPARTH,1)*(gibpar(IG,NPOS(1:NPARTH)) + # - parm(1:NPARTH))) + + VQD(IG,1) = DEXP(QPSI)*QS*DEXP(-.5D0*MUC)*C/TRC +400 CONTINUE + + IND = MAXLOC(VHN(:,1)) + DET = VHN(IND(1),1) + + MAT(:,1) = DEXP(VHN(:,1)-DET)/(DEXP(VHN(:,1)-MLSTART)+VQN(:,1)) + MAT(:,2) = VQD(:,1)/(DEXP(VHD(:,1)-MLSTART)+VQD(:,1)) + + CALL NEWEYWESTCOV(G,2,1,MAT(:,1:2),SS) + MLMW(2,1) = SUM(MAT(:,1))/SUM(MAT(:,2)) + MLMW(1,1) = DLOG(MLMW(2,1)) + DET + MLMW(1:2,2) = SS(1,1)*G/SUM(MAT(:,1))**2 + + + SS(2,2)*G/SUM(MAT(:,2))**2 + + + - 2.D0*SS(1,2)*G/(SUM(MAT(:,1))*SUM(MAT(:,2))) + + MLMW(2,1) = MLMW(1,1) ! log scale + DO 500 I=1,10 + MWNUM = SUM(DEXP(VHN(:,1)-DET) + 1 / (DEXP(VHN(:,1)-MLMW(2,1))+VQN(:,1))) + MWDEN = SUM(VQD(:,1)/(DEXP(VHD(:,1)-MLMW(2,1))+VQD(:,1))) + MLMW(2,1) = DLOG(MWNUM/MWDEN) + DET ! log-scale +500 CONTINUE + + DEALLOCATE (MAT,VHN,VHD,VQN,VQD) + IF (nv.GT.0) DEALLOCATE (PTR,PMAT,PE,ALPHA,MOM) + + RETURN END diff --git a/mengwong2.for b/mengwong2.for index fcd95fc95a52c46d2fb56c84b896968c6567651c..1735d84d6ed5f21b5d302b080f29d0c95210f70d 100644 --- a/mengwong2.for +++ b/mengwong2.for @@ -1,25 +1,25 @@ -C ------------------------------------------------------------------- -C MENGWONG2 (no missing values) computes the Marginal Lilkelihood estimates as deteiled -C by Meng and Wong, Statistica Sinica, 1996 -C Developed by A.Rossi, C.Planas and G.Fiorentini -C -C OUTPUT: -C MLMW(:,1) all parameters, -C MLMW(:,2) non-var params -C MLMW(1,:) no iteration, -C MLMW(2,:) SD, -C MLMW(3,:) 10 iterations -C -C Remarks: -C NPAR is total # of params, -C NPARD = NPAR - #Variances -C -C Copyright (C) 2010-2014 European Commission -C +C ------------------------------------------------------------------- +C MENGWONG2 (no missing values) computes the Marginal Lilkelihood estimates as deteiled +C by Meng and Wong, Statistica Sinica, 1996 +C Developed by A.Rossi, C.Planas and G.Fiorentini +C +C OUTPUT: +C MLMW(:,1) all parameters, +C MLMW(:,2) non-var params +C MLMW(1,:) no iteration, +C MLMW(2,:) SD, +C MLMW(3,:) 10 iterations +C +C Remarks: +C NPAR is total # of params, +C NPARD = NPAR - #Variances +C +C Copyright (C) 2010-2014 European Commission +C C This file is part of Program DMM C -C DMM is free software developed at the Joint Research Centre of the -C European Commission: you can redistribute it and/or modify it under +C DMM is free software developed at the Joint Research Centre of the +C European Commission: you can redistribute it and/or modify it under C the terms of the GNU General Public License as published by C the Free Software Foundation, either version 3 of the License, or C (at your option) any later version. @@ -30,392 +30,392 @@ C MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the C GNU General Public License for more details. C C You should have received a copy of the GNU General Public License -C along with DMM. If not, see <http://www.gnu.org/licenses/>. -C ------------------------------------------------------------------- - SUBROUTINE MENGWONG2(G,nobs,d,ny,nz,nx,nu,nv,ns,nstot,nt,np, - 1 INFOS,yk,gibpar,gibZ,thetaprior,psiprior, - 2 tipo,pdll,MLSTART,MLMW) - -C INPUT - INTEGER G,nobs,d(2),ny,nz,nx,nu,nv,ns(6),nstot,nt,np(3), - 1 INFOS(9,6),gibZ(G,nobs) - DOUBLE PRECISION yk(nobs,ny+nz),gibpar(G,nt+np(1)), - 1 thetaprior(nt,4),psiprior(np(2),np(3)),MLSTART - CHARACTER*2 tipo(nt) - POINTER (pdll,fittizia) - -C OUTPUT - DOUBLE PRECISION MLMW(2,2) - -C LOCALS - INTEGER NPAR,I,J,K,IG,NPOS(nt+np(1)),IFAIL,NQ,ISEQ,ISEQ0,SEQ(nv), - 1 IS(nobs,6),NIM,NI,IND(1),NPARTH,NN,NSI,II,JJ - DOUBLE PRECISION,ALLOCATABLE::MAT(:,:),VQN(:,:),VQD(:,:), - 1 VHN(:,:),VHD(:,:) - DOUBLE PRECISION parm(nt),SIGM(nt,nt), - 1 COM(nt+1,nt),ISIGM(nt,nt),par(nt+np(1)),SEGA(nt+np(1)), - 2 ub(nt),lb(nt),R3((nt+1)*(nt+2)/2),WORK(nt) - DOUBLE PRECISION,ALLOCATABLE:: PTR(:,:,:),PMAT(:,:),PE(:),GAM(:), - 1 ALPHA(:,:),MOM(:,:) - DOUBLE PRECISION P1(INFOS(8,1),INFOS(8,1)), - 1 P2(INFOS(8,2),INFOS(8,2)),P3(INFOS(8,3),INFOS(8,3)), - 2 P4(INFOS(8,4),INFOS(8,4)),P5(INFOS(8,5),INFOS(8,5)), - 3 P6(INFOS(8,6),INFOS(8,6)) - DOUBLE PRECISION Ppar(nt+np(1)),Fpar,PS,QS,QPSI,C,DET,TRC,A0 - DOUBLE PRECISION ERRM,ERR,U,AUX,INDC(1),MUC,SS(2,2),MWNUM,MWDEN - DOUBLE PRECISION ZERO,ONE,PI - DATA ZERO/0.0D0/,ONE/1.0D0/,PI/3.141592653589793D0/ - -C EXTERNAL SUBROUTINES - EXTERNAL NEWEYWESTCOV,NEWEYWESTCOV2,mvncdf,DPOTRF,DPOTRI,setgmn, - 1 genmn,gengam,DESIGNZ,PPROD,ERGODIC,INT2SEQ - -C EXTERNAL FUNCTIONS - DOUBLE PRECISION PTHETA2,PRIOR,PRIORDIR,genunf,gengam - - PAR(:) = GIBPAR(1,:) ! set constant values - NPARTH = 0 - DO I = 1,nt - IF (GIBPAR(1,I).NE.GIBPAR(2,I)) THEN - NPARTH = NPARTH + 1 - NPOS(NPARTH) = I - ENDIF - ENDDO - DO I = 1,np(1) - NPOS(NPARTH+I) = nt+I - ENDDO - NPAR=NPARTH+np(1) - Ppar(:) = 0.D0 - parm(:) = ZERO - DO I = 1,NPARTH - parm(I) = SUM(gibpar(:,NPOS(I)))/DFLOAT(G) - ENDDO - - NQ = 0 - CALL NEWEYWESTCOV2(G,NPARTH,NQ,gibpar(:,NPOS(1:NPARTH)), - 1 parm(1:NPARTH),SIGM(1:NPARTH,1:NPARTH)) ! THETA Var-covar - - IF (nv.GT.0) THEN - ALLOCATE(PTR(nobs,nstot,nstot),PMAT(nstot,nstot),PE(nstot)) - -C Transition prob for QS - DO I = 1,nstot-1 - PTR(1,I,1) = SUM(ABS(gibZ(1:G,1).EQ.I))/DFLOAT(G) - ENDDO - PTR(1,nstot,1) = ONE-SUM(PTR(1,1:nstot-1,1)) - - DO 50 K = 2,nobs - DO 50 I = 1,nstot-1 - DO 50 J = 1,nstot - COM(1,1) = SUM(ABS(gibZ(1:G,K-1).EQ.J)) - IF (COM(1,1).GT.ZERO) THEN - PTR(K,I,J) = SUM(ABS((gibZ(1:G,K).EQ.I).AND. - # (gibZ(1:G,K-1).EQ.J)))/COM(1,1) - ELSE - PTR(K,I,J) = ONE/DFLOAT(nstot) - ENDIF -50 PTR(K,nstot,J) = ONE-SUM(PTR(K,1:nstot-1,J)) - -C Mean and Var of PSI - ALLOCATE (ALPHA(np(2),np(3)),MOM(np(1),2)) - DO I=1,np(1) - MOM(I,1) = SUM(gibpar(:,nt+I))/DFLOAT(G) - MOM(I,2) = SUM(gibpar(:,nt+I)**2)/DFLOAT(G) - MOM(I,2) = MOM(I,2)-MOM(I,1)**2 - ENDDO -C Hyperparameters of Dirichelt for Q(PSI) -C Mothod of Moments: a0 = m1(1-m1)/V1+1, ai = mi*a0, i=1,2,..,N - NN = 0 - K = 0 - DO I = 1,nv - NSI = INFOS(8,I) ! # of states for S - IF (INFOS(9,I).EQ.1) THEN ! S~IID - A0 = MOM(NN+1,1)*(1.D0-MOM(NN+1,1))/MOM(NN+1,2)+1.D0 !alpha0 - DO ii = 1,NSI-1 - ALPHA(K+1,ii) = MOM(NN+ii,1)*A0 - ENDDO - ALPHA(K+1,NSI) = A0-SUM(ALPHA(K+1,1:NSI-1)) - K = K + 1 - NN = NN + NSI-1 - ELSEIF (INFOS(9,I).EQ.2) THEN ! S~Markov - DO jj = 1,NSI - A0 = MOM(NN+1,1)*(1.D0-MOM(NN+1,1))/MOM(NN+1,2)+1.D0 !alpha0 - DO ii = 1,NSI-1 - ALPHA(K+1,ii) = MOM(NN+ii,1)*A0 - ENDDO - ALPHA(K+1,NSI) = A0-SUM(ALPHA(K+1,1:NSI-1)) - K = K + 1 - NN = NN + NSI-1 - ENDDO - ENDIF - ENDDO - ENDIF -C Importance sampling -C Sample THIS from N(THHAT,SIGHAT) with boundaries -C Evaluate p(THIS) ~ N(THHAT,SIGHAT) - NIM = 1000000 - ERRM = 1.D-8 - -C Normalization constants TRC and TRCD - lb(1:NPARTH) = thetaprior(NPOS(1:NPARTH),3) - ub(1:NPARTH) = thetaprior(NPOS(1:NPARTH),4) - CALL mvncdf(lb(1:NPARTH),ub(1:NPARTH),parm(1:NPARTH), - 1 SIGM(1:NPARTH,1:NPARTH),NPARTH,ERRM,NIM,TRC,ERR,NI) - -C Inverse SIGM & det for NPARTH - COM(1:NPARTH,1:NPARTH) = SIGM(1:NPARTH,1:NPARTH) - IFAIL = -1 -C CALL F01ADF(NPARTH,COM(1:NPARTH+1,1:NPARTH),NPARTH+1,IFAIL) ! Inverse var-covar - CALL DPOTRF('L',NPARTH,COM(1:NPARTH,1:NPARTH),NPARTH,IFAIL) ! COM = L*L' - DET = 1.D0 ! det(SIGM) - DO I=1,NPARTH - DET = DET*COM(I,I)**2 - ENDDO - CALL DPOTRI('L',NPARTH,COM(1:NPARTH,1:NPARTH),NPARTH,IFAIL) ! COM = VV^-1 - - DO 60 I=1,NPARTH - ISIGM(I,I) = COM(I,I) - DO 60 J=1,I-1 - ISIGM(I,J) = COM(I,J) -60 ISIGM(J,I) = ISIGM(I,J) - -c COM(1:NPARTH,1:NPARTH) = SIGM(1:NPARTH,1:NPARTH) -c IFAIL = -1 -c CALL F03ABF(COM(1:NPARTH,1:NPARTH),NPARTH,NPARTH,DET, -c 1 WORK(1:NPARTH),IFAIL) - - C = (2.D0*PI)**(-.5D0*NPARTH)/DSQRT(DET) ! constant - - ALLOCATE (MAT(G,2),VHN(G,2),VHD(G,2),VQN(G,2),VQD(G,2)) - QS = ONE - PS = ONE - IS(:,:) = 1 - DO 200 IG = 1,G -C SAMPLING THETA - SEGA(:) = -1.D0 - IFAIL = -1 - IND(1) = 0 - INDC(1) = -1.D0 - DO WHILE (INDC(1).LT.ZERO) - INDC(1) = ZERO - IND(1) = IND(1) + 1 - IF (IND(1).GT.G) EXIT -c CALL G05EAF(parm(1:NPARTH),NPARTH,SIGM(1:NPARTH,1:NPARTH), -c 1 NPARTH,EPS,R3,(NPARTH+1)*(NPARTH+2)/2,IFAIL) -c CALL G05EZF(SEGA(1:NPARTH),NPARTH,R3,(NPARTH+1)*(NPARTH+2)/2, -c 1 IFAIL) - COM(1:NPARTH,1:NPARTH) = SIGM(1:NPARTH,1:NPARTH) - CALL setgmn(parm(1:NPARTH),COM(1:NPARTH,1:NPARTH),NPARTH, +C along with DMM. If not, see <http://www.gnu.org/licenses/>. +C ------------------------------------------------------------------- + SUBROUTINE MENGWONG2(G,nobs,d,ny,nz,nx,nu,nv,ns,nstot,nt,np, + 1 INFOS,yk,gibpar,gibZ,thetaprior,psiprior, + 2 tipo,pdll,MLSTART,MLMW) + +C INPUT + INTEGER G,nobs,d(2),ny,nz,nx,nu,nv,ns(6),nstot,nt,np(3), + 1 INFOS(9,6),gibZ(G,nobs) + DOUBLE PRECISION yk(nobs,ny+nz),gibpar(G,nt+np(1)), + 1 thetaprior(nt,4),psiprior(np(2),np(3)),MLSTART + CHARACTER*2 tipo(nt) + POINTER (pdll,fittizia) + +C OUTPUT + DOUBLE PRECISION MLMW(2,2) + +C LOCALS + INTEGER NPAR,I,J,K,IG,NPOS(nt+np(1)),IFAIL,NQ,ISEQ,ISEQ0,SEQ(nv), + 1 IS(nobs,6),NIM,NI,IND(1),NPARTH,NN,NSI,II,JJ + DOUBLE PRECISION,ALLOCATABLE::MAT(:,:),VQN(:,:),VQD(:,:), + 1 VHN(:,:),VHD(:,:) + DOUBLE PRECISION parm(nt),SIGM(nt,nt), + 1 COM(nt+1,nt),ISIGM(nt,nt),par(nt+np(1)),SEGA(nt+np(1)), + 2 ub(nt),lb(nt),R3((nt+1)*(nt+2)/2),WORK(nt) + DOUBLE PRECISION,ALLOCATABLE:: PTR(:,:,:),PMAT(:,:),PE(:),GAM(:), + 1 ALPHA(:,:),MOM(:,:) + DOUBLE PRECISION P1(INFOS(8,1),INFOS(8,1)), + 1 P2(INFOS(8,2),INFOS(8,2)),P3(INFOS(8,3),INFOS(8,3)), + 2 P4(INFOS(8,4),INFOS(8,4)),P5(INFOS(8,5),INFOS(8,5)), + 3 P6(INFOS(8,6),INFOS(8,6)) + DOUBLE PRECISION Ppar(nt+np(1)),Fpar,PS,QS,QPSI,C,DET,TRC,A0 + DOUBLE PRECISION ERRM,ERR,U,AUX,INDC(1),MUC,SS(2,2),MWNUM,MWDEN + DOUBLE PRECISION ZERO,ONE,PI + DATA ZERO/0.0D0/,ONE/1.0D0/,PI/3.141592653589793D0/ + +C EXTERNAL SUBROUTINES + EXTERNAL NEWEYWESTCOV,NEWEYWESTCOV2,mvncdf,DPOTRF,DPOTRI,setgmn, + 1 genmn,gengam,DESIGNZ,PPROD,ERGODIC,INT2SEQ + +C EXTERNAL FUNCTIONS + DOUBLE PRECISION PTHETA2,PRIOR,PRIORDIR,genunf,gengam + + PAR(:) = GIBPAR(1,:) ! set constant values + NPARTH = 0 + DO I = 1,nt + IF (GIBPAR(1,I).NE.GIBPAR(2,I)) THEN + NPARTH = NPARTH + 1 + NPOS(NPARTH) = I + ENDIF + ENDDO + DO I = 1,np(1) + NPOS(NPARTH+I) = nt+I + ENDDO + NPAR=NPARTH+np(1) + Ppar(:) = 0.D0 + parm(:) = ZERO + DO I = 1,NPARTH + parm(I) = SUM(gibpar(:,NPOS(I)))/DFLOAT(G) + ENDDO + + NQ = 0 + CALL NEWEYWESTCOV2(G,NPARTH,NQ,gibpar(:,NPOS(1:NPARTH)), + 1 parm(1:NPARTH),SIGM(1:NPARTH,1:NPARTH)) ! THETA Var-covar + + IF (nv.GT.0) THEN + ALLOCATE(PTR(nobs,nstot,nstot),PMAT(nstot,nstot),PE(nstot)) + +C Transition prob for QS + DO I = 1,nstot-1 + PTR(1,I,1) = SUM(ABS(gibZ(1:G,1).EQ.I))/DFLOAT(G) + ENDDO + PTR(1,nstot,1) = ONE-SUM(PTR(1,1:nstot-1,1)) + + DO 50 K = 2,nobs + DO 50 I = 1,nstot-1 + DO 50 J = 1,nstot + COM(1,1) = SUM(ABS(gibZ(1:G,K-1).EQ.J)) + IF (COM(1,1).GT.ZERO) THEN + PTR(K,I,J) = SUM(ABS((gibZ(1:G,K).EQ.I).AND. + # (gibZ(1:G,K-1).EQ.J)))/COM(1,1) + ELSE + PTR(K,I,J) = ONE/DFLOAT(nstot) + ENDIF +50 PTR(K,nstot,J) = ONE-SUM(PTR(K,1:nstot-1,J)) + +C Mean and Var of PSI + ALLOCATE (ALPHA(np(2),np(3)),MOM(np(1),2)) + DO I=1,np(1) + MOM(I,1) = SUM(gibpar(:,nt+I))/DFLOAT(G) + MOM(I,2) = SUM(gibpar(:,nt+I)**2)/DFLOAT(G) + MOM(I,2) = MOM(I,2)-MOM(I,1)**2 + ENDDO +C Hyperparameters of Dirichelt for Q(PSI) +C Mothod of Moments: a0 = m1(1-m1)/V1+1, ai = mi*a0, i=1,2,..,N + NN = 0 + K = 0 + DO I = 1,nv + NSI = INFOS(8,I) ! # of states for S + IF (INFOS(9,I).EQ.1) THEN ! S~IID + A0 = MOM(NN+1,1)*(1.D0-MOM(NN+1,1))/MOM(NN+1,2)+1.D0 !alpha0 + DO ii = 1,NSI-1 + ALPHA(K+1,ii) = MOM(NN+ii,1)*A0 + ENDDO + ALPHA(K+1,NSI) = A0-SUM(ALPHA(K+1,1:NSI-1)) + K = K + 1 + NN = NN + NSI-1 + ELSEIF (INFOS(9,I).EQ.2) THEN ! S~Markov + DO jj = 1,NSI + A0 = MOM(NN+1,1)*(1.D0-MOM(NN+1,1))/MOM(NN+1,2)+1.D0 !alpha0 + DO ii = 1,NSI-1 + ALPHA(K+1,ii) = MOM(NN+ii,1)*A0 + ENDDO + ALPHA(K+1,NSI) = A0-SUM(ALPHA(K+1,1:NSI-1)) + K = K + 1 + NN = NN + NSI-1 + ENDDO + ENDIF + ENDDO + ENDIF +C Importance sampling +C Sample THIS from N(THHAT,SIGHAT) with boundaries +C Evaluate p(THIS) ~ N(THHAT,SIGHAT) + NIM = 1000000 + ERRM = 1.D-8 + +C Normalization constants TRC and TRCD + lb(1:NPARTH) = thetaprior(NPOS(1:NPARTH),3) + ub(1:NPARTH) = thetaprior(NPOS(1:NPARTH),4) + CALL mvncdf(lb(1:NPARTH),ub(1:NPARTH),parm(1:NPARTH), + 1 SIGM(1:NPARTH,1:NPARTH),NPARTH,ERRM,NIM,TRC,ERR,NI) + +C Inverse SIGM & det for NPARTH + COM(1:NPARTH,1:NPARTH) = SIGM(1:NPARTH,1:NPARTH) + IFAIL = -1 +C CALL F01ADF(NPARTH,COM(1:NPARTH+1,1:NPARTH),NPARTH+1,IFAIL) ! Inverse var-covar + CALL DPOTRF('L',NPARTH,COM(1:NPARTH,1:NPARTH),NPARTH,IFAIL) ! COM = L*L' + DET = 1.D0 ! det(SIGM) + DO I=1,NPARTH + DET = DET*COM(I,I)**2 + ENDDO + CALL DPOTRI('L',NPARTH,COM(1:NPARTH,1:NPARTH),NPARTH,IFAIL) ! COM = VV^-1 + + DO 60 I=1,NPARTH + ISIGM(I,I) = COM(I,I) + DO 60 J=1,I-1 + ISIGM(I,J) = COM(I,J) +60 ISIGM(J,I) = ISIGM(I,J) + +c COM(1:NPARTH,1:NPARTH) = SIGM(1:NPARTH,1:NPARTH) +c IFAIL = -1 +c CALL F03ABF(COM(1:NPARTH,1:NPARTH),NPARTH,NPARTH,DET, +c 1 WORK(1:NPARTH),IFAIL) + + C = (2.D0*PI)**(-.5D0*NPARTH)/DSQRT(DET) ! constant + + ALLOCATE (MAT(G,2),VHN(G,2),VHD(G,2),VQN(G,2),VQD(G,2)) + QS = ONE + PS = ONE + IS(:,:) = 1 + DO 200 IG = 1,G +C SAMPLING THETA + SEGA(:) = -1.D0 + IFAIL = -1 + IND(1) = 0 + INDC(1) = -1.D0 + DO WHILE (INDC(1).LT.ZERO) + INDC(1) = ZERO + IND(1) = IND(1) + 1 + IF (IND(1).GT.G) EXIT +c CALL G05EAF(parm(1:NPARTH),NPARTH,SIGM(1:NPARTH,1:NPARTH), +c 1 NPARTH,EPS,R3,(NPARTH+1)*(NPARTH+2)/2,IFAIL) +c CALL G05EZF(SEGA(1:NPARTH),NPARTH,R3,(NPARTH+1)*(NPARTH+2)/2, +c 1 IFAIL) + COM(1:NPARTH,1:NPARTH) = SIGM(1:NPARTH,1:NPARTH) + CALL setgmn(parm(1:NPARTH),COM(1:NPARTH,1:NPARTH),NPARTH, 1 NPARTH,R3(1:(NPARTH+2)*(NPARTH+1)/2)) - CALL genmn(R3(1:(NPARTH+2)*(NPARTH+1)/2),SEGA(1:NPARTH), - 1 WORK(1:NPARTH)) - DO I=1,NPARTH - IF (SEGA(I).LT.thetaprior(NPOS(I),3)) INDC(1)=-1 - IF (SEGA(I).GT.thetaprior(NPOS(I),4)) INDC(1)=-2 - ENDDO - END DO -C SAMPLING PSI from Dirichlet(ALPHA) - NN = NPARTH - K = 0 - DO 70 I = 1,nv - NSI = INFOS(8,I) ! # of states for SI - ALLOCATE(GAM(NSI)) - IF (INFOS(9,I).EQ.1) THEN ! S~IID - DO ii = 1,NSI - IFAIL = -1 -C CALL G05FFF(ALPHA(K+1,ii),1.D0,1,GAM(ii),IFAIL) - GAM(ii) = gengam(1.D0,ALPHA(K+1,ii)) - ENDDO - SEGA(NN+1:NN+NSI-1) = GAM(1:NSI-1)/SUM(GAM(1:NSI)) - K = K + 1 - NN = NN + NSI-1 - ELSEIF (INFOS(9,I).EQ.2) THEN ! S~Markov - DO jj = 1,NSI - DO ii = 1,NSI - IFAIL = -1 -C CALL G05FFF(ALPHA(K+1,ii),1.D0,1,GAM(ii),IFAIL) - GAM(ii) = gengam(1.D0,ALPHA(K+1,ii)) - ENDDO - SEGA(NN+1:NN+NSI-1) = GAM(1:NSI-1)/SUM(GAM(1:NSI)) - K = K + 1 - NN = NN + NSI-1 - ENDDO - ENDIF -70 DEALLOCATE(GAM) - -C SAMPLING S - IF (nv.GT.0) THEN - CALL DESIGNZ(nv,np(1),SEGA(NPARTH+1:NPAR),INFOS, - 1 P1,P2,P3,P4,P5,P6) -C PMAT(i,j) = Pr[Z(t+1)=i|Z(t)=j], Z = S1 x S2 x ... x Snv - CALL PPROD(nv,nstot,INFOS,P1,P2,P3,P4,P5,P6,PMAT) -C ERGODIC solves PE: PE*(I-P') = 0 - CALL ERGODIC(nstot,PMAT,PE) -C S(1) -C U = G05CAF(U) ! Sampling from U(0,1) - U = genunf(0.D0,1.D0) - ISEQ = 1 - AUX = PTR(1,ISEQ,1) - DO 80 WHILE (AUX.LT.U) - ISEQ = ISEQ + 1 -80 AUX = AUX + PTR(1,ISEQ,1) - CALL INT2SEQ(ISEQ,nv,INFOS,SEQ,IS(1,:)) - QS = PTR(1,ISEQ,1) - PS = PE(ISEQ) ! P(S1) - ISEQ0 = ISEQ -C S(2),...,S(nobs) - DO 90 K = 2,nobs -C U = G05CAF(U) ! Sampling from U(0,1) - U = genunf(0.D0,1.D0) - ISEQ = 1 - AUX = PTR(K,ISEQ,ISEQ0) - DO 85 WHILE (AUX.LT.U) - ISEQ = ISEQ + 1 -85 AUX = AUX + PTR(K,ISEQ,ISEQ0) - CALL INT2SEQ(ISEQ,nv,INFOS,SEQ,IS(K,:)) - QS = QS*PTR(K,ISEQ,ISEQ0) - PS = PS*PMAT(ISEQ,ISEQ0) -90 ISEQ0 = ISEQ - ENDIF - -C QUADRATIC FORM FOR for THETA - DO 91 I = 1,NPARTH -91 COM(I,1) = SUM((SEGA(1:NPARTH)-parm(1:NPARTH))*ISIGM(1:NPARTH,I)) - MUC = SUM(COM(1:NPARTH,1)*(SEGA(1:NPARTH)-parm(1:NPARTH))) - -C VQN(IG,1) = QS*C*DEXP(-.5D0*MUC)/TRC - - par(NPOS(1:NPARTH+np(1))) = SEGA(1:NPARTH+np(1)) ! (THETA,PSI) - -C PRIOR for THETA - DO 92 I = 2,NPARTH -92 Ppar(I) = PRIOR(par(NPOS(I)),thetaprior(NPOS(I),:),tipo(NPOS(I))) - -C PRIOR for PSI and Q(PSI)~Dirichlet(a1,a2,...,aN) - QPSI = 0.D0 - NN = NPARTH - K = 0 - DO 100 J = 1,nv - NSI = INFOS(8,J) - IF(INFOS(9,J).EQ.1) THEN ! S~IID - Ppar(NPARTH+K+1) = PRIORDIR(par(NPOS(NN+1:NN+NSI-1)), - 1 psiprior(K+1,1:NSI),NSI) - QPSI = QPSI+PRIORDIR(par(NPOS(NN+1:NN+NSI-1)), - 1 ALPHA(K+1,1:NSI),NSI) - K = K + 1 - NN = NN + NSI-1 - ELSEIF(INFOS(9,J).EQ.2) THEN ! S~Markov - DO 99 I = 1,NSI - Ppar(NPARTH+K+1) = PRIORDIR(par(NPOS(NN+1:NN+NSI-1)), - 1 psiprior(K+1,1:NSI),NSI) - QPSI = QPSI+PRIORDIR(par(NPOS(NN+1:NN+NSI-1)), - 1 ALPHA(K+1,1:NSI),NSI) - K = K + 1 -99 NN = NN + NSI-1 - ENDIF -100 CONTINUE - - Fpar = PTHETA2(NPOS(1),nobs,d,ny,nz,nx,nu,ns,nt,IS,yk, - 1 par(1:nt),thetaprior(NPOS(1),:), - 2 tipo(NPOS(1)),pdll) - Fpar = Fpar + SUM(Ppar(2:NPARTH+K)) ! log f(y|par,S)f(par,S) - - VQN(IG,1) = DEXP(QPSI)*QS*C*DEXP(-.5D0*MUC)/TRC - -200 VHN(IG,1) = Fpar + DLOG(PS) - -C --------------------- -C Meng-Wong denominator -C --------------------- - QS = ONE - PS = ONE - DO 400 IG = 1,G - IF (nv.GT.0) THEN - CALL DESIGNZ(nv,np(1),gibpar(IG,nt+1:nt+np(1)),INFOS, - 1 P1,P2,P3,P4,P5,P6) -C PMAT(i,j) = Pr[Z(t+1)=i|Z(t)=j], Z = S1 x S2 x ... x Snv - CALL PPROD(nv,nstot,INFOS,P1,P2,P3,P4,P5,P6,PMAT) -C ERGODIC solves PE: PE*(I-P') = 0 - CALL ERGODIC(nstot,PMAT,PE) - - QS = PTR(1,gibZ(IG,1),1) - PS = PE(gibZ(IG,1)) - CALL INT2SEQ(gibZ(IG,1),nv,INFOS,SEQ,IS(1,:)) - DO 210 K = 2,nobs - QS = QS*PTR(K,gibZ(IG,K),gibZ(IG,K-1)) - PS = PS*PMAT(gibZ(IG,K),gibZ(IG,K-1)) -210 CALL INT2SEQ(gibZ(IG,K),nv,INFOS,SEQ,IS(K,:)) - ENDIF - -C PRIOR for THETA - DO 310 I = 2,NPARTH -310 Ppar(I) = PRIOR(gibpar(IG,NPOS(I)),thetaprior(NPOS(I),:), - 1 tipo(NPOS(I))) - -C PRIOR for PSI and Q(PSI)~Dirichlet(a1,a2,...,aN) - QPSI = 0.D0 - NN = NPARTH - K = 0 - DO 305 J = 1,nv - NSI = INFOS(8,J) - IF(INFOS(9,J).EQ.1) THEN ! S~IID - Ppar(NPARTH+K+1) = PRIORDIR(gibpar(IG,NPOS(NN+1:NN+NSI-1)), - 1 psiprior(K+1,1:NSI),NSI) - QPSI = QPSI+PRIORDIR(gibpar(IG,NPOS(NN+1:NN+NSI-1)), - 1 ALPHA(K+1,1:NSI),NSI) - K = K + 1 - NN = NN + NSI-1 - ELSEIF(INFOS(9,J).EQ.2) THEN ! S~Markov - DO 304 I = 1,NSI - Ppar(NPARTH+K+1) = PRIORDIR(gibpar(IG,NPOS(NN+1:NN+NSI-1)), - 1 psiprior(K+1,1:NSI),NSI) - QPSI = QPSI+PRIORDIR(gibpar(IG,NPOS(NN+1:NN+NSI-1)), - 1 ALPHA(K+1,1:NSI),NSI) - K = K + 1 -304 NN = NN + NSI-1 - ENDIF -305 CONTINUE - - Fpar = PTHETA2(NPOS(1),nobs,d,ny,nz,nx,nu,ns,nt,IS,yk, - 1 gibpar(IG,1:nt),thetaprior(NPOS(1),:), - 2 tipo(NPOS(1)),pdll) - Fpar = Fpar + SUM(Ppar(2:NPARTH+K)) ! log f(y|par,S)f(par,S) - - VHD(IG,1) = Fpar + DLOG(PS) - - COM(:,1) = ZERO - DO 320 I = 1,NPARTH -320 COM(I,1) = SUM((gibpar(IG,NPOS(1:NPARTH))-parm(1:NPARTH)) - # * ISIGM(1:NPARTH,I)) - MUC = SUM(COM(1:NPARTH,1)*(gibpar(IG,NPOS(1:NPARTH)) - # - parm(1:NPARTH))) - - VQD(IG,1) = DEXP(QPSI)*QS*DEXP(-.5D0*MUC)*C/TRC -400 CONTINUE - - IND = MAXLOC(VHN(:,1)) - DET = VHN(IND(1),1) - - MAT(:,1) = DEXP(VHN(:,1)-DET)/(DEXP(VHN(:,1)-MLSTART)+VQN(:,1)) - MAT(:,2) = VQD(:,1)/(DEXP(VHD(:,1)-MLSTART)+VQD(:,1)) - - CALL NEWEYWESTCOV(G,2,1,MAT(:,1:2),SS) - MLMW(2,1) = SUM(MAT(:,1))/SUM(MAT(:,2)) - MLMW(1,1) = DLOG(MLMW(2,1)) + DET - MLMW(1:2,2) = SS(1,1)*G/SUM(MAT(:,1))**2 + - + SS(2,2)*G/SUM(MAT(:,2))**2 + - + - 2.D0*SS(1,2)*G/(SUM(MAT(:,1))*SUM(MAT(:,2))) - - MLMW(2,1) = MLMW(1,1) ! log scale - DO 500 I=1,10 - MWNUM = SUM(DEXP(VHN(:,1)-DET) - 1 / (DEXP(VHN(:,1)-MLMW(2,1))+VQN(:,1))) - MWDEN = SUM(VQD(:,1)/(DEXP(VHD(:,1)-MLMW(2,1))+VQD(:,1))) - MLMW(2,1) = DLOG(MWNUM/MWDEN) + DET ! log-scale -500 CONTINUE - - DEALLOCATE (MAT,VHN,VHD,VQN,VQD) - IF (nv.GT.0) DEALLOCATE (PTR,PMAT,PE,ALPHA,MOM) - - RETURN + CALL genmn(R3(1:(NPARTH+2)*(NPARTH+1)/2),SEGA(1:NPARTH), + 1 WORK(1:NPARTH)) + DO I=1,NPARTH + IF (SEGA(I).LT.thetaprior(NPOS(I),3)) INDC(1)=-1 + IF (SEGA(I).GT.thetaprior(NPOS(I),4)) INDC(1)=-2 + ENDDO + END DO +C SAMPLING PSI from Dirichlet(ALPHA) + NN = NPARTH + K = 0 + DO 70 I = 1,nv + NSI = INFOS(8,I) ! # of states for SI + ALLOCATE(GAM(NSI)) + IF (INFOS(9,I).EQ.1) THEN ! S~IID + DO ii = 1,NSI + IFAIL = -1 +C CALL G05FFF(ALPHA(K+1,ii),1.D0,1,GAM(ii),IFAIL) + GAM(ii) = gengam(1.D0,ALPHA(K+1,ii)) + ENDDO + SEGA(NN+1:NN+NSI-1) = GAM(1:NSI-1)/SUM(GAM(1:NSI)) + K = K + 1 + NN = NN + NSI-1 + ELSEIF (INFOS(9,I).EQ.2) THEN ! S~Markov + DO jj = 1,NSI + DO ii = 1,NSI + IFAIL = -1 +C CALL G05FFF(ALPHA(K+1,ii),1.D0,1,GAM(ii),IFAIL) + GAM(ii) = gengam(1.D0,ALPHA(K+1,ii)) + ENDDO + SEGA(NN+1:NN+NSI-1) = GAM(1:NSI-1)/SUM(GAM(1:NSI)) + K = K + 1 + NN = NN + NSI-1 + ENDDO + ENDIF +70 DEALLOCATE(GAM) + +C SAMPLING S + IF (nv.GT.0) THEN + CALL DESIGNZ(nv,np(1),SEGA(NPARTH+1:NPAR),INFOS, + 1 P1,P2,P3,P4,P5,P6) +C PMAT(i,j) = Pr[Z(t+1)=i|Z(t)=j], Z = S1 x S2 x ... x Snv + CALL PPROD(nv,nstot,INFOS,P1,P2,P3,P4,P5,P6,PMAT) +C ERGODIC solves PE: PE*(I-P') = 0 + CALL ERGODIC(nstot,PMAT,PE) +C S(1) +C U = G05CAF(U) ! Sampling from U(0,1) + U = genunf(0.D0,1.D0) + ISEQ = 1 + AUX = PTR(1,ISEQ,1) + DO 80 WHILE (AUX.LT.U) + ISEQ = ISEQ + 1 +80 AUX = AUX + PTR(1,ISEQ,1) + CALL INT2SEQ(ISEQ,nv,INFOS,SEQ,IS(1,:)) + QS = PTR(1,ISEQ,1) + PS = PE(ISEQ) ! P(S1) + ISEQ0 = ISEQ +C S(2),...,S(nobs) + DO 90 K = 2,nobs +C U = G05CAF(U) ! Sampling from U(0,1) + U = genunf(0.D0,1.D0) + ISEQ = 1 + AUX = PTR(K,ISEQ,ISEQ0) + DO 85 WHILE (AUX.LT.U) + ISEQ = ISEQ + 1 +85 AUX = AUX + PTR(K,ISEQ,ISEQ0) + CALL INT2SEQ(ISEQ,nv,INFOS,SEQ,IS(K,:)) + QS = QS*PTR(K,ISEQ,ISEQ0) + PS = PS*PMAT(ISEQ,ISEQ0) +90 ISEQ0 = ISEQ + ENDIF + +C QUADRATIC FORM FOR for THETA + DO 91 I = 1,NPARTH +91 COM(I,1) = SUM((SEGA(1:NPARTH)-parm(1:NPARTH))*ISIGM(1:NPARTH,I)) + MUC = SUM(COM(1:NPARTH,1)*(SEGA(1:NPARTH)-parm(1:NPARTH))) + +C VQN(IG,1) = QS*C*DEXP(-.5D0*MUC)/TRC + + par(NPOS(1:NPARTH+np(1))) = SEGA(1:NPARTH+np(1)) ! (THETA,PSI) + +C PRIOR for THETA + DO 92 I = 2,NPARTH +92 Ppar(I) = PRIOR(par(NPOS(I)),thetaprior(NPOS(I),:),tipo(NPOS(I))) + +C PRIOR for PSI and Q(PSI)~Dirichlet(a1,a2,...,aN) + QPSI = 0.D0 + NN = NPARTH + K = 0 + DO 100 J = 1,nv + NSI = INFOS(8,J) + IF(INFOS(9,J).EQ.1) THEN ! S~IID + Ppar(NPARTH+K+1) = PRIORDIR(par(NPOS(NN+1:NN+NSI-1)), + 1 psiprior(K+1,1:NSI),NSI) + QPSI = QPSI+PRIORDIR(par(NPOS(NN+1:NN+NSI-1)), + 1 ALPHA(K+1,1:NSI),NSI) + K = K + 1 + NN = NN + NSI-1 + ELSEIF(INFOS(9,J).EQ.2) THEN ! S~Markov + DO 99 I = 1,NSI + Ppar(NPARTH+K+1) = PRIORDIR(par(NPOS(NN+1:NN+NSI-1)), + 1 psiprior(K+1,1:NSI),NSI) + QPSI = QPSI+PRIORDIR(par(NPOS(NN+1:NN+NSI-1)), + 1 ALPHA(K+1,1:NSI),NSI) + K = K + 1 +99 NN = NN + NSI-1 + ENDIF +100 CONTINUE + + Fpar = PTHETA2(NPOS(1),nobs,d,ny,nz,nx,nu,ns,nt,IS,yk, + 1 par(1:nt),thetaprior(NPOS(1),:), + 2 tipo(NPOS(1)),pdll) + Fpar = Fpar + SUM(Ppar(2:NPARTH+K)) ! log f(y|par,S)f(par,S) + + VQN(IG,1) = DEXP(QPSI)*QS*C*DEXP(-.5D0*MUC)/TRC + +200 VHN(IG,1) = Fpar + DLOG(PS) + +C --------------------- +C Meng-Wong denominator +C --------------------- + QS = ONE + PS = ONE + DO 400 IG = 1,G + IF (nv.GT.0) THEN + CALL DESIGNZ(nv,np(1),gibpar(IG,nt+1:nt+np(1)),INFOS, + 1 P1,P2,P3,P4,P5,P6) +C PMAT(i,j) = Pr[Z(t+1)=i|Z(t)=j], Z = S1 x S2 x ... x Snv + CALL PPROD(nv,nstot,INFOS,P1,P2,P3,P4,P5,P6,PMAT) +C ERGODIC solves PE: PE*(I-P') = 0 + CALL ERGODIC(nstot,PMAT,PE) + + QS = PTR(1,gibZ(IG,1),1) + PS = PE(gibZ(IG,1)) + CALL INT2SEQ(gibZ(IG,1),nv,INFOS,SEQ,IS(1,:)) + DO 210 K = 2,nobs + QS = QS*PTR(K,gibZ(IG,K),gibZ(IG,K-1)) + PS = PS*PMAT(gibZ(IG,K),gibZ(IG,K-1)) +210 CALL INT2SEQ(gibZ(IG,K),nv,INFOS,SEQ,IS(K,:)) + ENDIF + +C PRIOR for THETA + DO 310 I = 2,NPARTH +310 Ppar(I) = PRIOR(gibpar(IG,NPOS(I)),thetaprior(NPOS(I),:), + 1 tipo(NPOS(I))) + +C PRIOR for PSI and Q(PSI)~Dirichlet(a1,a2,...,aN) + QPSI = 0.D0 + NN = NPARTH + K = 0 + DO 305 J = 1,nv + NSI = INFOS(8,J) + IF(INFOS(9,J).EQ.1) THEN ! S~IID + Ppar(NPARTH+K+1) = PRIORDIR(gibpar(IG,NPOS(NN+1:NN+NSI-1)), + 1 psiprior(K+1,1:NSI),NSI) + QPSI = QPSI+PRIORDIR(gibpar(IG,NPOS(NN+1:NN+NSI-1)), + 1 ALPHA(K+1,1:NSI),NSI) + K = K + 1 + NN = NN + NSI-1 + ELSEIF(INFOS(9,J).EQ.2) THEN ! S~Markov + DO 304 I = 1,NSI + Ppar(NPARTH+K+1) = PRIORDIR(gibpar(IG,NPOS(NN+1:NN+NSI-1)), + 1 psiprior(K+1,1:NSI),NSI) + QPSI = QPSI+PRIORDIR(gibpar(IG,NPOS(NN+1:NN+NSI-1)), + 1 ALPHA(K+1,1:NSI),NSI) + K = K + 1 +304 NN = NN + NSI-1 + ENDIF +305 CONTINUE + + Fpar = PTHETA2(NPOS(1),nobs,d,ny,nz,nx,nu,ns,nt,IS,yk, + 1 gibpar(IG,1:nt),thetaprior(NPOS(1),:), + 2 tipo(NPOS(1)),pdll) + Fpar = Fpar + SUM(Ppar(2:NPARTH+K)) ! log f(y|par,S)f(par,S) + + VHD(IG,1) = Fpar + DLOG(PS) + + COM(:,1) = ZERO + DO 320 I = 1,NPARTH +320 COM(I,1) = SUM((gibpar(IG,NPOS(1:NPARTH))-parm(1:NPARTH)) + # * ISIGM(1:NPARTH,I)) + MUC = SUM(COM(1:NPARTH,1)*(gibpar(IG,NPOS(1:NPARTH)) + # - parm(1:NPARTH))) + + VQD(IG,1) = DEXP(QPSI)*QS*DEXP(-.5D0*MUC)*C/TRC +400 CONTINUE + + IND = MAXLOC(VHN(:,1)) + DET = VHN(IND(1),1) + + MAT(:,1) = DEXP(VHN(:,1)-DET)/(DEXP(VHN(:,1)-MLSTART)+VQN(:,1)) + MAT(:,2) = VQD(:,1)/(DEXP(VHD(:,1)-MLSTART)+VQD(:,1)) + + CALL NEWEYWESTCOV(G,2,1,MAT(:,1:2),SS) + MLMW(2,1) = SUM(MAT(:,1))/SUM(MAT(:,2)) + MLMW(1,1) = DLOG(MLMW(2,1)) + DET + MLMW(1:2,2) = SS(1,1)*G/SUM(MAT(:,1))**2 + + + SS(2,2)*G/SUM(MAT(:,2))**2 + + + - 2.D0*SS(1,2)*G/(SUM(MAT(:,1))*SUM(MAT(:,2))) + + MLMW(2,1) = MLMW(1,1) ! log scale + DO 500 I=1,10 + MWNUM = SUM(DEXP(VHN(:,1)-DET) + 1 / (DEXP(VHN(:,1)-MLMW(2,1))+VQN(:,1))) + MWDEN = SUM(VQD(:,1)/(DEXP(VHD(:,1)-MLMW(2,1))+VQD(:,1))) + MLMW(2,1) = DLOG(MWNUM/MWDEN) + DET ! log-scale +500 CONTINUE + + DEALLOCATE (MAT,VHN,VHD,VQN,VQD) + IF (nv.GT.0) DEALLOCATE (PTR,PMAT,PE,ALPHA,MOM) + + RETURN END diff --git a/missing.for b/missing.for index 60aa72dabc6c03696ae740e3bf0c5dee005bf5eb..e7dfacdd23af6a2b51637b50a7c0e7502c9fe81a 100644 --- a/missing.for +++ b/missing.for @@ -1,13 +1,13 @@ -C -------------------------------------------------------------------- -C MISSING Simulates missing observations -C Developed by A.Rossi, C.Planas and G.Fiorentini -C -C Copyright (C) 2010-2014 European Commission -C +C -------------------------------------------------------------------- +C MISSING Simulates missing observations +C Developed by A.Rossi, C.Planas and G.Fiorentini +C +C Copyright (C) 2010-2014 European Commission +C C This file is part of Program DMM C -C DMM is free software developed at the Joint Research Centre of the -C European Commission: you can redistribute it and/or modify it under +C DMM is free software developed at the Joint Research Centre of the +C European Commission: you can redistribute it and/or modify it under C the terms of the GNU General Public License as published by C the Free Software Foundation, either version 3 of the License, or C (at your option) any later version. @@ -18,65 +18,65 @@ C MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the C GNU General Public License for more details. C C You should have received a copy of the GNU General Public License -C along with DMM. If not, see <http://www.gnu.org/licenses/>. -C -------------------------------------------------------------------- - SUBROUTINE MISSING(yk,ny,nz,nx,nu,ns,nt,nmis,theta,S,STATE,pdll,ykmis) - - USE dfwin - INTERFACE - SUBROUTINE DESIGN(ny,nz,nx,nu,ns,nt,theta,c,H,G,a,F,R) - INTEGER ny,nz,nx,nu,ns(6),nt - DOUBLE PRECISION theta(nt) - DOUBLE PRECISION c(ny,max(1,nz),ns(1)),H(ny,nx,ns(2)), - 1 G(ny,nu,ns(3)),a(nx,ns(4)),F(nx,nx,ns(5)),R(nx,nu,ns(6)) - END SUBROUTINE - END INTERFACE - CHARACTER*1 fittizia - POINTER (pdll,fittizia) - POINTER (pdesign,DESIGN) - -C INPUT - INTEGER ny,nz,nx,nu,nt,ns(6),nmis - DOUBLE PRECISION yk(ny+nz),theta(nt),STATE(nx) - -C OUTPUT - DOUBLE PRECISION ykmis(nmis) -C LOCALS - INTEGER S(6),I,J,K,IFAIL,NIYK(ny) - DOUBLE PRECISION U(nu) - DOUBLE PRECISION gennor - DOUBLE PRECISION,ALLOCATABLE::R(:,:,:),c(:,:,:),H(:,:,:), - 1 G(:,:,:),a(:,:),F(:,:,:) - - ALLOCATE(R(nx,nu,ns(6)),c(ny,max(nz,1),ns(1)),H(ny,nx,ns(2)), - 1 G(ny,nu,ns(3)),a(nx,ns(4)),F(nx,nx,ns(5))) - pdesign = getprocaddress(pdll, "design_"C) - CALL DESIGN(ny,nz,nx,nu,ns,nt,theta,c,H,G,a,F,R) - -C NIYK = not(IYK) - K = 0 - DO 10 J = 1,ny - IF(yk(J).EQ.-99999.D0) THEN - K = K+1 - NIYK(K) = J -10 ENDIF - -C SAMPLING U - IFAIL = -1 - U(1:nu) = 0.D0 - DO 20 I = 1,nu -c CALL G05EAF(U(I),1,1.D0,1,1.D-14,WORKU,3,IFAIL) -c20 CALL G05EZF(U(I),1,WORKU,3,IFAIL) -20 U(I) = gennor(0.D0,1.D0) - - -C DRAW yk ~ f(yk|x,S,zk,theta) - DO 30 I = 1,nmis -30 ykmis(I) = SUM(c(NIYK(I),1:nz,S(1))*yk(ny+1:ny+nz)) - + + SUM(H(NIYK(I),1:nx,S(2))*STATE(1:nx)) - + + SUM(G(NIYK(I),1:nu,S(3))*U(1:nu)) - - DEALLOCATE (R,c,H,G,a,F) - - RETURN +C along with DMM. If not, see <http://www.gnu.org/licenses/>. +C -------------------------------------------------------------------- + SUBROUTINE MISSING(yk,ny,nz,nx,nu,ns,nt,nmis,theta,S,STATE,pdll,ykmis) + + USE dfwin + INTERFACE + SUBROUTINE DESIGN(ny,nz,nx,nu,ns,nt,theta,c,H,G,a,F,R) + INTEGER ny,nz,nx,nu,ns(6),nt + DOUBLE PRECISION theta(nt) + DOUBLE PRECISION c(ny,max(1,nz),ns(1)),H(ny,nx,ns(2)), + 1 G(ny,nu,ns(3)),a(nx,ns(4)),F(nx,nx,ns(5)),R(nx,nu,ns(6)) + END SUBROUTINE + END INTERFACE + CHARACTER*1 fittizia + POINTER (pdll,fittizia) + POINTER (pdesign,DESIGN) + +C INPUT + INTEGER ny,nz,nx,nu,nt,ns(6),nmis + DOUBLE PRECISION yk(ny+nz),theta(nt),STATE(nx) + +C OUTPUT + DOUBLE PRECISION ykmis(nmis) +C LOCALS + INTEGER S(6),I,J,K,IFAIL,NIYK(ny) + DOUBLE PRECISION U(nu) + DOUBLE PRECISION gennor + DOUBLE PRECISION,ALLOCATABLE::R(:,:,:),c(:,:,:),H(:,:,:), + 1 G(:,:,:),a(:,:),F(:,:,:) + + ALLOCATE(R(nx,nu,ns(6)),c(ny,max(nz,1),ns(1)),H(ny,nx,ns(2)), + 1 G(ny,nu,ns(3)),a(nx,ns(4)),F(nx,nx,ns(5))) + pdesign = getprocaddress(pdll, "design_"C) + CALL DESIGN(ny,nz,nx,nu,ns,nt,theta,c,H,G,a,F,R) + +C NIYK = not(IYK) + K = 0 + DO 10 J = 1,ny + IF(yk(J).EQ.-99999.D0) THEN + K = K+1 + NIYK(K) = J +10 ENDIF + +C SAMPLING U + IFAIL = -1 + U(1:nu) = 0.D0 + DO 20 I = 1,nu +c CALL G05EAF(U(I),1,1.D0,1,1.D-14,WORKU,3,IFAIL) +c20 CALL G05EZF(U(I),1,WORKU,3,IFAIL) +20 U(I) = gennor(0.D0,1.D0) + + +C DRAW yk ~ f(yk|x,S,zk,theta) + DO 30 I = 1,nmis +30 ykmis(I) = SUM(c(NIYK(I),1:nz,S(1))*yk(ny+1:ny+nz)) + + + SUM(H(NIYK(I),1:nx,S(2))*STATE(1:nx)) + + + SUM(G(NIYK(I),1:nu,S(3))*U(1:nu)) + + DEALLOCATE (R,c,H,G,a,F) + + RETURN END diff --git a/ml.for b/ml.for index c3c9afbbbcecef0a13c60dd56ccd0e6346e34016..b419f460c65c0356b44934a92aa3782de6175094 100644 --- a/ml.for +++ b/ml.for @@ -1,27 +1,27 @@ -C -------------------------------------------------------------------- -C ML estimates model parameters theta by maximum likelihood -C Developed by A.Rossi, C.Planas and G.Fiorentini -C -C State-space format: y(t) = c(t)z(t) + H(t)x(t) + G(t)u(t) -C x(t) = a(t) + F(t)x(t-1) + R(t)u(t) -C -C y(t) (ny x 1) ny = # of endogenous series -C z(t) (nz x 1) nz = # of exogenous series -C x(t) (nx x 1) nx = # of continous states -C u(t) (nu x 1) nu = # of shocks -C c(t) (ny x nz x ns1) ns1 = # of states for c(t) -C H(t) (ny x nx x ns2) ns2 = # of states for S2(t) -C G(t) (ny x nu x ns3) ns3 = # of states for S3(t) -C a(t) (nx x ns4) ns4 = # of states for S4(t) -C F(t) (nx x nx x ns5) ns5 = # of states for S5(t) -C R(t) (nx x nu x ns6) ns6 = # of states for S6(t) -C -C Copyright (C) 2010-2014 European Commission -C +C -------------------------------------------------------------------- +C ML estimates model parameters theta by maximum likelihood +C Developed by A.Rossi, C.Planas and G.Fiorentini +C +C State-space format: y(t) = c(t)z(t) + H(t)x(t) + G(t)u(t) +C x(t) = a(t) + F(t)x(t-1) + R(t)u(t) +C +C y(t) (ny x 1) ny = # of endogenous series +C z(t) (nz x 1) nz = # of exogenous series +C x(t) (nx x 1) nx = # of continous states +C u(t) (nu x 1) nu = # of shocks +C c(t) (ny x nz x ns1) ns1 = # of states for c(t) +C H(t) (ny x nx x ns2) ns2 = # of states for S2(t) +C G(t) (ny x nu x ns3) ns3 = # of states for S3(t) +C a(t) (nx x ns4) ns4 = # of states for S4(t) +C F(t) (nx x nx x ns5) ns5 = # of states for S5(t) +C R(t) (nx x nu x ns6) ns6 = # of states for S6(t) +C +C Copyright (C) 2010-2014 European Commission +C C This file is part of Program DMM C -C DMM is free software developed at the Joint Research Centre of the -C European Commission: you can redistribute it and/or modify it under +C DMM is free software developed at the Joint Research Centre of the +C European Commission: you can redistribute it and/or modify it under C the terms of the GNU General Public License as published by C the Free Software Foundation, either version 3 of the License, or C (at your option) any later version. @@ -32,236 +32,236 @@ C MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the C GNU General Public License for more details. C C You should have received a copy of the GNU General Public License -C along with DMM. If not, see <http://www.gnu.org/licenses/>. -C -------------------------------------------------------------------- - SUBROUTINE ML(nobs,d,ny,nz,nx,nu,nt,nv,ns,np,INFOS,pdll,INDT,yk,IYK, - 1 S,thetaprior,theta,psi,IMSVAR,HESS,FOPT) - - USE dfwin - INTERFACE - SUBROUTINE DESIGN(ny,nz,nx,nu,ns,nt,theta,c,H,G,a,F,R) - INTEGER ny,nz,nx,nu,ns(6),nt - DOUBLE PRECISION theta(nt) - DOUBLE PRECISION c(ny,max(1,nz),ns(1)),H(ny,nx,ns(2)), - 1 G(ny,nu,ns(3)),a(nx,ns(4)),F(nx,nx,ns(5)),R(nx,nu,ns(6)) - END SUBROUTINE - END INTERFACE -C INTEGER POINTER pdll - POINTER (pdll,fittizia) - POINTER (pdesign,DESIGN) - -C INPUT - INTEGER nobs,d(2),ny,nz,nx,nu,nt,nv,ns(6),np,INFOS(9,6), - 1 INDT(nt+2),IYK(nobs,ny+1),S(nobs,6) - DOUBLE PRECISION thetaprior(nt,4),yk(nobs,ny+nz) - -C OUTPUT - INTEGER IMSVAR - DOUBLE PRECISION FOPT,theta(nt),psi(max(1,np)), - 1 HESS((nt+np)*(nt+np+1)/2) - -C LOCALS - INTEGER NPAR,NTHETA,I,J,K,IFAIL,IFAILNEW,IOPT,NCLIN,NCNLN,LDA,ITER, - 1 LDCJ,LWORK,LIWORK - DOUBLE PRECISION FOPTNEW - INTEGER, ALLOCATABLE:: ISTATE(:),IWORK(:) - INTEGER*8, ALLOCATABLE:: IU(:) - DOUBLE PRECISION, ALLOCATABLE:: CHINEW(:),CHI(:),LBV(:),UBV(:), - 1 CLAMDA(:),OBJGRD(:),WORK(:),CC(:),U(:),CJAC(:,:),RR(:,:),AA(:,:) - DOUBLE PRECISION, ALLOCATABLE:: c(:,:,:),H(:,:,:),G(:,:,:), - 2 a(:,:),F(:,:,:),R(:,:,:) - EXTERNAL FUNCT1,E04UCF,E04UEF,CONFUN - - NTHETA = INDT(nt+2)! # of free parameters theta - NPAR = NTHETA+np ! # of parameters (total) - -C Check if the model is an MS-VAR(1): -C d(1)=d(2)=0, H=I(nx), G=0 - IMSVAR=0 - ALLOCATE(c(ny,max(1,nz),ns(1)),H(ny,nx,ns(2)), - 1 G(ny,nu,ns(3)),a(nx,ns(4)),F(nx,nx,ns(5)),R(nx,nu,ns(6))) - pdesign = getprocaddress(pdll, "design_"C) - CALL DESIGN(ny,nz,nx,nu,ns,nt,theta,c,H,G,a,F,R) -C Check H (ny x nx x ns(2)) and G (ny x nu x ns(3)) - IF ((nx.EQ.ny).AND.(SUM(d).EQ.0)) THEN - IMSVAR = 1 - DO I = 1,ny - IF (H(I,I,1).NE.1.D0) THEN - IMSVAR = 0 - GO TO 123 - ENDIF - DO J = 1,I-1 - IF (H(I,J,1).NE.0.D0) THEN - IMSVAR = 0 - GO TO 123 - ENDIF - ENDDO - DO J = I+1,ny - IF (H(I,J,1).NE.0.D0) THEN - IMSVAR = 0 - GO TO 123 - ENDIF - ENDDO - IF (SUM(DABS(G(I,1:nu,1))).NE.0.D0) THEN - IMSVAR = 0 - GO TO 123 - ENDIF - ENDDO - ENDIF - -123 DEALLOCATE(c,H,G,a,F,R) -C Shrink theta, LB and UB - ALLOCATE(CHINEW(NPAR),CHI(NPAR)) - -C Starting values - set via the 1st entry of th prior when possible - DO I = 1,NTHETA - IF ((thetaprior(INDT(I),1).LT.thetaprior(INDT(I),3)).OR. - # (thetaprior(INDT(I),1).GT.thetaprior(INDT(I),4))) THEN - CHINEW(I) = theta(INDT(I)) - ELSE - CHINEW(I) = thetaprior(INDT(I),1) - ENDIF - ENDDO -C Starting values for PSI - CHINEW(NTHETA+1:NPAR) = psi(1:np) - -C Linear constraints for transition probabilities -C LBV <= AA*theta <= UBV - NCLIN = 0 - DO I = 1,nv - IF(INFOS(9,I).EQ.1) THEN ! Independent - NCLIN = NCLIN+1 - ELSEIF(INFOS(9,I).EQ.2) THEN ! Markov - NCLIN = NCLIN+INFOS(8,I) - ENDIF - ENDDO - -C Lower and upper bounds - ALLOCATE(LBV(NPAR+NCLIN),UBV(NPAR+NCLIN),AA(NCLIN,NPAR)) - LBV(1:NTHETA) = thetaprior(INDT(1:NTHETA),3) - UBV(1:NTHETA) = thetaprior(INDT(1:NTHETA),4) - LBV(NTHETA+1:NPAR) = 1.D-3 - LBV(NPAR+1:NPAR+NCLIN) = 1.D-6 - UBV(NTHETA+1:NPAR) = 1.D0-1.D-3 - UBV(NPAR+1:NPAR+NCLIN) = 1.D0-1.D-6 - K = NTHETA - J = 1 - AA(:,:) = 0.D0 - DO I = 1,nv - IF(INFOS(9,I).EQ.1) THEN ! Independent - AA(J,K+1:K+INFOS(8,I)-1) = 1.D0 - K = K+INFOS(8,I)-1 - J = J+1 - ELSEIF(INFOS(9,I).EQ.2) THEN ! Markov - DO ITER = 1,INFOS(8,I) - AA(J,K+1:K+INFOS(8,I)-1) = 1.D0 - K = K+INFOS(8,I)-1 - J = J+1 - ENDDO - ENDIF - ENDDO - -C -------------------------------------------------------- -C Set E04UCF parameters: IU all integers, U data + bounds -C -------------------------------------------------------- - ALLOCATE (IU(72),U(nobs*(2*ny+nz+7)+3*nt+2)) - IU(1) = nobs - IU(2:3) = d(1:2) - IU(4) = ny - IU(5) = nz - IU(6) = nx - IU(7) = nu - IU(8) = nt - IU(9:14)= ns(1:6) - IU(15) = pdll - IU(16) = nv - DO J=1,6 - IU(17+9*(J-1):16+J*9) = INFOS(1:9,J) - ENDDO - IU(71) = np - IU(72) = IMSVAR - - DO J=1,ny+nz - U(1+nobs*(J-1):J*nobs) = yk(:,J) - ENDDO - U(nobs*(ny+nz)+1:nobs*(ny+nz)+nt) = thetaprior(1:nt,3) - U(nobs*(ny+nz)+nt+1:nobs*(ny+nz)+2*nt) = thetaprior(1:nt,4) - I = nobs*(ny+nz)+2*nt+1 - U(I:I+nt+1) = INDT(1:nt+2) - I = I+nt+2 - DO J=1,ny+1 - U(I+nobs*(J-1):I-1+nobs*J) = IYK(1:nobs,J) - ENDDO - I = I+nobs*(ny+1) - DO J = 1,6 - U(I+(J-1)*nobs:I-1+J*nobs) = S(1:nobs,J) - ENDDO - -C ----------------------------------------------- -C Likelihood Maximization via E04UCF (NAG mk.17) -C ----------------------------------------------- - CALL E04UEF('Derivative level = 0') - CALL E04UEF('Hessian = Yes') - CALL E04UEF('Major iteration limit = 400') - CALL E04UEF('Minor iteration limit = 300') - CALL E04UEF('Cold start') - CALL E04UEF('Major print level = 1') - IOPT = 0 - FOPT = 1D100 - NCNLN = 0 - LDA = max(1,NCLIN) - LDCJ = max(1,NCNLN) - LWORK = 2*NPAR**2+20*NPAR+11*NCLIN - LIWORK=3*NPAR+2*NCNLN+NCLIN - ALLOCATE(ISTATE(NPAR+NCNLN+NCLIN),IWORK(LIWORK), - 1 CLAMDA(NPAR+NCNLN+NCLIN),OBJGRD(NPAR),WORK(LWORK),CC(LDCJ), - 1 CJAC(LDCJ,NPAR),RR(NPAR,NPAR)) - -1234 IFAILNEW = -1 - CALL E04UCF(NPAR,NCLIN,NCNLN,LDA,LDCJ,NPAR,AA,LBV,UBV,CONFUN, - 1 FUNCT1,ITER,ISTATE,CC,CJAC,CLAMDA,FOPTNEW,OBJGRD,RR,CHINEW, - 2 IWORK,LIWORK,WORK,LWORK,IU,U,IFAILNEW) - -C Hessian matrix for theta and psi - IF (IOPT.EQ.0) THEN - HESS(:) = 0.D0 - DO 50 I=1,NTHETA - DO 50 J=1,I - K = INDT(I)*(INDT(I)+1)/2-INDT(I)+INDT(J) -50 HESS(K) = SUM(RR(:,I)*RR(:,J)) - - DO 55 I=NTHETA+1,NTHETA+np - DO 55 J=1,NTHETA - K = (I+nt-NTHETA)*(I+nt-NTHETA+1)/2 - (I+nt-NTHETA) + INDT(J) -55 HESS(K) = SUM(RR(:,I)*RR(:,J)) - - DO 60 I=NTHETA+1,NTHETA+np - DO 60 J=NTHETA+1,I - K = (I+nt-NTHETA)*(I+nt-NTHETA+1)/2 - I + J -60 HESS(K) = SUM(RR(:,I)*RR(:,J)) - ENDIF - - IF (FOPTNEW.LT.FOPT) THEN - CHI(:) = CHINEW(:) - FOPT = FOPTNEW - IFAIL = IFAILNEW - ENDIF - - IF (((IFAILNEW.EQ.1).OR.(IFAILNEW.EQ.4).OR.(IFAILNEW.EQ.6)) - * .AND.(IOPT.LT.2)) THEN - - IOPT = IOPT + 1 - CALL E04UEF('Warm start') - RR(:,:) = 0.D0 - DO 30 I=1,NPAR -30 RR(I,I)=1.D0 - GO TO 1234 - ENDIF - theta(1:nt) = thetaprior(1:nt,3) - theta(INDT(1:NTHETA)) = CHI(1:NTHETA) - IF (NPAR.GT.NTHETA) psi(1:np) = CHI(NTHETA+1:NPAR) - - DEALLOCATE (ISTATE,IWORK,CLAMDA,OBJGRD,WORK,CC,CJAC,RR,AA) - DEALLOCATE (CHINEW,CHI,LBV,UBV,IU,U) - RETURN +C along with DMM. If not, see <http://www.gnu.org/licenses/>. +C -------------------------------------------------------------------- + SUBROUTINE ML(nobs,d,ny,nz,nx,nu,nt,nv,ns,np,INFOS,pdll,INDT,yk,IYK, + 1 S,thetaprior,theta,psi,IMSVAR,HESS,FOPT) + + USE dfwin + INTERFACE + SUBROUTINE DESIGN(ny,nz,nx,nu,ns,nt,theta,c,H,G,a,F,R) + INTEGER ny,nz,nx,nu,ns(6),nt + DOUBLE PRECISION theta(nt) + DOUBLE PRECISION c(ny,max(1,nz),ns(1)),H(ny,nx,ns(2)), + 1 G(ny,nu,ns(3)),a(nx,ns(4)),F(nx,nx,ns(5)),R(nx,nu,ns(6)) + END SUBROUTINE + END INTERFACE +C INTEGER POINTER pdll + POINTER (pdll,fittizia) + POINTER (pdesign,DESIGN) + +C INPUT + INTEGER nobs,d(2),ny,nz,nx,nu,nt,nv,ns(6),np,INFOS(9,6), + 1 INDT(nt+2),IYK(nobs,ny+1),S(nobs,6) + DOUBLE PRECISION thetaprior(nt,4),yk(nobs,ny+nz) + +C OUTPUT + INTEGER IMSVAR + DOUBLE PRECISION FOPT,theta(nt),psi(max(1,np)), + 1 HESS((nt+np)*(nt+np+1)/2) + +C LOCALS + INTEGER NPAR,NTHETA,I,J,K,IFAIL,IFAILNEW,IOPT,NCLIN,NCNLN,LDA,ITER, + 1 LDCJ,LWORK,LIWORK + DOUBLE PRECISION FOPTNEW + INTEGER, ALLOCATABLE:: ISTATE(:),IWORK(:) + INTEGER*8, ALLOCATABLE:: IU(:) + DOUBLE PRECISION, ALLOCATABLE:: CHINEW(:),CHI(:),LBV(:),UBV(:), + 1 CLAMDA(:),OBJGRD(:),WORK(:),CC(:),U(:),CJAC(:,:),RR(:,:),AA(:,:) + DOUBLE PRECISION, ALLOCATABLE:: c(:,:,:),H(:,:,:),G(:,:,:), + 2 a(:,:),F(:,:,:),R(:,:,:) + EXTERNAL FUNCT1,E04UCF,E04UEF,CONFUN + + NTHETA = INDT(nt+2)! # of free parameters theta + NPAR = NTHETA+np ! # of parameters (total) + +C Check if the model is an MS-VAR(1): +C d(1)=d(2)=0, H=I(nx), G=0 + IMSVAR=0 + ALLOCATE(c(ny,max(1,nz),ns(1)),H(ny,nx,ns(2)), + 1 G(ny,nu,ns(3)),a(nx,ns(4)),F(nx,nx,ns(5)),R(nx,nu,ns(6))) + pdesign = getprocaddress(pdll, "design_"C) + CALL DESIGN(ny,nz,nx,nu,ns,nt,theta,c,H,G,a,F,R) +C Check H (ny x nx x ns(2)) and G (ny x nu x ns(3)) + IF ((nx.EQ.ny).AND.(SUM(d).EQ.0)) THEN + IMSVAR = 1 + DO I = 1,ny + IF (H(I,I,1).NE.1.D0) THEN + IMSVAR = 0 + GO TO 123 + ENDIF + DO J = 1,I-1 + IF (H(I,J,1).NE.0.D0) THEN + IMSVAR = 0 + GO TO 123 + ENDIF + ENDDO + DO J = I+1,ny + IF (H(I,J,1).NE.0.D0) THEN + IMSVAR = 0 + GO TO 123 + ENDIF + ENDDO + IF (SUM(DABS(G(I,1:nu,1))).NE.0.D0) THEN + IMSVAR = 0 + GO TO 123 + ENDIF + ENDDO + ENDIF + +123 DEALLOCATE(c,H,G,a,F,R) +C Shrink theta, LB and UB + ALLOCATE(CHINEW(NPAR),CHI(NPAR)) + +C Starting values - set via the 1st entry of th prior when possible + DO I = 1,NTHETA + IF ((thetaprior(INDT(I),1).LT.thetaprior(INDT(I),3)).OR. + # (thetaprior(INDT(I),1).GT.thetaprior(INDT(I),4))) THEN + CHINEW(I) = theta(INDT(I)) + ELSE + CHINEW(I) = thetaprior(INDT(I),1) + ENDIF + ENDDO +C Starting values for PSI + CHINEW(NTHETA+1:NPAR) = psi(1:np) + +C Linear constraints for transition probabilities +C LBV <= AA*theta <= UBV + NCLIN = 0 + DO I = 1,nv + IF(INFOS(9,I).EQ.1) THEN ! Independent + NCLIN = NCLIN+1 + ELSEIF(INFOS(9,I).EQ.2) THEN ! Markov + NCLIN = NCLIN+INFOS(8,I) + ENDIF + ENDDO + +C Lower and upper bounds + ALLOCATE(LBV(NPAR+NCLIN),UBV(NPAR+NCLIN),AA(NCLIN,NPAR)) + LBV(1:NTHETA) = thetaprior(INDT(1:NTHETA),3) + UBV(1:NTHETA) = thetaprior(INDT(1:NTHETA),4) + LBV(NTHETA+1:NPAR) = 1.D-3 + LBV(NPAR+1:NPAR+NCLIN) = 1.D-6 + UBV(NTHETA+1:NPAR) = 1.D0-1.D-3 + UBV(NPAR+1:NPAR+NCLIN) = 1.D0-1.D-6 + K = NTHETA + J = 1 + AA(:,:) = 0.D0 + DO I = 1,nv + IF(INFOS(9,I).EQ.1) THEN ! Independent + AA(J,K+1:K+INFOS(8,I)-1) = 1.D0 + K = K+INFOS(8,I)-1 + J = J+1 + ELSEIF(INFOS(9,I).EQ.2) THEN ! Markov + DO ITER = 1,INFOS(8,I) + AA(J,K+1:K+INFOS(8,I)-1) = 1.D0 + K = K+INFOS(8,I)-1 + J = J+1 + ENDDO + ENDIF + ENDDO + +C -------------------------------------------------------- +C Set E04UCF parameters: IU all integers, U data + bounds +C -------------------------------------------------------- + ALLOCATE (IU(72),U(nobs*(2*ny+nz+7)+3*nt+2)) + IU(1) = nobs + IU(2:3) = d(1:2) + IU(4) = ny + IU(5) = nz + IU(6) = nx + IU(7) = nu + IU(8) = nt + IU(9:14)= ns(1:6) + IU(15) = pdll + IU(16) = nv + DO J=1,6 + IU(17+9*(J-1):16+J*9) = INFOS(1:9,J) + ENDDO + IU(71) = np + IU(72) = IMSVAR + + DO J=1,ny+nz + U(1+nobs*(J-1):J*nobs) = yk(:,J) + ENDDO + U(nobs*(ny+nz)+1:nobs*(ny+nz)+nt) = thetaprior(1:nt,3) + U(nobs*(ny+nz)+nt+1:nobs*(ny+nz)+2*nt) = thetaprior(1:nt,4) + I = nobs*(ny+nz)+2*nt+1 + U(I:I+nt+1) = INDT(1:nt+2) + I = I+nt+2 + DO J=1,ny+1 + U(I+nobs*(J-1):I-1+nobs*J) = IYK(1:nobs,J) + ENDDO + I = I+nobs*(ny+1) + DO J = 1,6 + U(I+(J-1)*nobs:I-1+J*nobs) = S(1:nobs,J) + ENDDO + +C ----------------------------------------------- +C Likelihood Maximization via E04UCF (NAG mk.17) +C ----------------------------------------------- + CALL E04UEF('Derivative level = 0') + CALL E04UEF('Hessian = Yes') + CALL E04UEF('Major iteration limit = 400') + CALL E04UEF('Minor iteration limit = 300') + CALL E04UEF('Cold start') + CALL E04UEF('Major print level = 1') + IOPT = 0 + FOPT = 1D100 + NCNLN = 0 + LDA = max(1,NCLIN) + LDCJ = max(1,NCNLN) + LWORK = 2*NPAR**2+20*NPAR+11*NCLIN + LIWORK=3*NPAR+2*NCNLN+NCLIN + ALLOCATE(ISTATE(NPAR+NCNLN+NCLIN),IWORK(LIWORK), + 1 CLAMDA(NPAR+NCNLN+NCLIN),OBJGRD(NPAR),WORK(LWORK),CC(LDCJ), + 1 CJAC(LDCJ,NPAR),RR(NPAR,NPAR)) + +1234 IFAILNEW = -1 + CALL E04UCF(NPAR,NCLIN,NCNLN,LDA,LDCJ,NPAR,AA,LBV,UBV,CONFUN, + 1 FUNCT1,ITER,ISTATE,CC,CJAC,CLAMDA,FOPTNEW,OBJGRD,RR,CHINEW, + 2 IWORK,LIWORK,WORK,LWORK,IU,U,IFAILNEW) + +C Hessian matrix for theta and psi + IF (IOPT.EQ.0) THEN + HESS(:) = 0.D0 + DO 50 I=1,NTHETA + DO 50 J=1,I + K = INDT(I)*(INDT(I)+1)/2-INDT(I)+INDT(J) +50 HESS(K) = SUM(RR(:,I)*RR(:,J)) + + DO 55 I=NTHETA+1,NTHETA+np + DO 55 J=1,NTHETA + K = (I+nt-NTHETA)*(I+nt-NTHETA+1)/2 - (I+nt-NTHETA) + INDT(J) +55 HESS(K) = SUM(RR(:,I)*RR(:,J)) + + DO 60 I=NTHETA+1,NTHETA+np + DO 60 J=NTHETA+1,I + K = (I+nt-NTHETA)*(I+nt-NTHETA+1)/2 - I + J +60 HESS(K) = SUM(RR(:,I)*RR(:,J)) + ENDIF + + IF (FOPTNEW.LT.FOPT) THEN + CHI(:) = CHINEW(:) + FOPT = FOPTNEW + IFAIL = IFAILNEW + ENDIF + + IF (((IFAILNEW.EQ.1).OR.(IFAILNEW.EQ.4).OR.(IFAILNEW.EQ.6)) + * .AND.(IOPT.LT.2)) THEN + + IOPT = IOPT + 1 + CALL E04UEF('Warm start') + RR(:,:) = 0.D0 + DO 30 I=1,NPAR +30 RR(I,I)=1.D0 + GO TO 1234 + ENDIF + theta(1:nt) = thetaprior(1:nt,3) + theta(INDT(1:NTHETA)) = CHI(1:NTHETA) + IF (NPAR.GT.NTHETA) psi(1:np) = CHI(NTHETA+1:NPAR) + + DEALLOCATE (ISTATE,IWORK,CLAMDA,OBJGRD,WORK,CC,CJAC,RR,AA) + DEALLOCATE (CHINEW,CHI,LBV,UBV,IU,U) + RETURN END diff --git a/mvncdf.for b/mvncdf.for index 5f2bd1ed70b4741393bfe8e56340d33fad10a420..982f0fb9c26cc297f4fda9be55fb5fac67f8f34f 100644 --- a/mvncdf.for +++ b/mvncdf.for @@ -1,17 +1,17 @@ -C ---------------------------------------------------------------------- -C MVNCDF Multivariate normal cumulative distribution function -C computes the multivariate Normal cumulative distribution -C function with mean vector MU, variance matrix SIGMA inside -C LB and UB. Algorithm due to Alan Genz (1992): -C "Numerical Computation of Multivariate Normal Probabilities", -C Journal of Computational and Graphical Statistics, pp. 141-149. -C -C Copyright (C) 2010-2014 European Commission -C +C ---------------------------------------------------------------------- +C MVNCDF Multivariate normal cumulative distribution function +C computes the multivariate Normal cumulative distribution +C function with mean vector MU, variance matrix SIGMA inside +C LB and UB. Algorithm due to Alan Genz (1992): +C "Numerical Computation of Multivariate Normal Probabilities", +C Journal of Computational and Graphical Statistics, pp. 141-149. +C +C Copyright (C) 2010-2014 European Commission +C C This file is part of Program DMM C -C DMM is free software developed at the Joint Research Centre of the -C European Commission: you can redistribute it and/or modify it under +C DMM is free software developed at the Joint Research Centre of the +C European Commission: you can redistribute it and/or modify it under C the terms of the GNU General Public License as published by C the Free Software Foundation, either version 3 of the License, or C (at your option) any later version. @@ -22,74 +22,74 @@ C MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the C GNU General Public License for more details. C C You should have received a copy of the GNU General Public License -C along with DMM. If not, see <http://www.gnu.org/licenses/>. -C ---------------------------------------------------------------------- - SUBROUTINE MVNCDF(LB,UB,MU,SIGMA,K,EPS,NMAX,INTSUM,ERROR,N) - -! INPUT - INTEGER K,NMAX - DOUBLE PRECISION LB(K),UB(K),MU(K),SIGMA(K,K),EPS - -! OUTPUT - INTEGER N - DOUBLE PRECISION INTSUM,ERROR - -! LOCALS - INTEGER IFAIL,I,J - DOUBLE PRECISION LBC(K),UBC(K),C(K,K),F(K),E(K),D(K),Y(K) - DOUBLE PRECISION ALPHA,VARSUM,W,DELTA,SUMCY - -! EXTERNAL SUBROUTINES - EXTERNAL DPOTRF -! EXTERNAL FUNCTIONS - DOUBLE PRECISION CUMNORM,GENUNF,INVNORMCDF ! PPND16 - - - LBC(:) = LB(:) - MU(:) - UBC(:) = UB(:) - MU(:) - ALPHA = 2.326347874040841 ! 99-TH PERCENTILE FOR A N(0,1) - C(1:K,1:K) = SIGMA(1:K,1:K) - IFAIL = -1 - CALL DPOTRF('L',K,C,K,IFAIL) ! SIGMA = C*C' - -C INITIALIZATIONS - F(:) = 0.D0 - D(:) = 0.D0 - E(:) = 0.D0 - Y(:) = 0.D0 - IFAIL = 0 - E(1) = CUMNORM(UBC(1)/C(1,1)) ! CDF - IFAIL = 0 - D(1) = CUMNORM(LBC(1)/C(1,1)) ! CDF - F(1) = E(1) - D(1) - INTSUM = 0.D0 - N = 0 - VARSUM = 0.D0 - ERROR = EPS+1.D0 - DO WHILE ((ERROR.GT.EPS).AND.(N.LT.NMAX)) - DO 100 I = 2,K - W = GENUNF(0.D0,1.D0) - IF((D(I-1)+W*F(I-1)).LE.0.D0) THEN - Y(I-1) = -10.D10 - ELSEIF ((D(I-1)+W*F(I-1)).GE.1.D0) THEN - Y(I-1) = 10.D10 - ELSE -C Y(I-1) = PPND16(D(I-1)+W*F(I-1),IFAIL) - Y(I-1) = INVNORMCDF(D(I-1)+W*F(I-1)) - ENDIF - SUMCY = 0.D0 - DO 50 J = 1, I-1 -50 SUMCY = SUMCY + C(I,J)*Y(J) - E(I) = CUMNORM((UBC(I) - SUMCY) / C(I,I)) - IFAIL = 0 - D(I) = CUMNORM((LBC(I) - SUMCY) / C(I,I)) -100 F(I) = (E(I) - D(I))*F(I-1) - N = N + 1 - DELTA = (F(K) - INTSUM)/DFLOAT(N) - INTSUM = INTSUM + DELTA - VARSUM = (N-2)*VARSUM/DFLOAT(N) + DELTA**2 - ERROR = ALPHA * DSQRT(VARSUM) - END DO - - RETURN +C along with DMM. If not, see <http://www.gnu.org/licenses/>. +C ---------------------------------------------------------------------- + SUBROUTINE MVNCDF(LB,UB,MU,SIGMA,K,EPS,NMAX,INTSUM,ERROR,N) + +! INPUT + INTEGER K,NMAX + DOUBLE PRECISION LB(K),UB(K),MU(K),SIGMA(K,K),EPS + +! OUTPUT + INTEGER N + DOUBLE PRECISION INTSUM,ERROR + +! LOCALS + INTEGER IFAIL,I,J + DOUBLE PRECISION LBC(K),UBC(K),C(K,K),F(K),E(K),D(K),Y(K) + DOUBLE PRECISION ALPHA,VARSUM,W,DELTA,SUMCY + +! EXTERNAL SUBROUTINES + EXTERNAL DPOTRF +! EXTERNAL FUNCTIONS + DOUBLE PRECISION CUMNORM,GENUNF,INVNORMCDF ! PPND16 + + + LBC(:) = LB(:) - MU(:) + UBC(:) = UB(:) - MU(:) + ALPHA = 2.326347874040841 ! 99-TH PERCENTILE FOR A N(0,1) + C(1:K,1:K) = SIGMA(1:K,1:K) + IFAIL = -1 + CALL DPOTRF('L',K,C,K,IFAIL) ! SIGMA = C*C' + +C INITIALIZATIONS + F(:) = 0.D0 + D(:) = 0.D0 + E(:) = 0.D0 + Y(:) = 0.D0 + IFAIL = 0 + E(1) = CUMNORM(UBC(1)/C(1,1)) ! CDF + IFAIL = 0 + D(1) = CUMNORM(LBC(1)/C(1,1)) ! CDF + F(1) = E(1) - D(1) + INTSUM = 0.D0 + N = 0 + VARSUM = 0.D0 + ERROR = EPS+1.D0 + DO WHILE ((ERROR.GT.EPS).AND.(N.LT.NMAX)) + DO 100 I = 2,K + W = GENUNF(0.D0,1.D0) + IF((D(I-1)+W*F(I-1)).LE.0.D0) THEN + Y(I-1) = -10.D10 + ELSEIF ((D(I-1)+W*F(I-1)).GE.1.D0) THEN + Y(I-1) = 10.D10 + ELSE +C Y(I-1) = PPND16(D(I-1)+W*F(I-1),IFAIL) + Y(I-1) = INVNORMCDF(D(I-1)+W*F(I-1)) + ENDIF + SUMCY = 0.D0 + DO 50 J = 1, I-1 +50 SUMCY = SUMCY + C(I,J)*Y(J) + E(I) = CUMNORM((UBC(I) - SUMCY) / C(I,I)) + IFAIL = 0 + D(I) = CUMNORM((LBC(I) - SUMCY) / C(I,I)) +100 F(I) = (E(I) - D(I))*F(I-1) + N = N + 1 + DELTA = (F(K) - INTSUM)/DFLOAT(N) + INTSUM = INTSUM + DELTA + VARSUM = (N-2)*VARSUM/DFLOAT(N) + DELTA**2 + ERROR = ALPHA * DSQRT(VARSUM) + END DO + + RETURN END diff --git a/mvnpdf.for b/mvnpdf.for index cdf0a7c1185a32d77db6b859e4b840b534370f06..b0fc8d0dd81534f3ffaa6aa64106d6277441ee7a 100644 --- a/mvnpdf.for +++ b/mvnpdf.for @@ -1,17 +1,17 @@ -C ------------------------------------------------------------------------ -C MVNPDF returns the multivariate Normal pdf with parameters mu, SIG, -C evaluated at x. -C mu (px1),SIG (pxp), x (px1) -C Bauwens et al. (1999): "Bayesian Inference in Dynamic Econometric -C models", Oxford University Press, page 298 -C Developed by A.Rossi, C.Planas and G.Fiorentini -C -C Copyright (C) 2010-2014 European Commission -C +C ------------------------------------------------------------------------ +C MVNPDF returns the multivariate Normal pdf with parameters mu, SIG, +C evaluated at x. +C mu (px1),SIG (pxp), x (px1) +C Bauwens et al. (1999): "Bayesian Inference in Dynamic Econometric +C models", Oxford University Press, page 298 +C Developed by A.Rossi, C.Planas and G.Fiorentini +C +C Copyright (C) 2010-2014 European Commission +C C This file is part of Program DMM C -C DMM is free software developed at the Joint Research Centre of the -C European Commission: you can redistribute it and/or modify it under +C DMM is free software developed at the Joint Research Centre of the +C European Commission: you can redistribute it and/or modify it under C the terms of the GNU General Public License as published by C the Free Software Foundation, either version 3 of the License, or C (at your option) any later version. @@ -20,51 +20,51 @@ C DMM is distributed in the hope that it will be useful, C but WITHOUT ANY WARRANTY; without even the implied warranty of C MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the C GNU General Public License for more details. -C -------------------------------------------------------------------------- - DOUBLE PRECISION FUNCTION mvnpdf(X,mu,SIG,p) - -C INPUT - INTEGER p - DOUBLE PRECISION X(p),mu(p),SIG(p,p) -C LOCALS - INTEGER I,J,IFAIL - DOUBLE PRECISION,ALLOCATABLE:: ISIG(:,:),COM(:,:) - DOUBLE PRECISION PI,H,DET,KER - DATA PI/3.141592653589793D0/,H/-.5D0/ -C EXTERNAL SUBROUTINES - EXTERNAL DPOTRF,DPOTRI - - ALLOCATE(ISIG(p,p),COM(p+1,p)) - COM(1:p,1:p) = SIG(1:p,1:p) - IFAIL = -1 -C CALL F01ADF(p,COM(1:p+1,1:p),p+1,IFAIL) - CALL DPOTRF('L',p,COM(1:p,1:p),p,IFAIL) ! COM = L*L' - DET = 1.D0 ! det(L) - DO I =1,p - DET = DET*COM(I,I) - ENDDO - CALL DPOTRI('L',p,COM(1:p,1:p),p,IFAIL) ! COM = VV^-1 - - DO 10 I=1,p - ISIG(I,I) = COM(I,I) - DO 10 J=1,I-1 - ISIG(I,J) = COM(I,J) -10 ISIG(J,I) = ISIG(I,J) - -C DETERMINANT of SIG -C COM(1:p,1:p) = SIG(1:p,1:p) -C IFAIL = -1 -C CALL F03ABF(COM(1:p,1:p),p,p,DET,WKSPCE,IFAIL) - -C QUADRATIC FORM (log) - KER = 0.D0 - DO 20 I=1,p - DO 20 J=1,p -20 KER = KER + (X(I)-mu(I))*ISIG(I,J)*(X(J)-mu(J)) - -C PDF - mvnpdf = (2.*PI)**(H*p)*DET**(-1.D0)*DEXP(H*KER) - - DEALLOCATE(ISIG,COM) - RETURN +C -------------------------------------------------------------------------- + DOUBLE PRECISION FUNCTION mvnpdf(X,mu,SIG,p) + +C INPUT + INTEGER p + DOUBLE PRECISION X(p),mu(p),SIG(p,p) +C LOCALS + INTEGER I,J,IFAIL + DOUBLE PRECISION,ALLOCATABLE:: ISIG(:,:),COM(:,:) + DOUBLE PRECISION PI,H,DET,KER + DATA PI/3.141592653589793D0/,H/-.5D0/ +C EXTERNAL SUBROUTINES + EXTERNAL DPOTRF,DPOTRI + + ALLOCATE(ISIG(p,p),COM(p+1,p)) + COM(1:p,1:p) = SIG(1:p,1:p) + IFAIL = -1 +C CALL F01ADF(p,COM(1:p+1,1:p),p+1,IFAIL) + CALL DPOTRF('L',p,COM(1:p,1:p),p,IFAIL) ! COM = L*L' + DET = 1.D0 ! det(L) + DO I =1,p + DET = DET*COM(I,I) + ENDDO + CALL DPOTRI('L',p,COM(1:p,1:p),p,IFAIL) ! COM = VV^-1 + + DO 10 I=1,p + ISIG(I,I) = COM(I,I) + DO 10 J=1,I-1 + ISIG(I,J) = COM(I,J) +10 ISIG(J,I) = ISIG(I,J) + +C DETERMINANT of SIG +C COM(1:p,1:p) = SIG(1:p,1:p) +C IFAIL = -1 +C CALL F03ABF(COM(1:p,1:p),p,p,DET,WKSPCE,IFAIL) + +C QUADRATIC FORM (log) + KER = 0.D0 + DO 20 I=1,p + DO 20 J=1,p +20 KER = KER + (X(I)-mu(I))*ISIG(I,J)*(X(J)-mu(J)) + +C PDF + mvnpdf = (2.*PI)**(H*p)*DET**(-1.D0)*DEXP(H*KER) + + DEALLOCATE(ISIG,COM) + RETURN END diff --git a/neweywestcov.for b/neweywestcov.for index 063bb4839275415d5a3f353bf54d96b207eb87ab..3ca25ea2e881e3b8f70dc4e0081af54623b2b2d3 100644 --- a/neweywestcov.for +++ b/neweywestcov.for @@ -1,18 +1,18 @@ -C ------------------------------------------------------------------------ -C NEWEYWESTCOV implements Newey and West 1987, A simple positive semi-definite -C hetheroscedasticity and autocorrelation consistent covariance matrix, -C Econometrica, 55, 703-08. -C Developed by A.Rossi, C.Planas and G.Fiorentini -C -C OUTPUT: -C OMEGA = OMEGA0 + SUM(is=1,nq) (1-is/(nq+1))*(Omegas+Omegas') -C -C Copyright (C) 2010-2014 European Commission -C +C ------------------------------------------------------------------------ +C NEWEYWESTCOV implements Newey and West 1987, A simple positive semi-definite +C hetheroscedasticity and autocorrelation consistent covariance matrix, +C Econometrica, 55, 703-08. +C Developed by A.Rossi, C.Planas and G.Fiorentini +C +C OUTPUT: +C OMEGA = OMEGA0 + SUM(is=1,nq) (1-is/(nq+1))*(Omegas+Omegas') +C +C Copyright (C) 2010-2014 European Commission +C C This file is part of Program DMM C -C DMM is free software developed at the Joint Research Centre of the -C European Commission: you can redistribute it and/or modify it under +C DMM is free software developed at the Joint Research Centre of the +C European Commission: you can redistribute it and/or modify it under C the terms of the GNU General Public License as published by C the Free Software Foundation, either version 3 of the License, or C (at your option) any later version. @@ -23,47 +23,47 @@ C MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the C GNU General Public License for more details. C C You should have received a copy of the GNU General Public License -C along with DMM. If not, see <http://www.gnu.org/licenses/>. -C ------------------------------------------------------------------------ - SUBROUTINE NEWEYWESTCOV(N,nvar,NQ,MAT,OMEGA) -! INPUT - INTEGER N,nvar,NQ - DOUBLE PRECISION MAT(N,nvar) -! OUTPUT - DOUBLE PRECISION OMEGA(nvar,nvar) -! LOCALS - INTEGER I,J,K,is - DOUBLE PRECISION MEAN(nvar),OMEGAS(nvar,nvar) - DOUBLE PRECISION, ALLOCATABLE::MAT0(:,:) - DOUBLE PRECISION ZERO,ONE - DATA ZERO/0.0D0/, ONE/1.0D0/ - - ALLOCATE (MAT0(N,nvar)) - DO 10 I = 1,nvar - MEAN(I) = sum(MAT(:,I))/dfloat(N) -10 MAT0(:,I) = MAT(:,I) - MEAN(I) ! Remove the mean - - OMEGA(:,:) = ZERO ! lag-0 covariance matrix - DO 30 I =1,nvar - DO 30 J =1,I - OMEGA(I,J) = sum(MAT0(:,I)*MAT0(:,J)) -30 OMEGA(J,I) = OMEGA(I,J) - OMEGA(:,:) = OMEGA(:,:)/dfloat(N) - - DO 100 is = 1, NQ - OMEGAS(:,:) = ZERO ! lag-s covariance matrix - DO 50 I =1,nvar - DO 50 J =1,nvar - DO 50 K =1,N-is -50 OMEGAS(I,J) = OMEGAS(I,J)+MAT0(K+is,I)*MAT0(K,J)/dfloat(N-is) - - DO 60 I =1,nvar - DO 60 J =1,I - OMEGA(I,J) = OMEGA(I,J) + - + (ONE-is/dfloat(NQ+1))*(OMEGAS(J,I)+OMEGAS(I,J)) -60 OMEGA(J,I) = OMEGA(I,J) - -100 CONTINUE - DEALLOCATE (MAT0) - RETURN +C along with DMM. If not, see <http://www.gnu.org/licenses/>. +C ------------------------------------------------------------------------ + SUBROUTINE NEWEYWESTCOV(N,nvar,NQ,MAT,OMEGA) +! INPUT + INTEGER N,nvar,NQ + DOUBLE PRECISION MAT(N,nvar) +! OUTPUT + DOUBLE PRECISION OMEGA(nvar,nvar) +! LOCALS + INTEGER I,J,K,is + DOUBLE PRECISION MEAN(nvar),OMEGAS(nvar,nvar) + DOUBLE PRECISION, ALLOCATABLE::MAT0(:,:) + DOUBLE PRECISION ZERO,ONE + DATA ZERO/0.0D0/, ONE/1.0D0/ + + ALLOCATE (MAT0(N,nvar)) + DO 10 I = 1,nvar + MEAN(I) = sum(MAT(:,I))/dfloat(N) +10 MAT0(:,I) = MAT(:,I) - MEAN(I) ! Remove the mean + + OMEGA(:,:) = ZERO ! lag-0 covariance matrix + DO 30 I =1,nvar + DO 30 J =1,I + OMEGA(I,J) = sum(MAT0(:,I)*MAT0(:,J)) +30 OMEGA(J,I) = OMEGA(I,J) + OMEGA(:,:) = OMEGA(:,:)/dfloat(N) + + DO 100 is = 1, NQ + OMEGAS(:,:) = ZERO ! lag-s covariance matrix + DO 50 I =1,nvar + DO 50 J =1,nvar + DO 50 K =1,N-is +50 OMEGAS(I,J) = OMEGAS(I,J)+MAT0(K+is,I)*MAT0(K,J)/dfloat(N-is) + + DO 60 I =1,nvar + DO 60 J =1,I + OMEGA(I,J) = OMEGA(I,J) + + + (ONE-is/dfloat(NQ+1))*(OMEGAS(J,I)+OMEGAS(I,J)) +60 OMEGA(J,I) = OMEGA(I,J) + +100 CONTINUE + DEALLOCATE (MAT0) + RETURN END diff --git a/neweywestcov2.for b/neweywestcov2.for index b523059e23a325ed3a444d7ec628502ecb7d7007..f257810068be0aa880539f88d59bb973072ab895 100644 --- a/neweywestcov2.for +++ b/neweywestcov2.for @@ -1,18 +1,18 @@ -C ------------------------------------------------------------------------ -C NEWEYWESTCOV2 implements Newey and West 1987, A simple positive semi-definite -C hetheroscedasticity and autocorrelation consistent covariance matrix, -C Econometrica, 55, 703-08. -C Developed by A.Rossi, C.Planas and G.Fiorentini -C -C OUTPUT: -C OMEGA = OMEGA0 + SUM(is=1,nq) (1-is/(nq+1))*(Omegas+Omegas') -C -C Copyright (C) 2010-2014 European Commission -C +C ------------------------------------------------------------------------ +C NEWEYWESTCOV2 implements Newey and West 1987, A simple positive semi-definite +C hetheroscedasticity and autocorrelation consistent covariance matrix, +C Econometrica, 55, 703-08. +C Developed by A.Rossi, C.Planas and G.Fiorentini +C +C OUTPUT: +C OMEGA = OMEGA0 + SUM(is=1,nq) (1-is/(nq+1))*(Omegas+Omegas') +C +C Copyright (C) 2010-2014 European Commission +C C This file is part of Program DMM C -C DMM is free software developed at the Joint Research Centre of the -C European Commission: you can redistribute it and/or modify it under +C DMM is free software developed at the Joint Research Centre of the +C European Commission: you can redistribute it and/or modify it under C the terms of the GNU General Public License as published by C the Free Software Foundation, either version 3 of the License, or C (at your option) any later version. @@ -23,46 +23,46 @@ C MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the C GNU General Public License for more details. C C You should have received a copy of the GNU General Public License -C along with DMM. If not, see <http://www.gnu.org/licenses/>. -C ------------------------------------------------------------------------ - SUBROUTINE NEWEYWESTCOV2(N,nvar,NQ,MAT,MEAN,OMEGA) -! INPUT - INTEGER N,nvar,NQ - DOUBLE PRECISION MAT(N,nvar),MEAN(nvar) -! OUTPUT - DOUBLE PRECISION OMEGA(nvar,nvar) -! LOCALS - INTEGER I,J,K,is - DOUBLE PRECISION OMEGAS(nvar,nvar) - DOUBLE PRECISION, ALLOCATABLE::MAT0(:,:) - DOUBLE PRECISION ZERO,ONE - DATA ZERO/0.0D0/, ONE/1.0D0/ - - ALLOCATE (MAT0(N,nvar)) - DO 10 I = 1,nvar -10 MAT0(:,I) = MAT(:,I) - MEAN(I) ! Remove the mean - - OMEGA(:,:) = ZERO ! lag-0 covariance matrix - DO 30 I =1,nvar - DO 30 J =1,I - OMEGA(I,J) = sum(MAT0(:,I)*MAT0(:,J)) -30 OMEGA(J,I) = OMEGA(I,J) - OMEGA(:,:) = OMEGA(:,:)/dfloat(N) - - DO 100 is = 1, NQ - OMEGAS(:,:) = ZERO ! lag-s covariance matrix - DO 50 I =1,nvar - DO 50 J =1,nvar - DO 50 K =1,N-is -50 OMEGAS(I,J) = OMEGAS(I,J)+MAT0(K+is,I)*MAT0(K,J)/dfloat(N-is) - - DO 60 I =1,nvar - DO 60 J =1,I - OMEGA(I,J) = OMEGA(I,J) + - + (ONE-is/dfloat(NQ+1))*(OMEGAS(J,I)+OMEGAS(I,J)) -60 OMEGA(J,I) = OMEGA(I,J) - -100 CONTINUE - DEALLOCATE (MAT0) - RETURN +C along with DMM. If not, see <http://www.gnu.org/licenses/>. +C ------------------------------------------------------------------------ + SUBROUTINE NEWEYWESTCOV2(N,nvar,NQ,MAT,MEAN,OMEGA) +! INPUT + INTEGER N,nvar,NQ + DOUBLE PRECISION MAT(N,nvar),MEAN(nvar) +! OUTPUT + DOUBLE PRECISION OMEGA(nvar,nvar) +! LOCALS + INTEGER I,J,K,is + DOUBLE PRECISION OMEGAS(nvar,nvar) + DOUBLE PRECISION, ALLOCATABLE::MAT0(:,:) + DOUBLE PRECISION ZERO,ONE + DATA ZERO/0.0D0/, ONE/1.0D0/ + + ALLOCATE (MAT0(N,nvar)) + DO 10 I = 1,nvar +10 MAT0(:,I) = MAT(:,I) - MEAN(I) ! Remove the mean + + OMEGA(:,:) = ZERO ! lag-0 covariance matrix + DO 30 I =1,nvar + DO 30 J =1,I + OMEGA(I,J) = sum(MAT0(:,I)*MAT0(:,J)) +30 OMEGA(J,I) = OMEGA(I,J) + OMEGA(:,:) = OMEGA(:,:)/dfloat(N) + + DO 100 is = 1, NQ + OMEGAS(:,:) = ZERO ! lag-s covariance matrix + DO 50 I =1,nvar + DO 50 J =1,nvar + DO 50 K =1,N-is +50 OMEGAS(I,J) = OMEGAS(I,J)+MAT0(K+is,I)*MAT0(K,J)/dfloat(N-is) + + DO 60 I =1,nvar + DO 60 J =1,I + OMEGA(I,J) = OMEGA(I,J) + + + (ONE-is/dfloat(NQ+1))*(OMEGAS(J,I)+OMEGAS(I,J)) +60 OMEGA(J,I) = OMEGA(I,J) + +100 CONTINUE + DEALLOCATE (MAT0) + RETURN END diff --git a/ols.for b/ols.for index a57aedebfe584ba2b2ff4ee7019dabcbb6e0b6e1..87a1e9c6c233ca8be5e07a117fefe5a140c7d7e9 100644 --- a/ols.for +++ b/ols.for @@ -1,29 +1,29 @@ -C -------------------------------------------------- -C OLS reurns the ordinary least square estimates of -C a linear regression -C Developed by A.Rossi, C.Planas and G.Fiorentini -C -C INPUT: matrix of regressors X (N x K), -C vector of observations Y (N x 1) -C N number of observation -C K number of regressors -C -C OUTPUT: BETA = model parameters -C SEB = standard error of parameters -C SIGMA = var covar matrix of parameters -C RES = model residuals -C VA = variance of residuals -C IFAULT = OUTPUT, ERROR INDICATOR: -C 1 IF N < 1 -C 2 IF X'X IS NOT +VE SEMI-DEFINITE -C 0 OTHERWISE -C -C Copyright (C) 2010-2014 European Commission -C +C -------------------------------------------------- +C OLS reurns the ordinary least square estimates of +C a linear regression +C Developed by A.Rossi, C.Planas and G.Fiorentini +C +C INPUT: matrix of regressors X (N x K), +C vector of observations Y (N x 1) +C N number of observation +C K number of regressors +C +C OUTPUT: BETA = model parameters +C SEB = standard error of parameters +C SIGMA = var covar matrix of parameters +C RES = model residuals +C VA = variance of residuals +C IFAULT = OUTPUT, ERROR INDICATOR: +C 1 IF N < 1 +C 2 IF X'X IS NOT +VE SEMI-DEFINITE +C 0 OTHERWISE +C +C Copyright (C) 2010-2014 European Commission +C C This file is part of Program DMM C -C DMM is free software developed at the Joint Research Centre of the -C European Commission: you can redistribute it and/or modify it under +C DMM is free software developed at the Joint Research Centre of the +C European Commission: you can redistribute it and/or modify it under C the terms of the GNU General Public License as published by C the Free Software Foundation, either version 3 of the License, or C (at your option) any later version. @@ -34,63 +34,63 @@ C MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the C GNU General Public License for more details. C C You should have received a copy of the GNU General Public License -C along with DMM. If not, see <http://www.gnu.org/licenses/>. -C ------------------------------------------------ - SUBROUTINE OLS(Y,X,N,K,BETA,SEB,SIGMA,RES,VA,IFAULT) - INTEGER N,K - DOUBLE PRECISION Y(N),X(N,K),BETA(K),SEB(K),SIGMA(K,K) - DOUBLE PRECISION RES(N),VA - INTEGER I,J,IFAULT,NULLTY - DOUBLE PRECISION XX(K,K),invXX(K,K),LTRXX(K*(K+1)/2),W(K), - 1 pro(K,N),RMAX - -C Compute X'X - DO I = 1,K - XX(I,I) = SUM(X(1:N,I)*X(1:N,I)) - DO J = I+1,K - XX(I,J) = SUM(X(1:N,I)*X(1:N,J)) - XX(J,I) = XX(I,J) - ENDDO - ENDDO - -C Compute inv(X'X) - DO 10 i=1,K - DO 10 j=1,i -10 LTRXX(i*(i+1)/2-i+j)=XX(i,j) - - CALL SYMINV(LTRXX,K,LTRXX,W,NULLTY,IFAULT,RMAX) - DO i = 1,K - invXX(i,i) = LTRXX(i*(i+1)/2) - DO j = 1,i-1 - invXX(i,j) = LTRXX(i*(i+1)/2-i+j) - invXX(j,i) = invXX(i,j) - ENDDO - ENDDO - -C beta=inv(x'*x)*x'*y; - DO I = 1,K - DO J = 1,N - pro(I,J) = SUM(invXX(I,:)*X(J,:)) - ENDDO - ENDDO - DO I = 1,K - beta(I) = SUM(pro(I,:)*Y(:)) - ENDDO - -C Residuals: res=y-x*beta - DO I = 1,N - RES(I) = Y(I)-SUM(X(I,:)*beta(:)) - ENDDO - -C Variance of residuals: va=(res'res)/n - VA = SUM(RES(:)*RES(:))/DFLOAT(N) - -C Var-Covar matri:x sigma=va*inv(x'*x); - SIGMA = VA*invXX - -C Coefficient Standard errors - DO 20 i=1,K -20 SEB(i) = dsqrt(SIGMA(i,i)) - - RETURN +C along with DMM. If not, see <http://www.gnu.org/licenses/>. +C ------------------------------------------------ + SUBROUTINE OLS(Y,X,N,K,BETA,SEB,SIGMA,RES,VA,IFAULT) + INTEGER N,K + DOUBLE PRECISION Y(N),X(N,K),BETA(K),SEB(K),SIGMA(K,K) + DOUBLE PRECISION RES(N),VA + INTEGER I,J,IFAULT,NULLTY + DOUBLE PRECISION XX(K,K),invXX(K,K),LTRXX(K*(K+1)/2),W(K), + 1 pro(K,N),RMAX + +C Compute X'X + DO I = 1,K + XX(I,I) = SUM(X(1:N,I)*X(1:N,I)) + DO J = I+1,K + XX(I,J) = SUM(X(1:N,I)*X(1:N,J)) + XX(J,I) = XX(I,J) + ENDDO + ENDDO + +C Compute inv(X'X) + DO 10 i=1,K + DO 10 j=1,i +10 LTRXX(i*(i+1)/2-i+j)=XX(i,j) + + CALL SYMINV(LTRXX,K,LTRXX,W,NULLTY,IFAULT,RMAX) + DO i = 1,K + invXX(i,i) = LTRXX(i*(i+1)/2) + DO j = 1,i-1 + invXX(i,j) = LTRXX(i*(i+1)/2-i+j) + invXX(j,i) = invXX(i,j) + ENDDO + ENDDO + +C beta=inv(x'*x)*x'*y; + DO I = 1,K + DO J = 1,N + pro(I,J) = SUM(invXX(I,:)*X(J,:)) + ENDDO + ENDDO + DO I = 1,K + beta(I) = SUM(pro(I,:)*Y(:)) + ENDDO + +C Residuals: res=y-x*beta + DO I = 1,N + RES(I) = Y(I)-SUM(X(I,:)*beta(:)) + ENDDO + +C Variance of residuals: va=(res'res)/n + VA = SUM(RES(:)*RES(:))/DFLOAT(N) + +C Var-Covar matri:x sigma=va*inv(x'*x); + SIGMA = VA*invXX + +C Coefficient Standard errors + DO 20 i=1,K +20 SEB(i) = dsqrt(SIGMA(i,i)) + + RETURN END diff --git a/openfiles.for b/openfiles.for index 36998bd52d198a587d04de8dee934aa7501405af..4517fa82cec8edebcfe16033fb643cf86de1244c 100644 --- a/openfiles.for +++ b/openfiles.for @@ -1,13 +1,13 @@ -C -------------------------------------------------------------------------- -C OPENFILES opens files for writing the DMM output -C Developed by A.Rossi, C.Planas and G.Fiorentini -C -C Copyright (C) 2010-2014 European Commission -C +C -------------------------------------------------------------------------- +C OPENFILES opens files for writing the DMM output +C Developed by A.Rossi, C.Planas and G.Fiorentini +C +C Copyright (C) 2010-2014 European Commission +C C This file is part of Program DMM C -C DMM is free software developed at the Joint Research Centre of the -C European Commission: you can redistribute it and/or modify it under +C DMM is free software developed at the Joint Research Centre of the +C European Commission: you can redistribute it and/or modify it under C the terms of the GNU General Public License as published by C the Free Software Foundation, either version 3 of the License, or C (at your option) any later version. @@ -18,81 +18,81 @@ C MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the C GNU General Public License for more details. C C You should have received a copy of the GNU General Public License -C along with DMM. If not, see <http://www.gnu.org/licenses/>. -C -------------------------------------------------------------------------- - SUBROUTINE OPENFILES(ESTIMATION,SEED,NV,NF,NMIS,SIMULATION, - 1 MARGLIK,PATH,NMLNAME) - INTEGER SEED,nv,NF,NMIS - CHARACTER*1 SIMULATION,MARGLIK - CHARACTER*2 ESTIMATION - CHARACTER*3 CSEED - CHARACTER*200 NMLNAME,PATH,FILEOUT - - IF ((estimation.EQ.'ML').OR.(estimation.EQ.'ml').OR. - & (estimation.EQ.'Ml').OR.(estimation.EQ.'mL')) THEN - - FILEOUT = TRIM(PATH)//TRIM(NMLNAME)//'.PAR' - OPEN(9, FILE = FILEOUT, ACCESS='SEQUENTIAL') - - FILEOUT = TRIM(PATH)//TRIM(NMLNAME)//'.UNB' - OPEN(10,FILE = FILEOUT, ACCESS='SEQUENTIAL') - - IF (nv.GT.0) THEN - FILEOUT = TRIM(PATH)//TRIM(NMLNAME)//'.DIS' - OPEN(11,FILE = FILEOUT, ACCESS='SEQUENTIAL') - ENDIF - - FILEOUT = TRIM(PATH)//TRIM(NMLNAME)//'.INN' - OPEN(12, FILE = FILEOUT, ACCESS='SEQUENTIAL') - - ELSE - - IF (SEED.LE.9) THEN - WRITE(CSEED,'(I1)') SEED - ELSEIF ((SEED.GE.10).AND.(SEED.LE.99)) THEN - WRITE(CSEED,'(I2)') SEED - ELSEIF ((SEED.GE.100).AND.(SEED.LE.999)) THEN - WRITE(CSEED,'(I3)') SEED - ENDIF - - IF (nv.GT.0) THEN - FILEOUT = TRIM(PATH)//TRIM(NMLNAME)//TRIM(CSEED)//'.DIS' - OPEN(11,FILE = FILEOUT, ACCESS='SEQUENTIAL') - ENDIF - - FILEOUT = TRIM(PATH)//TRIM(NMLNAME)//TRIM(CSEED)//'.PAR' - OPEN(9, FILE = FILEOUT, ACCESS='SEQUENTIAL') - - FILEOUT = TRIM(PATH)//TRIM(NMLNAME)//TRIM(CSEED)//'.UNB' - OPEN(10,FILE = FILEOUT, ACCESS='SEQUENTIAL') - - IF ((SIMULATION.EQ.'N').OR.(SIMULATION.EQ.'n')) THEN - FILEOUT = TRIM(PATH)//TRIM(NMLNAME)//TRIM(CSEED)//'.INN' - OPEN(12, FILE = FILEOUT, ACCESS='SEQUENTIAL') - - IF (nf.GT.0) THEN - FILEOUT = TRIM(PATH)//TRIM(NMLNAME)//TRIM(CSEED)//'.FST' - OPEN(13,FILE = FILEOUT, ACCESS='SEQUENTIAL') - ENDIF - - IF (nmis.GT.0) THEN - FILEOUT = TRIM(PATH)//TRIM(NMLNAME)//TRIM(CSEED)//'.MIS' - OPEN(14,FILE = FILEOUT, ACCESS='SEQUENTIAL') - ENDIF - - IF ((MARGLIK.EQ.'Y').OR.(MARGLIK.EQ.'y')) THEN - FILEOUT = TRIM(PATH)//TRIM(NMLNAME)//TRIM(CSEED)//'.ML' - OPEN(15,FILE = FILEOUT, ACCESS='SEQUENTIAL') - ENDIF - - ELSE - - FILEOUT = TRIM(PATH)//TRIM(NMLNAME)//TRIM(CSEED)//'.DAT' - OPEN(15,FILE = FILEOUT, ACCESS='SEQUENTIAL') - - ENDIF - - ENDIF - - RETURN +C along with DMM. If not, see <http://www.gnu.org/licenses/>. +C -------------------------------------------------------------------------- + SUBROUTINE OPENFILES(ESTIMATION,SEED,NV,NF,NMIS,SIMULATION, + 1 MARGLIK,PATH,NMLNAME) + INTEGER SEED,nv,NF,NMIS + CHARACTER*1 SIMULATION,MARGLIK + CHARACTER*2 ESTIMATION + CHARACTER*3 CSEED + CHARACTER*200 NMLNAME,PATH,FILEOUT + + IF ((estimation.EQ.'ML').OR.(estimation.EQ.'ml').OR. + & (estimation.EQ.'Ml').OR.(estimation.EQ.'mL')) THEN + + FILEOUT = TRIM(PATH)//TRIM(NMLNAME)//'.PAR' + OPEN(9, FILE = FILEOUT, ACCESS='SEQUENTIAL') + + FILEOUT = TRIM(PATH)//TRIM(NMLNAME)//'.UNB' + OPEN(10,FILE = FILEOUT, ACCESS='SEQUENTIAL') + + IF (nv.GT.0) THEN + FILEOUT = TRIM(PATH)//TRIM(NMLNAME)//'.DIS' + OPEN(11,FILE = FILEOUT, ACCESS='SEQUENTIAL') + ENDIF + + FILEOUT = TRIM(PATH)//TRIM(NMLNAME)//'.INN' + OPEN(12, FILE = FILEOUT, ACCESS='SEQUENTIAL') + + ELSE + + IF (SEED.LE.9) THEN + WRITE(CSEED,'(I1)') SEED + ELSEIF ((SEED.GE.10).AND.(SEED.LE.99)) THEN + WRITE(CSEED,'(I2)') SEED + ELSEIF ((SEED.GE.100).AND.(SEED.LE.999)) THEN + WRITE(CSEED,'(I3)') SEED + ENDIF + + IF (nv.GT.0) THEN + FILEOUT = TRIM(PATH)//TRIM(NMLNAME)//TRIM(CSEED)//'.DIS' + OPEN(11,FILE = FILEOUT, ACCESS='SEQUENTIAL') + ENDIF + + FILEOUT = TRIM(PATH)//TRIM(NMLNAME)//TRIM(CSEED)//'.PAR' + OPEN(9, FILE = FILEOUT, ACCESS='SEQUENTIAL') + + FILEOUT = TRIM(PATH)//TRIM(NMLNAME)//TRIM(CSEED)//'.UNB' + OPEN(10,FILE = FILEOUT, ACCESS='SEQUENTIAL') + + IF ((SIMULATION.EQ.'N').OR.(SIMULATION.EQ.'n')) THEN + FILEOUT = TRIM(PATH)//TRIM(NMLNAME)//TRIM(CSEED)//'.INN' + OPEN(12, FILE = FILEOUT, ACCESS='SEQUENTIAL') + + IF (nf.GT.0) THEN + FILEOUT = TRIM(PATH)//TRIM(NMLNAME)//TRIM(CSEED)//'.FST' + OPEN(13,FILE = FILEOUT, ACCESS='SEQUENTIAL') + ENDIF + + IF (nmis.GT.0) THEN + FILEOUT = TRIM(PATH)//TRIM(NMLNAME)//TRIM(CSEED)//'.MIS' + OPEN(14,FILE = FILEOUT, ACCESS='SEQUENTIAL') + ENDIF + + IF ((MARGLIK.EQ.'Y').OR.(MARGLIK.EQ.'y')) THEN + FILEOUT = TRIM(PATH)//TRIM(NMLNAME)//TRIM(CSEED)//'.ML' + OPEN(15,FILE = FILEOUT, ACCESS='SEQUENTIAL') + ENDIF + + ELSE + + FILEOUT = TRIM(PATH)//TRIM(NMLNAME)//TRIM(CSEED)//'.DAT' + OPEN(15,FILE = FILEOUT, ACCESS='SEQUENTIAL') + + ENDIF + + ENDIF + + RETURN END diff --git a/opg.for b/opg.for index 30fa98b2f850124c0ef29806665452841033f9a0..19b1da244ea195bf4a9f73b479c924d95aadb0de 100644 --- a/opg.for +++ b/opg.for @@ -1,20 +1,20 @@ -C ------------------------------------------------------------ -C OPG coumputes the Var-Covar matrix of Parameters inverting -C the Observed Information matrix calcuted by outer product -C of gradient estimator - e.g. Davidson MacKinnon pp 265-66 -C Developed by A.Rossi, C.Planas and G.Fiorentini -C -C OUTPUT: SE = Standard deviations; -C IFAIL = 0 Hessian -C IFAIL = 1 OPG -C IFAIL = -1 Failure -C -C Copyright (C) 2010-2014 European Commission -C +C ------------------------------------------------------------ +C OPG coumputes the Var-Covar matrix of Parameters inverting +C the Observed Information matrix calcuted by outer product +C of gradient estimator - e.g. Davidson MacKinnon pp 265-66 +C Developed by A.Rossi, C.Planas and G.Fiorentini +C +C OUTPUT: SE = Standard deviations; +C IFAIL = 0 Hessian +C IFAIL = 1 OPG +C IFAIL = -1 Failure +C +C Copyright (C) 2010-2014 European Commission +C C This file is part of Program DMM C -C DMM is free software developed at the Joint Research Centre of the -C European Commission: you can redistribute it and/or modify it under +C DMM is free software developed at the Joint Research Centre of the +C European Commission: you can redistribute it and/or modify it under C the terms of the GNU General Public License as published by C the Free Software Foundation, either version 3 of the License, or C (at your option) any later version. @@ -25,179 +25,179 @@ C MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the C GNU General Public License for more details. C C You should have received a copy of the GNU General Public License -C along with DMM. If not, see <http://www.gnu.org/licenses/>. -C ------------------------------------------------------------ - SUBROUTINE OPG(nobs,d,ny,nz,nx,nu,nt,ns,pdll,yk,IYK,S, - 1 theta,thetaprior,HESS,SE,XS,AKMSE,INN,IFAIL) - - USE dfwin - INTERFACE - SUBROUTINE DESIGN(ny,nz,nx,nu,ns,nt,theta,c,H,G,a,F,R) - INTEGER ny,nz,nx,nu,ns(6),nt - DOUBLE PRECISION theta(nt) - DOUBLE PRECISION c(ny,max(1,nz),ns(1)),H(ny,nx,ns(2)), - 1 G(ny,nu,ns(3)),a(nx,ns(4)),F(nx,nx,ns(5)),R(nx,nu,ns(6)) - END SUBROUTINE - END INTERFACE - CHARACTER*1 fittizia - POINTER (pdll,fittizia) ! ASSOCIATE pointer pdll alla DLL ad una varibile fittizia - POINTER (pdesign,DESIGN) ! IMPORTANT associo il puntatore pdesign alla Interface definita - -! Input - INTEGER nobs,d(2),ny,nz,nx,nu,nt,ns(6),pdll,IYK(nobs,ny+1), - 1 S(nobs,6) - DOUBLE PRECISION yk(nobs,ny+nz),theta(nt),thetaprior(nt,4), - 1 HESS(nt*(nt+1)/2) -! Output - INTEGER IFAIL,IFAILSY - DOUBLE PRECISION SE(nt),XS(nobs,nx),AKMSE(nobs,nx),INN(nobs,ny) -! Locals - INTEGER I,J,K,IFREE(nt),NFREE - DOUBLE PRECISION DRI,RMAX - DOUBLE PRECISION, ALLOCATABLE:: THETAV(:),DLL(:),DLLM(:),XSM(:,:), - 1 XT(:,:),PT(:,:,:),Xdd(:,:),Pdd(:,:,:) - DOUBLE PRECISION, ALLOCATABLE:: c(:,:,:),H(:,:,:), - 1 G(:,:,:),a(:,:),F(:,:,:),R(:,:,:) - DOUBLE PRECISION, ALLOCATABLE:: GRAD(:,:),P(:),LTR(:), - 1 W(:),OP(:,:),MAT(:,:),VC(:,:),pro(:,:) - - SE(:) = 0.D0 - DRI = 1.D-3 - NFREE = 0 - DO 20 I = 1,nt - IF ((theta(I).GT.thetaprior(I,3)).AND. - 1 (theta(I).LT.thetaprior(I,4))) THEN - NFREE = NFREE + 1 - IFREE(NFREE) = I -20 ENDIF - -C Using Hessian from E04UCF - ALLOCATE (LTR(NFREE*(NFREE+1)/2),W(NFREE)) - DO 25 I=1,NFREE - DO 25 J=1,I - K = IFREE(I)*(IFREE(I)+1)/2-IFREE(I)+IFREE(J) -25 LTR(I*(I+1)/2-I+J) = HESS(K) - IFAIL = 0 - CALL SYMINV(LTR,NFREE,LTR,W,J,IFAIL,RMAX) - - ALLOCATE(GRAD(nobs,NFREE),P(NFREE),OP(NFREE,NFREE),MAT(nobs*nx,NFREE), - 1 VC(NFREE,NFREE),pro(nobs*nx,NFREE)) - ALLOCATE(c(ny,max(1,nz),ns(1)),H(ny,nx,ns(2)), - 1 G(ny,nu,ns(3)),a(nx,ns(4)),F(nx,nx,ns(5)),R(nx,nu,ns(6))) - ALLOCATE(THETAV(nt),DLL(nobs),DLLM(nobs),XSM(nobs,nx), - 1 XT(0:nobs,nx),PT(0:nobs,nx,nx),Xdd(max(d(1),1),nx), - 1 Pdd(max(d(1),1),nx,nx)) - - pdesign = getprocaddress(pdll, "design_"C) - CALL DESIGN(ny,nz,nx,nu,ns,nt,theta,c,H,G,a,F,R) - - CALL IKF(d,ny,nz,nx,nu,ns,S(1:max(d(1),1),1:6), - 1 yk(1:max(d(1),1),1:ny+nz),IYK(1:max(d(1),1),1:ny+1), - 2 c,H,G,a,F,R,Xdd,Pdd,DLL(1:max(d(1),1))) - XT(d(1),1:nx) = Xdd(max(d(1),1),1:nx) - PT(d(1),1:nx,1:nx) = Pdd(max(d(1),1),1:nx,1:nx) - CALL KF(nobs,d,ny,nz,nx,nu,ns,S,yk,IYK,c,H,G,a,F,R,XT,PT,DLL) - CALL KS(nobs,d,ny,nz,nx,nu,ns,S,yk,IYK,c,H,G,a,F,R,XS, - 1 PT(1:nobs,1:nx,1:nx)) - CALL INNOV(nobs,d,ny,nz,nx,nu,ns,nt,S,yk,IYK,theta,pdll,INN) - - AKMSE(1:d(1),:) = 0.D0 - DO I = d(1)+1,nobs - DO J = 1,nx - AKMSE(I,J) = PT(I,J,J) - END DO - END DO - - THETAV(1:NFREE) = theta(IFREE(1:NFREE)) - P(1:NFREE) = THETAV(1:NFREE)*DRI - DO I=1,NFREE - IF(DABS(P(I)).LT.1.D-13) P(I)=1.D-13 - IF (((theta(IFREE(I))+P(I)).GT.THETAPRIOR(IFREE(I),4)).OR. - 1 ((theta(IFREE(I))+P(I)).LT.THETAPRIOR(IFREE(I),3))) THEN - IF (theta(IFREE(I)).GT.0.D0) THEN - P(I) = THETAPRIOR(IFREE(I),3) - theta(IFREE(I)) - ELSE - P(I) = THETAPRIOR(IFREE(I),4) - theta(IFREE(I)) - ENDIF - ENDIF - END DO - - DO 1000 I=1,NFREE - THETAV(I) = THETAV(I) + P(I) - theta(IFREE(I)) = THETAV(I) - CALL DESIGN(ny,nz,nx,nu,ns,nt,theta,c,H,G,a,F,R) - CALL IKF(d,ny,nz,nx,nu,ns,S(1:max(d(1),1),1:6), - 1 yk(1:max(d(1),1),1:ny+nz),IYK(1:max(d(1),1),1:ny+1), - 2 c,H,G,a,F,R,Xdd,Pdd,DLLM(1:max(d(1),1))) - XT(d(1),1:nx) = Xdd(max(d(1),1),1:nx) - PT(d(1),1:nx,1:nx) = Pdd(max(d(1),1),1:nx,1:nx) - CALL KF(nobs,d,ny,nz,nx,nu,ns,S,yk,IYK,c,H,G,a,F,R,XT,PT,DLLM) - CALL KS(nobs,d,ny,nz,nx,nu,ns,S,yk,IYK,c,H,G,a,F,R,XSM, - 1 PT(1:nobs,1:nx,1:nx)) - THETAV(I) = THETAV(I) - P(I) - theta(IFREE(I)) = THETAV(I) - GRAD(2:nobs,I) = (DLLM(2:nobs) - DLL(2:nobs))/P(I) - - DO J = 1,nx ! MAT (nobs x nx) x nfree - MAT(1+(J-1)*nobs:J*nobs,I) = (XSM(:,J)-XS(:,J))/P(I) - ENDDO -1000 CONTINUE - -C Use OPG if Hessian is bad - IF (IFAIL.GT.0) THEN - DO 300 I=1,NFREE - DO 300 J=1,I -300 OP(I,J) = SUM(GRAD(2:nobs,I)*GRAD(2:nobs,J)) - - DO 150 I=1,NFREE - DO 150 J=1,I -150 LTR(i*(i+1)/2-i+j)=OP(I,J) - IFAIL = 1 - CALL SYMINV(LTR,NFREE,LTR,W,J,IFAILSY,RMAX) - IF (IFAILSY.NE.0) THEN - IFAIL = -1 - GOTO 1111 - ENDIF - ENDIF - -C ------------------------------------------------------ -C Computes MAT(i,:)*VC*MAT(:,i) for each i=1,2,..,nobs -C ------------------------------------------------------ - DO 170 i=1,NFREE - VC(i,i)=LTR(i*(i+1)/2) - SE(IFREE(i)) = DSQRT(LTR(i*(i+1)/2)) - DO 170 j=1,i-1 - VC(i,j)=LTR(i*(i+1)/2-i+j) -170 VC(j,i)=VC(i,j) - - DO 301 I = 1,nobs*nx ! pro = MAT x VC - DO 301 J = 1,Nfree ! (nobsxnx)xnt x nt x nt -301 pro(i,j) = SUM(MAT(i,1:NFREE)*VC(1:NFREE,j)) - -C AKMSE: first nobs = var of nobs estimate of first state element - DO I = d(1)+1,nobs - DO J = 1,nx - AKMSE(I,J) = AKMSE(I,J) + SUM(pro(nobs*(J-1)+I,1:NFREE)* - 1 MAT(nobs*(J-1)+I,1:NFREE)) - ENDDO - ENDDO - -1111 DO I = 1,nobs - DO J = 1,nx - AKMSE(I,J) = DSQRT(AKMSE(I,J)) - ENDDO - ENDDO - - DEALLOCATE(OP,W,LTR,P,GRAD,MAT,VC,pro) - DEALLOCATE(c,H,G,a,F,R,THETAV,DLL,DLLM,XSM,XT,PT,Xdd,Pdd) - - RETURN - END - -cELSE -c CALL KIM2(nobs,d,ny,nz,nx,nu,ns,PRODUCT(ns),nv,np,INFOS,yk, -c 1 c,H,G,a,F,R,psi,1,XS,AKMSE,SSMOOTH,DLL) -c DO I=1,NFREE -c SE(IFREE(I)) = DSQRT(LTR(I*(I+1)/2)) -c ENDDO -c ENDIF +C along with DMM. If not, see <http://www.gnu.org/licenses/>. +C ------------------------------------------------------------ + SUBROUTINE OPG(nobs,d,ny,nz,nx,nu,nt,ns,pdll,yk,IYK,S, + 1 theta,thetaprior,HESS,SE,XS,AKMSE,INN,IFAIL) + + USE dfwin + INTERFACE + SUBROUTINE DESIGN(ny,nz,nx,nu,ns,nt,theta,c,H,G,a,F,R) + INTEGER ny,nz,nx,nu,ns(6),nt + DOUBLE PRECISION theta(nt) + DOUBLE PRECISION c(ny,max(1,nz),ns(1)),H(ny,nx,ns(2)), + 1 G(ny,nu,ns(3)),a(nx,ns(4)),F(nx,nx,ns(5)),R(nx,nu,ns(6)) + END SUBROUTINE + END INTERFACE + CHARACTER*1 fittizia + POINTER (pdll,fittizia) ! ASSOCIATE pointer pdll alla DLL ad una varibile fittizia + POINTER (pdesign,DESIGN) ! IMPORTANT associo il puntatore pdesign alla Interface definita + +! Input + INTEGER nobs,d(2),ny,nz,nx,nu,nt,ns(6),pdll,IYK(nobs,ny+1), + 1 S(nobs,6) + DOUBLE PRECISION yk(nobs,ny+nz),theta(nt),thetaprior(nt,4), + 1 HESS(nt*(nt+1)/2) +! Output + INTEGER IFAIL,IFAILSY + DOUBLE PRECISION SE(nt),XS(nobs,nx),AKMSE(nobs,nx),INN(nobs,ny) +! Locals + INTEGER I,J,K,IFREE(nt),NFREE + DOUBLE PRECISION DRI,RMAX + DOUBLE PRECISION, ALLOCATABLE:: THETAV(:),DLL(:),DLLM(:),XSM(:,:), + 1 XT(:,:),PT(:,:,:),Xdd(:,:),Pdd(:,:,:) + DOUBLE PRECISION, ALLOCATABLE:: c(:,:,:),H(:,:,:), + 1 G(:,:,:),a(:,:),F(:,:,:),R(:,:,:) + DOUBLE PRECISION, ALLOCATABLE:: GRAD(:,:),P(:),LTR(:), + 1 W(:),OP(:,:),MAT(:,:),VC(:,:),pro(:,:) + + SE(:) = 0.D0 + DRI = 1.D-3 + NFREE = 0 + DO 20 I = 1,nt + IF ((theta(I).GT.thetaprior(I,3)).AND. + 1 (theta(I).LT.thetaprior(I,4))) THEN + NFREE = NFREE + 1 + IFREE(NFREE) = I +20 ENDIF + +C Using Hessian from E04UCF + ALLOCATE (LTR(NFREE*(NFREE+1)/2),W(NFREE)) + DO 25 I=1,NFREE + DO 25 J=1,I + K = IFREE(I)*(IFREE(I)+1)/2-IFREE(I)+IFREE(J) +25 LTR(I*(I+1)/2-I+J) = HESS(K) + IFAIL = 0 + CALL SYMINV(LTR,NFREE,LTR,W,J,IFAIL,RMAX) + + ALLOCATE(GRAD(nobs,NFREE),P(NFREE),OP(NFREE,NFREE),MAT(nobs*nx,NFREE), + 1 VC(NFREE,NFREE),pro(nobs*nx,NFREE)) + ALLOCATE(c(ny,max(1,nz),ns(1)),H(ny,nx,ns(2)), + 1 G(ny,nu,ns(3)),a(nx,ns(4)),F(nx,nx,ns(5)),R(nx,nu,ns(6))) + ALLOCATE(THETAV(nt),DLL(nobs),DLLM(nobs),XSM(nobs,nx), + 1 XT(0:nobs,nx),PT(0:nobs,nx,nx),Xdd(max(d(1),1),nx), + 1 Pdd(max(d(1),1),nx,nx)) + + pdesign = getprocaddress(pdll, "design_"C) + CALL DESIGN(ny,nz,nx,nu,ns,nt,theta,c,H,G,a,F,R) + + CALL IKF(d,ny,nz,nx,nu,ns,S(1:max(d(1),1),1:6), + 1 yk(1:max(d(1),1),1:ny+nz),IYK(1:max(d(1),1),1:ny+1), + 2 c,H,G,a,F,R,Xdd,Pdd,DLL(1:max(d(1),1))) + XT(d(1),1:nx) = Xdd(max(d(1),1),1:nx) + PT(d(1),1:nx,1:nx) = Pdd(max(d(1),1),1:nx,1:nx) + CALL KF(nobs,d,ny,nz,nx,nu,ns,S,yk,IYK,c,H,G,a,F,R,XT,PT,DLL) + CALL KS(nobs,d,ny,nz,nx,nu,ns,S,yk,IYK,c,H,G,a,F,R,XS, + 1 PT(1:nobs,1:nx,1:nx)) + CALL INNOV(nobs,d,ny,nz,nx,nu,ns,nt,S,yk,IYK,theta,pdll,INN) + + AKMSE(1:d(1),:) = 0.D0 + DO I = d(1)+1,nobs + DO J = 1,nx + AKMSE(I,J) = PT(I,J,J) + END DO + END DO + + THETAV(1:NFREE) = theta(IFREE(1:NFREE)) + P(1:NFREE) = THETAV(1:NFREE)*DRI + DO I=1,NFREE + IF(DABS(P(I)).LT.1.D-13) P(I)=1.D-13 + IF (((theta(IFREE(I))+P(I)).GT.THETAPRIOR(IFREE(I),4)).OR. + 1 ((theta(IFREE(I))+P(I)).LT.THETAPRIOR(IFREE(I),3))) THEN + IF (theta(IFREE(I)).GT.0.D0) THEN + P(I) = THETAPRIOR(IFREE(I),3) - theta(IFREE(I)) + ELSE + P(I) = THETAPRIOR(IFREE(I),4) - theta(IFREE(I)) + ENDIF + ENDIF + END DO + + DO 1000 I=1,NFREE + THETAV(I) = THETAV(I) + P(I) + theta(IFREE(I)) = THETAV(I) + CALL DESIGN(ny,nz,nx,nu,ns,nt,theta,c,H,G,a,F,R) + CALL IKF(d,ny,nz,nx,nu,ns,S(1:max(d(1),1),1:6), + 1 yk(1:max(d(1),1),1:ny+nz),IYK(1:max(d(1),1),1:ny+1), + 2 c,H,G,a,F,R,Xdd,Pdd,DLLM(1:max(d(1),1))) + XT(d(1),1:nx) = Xdd(max(d(1),1),1:nx) + PT(d(1),1:nx,1:nx) = Pdd(max(d(1),1),1:nx,1:nx) + CALL KF(nobs,d,ny,nz,nx,nu,ns,S,yk,IYK,c,H,G,a,F,R,XT,PT,DLLM) + CALL KS(nobs,d,ny,nz,nx,nu,ns,S,yk,IYK,c,H,G,a,F,R,XSM, + 1 PT(1:nobs,1:nx,1:nx)) + THETAV(I) = THETAV(I) - P(I) + theta(IFREE(I)) = THETAV(I) + GRAD(2:nobs,I) = (DLLM(2:nobs) - DLL(2:nobs))/P(I) + + DO J = 1,nx ! MAT (nobs x nx) x nfree + MAT(1+(J-1)*nobs:J*nobs,I) = (XSM(:,J)-XS(:,J))/P(I) + ENDDO +1000 CONTINUE + +C Use OPG if Hessian is bad + IF (IFAIL.GT.0) THEN + DO 300 I=1,NFREE + DO 300 J=1,I +300 OP(I,J) = SUM(GRAD(2:nobs,I)*GRAD(2:nobs,J)) + + DO 150 I=1,NFREE + DO 150 J=1,I +150 LTR(i*(i+1)/2-i+j)=OP(I,J) + IFAIL = 1 + CALL SYMINV(LTR,NFREE,LTR,W,J,IFAILSY,RMAX) + IF (IFAILSY.NE.0) THEN + IFAIL = -1 + GOTO 1111 + ENDIF + ENDIF + +C ------------------------------------------------------ +C Computes MAT(i,:)*VC*MAT(:,i) for each i=1,2,..,nobs +C ------------------------------------------------------ + DO 170 i=1,NFREE + VC(i,i)=LTR(i*(i+1)/2) + SE(IFREE(i)) = DSQRT(LTR(i*(i+1)/2)) + DO 170 j=1,i-1 + VC(i,j)=LTR(i*(i+1)/2-i+j) +170 VC(j,i)=VC(i,j) + + DO 301 I = 1,nobs*nx ! pro = MAT x VC + DO 301 J = 1,Nfree ! (nobsxnx)xnt x nt x nt +301 pro(i,j) = SUM(MAT(i,1:NFREE)*VC(1:NFREE,j)) + +C AKMSE: first nobs = var of nobs estimate of first state element + DO I = d(1)+1,nobs + DO J = 1,nx + AKMSE(I,J) = AKMSE(I,J) + SUM(pro(nobs*(J-1)+I,1:NFREE)* + 1 MAT(nobs*(J-1)+I,1:NFREE)) + ENDDO + ENDDO + +1111 DO I = 1,nobs + DO J = 1,nx + AKMSE(I,J) = DSQRT(AKMSE(I,J)) + ENDDO + ENDDO + + DEALLOCATE(OP,W,LTR,P,GRAD,MAT,VC,pro) + DEALLOCATE(c,H,G,a,F,R,THETAV,DLL,DLLM,XSM,XT,PT,Xdd,Pdd) + + RETURN + END + +cELSE +c CALL KIM2(nobs,d,ny,nz,nx,nu,ns,PRODUCT(ns),nv,np,INFOS,yk, +c 1 c,H,G,a,F,R,psi,1,XS,AKMSE,SSMOOTH,DLL) +c DO I=1,NFREE +c SE(IFREE(I)) = DSQRT(LTR(I*(I+1)/2)) +c ENDDO +c ENDIF diff --git a/opgh.for b/opgh.for index 6d7f8b6e44b690644cd8c96ec61e9f2196fb560c..279a5d3e562821244f23ca67408ed9a308962e87 100644 --- a/opgh.for +++ b/opgh.for @@ -1,21 +1,21 @@ -C ------------------------------------------------------------ -C OPGH coumputes the Var-Covar matrix of Parameters inverting -C the Observed Information matrix calcuted by outer product -C of gradient estimator - e.g. Davidson MacKinnon pp 265-66 -C for MS-VAR(1) models -C Developed by A.Rossi, C.Planas and G.Fiorentini -C -C OUTPUT: SE = Standard deviations; -C IFAIL = 0 Hessian -C IFAIL = 1 OPG -C IFAIL = -1 Failure -C -C Copyright (C) 2010-2014 European Commission -C +C ------------------------------------------------------------ +C OPGH coumputes the Var-Covar matrix of Parameters inverting +C the Observed Information matrix calcuted by outer product +C of gradient estimator - e.g. Davidson MacKinnon pp 265-66 +C for MS-VAR(1) models +C Developed by A.Rossi, C.Planas and G.Fiorentini +C +C OUTPUT: SE = Standard deviations; +C IFAIL = 0 Hessian +C IFAIL = 1 OPG +C IFAIL = -1 Failure +C +C Copyright (C) 2010-2014 European Commission +C C This file is part of Program DMM C -C DMM is free software developed at the Joint Research Centre of the -C European Commission: you can redistribute it and/or modify it under +C DMM is free software developed at the Joint Research Centre of the +C European Commission: you can redistribute it and/or modify it under C the terms of the GNU General Public License as published by C the Free Software Foundation, either version 3 of the License, or C (at your option) any later version. @@ -26,147 +26,147 @@ C MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the C GNU General Public License for more details. C C You should have received a copy of the GNU General Public License -C along with DMM. If not, see <http://www.gnu.org/licenses/>. -C ------------------------------------------------------------ - SUBROUTINE OPGH(nobs,ny,nz,nx,nu,nt,nv,ns,nstot,np,pdll,yk,IYK, - 1 INFOS,theta,psi,thetaprior,HESS,thetase,psise, - 1 SSMOOTH,INN,IFAIL) - - USE dfwin - INTERFACE - SUBROUTINE DESIGN(ny,nz,nx,nu,ns,nt,theta,c,H,G,a,F,R) - INTEGER ny,nz,nx,nu,ns(6),nt - DOUBLE PRECISION theta(nt) - DOUBLE PRECISION c(ny,max(1,nz),ns(1)),H(ny,nx,ns(2)), - 1 G(ny,nu,ns(3)),a(nx,ns(4)),F(nx,nx,ns(5)),R(nx,nu,ns(6)) - END SUBROUTINE - END INTERFACE - CHARACTER*1 fittizia - POINTER (pdll,fittizia) ! ASSOCIATE pointer pdll alla DLL ad una varibile fittizia - POINTER (pdesign,DESIGN) ! IMPORTANT associo il puntatore pdesign alla Interface definita - -! Input - INTEGER nobs,ny,nz,nx,nu,nt,nv,ns(6),nstot,np,pdll,IYK(nobs,ny+1), - 1 INFOS(9,6) - DOUBLE PRECISION yk(nobs,ny+nz),theta(nt),psi(np), - 1 thetaprior(nt,4),HESS((nt+np)*(nt+np+1)/2) -! Output - INTEGER IFAIL - DOUBLE PRECISION thetase(nt),psise(np),SSMOOTH(nobs,nstot), - 1 INN(nobs,ny) -! Locals - INTEGER I,J,K,IFREE(nt+np),NFREE,NFT - DOUBLE PRECISION DRI,PAR(nt+np),DLL(nobs),DLLM(nobs),RMAX - DOUBLE PRECISION c(ny,max(1,nz),ns(1)),H(ny,nx,ns(2)), - 1 G(ny,nu,ns(3)),a(nx,ns(4)),F(nx,nx,ns(5)),R(nx,nu,ns(6)) - DOUBLE PRECISION, ALLOCATABLE:: GRAD(:,:),P(:),LTR(:), - 1 W(:),OP(:,:),VC(:,:),pro(:,:) - - thetase(:) = 0.D0 - psise(:) = 0.D0 - IFAIL = 0 - DRI = 1.D-3 - NFREE = 0 - DO 20 I = 1,nt - IF ((theta(I).GT.thetaprior(I,3)).AND. - 1 (theta(I).LT.thetaprior(I,4))) THEN - NFREE = NFREE + 1 - IFREE(NFREE) = I - PAR(NFREE) = theta(I) -20 ENDIF - NFT = NFREE ! only theta free param - DO 21 I = 1,np - IF ((psi(I).GT..001D0).AND.(psi(I).LT..999D0)) THEN - NFREE = NFREE + 1 - IFREE(NFREE) = I+nt - PAR(NFREE) = psi(I) -21 ENDIF - - ALLOCATE (LTR(NFREE*(NFREE+1)/2),W(NFREE)) - DO 25 I=1,NFREE - DO 25 J=1,I - K = IFREE(I)*(IFREE(I)+1)/2-IFREE(I)+IFREE(J) -25 LTR(I*(I+1)/2-I+J) = HESS(K) - IFAIL = 0 - CALL SYMINV(LTR,NFREE,LTR,W,J,IFAIL,RMAX) - - pdesign = getprocaddress(pdll, "design_"C) - CALL DESIGN(ny,nz,nx,nu,ns,nt,theta,c,H,G,a,F,R) - CALL HF(nobs,nx,nstot,nz,nu,ns,nv,np,psi,1,yk,IYK,INFOS, - 1 c,a,F,R,SSMOOTH,INN,DLL) - - IF (IFAIL.GT.0) THEN - ALLOCATE (GRAD(Nobs,NFREE),P(NFREE),OP(NFREE,NFREE), - 1 VC(NFREE,NFREE),pro(nobs*nx,NFREE)) - - LTR(:) = 0.D0 - W(:) = 0.D0 - GRAD(:,:)= 0.D0 - P(:) = 0.D0 - OP(:,:) = 0.D0 - P(1:NFREE) = PAR(1:NFREE)*DRI ! delta - DO I=1,NFT - IF(DABS(P(I)).LT.1.D-13) P(I)=1.D-13 - IF (((theta(IFREE(I))+P(I)).GT.thetaprior(IFREE(I),4)).OR. - 1 ((theta(IFREE(I))+P(I)).LT.thetaprior(IFREE(I),3))) THEN - IF (theta(IFREE(I)).GT.0.D0) THEN - P(I) = thetaprior(IFREE(I),3) - theta(IFREE(I)) - ELSE - P(I) = thetaprior(IFREE(I),4) - theta(IFREE(I)) - ENDIF - ENDIF - END DO - - DO I=NFT+1,NFREE - IF (DABS(P(I)).LT.1.D-13) P(I)=1.D-13 - IF (((psi(I-NFT)+P(I)).GT.999D0).OR. - 1 ((psi(I-NFT)+P(I)).LT..001D0)) THEN - P(I) = .001D0 - psi(I-NFT) - ENDIF - END DO - -C ----------- -C Main Cycle -C ----------- - DO 1000 I=1,NFREE - PAR(I) = PAR(I) + P(I) - IF (I.LE.NFT) THEN - theta(IFREE(I)) = PAR(I) - ELSE - psi(I-NFT) = PAR(I) - ENDIF - CALL DESIGN(ny,nz,nx,nu,ns,nt,theta,c,H,G,a,F,R) - CALL HF(nobs,nx,nstot,nz,nu,ns,nv,np,psi,0,yk,IYK,INFOS, - 1 c,a,F,R,SSMOOTH,INN,DLLM) - PAR(I) = PAR(I) - P(I) - IF (I.LE.NFT) THEN - theta(IFREE(I)) = PAR(I) - ELSE - psi(I-NFT) = PAR(I) - ENDIF - GRAD(2:nobs,I) = (DLLM(2:nobs) - DLL(2:nobs))/P(I) -1000 CONTINUE - -C Use OPG if Hessian is bad - DO 300 I=1,NFREE - DO 300 J=1,I -300 OP(I,J) = SUM(GRAD(2:Nobs,I)*GRAD(2:Nobs,J)) - - DO 150 I=1,NFREE - DO 150 J=1,I -150 LTR(i*(i+1)/2-i+j) = OP(I,J) - CALL SYMINV(LTR,NFREE,LTR,W,J,IFAIL,RMAX) - IF (IFAIL.NE.0) GO TO 1111 - DEALLOCATE (OP,W,P,GRAD,VC,pro) - ENDIF - - DO i=1,NFT - thetase(IFREE(I))=dsqrt(LTR(i*(i+1)/2)) - ENDDO - DO i=NFT+1,NFREE - psise(I-NFT)=dsqrt(LTR(i*(i+1)/2)) - ENDDO - -1111 DEALLOCATE (LTR) - RETURN +C along with DMM. If not, see <http://www.gnu.org/licenses/>. +C ------------------------------------------------------------ + SUBROUTINE OPGH(nobs,ny,nz,nx,nu,nt,nv,ns,nstot,np,pdll,yk,IYK, + 1 INFOS,theta,psi,thetaprior,HESS,thetase,psise, + 1 SSMOOTH,INN,IFAIL) + + USE dfwin + INTERFACE + SUBROUTINE DESIGN(ny,nz,nx,nu,ns,nt,theta,c,H,G,a,F,R) + INTEGER ny,nz,nx,nu,ns(6),nt + DOUBLE PRECISION theta(nt) + DOUBLE PRECISION c(ny,max(1,nz),ns(1)),H(ny,nx,ns(2)), + 1 G(ny,nu,ns(3)),a(nx,ns(4)),F(nx,nx,ns(5)),R(nx,nu,ns(6)) + END SUBROUTINE + END INTERFACE + CHARACTER*1 fittizia + POINTER (pdll,fittizia) ! ASSOCIATE pointer pdll alla DLL ad una varibile fittizia + POINTER (pdesign,DESIGN) ! IMPORTANT associo il puntatore pdesign alla Interface definita + +! Input + INTEGER nobs,ny,nz,nx,nu,nt,nv,ns(6),nstot,np,pdll,IYK(nobs,ny+1), + 1 INFOS(9,6) + DOUBLE PRECISION yk(nobs,ny+nz),theta(nt),psi(np), + 1 thetaprior(nt,4),HESS((nt+np)*(nt+np+1)/2) +! Output + INTEGER IFAIL + DOUBLE PRECISION thetase(nt),psise(np),SSMOOTH(nobs,nstot), + 1 INN(nobs,ny) +! Locals + INTEGER I,J,K,IFREE(nt+np),NFREE,NFT + DOUBLE PRECISION DRI,PAR(nt+np),DLL(nobs),DLLM(nobs),RMAX + DOUBLE PRECISION c(ny,max(1,nz),ns(1)),H(ny,nx,ns(2)), + 1 G(ny,nu,ns(3)),a(nx,ns(4)),F(nx,nx,ns(5)),R(nx,nu,ns(6)) + DOUBLE PRECISION, ALLOCATABLE:: GRAD(:,:),P(:),LTR(:), + 1 W(:),OP(:,:),VC(:,:),pro(:,:) + + thetase(:) = 0.D0 + psise(:) = 0.D0 + IFAIL = 0 + DRI = 1.D-3 + NFREE = 0 + DO 20 I = 1,nt + IF ((theta(I).GT.thetaprior(I,3)).AND. + 1 (theta(I).LT.thetaprior(I,4))) THEN + NFREE = NFREE + 1 + IFREE(NFREE) = I + PAR(NFREE) = theta(I) +20 ENDIF + NFT = NFREE ! only theta free param + DO 21 I = 1,np + IF ((psi(I).GT..001D0).AND.(psi(I).LT..999D0)) THEN + NFREE = NFREE + 1 + IFREE(NFREE) = I+nt + PAR(NFREE) = psi(I) +21 ENDIF + + ALLOCATE (LTR(NFREE*(NFREE+1)/2),W(NFREE)) + DO 25 I=1,NFREE + DO 25 J=1,I + K = IFREE(I)*(IFREE(I)+1)/2-IFREE(I)+IFREE(J) +25 LTR(I*(I+1)/2-I+J) = HESS(K) + IFAIL = 0 + CALL SYMINV(LTR,NFREE,LTR,W,J,IFAIL,RMAX) + + pdesign = getprocaddress(pdll, "design_"C) + CALL DESIGN(ny,nz,nx,nu,ns,nt,theta,c,H,G,a,F,R) + CALL HF(nobs,nx,nstot,nz,nu,ns,nv,np,psi,1,yk,IYK,INFOS, + 1 c,a,F,R,SSMOOTH,INN,DLL) + + IF (IFAIL.GT.0) THEN + ALLOCATE (GRAD(Nobs,NFREE),P(NFREE),OP(NFREE,NFREE), + 1 VC(NFREE,NFREE),pro(nobs*nx,NFREE)) + + LTR(:) = 0.D0 + W(:) = 0.D0 + GRAD(:,:)= 0.D0 + P(:) = 0.D0 + OP(:,:) = 0.D0 + P(1:NFREE) = PAR(1:NFREE)*DRI ! delta + DO I=1,NFT + IF(DABS(P(I)).LT.1.D-13) P(I)=1.D-13 + IF (((theta(IFREE(I))+P(I)).GT.thetaprior(IFREE(I),4)).OR. + 1 ((theta(IFREE(I))+P(I)).LT.thetaprior(IFREE(I),3))) THEN + IF (theta(IFREE(I)).GT.0.D0) THEN + P(I) = thetaprior(IFREE(I),3) - theta(IFREE(I)) + ELSE + P(I) = thetaprior(IFREE(I),4) - theta(IFREE(I)) + ENDIF + ENDIF + END DO + + DO I=NFT+1,NFREE + IF (DABS(P(I)).LT.1.D-13) P(I)=1.D-13 + IF (((psi(I-NFT)+P(I)).GT.999D0).OR. + 1 ((psi(I-NFT)+P(I)).LT..001D0)) THEN + P(I) = .001D0 - psi(I-NFT) + ENDIF + END DO + +C ----------- +C Main Cycle +C ----------- + DO 1000 I=1,NFREE + PAR(I) = PAR(I) + P(I) + IF (I.LE.NFT) THEN + theta(IFREE(I)) = PAR(I) + ELSE + psi(I-NFT) = PAR(I) + ENDIF + CALL DESIGN(ny,nz,nx,nu,ns,nt,theta,c,H,G,a,F,R) + CALL HF(nobs,nx,nstot,nz,nu,ns,nv,np,psi,0,yk,IYK,INFOS, + 1 c,a,F,R,SSMOOTH,INN,DLLM) + PAR(I) = PAR(I) - P(I) + IF (I.LE.NFT) THEN + theta(IFREE(I)) = PAR(I) + ELSE + psi(I-NFT) = PAR(I) + ENDIF + GRAD(2:nobs,I) = (DLLM(2:nobs) - DLL(2:nobs))/P(I) +1000 CONTINUE + +C Use OPG if Hessian is bad + DO 300 I=1,NFREE + DO 300 J=1,I +300 OP(I,J) = SUM(GRAD(2:Nobs,I)*GRAD(2:Nobs,J)) + + DO 150 I=1,NFREE + DO 150 J=1,I +150 LTR(i*(i+1)/2-i+j) = OP(I,J) + CALL SYMINV(LTR,NFREE,LTR,W,J,IFAIL,RMAX) + IF (IFAIL.NE.0) GO TO 1111 + DEALLOCATE (OP,W,P,GRAD,VC,pro) + ENDIF + + DO i=1,NFT + thetase(IFREE(I))=dsqrt(LTR(i*(i+1)/2)) + ENDDO + DO i=NFT+1,NFREE + psise(I-NFT)=dsqrt(LTR(i*(i+1)/2)) + ENDDO + +1111 DEALLOCATE (LTR) + RETURN END diff --git a/opgkim.for b/opgkim.for index f409dffba1fc6cdbb78140a3f74d882eb5d1fac9..0022269dd155b77bb4eda8a5b93ee2f72a858a01 100644 --- a/opgkim.for +++ b/opgkim.for @@ -1,20 +1,20 @@ -C ------------------------------------------------------------ -C OPGKIM coumputes the Var-Covar matrix of Parameters inverting -C the Observed Information matrix calcuted by outer product -C of gradient estimator - e.g. Davidson MacKinnon pp 265-66 -C Developed by A.Rossi, C.Planas and G.Fiorentini -C -C OUTPUT: SE = Standard deviations; -C IFAIL = 0 Hessian -C IFAIL = 1 OPG -C IFAIL = -1 Failure -C -C Copyright (C) 2010-2014 European Commission -C +C ------------------------------------------------------------ +C OPGKIM coumputes the Var-Covar matrix of Parameters inverting +C the Observed Information matrix calcuted by outer product +C of gradient estimator - e.g. Davidson MacKinnon pp 265-66 +C Developed by A.Rossi, C.Planas and G.Fiorentini +C +C OUTPUT: SE = Standard deviations; +C IFAIL = 0 Hessian +C IFAIL = 1 OPG +C IFAIL = -1 Failure +C +C Copyright (C) 2010-2014 European Commission +C C This file is part of Program DMM C -C DMM is free software developed at the Joint Research Centre of the -C European Commission: you can redistribute it and/or modify it under +C DMM is free software developed at the Joint Research Centre of the +C European Commission: you can redistribute it and/or modify it under C the terms of the GNU General Public License as published by C the Free Software Foundation, either version 3 of the License, or C (at your option) any later version. @@ -25,150 +25,150 @@ C MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the C GNU General Public License for more details. C C You should have received a copy of the GNU General Public License -C along with DMM. If not, see <http://www.gnu.org/licenses/>. -C ------------------------------------------------------------ - SUBROUTINE OPGKIM(nobs,d,ny,nz,nx,nu,nt,nv,ns,nstot,np,pdll,yk, - 1 IYK,INFOS,theta,psi,thetaprior,HESS,thetase, - 1 psise,XS,XSSE,SSMOOTH,INN,IFAIL) - - - USE dfwin - INTERFACE - SUBROUTINE DESIGN(ny,nz,nx,nu,ns,nt,theta,c,H,G,a,F,R) - INTEGER ny,nz,nx,nu,ns(6),nt - DOUBLE PRECISION theta(nt) - DOUBLE PRECISION c(ny,max(1,nz),ns(1)),H(ny,nx,ns(2)), - 1 G(ny,nu,ns(3)),a(nx,ns(4)),F(nx,nx,ns(5)),R(nx,nu,ns(6)) - END SUBROUTINE - END INTERFACE - CHARACTER*1 fittizia - POINTER (pdll,fittizia) ! ASSOCIATE pointer pdll alla DLL ad una varibile fittizia - POINTER (pdesign,DESIGN) ! IMPORTANT associo il puntatore pdesign alla Interface definita - -! Input - INTEGER nobs,d(2),ny,nz,nx,nu,nt,nv,ns(6),nstot,np,pdll,IYK(nobs,ny+1), - 1 INFOS(9,6) - DOUBLE PRECISION yk(nobs,ny+nz),theta(nt),psi(np), - 1 thetaprior(nt,4),HESS((nt+np)*(nt+np+1)/2) -! Output - INTEGER IFAIL - DOUBLE PRECISION thetase(nt),psise(np),XS(nobs,nx),XSSE(nobs,nx), - 1 SSMOOTH(nobs,nstot),INN(nobs,ny) -! Locals - INTEGER I,J,K,IFREE(nt+np),NFREE,NFT - DOUBLE PRECISION DRI,PAR(nt+np),DLL(nobs),DLLM(nobs),RMAX - DOUBLE PRECISION c(ny,max(1,nz),ns(1)),H(ny,nx,ns(2)), - 1 G(ny,nu,ns(3)),a(nx,ns(4)),F(nx,nx,ns(5)),R(nx,nu,ns(6)) - DOUBLE PRECISION, ALLOCATABLE:: GRAD(:,:),P(:),LTR(:), - 1 W(:),OP(:,:),VC(:,:),pro(:,:) - - thetase(:) = 0.D0 - psise(:) = 0.D0 - IFAIL = 0 - DRI = 1.D-3 - NFREE = 0 - DO 20 I = 1,nt - IF ((theta(I).GT.thetaprior(I,3)).AND. - 1 (theta(I).LT.thetaprior(I,4))) THEN - NFREE = NFREE + 1 - IFREE(NFREE) = I - PAR(NFREE) = theta(I) -20 ENDIF - NFT = NFREE ! only theta free param - DO 21 I = 1,np - IF ((psi(I).GT..001D0).AND.(psi(I).LT..999D0)) THEN - NFREE = NFREE + 1 - IFREE(NFREE) = I+nt - PAR(NFREE) = psi(I) -21 ENDIF - - ALLOCATE (LTR(NFREE*(NFREE+1)/2),W(NFREE)) - DO 25 I=1,NFREE - DO 25 J=1,I - K = IFREE(I)*(IFREE(I)+1)/2-IFREE(I)+IFREE(J) -25 LTR(I*(I+1)/2-I+J) = HESS(K) - IFAIL = 0 - CALL SYMINV(LTR,NFREE,LTR,W,J,IFAIL,RMAX) - - pdesign = getprocaddress(pdll, "design_"C) - CALL DESIGN(ny,nz,nx,nu,ns,nt,theta,c,H,G,a,F,R) - CALL KIM(nobs,d,ny,nz,nx,nu,ns,nstot,nv,np,INFOS,yk,IYK, - 1 c,H,G,a,F,R,psi,1,XS,XSSE,SSMOOTH,INN,DLL) - - - IF (IFAIL.GT.0) THEN - ALLOCATE (GRAD(Nobs,NFREE),P(NFREE),OP(NFREE,NFREE), - 1 VC(NFREE,NFREE),pro(nobs*nx,NFREE)) - - LTR(:) = 0.D0 - W(:) = 0.D0 - GRAD(:,:)= 0.D0 - P(:) = 0.D0 - OP(:,:) = 0.D0 - P(1:NFREE) = PAR(1:NFREE)*DRI ! delta - DO I=1,NFT - IF(DABS(P(I)).LT.1.D-13) P(I)=1.D-13 - IF (((theta(IFREE(I))+P(I)).GT.thetaprior(IFREE(I),4)).OR. - 1 ((theta(IFREE(I))+P(I)).LT.thetaprior(IFREE(I),3))) THEN - IF (theta(IFREE(I)).GT.0.D0) THEN - P(I) = thetaprior(IFREE(I),3) - theta(IFREE(I)) - ELSE - P(I) = thetaprior(IFREE(I),4) - theta(IFREE(I)) - ENDIF - ENDIF - END DO - - DO I=NFT+1,NFREE - IF (DABS(P(I)).LT.1.D-13) P(I)=1.D-13 - IF (((psi(I-NFT)+P(I)).GT.999D0).OR. - 1 ((psi(I-NFT)+P(I)).LT..001D0)) THEN - P(I) = .001D0 - psi(I-NFT) - ENDIF - END DO - -C ----------- -C Main Cycle -C ----------- - DO 1000 I=1,NFREE - PAR(I) = PAR(I) + P(I) - IF (I.LE.NFT) THEN - theta(IFREE(I)) = PAR(I) - ELSE - psi(I-NFT) = PAR(I) - ENDIF - CALL DESIGN(ny,nz,nx,nu,ns,nt,theta,c,H,G,a,F,R) - CALL KIM(nobs,d,ny,nz,nx,nu,ns,nstot,nv,np,INFOS,yk,IYK, - 1 c,H,G,a,F,R,psi,0,XS,XSSE,SSMOOTH,INN,DLLM) - - PAR(I) = PAR(I) - P(I) - IF (I.LE.NFT) THEN - theta(IFREE(I)) = PAR(I) - ELSE - psi(I-NFT) = PAR(I) - ENDIF - GRAD(2:nobs,I) = (DLLM(2:nobs) - DLL(2:nobs))/P(I) -1000 CONTINUE - -C Use OPG if Hessian is bad - DO 300 I=1,NFREE - DO 300 J=1,I -300 OP(I,J) = SUM(GRAD(2:Nobs,I)*GRAD(2:Nobs,J)) - - DO 150 I=1,NFREE - DO 150 J=1,I -150 LTR(i*(i+1)/2-i+j) = OP(I,J) - CALL SYMINV(LTR,NFREE,LTR,W,J,IFAIL,RMAX) - IF (IFAIL.NE.0) GO TO 1111 - DEALLOCATE (OP,W,P,GRAD,VC,pro) - ENDIF - - DO i=1,NFT - thetase(IFREE(I))=dsqrt(LTR(i*(i+1)/2)) - ENDDO - DO i=NFT+1,NFREE - psise(I-NFT)=dsqrt(LTR(i*(i+1)/2)) - ENDDO - -1111 DEALLOCATE (LTR) - RETURN +C along with DMM. If not, see <http://www.gnu.org/licenses/>. +C ------------------------------------------------------------ + SUBROUTINE OPGKIM(nobs,d,ny,nz,nx,nu,nt,nv,ns,nstot,np,pdll,yk, + 1 IYK,INFOS,theta,psi,thetaprior,HESS,thetase, + 1 psise,XS,XSSE,SSMOOTH,INN,IFAIL) + + + USE dfwin + INTERFACE + SUBROUTINE DESIGN(ny,nz,nx,nu,ns,nt,theta,c,H,G,a,F,R) + INTEGER ny,nz,nx,nu,ns(6),nt + DOUBLE PRECISION theta(nt) + DOUBLE PRECISION c(ny,max(1,nz),ns(1)),H(ny,nx,ns(2)), + 1 G(ny,nu,ns(3)),a(nx,ns(4)),F(nx,nx,ns(5)),R(nx,nu,ns(6)) + END SUBROUTINE + END INTERFACE + CHARACTER*1 fittizia + POINTER (pdll,fittizia) ! ASSOCIATE pointer pdll alla DLL ad una varibile fittizia + POINTER (pdesign,DESIGN) ! IMPORTANT associo il puntatore pdesign alla Interface definita + +! Input + INTEGER nobs,d(2),ny,nz,nx,nu,nt,nv,ns(6),nstot,np,pdll,IYK(nobs,ny+1), + 1 INFOS(9,6) + DOUBLE PRECISION yk(nobs,ny+nz),theta(nt),psi(np), + 1 thetaprior(nt,4),HESS((nt+np)*(nt+np+1)/2) +! Output + INTEGER IFAIL + DOUBLE PRECISION thetase(nt),psise(np),XS(nobs,nx),XSSE(nobs,nx), + 1 SSMOOTH(nobs,nstot),INN(nobs,ny) +! Locals + INTEGER I,J,K,IFREE(nt+np),NFREE,NFT + DOUBLE PRECISION DRI,PAR(nt+np),DLL(nobs),DLLM(nobs),RMAX + DOUBLE PRECISION c(ny,max(1,nz),ns(1)),H(ny,nx,ns(2)), + 1 G(ny,nu,ns(3)),a(nx,ns(4)),F(nx,nx,ns(5)),R(nx,nu,ns(6)) + DOUBLE PRECISION, ALLOCATABLE:: GRAD(:,:),P(:),LTR(:), + 1 W(:),OP(:,:),VC(:,:),pro(:,:) + + thetase(:) = 0.D0 + psise(:) = 0.D0 + IFAIL = 0 + DRI = 1.D-3 + NFREE = 0 + DO 20 I = 1,nt + IF ((theta(I).GT.thetaprior(I,3)).AND. + 1 (theta(I).LT.thetaprior(I,4))) THEN + NFREE = NFREE + 1 + IFREE(NFREE) = I + PAR(NFREE) = theta(I) +20 ENDIF + NFT = NFREE ! only theta free param + DO 21 I = 1,np + IF ((psi(I).GT..001D0).AND.(psi(I).LT..999D0)) THEN + NFREE = NFREE + 1 + IFREE(NFREE) = I+nt + PAR(NFREE) = psi(I) +21 ENDIF + + ALLOCATE (LTR(NFREE*(NFREE+1)/2),W(NFREE)) + DO 25 I=1,NFREE + DO 25 J=1,I + K = IFREE(I)*(IFREE(I)+1)/2-IFREE(I)+IFREE(J) +25 LTR(I*(I+1)/2-I+J) = HESS(K) + IFAIL = 0 + CALL SYMINV(LTR,NFREE,LTR,W,J,IFAIL,RMAX) + + pdesign = getprocaddress(pdll, "design_"C) + CALL DESIGN(ny,nz,nx,nu,ns,nt,theta,c,H,G,a,F,R) + CALL KIM(nobs,d,ny,nz,nx,nu,ns,nstot,nv,np,INFOS,yk,IYK, + 1 c,H,G,a,F,R,psi,1,XS,XSSE,SSMOOTH,INN,DLL) + + + IF (IFAIL.GT.0) THEN + ALLOCATE (GRAD(Nobs,NFREE),P(NFREE),OP(NFREE,NFREE), + 1 VC(NFREE,NFREE),pro(nobs*nx,NFREE)) + + LTR(:) = 0.D0 + W(:) = 0.D0 + GRAD(:,:)= 0.D0 + P(:) = 0.D0 + OP(:,:) = 0.D0 + P(1:NFREE) = PAR(1:NFREE)*DRI ! delta + DO I=1,NFT + IF(DABS(P(I)).LT.1.D-13) P(I)=1.D-13 + IF (((theta(IFREE(I))+P(I)).GT.thetaprior(IFREE(I),4)).OR. + 1 ((theta(IFREE(I))+P(I)).LT.thetaprior(IFREE(I),3))) THEN + IF (theta(IFREE(I)).GT.0.D0) THEN + P(I) = thetaprior(IFREE(I),3) - theta(IFREE(I)) + ELSE + P(I) = thetaprior(IFREE(I),4) - theta(IFREE(I)) + ENDIF + ENDIF + END DO + + DO I=NFT+1,NFREE + IF (DABS(P(I)).LT.1.D-13) P(I)=1.D-13 + IF (((psi(I-NFT)+P(I)).GT.999D0).OR. + 1 ((psi(I-NFT)+P(I)).LT..001D0)) THEN + P(I) = .001D0 - psi(I-NFT) + ENDIF + END DO + +C ----------- +C Main Cycle +C ----------- + DO 1000 I=1,NFREE + PAR(I) = PAR(I) + P(I) + IF (I.LE.NFT) THEN + theta(IFREE(I)) = PAR(I) + ELSE + psi(I-NFT) = PAR(I) + ENDIF + CALL DESIGN(ny,nz,nx,nu,ns,nt,theta,c,H,G,a,F,R) + CALL KIM(nobs,d,ny,nz,nx,nu,ns,nstot,nv,np,INFOS,yk,IYK, + 1 c,H,G,a,F,R,psi,0,XS,XSSE,SSMOOTH,INN,DLLM) + + PAR(I) = PAR(I) - P(I) + IF (I.LE.NFT) THEN + theta(IFREE(I)) = PAR(I) + ELSE + psi(I-NFT) = PAR(I) + ENDIF + GRAD(2:nobs,I) = (DLLM(2:nobs) - DLL(2:nobs))/P(I) +1000 CONTINUE + +C Use OPG if Hessian is bad + DO 300 I=1,NFREE + DO 300 J=1,I +300 OP(I,J) = SUM(GRAD(2:Nobs,I)*GRAD(2:Nobs,J)) + + DO 150 I=1,NFREE + DO 150 J=1,I +150 LTR(i*(i+1)/2-i+j) = OP(I,J) + CALL SYMINV(LTR,NFREE,LTR,W,J,IFAIL,RMAX) + IF (IFAIL.NE.0) GO TO 1111 + DEALLOCATE (OP,W,P,GRAD,VC,pro) + ENDIF + + DO i=1,NFT + thetase(IFREE(I))=dsqrt(LTR(i*(i+1)/2)) + ENDDO + DO i=NFT+1,NFREE + psise(I-NFT)=dsqrt(LTR(i*(i+1)/2)) + ENDDO + +1111 DEALLOCATE (LTR) + RETURN END diff --git a/pprod.for b/pprod.for index 8950d5649b7844feabc067da482e65a8d64b98b5..8f45caa192ce0359491d838d6241a452d2abe2ac 100644 --- a/pprod.for +++ b/pprod.for @@ -1,15 +1,15 @@ -C ------------------------------------------------------------- -C PPROD computes PALL = P1 x P2 x ...x Pnv where -C Pk(i,j)= Pr[Sk(t+1)=i|Sk(t)=j], k = 1,2,...,min(6,nv) -C P(i,j) = Pr[Z(t+1)=i|Z(t)=j], Z = S1 x S2 x ... x Snv -C Developed by A.Rossi, C.Planas and G.Fiorentini -C -C Copyright (C) 2010-2014 European Commission -C +C ------------------------------------------------------------- +C PPROD computes PALL = P1 x P2 x ...x Pnv where +C Pk(i,j)= Pr[Sk(t+1)=i|Sk(t)=j], k = 1,2,...,min(6,nv) +C P(i,j) = Pr[Z(t+1)=i|Z(t)=j], Z = S1 x S2 x ... x Snv +C Developed by A.Rossi, C.Planas and G.Fiorentini +C +C Copyright (C) 2010-2014 European Commission +C C This file is part of Program DMM C -C DMM is free software developed at the Joint Research Centre of the -C European Commission: you can redistribute it and/or modify it under +C DMM is free software developed at the Joint Research Centre of the +C European Commission: you can redistribute it and/or modify it under C the terms of the GNU General Public License as published by C the Free Software Foundation, either version 3 of the License, or C (at your option) any later version. @@ -20,55 +20,55 @@ C MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the C GNU General Public License for more details. C C You should have received a copy of the GNU General Public License -C along with DMM. If not, see <http://www.gnu.org/licenses/>. -C ------------------------------------------------------------- - SUBROUTINE PPROD(nv,nstot,INFOS,P1,P2,P3,P4,P5,P6,P) -C INPUT - INTEGER nv,nstot - INTEGER INFOS(9,6) - DOUBLE PRECISION P1(INFOS(8,1),INFOS(8,1)), - 1 P2(INFOS(8,2),INFOS(8,2)),P3(INFOS(8,3),INFOS(8,3)), - 2 P4(INFOS(8,4),INFOS(8,4)),P5(INFOS(8,5),INFOS(8,5)), - 3 P6(INFOS(8,6),INFOS(8,6)) -C OUTPUT - DOUBLE PRECISION P(nstot,nstot) -C LOCALS - INTEGER n1,n2,n3,n4,n5,n6,I,J - DOUBLE PRECISION PC(nstot,nstot) - - n1 = INFOS(8,1) - IF (nv.EQ.1) THEN - P(1:n1,1:n1) = P1(1:n1,1:n1) - ELSEIF (nv.GT.1) THEN - n2 = INFOS(8,2) - DO 20 I =1,n1 - DO 20 J =1,n1 -20 P(n2*(I-1)+1:n2*I,n2*(J-1)+1:n2*J)=P1(I,J)*P2(1:n2,1:n2) - ELSEIF (nv.GT.2) THEN - PC(:,:) = P(:,:) - n3 = INFOS(8,3) - DO 30 I =1,n1*n2 - DO 30 J =1,n1*n2 -30 P(n3*(I-1)+1:n3*I,n3*(J-1)+1:n3*J)=PC(I,J)*P3(1:n3,1:n3) - ELSEIF (nv.GT.3) THEN - PC(:,:) = P(:,:) - n4 = INFOS(8,4) - DO 40 I =1,n1*n2*n3 - DO 40 J =1,n1*n2*n3 -40 P(n4*(I-1)+1:n4*I,n4*(J-1)+1:n4*J)=PC(I,J)*P4(1:n4,1:n4) - ELSEIF (nv.GT.4) THEN - PC(:,:) = P(:,:) - n5 = INFOS(8,5) - DO 50 I =1,n1*n2*n3*n4 - DO 50 J =1,n1*n2*n3*n4 -50 P(n5*(I-1)+1:n5*I,n5*(J-1)+1:n5*J)=PC(I,J)*P5(1:n5,1:n5) - ELSEIF (nv.GT.5) THEN - PC(:,:) = P(:,:) - n6 = INFOS(8,6) - DO 60 I =1,n1*n2*n3*n4*n5 - DO 60 J =1,n1*n2*n3*n4*n5 -60 P(n6*(I-1)+1:n6*I,n6*(J-1)+1:n6*J)=PC(I,J)*P6(1:n6,1:n6) - ENDIF - - RETURN +C along with DMM. If not, see <http://www.gnu.org/licenses/>. +C ------------------------------------------------------------- + SUBROUTINE PPROD(nv,nstot,INFOS,P1,P2,P3,P4,P5,P6,P) +C INPUT + INTEGER nv,nstot + INTEGER INFOS(9,6) + DOUBLE PRECISION P1(INFOS(8,1),INFOS(8,1)), + 1 P2(INFOS(8,2),INFOS(8,2)),P3(INFOS(8,3),INFOS(8,3)), + 2 P4(INFOS(8,4),INFOS(8,4)),P5(INFOS(8,5),INFOS(8,5)), + 3 P6(INFOS(8,6),INFOS(8,6)) +C OUTPUT + DOUBLE PRECISION P(nstot,nstot) +C LOCALS + INTEGER n1,n2,n3,n4,n5,n6,I,J + DOUBLE PRECISION PC(nstot,nstot) + + n1 = INFOS(8,1) + IF (nv.EQ.1) THEN + P(1:n1,1:n1) = P1(1:n1,1:n1) + ELSEIF (nv.GT.1) THEN + n2 = INFOS(8,2) + DO 20 I =1,n1 + DO 20 J =1,n1 +20 P(n2*(I-1)+1:n2*I,n2*(J-1)+1:n2*J)=P1(I,J)*P2(1:n2,1:n2) + ELSEIF (nv.GT.2) THEN + PC(:,:) = P(:,:) + n3 = INFOS(8,3) + DO 30 I =1,n1*n2 + DO 30 J =1,n1*n2 +30 P(n3*(I-1)+1:n3*I,n3*(J-1)+1:n3*J)=PC(I,J)*P3(1:n3,1:n3) + ELSEIF (nv.GT.3) THEN + PC(:,:) = P(:,:) + n4 = INFOS(8,4) + DO 40 I =1,n1*n2*n3 + DO 40 J =1,n1*n2*n3 +40 P(n4*(I-1)+1:n4*I,n4*(J-1)+1:n4*J)=PC(I,J)*P4(1:n4,1:n4) + ELSEIF (nv.GT.4) THEN + PC(:,:) = P(:,:) + n5 = INFOS(8,5) + DO 50 I =1,n1*n2*n3*n4 + DO 50 J =1,n1*n2*n3*n4 +50 P(n5*(I-1)+1:n5*I,n5*(J-1)+1:n5*J)=PC(I,J)*P5(1:n5,1:n5) + ELSEIF (nv.GT.5) THEN + PC(:,:) = P(:,:) + n6 = INFOS(8,6) + DO 60 I =1,n1*n2*n3*n4*n5 + DO 60 J =1,n1*n2*n3*n4*n5 +60 P(n6*(I-1)+1:n6*I,n6*(J-1)+1:n6*J)=PC(I,J)*P6(1:n6,1:n6) + ENDIF + + RETURN END diff --git a/prior.for b/prior.for index aac48b90d0ae092d2910fa465b7e192fbdf9f1ec..0650f7c19d9dd943d9a58c6d928a92a437694002 100644 --- a/prior.for +++ b/prior.for @@ -1,17 +1,17 @@ -C ------------------------------------------------------------------- -C PRIOR COMPUTES THE LOG-VALUE PRIOR pdf EVALUATED AT THETA -C Developed by A.Rossi, C.Planas and G.Fiorentini -C -C TIPO: 'BE' = Beta over (a,b) -C 'IG' = Inverted Gamma, parameterization as in Bauwens et al. -C 'NT' = Truncated Normal(mean,variance) over (a,b) -C -C Copyright (C) 2010-2014 European Commission -C +C ------------------------------------------------------------------- +C PRIOR COMPUTES THE LOG-VALUE PRIOR pdf EVALUATED AT THETA +C Developed by A.Rossi, C.Planas and G.Fiorentini +C +C TIPO: 'BE' = Beta over (a,b) +C 'IG' = Inverted Gamma, parameterization as in Bauwens et al. +C 'NT' = Truncated Normal(mean,variance) over (a,b) +C +C Copyright (C) 2010-2014 European Commission +C C This file is part of Program DMM C -C DMM is free software developed at the Joint Research Centre of the -C European Commission: you can redistribute it and/or modify it under +C DMM is free software developed at the Joint Research Centre of the +C European Commission: you can redistribute it and/or modify it under C the terms of the GNU General Public License as published by C the Free Software Foundation, either version 3 of the License, or C (at your option) any later version. @@ -22,42 +22,42 @@ C MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the C GNU General Public License for more details. C C You should have received a copy of the GNU General Public License -C along with DMM. If not, see <http://www.gnu.org/licenses/>. -C ------------------------------------------------------------------- - DOUBLE PRECISION FUNCTION PRIOR(theta,thetaprior,tipo) -C INPUT - DOUBLE PRECISION theta,thetaprior(4) - CHARACTER*2 tipo - -C LOCALS - DOUBLE PRECISION XMIN,XMAX,AUX,PI - DATA PI/3.141592653589793D0/ - -C EXTERNAL FUNCTIONS - DOUBLE PRECISION gammln,cumnorm - - IF (tipo.EQ.'IG') THEN - PRIOR = -gammln(.5D0*thetaprior(2)) - + - .5D0*thetaprior(2)*DLOG(2.D0/thetaprior(1)) - + - (.5D0*thetaprior(2)+1.D0)*DLOG(theta) - + - .5D0*thetaprior(1)/theta -C XMAX = thetaprior(1)/(2.D0*thetaprior(4)) -C CALL S14BAF(thetaprior(2)/2.D0,XMAX,EPS,P,Q,IFAIL) -C PRIOR = PRIOR -DLOG(Q) - ELSEIF (tipo.EQ.'NT') THEN - XMIN = (thetaprior(3)-thetaprior(1))/DSQRT(thetaprior(2)) - XMAX = (thetaprior(4)-thetaprior(1))/DSQRT(thetaprior(2)) - AUX = cumnorm(XMAX)-cumnorm(XMIN) - PRIOR = -.5D0*DLOG(thetaprior(2)) - + - .5D0*(theta-thetaprior(1))**2/thetaprior(2) - + - DLOG(AUX) -.5D0*DLOG(2.D0*PI) - ELSEIF (tipo.EQ.'BE') THEN - AUX = gammln(thetaprior(1) + thetaprior(2)) - + - gammln(thetaprior(1))- gammln(thetaprior(2)) - XMIN = (theta-thetaprior(3))/(thetaprior(4)-thetaprior(3)) - PRIOR = AUX + (thetaprior(1)-1.D0)*DLOG(XMIN) - + + (thetaprior(2)-1.D0)*DLOG(1.D0-XMIN) - + - DLOG(thetaprior(4)-thetaprior(3)) - ENDIF - RETURN +C along with DMM. If not, see <http://www.gnu.org/licenses/>. +C ------------------------------------------------------------------- + DOUBLE PRECISION FUNCTION PRIOR(theta,thetaprior,tipo) +C INPUT + DOUBLE PRECISION theta,thetaprior(4) + CHARACTER*2 tipo + +C LOCALS + DOUBLE PRECISION XMIN,XMAX,AUX,PI + DATA PI/3.141592653589793D0/ + +C EXTERNAL FUNCTIONS + DOUBLE PRECISION gammln,cumnorm + + IF (tipo.EQ.'IG') THEN + PRIOR = -gammln(.5D0*thetaprior(2)) + + - .5D0*thetaprior(2)*DLOG(2.D0/thetaprior(1)) + + - (.5D0*thetaprior(2)+1.D0)*DLOG(theta) + + - .5D0*thetaprior(1)/theta +C XMAX = thetaprior(1)/(2.D0*thetaprior(4)) +C CALL S14BAF(thetaprior(2)/2.D0,XMAX,EPS,P,Q,IFAIL) +C PRIOR = PRIOR -DLOG(Q) + ELSEIF (tipo.EQ.'NT') THEN + XMIN = (thetaprior(3)-thetaprior(1))/DSQRT(thetaprior(2)) + XMAX = (thetaprior(4)-thetaprior(1))/DSQRT(thetaprior(2)) + AUX = cumnorm(XMAX)-cumnorm(XMIN) + PRIOR = -.5D0*DLOG(thetaprior(2)) + + - .5D0*(theta-thetaprior(1))**2/thetaprior(2) + + - DLOG(AUX) -.5D0*DLOG(2.D0*PI) + ELSEIF (tipo.EQ.'BE') THEN + AUX = gammln(thetaprior(1) + thetaprior(2)) + + - gammln(thetaprior(1))- gammln(thetaprior(2)) + XMIN = (theta-thetaprior(3))/(thetaprior(4)-thetaprior(3)) + PRIOR = AUX + (thetaprior(1)-1.D0)*DLOG(XMIN) + + + (thetaprior(2)-1.D0)*DLOG(1.D0-XMIN) + + - DLOG(thetaprior(4)-thetaprior(3)) + ENDIF + RETURN END diff --git a/priordir.for b/priordir.for index 1fa28d40b302bff5b04bac82dcbdaf65b559739b..f109152dd2511481c2d22ec777467ab17e7ec644 100644 --- a/priordir.for +++ b/priordir.for @@ -1,16 +1,16 @@ -C ------------------------------------------------------------- -C PRIORDIR COMPUTES THE LOG PRIOR DISTRIBUTION EVALUATED AT psi -C FOR THE DIRICHLET pdf -C f(psi(1),..,psi(N-1);a1,...,aN)=1/B(a)*prod_i=1^N psi(i)^(ai-1) -C B(a) = prod_i=1^N G(ai)/G(a0), a0 = a1+...+aN -C Developed by A.Rossi, C.Planas and G.Fiorentini -C -C Copyright (C) 2010-2014 European Commission -C +C ------------------------------------------------------------- +C PRIORDIR COMPUTES THE LOG PRIOR DISTRIBUTION EVALUATED AT psi +C FOR THE DIRICHLET pdf +C f(psi(1),..,psi(N-1);a1,...,aN)=1/B(a)*prod_i=1^N psi(i)^(ai-1) +C B(a) = prod_i=1^N G(ai)/G(a0), a0 = a1+...+aN +C Developed by A.Rossi, C.Planas and G.Fiorentini +C +C Copyright (C) 2010-2014 European Commission +C C This file is part of Program DMM C -C DMM is free software developed at the Joint Research Centre of the -C European Commission: you can redistribute it and/or modify it under +C DMM is free software developed at the Joint Research Centre of the +C European Commission: you can redistribute it and/or modify it under C the terms of the GNU General Public License as published by C the Free Software Foundation, either version 3 of the License, or C (at your option) any later version. @@ -21,26 +21,26 @@ C MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the C GNU General Public License for more details. C C You should have received a copy of the GNU General Public License -C along with DMM. If not, see <http://www.gnu.org/licenses/>. -C -------------------------------------------------------------- - DOUBLE PRECISION FUNCTION PRIORDIR(psi,psiprior,N) -C INPUT - INTEGER N - DOUBLE PRECISION psi(N-1),psiprior(N) - -C LOCALS - INTEGER I - -C EXTERNAL FUNCTIONS - DOUBLE PRECISION GAMMLN - - PRIORDIR = gammln(SUM(psiprior(1:N))) - DO I = 1,N-1 - PRIORDIR = PRIORDIR - gammln(psiprior(I)) - # + (psiprior(I)-1.D0)*DLOG(psi(I)) - ENDDO - PRIORDIR = PRIORDIR - gammln(psiprior(N)) - # + (psiprior(N)-1.D0)*DLOG(1.D0-SUM(psi(1:N-1))) - - RETURN +C along with DMM. If not, see <http://www.gnu.org/licenses/>. +C -------------------------------------------------------------- + DOUBLE PRECISION FUNCTION PRIORDIR(psi,psiprior,N) +C INPUT + INTEGER N + DOUBLE PRECISION psi(N-1),psiprior(N) + +C LOCALS + INTEGER I + +C EXTERNAL FUNCTIONS + DOUBLE PRECISION GAMMLN + + PRIORDIR = gammln(SUM(psiprior(1:N))) + DO I = 1,N-1 + PRIORDIR = PRIORDIR - gammln(psiprior(I)) + # + (psiprior(I)-1.D0)*DLOG(psi(I)) + ENDDO + PRIORDIR = PRIORDIR - gammln(psiprior(N)) + # + (psiprior(N)-1.D0)*DLOG(1.D0-SUM(psi(1:N-1))) + + RETURN END diff --git a/ptheta.for b/ptheta.for index 0712b6353e2c80c8c6eed153a8463c517e0d6ab2..7b084a28b3eb6dee8439b2a1bf3a9d783fd719aa 100644 --- a/ptheta.for +++ b/ptheta.for @@ -1,13 +1,13 @@ -C ---------------------------------------------------------------- -C PTHETA COMPUTES THE LOG POSTERIOR -C P(theta1(it)|theta1(~it),S,Y) -C Developed by A.Rossi, C.Planas and G.Fiorentini -C Copyright (C) 2010-2014 European Commission -C +C ---------------------------------------------------------------- +C PTHETA COMPUTES THE LOG POSTERIOR +C P(theta1(it)|theta1(~it),S,Y) +C Developed by A.Rossi, C.Planas and G.Fiorentini +C Copyright (C) 2010-2014 European Commission +C C This file is part of Program DMM C -C DMM is free software developed at the Joint Research Centre of the -C European Commission: you can redistribute it and/or modify it under +C DMM is free software developed at the Joint Research Centre of the +C European Commission: you can redistribute it and/or modify it under C the terms of the GNU General Public License as published by C the Free Software Foundation, either version 3 of the License, or C (at your option) any later version. @@ -18,51 +18,51 @@ C MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the C GNU General Public License for more details. C C You should have received a copy of the GNU General Public License -C along with DMM. If not, see <http://www.gnu.org/licenses/>. -C ---------------------------------------------------------------- - DOUBLE PRECISION FUNCTION PTHETA(it,nobs,d,ny,nz,nx,nu,ns,nt, - 1 S,yk,IYK,theta,thetaprior,tipo,pdll) - - USE dfwin - INTERFACE - SUBROUTINE DESIGN(ny,nz,nx,nu,ns,nt,theta,c,H,G,a,F,R) - INTEGER ny,nz,nx,nu,ns(6),nt - DOUBLE PRECISION theta(nt) - DOUBLE PRECISION c(ny,max(1,nz),ns(1)),H(ny,nx,ns(2)), - 1 G(ny,nu,ns(3)),a(nx,ns(4)),F(nx,nx,ns(5)),R(nx,nu,ns(6)) - END SUBROUTINE - END INTERFACE - CHARACTER*1 fittizia - POINTER (pdll,fittizia) ! ASSOCIATE pointer pdll alla DLL ad una varibile fittizia - POINTER (pdesign,DESIGN) ! IMPORTANT associo il puntatore pdesign alla Interface definita - -C INPUT - INTEGER it,nobs,d(2),ny,nz,nx,nu,ns(6),nt,S(nobs,6), - 1 IYK(nobs,ny+1) - DOUBLE PRECISION yk(nobs,ny+nz),theta(nt),thetaprior(4) - CHARACTER*2 tipo - -C LOCALS - DOUBLE PRECISION,ALLOCATABLE:: c(:,:,:),H(:,:,:),G(:,:,:),a(:,:), - 1 F(:,:,:),R(:,:,:),LIKE(:),XT(:,:),PT(:,:,:),Xdd(:,:),Pdd(:,:,:) - DOUBLE PRECISION PRIOR - - ALLOCATE(c(ny,max(nz,1),ns(1)),H(ny,nx,ns(2)),G(ny,nu,ns(3)), - 1 a(nx,ns(4)),F(nx,nx,ns(5)),R(nx,nu,ns(6)),LIKE(nobs), - 2 XT(0:nobs,nx),PT(0:nobs,nx,nx),Xdd(max(d(1),1),nx), - 3 Pdd(max(d(1),1),nx,nx)) - -C computes the log-posterior - pdesign = getprocaddress(pdll, "design_"C) - CALL DESIGN(ny,nz,nx,nu,ns,nt,theta,c,H,G,a,F,R) - CALL IKF(d,ny,nz,nx,nu,ns,S(1:max(d(1),1),1:6), - 1 yk(1:max(d(1),1),1:ny+nz),IYK(1:max(d(1),1),1:ny+1), - 2 c,H,G,a,F,R,Xdd,Pdd,LIKE(1:max(d(1),1))) - XT(d(1),1:nx) = Xdd(max(d(1),1),1:nx) - PT(d(1),1:nx,1:nx) = Pdd(max(d(1),1),1:nx,1:nx) - CALL KF(nobs,d,ny,nz,nx,nu,ns,S,yk,IYK,c,H,G,a,F,R,XT,PT,LIKE) - PTHETA = SUM(LIKE) + PRIOR(theta(it),thetaprior,tipo) - - DEALLOCATE(c,H,G,a,F,R,LIKE,XT,PT,Xdd,Pdd) - RETURN +C along with DMM. If not, see <http://www.gnu.org/licenses/>. +C ---------------------------------------------------------------- + DOUBLE PRECISION FUNCTION PTHETA(it,nobs,d,ny,nz,nx,nu,ns,nt, + 1 S,yk,IYK,theta,thetaprior,tipo,pdll) + + USE dfwin + INTERFACE + SUBROUTINE DESIGN(ny,nz,nx,nu,ns,nt,theta,c,H,G,a,F,R) + INTEGER ny,nz,nx,nu,ns(6),nt + DOUBLE PRECISION theta(nt) + DOUBLE PRECISION c(ny,max(1,nz),ns(1)),H(ny,nx,ns(2)), + 1 G(ny,nu,ns(3)),a(nx,ns(4)),F(nx,nx,ns(5)),R(nx,nu,ns(6)) + END SUBROUTINE + END INTERFACE + CHARACTER*1 fittizia + POINTER (pdll,fittizia) ! ASSOCIATE pointer pdll alla DLL ad una varibile fittizia + POINTER (pdesign,DESIGN) ! IMPORTANT associo il puntatore pdesign alla Interface definita + +C INPUT + INTEGER it,nobs,d(2),ny,nz,nx,nu,ns(6),nt,S(nobs,6), + 1 IYK(nobs,ny+1) + DOUBLE PRECISION yk(nobs,ny+nz),theta(nt),thetaprior(4) + CHARACTER*2 tipo + +C LOCALS + DOUBLE PRECISION,ALLOCATABLE:: c(:,:,:),H(:,:,:),G(:,:,:),a(:,:), + 1 F(:,:,:),R(:,:,:),LIKE(:),XT(:,:),PT(:,:,:),Xdd(:,:),Pdd(:,:,:) + DOUBLE PRECISION PRIOR + + ALLOCATE(c(ny,max(nz,1),ns(1)),H(ny,nx,ns(2)),G(ny,nu,ns(3)), + 1 a(nx,ns(4)),F(nx,nx,ns(5)),R(nx,nu,ns(6)),LIKE(nobs), + 2 XT(0:nobs,nx),PT(0:nobs,nx,nx),Xdd(max(d(1),1),nx), + 3 Pdd(max(d(1),1),nx,nx)) + +C computes the log-posterior + pdesign = getprocaddress(pdll, "design_"C) + CALL DESIGN(ny,nz,nx,nu,ns,nt,theta,c,H,G,a,F,R) + CALL IKF(d,ny,nz,nx,nu,ns,S(1:max(d(1),1),1:6), + 1 yk(1:max(d(1),1),1:ny+nz),IYK(1:max(d(1),1),1:ny+1), + 2 c,H,G,a,F,R,Xdd,Pdd,LIKE(1:max(d(1),1))) + XT(d(1),1:nx) = Xdd(max(d(1),1),1:nx) + PT(d(1),1:nx,1:nx) = Pdd(max(d(1),1),1:nx,1:nx) + CALL KF(nobs,d,ny,nz,nx,nu,ns,S,yk,IYK,c,H,G,a,F,R,XT,PT,LIKE) + PTHETA = SUM(LIKE) + PRIOR(theta(it),thetaprior,tipo) + + DEALLOCATE(c,H,G,a,F,R,LIKE,XT,PT,Xdd,Pdd) + RETURN END diff --git a/ptheta2.for b/ptheta2.for index ed42a9cefff38397b6ac8f7bc8c0f2bac7df4b84..6673de55ba30b66dd9b230235c3e7ae28b1fb7ad 100644 --- a/ptheta2.for +++ b/ptheta2.for @@ -1,13 +1,13 @@ -C ---------------------------------------------------------------- -C PTHETA2 (no missing values) COMPUTES THE LOG POSTERIOR -C P(theta1(it)|theta1(~it),S,Y) -C Developed by A.Rossi, C.Planas and G.Fiorentini -C Copyright (C) 2010-2014 European Commission -C +C ---------------------------------------------------------------- +C PTHETA2 (no missing values) COMPUTES THE LOG POSTERIOR +C P(theta1(it)|theta1(~it),S,Y) +C Developed by A.Rossi, C.Planas and G.Fiorentini +C Copyright (C) 2010-2014 European Commission +C C This file is part of Program DMM C -C DMM is free software developed at the Joint Research Centre of the -C European Commission: you can redistribute it and/or modify it under +C DMM is free software developed at the Joint Research Centre of the +C European Commission: you can redistribute it and/or modify it under C the terms of the GNU General Public License as published by C the Free Software Foundation, either version 3 of the License, or C (at your option) any later version. @@ -18,51 +18,51 @@ C MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the C GNU General Public License for more details. C C You should have received a copy of the GNU General Public License -C along with DMM. If not, see <http://www.gnu.org/licenses/>. -C ---------------------------------------------------------------- - DOUBLE PRECISION FUNCTION PTHETA2(it,nobs,d,ny,nz,nx,nu,ns,nt, - 1 S,yk,theta,thetaprior,tipo,pdll) - - USE dfwin - INTERFACE - SUBROUTINE DESIGN(ny,nz,nx,nu,ns,nt,theta,c,H,G,a,F,R) - INTEGER ny,nz,nx,nu,ns(6),nt - DOUBLE PRECISION theta(nt) - DOUBLE PRECISION c(ny,max(1,nz),ns(1)),H(ny,nx,ns(2)), - 1 G(ny,nu,ns(3)),a(nx,ns(4)),F(nx,nx,ns(5)),R(nx,nu,ns(6)) - END SUBROUTINE - END INTERFACE - CHARACTER*1 fittizia - POINTER (pdll,fittizia) ! ASSOCIATE pointer pdll alla DLL ad una varibile fittizia - POINTER (pdesign,DESIGN) ! IMPORTANT associo il puntatore pdesign alla Interface definita - -C INPUT - INTEGER it,nobs,d(2),ny,nz,nx,nu,ns(6),nt,S(nobs,6) - DOUBLE PRECISION yk(nobs,ny+nz),theta(nt),thetaprior(4) - CHARACTER*2 tipo - -C LOCALS - DOUBLE PRECISION,ALLOCATABLE:: c(:,:,:),H(:,:,:),G(:,:,:),a(:,:), - 1 F(:,:,:),R(:,:,:),LIKE(:),XT(:,:),PT(:,:,:),Xdd(:,:),Pdd(:,:,:) - DOUBLE PRECISION PRIOR - - ALLOCATE(c(ny,max(nz,1),ns(1)),H(ny,nx,ns(2)),G(ny,nu,ns(3)), - 1 a(nx,ns(4)),F(nx,nx,ns(5)),R(nx,nu,ns(6)),LIKE(nobs), - 2 XT(0:nobs,nx),PT(0:nobs,nx,nx),Xdd(max(d(1),1),nx), - 3 Pdd(max(d(1),1),nx,nx)) - - -C computes the log-posterior - pdesign = getprocaddress(pdll, "design_"C) - CALL DESIGN(ny,nz,nx,nu,ns,nt,theta,c,H,G,a,F,R) - CALL IKF2(d,ny,nz,nx,nu,ns,S(1:max(d(1),1),1:6), - 1 yk(1:max(d(1),1),1:ny+nz), - 2 c,H,G,a,F,R,Xdd,Pdd,LIKE(1:max(d(1),1))) - XT(d(1),1:nx) = Xdd(max(d(1),1),1:nx) - PT(d(1),1:nx,1:nx) = Pdd(max(d(1),1),1:nx,1:nx) - CALL KF2(nobs,d,ny,nz,nx,nu,ns,S,yk,c,H,G,a,F,R,XT,PT,LIKE) - PTHETA2 = SUM(LIKE) + PRIOR(theta(it),thetaprior,tipo) - - DEALLOCATE(c,H,G,a,F,R,LIKE,XT,PT,Xdd,Pdd) - RETURN +C along with DMM. If not, see <http://www.gnu.org/licenses/>. +C ---------------------------------------------------------------- + DOUBLE PRECISION FUNCTION PTHETA2(it,nobs,d,ny,nz,nx,nu,ns,nt, + 1 S,yk,theta,thetaprior,tipo,pdll) + + USE dfwin + INTERFACE + SUBROUTINE DESIGN(ny,nz,nx,nu,ns,nt,theta,c,H,G,a,F,R) + INTEGER ny,nz,nx,nu,ns(6),nt + DOUBLE PRECISION theta(nt) + DOUBLE PRECISION c(ny,max(1,nz),ns(1)),H(ny,nx,ns(2)), + 1 G(ny,nu,ns(3)),a(nx,ns(4)),F(nx,nx,ns(5)),R(nx,nu,ns(6)) + END SUBROUTINE + END INTERFACE + CHARACTER*1 fittizia + POINTER (pdll,fittizia) ! ASSOCIATE pointer pdll alla DLL ad una varibile fittizia + POINTER (pdesign,DESIGN) ! IMPORTANT associo il puntatore pdesign alla Interface definita + +C INPUT + INTEGER it,nobs,d(2),ny,nz,nx,nu,ns(6),nt,S(nobs,6) + DOUBLE PRECISION yk(nobs,ny+nz),theta(nt),thetaprior(4) + CHARACTER*2 tipo + +C LOCALS + DOUBLE PRECISION,ALLOCATABLE:: c(:,:,:),H(:,:,:),G(:,:,:),a(:,:), + 1 F(:,:,:),R(:,:,:),LIKE(:),XT(:,:),PT(:,:,:),Xdd(:,:),Pdd(:,:,:) + DOUBLE PRECISION PRIOR + + ALLOCATE(c(ny,max(nz,1),ns(1)),H(ny,nx,ns(2)),G(ny,nu,ns(3)), + 1 a(nx,ns(4)),F(nx,nx,ns(5)),R(nx,nu,ns(6)),LIKE(nobs), + 2 XT(0:nobs,nx),PT(0:nobs,nx,nx),Xdd(max(d(1),1),nx), + 3 Pdd(max(d(1),1),nx,nx)) + + +C computes the log-posterior + pdesign = getprocaddress(pdll, "design_"C) + CALL DESIGN(ny,nz,nx,nu,ns,nt,theta,c,H,G,a,F,R) + CALL IKF2(d,ny,nz,nx,nu,ns,S(1:max(d(1),1),1:6), + 1 yk(1:max(d(1),1),1:ny+nz), + 2 c,H,G,a,F,R,Xdd,Pdd,LIKE(1:max(d(1),1))) + XT(d(1),1:nx) = Xdd(max(d(1),1),1:nx) + PT(d(1),1:nx,1:nx) = Pdd(max(d(1),1),1:nx,1:nx) + CALL KF2(nobs,d,ny,nz,nx,nu,ns,S,yk,c,H,G,a,F,R,XT,PT,LIKE) + PTHETA2 = SUM(LIKE) + PRIOR(theta(it),thetaprior,tipo) + + DEALLOCATE(c,H,G,a,F,R,LIKE,XT,PT,Xdd,Pdd) + RETURN END diff --git a/recest.for b/recest.for index 61550576640671be2aec4add45d431828cb760c3..a073f89cc3bebc05fa1d00772b1d5abd677476b8 100644 --- a/recest.for +++ b/recest.for @@ -1,14 +1,14 @@ -C ----------------------------------------------- -C RECEST performs recursive estimation of the -C MEAN, SD, and COVARIANCE MATRIX -C Developed by A.Rossi, C.Planas and G.Fiorentini -C -C Copyright (C) 2010-2014 European Commission -C +C ----------------------------------------------- +C RECEST performs recursive estimation of the +C MEAN, SD, and COVARIANCE MATRIX +C Developed by A.Rossi, C.Planas and G.Fiorentini +C +C Copyright (C) 2010-2014 European Commission +C C This file is part of Program DMM C -C DMM is free software developed at the Joint Research Centre of the -C European Commission: you can redistribute it and/or modify it under +C DMM is free software developed at the Joint Research Centre of the +C European Commission: you can redistribute it and/or modify it under C the terms of the GNU General Public License as published by C the Free Software Foundation, either version 3 of the License, or C (at your option) any later version. @@ -19,33 +19,33 @@ C MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the C GNU General Public License for more details. C C You should have received a copy of the GNU General Public License -C along with DMM. If not, see <http://www.gnu.org/licenses/>. -C ----------------------------------------------- - SUBROUTINE RECEST(NX,N,X,MED0,SIG0,SK0,MED,SIG,SK) -C INPUT - INTEGER NX,N - DOUBLE PRECISION X(NX),MED0(NX),SK0(NX),SIG0(NX,NX) -C OUTPUT - DOUBLE PRECISION MED(NX),SK(NX),SIG(NX,NX) -C LOCALS - INTEGER I,J - DOUBLE PRECISION SSX,SSXY,S3X - -C MEAN - MED = (N*MED0+X)/DFLOAT(N+1) -C VAR and SKEW - DO I = 1,NX - SSX = SIG0(I,I) + MED0(I)**2 - S3X = SK0(I)*SIG0(I,I)**1.5D0+3.D0*MED0(I)*SSX-2.D0*MED0(I)**3 - SSX = (N*SSX+X(I)**2)/DFLOAT(N+1) - SIG(I,I) = SSX-MED(I)**2 - S3X = (S3X*N+X(I)**3)/DFLOAT(N+1) - DO J = 1,I-1 - SSXY = SIG0(I,J) + MED0(I)*MED0(J) - SIG(I,J) = (N*SSXY+X(I)*X(J))/DFLOAT(N+1)-MED(I)*MED(J) - SIG(J,I) = SIG(I,J) - ENDDO - SK(I) = SIG(I,I)**(-1.5D0)*(S3X-3.D0*MED(I)*SSX+2.D0*MED(I)**3) - ENDDO - RETURN +C along with DMM. If not, see <http://www.gnu.org/licenses/>. +C ----------------------------------------------- + SUBROUTINE RECEST(NX,N,X,MED0,SIG0,SK0,MED,SIG,SK) +C INPUT + INTEGER NX,N + DOUBLE PRECISION X(NX),MED0(NX),SK0(NX),SIG0(NX,NX) +C OUTPUT + DOUBLE PRECISION MED(NX),SK(NX),SIG(NX,NX) +C LOCALS + INTEGER I,J + DOUBLE PRECISION SSX,SSXY,S3X + +C MEAN + MED = (N*MED0+X)/DFLOAT(N+1) +C VAR and SKEW + DO I = 1,NX + SSX = SIG0(I,I) + MED0(I)**2 + S3X = SK0(I)*SIG0(I,I)**1.5D0+3.D0*MED0(I)*SSX-2.D0*MED0(I)**3 + SSX = (N*SSX+X(I)**2)/DFLOAT(N+1) + SIG(I,I) = SSX-MED(I)**2 + S3X = (S3X*N+X(I)**3)/DFLOAT(N+1) + DO J = 1,I-1 + SSXY = SIG0(I,J) + MED0(I)*MED0(J) + SIG(I,J) = (N*SSXY+X(I)*X(J))/DFLOAT(N+1)-MED(I)*MED(J) + SIG(J,I) = SIG(I,J) + ENDDO + SK(I) = SIG(I,I)**(-1.5D0)*(S3X-3.D0*MED(I)*SSX+2.D0*MED(I)**3) + ENDDO + RETURN END diff --git a/recpr.for b/recpr.for index de2d35fb63161f284c962348022fed5e0c4b0115..888f4ca3c67e740b8784d2058c16c5aca9041190 100644 --- a/recpr.for +++ b/recpr.for @@ -1,15 +1,15 @@ -C ------------------------------------------------------------------------ -C RECPR compute transition and marginal probabilities for -C the adaptive MH block-sampler (see Fiorentini,Planas -C and Rossi, Statistics and Computing 2014) -C Developed by A.Rossi, C.Planas and G.Fiorentini -C -C Copyright (C) 2010-2014 European Commission -C +C ------------------------------------------------------------------------ +C RECPR compute transition and marginal probabilities for +C the adaptive MH block-sampler (see Fiorentini,Planas +C and Rossi, Statistics and Computing 2014) +C Developed by A.Rossi, C.Planas and G.Fiorentini +C +C Copyright (C) 2010-2014 European Commission +C C This file is part of Program DMM C -C DMM is free software developed at the Joint Research Centre of the -C European Commission: you can redistribute it and/or modify it under +C DMM is free software developed at the Joint Research Centre of the +C European Commission: you can redistribute it and/or modify it under C the terms of the GNU General Public License as published by C the Free Software Foundation, either version 3 of the License, or C (at your option) any later version. @@ -20,35 +20,35 @@ C MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the C GNU General Public License for more details. C C You should have received a copy of the GNU General Public License -C along with DMM. If not, see <http://www.gnu.org/licenses/>. -C ------------------------------------------------------------------------ - SUBROUTINE RECPR(N,NS,nobs,S,SW,PM,PTR) -! INPUT - INTEGER N,NS,nobs - INTEGER S(nobs),SW(2*nobs) -! INPUT/OUTPUT - DOUBLE PRECISION PM(nobs,NS),PTR(nobs,NS,NS) -! LOCALS - INTEGER I,J,IT - -C Use previous run - SW(1:nobs) = SW(nobs+1:2*nobs) - SW(nobs+1:2*nobs) = S(1:nobs) - -C Transition probs Pr[S(t)|S(t-1),Y] - DO 10 IT = 2,nobs - DO 10 J = 1,NS - DO 9 I = 1,NS-1 -9 PTR(IT,I,J) = (N*PTR(IT,I,J)*PM(IT-1,J) - # + (SW(IT).EQ.I)*(SW(IT-1).EQ.J)) - # / (N*PM(IT-1,J)+ABS(SW(IT-1).EQ.J)) -10 PTR(IT,NS,J) = 1.D0-SUM(PTR(IT,1:NS-1,J)) - - DO 30 IT = 1,nobs - DO 20 I = 1,NS-1 -20 PM(IT,I) = (N*PM(IT,I) - # + ABS(SW(IT).EQ.I))/DFLOAT(N+1) -30 PM(IT,NS) = 1.D0 - SUM(PM(IT,1:NS-1)) - - RETURN +C along with DMM. If not, see <http://www.gnu.org/licenses/>. +C ------------------------------------------------------------------------ + SUBROUTINE RECPR(N,NS,nobs,S,SW,PM,PTR) +! INPUT + INTEGER N,NS,nobs + INTEGER S(nobs),SW(2*nobs) +! INPUT/OUTPUT + DOUBLE PRECISION PM(nobs,NS),PTR(nobs,NS,NS) +! LOCALS + INTEGER I,J,IT + +C Use previous run + SW(1:nobs) = SW(nobs+1:2*nobs) + SW(nobs+1:2*nobs) = S(1:nobs) + +C Transition probs Pr[S(t)|S(t-1),Y] + DO 10 IT = 2,nobs + DO 10 J = 1,NS + DO 9 I = 1,NS-1 +9 PTR(IT,I,J) = (N*PTR(IT,I,J)*PM(IT-1,J) + # + (SW(IT).EQ.I)*(SW(IT-1).EQ.J)) + # / (N*PM(IT-1,J)+ABS(SW(IT-1).EQ.J)) +10 PTR(IT,NS,J) = 1.D0-SUM(PTR(IT,1:NS-1,J)) + + DO 30 IT = 1,nobs + DO 20 I = 1,NS-1 +20 PM(IT,I) = (N*PM(IT,I) + # + ABS(SW(IT).EQ.I))/DFLOAT(N+1) +30 PM(IT,NS) = 1.D0 - SUM(PM(IT,1:NS-1)) + + RETURN END diff --git a/schollu.for b/schollu.for index e1c1b2aad6f7b7f0b82b140baa841d4fde71c73c..fd787b7a9ea72c6bc77f83b32621e80c17c2494f 100644 --- a/schollu.for +++ b/schollu.for @@ -1,28 +1,28 @@ -C --------------------------------------------------------------- -C The Cholesky decomposition of the MxM real symmetric positive -C semi-definite matrix A=LU -C U is the transpose of L, is performed and stored in the lower -C triangle of the array L. -C A is retained so that the solution obtained can be subsequently -C improved. The procedure will fail if A, modified by the rounding -C errors, is not positive semi-definite. -C -C A input matrix -C L lower triangular matrix of the Cholesky decomposition -C M actual dimension of A -C NULL nullity of A, i.e. # of "zeros" diagonal elements of L -C TINY used as tolerance -C IFAIL 1 if A not positive semi-definite, 0 otherwise -C Modified from Wilkinson & Reinsch (1971) p.21 and Healy AS6 -C -C Developed by A.Rossi, C.Planas and G.Fiorentini -C -C Copyright (C) 2010-2014 European Commission -C +C --------------------------------------------------------------- +C The Cholesky decomposition of the MxM real symmetric positive +C semi-definite matrix A=LU +C U is the transpose of L, is performed and stored in the lower +C triangle of the array L. +C A is retained so that the solution obtained can be subsequently +C improved. The procedure will fail if A, modified by the rounding +C errors, is not positive semi-definite. +C +C A input matrix +C L lower triangular matrix of the Cholesky decomposition +C M actual dimension of A +C NULL nullity of A, i.e. # of "zeros" diagonal elements of L +C TINY used as tolerance +C IFAIL 1 if A not positive semi-definite, 0 otherwise +C Modified from Wilkinson & Reinsch (1971) p.21 and Healy AS6 +C +C Developed by A.Rossi, C.Planas and G.Fiorentini +C +C Copyright (C) 2010-2014 European Commission +C C This file is part of Program DMM C -C DMM is free software developed at the Joint Research Centre of the -C European Commission: you can redistribute it and/or modify it under +C DMM is free software developed at the Joint Research Centre of the +C European Commission: you can redistribute it and/or modify it under C the terms of the GNU General Public License as published by C the Free Software Foundation, either version 3 of the License, or C (at your option) any later version. @@ -33,41 +33,41 @@ C MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the C GNU General Public License for more details. C C You should have received a copy of the GNU General Public License -C along with DMM. If not, see <http://www.gnu.org/licenses/>. -C --------------------------------------------------------------- - SUBROUTINE SCHOLLU(A,L,M,NULL,TINY,IFAIL) -C INPUT - INTEGER M,NULL - DOUBLE PRECISION A(M,M),TINY,X -C OUTPUT - DOUBLE PRECISION L(M,M) - INTEGER IFAIL -C LOCALS - INTEGER I,J,K - - NULL=0 - DO 10 I=1,M - X=A(I,I) - DO 20 K=I-1,1,-1 - 20 X=X-L(I,K)*L(I,K) - IF (X.GE.TINY) THEN - L(I,I)=DSQRT(X) - DO 21 J=I+1,M - X=A(I,J) - DO 22 K=I-1,1,-1 - 22 X=X-L(J,K)*L(I,K) - 21 L(J,I)=X/L(I,I) - ELSE IF (X.GE.0.D0) THEN - NULL=NULL+1 - L(I,I)=0.D0 - DO 23 J=I+1,M - 23 L(J,I)=0.D0 - ELSE - IFAIL=1 - RETURN - ENDIF - 10 CONTINUE - - IFAIL=0 - RETURN +C along with DMM. If not, see <http://www.gnu.org/licenses/>. +C --------------------------------------------------------------- + SUBROUTINE SCHOLLU(A,L,M,NULL,TINY,IFAIL) +C INPUT + INTEGER M,NULL + DOUBLE PRECISION A(M,M),TINY,X +C OUTPUT + DOUBLE PRECISION L(M,M) + INTEGER IFAIL +C LOCALS + INTEGER I,J,K + + NULL=0 + DO 10 I=1,M + X=A(I,I) + DO 20 K=I-1,1,-1 + 20 X=X-L(I,K)*L(I,K) + IF (X.GE.TINY) THEN + L(I,I)=DSQRT(X) + DO 21 J=I+1,M + X=A(I,J) + DO 22 K=I-1,1,-1 + 22 X=X-L(J,K)*L(I,K) + 21 L(J,I)=X/L(I,I) + ELSE IF (X.GE.0.D0) THEN + NULL=NULL+1 + L(I,I)=0.D0 + DO 23 J=I+1,M + 23 L(J,I)=0.D0 + ELSE + IFAIL=1 + RETURN + ENDIF + 10 CONTINUE + + IFAIL=0 + RETURN END diff --git a/simdata.for b/simdata.for index c66e6c6bd482c982aef6bccf6327059be2dedb86..0ecef50a241dcd197a7386d309d18e804eafec17 100644 --- a/simdata.for +++ b/simdata.for @@ -1,40 +1,40 @@ -C -------------------------------------------------------------------- -C SIMDATA simulates (S, x, yk) given (theta,psi) -C Developed by A.Rossi, C.Planas and G.Fiorentini -C -C State-space format: y(t) = c(t)z(t) + H(t)x(t) + G(t)u(t) -C x(t) = a(t) + F(t)x(t-1) + R(t)u(t) -C -C y(t) (ny x 1) ny = # of endogenous series -C z(t) (nz x 1) nz = # of exogenous series -C x(t) (nx x 1) nx = # of continous states -C u(t) (nu x 1) nu = # of shocks -C c(t) (ny x nz x ns1) ns1 = # of states for c(t) -C H(t) (ny x nx x ns2) ns2 = # of states for S2(t) -C G(t) (ny x nu x ns3) ns3 = # of states for S3(t) -C a(t) (nx x ns4) ns4 = # of states for S4(t) -C F(t) (nx x nx x ns5) ns5 = # of states for S5(t) -C R(t) (nx x nu x ns6) ns6 = # of states for S6(t) -C -C Set latent variables: INFOS (9 x nv) -C by cols: S1,S2,...,Snv; with nv <=6 -C by row: the 1st contains the # of matrices affected by Si -C the 2nd-3rd etc point to c (1),H (2),G (3),a (4),F (5),R (6) -C the 8-th row contains the # of states -C the 9-th row spec the dynamics for Sj - -C OUTPUT: -C -C S ~ p(S|psi) -C STATE ~ p(x|S,theta) -C yk ~ p(y|S,x,theta) -C -C Copyright (C) 2010-2014 European Commission -C +C -------------------------------------------------------------------- +C SIMDATA simulates (S, x, yk) given (theta,psi) +C Developed by A.Rossi, C.Planas and G.Fiorentini +C +C State-space format: y(t) = c(t)z(t) + H(t)x(t) + G(t)u(t) +C x(t) = a(t) + F(t)x(t-1) + R(t)u(t) +C +C y(t) (ny x 1) ny = # of endogenous series +C z(t) (nz x 1) nz = # of exogenous series +C x(t) (nx x 1) nx = # of continous states +C u(t) (nu x 1) nu = # of shocks +C c(t) (ny x nz x ns1) ns1 = # of states for c(t) +C H(t) (ny x nx x ns2) ns2 = # of states for S2(t) +C G(t) (ny x nu x ns3) ns3 = # of states for S3(t) +C a(t) (nx x ns4) ns4 = # of states for S4(t) +C F(t) (nx x nx x ns5) ns5 = # of states for S5(t) +C R(t) (nx x nu x ns6) ns6 = # of states for S6(t) +C +C Set latent variables: INFOS (9 x nv) +C by cols: S1,S2,...,Snv; with nv <=6 +C by row: the 1st contains the # of matrices affected by Si +C the 2nd-3rd etc point to c (1),H (2),G (3),a (4),F (5),R (6) +C the 8-th row contains the # of states +C the 9-th row spec the dynamics for Sj + +C OUTPUT: +C +C S ~ p(S|psi) +C STATE ~ p(x|S,theta) +C yk ~ p(y|S,x,theta) +C +C Copyright (C) 2010-2014 European Commission +C C This file is part of Program DMM C -C DMM is free software developed at the Joint Research Centre of the -C European Commission: you can redistribute it and/or modify it under +C DMM is free software developed at the Joint Research Centre of the +C European Commission: you can redistribute it and/or modify it under C the terms of the GNU General Public License as published by C the Free Software Foundation, either version 3 of the License, or C (at your option) any later version. @@ -45,162 +45,162 @@ C MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the C GNU General Public License for more details. C C You should have received a copy of the GNU General Public License -C along with DMM. If not, see <http://www.gnu.org/licenses/>. -C -------------------------------------------------------------------- - SUBROUTINE SIMDATA(nobs,d,ny,nz,nx,nu,ns,nstot,nt,nv,np,INFOS, - 1 pdll,theta,psi,Z,STATE,yk) - - USE dfwin - INTERFACE - SUBROUTINE DESIGN(ny,nz,nx,nu,ns,nt,theta,c,H,G,a,F,R) - INTEGER ny,nz,nx,nu,ns(6),nt - DOUBLE PRECISION theta(nt) - DOUBLE PRECISION c(ny,max(1,nz),ns(1)),H(ny,nx,ns(2)), - 1 G(ny,nu,ns(3)),a(nx,ns(4)),F(nx,nx,ns(5)),R(nx,nu,ns(6)) - END SUBROUTINE - END INTERFACE - POINTER (pdll,fittizia) ! ASSOCIATE pointer pdll alla DLL ad una varibile fittizia - POINTER (pdesign,DESIGN) ! IMPORTANT associo il puntatore pdesign alla Interface definita - -C INPUT - INTEGER nobs,d(2),ny,nz,nx,nu,ns(6),nstot,nt,nv,np(3),INFOS(9,6) - DOUBLE PRECISION theta(nt),psi(np(1)) -C OUTPUT - INTEGER Z(nobs) - DOUBLE PRECISION STATE(nobs,nx),yk(nobs,ny+nz) - -C LOCALS - INTEGER ISEQ,I,J,K,it,IFAIL,IPIV(nx) - INTEGER S(nobs,6),SEQ(nv) - DOUBLE PRECISION P1(INFOS(8,1),INFOS(8,1)), - 1 P2(INFOS(8,2),INFOS(8,2)),P3(INFOS(8,3),INFOS(8,3)), - 2 P4(INFOS(8,4),INFOS(8,4)),P5(INFOS(8,5),INFOS(8,5)), - 3 P6(INFOS(8,6),INFOS(8,6)),PMAT(nstot,nstot),PE(nstot) - -C EXTERNAL FUNCTIONS - DOUBLE PRECISION genunf,gennor -C EXTERNAL SUBROUTINES - EXTERNAL DGETRF,DGETRI,DESIGNZ,PPROD,ERGODIC,INT2SEQ,LYAP,SETGMN, - 1 GENMN - - DOUBLE PRECISION U,AUX - DOUBLE PRECISION,ALLOCATABLE::R(:,:,:),c(:,:,:),H(:,:,:), - 1 G(:,:,:),a(:,:),F(:,:,:) - DOUBLE PRECISION,ALLOCATABLE:: Xdd(:,:),Pdd(:,:,:),WORK(:), - 1 FP(:,:),WORK1(:),UP(:) - - - ALLOCATE (R(nx,nu,ns(6)),c(ny,max(nz,1),ns(1)),H(ny,nx,ns(2)), - 1 G(ny,nu,ns(3)),a(nx,ns(4)),F(nx,nx,ns(5)), - 3 Xdd(MAX(d(1),1),nx),Pdd(MAX(d(1),1),nx,nx), - 3 WORK((nx+2)*(nx+1)/2),FP(nx,nx),WORK1(64*nx),UP(nu) ) - - pdesign = getprocaddress(pdll, "design_"C) - CALL DESIGN(ny,nz,nx,nu,ns,nt,theta,c,H,G,a,F,R) - -C DRAW Z ~ Pr(S1 x ... x Snv|psi) - S(:,:) = 1 - IF (nv.GT.0) THEN - CALL DESIGNZ(nv,np(1),psi,INFOS,P1,P2,P3,P4,P5,P6) -C PALL(i,j) = Pr[Z(t+1)=i|Z(t)=j], Z = S1 x S2 x ... x Snv - CALL PPROD(nv,nstot,INFOS,P1,P2,P3,P4,P5,P6,PMAT) -C ERGODIC solves PE: PE*(I-P') = 0 - CALL ERGODIC(nstot,PMAT,PE) -C U = G05CAF(U) ! Sampling from U(0,1) - U = genunf(0.D0,1.D0) ! Sampling from U(0,1) - ISEQ = 1 - AUX = PE(1) - DO 5 WHILE (AUX.LT.U) - ISEQ = ISEQ + 1 -5 AUX = AUX + PE(ISEQ) - Z(1) = ISEQ - CALL INT2SEQ(Z(1),nv,INFOS,SEQ,S(1,:)) - DO it=2,nobs -C U = G05CAF(U) ! Sampling from U(0,1) - U = genunf(0.D0,1.D0) ! Sampling from U(0,1) - ISEQ = 1 - AUX = PMAT(1,Z(it-1)) - DO 10 WHILE (AUX.LT.U) - ISEQ = ISEQ + 1 -10 AUX = AUX + PMAT(ISEQ,Z(it-1)) - Z(it) = ISEQ - CALL INT2SEQ(Z(it),nv,INFOS,SEQ,S(it,:)) - ENDDO - ELSE - S(:,:) = 1 - Z(:) = 1 - ENDIF - - yk(1:nobs,1:ny) = 0.D0 -C DRAW x(1) ~ N[x(1|0),P(1|0)] - STATE(1,1:nx) = 0.D0 - IF (d(2).LT.nx) THEN - Xdd(1,1:nx) = 0.D0 - Pdd(1,1:nx,1:nx) = 0.D0 - IF(SUM(ABS(a(d(2)+1:nx,S(1,4)))).NE.0.D0) THEN - FP(d(2)+1:nx,d(2)+1:nx) = -F(d(2)+1:nx,d(2)+1:nx,S(1,5)) - DO 25 I = d(2)+1,nx -25 FP(I,I) = 1.D0+FP(I,I) - IFAIL = -1 -C CALL F07ADF(nx-d(2),nx-d(2),FP(d(2)+1:nx,d(2)+1:nx),nx-d(2), -C 1 IPIV(d(2)+1:nx),IFAIL) -C CALL F07AJF(nx-d(2),FP(d(2)+1:nx,d(2)+1:nx),nx-d(2), -C 1 IPIV(d(2)+1:nx),WORK1,64*nx,IFAIL) - CALL DGETRF(nx-d(2),nx-d(2),FP(d(2)+1:nx,d(2)+1:nx),nx-d(2), - 1 IPIV(d(2)+1:nx),IFAIL) - CALL DGETRI(nx-d(2),FP(d(2)+1:nx,d(2)+1:nx),nx-d(2), - 1 IPIV(d(2)+1:nx),WORK1,64*nx,IFAIL) - - DO 30 I = d(2)+1,nx -30 Xdd(1,I) = SUM(FP(I,d(2)+1:nx)*a(d(2)+1:nx,S(1,4))) ! inv(I-F)*a - ENDIF - CALL LYAP(nx-d(2),nu,1.D-3,F(d(2)+1:nx,d(2)+1:nx,S(1,5)), - 1 R(d(2)+1:nx,1:nu,S(1,6)),Pdd(1,d(2)+1:nx,d(2)+1:nx)) - IFAIL = -1 -C CALL G05EAF(Xdd(1,d(2)+1:nx),nx-d(2),Pdd(1,d(2)+1:nx,d(2)+1:nx), -C 1 nx-d(2),10.D-14,WORK,(nx+2)*(nx+1)/2,IFAIL) -C CALL G05EZF(STATE(1,d(2)+1:nx),nx-d(2),WORK,(nx+2)*(nx+1)/2, -C 1 IFAIL) - CALL setgmn(Xdd(1,d(2)+1:nx),Pdd(1,d(2)+1:nx,d(2)+1:nx),nx-d(2), +C along with DMM. If not, see <http://www.gnu.org/licenses/>. +C -------------------------------------------------------------------- + SUBROUTINE SIMDATA(nobs,d,ny,nz,nx,nu,ns,nstot,nt,nv,np,INFOS, + 1 pdll,theta,psi,Z,STATE,yk) + + USE dfwin + INTERFACE + SUBROUTINE DESIGN(ny,nz,nx,nu,ns,nt,theta,c,H,G,a,F,R) + INTEGER ny,nz,nx,nu,ns(6),nt + DOUBLE PRECISION theta(nt) + DOUBLE PRECISION c(ny,max(1,nz),ns(1)),H(ny,nx,ns(2)), + 1 G(ny,nu,ns(3)),a(nx,ns(4)),F(nx,nx,ns(5)),R(nx,nu,ns(6)) + END SUBROUTINE + END INTERFACE + POINTER (pdll,fittizia) ! ASSOCIATE pointer pdll alla DLL ad una varibile fittizia + POINTER (pdesign,DESIGN) ! IMPORTANT associo il puntatore pdesign alla Interface definita + +C INPUT + INTEGER nobs,d(2),ny,nz,nx,nu,ns(6),nstot,nt,nv,np(3),INFOS(9,6) + DOUBLE PRECISION theta(nt),psi(np(1)) +C OUTPUT + INTEGER Z(nobs) + DOUBLE PRECISION STATE(nobs,nx),yk(nobs,ny+nz) + +C LOCALS + INTEGER ISEQ,I,J,K,it,IFAIL,IPIV(nx) + INTEGER S(nobs,6),SEQ(nv) + DOUBLE PRECISION P1(INFOS(8,1),INFOS(8,1)), + 1 P2(INFOS(8,2),INFOS(8,2)),P3(INFOS(8,3),INFOS(8,3)), + 2 P4(INFOS(8,4),INFOS(8,4)),P5(INFOS(8,5),INFOS(8,5)), + 3 P6(INFOS(8,6),INFOS(8,6)),PMAT(nstot,nstot),PE(nstot) + +C EXTERNAL FUNCTIONS + DOUBLE PRECISION genunf,gennor +C EXTERNAL SUBROUTINES + EXTERNAL DGETRF,DGETRI,DESIGNZ,PPROD,ERGODIC,INT2SEQ,LYAP,SETGMN, + 1 GENMN + + DOUBLE PRECISION U,AUX + DOUBLE PRECISION,ALLOCATABLE::R(:,:,:),c(:,:,:),H(:,:,:), + 1 G(:,:,:),a(:,:),F(:,:,:) + DOUBLE PRECISION,ALLOCATABLE:: Xdd(:,:),Pdd(:,:,:),WORK(:), + 1 FP(:,:),WORK1(:),UP(:) + + + ALLOCATE (R(nx,nu,ns(6)),c(ny,max(nz,1),ns(1)),H(ny,nx,ns(2)), + 1 G(ny,nu,ns(3)),a(nx,ns(4)),F(nx,nx,ns(5)), + 3 Xdd(MAX(d(1),1),nx),Pdd(MAX(d(1),1),nx,nx), + 3 WORK((nx+2)*(nx+1)/2),FP(nx,nx),WORK1(64*nx),UP(nu) ) + + pdesign = getprocaddress(pdll, "design_"C) + CALL DESIGN(ny,nz,nx,nu,ns,nt,theta,c,H,G,a,F,R) + +C DRAW Z ~ Pr(S1 x ... x Snv|psi) + S(:,:) = 1 + IF (nv.GT.0) THEN + CALL DESIGNZ(nv,np(1),psi,INFOS,P1,P2,P3,P4,P5,P6) +C PALL(i,j) = Pr[Z(t+1)=i|Z(t)=j], Z = S1 x S2 x ... x Snv + CALL PPROD(nv,nstot,INFOS,P1,P2,P3,P4,P5,P6,PMAT) +C ERGODIC solves PE: PE*(I-P') = 0 + CALL ERGODIC(nstot,PMAT,PE) +C U = G05CAF(U) ! Sampling from U(0,1) + U = genunf(0.D0,1.D0) ! Sampling from U(0,1) + ISEQ = 1 + AUX = PE(1) + DO 5 WHILE (AUX.LT.U) + ISEQ = ISEQ + 1 +5 AUX = AUX + PE(ISEQ) + Z(1) = ISEQ + CALL INT2SEQ(Z(1),nv,INFOS,SEQ,S(1,:)) + DO it=2,nobs +C U = G05CAF(U) ! Sampling from U(0,1) + U = genunf(0.D0,1.D0) ! Sampling from U(0,1) + ISEQ = 1 + AUX = PMAT(1,Z(it-1)) + DO 10 WHILE (AUX.LT.U) + ISEQ = ISEQ + 1 +10 AUX = AUX + PMAT(ISEQ,Z(it-1)) + Z(it) = ISEQ + CALL INT2SEQ(Z(it),nv,INFOS,SEQ,S(it,:)) + ENDDO + ELSE + S(:,:) = 1 + Z(:) = 1 + ENDIF + + yk(1:nobs,1:ny) = 0.D0 +C DRAW x(1) ~ N[x(1|0),P(1|0)] + STATE(1,1:nx) = 0.D0 + IF (d(2).LT.nx) THEN + Xdd(1,1:nx) = 0.D0 + Pdd(1,1:nx,1:nx) = 0.D0 + IF(SUM(ABS(a(d(2)+1:nx,S(1,4)))).NE.0.D0) THEN + FP(d(2)+1:nx,d(2)+1:nx) = -F(d(2)+1:nx,d(2)+1:nx,S(1,5)) + DO 25 I = d(2)+1,nx +25 FP(I,I) = 1.D0+FP(I,I) + IFAIL = -1 +C CALL F07ADF(nx-d(2),nx-d(2),FP(d(2)+1:nx,d(2)+1:nx),nx-d(2), +C 1 IPIV(d(2)+1:nx),IFAIL) +C CALL F07AJF(nx-d(2),FP(d(2)+1:nx,d(2)+1:nx),nx-d(2), +C 1 IPIV(d(2)+1:nx),WORK1,64*nx,IFAIL) + CALL DGETRF(nx-d(2),nx-d(2),FP(d(2)+1:nx,d(2)+1:nx),nx-d(2), + 1 IPIV(d(2)+1:nx),IFAIL) + CALL DGETRI(nx-d(2),FP(d(2)+1:nx,d(2)+1:nx),nx-d(2), + 1 IPIV(d(2)+1:nx),WORK1,64*nx,IFAIL) + + DO 30 I = d(2)+1,nx +30 Xdd(1,I) = SUM(FP(I,d(2)+1:nx)*a(d(2)+1:nx,S(1,4))) ! inv(I-F)*a + ENDIF + CALL LYAP(nx-d(2),nu,1.D-3,F(d(2)+1:nx,d(2)+1:nx,S(1,5)), + 1 R(d(2)+1:nx,1:nu,S(1,6)),Pdd(1,d(2)+1:nx,d(2)+1:nx)) + IFAIL = -1 +C CALL G05EAF(Xdd(1,d(2)+1:nx),nx-d(2),Pdd(1,d(2)+1:nx,d(2)+1:nx), +C 1 nx-d(2),10.D-14,WORK,(nx+2)*(nx+1)/2,IFAIL) +C CALL G05EZF(STATE(1,d(2)+1:nx),nx-d(2),WORK,(nx+2)*(nx+1)/2, +C 1 IFAIL) + CALL setgmn(Xdd(1,d(2)+1:nx),Pdd(1,d(2)+1:nx,d(2)+1:nx),nx-d(2), # nx-d(2),WORK(1:(nx-d(2)+2)*(nx-d(2)+1)/2)) - CALL genmn(WORK(1:(nx-d(2)+2)*(nx-d(2)+1)/2),STATE(1,d(2)+1:nx), - # WORK1(1:nx-d(2))) - - ENDIF - -C DRAW u(1) - DO 35 J = 1,nu -C35 UP(J) = G05DDF(0.0D0,1.D0) -35 UP(J) = gennor(0.0D0,1.D0) - - -C COMPUTE y(1) - DO 36 K = 1,ny -36 yk(1,K) = SUM(H(K,1:nx,S(1,2))*STATE(1,1:nx)) - # + SUM(G(K,1:nu,S(1,3))*UP(1:nu)) - # + SUM(c(K,1:nz,S(1,1))*yk(1,ny+1:ny+nz)) - - DO 100 it = 2,nobs -C DRAW u ~ N(0,I) - DO 40 J = 1,nu -C40 UP(J) = G05DDF(0.0D0,1.D0) -40 UP(J) = gennor(0.0D0,1.D0) - -C COMPUTE x - DO 50 K = 1,nx -50 STATE(it,K) = a(K,S(it,4)) - # + SUM(F(K,1:nx,S(it,5))*STATE(it-1,1:nx)) - # + SUM(R(K,1:nu,S(it,6))*UP(1:nu)) - -C COMPUTE yk - DO 60 K = 1,ny -60 yk(it,K) = SUM(H(K,1:nx,S(it,2))*STATE(it,1:nx)) - # + SUM(G(K,1:nu,S(it,3))*UP(1:nu)) - # + SUM(c(K,1:nz,S(it,1))*yk(it,ny+1:ny+nz)) - -100 CONTINUE - - DEALLOCATE (R,c,H,G,a,F,Xdd,Pdd,WORK,FP,WORK1,UP) - - RETURN + CALL genmn(WORK(1:(nx-d(2)+2)*(nx-d(2)+1)/2),STATE(1,d(2)+1:nx), + # WORK1(1:nx-d(2))) + + ENDIF + +C DRAW u(1) + DO 35 J = 1,nu +C35 UP(J) = G05DDF(0.0D0,1.D0) +35 UP(J) = gennor(0.0D0,1.D0) + + +C COMPUTE y(1) + DO 36 K = 1,ny +36 yk(1,K) = SUM(H(K,1:nx,S(1,2))*STATE(1,1:nx)) + # + SUM(G(K,1:nu,S(1,3))*UP(1:nu)) + # + SUM(c(K,1:nz,S(1,1))*yk(1,ny+1:ny+nz)) + + DO 100 it = 2,nobs +C DRAW u ~ N(0,I) + DO 40 J = 1,nu +C40 UP(J) = G05DDF(0.0D0,1.D0) +40 UP(J) = gennor(0.0D0,1.D0) + +C COMPUTE x + DO 50 K = 1,nx +50 STATE(it,K) = a(K,S(it,4)) + # + SUM(F(K,1:nx,S(it,5))*STATE(it-1,1:nx)) + # + SUM(R(K,1:nu,S(it,6))*UP(1:nu)) + +C COMPUTE yk + DO 60 K = 1,ny +60 yk(it,K) = SUM(H(K,1:nx,S(it,2))*STATE(it,1:nx)) + # + SUM(G(K,1:nu,S(it,3))*UP(1:nu)) + # + SUM(c(K,1:nz,S(it,1))*yk(it,ny+1:ny+nz)) + +100 CONTINUE + + DEALLOCATE (R,c,H,G,a,F,Xdd,Pdd,WORK,FP,WORK1,UP) + + RETURN END diff --git a/simprior.for b/simprior.for index e2983b84e1f5bb24e2de586749977d4bbaa92df4..a9503f40a4ff76848977194fc15122489a475c53 100644 --- a/simprior.for +++ b/simprior.for @@ -1,13 +1,13 @@ -C -------------------------------------------------------------------- -C SIMPRIOR SIMULATES theta from the PRIOR pdf -C Developed by A.Rossi, C.Planas and G.Fiorentini -C -C Copyright (C) 2010-2014 European Commission -C +C -------------------------------------------------------------------- +C SIMPRIOR SIMULATES theta from the PRIOR pdf +C Developed by A.Rossi, C.Planas and G.Fiorentini +C +C Copyright (C) 2010-2014 European Commission +C C This file is part of Program DMM C -C DMM is free software developed at the Joint Research Centre of the -C European Commission: you can redistribute it and/or modify it under +C DMM is free software developed at the Joint Research Centre of the +C European Commission: you can redistribute it and/or modify it under C the terms of the GNU General Public License as published by C the Free Software Foundation, either version 3 of the License, or C (at your option) any later version. @@ -18,62 +18,62 @@ C MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the C GNU General Public License for more details. C C You should have received a copy of the GNU General Public License -C along with DMM. If not, see <http://www.gnu.org/licenses/>. -C -------------------------------------------------------------------- - SUBROUTINE SIMPRIOR(estimation,nt,thetaprior,tipo,ntf,INDT,theta) -C INPUT - INTEGER nt - DOUBLE PRECISION thetaprior(nt,4) - CHARACTER*2 tipo(nt),estimation -C OUTPUT - INTEGER ntf,INDT(nt+2) - DOUBLE PRECISION theta(nt) -C LOCALS - INTEGER I,IFAIL - DOUBLE PRECISION LB,UB,PLB,PUB -C EXTERNAL FUNCTIONS - DOUBLE PRECISION cumnorm,TNORMI,gengam,genbet - - INDT(:) = 0 - ntf = 0 - DO I = 1,nt - IF (thetaprior(I,3).LT.thetaprior(I,4)) THEN - ntf = ntf + 1 - INDT(ntf) = I - IF (estimation.EQ.'BA') THEN - IF (tipo(I).EQ.'IG') THEN - IFAIL = -1 -C CALL G05FFF(thetaprior(I,2)/2.D0,2.D0/thetaprior(I,1),1, -C 1 theta(I),IFAIL) - theta(I) = 1.D0 - # / gengam(thetaprior(I,1)/2.D0,thetaprior(I,2)/2.D0) - IF( (theta(I).LT.thetaprior(I,3)).OR. - # (theta(I).GT.thetaprior(I,4)) ) THEN - theta(I) = (thetaprior(I,4)+thetaprior(I,3))/2.D0 - ENDIF - ELSEIF (tipo(I).EQ.'NT') THEN - LB = (thetaprior(I,3)-thetaprior(I,1))/DSQRT(thetaprior(I,2)) - UB = (thetaprior(I,4)-thetaprior(I,1))/DSQRT(thetaprior(I,2)) -c PLB = S15ABF(LB,IFAIL) -c PUB = S15ABF(UB,IFAIL) - PLB = cumnorm(LB) - PUB = cumnorm(UB) - theta(I) = TNORMI(PLB,PUB) - theta(I) = thetaprior(I,1)+theta(I)*DSQRT(thetaprior(I,2)) - ELSEIF (tipo(I).EQ.'BE') THEN - IFAIL = -1 -C CALL G05FEF(thetaprior(I,1),thetaprior(I,2),1,theta(I),IFAIL) - theta(I) = genbet(thetaprior(I,1),thetaprior(I,2)) - theta(I) = theta(I)*(thetaprior(I,4)-thetaprior(I,3)) - + + thetaprior(I,3) - ENDIF - ELSE - theta(I) = thetaprior(I,1) - ENDIF - ELSE - theta(I) = thetaprior(I,3) - ENDIF - ENDDO - INDT(nt+2) = ntf ! # OF FREE PARS - RETURN +C along with DMM. If not, see <http://www.gnu.org/licenses/>. +C -------------------------------------------------------------------- + SUBROUTINE SIMPRIOR(estimation,nt,thetaprior,tipo,ntf,INDT,theta) +C INPUT + INTEGER nt + DOUBLE PRECISION thetaprior(nt,4) + CHARACTER*2 tipo(nt),estimation +C OUTPUT + INTEGER ntf,INDT(nt+2) + DOUBLE PRECISION theta(nt) +C LOCALS + INTEGER I,IFAIL + DOUBLE PRECISION LB,UB,PLB,PUB +C EXTERNAL FUNCTIONS + DOUBLE PRECISION cumnorm,TNORMI,gengam,genbet + + INDT(:) = 0 + ntf = 0 + DO I = 1,nt + IF (thetaprior(I,3).LT.thetaprior(I,4)) THEN + ntf = ntf + 1 + INDT(ntf) = I + IF (estimation.EQ.'BA') THEN + IF (tipo(I).EQ.'IG') THEN + IFAIL = -1 +C CALL G05FFF(thetaprior(I,2)/2.D0,2.D0/thetaprior(I,1),1, +C 1 theta(I),IFAIL) + theta(I) = 1.D0 + # / gengam(thetaprior(I,1)/2.D0,thetaprior(I,2)/2.D0) + IF( (theta(I).LT.thetaprior(I,3)).OR. + # (theta(I).GT.thetaprior(I,4)) ) THEN + theta(I) = (thetaprior(I,4)+thetaprior(I,3))/2.D0 + ENDIF + ELSEIF (tipo(I).EQ.'NT') THEN + LB = (thetaprior(I,3)-thetaprior(I,1))/DSQRT(thetaprior(I,2)) + UB = (thetaprior(I,4)-thetaprior(I,1))/DSQRT(thetaprior(I,2)) +c PLB = S15ABF(LB,IFAIL) +c PUB = S15ABF(UB,IFAIL) + PLB = cumnorm(LB) + PUB = cumnorm(UB) + theta(I) = TNORMI(PLB,PUB) + theta(I) = thetaprior(I,1)+theta(I)*DSQRT(thetaprior(I,2)) + ELSEIF (tipo(I).EQ.'BE') THEN + IFAIL = -1 +C CALL G05FEF(thetaprior(I,1),thetaprior(I,2),1,theta(I),IFAIL) + theta(I) = genbet(thetaprior(I,1),thetaprior(I,2)) + theta(I) = theta(I)*(thetaprior(I,4)-thetaprior(I,3)) + + + thetaprior(I,3) + ENDIF + ELSE + theta(I) = thetaprior(I,1) + ENDIF + ELSE + theta(I) = thetaprior(I,3) + ENDIF + ENDDO + INDT(nt+2) = ntf ! # OF FREE PARS + RETURN END diff --git a/simstate.for b/simstate.for index 698ff995e4c1e11a723c2000fa5ae2a5bc53d7cd..2094b57c227023dc9bfef09b9d6c58d4cf667254 100644 --- a/simstate.for +++ b/simstate.for @@ -1,34 +1,34 @@ -C -------------------------------------------------------------------- -C SIMSTATE IMPLEMENTS THE SIMULATION SMOOTHER in Durbin and -C Koopman (2002), "A simple and efficient simulation smoother -C for state space time series analysis". Biometrika, 89, 3, 603-15 -C Developed by A.Rossi, C.Planas and G.Fiorentini -C -C State-space format: y(t) = c(t)z(t) + H(t)x(t) + G(t)u(t) -C x(t) = a(t) + F(t)x(t-1) + R(t)u(t) -C -C y(t) (ny x 1) ny = # of endogenous series -C z(t) (nz x 1) nz = # of exogenous series -C x(t) (nx x 1) nx = # of continous states -C u(t) (nu x 1) nu = # of shocks -C c(t) (ny x nz x ns1) ns1 = # of states for c(t) -C H(t) (ny x nx x ns2) ns2 = # of states for S2(t) -C G(t) (ny x nu x ns3) ns3 = # of states for S3(t) -C a(t) (nx x ns4) ns4 = # of states for S4(t) -C F(t) (nx x nx x ns5) ns5 = # of states for S5(t) -C R(t) (nx x nu x ns6) ns6 = # of states for S6(t) -C -C OUTPUT: -C -C STATE ~ p(x|y,theta,Z) (nobs x nx) -C -C -C Copyright (C) 2010-2014 European Commission -C +C -------------------------------------------------------------------- +C SIMSTATE IMPLEMENTS THE SIMULATION SMOOTHER in Durbin and +C Koopman (2002), "A simple and efficient simulation smoother +C for state space time series analysis". Biometrika, 89, 3, 603-15 +C Developed by A.Rossi, C.Planas and G.Fiorentini +C +C State-space format: y(t) = c(t)z(t) + H(t)x(t) + G(t)u(t) +C x(t) = a(t) + F(t)x(t-1) + R(t)u(t) +C +C y(t) (ny x 1) ny = # of endogenous series +C z(t) (nz x 1) nz = # of exogenous series +C x(t) (nx x 1) nx = # of continous states +C u(t) (nu x 1) nu = # of shocks +C c(t) (ny x nz x ns1) ns1 = # of states for c(t) +C H(t) (ny x nx x ns2) ns2 = # of states for S2(t) +C G(t) (ny x nu x ns3) ns3 = # of states for S3(t) +C a(t) (nx x ns4) ns4 = # of states for S4(t) +C F(t) (nx x nx x ns5) ns5 = # of states for S5(t) +C R(t) (nx x nu x ns6) ns6 = # of states for S6(t) +C +C OUTPUT: +C +C STATE ~ p(x|y,theta,Z) (nobs x nx) +C +C +C Copyright (C) 2010-2014 European Commission +C C This file is part of Program DMM C -C DMM is free software developed at the Joint Research Centre of the -C European Commission: you can redistribute it and/or modify it under +C DMM is free software developed at the Joint Research Centre of the +C European Commission: you can redistribute it and/or modify it under C the terms of the GNU General Public License as published by C the Free Software Foundation, either version 3 of the License, or C (at your option) any later version. @@ -39,125 +39,125 @@ C MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the C GNU General Public License for more details. C C You should have received a copy of the GNU General Public License -C along with DMM. If not, see <http://www.gnu.org/licenses/>. -C -------------------------------------------------------------------- - SUBROUTINE SIMSTATE(nobs,d,ny,nz,nx,nu,ns,nt,yk,IYK, - 1 theta,S,pdll,STATE) - - USE dfwin - INTERFACE - SUBROUTINE DESIGN(ny,nz,nx,nu,ns,nt,theta,c,H,G,a,F,R) - INTEGER ny,nz,nx,nu,ns(6),nt - DOUBLE PRECISION theta(nt) - DOUBLE PRECISION c(ny,max(1,nz),ns(1)),H(ny,nx,ns(2)), - 1 G(ny,nu,ns(3)),a(nx,ns(4)),F(nx,nx,ns(5)),R(nx,nu,ns(6)) - END SUBROUTINE - END INTERFACE - POINTER (pdll,fittizia) ! ASSOCIATE pointer pdll alla DLL ad una varibile fittizia - POINTER (pdesign,DESIGN) ! IMPORTANT associo il puntatore pdesign alla Interface definita - -C INPUT - INTEGER nobs,d(2),ny,nz,nx,nu,nt,ns(6),S(nobs,6), - 1 IYK(nobs,ny+1) - DOUBLE PRECISION yk(nobs,ny+nz),theta(nt) -C OUTPUT - DOUBLE PRECISION STATE(nobs,nx) -C LOCALS - INTEGER I,J,K,it,IFAIL,IPIV(nx) - DOUBLE PRECISION,ALLOCATABLE:: ykP(:,:),XP(:,:),XS(:,:),PS(:,:,:) - DOUBLE PRECISION,ALLOCATABLE::R(:,:,:),c(:,:,:),H(:,:,:), - 1 G(:,:,:),a(:,:),F(:,:,:) - DOUBLE PRECISION,ALLOCATABLE:: Xdd(:,:),Pdd(:,:,:),WORK(:), - 1 FP(:,:),WORK1(:),UP(:) -C EXTERNAL SUBROUTINES - EXTERNAL DGETRF,DGETRI,SETGMN,GENMN,LYAP,KS -C EXTERNAL FUNCTIONS - DOUBLE PRECISION GENNOR - - ALLOCATE (R(nx,nu,ns(6)),c(ny,max(nz,1),ns(1)),H(ny,nx,ns(2)), - 1 G(ny,nu,ns(3)),a(nx,ns(4)),F(nx,nx,ns(5)), - 2 ykP(nobs,ny+nz),XP(nobs,nx),XS(nobs,nx),PS(nobs,nx,nx), - 3 Xdd(MAX(d(1),1),nx),Pdd(MAX(d(1),1),nx,nx), - 3 WORK((nx+2)*(nx+1)/2),FP(nx,nx),WORK1(64*nx),UP(nu) ) - -C pdesign = getprocaddress(pdll, "DESIGN"C) - pdesign = getprocaddress(pdll, "design_"C) - CALL DESIGN(ny,nz,nx,nu,ns,nt,theta,c,H,G,a,F,R) - - ykP(:,:) = 0.D0 -C DRAW x(1)+ FROM N[x(1|0),P(1|0)] - XP(1,1:nx) = 0.D0 - IF (d(2).LT.nx) THEN - Xdd(1,1:nx) = 0.D0 - Pdd(1,1:nx,1:nx) = 0.D0 - IF(SUM(ABS(a(d(2)+1:nx,S(1,4)))).NE.0.D0) THEN - FP(d(2)+1:nx,d(2)+1:nx) = -F(d(2)+1:nx,d(2)+1:nx,S(1,5)) - DO 20 I = d(2)+1,nx -20 FP(I,I) = 1.D0+FP(I,I) - IFAIL = -1 -C CALL F07ADF(nx-d(2),nx-d(2),FP(d(2)+1:nx,d(2)+1:nx),nx-d(2), -C 1 IPIV(d(2)+1:nx),IFAIL) -C CALL F07AJF(nx-d(2),FP(d(2)+1:nx,d(2)+1:nx),nx-d(2), -C 1 IPIV(d(2)+1:nx),WORK1,64*nx,IFAIL) - CALL DGETRF(nx-d(2),nx-d(2),FP(d(2)+1:nx,d(2)+1:nx),nx-d(2), - 1 IPIV(d(2)+1:nx),IFAIL) - CALL DGETRI(nx-d(2),FP(d(2)+1:nx,d(2)+1:nx),nx-d(2), - 1 IPIV(d(2)+1:nx),WORK1,64*nx,IFAIL) - DO 30 I = d(2)+1,nx -30 Xdd(1,I) = SUM(FP(I,d(2)+1:nx)*a(d(2)+1:nx,S(1,4))) ! inv(I-F)*a - ENDIF - CALL LYAP(nx-d(2),nu,1.D-3,F(d(2)+1:nx,d(2)+1:nx,S(1,5)), - 1 R(d(2)+1:nx,1:nu,S(1,6)),Pdd(1,d(2)+1:nx,d(2)+1:nx)) - IFAIL = -1 -c CALL G05EAF(Xdd(1,d(2)+1:nx),nx-d(2),Pdd(1,d(2)+1:nx,d(2)+1:nx), -c 1 nx-d(2),10.D-14,WORK,(nx+2)*(nx+1)/2,IFAIL) -c CALL G05EZF(XP(1,d(2)+1:nx),nx-d(2),WORK,(nx+2)*(nx+1)/2,IFAIL) - CALL setgmn(Xdd(1,d(2)+1:nx),Pdd(1,d(2)+1:nx,d(2)+1:nx),nx-d(2), +C along with DMM. If not, see <http://www.gnu.org/licenses/>. +C -------------------------------------------------------------------- + SUBROUTINE SIMSTATE(nobs,d,ny,nz,nx,nu,ns,nt,yk,IYK, + 1 theta,S,pdll,STATE) + + USE dfwin + INTERFACE + SUBROUTINE DESIGN(ny,nz,nx,nu,ns,nt,theta,c,H,G,a,F,R) + INTEGER ny,nz,nx,nu,ns(6),nt + DOUBLE PRECISION theta(nt) + DOUBLE PRECISION c(ny,max(1,nz),ns(1)),H(ny,nx,ns(2)), + 1 G(ny,nu,ns(3)),a(nx,ns(4)),F(nx,nx,ns(5)),R(nx,nu,ns(6)) + END SUBROUTINE + END INTERFACE + POINTER (pdll,fittizia) ! ASSOCIATE pointer pdll alla DLL ad una varibile fittizia + POINTER (pdesign,DESIGN) ! IMPORTANT associo il puntatore pdesign alla Interface definita + +C INPUT + INTEGER nobs,d(2),ny,nz,nx,nu,nt,ns(6),S(nobs,6), + 1 IYK(nobs,ny+1) + DOUBLE PRECISION yk(nobs,ny+nz),theta(nt) +C OUTPUT + DOUBLE PRECISION STATE(nobs,nx) +C LOCALS + INTEGER I,J,K,it,IFAIL,IPIV(nx) + DOUBLE PRECISION,ALLOCATABLE:: ykP(:,:),XP(:,:),XS(:,:),PS(:,:,:) + DOUBLE PRECISION,ALLOCATABLE::R(:,:,:),c(:,:,:),H(:,:,:), + 1 G(:,:,:),a(:,:),F(:,:,:) + DOUBLE PRECISION,ALLOCATABLE:: Xdd(:,:),Pdd(:,:,:),WORK(:), + 1 FP(:,:),WORK1(:),UP(:) +C EXTERNAL SUBROUTINES + EXTERNAL DGETRF,DGETRI,SETGMN,GENMN,LYAP,KS +C EXTERNAL FUNCTIONS + DOUBLE PRECISION GENNOR + + ALLOCATE (R(nx,nu,ns(6)),c(ny,max(nz,1),ns(1)),H(ny,nx,ns(2)), + 1 G(ny,nu,ns(3)),a(nx,ns(4)),F(nx,nx,ns(5)), + 2 ykP(nobs,ny+nz),XP(nobs,nx),XS(nobs,nx),PS(nobs,nx,nx), + 3 Xdd(MAX(d(1),1),nx),Pdd(MAX(d(1),1),nx,nx), + 3 WORK((nx+2)*(nx+1)/2),FP(nx,nx),WORK1(64*nx),UP(nu) ) + +C pdesign = getprocaddress(pdll, "DESIGN"C) + pdesign = getprocaddress(pdll, "design_"C) + CALL DESIGN(ny,nz,nx,nu,ns,nt,theta,c,H,G,a,F,R) + + ykP(:,:) = 0.D0 +C DRAW x(1)+ FROM N[x(1|0),P(1|0)] + XP(1,1:nx) = 0.D0 + IF (d(2).LT.nx) THEN + Xdd(1,1:nx) = 0.D0 + Pdd(1,1:nx,1:nx) = 0.D0 + IF(SUM(ABS(a(d(2)+1:nx,S(1,4)))).NE.0.D0) THEN + FP(d(2)+1:nx,d(2)+1:nx) = -F(d(2)+1:nx,d(2)+1:nx,S(1,5)) + DO 20 I = d(2)+1,nx +20 FP(I,I) = 1.D0+FP(I,I) + IFAIL = -1 +C CALL F07ADF(nx-d(2),nx-d(2),FP(d(2)+1:nx,d(2)+1:nx),nx-d(2), +C 1 IPIV(d(2)+1:nx),IFAIL) +C CALL F07AJF(nx-d(2),FP(d(2)+1:nx,d(2)+1:nx),nx-d(2), +C 1 IPIV(d(2)+1:nx),WORK1,64*nx,IFAIL) + CALL DGETRF(nx-d(2),nx-d(2),FP(d(2)+1:nx,d(2)+1:nx),nx-d(2), + 1 IPIV(d(2)+1:nx),IFAIL) + CALL DGETRI(nx-d(2),FP(d(2)+1:nx,d(2)+1:nx),nx-d(2), + 1 IPIV(d(2)+1:nx),WORK1,64*nx,IFAIL) + DO 30 I = d(2)+1,nx +30 Xdd(1,I) = SUM(FP(I,d(2)+1:nx)*a(d(2)+1:nx,S(1,4))) ! inv(I-F)*a + ENDIF + CALL LYAP(nx-d(2),nu,1.D-3,F(d(2)+1:nx,d(2)+1:nx,S(1,5)), + 1 R(d(2)+1:nx,1:nu,S(1,6)),Pdd(1,d(2)+1:nx,d(2)+1:nx)) + IFAIL = -1 +c CALL G05EAF(Xdd(1,d(2)+1:nx),nx-d(2),Pdd(1,d(2)+1:nx,d(2)+1:nx), +c 1 nx-d(2),10.D-14,WORK,(nx+2)*(nx+1)/2,IFAIL) +c CALL G05EZF(XP(1,d(2)+1:nx),nx-d(2),WORK,(nx+2)*(nx+1)/2,IFAIL) + CALL setgmn(Xdd(1,d(2)+1:nx),Pdd(1,d(2)+1:nx,d(2)+1:nx),nx-d(2), # nx-d(2),WORK(1:(nx-d(2)+2)*(nx-d(2)+1)/2)) - CALL genmn(WORK(1:(nx-d(2)+2)*(nx-d(2)+1)/2),STATE(1,d(2)+1:nx), - # WORK1(1:nx-d(2))) - - ENDIF - -C DRAW u(1)+ - DO 35 J = 1,nu -C35 UP(J) = G05DDF(0.0D0,1.D0) -35 UP(J) = gennor(0.0D0,1.D0) - -C COMPUTE y(1)+ - DO 36 K = 1,ny -36 ykP(1,K) = SUM(H(K,1:nx,S(1,2))*XP(1,1:nx)) - # + SUM(G(K,1:nu,S(1,3))*UP(1:nu)) - # + SUM(c(K,1:nz,S(1,1))*yk(1,ny+1:ny+nz)) - - DO 100 it = 2,nobs -C DRAW u+ ~ N(0,I) - DO 40 J = 1,nu -C40 UP(J) = G05DDF(0.0D0,1.D0) -40 UP(J) = gennor(0.0D0,1.D0) - -C COMPUTE x+ - DO 50 K = 1,nx -50 XP(it,K) = a(K,S(it,4))+SUM(F(K,1:nx,S(it,5))*XP(it-1,1:nx)) - # + SUM(R(K,1:nu,S(it,6))*UP(1:nu)) - -C COMPUTE yk+ - DO 60 K = 1,ny -60 ykP(it,K) = SUM(H(K,1:nx,S(it,2))*XP(it,1:nx)) - # + SUM(G(K,1:nu,S(it,3))*UP(1:nu)) - # + SUM(c(K,1:nz,S(it,1))*yk(it,ny+1:ny+nz)) - -100 CONTINUE - -C KALMAN SMOOTHING RECURSIONS - a(:,:) = 0.D0 - c(:,:,:) = 0.D0 - CALL KS(nobs,d,ny,nz,nx,nu,ns,S,yk-ykP,IYK,c,H,G,a,F,R,XS,PS) - -C SETTING THE STATE - STATE(1:nobs,:) = XP(1:nobs,:) + XS(1:nobs,:) - - DEALLOCATE(R,c,H,G,a,F,ykP,XP,XS,PS,Xdd,Pdd,WORK,FP,WORK1,UP) - - RETURN + CALL genmn(WORK(1:(nx-d(2)+2)*(nx-d(2)+1)/2),STATE(1,d(2)+1:nx), + # WORK1(1:nx-d(2))) + + ENDIF + +C DRAW u(1)+ + DO 35 J = 1,nu +C35 UP(J) = G05DDF(0.0D0,1.D0) +35 UP(J) = gennor(0.0D0,1.D0) + +C COMPUTE y(1)+ + DO 36 K = 1,ny +36 ykP(1,K) = SUM(H(K,1:nx,S(1,2))*XP(1,1:nx)) + # + SUM(G(K,1:nu,S(1,3))*UP(1:nu)) + # + SUM(c(K,1:nz,S(1,1))*yk(1,ny+1:ny+nz)) + + DO 100 it = 2,nobs +C DRAW u+ ~ N(0,I) + DO 40 J = 1,nu +C40 UP(J) = G05DDF(0.0D0,1.D0) +40 UP(J) = gennor(0.0D0,1.D0) + +C COMPUTE x+ + DO 50 K = 1,nx +50 XP(it,K) = a(K,S(it,4))+SUM(F(K,1:nx,S(it,5))*XP(it-1,1:nx)) + # + SUM(R(K,1:nu,S(it,6))*UP(1:nu)) + +C COMPUTE yk+ + DO 60 K = 1,ny +60 ykP(it,K) = SUM(H(K,1:nx,S(it,2))*XP(it,1:nx)) + # + SUM(G(K,1:nu,S(it,3))*UP(1:nu)) + # + SUM(c(K,1:nz,S(it,1))*yk(it,ny+1:ny+nz)) + +100 CONTINUE + +C KALMAN SMOOTHING RECURSIONS + a(:,:) = 0.D0 + c(:,:,:) = 0.D0 + CALL KS(nobs,d,ny,nz,nx,nu,ns,S,yk-ykP,IYK,c,H,G,a,F,R,XS,PS) + +C SETTING THE STATE + STATE(1:nobs,:) = XP(1:nobs,:) + XS(1:nobs,:) + + DEALLOCATE(R,c,H,G,a,F,ykP,XP,XS,PS,Xdd,Pdd,WORK,FP,WORK1,UP) + + RETURN END diff --git a/simstate2.for b/simstate2.for index 63644b9cb5eaf5782fd90a132cc8bbd92ffe6197..5b1d3d1d457990a5e8902b169f2c05d91e269b73 100644 --- a/simstate2.for +++ b/simstate2.for @@ -1,34 +1,34 @@ -C -------------------------------------------------------------------- -C SIMSTATE2 (no missing values) IMPLEMENTS THE SIMULATION SMOOTHER -C in Durbin and Koopman (2002), "A simple and efficient simulation smoother -C for state space time series analysis". Biometrika, 89, 3, 603-15 -C Developed by A.Rossi, C.Planas and G.Fiorentini -C -C State-space format: y(t) = c(t)z(t) + H(t)x(t) + G(t)u(t) -C x(t) = a(t) + F(t)x(t-1) + R(t)u(t) -C -C y(t) (ny x 1) ny = # of endogenous series -C z(t) (nz x 1) nz = # of exogenous series -C x(t) (nx x 1) nx = # of continous states -C u(t) (nu x 1) nu = # of shocks -C c(t) (ny x nz x ns1) ns1 = # of states for c(t) -C H(t) (ny x nx x ns2) ns2 = # of states for S2(t) -C G(t) (ny x nu x ns3) ns3 = # of states for S3(t) -C a(t) (nx x ns4) ns4 = # of states for S4(t) -C F(t) (nx x nx x ns5) ns5 = # of states for S5(t) -C R(t) (nx x nu x ns6) ns6 = # of states for S6(t) -C -C OUTPUT: -C -C STATE ~ p(x|y,theta,Z) (nobs x nx) -C -C -C Copyright (C) 2010-2014 European Commission -C +C -------------------------------------------------------------------- +C SIMSTATE2 (no missing values) IMPLEMENTS THE SIMULATION SMOOTHER +C in Durbin and Koopman (2002), "A simple and efficient simulation smoother +C for state space time series analysis". Biometrika, 89, 3, 603-15 +C Developed by A.Rossi, C.Planas and G.Fiorentini +C +C State-space format: y(t) = c(t)z(t) + H(t)x(t) + G(t)u(t) +C x(t) = a(t) + F(t)x(t-1) + R(t)u(t) +C +C y(t) (ny x 1) ny = # of endogenous series +C z(t) (nz x 1) nz = # of exogenous series +C x(t) (nx x 1) nx = # of continous states +C u(t) (nu x 1) nu = # of shocks +C c(t) (ny x nz x ns1) ns1 = # of states for c(t) +C H(t) (ny x nx x ns2) ns2 = # of states for S2(t) +C G(t) (ny x nu x ns3) ns3 = # of states for S3(t) +C a(t) (nx x ns4) ns4 = # of states for S4(t) +C F(t) (nx x nx x ns5) ns5 = # of states for S5(t) +C R(t) (nx x nu x ns6) ns6 = # of states for S6(t) +C +C OUTPUT: +C +C STATE ~ p(x|y,theta,Z) (nobs x nx) +C +C +C Copyright (C) 2010-2014 European Commission +C C This file is part of Program DMM C -C DMM is free software developed at the Joint Research Centre of the -C European Commission: you can redistribute it and/or modify it under +C DMM is free software developed at the Joint Research Centre of the +C European Commission: you can redistribute it and/or modify it under C the terms of the GNU General Public License as published by C the Free Software Foundation, either version 3 of the License, or C (at your option) any later version. @@ -39,123 +39,123 @@ C MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the C GNU General Public License for more details. C C You should have received a copy of the GNU General Public License -C along with DMM. If not, see <http://www.gnu.org/licenses/>. -C -------------------------------------------------------------------- - SUBROUTINE SIMSTATE2(nobs,d,ny,nz,nx,nu,ns,nt,yk, - 1 theta,S,pdll,STATE) - - USE dfwin - INTERFACE - SUBROUTINE DESIGN(ny,nz,nx,nu,ns,nt,theta,c,H,G,a,F,R) - INTEGER ny,nz,nx,nu,ns(6),nt - DOUBLE PRECISION theta(nt) - DOUBLE PRECISION c(ny,max(1,nz),ns(1)),H(ny,nx,ns(2)), - 1 G(ny,nu,ns(3)),a(nx,ns(4)),F(nx,nx,ns(5)),R(nx,nu,ns(6)) - END SUBROUTINE - END INTERFACE - POINTER (pdll,fittizia) ! ASSOCIATE pointer pdll alla DLL ad una varibile fittizia - POINTER (pdesign,DESIGN) ! IMPORTANT associo il puntatore pdesign alla Interface definita - -C INPUT - INTEGER nobs,d(2),ny,nz,nx,nu,nt,ns(6),S(nobs,6) - DOUBLE PRECISION yk(nobs,ny+nz),theta(nt) -C OUTPUT - DOUBLE PRECISION STATE(nobs,nx) -C LOCALS - INTEGER I,J,K,it,IFAIL,IPIV(nx) - DOUBLE PRECISION,ALLOCATABLE:: ykP(:,:),XP(:,:),XS(:,:) - DOUBLE PRECISION,ALLOCATABLE::R(:,:,:),c(:,:,:),H(:,:,:), - 1 G(:,:,:),a(:,:),F(:,:,:) - DOUBLE PRECISION,ALLOCATABLE:: Xdd(:,:),Pdd(:,:,:),WORK(:), - 1 FP(:,:),WORK1(:),UP(:) -C EXTERNAL SUBROUTINES - EXTERNAL DGETRF,DGETRI,SETGMN,GENMN,LYAP,KS2 -C EXTERNAL FUNCTIONS - DOUBLE PRECISION GENNOR - - ALLOCATE (R(nx,nu,ns(6)),c(ny,max(nz,1),ns(1)),H(ny,nx,ns(2)), - 1 G(ny,nu,ns(3)),a(nx,ns(4)),F(nx,nx,ns(5)), - 2 ykP(nobs,ny+nz),XP(nobs,nx),XS(nobs,nx), - 3 Xdd(MAX(d(1),1),nx),Pdd(MAX(d(1),1),nx,nx), - 3 WORK((nx+2)*(nx+1)/2),FP(nx,nx),WORK1(64*nx),UP(nu) ) - - pdesign = getprocaddress(pdll, "design_"C) - CALL DESIGN(ny,nz,nx,nu,ns,nt,theta,c,H,G,a,F,R) - - ykP(:,:) = 0.D0 -C DRAW x(1)+ FROM N[x(1|0),P(1|0)] - XP(1,1:nx) = 0.D0 - IF (d(2).LT.nx) THEN - Xdd(1,1:nx) = 0.D0 - Pdd(1,1:nx,1:nx) = 0.D0 - IF(SUM(ABS(a(d(2)+1:nx,S(1,4)))).NE.0.D0) THEN - FP(d(2)+1:nx,d(2)+1:nx) = -F(d(2)+1:nx,d(2)+1:nx,S(1,5)) - DO 20 I = d(2)+1,nx -20 FP(I,I) = 1.D0+FP(I,I) - IFAIL = -1 -C CALL F07ADF(nx-d(2),nx-d(2),FP(d(2)+1:nx,d(2)+1:nx),nx-d(2), -C 1 IPIV(d(2)+1:nx),IFAIL) -C CALL F07AJF(nx-d(2),FP(d(2)+1:nx,d(2)+1:nx),nx-d(2), -C 1 IPIV(d(2)+1:nx),WORK1,64*nx,IFAIL) - CALL DGETRF(nx-d(2),nx-d(2),FP(d(2)+1:nx,d(2)+1:nx),nx-d(2), - 1 IPIV(d(2)+1:nx),IFAIL) - CALL DGETRI(nx-d(2),FP(d(2)+1:nx,d(2)+1:nx),nx-d(2), - 1 IPIV(d(2)+1:nx),WORK1,64*nx,IFAIL) - DO 30 I = d(2)+1,nx -30 Xdd(1,I) = SUM(FP(I,d(2)+1:nx)*a(d(2)+1:nx,S(1,4))) ! inv(I-F)*a - ENDIF - CALL LYAP(nx-d(2),nu,1.D-3,F(d(2)+1:nx,d(2)+1:nx,S(1,5)), - 1 R(d(2)+1:nx,1:nu,S(1,6)),Pdd(1,d(2)+1:nx,d(2)+1:nx)) - IFAIL = -1 -C CALL G05EAF(Xdd(1,d(2)+1:nx),nx-d(2),Pdd(1,d(2)+1:nx,d(2)+1:nx), -C 1 nx-d(2),10.D-14,WORK,(nx+2)*(nx+1)/2,IFAIL) -C CALL G05EZF(XP(1,d(2)+1:nx),nx-d(2),WORK,(nx+2)*(nx+1)/2,IFAIL) - CALL setgmn(Xdd(1,d(2)+1:nx),Pdd(1,d(2)+1:nx,d(2)+1:nx),nx-d(2), +C along with DMM. If not, see <http://www.gnu.org/licenses/>. +C -------------------------------------------------------------------- + SUBROUTINE SIMSTATE2(nobs,d,ny,nz,nx,nu,ns,nt,yk, + 1 theta,S,pdll,STATE) + + USE dfwin + INTERFACE + SUBROUTINE DESIGN(ny,nz,nx,nu,ns,nt,theta,c,H,G,a,F,R) + INTEGER ny,nz,nx,nu,ns(6),nt + DOUBLE PRECISION theta(nt) + DOUBLE PRECISION c(ny,max(1,nz),ns(1)),H(ny,nx,ns(2)), + 1 G(ny,nu,ns(3)),a(nx,ns(4)),F(nx,nx,ns(5)),R(nx,nu,ns(6)) + END SUBROUTINE + END INTERFACE + POINTER (pdll,fittizia) ! ASSOCIATE pointer pdll alla DLL ad una varibile fittizia + POINTER (pdesign,DESIGN) ! IMPORTANT associo il puntatore pdesign alla Interface definita + +C INPUT + INTEGER nobs,d(2),ny,nz,nx,nu,nt,ns(6),S(nobs,6) + DOUBLE PRECISION yk(nobs,ny+nz),theta(nt) +C OUTPUT + DOUBLE PRECISION STATE(nobs,nx) +C LOCALS + INTEGER I,J,K,it,IFAIL,IPIV(nx) + DOUBLE PRECISION,ALLOCATABLE:: ykP(:,:),XP(:,:),XS(:,:) + DOUBLE PRECISION,ALLOCATABLE::R(:,:,:),c(:,:,:),H(:,:,:), + 1 G(:,:,:),a(:,:),F(:,:,:) + DOUBLE PRECISION,ALLOCATABLE:: Xdd(:,:),Pdd(:,:,:),WORK(:), + 1 FP(:,:),WORK1(:),UP(:) +C EXTERNAL SUBROUTINES + EXTERNAL DGETRF,DGETRI,SETGMN,GENMN,LYAP,KS2 +C EXTERNAL FUNCTIONS + DOUBLE PRECISION GENNOR + + ALLOCATE (R(nx,nu,ns(6)),c(ny,max(nz,1),ns(1)),H(ny,nx,ns(2)), + 1 G(ny,nu,ns(3)),a(nx,ns(4)),F(nx,nx,ns(5)), + 2 ykP(nobs,ny+nz),XP(nobs,nx),XS(nobs,nx), + 3 Xdd(MAX(d(1),1),nx),Pdd(MAX(d(1),1),nx,nx), + 3 WORK((nx+2)*(nx+1)/2),FP(nx,nx),WORK1(64*nx),UP(nu) ) + + pdesign = getprocaddress(pdll, "design_"C) + CALL DESIGN(ny,nz,nx,nu,ns,nt,theta,c,H,G,a,F,R) + + ykP(:,:) = 0.D0 +C DRAW x(1)+ FROM N[x(1|0),P(1|0)] + XP(1,1:nx) = 0.D0 + IF (d(2).LT.nx) THEN + Xdd(1,1:nx) = 0.D0 + Pdd(1,1:nx,1:nx) = 0.D0 + IF(SUM(ABS(a(d(2)+1:nx,S(1,4)))).NE.0.D0) THEN + FP(d(2)+1:nx,d(2)+1:nx) = -F(d(2)+1:nx,d(2)+1:nx,S(1,5)) + DO 20 I = d(2)+1,nx +20 FP(I,I) = 1.D0+FP(I,I) + IFAIL = -1 +C CALL F07ADF(nx-d(2),nx-d(2),FP(d(2)+1:nx,d(2)+1:nx),nx-d(2), +C 1 IPIV(d(2)+1:nx),IFAIL) +C CALL F07AJF(nx-d(2),FP(d(2)+1:nx,d(2)+1:nx),nx-d(2), +C 1 IPIV(d(2)+1:nx),WORK1,64*nx,IFAIL) + CALL DGETRF(nx-d(2),nx-d(2),FP(d(2)+1:nx,d(2)+1:nx),nx-d(2), + 1 IPIV(d(2)+1:nx),IFAIL) + CALL DGETRI(nx-d(2),FP(d(2)+1:nx,d(2)+1:nx),nx-d(2), + 1 IPIV(d(2)+1:nx),WORK1,64*nx,IFAIL) + DO 30 I = d(2)+1,nx +30 Xdd(1,I) = SUM(FP(I,d(2)+1:nx)*a(d(2)+1:nx,S(1,4))) ! inv(I-F)*a + ENDIF + CALL LYAP(nx-d(2),nu,1.D-3,F(d(2)+1:nx,d(2)+1:nx,S(1,5)), + 1 R(d(2)+1:nx,1:nu,S(1,6)),Pdd(1,d(2)+1:nx,d(2)+1:nx)) + IFAIL = -1 +C CALL G05EAF(Xdd(1,d(2)+1:nx),nx-d(2),Pdd(1,d(2)+1:nx,d(2)+1:nx), +C 1 nx-d(2),10.D-14,WORK,(nx+2)*(nx+1)/2,IFAIL) +C CALL G05EZF(XP(1,d(2)+1:nx),nx-d(2),WORK,(nx+2)*(nx+1)/2,IFAIL) + CALL setgmn(Xdd(1,d(2)+1:nx),Pdd(1,d(2)+1:nx,d(2)+1:nx),nx-d(2), # nx-d(2),WORK(1:(nx-d(2)+2)*(nx-d(2)+1)/2)) - CALL genmn(WORK(1:(nx-d(2)+2)*(nx-d(2)+1)/2),STATE(1,d(2)+1:nx), - # WORK1(1:nx-d(2))) - ENDIF - -C DRAW u(1)+ - DO 35 J = 1,nu -C35 UP(J) = G05DDF(0.0D0,1.D0) -35 UP(J) = gennor(0.0D0,1.D0) - - -C COMPUTE y(1)+ - DO 36 K = 1,ny -36 ykP(1,K) = SUM(H(K,1:nx,S(1,2))*XP(1,1:nx)) - # + SUM(G(K,1:nu,S(1,3))*UP(1:nu)) - # + SUM(c(K,1:nz,S(1,1))*yk(1,ny+1:ny+nz)) - - DO 100 it = 2,nobs -C DRAW u+ ~ N(0,I) - DO 40 J = 1,nu -C40 UP(J) = G05DDF(0.0D0,1.D0) -40 UP(J) = gennor(0.0D0,1.D0) - -C COMPUTE x+ - DO 50 K = 1,nx -50 XP(it,K) = a(K,S(it,4))+SUM(F(K,1:nx,S(it,5))*XP(it-1,1:nx)) - # + SUM(R(K,1:nu,S(it,6))*UP(1:nu)) - -C COMPUTE yk+ - DO 60 K = 1,ny -60 ykP(it,K) = SUM(H(K,1:nx,S(it,2))*XP(it,1:nx)) - # + SUM(G(K,1:nu,S(it,3))*UP(1:nu)) - # + SUM(c(K,1:nz,S(it,1))*yk(it,ny+1:ny+nz)) - -100 CONTINUE - -C KALMAN SMOOTHING RECURSIONS - a(:,:) = 0.D0 - c(:,:,:) = 0.D0 - CALL KS2(nobs,d,ny,nz,nx,nu,ns,S,yk-ykP,c,H,G,a,F,R,XS) - -C SETTING THE STATE - STATE(1:nobs,:) = XP(1:nobs,:) + XS(1:nobs,:) - - DEALLOCATE (R,c,H,G,a,F,ykP,XP,XS,Xdd,Pdd,WORK,FP,WORK1,UP) - - RETURN + CALL genmn(WORK(1:(nx-d(2)+2)*(nx-d(2)+1)/2),STATE(1,d(2)+1:nx), + # WORK1(1:nx-d(2))) + ENDIF + +C DRAW u(1)+ + DO 35 J = 1,nu +C35 UP(J) = G05DDF(0.0D0,1.D0) +35 UP(J) = gennor(0.0D0,1.D0) + + +C COMPUTE y(1)+ + DO 36 K = 1,ny +36 ykP(1,K) = SUM(H(K,1:nx,S(1,2))*XP(1,1:nx)) + # + SUM(G(K,1:nu,S(1,3))*UP(1:nu)) + # + SUM(c(K,1:nz,S(1,1))*yk(1,ny+1:ny+nz)) + + DO 100 it = 2,nobs +C DRAW u+ ~ N(0,I) + DO 40 J = 1,nu +C40 UP(J) = G05DDF(0.0D0,1.D0) +40 UP(J) = gennor(0.0D0,1.D0) + +C COMPUTE x+ + DO 50 K = 1,nx +50 XP(it,K) = a(K,S(it,4))+SUM(F(K,1:nx,S(it,5))*XP(it-1,1:nx)) + # + SUM(R(K,1:nu,S(it,6))*UP(1:nu)) + +C COMPUTE yk+ + DO 60 K = 1,ny +60 ykP(it,K) = SUM(H(K,1:nx,S(it,2))*XP(it,1:nx)) + # + SUM(G(K,1:nu,S(it,3))*UP(1:nu)) + # + SUM(c(K,1:nz,S(it,1))*yk(it,ny+1:ny+nz)) + +100 CONTINUE + +C KALMAN SMOOTHING RECURSIONS + a(:,:) = 0.D0 + c(:,:,:) = 0.D0 + CALL KS2(nobs,d,ny,nz,nx,nu,ns,S,yk-ykP,c,H,G,a,F,R,XS) + +C SETTING THE STATE + STATE(1:nobs,:) = XP(1:nobs,:) + XS(1:nobs,:) + + DEALLOCATE (R,c,H,G,a,F,ykP,XP,XS,Xdd,Pdd,WORK,FP,WORK1,UP) + + RETURN END diff --git a/slice.for b/slice.for index 12bab96000d60b8a72e7405b19a9dd2625544599..616a43354369cd445f9612e3351e8fd682a8c9d4 100644 --- a/slice.for +++ b/slice.for @@ -1,14 +1,14 @@ -C ------------------------------------------------------------- -C SLICE implements the SINGLE-VARIABLE SLICE SAMPLING in Neal (2003), -C Slice Sampling, Annals of Statistics 31, 705-67 -C Developed by A.Rossi, C.Planas and G.Fiorentini -C -C Copyright (C) 2010-2014 European Commission -C +C ------------------------------------------------------------- +C SLICE implements the SINGLE-VARIABLE SLICE SAMPLING in Neal (2003), +C Slice Sampling, Annals of Statistics 31, 705-67 +C Developed by A.Rossi, C.Planas and G.Fiorentini +C +C Copyright (C) 2010-2014 European Commission +C C This file is part of Program DMM C -C DMM is free software developed at the Joint Research Centre of the -C European Commission: you can redistribute it and/or modify it under +C DMM is free software developed at the Joint Research Centre of the +C European Commission: you can redistribute it and/or modify it under C the terms of the GNU General Public License as published by C the Free Software Foundation, either version 3 of the License, or C (at your option) any later version. @@ -19,121 +19,121 @@ C MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the C GNU General Public License for more details. C C You should have received a copy of the GNU General Public License -C along with DMM. If not, see <http://www.gnu.org/licenses/>. -C ------------------------------------------------------------- - SUBROUTINE SLICE(it,nobs,d,ny,nz,nx,nu,ns,nt,S,yk,IYK, - 1 theta,thetaprior,tipo,pdll,NEVAL,XSIM) -C INPUT - INTEGER it,nobs,d(2),ny,nz,nx,nu,ns(6),nt,S(nobs,6), - 1 IYK(nobs,ny+1) - DOUBLE PRECISION yk(nobs,ny+nz),theta(nt),thetaprior(4) - CHARACTER*2 tipo - CHARACTER*1 fittizia - POINTER (pdll,fittizia) - -C OUTPUT - INTEGER NEVAL - DOUBLE PRECISION XSIM -C LOCALS - INTEGER M,J,K,OK - DOUBLE PRECISION XOLD,XLB,XUB - DOUBLE PRECISION FXOLD,U,Z,L,R,W,FXL,FXR,FXSIM - DOUBLE PRECISION genunf,PTHETA - - NEVAL = 0 - XOLD = theta(it) - XLB = thetaprior(3) - XUB = thetaprior(4) - -C ------------------------------------------------------- -C 1. DRAW Z = ln[f(X0)] - EXP(1) where EXP(1)=-ln(U(0,1)) -C THIS DEFINES THE SLICE S={x: z < ln(f(x))} -C ------------------------------------------------------- - theta(it) = XOLD - FXOLD=PTHETA(it,nobs,d,ny,nz,nx,nu,ns,nt,S,yk,IYK, - 1 theta,thetaprior,tipo,pdll) - NEVAL = NEVAL + 1 - U = genunf(0.D0,1.D0) - Z = FXOLD + DLOG(U) - -C ------------------------------------------------------------- -C 2. FIND I=(L,R) AROUND X0 THAT CONTAINS S AS MUCH AS POSSIBLE -C STEPPING-OUT PROCEDURE -C W = an estimate of the scale of SC -C M = Limit on steps (-1 = +INF) -C ------------------------------------------------------------- - M = -1 - W = max((XUB-XLB)/10.0,1.D0) -C U = G05CAF(U) - U = genunf(0.D0,1.D0) - L = XOLD - W*U - R = XOLD + W - W*U ! L + W - IF (M.EQ.-1) THEN - DO 100 WHILE(L.GT.XLB) - theta(it) = L - FXL=PTHETA(it,nobs,d,ny,nz,nx,nu,ns,nt,S,yk,IYK, - 1 theta,thetaprior,tipo,pdll) - NEVAL = NEVAL + 1 - IF (FXL.LE.Z) GOTO 110 -100 L = L - W -110 DO 200 WHILE(R.LT.XUB) - theta(it) = R - FXR=PTHETA(it,nobs,d,ny,nz,nx,nu,ns,nt,S,yk,IYK, - 1 theta,thetaprior,tipo,pdll) - NEVAL = NEVAL + 1 - IF (FXR.LE.Z) GOTO 210 -200 R = R + W -210 CONTINUE - ELSE -C U = G05CAF(U) - U = genunf(0.D0,1.D0) - J = M*U - K = M-1-J - DO 300 WHILE (J.GT.0) - IF (L.LE.XLB) GOTO 310 - theta(it) = L - FXL=PTHETA(it,nobs,d,ny,nz,nx,nu,ns,nt,S,yk,IYK, - 1 theta,thetaprior,tipo,pdll) - NEVAL = NEVAL + 1 - IF (FXL.LE.Z) GOTO 310 - L = L - W -300 J = J - 1 -310 CONTINUE - DO 400 WHILE (K.GT.0) - IF (R.GE.XLB) GOTO 410 - theta(it) = R - FXR=PTHETA(it,nobs,d,ny,nz,nx,nu,ns,nt,S,yk,IYK, - 1 theta,thetaprior,tipo,pdll) - NEVAL = NEVAL + 1 - IF (FXR.LE.Z) GOTO 410 - R = R + W -400 K = K - 1 -410 CONTINUE - ENDIF - IF (L.LT.XLB) L = XLB - IF (R.GT.XUB) R = XUB - -C ------------------------------------------------------ -C 3. SAMPLING FROM THE SET A = (I INTERSECT S) = (LA,RA) -C ------------------------------------------------------ - OK = 0 - DO 500 WHILE (OK.EQ.0) -C U = G05CAF(U) - U = genunf(0.D0,1.D0) - XSIM = L + U*(R - L) - theta(it) = XSIM - FXSIM=PTHETA(it,nobs,d,ny,nz,nx,nu,ns,nt,S,yk,IYK, - 1 theta,thetaprior,tipo,pdll) - NEVAL = NEVAL + 1 - IF (FXSIM.GE.Z) OK = 1 - IF(XSIM.GT.XOLD) THEN - R = XSIM - ELSE - L = XSIM - ENDIF -500 CONTINUE - - theta(it) = XOLD - - RETURN +C along with DMM. If not, see <http://www.gnu.org/licenses/>. +C ------------------------------------------------------------- + SUBROUTINE SLICE(it,nobs,d,ny,nz,nx,nu,ns,nt,S,yk,IYK, + 1 theta,thetaprior,tipo,pdll,NEVAL,XSIM) +C INPUT + INTEGER it,nobs,d(2),ny,nz,nx,nu,ns(6),nt,S(nobs,6), + 1 IYK(nobs,ny+1) + DOUBLE PRECISION yk(nobs,ny+nz),theta(nt),thetaprior(4) + CHARACTER*2 tipo + CHARACTER*1 fittizia + POINTER (pdll,fittizia) + +C OUTPUT + INTEGER NEVAL + DOUBLE PRECISION XSIM +C LOCALS + INTEGER M,J,K,OK + DOUBLE PRECISION XOLD,XLB,XUB + DOUBLE PRECISION FXOLD,U,Z,L,R,W,FXL,FXR,FXSIM + DOUBLE PRECISION genunf,PTHETA + + NEVAL = 0 + XOLD = theta(it) + XLB = thetaprior(3) + XUB = thetaprior(4) + +C ------------------------------------------------------- +C 1. DRAW Z = ln[f(X0)] - EXP(1) where EXP(1)=-ln(U(0,1)) +C THIS DEFINES THE SLICE S={x: z < ln(f(x))} +C ------------------------------------------------------- + theta(it) = XOLD + FXOLD=PTHETA(it,nobs,d,ny,nz,nx,nu,ns,nt,S,yk,IYK, + 1 theta,thetaprior,tipo,pdll) + NEVAL = NEVAL + 1 + U = genunf(0.D0,1.D0) + Z = FXOLD + DLOG(U) + +C ------------------------------------------------------------- +C 2. FIND I=(L,R) AROUND X0 THAT CONTAINS S AS MUCH AS POSSIBLE +C STEPPING-OUT PROCEDURE +C W = an estimate of the scale of SC +C M = Limit on steps (-1 = +INF) +C ------------------------------------------------------------- + M = -1 + W = max((XUB-XLB)/10.0,1.D0) +C U = G05CAF(U) + U = genunf(0.D0,1.D0) + L = XOLD - W*U + R = XOLD + W - W*U ! L + W + IF (M.EQ.-1) THEN + DO 100 WHILE(L.GT.XLB) + theta(it) = L + FXL=PTHETA(it,nobs,d,ny,nz,nx,nu,ns,nt,S,yk,IYK, + 1 theta,thetaprior,tipo,pdll) + NEVAL = NEVAL + 1 + IF (FXL.LE.Z) GOTO 110 +100 L = L - W +110 DO 200 WHILE(R.LT.XUB) + theta(it) = R + FXR=PTHETA(it,nobs,d,ny,nz,nx,nu,ns,nt,S,yk,IYK, + 1 theta,thetaprior,tipo,pdll) + NEVAL = NEVAL + 1 + IF (FXR.LE.Z) GOTO 210 +200 R = R + W +210 CONTINUE + ELSE +C U = G05CAF(U) + U = genunf(0.D0,1.D0) + J = M*U + K = M-1-J + DO 300 WHILE (J.GT.0) + IF (L.LE.XLB) GOTO 310 + theta(it) = L + FXL=PTHETA(it,nobs,d,ny,nz,nx,nu,ns,nt,S,yk,IYK, + 1 theta,thetaprior,tipo,pdll) + NEVAL = NEVAL + 1 + IF (FXL.LE.Z) GOTO 310 + L = L - W +300 J = J - 1 +310 CONTINUE + DO 400 WHILE (K.GT.0) + IF (R.GE.XLB) GOTO 410 + theta(it) = R + FXR=PTHETA(it,nobs,d,ny,nz,nx,nu,ns,nt,S,yk,IYK, + 1 theta,thetaprior,tipo,pdll) + NEVAL = NEVAL + 1 + IF (FXR.LE.Z) GOTO 410 + R = R + W +400 K = K - 1 +410 CONTINUE + ENDIF + IF (L.LT.XLB) L = XLB + IF (R.GT.XUB) R = XUB + +C ------------------------------------------------------ +C 3. SAMPLING FROM THE SET A = (I INTERSECT S) = (LA,RA) +C ------------------------------------------------------ + OK = 0 + DO 500 WHILE (OK.EQ.0) +C U = G05CAF(U) + U = genunf(0.D0,1.D0) + XSIM = L + U*(R - L) + theta(it) = XSIM + FXSIM=PTHETA(it,nobs,d,ny,nz,nx,nu,ns,nt,S,yk,IYK, + 1 theta,thetaprior,tipo,pdll) + NEVAL = NEVAL + 1 + IF (FXSIM.GE.Z) OK = 1 + IF(XSIM.GT.XOLD) THEN + R = XSIM + ELSE + L = XSIM + ENDIF +500 CONTINUE + + theta(it) = XOLD + + RETURN END diff --git a/slice2.for b/slice2.for index 9968287c54031a1e45af5c2a81fc432a6c48a521..6810e700ab2387ff42e66865c4d1bc03d0d0f304 100644 --- a/slice2.for +++ b/slice2.for @@ -1,14 +1,14 @@ -C ------------------------------------------------------------- -C SLICE2 (no missing values) implements the SINGLE-VARIABLE SLICE SAMPLING -C in Neal (2003), Slice Sampling, Annals of Statistics 31, 705-67 -C Developed by A.Rossi, C.Planas and G.Fiorentini -C -C Copyright (C) 2010-2014 European Commission -C +C ------------------------------------------------------------- +C SLICE2 (no missing values) implements the SINGLE-VARIABLE SLICE SAMPLING +C in Neal (2003), Slice Sampling, Annals of Statistics 31, 705-67 +C Developed by A.Rossi, C.Planas and G.Fiorentini +C +C Copyright (C) 2010-2014 European Commission +C C This file is part of Program DMM C -C DMM is free software developed at the Joint Research Centre of the -C European Commission: you can redistribute it and/or modify it under +C DMM is free software developed at the Joint Research Centre of the +C European Commission: you can redistribute it and/or modify it under C the terms of the GNU General Public License as published by C the Free Software Foundation, either version 3 of the License, or C (at your option) any later version. @@ -19,120 +19,120 @@ C MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the C GNU General Public License for more details. C C You should have received a copy of the GNU General Public License -C along with DMM. If not, see <http://www.gnu.org/licenses/>. -C ------------------------------------------------------------- - SUBROUTINE SLICE2(it,nobs,d,ny,nz,nx,nu,ns,nt,S,yk, - 1 theta,thetaprior,tipo,pdll,NEVAL,XSIM) -C INPUT - INTEGER it,nobs,d(2),ny,nz,nx,nu,ns(6),nt,S(nobs,6) - DOUBLE PRECISION yk(nobs,ny+nz),theta(nt),thetaprior(4) - CHARACTER*2 tipo - CHARACTER*1 fittizia - POINTER (pdll,fittizia) - -C OUTPUT - INTEGER NEVAL - DOUBLE PRECISION XSIM -C LOCALS - INTEGER M,J,K,OK - DOUBLE PRECISION XOLD,XLB,XUB - DOUBLE PRECISION FXOLD,U,Z,L,R,W,FXL,FXR,FXSIM - DOUBLE PRECISION genunf,PTHETA2 - - NEVAL = 0 - XOLD = theta(it) - XLB = thetaprior(3) - XUB = thetaprior(4) - -C ------------------------------------------------------- -C 1. DRAW Z = ln[f(X0)] - EXP(1) where EXP(1)=-ln(U(0,1)) -C THIS DEFINES THE SLICE S={x: z < ln(f(x))} -C ------------------------------------------------------- - theta(it) = XOLD - FXOLD=PTHETA2(it,nobs,d,ny,nz,nx,nu,ns,nt,S,yk, - 1 theta,thetaprior,tipo,pdll) - NEVAL = NEVAL + 1 - U = genunf(0.D0,1.D0) - Z = FXOLD + DLOG(U) - -C ------------------------------------------------------------- -C 2. FIND I=(L,R) AROUND X0 THAT CONTAINS S AS MUCH AS POSSIBLE -C STEPPING-OUT PROCEDURE -C W = an estimate of the scale of SC -C M = Limit on steps (-1 = +INF) -C ------------------------------------------------------------- - M = -1 - W = max((XUB-XLB)/10.0,1.D0) -C U = G05CAF(U) - U = genunf(0.D0,1.D0) - L = XOLD - W*U - R = XOLD + W - W*U ! L + W - IF (M.EQ.-1) THEN - DO 100 WHILE(L.GT.XLB) - theta(it) = L - FXL=PTHETA2(it,nobs,d,ny,nz,nx,nu,ns,nt,S,yk, - 1 theta,thetaprior,tipo,pdll) - NEVAL = NEVAL + 1 - IF (FXL.LE.Z) GOTO 110 -100 L = L - W -110 DO 200 WHILE(R.LT.XUB) - theta(it) = R - FXR=PTHETA2(it,nobs,d,ny,nz,nx,nu,ns,nt,S,yk, - 1 theta,thetaprior,tipo,pdll) - NEVAL = NEVAL + 1 - IF (FXR.LE.Z) GOTO 210 -200 R = R + W -210 CONTINUE - ELSE -C U = G05CAF(U) - U = genunf(0.D0,1.D0) - J = M*U - K = M-1-J - DO 300 WHILE (J.GT.0) - IF (L.LE.XLB) GOTO 310 - theta(it) = L - FXL=PTHETA2(it,nobs,d,ny,nz,nx,nu,ns,nt,S,yk, - 1 theta,thetaprior,tipo,pdll) - NEVAL = NEVAL + 1 - IF (FXL.LE.Z) GOTO 310 - L = L - W -300 J = J - 1 -310 CONTINUE - DO 400 WHILE (K.GT.0) - IF (R.GE.XLB) GOTO 410 - theta(it) = R - FXR=PTHETA2(it,nobs,d,ny,nz,nx,nu,ns,nt,S,yk, - 1 theta,thetaprior,tipo,pdll) - NEVAL = NEVAL + 1 - IF (FXR.LE.Z) GOTO 410 - R = R + W -400 K = K - 1 -410 CONTINUE - ENDIF - IF (L.LT.XLB) L = XLB - IF (R.GT.XUB) R = XUB - -C ------------------------------------------------------ -C 3. SAMPLING FROM THE SET A = (I INTERSECT S) = (LA,RA) -C ------------------------------------------------------ - OK = 0 - DO 500 WHILE (OK.EQ.0) -C U = G05CAF(U) - U = genunf(0.D0,1.D0) - XSIM = L + U*(R - L) - theta(it) = XSIM - FXSIM=PTHETA2(it,nobs,d,ny,nz,nx,nu,ns,nt,S,yk, - 1 theta,thetaprior,tipo,pdll) - NEVAL = NEVAL + 1 - IF (FXSIM.GE.Z) OK = 1 - IF(XSIM.GT.XOLD) THEN - R = XSIM - ELSE - L = XSIM - ENDIF -500 CONTINUE - - theta(it) = XOLD - - RETURN +C along with DMM. If not, see <http://www.gnu.org/licenses/>. +C ------------------------------------------------------------- + SUBROUTINE SLICE2(it,nobs,d,ny,nz,nx,nu,ns,nt,S,yk, + 1 theta,thetaprior,tipo,pdll,NEVAL,XSIM) +C INPUT + INTEGER it,nobs,d(2),ny,nz,nx,nu,ns(6),nt,S(nobs,6) + DOUBLE PRECISION yk(nobs,ny+nz),theta(nt),thetaprior(4) + CHARACTER*2 tipo + CHARACTER*1 fittizia + POINTER (pdll,fittizia) + +C OUTPUT + INTEGER NEVAL + DOUBLE PRECISION XSIM +C LOCALS + INTEGER M,J,K,OK + DOUBLE PRECISION XOLD,XLB,XUB + DOUBLE PRECISION FXOLD,U,Z,L,R,W,FXL,FXR,FXSIM + DOUBLE PRECISION genunf,PTHETA2 + + NEVAL = 0 + XOLD = theta(it) + XLB = thetaprior(3) + XUB = thetaprior(4) + +C ------------------------------------------------------- +C 1. DRAW Z = ln[f(X0)] - EXP(1) where EXP(1)=-ln(U(0,1)) +C THIS DEFINES THE SLICE S={x: z < ln(f(x))} +C ------------------------------------------------------- + theta(it) = XOLD + FXOLD=PTHETA2(it,nobs,d,ny,nz,nx,nu,ns,nt,S,yk, + 1 theta,thetaprior,tipo,pdll) + NEVAL = NEVAL + 1 + U = genunf(0.D0,1.D0) + Z = FXOLD + DLOG(U) + +C ------------------------------------------------------------- +C 2. FIND I=(L,R) AROUND X0 THAT CONTAINS S AS MUCH AS POSSIBLE +C STEPPING-OUT PROCEDURE +C W = an estimate of the scale of SC +C M = Limit on steps (-1 = +INF) +C ------------------------------------------------------------- + M = -1 + W = max((XUB-XLB)/10.0,1.D0) +C U = G05CAF(U) + U = genunf(0.D0,1.D0) + L = XOLD - W*U + R = XOLD + W - W*U ! L + W + IF (M.EQ.-1) THEN + DO 100 WHILE(L.GT.XLB) + theta(it) = L + FXL=PTHETA2(it,nobs,d,ny,nz,nx,nu,ns,nt,S,yk, + 1 theta,thetaprior,tipo,pdll) + NEVAL = NEVAL + 1 + IF (FXL.LE.Z) GOTO 110 +100 L = L - W +110 DO 200 WHILE(R.LT.XUB) + theta(it) = R + FXR=PTHETA2(it,nobs,d,ny,nz,nx,nu,ns,nt,S,yk, + 1 theta,thetaprior,tipo,pdll) + NEVAL = NEVAL + 1 + IF (FXR.LE.Z) GOTO 210 +200 R = R + W +210 CONTINUE + ELSE +C U = G05CAF(U) + U = genunf(0.D0,1.D0) + J = M*U + K = M-1-J + DO 300 WHILE (J.GT.0) + IF (L.LE.XLB) GOTO 310 + theta(it) = L + FXL=PTHETA2(it,nobs,d,ny,nz,nx,nu,ns,nt,S,yk, + 1 theta,thetaprior,tipo,pdll) + NEVAL = NEVAL + 1 + IF (FXL.LE.Z) GOTO 310 + L = L - W +300 J = J - 1 +310 CONTINUE + DO 400 WHILE (K.GT.0) + IF (R.GE.XLB) GOTO 410 + theta(it) = R + FXR=PTHETA2(it,nobs,d,ny,nz,nx,nu,ns,nt,S,yk, + 1 theta,thetaprior,tipo,pdll) + NEVAL = NEVAL + 1 + IF (FXR.LE.Z) GOTO 410 + R = R + W +400 K = K - 1 +410 CONTINUE + ENDIF + IF (L.LT.XLB) L = XLB + IF (R.GT.XUB) R = XUB + +C ------------------------------------------------------ +C 3. SAMPLING FROM THE SET A = (I INTERSECT S) = (LA,RA) +C ------------------------------------------------------ + OK = 0 + DO 500 WHILE (OK.EQ.0) +C U = G05CAF(U) + U = genunf(0.D0,1.D0) + XSIM = L + U*(R - L) + theta(it) = XSIM + FXSIM=PTHETA2(it,nobs,d,ny,nz,nx,nu,ns,nt,S,yk, + 1 theta,thetaprior,tipo,pdll) + NEVAL = NEVAL + 1 + IF (FXSIM.GE.Z) OK = 1 + IF(XSIM.GT.XOLD) THEN + R = XSIM + ELSE + L = XSIM + ENDIF +500 CONTINUE + + theta(it) = XOLD + + RETURN END diff --git a/syminv.for b/syminv.for index cbca448c448ae8b4698677f54986dcbe9c6102c0..5bae68f4013bf5f88e749f7b8e0b7b4420ad654d 100644 --- a/syminv.for +++ b/syminv.for @@ -85,7 +85,7 @@ c IF(IROW.NE.0) GO TO 10 100 RETURN END - + SUBROUTINE CHOLA(A, N, U, NULLTY, IFAULT, RMAX, R) C C ALGORITHM AS6, APPLIED STATISTICS, VOL.17, 1968, WITH diff --git a/tnormi.for b/tnormi.for index 1986b67c5f4bcc80e03d59dde673065eba0a9405..0694719c4ddaa07b742b3f281e8876faca8e1047 100644 --- a/tnormi.for +++ b/tnormi.for @@ -1,14 +1,14 @@ -C ---------------------------------------------------------------------- -C TNORMI generates a truncated normal random number -C through the inversion method -C Developed by A.Rossi, C.Planas and G.Fiorentini -C -C Copyright (C) 2010-2014 European Commission -C +C ---------------------------------------------------------------------- +C TNORMI generates a truncated normal random number +C through the inversion method +C Developed by A.Rossi, C.Planas and G.Fiorentini +C +C Copyright (C) 2010-2014 European Commission +C C This file is part of Program DMM C -C DMM is free software developed at the Joint Research Centre of the -C European Commission: you can redistribute it and/or modify it under +C DMM is free software developed at the Joint Research Centre of the +C European Commission: you can redistribute it and/or modify it under C the terms of the GNU General Public License as published by C the Free Software Foundation, either version 3 of the License, or C (at your option) any later version. @@ -19,18 +19,18 @@ C MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the C GNU General Public License for more details. C C You should have received a copy of the GNU General Public License -C along with DMM. If not, see <http://www.gnu.org/licenses/>. -C ---------------------------------------------------------------------- - DOUBLE PRECISION FUNCTION TNORMI(PHIL,PHIP) -C INPUT - DOUBLE PRECISION PHIL,PHIP,T -C EXTERNAL FUNCTIONS - DOUBLE PRECISION genunf,INVNORMCDF !PPND16 - - T = PHIL+genunf(0.d0,1.d0)*(PHIP-PHIL) ! Rescaling U(PHIL,PHIP) -C TNORMI = G01FAF('L',T,IFAIL) ! INVERSE of N(0,1) -C TNORMI = PPND16(T,IFAIL) - TNORMI = INVNORMCDF(T) - - RETURN +C along with DMM. If not, see <http://www.gnu.org/licenses/>. +C ---------------------------------------------------------------------- + DOUBLE PRECISION FUNCTION TNORMI(PHIL,PHIP) +C INPUT + DOUBLE PRECISION PHIL,PHIP,T +C EXTERNAL FUNCTIONS + DOUBLE PRECISION genunf,INVNORMCDF !PPND16 + + T = PHIL+genunf(0.d0,1.d0)*(PHIP-PHIL) ! Rescaling U(PHIL,PHIP) +C TNORMI = G01FAF('L',T,IFAIL) ! INVERSE of N(0,1) +C TNORMI = PPND16(T,IFAIL) + TNORMI = INVNORMCDF(T) + + RETURN END diff --git a/var.for b/var.for index cd9c76695fb2e7dd9f74524d4d0df07a8a93b206..69a651b1707df1400788b51c83cb6fbd535ab984 100644 --- a/var.for +++ b/var.for @@ -1,13 +1,13 @@ -C -------------------------------------- -C VAR computes the variance of an array -C Developed by A.Rossi, C.Planas and G.Fiorentini -C -C Copyright (C) 2010-2014 European Commission -C +C -------------------------------------- +C VAR computes the variance of an array +C Developed by A.Rossi, C.Planas and G.Fiorentini +C +C Copyright (C) 2010-2014 European Commission +C C This file is part of Program DMM C -C DMM is free software developed at the Joint Research Centre of the -C European Commission: you can redistribute it and/or modify it under +C DMM is free software developed at the Joint Research Centre of the +C European Commission: you can redistribute it and/or modify it under C the terms of the GNU General Public License as published by C the Free Software Foundation, either version 3 of the License, or C (at your option) any later version. @@ -18,11 +18,11 @@ C MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the C GNU General Public License for more details. C C You should have received a copy of the GNU General Public License -C along with DMM. If not, see <http://www.gnu.org/licenses/>. -C -------------------------------------- - DOUBLE PRECISION FUNCTION VAR(X,N) - INTEGER N - DOUBLE PRECISION X(N) - VAR=SUM(X(1:N)**2)/DFLOAT(N)-(SUM(X(1:N))/DFLOAT(N))**2 - RETURN +C along with DMM. If not, see <http://www.gnu.org/licenses/>. +C -------------------------------------- + DOUBLE PRECISION FUNCTION VAR(X,N) + INTEGER N + DOUBLE PRECISION X(N) + VAR=SUM(X(1:N)**2)/DFLOAT(N)-(SUM(X(1:N))/DFLOAT(N))**2 + RETURN END