--- imach096d/src/imach.c 2003/02/04 20:55:29 1.69 +++ imach096d/src/imach.c 2004/02/20 13:25:42 1.97 @@ -1,4 +1,86 @@ -/* $Id: imach.c,v 1.69 2003/02/04 20:55:29 brouard Exp $ +/* $Id: imach.c,v 1.97 2004/02/20 13:25:42 lievre Exp $ + $State: Exp $ + $Log: imach.c,v $ + Revision 1.97 2004/02/20 13:25:42 lievre + Version 0.96d. Population forecasting command line is (temporarily) + suppressed. + + Revision 1.96 2003/07/15 15:38:55 brouard + * imach.c (Repository): Errors in subdirf, 2, 3 while printing tmpout is + rewritten within the same printf. Workaround: many printfs. + + Revision 1.95 2003/07/08 07:54:34 brouard + * imach.c (Repository): + (Repository): Using imachwizard code to output a more meaningful covariance + matrix (cov(a12,c31) instead of numbers. + + Revision 1.94 2003/06/27 13:00:02 brouard + Just cleaning + + Revision 1.93 2003/06/25 16:33:55 brouard + (Module): On windows (cygwin) function asctime_r doesn't + exist so I changed back to asctime which exists. + (Module): Version 0.96b + + Revision 1.92 2003/06/25 16:30:45 brouard + (Module): On windows (cygwin) function asctime_r doesn't + exist so I changed back to asctime which exists. + + Revision 1.91 2003/06/25 15:30:29 brouard + * imach.c (Repository): Duplicated warning errors corrected. + (Repository): Elapsed time after each iteration is now output. It + helps to forecast when convergence will be reached. Elapsed time + is stamped in powell. We created a new html file for the graphs + concerning matrix of covariance. It has extension -cov.htm. + + Revision 1.90 2003/06/24 12:34:15 brouard + (Module): Some bugs corrected for windows. Also, when + mle=-1 a template is output in file "or"mypar.txt with the design + of the covariance matrix to be input. + + Revision 1.89 2003/06/24 12:30:52 brouard + (Module): Some bugs corrected for windows. Also, when + mle=-1 a template is output in file "or"mypar.txt with the design + of the covariance matrix to be input. + + Revision 1.88 2003/06/23 17:54:56 brouard + * imach.c (Repository): Create a sub-directory where all the secondary files are. Only imach, htm, gp and r(imach) are on the main directory. Correct time and other things. + + Revision 1.87 2003/06/18 12:26:01 brouard + Version 0.96 + + Revision 1.86 2003/06/17 20:04:08 brouard + (Module): Change position of html and gnuplot routines and added + routine fileappend. + + Revision 1.85 2003/06/17 13:12:43 brouard + * imach.c (Repository): Check when date of death was earlier that + current date of interview. It may happen when the death was just + prior to the death. In this case, dh was negative and likelihood + was wrong (infinity). We still send an "Error" but patch by + assuming that the date of death was just one stepm after the + interview. + (Repository): Because some people have very long ID (first column) + we changed int to long in num[] and we added a new lvector for + memory allocation. But we also truncated to 8 characters (left + truncation) + (Repository): No more line truncation errors. + + Revision 1.84 2003/06/13 21:44:43 brouard + * imach.c (Repository): Replace "freqsummary" at a correct + place. It differs from routine "prevalence" which may be called + many times. Probs is memory consuming and must be used with + parcimony. + Version 0.95a3 (should output exactly the same maximization than 0.8a2) + + Revision 1.83 2003/06/10 13:39:11 lievre + *** empty log message *** + + Revision 1.82 2003/06/05 15:57:20 brouard + Add log in imach.c and fullversion number is now printed. + +*/ +/* Interpolated Markov Chain Short summary of the programme: @@ -48,19 +130,63 @@ It is copyrighted identically to a GNU software product, ie programme and software can be distributed freely for non commercial use. Latest version can be accessed at http://euroreves.ined.fr/imach . + + Help to debug: LD_PRELOAD=/usr/local/lib/libnjamd.so ./imach foo.imach + or better on gdb : set env LD_PRELOAD=/usr/local/lib/libnjamd.so + **********************************************************************/ +/* + main + read parameterfile + read datafile + concatwav + freqsummary + if (mle >= 1) + mlikeli + print results files + if mle==1 + computes hessian + read end of parameter file: agemin, agemax, bage, fage, estepm + begin-prev-date,... + open gnuplot file + open html file + stable prevalence + for age prevalim() + h Pij x + variance of p varprob + forecasting if prevfcast==1 prevforecast call prevalence() + health expectancies + Variance-covariance of DFLE + prevalence() + movingaverage() + varevsij() + if popbased==1 varevsij(,popbased) + total life expectancies + Variance of stable prevalence + end +*/ + + + #include #include #include #include +#include +#include +#include "timeval.h" + +/* #include */ +/* #define _(String) gettext (String) */ + #define MAXLINE 256 #define GNUPLOTPROGRAM "gnuplot" /*#define GNUPLOTPROGRAM "..\\gp37mgw\\wgnuplot"*/ -#define FILENAMELENGTH 80 +#define FILENAMELENGTH 132 /*#define DEBUG*/ -#define windows +/*#define windows*/ #define GLOCK_ERROR_NOPATH -1 /* empty path */ #define GLOCK_ERROR_GETCWD -2 /* cannot get cwd */ @@ -75,16 +201,20 @@ #define YEARM 12. /* Number of months per year */ #define AGESUP 130 #define AGEBASE 40 -#ifdef windows -#define DIRSEPARATOR '\\' -#define ODIRSEPARATOR '/' -#else +#ifdef unix #define DIRSEPARATOR '/' #define ODIRSEPARATOR '\\' +#else +#define DIRSEPARATOR '\\' +#define ODIRSEPARATOR '/' #endif -char version[80]="Imach version 0.91, November 2002, INED-EUROREVES "; -int erreur; /* Error number */ +/* $Id: imach.c,v 1.97 2004/02/20 13:25:42 lievre Exp $ */ +/* $State: Exp $ */ + +char version[]="Imach version 0.96d, February 2004, INED-EUROREVES "; +char fullversion[]="$Revision: 1.97 $ $Date: 2004/02/20 13:25:42 $"; +int erreur, nberr=0, nbwarn=0; /* Error number, number of errors number of warnings */ int nvar; int cptcovn=0, cptcovage=0, cptcoveff=0,cptcov; int npar=NPARMAX; @@ -96,6 +226,8 @@ int popbased=0; int *wav; /* Number of waves for this individuual 0 is possible */ int maxwav; /* Maxim number of waves */ int jmin, jmax; /* min, max spacing between 2 waves */ +int gipmx, gsw; /* Global variables on the number of contributions + to the likelihood and the sum of weights (done by funcone)*/ int mle, weightopt; int **mw; /* mw[mi][i] is number of the mi wave for this individual */ int **dh; /* dh[mi][i] is number of steps between mi,mi+1 for this individual */ @@ -105,10 +237,16 @@ double jmean; /* Mean space between 2 wa double **oldm, **newm, **savm; /* Working pointers to matrices */ double **oldms, **newms, **savms; /* Fixed working pointers to matrices */ FILE *fic,*ficpar, *ficparo,*ficres, *ficrespl, *ficrespij, *ficrest,*ficresf,*ficrespop; -FILE *ficlog; +FILE *ficlog, *ficrespow; +int globpr; /* Global variable for printing or not */ +double fretone; /* Only one call to likelihood */ +long ipmx; /* Number of contributions */ +double sw; /* Sum of weights */ +char fileresilk[FILENAMELENGTH]; /* File of individual contributions to the likelihood */ +FILE *ficresilk; FILE *ficgp,*ficresprob,*ficpop, *ficresprobcov, *ficresprobcor; FILE *ficresprobmorprev; -FILE *fichtm; /* Html File */ +FILE *fichtm, *fichtmcov; /* Html File */ FILE *ficreseij; char filerese[FILENAMELENGTH]; FILE *ficresvij; @@ -118,14 +256,26 @@ char fileresvpl[FILENAMELENGTH]; char title[MAXLINE]; char optionfile[FILENAMELENGTH], datafile[FILENAMELENGTH], filerespl[FILENAMELENGTH]; char optionfilext[10], optionfilefiname[FILENAMELENGTH], plotcmd[FILENAMELENGTH]; +char tmpout[FILENAMELENGTH], tmpout2[FILENAMELENGTH]; +char command[FILENAMELENGTH]; +int outcmd=0; char fileres[FILENAMELENGTH], filerespij[FILENAMELENGTH], filereso[FILENAMELENGTH], rfileres[FILENAMELENGTH]; + char filelog[FILENAMELENGTH]; /* Log file */ char filerest[FILENAMELENGTH]; char fileregp[FILENAMELENGTH]; char popfile[FILENAMELENGTH]; -char optionfilegnuplot[FILENAMELENGTH], optionfilehtm[FILENAMELENGTH]; +char optionfilegnuplot[FILENAMELENGTH], optionfilehtm[FILENAMELENGTH], optionfilehtmcov[FILENAMELENGTH] ; + +struct timeval start_time, end_time, curr_time, last_time, forecast_time; +struct timezone tzp; +extern int gettimeofday(); +struct tm tmg, tm, tmf, *gmtime(), *localtime(); +long time_value; +extern long time(); +char strcurr[80], strfor[80]; #define NR_END 1 #define FREE_ARG char* @@ -163,7 +313,8 @@ int estepm; /* Estepm, step in month to interpolate survival function in order to approximate Life Expectancy*/ int m,nb; -int *num, firstpass=0, lastpass=4,*cod, *ncodemax, *Tage; +long *num; +int firstpass=0, lastpass=4,*cod, *ncodemax, *Tage; double **agev,*moisnais, *annais, *moisdc, *andc,**mint, **anint; double **pmmij, ***probs; double dateintmean=0; @@ -188,15 +339,9 @@ static int split( char *path, char *dirc if ( ss == NULL ) { /* no directory, so use current */ /*if(strrchr(path, ODIRSEPARATOR )==NULL) printf("Warning you should use %s as a separator\n",DIRSEPARATOR);*/ -#if defined(__bsd__) /* get current working directory */ - extern char *getwd( ); - - if ( getwd( dirc ) == NULL ) { -#else - extern char *getcwd( ); - + /* get current working directory */ + /* extern char* getcwd ( char *buf , int len);*/ if ( getcwd( dirc, FILENAME_MAX ) == NULL ) { -#endif return( GLOCK_ERROR_GETCWD ); } strcpy( name, path ); /* we've got it */ @@ -209,11 +354,12 @@ static int split( char *path, char *dirc dirc[l1-l2] = 0; /* add zero */ } l1 = strlen( dirc ); /* length of directory */ -#ifdef windows + /*#ifdef windows if ( dirc[l1-1] != '\\' ) { dirc[l1] = '\\'; dirc[l1+1] = 0; } #else if ( dirc[l1-1] != '/' ) { dirc[l1] = '/'; dirc[l1+1] = 0; } #endif + */ ss = strrchr( name, '.' ); /* find last / */ ss++; strcpy(ext,ss); /* save extension */ @@ -227,10 +373,10 @@ static int split( char *path, char *dirc /******************************************/ -void replace(char *s, char*t) +void replace_back_to_slash(char *s, char*t) { int i; - int lg=20; + int lg=0; i=0; lg=strlen(t); for(i=0; i<= lg; i++) { @@ -311,6 +457,21 @@ void free_ivector(int *v, long nl, long free((FREE_ARG)(v+nl-NR_END)); } +/************************lvector *******************************/ +long *lvector(long nl,long nh) +{ + long *v; + v=(long *) malloc((size_t)((nh-nl+1+NR_END)*sizeof(long))); + if (!v) nrerror("allocation failure in ivector"); + return v-nl+NR_END; +} + +/******************free lvector **************************/ +void free_lvector(long *v, long nl, long nh) +{ + free((FREE_ARG)(v+nl-NR_END)); +} + /******************* imatrix *******************************/ int **imatrix(long nrl, long nrh, long ncl, long nch) /* allocate a int matrix with subscript range m[nrl..nrh][ncl..nch] */ @@ -365,6 +526,8 @@ double **matrix(long nrl, long nrh, long for (i=nrl+1; i<=nrh; i++) m[i]=m[i-1]+ncol; return m; + /* print *(*(m+1)+70) or print m[1][70]; print m+1 or print &(m[1]) + */ } /*************************free matrix ************************/ @@ -404,7 +567,10 @@ double ***ma3x(long nrl, long nrh, long for (j=ncl+1; j<=nch; j++) m[i][j]=m[i][j-1]+nlay; } - return m; + return m; + /* gdb: p *(m+1) <=> p m[1] and p (m+1) <=> p (m+1) <=> p &(m[1]) + &(m[i][j][k]) <=> *((*(m+i) + j)+k) + */ } /*************************free ma3x ************************/ @@ -415,6 +581,41 @@ void free_ma3x(double ***m, long nrl, lo free((FREE_ARG)(m+nrl-NR_END)); } +/*************** function subdirf ***********/ +char *subdirf(char fileres[]) +{ + /* Caution optionfilefiname is hidden */ + strcpy(tmpout,optionfilefiname); + strcat(tmpout,"/"); /* Add to the right */ + strcat(tmpout,fileres); + return tmpout; +} + +/*************** function subdirf2 ***********/ +char *subdirf2(char fileres[], char *preop) +{ + + /* Caution optionfilefiname is hidden */ + strcpy(tmpout,optionfilefiname); + strcat(tmpout,"/"); + strcat(tmpout,preop); + strcat(tmpout,fileres); + return tmpout; +} + +/*************** function subdirf3 ***********/ +char *subdirf3(char fileres[], char *preop, char *preop2) +{ + + /* Caution optionfilefiname is hidden */ + strcpy(tmpout,optionfilefiname); + strcat(tmpout,"/"); + strcat(tmpout,preop); + strcat(tmpout,preop2); + strcat(tmpout,fileres); + return tmpout; +} + /***************** f1dim *************************/ extern int ncom; extern double *pcom,*xicom; @@ -590,6 +791,19 @@ void linmin(double p[], double xi[], int free_vector(pcom,1,n); } +char *asc_diff_time(long time_sec, char ascdiff[]) +{ + long sec_left, days, hours, minutes; + days = (time_sec) / (60*60*24); + sec_left = (time_sec) % (60*60*24); + hours = (sec_left) / (60*60) ; + sec_left = (sec_left) %(60*60); + minutes = (sec_left) /60; + sec_left = (sec_left) % (60); + sprintf(ascdiff,"%d day(s) %d hour(s) %d minute(s) %d second(s)",days, hours, minutes, sec_left); + return ascdiff; +} + /*************** powell ************************/ void powell(double p[], double **xi, int n, double ftol, int *iter, double *fret, double (*func)(double [])) @@ -600,6 +814,8 @@ void powell(double p[], double **xi, int double del,t,*pt,*ptt,*xit; double fp,fptt; double *xits; + int niterf, itmp; + pt=vector(1,n); ptt=vector(1,n); xit=vector(1,n); @@ -610,13 +826,41 @@ void powell(double p[], double **xi, int fp=(*fret); ibig=0; del=0.0; - printf("\nPowell iter=%d -2*LL=%.12f",*iter,*fret); - fprintf(ficlog,"\nPowell iter=%d -2*LL=%.12f",*iter,*fret); - for (i=1;i<=n;i++) + last_time=curr_time; + (void) gettimeofday(&curr_time,&tzp); + printf("\nPowell iter=%d -2*LL=%.12f %ld sec. %ld sec.",*iter,*fret, curr_time.tv_sec-last_time.tv_sec, curr_time.tv_sec-start_time.tv_sec);fflush(stdout); + fprintf(ficlog,"\nPowell iter=%d -2*LL=%.12f %ld sec. %ld sec.",*iter,*fret, curr_time.tv_sec-last_time.tv_sec, curr_time.tv_sec-start_time.tv_sec); + fprintf(ficrespow,"%d %.12f %ld",*iter,*fret,curr_time.tv_sec-start_time.tv_sec); + for (i=1;i<=n;i++) { printf(" %d %.12f",i, p[i]); - fprintf(ficlog," %d %.12f",i, p[i]); + fprintf(ficlog," %d %.12lf",i, p[i]); + fprintf(ficrespow," %.12lf", p[i]); + } printf("\n"); fprintf(ficlog,"\n"); + fprintf(ficrespow,"\n");fflush(ficrespow); + if(*iter <=3){ + tm = *localtime(&curr_time.tv_sec); + strcpy(strcurr,asctime(&tmf)); +/* asctime_r(&tm,strcurr); */ + forecast_time=curr_time; + itmp = strlen(strcurr); + if(strcurr[itmp-1]=='\n') + strcurr[itmp-1]='\0'; + printf("\nConsidering the time needed for this last iteration #%d: %ld seconds,\n",*iter,curr_time.tv_sec-last_time.tv_sec); + fprintf(ficlog,"\nConsidering the time needed for this last iteration #%d: %ld seconds,\n",*iter,curr_time.tv_sec-last_time.tv_sec); + for(niterf=10;niterf<=30;niterf+=10){ + forecast_time.tv_sec=curr_time.tv_sec+(niterf-*iter)*(curr_time.tv_sec-last_time.tv_sec); + tmf = *localtime(&forecast_time.tv_sec); +/* asctime_r(&tmf,strfor); */ + strcpy(strfor,asctime(&tmf)); + itmp = strlen(strfor); + if(strfor[itmp-1]=='\n') + strfor[itmp-1]='\0'; + printf(" - if your program needs %d iterations to converge, convergence will be \n reached in %s or\n on %s (current time is %s);\n",niterf, asc_diff_time(forecast_time.tv_sec-curr_time.tv_sec,tmpout),strfor,strcurr); + fprintf(ficlog," - if your program needs %d iterations to converge, convergence will be \n reached in %s or\n on %s (current time is %s);\n",niterf, asc_diff_time(forecast_time.tv_sec-curr_time.tv_sec,tmpout),strfor,strcurr); + } + } for (i=1;i<=n;i++) { for (j=1;j<=n;j++) xit[j]=xi[j][i]; fptt=(*fret); @@ -972,11 +1216,38 @@ double func( double *x) * is higher than the multiple of stepm and negative otherwise. */ /* lli= (savm[s1][s2]>1.e-8 ?(1.+bbh)*log(out[s1][s2])- bbh*log(savm[s1][s2]):log((1.+bbh)*out[s1][s2]));*/ - lli= (savm[s1][s2]>(double)1.e-8 ?log((1.+bbh)*out[s1][s2]- bbh*(savm[s1][s2])):log((1.+bbh)*out[s1][s2])); /* linear interpolation */ + if( s2 > nlstate){ + /* i.e. if s2 is a death state and if the date of death is known then the contribution + to the likelihood is the probability to die between last step unit time and current + step unit time, which is also the differences between probability to die before dh + and probability to die before dh-stepm . + In version up to 0.92 likelihood was computed + as if date of death was unknown. Death was treated as any other + health state: the date of the interview describes the actual state + and not the date of a change in health state. The former idea was + to consider that at each interview the state was recorded + (healthy, disable or death) and IMaCh was corrected; but when we + introduced the exact date of death then we should have modified + the contribution of an exact death to the likelihood. This new + contribution is smaller and very dependent of the step unit + stepm. It is no more the probability to die between last interview + and month of death but the probability to survive from last + interview up to one month before death multiplied by the + probability to die within a month. Thanks to Chris + Jackson for correcting this bug. Former versions increased + mortality artificially. The bad side is that we add another loop + which slows down the processing. The difference can be up to 10% + lower mortality. + */ + lli=log(out[s1][s2] - savm[s1][s2]); + }else{ + lli= log((1.+bbh)*out[s1][s2]- bbh*savm[s1][s2]); /* linear interpolation */ + /* lli= (savm[s1][s2]>(double)1.e-8 ?log((1.+bbh)*out[s1][s2]- bbh*(savm[s1][s2])):log((1.+bbh)*out[s1][s2]));*/ /* linear interpolation */ + } /*lli=(1.+bbh)*log(out[s1][s2])- bbh*log(savm[s1][s2]);*/ /*if(lli ==000.0)*/ /*printf("bbh= %f lli=%f savm=%f out=%f %d\n",bbh,lli,savm[s1][s2], out[s[mw[mi][i]][i]][s[mw[mi+1][i]][i]],i); */ - ipmx +=1; + ipmx +=1; sw += weight[i]; ll[s[mw[mi][i]][i]] += 2*weight[i]*lli; } /* end of wave */ @@ -1002,31 +1273,10 @@ double func( double *x) oldm=newm; } /* end mult */ - /*lli=log(out[s[mw[mi][i]][i]][s[mw[mi+1][i]][i]]);*/ /* Original formula */ - /* But now since version 0.9 we anticipate for bias and large stepm. - * If stepm is larger than one month (smallest stepm) and if the exact delay - * (in months) between two waves is not a multiple of stepm, we rounded to - * the nearest (and in case of equal distance, to the lowest) interval but now - * we keep into memory the bias bh[mi][i] and also the previous matrix product - * (i.e to dh[mi][i]-1) saved in 'savm'. The we inter(extra)polate the - * probability in order to take into account the bias as a fraction of the way - * from savm to out if bh is neagtive or even beyond if bh is positive. bh varies - * -stepm/2 to stepm/2 . - * For stepm=1 the results are the same as for previous versions of Imach. - * For stepm > 1 the results are less biased than in previous versions. - */ s1=s[mw[mi][i]][i]; s2=s[mw[mi+1][i]][i]; bbh=(double)bh[mi][i]/(double)stepm; - /* bias is positive if real duration - * is higher than the multiple of stepm and negative otherwise. - */ lli= (savm[s1][s2]>(double)1.e-8 ?log((1.+bbh)*out[s1][s2]- bbh*(savm[s1][s2])):log((1.+bbh)*out[s1][s2])); /* linear interpolation */ - /* lli= (savm[s1][s2]>1.e-8 ?(1.+bbh)*log(out[s1][s2])- bbh*log(savm[s1][s2]):log((1.+bbh)*out[s1][s2]));*/ - /*lli= (savm[s1][s2]>1.e-8 ?(1.+bbh)*log(out[s1][s2])- bbh*log(savm[s1][s2]):log((1.-+bh)*out[s1][s2])); */ /* exponential interpolation */ - /*lli=(1.+bbh)*log(out[s1][s2])- bbh*log(savm[s1][s2]);*/ - /*if(lli ==000.0)*/ - /*printf("bbh= %f lli=%f savm=%f out=%f %d\n",bbh,lli,savm[s1][s2], out[s[mw[mi][i]][i]][s[mw[mi+1][i]][i]],i); */ ipmx +=1; sw += weight[i]; ll[s[mw[mi][i]][i]] += 2*weight[i]*lli; @@ -1053,36 +1303,16 @@ double func( double *x) oldm=newm; } /* end mult */ - /*lli=log(out[s[mw[mi][i]][i]][s[mw[mi+1][i]][i]]);*/ /* Original formula */ - /* But now since version 0.9 we anticipate for bias and large stepm. - * If stepm is larger than one month (smallest stepm) and if the exact delay - * (in months) between two waves is not a multiple of stepm, we rounded to - * the nearest (and in case of equal distance, to the lowest) interval but now - * we keep into memory the bias bh[mi][i] and also the previous matrix product - * (i.e to dh[mi][i]-1) saved in 'savm'. The we inter(extra)polate the - * probability in order to take into account the bias as a fraction of the way - * from savm to out if bh is neagtive or even beyond if bh is positive. bh varies - * -stepm/2 to stepm/2 . - * For stepm=1 the results are the same as for previous versions of Imach. - * For stepm > 1 the results are less biased than in previous versions. - */ s1=s[mw[mi][i]][i]; s2=s[mw[mi+1][i]][i]; bbh=(double)bh[mi][i]/(double)stepm; - /* bias is positive if real duration - * is higher than the multiple of stepm and negative otherwise. - */ - /* lli= (savm[s1][s2]>(double)1.e-8 ?log((1.+bbh)*out[s1][s2]- bbh*(savm[s1][s2])):log((1.+bbh)*out[s1][s2])); */ /* linear interpolation */ lli= (savm[s1][s2]>1.e-8 ?(1.+bbh)*log(out[s1][s2])- bbh*log(savm[s1][s2]):log((1.+bbh)*out[s1][s2])); /* exponential inter-extrapolation */ - /*lli=(1.+bbh)*log(out[s1][s2])- bbh*log(savm[s1][s2]);*/ - /*if(lli ==000.0)*/ - /*printf("bbh= %f lli=%f savm=%f out=%f %d\n",bbh,lli,savm[s1][s2], out[s[mw[mi][i]][i]][s[mw[mi+1][i]][i]],i); */ ipmx +=1; sw += weight[i]; ll[s[mw[mi][i]][i]] += 2*weight[i]*lli; } /* end of wave */ } /* end of individual */ - }else{ /* ml=4 no inter-extrapolation */ + }else if (mle==4){ /* ml=4 no inter-extrapolation */ for (i=1,ipmx=0, sw=0.; i<=imx; i++){ for (k=1; k<=cptcovn;k++) cov[2+k]=covar[Tvar[k]][i]; for(mi=1; mi<= wav[i]-1; mi++){ @@ -1104,10 +1334,48 @@ double func( double *x) oldm=newm; } /* end mult */ + s1=s[mw[mi][i]][i]; + s2=s[mw[mi+1][i]][i]; + if( s2 > nlstate){ + lli=log(out[s1][s2] - savm[s1][s2]); + }else{ + lli=log(out[s[mw[mi][i]][i]][s[mw[mi+1][i]][i]]); /* Original formula */ + } + ipmx +=1; + sw += weight[i]; + ll[s[mw[mi][i]][i]] += 2*weight[i]*lli; +/* printf("i=%6d s1=%1d s2=%1d mi=%1d mw=%1d dh=%3d prob=%10.6f w=%6.4f out=%10.6f sav=%10.6f\n",i,s1,s2,mi,mw[mi][i],dh[mi][i],exp(lli),weight[i],out[s1][s2],savm[s1][s2]); */ + } /* end of wave */ + } /* end of individual */ + }else{ /* ml=5 no inter-extrapolation no jackson =0.8a */ + for (i=1,ipmx=0, sw=0.; i<=imx; i++){ + for (k=1; k<=cptcovn;k++) cov[2+k]=covar[Tvar[k]][i]; + for(mi=1; mi<= wav[i]-1; mi++){ + for (ii=1;ii<=nlstate+ndeath;ii++) + for (j=1;j<=nlstate+ndeath;j++){ + oldm[ii][j]=(ii==j ? 1.0 : 0.0); + savm[ii][j]=(ii==j ? 1.0 : 0.0); + } + for(d=0; d nlstate && (mle <5) ){ /* Jackson */ + lli=log(out[s1][s2] - savm[s1][s2]); + } else if (mle==1){ + lli= log((1.+bbh)*out[s1][s2]- bbh*savm[s1][s2]); /* linear interpolation */ + } else if(mle==2){ + lli= (savm[s1][s2]>(double)1.e-8 ?log((1.+bbh)*out[s1][s2]- bbh*savm[s1][s2]):log((1.+bbh)*out[s1][s2])); /* linear interpolation */ + } else if(mle==3){ /* exponential inter-extrapolation */ + lli= (savm[s1][s2]>(double)1.e-8 ?(1.+bbh)*log(out[s1][s2])- bbh*log(savm[s1][s2]):log((1.+bbh)*out[s1][s2])); /* exponential inter-extrapolation */ + } else if (mle==4){ /* mle=4 no inter-extrapolation */ + lli=log(out[s1][s2]); /* Original formula */ + } else{ /* ml>=5 no inter-extrapolation no jackson =0.8a */ + lli=log(out[s1][s2]); /* Original formula */ + } /* End of if */ + ipmx +=1; + sw += weight[i]; + ll[s[mw[mi][i]][i]] += 2*weight[i]*lli; +/* printf("i=%6d s1=%1d s2=%1d mi=%1d mw=%1d dh=%3d prob=%10.6f w=%6.4f out=%10.6f sav=%10.6f\n",i,s1,s2,mi,mw[mi][i],dh[mi][i],exp(lli),weight[i],out[s1][s2],savm[s1][s2]); */ + if(globpr){ + fprintf(ficresilk,"%9d %6d %1d %1d %1d %1d %3d %10.6f %6.4f\ + %10.6f %10.6f %10.6f ", \ + num[i],i,s1,s2,mi,mw[mi][i],dh[mi][i],exp(lli),weight[i], + 2*weight[i]*lli,out[s1][s2],savm[s1][s2]); + for(k=1,llt=0.,l=0.; k<=nlstate; k++){ + llt +=ll[k]*gipmx/gsw; + fprintf(ficresilk," %10.6f",-ll[k]*gipmx/gsw); + } + fprintf(ficresilk," %10.6f\n", -llt); + } + } /* end of wave */ + } /* end of individual */ + for(k=1,l=0.; k<=nlstate; k++) l += ll[k]; + /* printf("l1=%f l2=%f ",ll[1],ll[2]); */ + l= l*ipmx/sw; /* To get the same order of magnitude as if weight=1 for every body */ + if(globpr==0){ /* First time we count the contributions and weights */ + gipmx=ipmx; + gsw=sw; + } + return -l; +} + + +/*************** function likelione ***********/ +void likelione(FILE *ficres,double p[], int npar, int nlstate, int *globpri, long *ipmx, double *sw, double *fretone, double (*funcone)(double [])) +{ + /* This routine should help understanding what is done with + the selection of individuals/waves and + to check the exact contribution to the likelihood. + Plotting could be done. + */ + int k; + + if(*globpri !=0){ /* Just counts and sums, no printings */ + strcpy(fileresilk,"ilk"); + strcat(fileresilk,fileres); + if((ficresilk=fopen(fileresilk,"w"))==NULL) { + printf("Problem with resultfile: %s\n", fileresilk); + fprintf(ficlog,"Problem with resultfile: %s\n", fileresilk); + } + fprintf(ficresilk, "#individual(line's_record) s1 s2 wave# effective_wave# number_of_matrices_product pij weight -2ln(pij)*weight 0pij_x 0pij_(x-stepm) cumulating_loglikeli_by_health_state(reweighted=-2ll*weightXnumber_of_contribs/sum_of_weights) and_total\n"); + fprintf(ficresilk, "#num_i i s1 s2 mi mw dh likeli weight 2wlli out sav "); + /* i,s1,s2,mi,mw[mi][i],dh[mi][i],exp(lli),weight[i],2*weight[i]*lli,out[s1][s2],savm[s1][s2]); */ + for(k=1; k<=nlstate; k++) + fprintf(ficresilk," -2*gipw/gsw*weight*ll[%d]++",k); + fprintf(ficresilk," -2*gipw/gsw*weight*ll(total)\n"); + } + + *fretone=(*funcone)(p); + if(*globpri !=0){ + fclose(ficresilk); + fprintf(fichtm,"\n
File of contributions to the likelihood: %s
\n",subdirf(fileresilk),subdirf(fileresilk)); + fflush(fichtm); + } + return; +} + /*********** Maximum Likelihood Estimation ***************/ void mlikeli(FILE *ficres,double p[], int npar, int ncovmodel, int nlstate, double ftol, double (*func)(double [])) { int i,j, iter; - double **xi,*delti; + double **xi; double fret; + double fretone; /* Only one call to likelihood */ + char filerespow[FILENAMELENGTH]; xi=matrix(1,npar,1,npar); for (i=1;i<=npar;i++) for (j=1;j<=npar;j++) xi[i][j]=(i==j ? 1.0 : 0.0); printf("Powell\n"); fprintf(ficlog,"Powell\n"); + strcpy(filerespow,"pow"); + strcat(filerespow,fileres); + if((ficrespow=fopen(filerespow,"w"))==NULL) { + printf("Problem with resultfile: %s\n", filerespow); + fprintf(ficlog,"Problem with resultfile: %s\n", filerespow); + } + fprintf(ficrespow,"# Powell\n# iter -2*LL"); + for (i=1;i<=nlstate;i++) + for(j=1;j<=nlstate+ndeath;j++) + if(j!=i)fprintf(ficrespow," p%1d%1d",i,j); + fprintf(ficrespow,"\n"); + powell(p,xi,npar,ftol,&iter,&fret,func); - printf("\n#Number of iterations = %d, -2 Log likelihood = %.12f\n",iter,func(p)); + fclose(ficrespow); + printf("\n#Number of iterations = %d, -2 Log likelihood = %.12f\n",iter,func(p)); fprintf(ficlog,"\n#Number of iterations = %d, -2 Log likelihood = %.12f \n",iter,func(p)); fprintf(ficres,"#Number of iterations = %d, -2 Log likelihood = %.12f \n",iter,func(p)); @@ -1396,19 +1801,19 @@ void lubksb(double **a, int n, int *indx } /************ Frequencies ********************/ -void freqsummary(char fileres[], int agemin, int agemax, int **s, double **agev, int nlstate, int imx, int *Tvaraff, int **nbcode, int *ncodemax,double **mint,double **anint, double dateprev1,double dateprev2,double jprev1, double mprev1,double anprev1,double jprev2, double mprev2,double anprev2) +void freqsummary(char fileres[], int iagemin, int iagemax, int **s, double **agev, int nlstate, int imx, int *Tvaraff, int **nbcode, int *ncodemax,double **mint,double **anint) { /* Some frequencies */ int i, m, jk, k1,i1, j1, bool, z1,z2,j; int first; double ***freq; /* Frequencies */ - double *pp; - double pos, k2, dateintsum=0,k2cpt=0; + double *pp, **prop; + double pos,posprop, k2, dateintsum=0,k2cpt=0; FILE *ficresp; char fileresp[FILENAMELENGTH]; pp=vector(1,nlstate); - probs= ma3x(1,AGESUP,1,NCOVMAX, 1,NCOVMAX); + prop=matrix(1,nlstate,iagemin,iagemax+3); strcpy(fileresp,"p"); strcat(fileresp,fileres); if((ficresp=fopen(fileresp,"w"))==NULL) { @@ -1416,7 +1821,7 @@ void freqsummary(char fileres[], int ag fprintf(ficlog,"Problem with prevalence resultfile: %s\n", fileresp); exit(0); } - freq= ma3x(-1,nlstate+ndeath,-1,nlstate+ndeath,agemin,agemax+3); + freq= ma3x(-1,nlstate+ndeath,-1,nlstate+ndeath,iagemin,iagemax+3); j1=0; j=cptcoveff; @@ -1431,8 +1836,12 @@ void freqsummary(char fileres[], int ag scanf("%d", i);*/ for (i=-1; i<=nlstate+ndeath; i++) for (jk=-1; jk<=nlstate+ndeath; jk++) - for(m=agemin; m <= agemax+3; m++) + for(m=iagemin; m <= iagemax+3; m++) freq[i][jk][m]=0; + + for (i=1; i<=nlstate; i++) + for(m=iagemin; m <= iagemax+3; m++) + prop[i][m]=0; dateintsum=0; k2cpt=0; @@ -1446,24 +1855,25 @@ void freqsummary(char fileres[], int ag if (bool==1){ for(m=firstpass; m<=lastpass; m++){ k2=anint[m][i]+(mint[m][i]/12.); - if ((k2>=dateprev1) && (k2<=dateprev2)) { - if(agev[m][i]==0) agev[m][i]=agemax+1; - if(agev[m][i]==1) agev[m][i]=agemax+2; + /*if ((k2>=dateprev1) && (k2<=dateprev2)) {*/ + if(agev[m][i]==0) agev[m][i]=iagemax+1; + if(agev[m][i]==1) agev[m][i]=iagemax+2; + if (s[m][i]>0 && s[m][i]<=nlstate) prop[s[m][i]][(int)agev[m][i]] += weight[i]; if (m1) && (agev[m][i]< (agemax+3))) { + if ((agev[m][i]>1) && (agev[m][i]< (iagemax+3))) { dateintsum=dateintsum+k2; k2cpt++; } - } + /*}*/ } } } - fprintf(ficresp, "#Count between %.lf/%.lf/%.lf and %.lf/%.lf/%.lf\n",jprev1, mprev1,anprev1,jprev2, mprev2,anprev2); + /* fprintf(ficresp, "#Count between %.lf/%.lf/%.lf and %.lf/%.lf/%.lf\n",jprev1, mprev1,anprev1,jprev2, mprev2,anprev2);*/ if (cptcovn>0) { fprintf(ficresp, "\n#********** Variable "); @@ -1474,8 +1884,8 @@ void freqsummary(char fileres[], int ag fprintf(ficresp, " Age Prev(%d) N(%d) N",i,i); fprintf(ficresp, "\n"); - for(i=(int)agemin; i <= (int)agemax+3; i++){ - if(i==(int)agemax+3){ + for(i=iagemin; i <= iagemax+3; i++){ + if(i==iagemax+3){ fprintf(ficlog,"Total"); }else{ if(first==1){ @@ -1506,10 +1916,11 @@ void freqsummary(char fileres[], int ag for(jk=1; jk <=nlstate ; jk++){ for(m=0, pp[jk]=0; m <=nlstate+ndeath; m++) pp[jk] += freq[jk][m][i]; - } - - for(jk=1,pos=0; jk <=nlstate ; jk++) + } + for(jk=1,pos=0,posprop=0; jk <=nlstate ; jk++){ pos += pp[jk]; + posprop += prop[jk][i]; + } for(jk=1; jk <=nlstate ; jk++){ if(pos>=1.e-5){ if(first==1) @@ -1520,14 +1931,14 @@ void freqsummary(char fileres[], int ag printf(" %d.=%.0f prev[%d]=NaNQ%%",jk,pp[jk],jk); fprintf(ficlog," %d.=%.0f prev[%d]=NaNQ%%",jk,pp[jk],jk); } - if( i <= (int) agemax){ + if( i <= iagemax){ if(pos>=1.e-5){ - fprintf(ficresp," %d %.5f %.0f %.0f",i,pp[jk]/pos, pp[jk],pos); - probs[i][jk][j1]= pp[jk]/pos; + fprintf(ficresp," %d %.5f %.0f %.0f",i,prop[jk][i]/posprop, prop[jk][i],posprop); + /*probs[i][jk][j1]= pp[jk]/pos;*/ /*printf("\ni=%d jk=%d j1=%d %.5f %.0f %.0f %f",i,jk,j1,pp[jk]/pos, pp[jk],pos,probs[i][jk][j1]);*/ } else - fprintf(ficresp," %d NaNq %.0f %.0f",i,pp[jk],pos); + fprintf(ficresp," %d NaNq %.0f %.0f",i,prop[jk][i],posprop); } } @@ -1538,7 +1949,7 @@ void freqsummary(char fileres[], int ag printf(" %d%d=%.0f",jk,m,freq[jk][m][i]); fprintf(ficlog," %d%d=%.0f",jk,m,freq[jk][m][i]); } - if(i <= (int) agemax) + if(i <= iagemax) fprintf(ficresp,"\n"); if(first==1) printf("Others in log...\n"); @@ -1549,14 +1960,14 @@ void freqsummary(char fileres[], int ag dateintmean=dateintsum/k2cpt; fclose(ficresp); - free_ma3x(freq,-1,nlstate+ndeath,-1,nlstate+ndeath,(int) agemin,(int) agemax+3); + free_ma3x(freq,-1,nlstate+ndeath,-1,nlstate+ndeath, iagemin, iagemax+3); free_vector(pp,1,nlstate); - + free_matrix(prop,1,nlstate,iagemin, iagemax+3); /* End of Freq */ } /************ Prevalence ********************/ -void prevalence(int agemin, float agemax, int **s, double **agev, int nlstate, int imx, int *Tvar, int **nbcode, int *ncodemax,double **mint,double **anint, double dateprev1,double dateprev2, double calagedatem) +void prevalence(double ***probs, double agemin, double agemax, int **s, double **agev, int nlstate, int imx, int *Tvar, int **nbcode, int *ncodemax,double **mint,double **anint, double dateprev1,double dateprev2, int firstpass, int lastpass) { /* Compute observed prevalence between dateprev1 and dateprev2 by counting the number of people in each health status at the date of interview (if between dateprev1 and dateprev2). @@ -1565,13 +1976,16 @@ void prevalence(int agemin, float agemax int i, m, jk, k1, i1, j1, bool, z1,z2,j; double ***freq; /* Frequencies */ - double *pp; - double pos; + double *pp, **prop; + double pos,posprop; double y2; /* in fractional years */ + int iagemin, iagemax; - pp=vector(1,nlstate); - - freq=ma3x(-1,nlstate+ndeath,-1,nlstate+ndeath,agemin,agemax+3); + iagemin= (int) agemin; + iagemax= (int) agemax; + /*pp=vector(1,nlstate);*/ + prop=matrix(1,nlstate,iagemin,iagemax+3); + /* freq=ma3x(-1,nlstate+ndeath,-1,nlstate+ndeath,iagemin,iagemax+3);*/ j1=0; j=cptcoveff; @@ -1581,10 +1995,9 @@ void prevalence(int agemin, float agemax for(i1=1; i1<=ncodemax[k1];i1++){ j1++; - for (i=-1; i<=nlstate+ndeath; i++) - for (jk=-1; jk<=nlstate+ndeath; jk++) - for(m=agemin; m <= agemax+3; m++) - freq[i][jk][m]=0; + for (i=1; i<=nlstate; i++) + for(m=iagemin; m <= iagemax+3; m++) + prop[i][m]=0.0; for (i=1; i<=imx; i++) { /* Each individual */ bool=1; @@ -1597,52 +2010,39 @@ void prevalence(int agemin, float agemax for(m=firstpass; m<=lastpass; m++){/* Other selection (we can limit to certain interviews*/ y2=anint[m][i]+(mint[m][i]/12.); /* Fractional date in year */ if ((y2>=dateprev1) && (y2<=dateprev2)) { /* Here is the main selection (fractional years) */ - if(agev[m][i]==0) agev[m][i]=agemax+1; - if(agev[m][i]==1) agev[m][i]=agemax+2; - if (m0) /* We compute prevalence at exact age, agev in fractional years */ - freq[s[m][i]][s[m+1][i]][(int)(agev[m][i]+1-((int)calagedatem %12)/12.)] += weight[i]; - else - freq[s[m][i]][s[m+1][i]][(int)agev[m][i]] += weight[i]; - freq[s[m][i]][s[m+1][i]][(int)(agemax+3)] += weight[i]; - } + if(agev[m][i]==0) agev[m][i]=iagemax+1; + if(agev[m][i]==1) agev[m][i]=iagemax+2; + if((int)agev[m][i] iagemax+3) printf("Error on individual =%d agev[m][i]=%f m=%d\n",i, agev[m][i],m); + if (s[m][i]>0 && s[m][i]<=nlstate) { + /*if(i>4620) printf(" i=%d m=%d s[m][i]=%d (int)agev[m][i]=%d weight[i]=%f prop=%f\n",i,m,s[m][i],(int)agev[m][m],weight[i],prop[s[m][i]][(int)agev[m][i]]);*/ + prop[s[m][i]][(int)agev[m][i]] += weight[i]; + prop[s[m][i]][iagemax+3] += weight[i]; + } } } /* end selection of waves */ } } - for(i=(int)agemin; i <= (int)agemax+3; i++){ - for(jk=1; jk <=nlstate ; jk++){ - for(m=-1, pp[jk]=0; m <=nlstate+ndeath ; m++) - pp[jk] += freq[jk][m][i]; - } - for(jk=1; jk <=nlstate ; jk++){ - for(m=-1, pos=0; m <=0 ; m++) - pos += freq[jk][m][i]; - } - - for(jk=1; jk <=nlstate ; jk++){ - for(m=0, pp[jk]=0; m <=nlstate+ndeath; m++) - pp[jk] += freq[jk][m][i]; - } - - for(jk=1,pos=0; jk <=nlstate ; jk++) pos += pp[jk]; + for(i=iagemin; i <= iagemax+3; i++){ - for(jk=1; jk <=nlstate ; jk++){ - if( i <= (int) agemax){ - if(pos>=1.e-5){ - probs[i][jk][j1]= pp[jk]/pos; - } - } - }/* end jk */ - }/* end i */ + for(jk=1,posprop=0; jk <=nlstate ; jk++) { + posprop += prop[jk][i]; + } + + for(jk=1; jk <=nlstate ; jk++){ + if( i <= iagemax){ + if(posprop>=1.e-5){ + probs[i][jk][j1]= prop[jk][i]/posprop; + } + } + }/* end jk */ + }/* end i */ } /* end i1 */ } /* end k1 */ - - free_ma3x(freq,-1,nlstate+ndeath,-1,nlstate+ndeath,(int) agemin,(int) agemax+3); - free_vector(pp,1,nlstate); - -} /* End of Freq */ + /* free_ma3x(freq,-1,nlstate+ndeath,-1,nlstate+ndeath, iagemin, iagemax+3);*/ + /*free_vector(pp,1,nlstate);*/ + free_matrix(prop,1,nlstate, iagemin,iagemax+3); +} /* End of prevalence */ /************* Waves Concatenation ***************/ @@ -1685,31 +2085,40 @@ void concatwav(int wav[], int **dh, int wav[i]=mi; if(mi==0){ + nbwarn++; if(first==0){ - printf("Warning, no any valid information for:%d line=%d and may be others, see log file\n",num[i],i); + printf("Warning! None valid information for:%ld line=%d (skipped) and may be others, see log file\n",num[i],i); first=1; } if(first==1){ - fprintf(ficlog,"Warning, no any valid information for:%d line=%d\n",num[i],i); + fprintf(ficlog,"Warning! None valid information for:%ld line=%d (skipped)\n",num[i],i); } } /* end mi==0 */ - } + } /* End individuals */ for(i=1; i<=imx; i++){ for(mi=1; mi nlstate) { + if (s[mw[mi+1][i]][i] > nlstate) { /* A death */ if (agedc[i] < 2*AGESUP) { - j= rint(agedc[i]*12-agev[mw[mi][i]][i]*12); - if(j==0) j=1; /* Survives at least one month after exam */ - k=k+1; - if (j >= jmax) jmax=j; - if (j <= jmin) jmin=j; - sum=sum+j; - /*if (j<0) printf("j=%d num=%d \n",j,i); */ - /* printf("%d %d %d %d\n", s[mw[mi][i]][i] ,s[mw[mi+1][i]][i],j,i);*/ + j= rint(agedc[i]*12-agev[mw[mi][i]][i]*12); + if(j==0) j=1; /* Survives at least one month after exam */ + else if(j<0){ + nberr++; + printf("Error! Negative delay (%d to death) between waves %d and %d of individual %ld at line %d who is aged %.1f with statuses from %d to %d\n ",j,mw[mi][i],mw[mi+1][i],num[i], i,agev[mw[mi][i]][i],s[mw[mi][i]][i] ,s[mw[mi+1][i]][i]); + j=1; /* Temporary Dangerous patch */ + printf(" We assumed that the date of interview was correct (and not the date of death) and postponed the death %d month(s) (one stepm) after the interview.\n You MUST fix the contradiction between dates.\n",stepm); + fprintf(ficlog,"Error! Negative delay (%d to death) between waves %d and %d of individual %ld at line %d who is aged %.1f with statuses from %d to %d\n ",j,mw[mi][i],mw[mi+1][i],num[i], i,agev[mw[mi][i]][i],s[mw[mi][i]][i] ,s[mw[mi+1][i]][i]); + fprintf(ficlog," We assumed that the date of interview was correct (and not the date of death) and postponed the death %d month(s) (one stepm) after the interview.\n You MUST fix the contradiction between dates.\n",stepm); + } + k=k+1; + if (j >= jmax) jmax=j; + if (j <= jmin) jmin=j; + sum=sum+j; + /*if (j<0) printf("j=%d num=%d \n",j,i);*/ + /* printf("%d %d %d %d\n", s[mw[mi][i]][i] ,s[mw[mi+1][i]][i],j,i);*/ } } else{ @@ -1719,12 +2128,18 @@ void concatwav(int wav[], int **dh, int if (j >= jmax) jmax=j; else if (j <= jmin)jmin=j; /* if (j<10) printf("j=%d jmin=%d num=%d ",j,jmin,i); */ + /*printf("%d %lf %d %d %d\n", i,agev[mw[mi][i]][i],j,s[mw[mi][i]][i] ,s[mw[mi+1][i]][i]);*/ + if(j<0){ + nberr++; + printf("Error! Negative delay (%d) between waves %d and %d of individual %ld at line %d who is aged %.1f with statuses from %d to %d\n ",j,mw[mi][i],mw[mi+1][i],num[i], i,agev[mw[mi][i]][i],s[mw[mi][i]][i] ,s[mw[mi+1][i]][i]); + fprintf(ficlog,"Error! Negative delay (%d) between waves %d and %d of individual %ld at line %d who is aged %.1f with statuses from %d to %d\n ",j,mw[mi][i],mw[mi+1][i],num[i], i,agev[mw[mi][i]][i],s[mw[mi][i]][i] ,s[mw[mi+1][i]][i]); + } sum=sum+j; } jk= j/stepm; jl= j -jk*stepm; ju= j -(jk+1)*stepm; - if(mle <=1){ + if(mle <=1){ /* only if we use a the linear-interpoloation pseudo-likelihood */ if(jl==0){ dh[mi][i]=jk; bh[mi][i]=0; @@ -1747,10 +2162,10 @@ void concatwav(int wav[], int **dh, int if(dh[mi][i]==0){ dh[mi][i]=1; /* At least one step */ bh[mi][i]=ju; /* At least one step */ - printf(" bh=%d ju=%d jl=%d dh=%d jk=%d stepm=%d %d\n",bh[mi][i],ju,jl,dh[mi][i],jk,stepm,i); + /* printf(" bh=%d ju=%d jl=%d dh=%d jk=%d stepm=%d %d\n",bh[mi][i],ju,jl,dh[mi][i],jk,stepm,i);*/ } - } - } /* end if mle */ + } /* end if mle */ + } } /* end wave */ } jmean=sum/k; @@ -1832,10 +2247,10 @@ void evsij(char fileres[], double ***eij double ***gradg, ***trgradg; int theta; - varhe=ma3x(1,nlstate*2,1,nlstate*2,(int) bage, (int) fage); + varhe=ma3x(1,nlstate*nlstate,1,nlstate*nlstate,(int) bage, (int) fage); xp=vector(1,npar); - dnewm=matrix(1,nlstate*2,1,npar); - doldm=matrix(1,nlstate*2,1,nlstate*2); + dnewm=matrix(1,nlstate*nlstate,1,npar); + doldm=matrix(1,nlstate*nlstate,1,nlstate*nlstate); fprintf(ficreseij,"# Health expectancies\n"); fprintf(ficreseij,"# Age"); @@ -1881,9 +2296,9 @@ void evsij(char fileres[], double ***eij /* if (stepm >= YEARM) hstepm=1;*/ nhstepm = nstepm/hstepm;/* Expressed in hstepm, typically nhstepm=40/4=10 */ p3mat=ma3x(1,nlstate+ndeath,1, nlstate+ndeath, 0,nhstepm); - gradg=ma3x(0,nhstepm,1,npar,1,nlstate*2); - gp=matrix(0,nhstepm,1,nlstate*2); - gm=matrix(0,nhstepm,1,nlstate*2); + gradg=ma3x(0,nhstepm,1,npar,1,nlstate*nlstate); + gp=matrix(0,nhstepm,1,nlstate*nlstate); + gm=matrix(0,nhstepm,1,nlstate*nlstate); /* Computed by stepm unit matrices, product of hstepm matrices, stored in an array of nhstepm length: nhstepm=10, hstepm=4, stepm=6 months */ @@ -1892,7 +2307,7 @@ void evsij(char fileres[], double ***eij hf=hstepm*stepm/YEARM; /* Duration of hstepm expressed in year unit. */ - /* Computing Variances of health expectancies */ + /* Computing Variances of health expectancies */ for(theta=1; theta <=npar; theta++){ for(i=1; i<=npar; i++){ @@ -1920,11 +2335,12 @@ void evsij(char fileres[], double ***eij for(i=1;i<=nlstate;i++){ cptj=cptj+1; for(h=0, gm[h][cptj]=0.; h<=nhstepm-1; h++){ + gm[h][cptj] = (p3mat[i][j][h]+p3mat[i][j][h+1])/2.; } } } - for(j=1; j<= nlstate*2; j++) + for(j=1; j<= nlstate*nlstate; j++) for(h=0; h<=nhstepm-1; h++){ gradg[h][theta][j]= (gp[h][j]-gm[h][j])/2./delti[theta]; } @@ -1932,26 +2348,26 @@ void evsij(char fileres[], double ***eij /* End theta */ - trgradg =ma3x(0,nhstepm,1,nlstate*2,1,npar); + trgradg =ma3x(0,nhstepm,1,nlstate*nlstate,1,npar); for(h=0; h<=nhstepm-1; h++) - for(j=1; j<=nlstate*2;j++) + for(j=1; j<=nlstate*nlstate;j++) for(theta=1; theta <=npar; theta++) trgradg[h][j][theta]=gradg[h][theta][j]; - for(i=1;i<=nlstate*2;i++) - for(j=1;j<=nlstate*2;j++) + for(i=1;i<=nlstate*nlstate;i++) + for(j=1;j<=nlstate*nlstate;j++) varhe[i][j][(int)age] =0.; printf("%d|",(int)age);fflush(stdout); fprintf(ficlog,"%d|",(int)age);fflush(ficlog); for(h=0;h<=nhstepm-1;h++){ for(k=0;k<=nhstepm-1;k++){ - matprod2(dnewm,trgradg[h],1,nlstate*2,1,npar,1,npar,matcov); - matprod2(doldm,dnewm,1,nlstate*2,1,npar,1,nlstate*2,gradg[k]); - for(i=1;i<=nlstate*2;i++) - for(j=1;j<=nlstate*2;j++) + matprod2(dnewm,trgradg[h],1,nlstate*nlstate,1,npar,1,npar,matcov); + matprod2(doldm,dnewm,1,nlstate*nlstate,1,npar,1,nlstate*nlstate,gradg[k]); + for(i=1;i<=nlstate*nlstate;i++) + for(j=1;j<=nlstate*nlstate;j++) varhe[i][j][(int)age] += doldm[i][j]*hf*hf; } } @@ -1974,19 +2390,19 @@ void evsij(char fileres[], double ***eij } fprintf(ficreseij,"\n"); - free_matrix(gm,0,nhstepm,1,nlstate*2); - free_matrix(gp,0,nhstepm,1,nlstate*2); - free_ma3x(gradg,0,nhstepm,1,npar,1,nlstate*2); - free_ma3x(trgradg,0,nhstepm,1,nlstate*2,1,npar); + free_matrix(gm,0,nhstepm,1,nlstate*nlstate); + free_matrix(gp,0,nhstepm,1,nlstate*nlstate); + free_ma3x(gradg,0,nhstepm,1,npar,1,nlstate*nlstate); + free_ma3x(trgradg,0,nhstepm,1,nlstate*nlstate,1,npar); free_ma3x(p3mat,1,nlstate+ndeath,1, nlstate+ndeath, 0,nhstepm); } printf("\n"); fprintf(ficlog,"\n"); free_vector(xp,1,npar); - free_matrix(dnewm,1,nlstate*2,1,npar); - free_matrix(doldm,1,nlstate*2,1,nlstate*2); - free_ma3x(varhe,1,nlstate*2,1,nlstate*2,(int) bage, (int)fage); + free_matrix(dnewm,1,nlstate*nlstate,1,npar); + free_matrix(doldm,1,nlstate*nlstate,1,nlstate*nlstate); + free_ma3x(varhe,1,nlstate*nlstate,1,nlstate*nlstate,(int) bage, (int)fage); } /************ Variance ******************/ @@ -2050,23 +2466,10 @@ void varevsij(char optionfilefiname[], d fprintf(ficresprobmorprev," w%1d p%-d%-d",i,i,j); } fprintf(ficresprobmorprev,"\n"); - if((ficgp=fopen(optionfilegnuplot,"a"))==NULL) { - printf("Problem with gnuplot file: %s\n", optionfilegnuplot); - fprintf(ficlog,"Problem with gnuplot file: %s\n", optionfilegnuplot); - exit(0); - } - else{ - fprintf(ficgp,"\n# Routine varevsij"); - } - if((fichtm=fopen(optionfilehtm,"a"))==NULL) { - printf("Problem with html file: %s\n", optionfilehtm); - fprintf(ficlog,"Problem with html file: %s\n", optionfilehtm); - exit(0); - } - else{ - fprintf(fichtm,"\n
  • Computing probabilities of dying over estepm months as a weighted average (i.e global mortality independent of initial healh state)

  • \n"); - fprintf(fichtm,"\n
    %s
    \n",digitp); - } + fprintf(ficgp,"\n# Routine varevsij"); + fprintf(fichtm,"\n
  • Computing probabilities of dying over estepm months as a weighted average (i.e global mortality independent of initial healh state)

  • \n"); + fprintf(fichtm,"\n
    %s
    \n",digitp); +/* } */ varppt = matrix(nlstate+1,nlstate+ndeath,nlstate+1,nlstate+ndeath); fprintf(ficresvij,"# Variance and covariance of health expectancies e.j \n# (weighted average of eij where weights are the stable prevalence in health states i\n"); @@ -2215,13 +2618,12 @@ void varevsij(char optionfilefiname[], d vareij[i][j][(int)age] += doldm[i][j]*hf*hf; } } - + /* pptj */ matprod2(dnewmp,trgradgp,nlstate+1,nlstate+ndeath,1,npar,1,npar,matcov); matprod2(doldmp,dnewmp,nlstate+1,nlstate+ndeath,1,npar,nlstate+1,nlstate+ndeath,gradgp); - - for(j=nlstate+1;j<=nlstate+ndeath;j++) - for(i=nlstate+1;i<=nlstate+ndeath;i++){ + for(j=nlstate+1;j<=nlstate+ndeath;j++) + for(i=nlstate+1;i<=nlstate+ndeath;i++) varppt[j][i]=doldmp[j][i]; /* end ppptj */ /* x centered again */ @@ -2237,7 +2639,7 @@ void varevsij(char optionfilefiname[], d prlim[i][i]=mobaverage[(int)age][i][ij]; } } - + /* This for computing probability of death (h=1 means computed over hstepm (estepm) matrices product = hstepm*stepm months) as a weighted average of prlim. @@ -2279,14 +2681,15 @@ void varevsij(char optionfilefiname[], d /* fprintf(ficgp,"\n plot \"%s\" u 1:($3*%6.3f) not w l 1 ",fileresprobmorprev,YEARM/estepm); */ /* fprintf(ficgp,"\n replot \"%s\" u 1:(($3+1.96*$4)*%6.3f) t \"95\%% interval\" w l 2 ",fileresprobmorprev,YEARM/estepm); */ /* fprintf(ficgp,"\n replot \"%s\" u 1:(($3-1.96*$4)*%6.3f) not w l 2 ",fileresprobmorprev,YEARM/estepm); */ - fprintf(ficgp,"\n plot \"%s\" u 1:($3) not w l 1 ",fileresprobmorprev); - fprintf(ficgp,"\n replot \"%s\" u 1:(($3+1.96*$4)) t \"95\%% interval\" w l 2 ",fileresprobmorprev); - fprintf(ficgp,"\n replot \"%s\" u 1:(($3-1.96*$4)) not w l 2 ",fileresprobmorprev); - fprintf(fichtm,"\n
    File (multiple files are possible if covariates are present): %s\n",fileresprobmorprev,fileresprobmorprev); - fprintf(fichtm,"\n
    Probability is computed over estepm=%d months.

    \n", estepm,digitp,digit); + fprintf(ficgp,"\n plot \"%s\" u 1:($3) not w l 1 ",subdirf(fileresprobmorprev)); + fprintf(ficgp,"\n replot \"%s\" u 1:(($3+1.96*$4)) t \"95\%% interval\" w l 2 ",subdirf(fileresprobmorprev)); + fprintf(ficgp,"\n replot \"%s\" u 1:(($3-1.96*$4)) not w l 2 ",subdirf(fileresprobmorprev)); + fprintf(fichtm,"\n
    File (multiple files are possible if covariates are present): %s\n",subdirf(fileresprobmorprev),subdirf(fileresprobmorprev)); + fprintf(fichtm,"\n
    Probability is computed over estepm=%d months.

    \n", estepm,subdirf3(optionfilefiname,"varmuptjgr",digitp),digit); /* fprintf(fichtm,"\n
    Probability is computed over estepm=%d months and then divided by estepm and multiplied by %.0f in order to have the probability to die over a year

    \n", stepm,YEARM,digitp,digit); */ - fprintf(ficgp,"\nset out \"varmuptjgr%s%s.png\";replot;",digitp,digit); +/* fprintf(ficgp,"\nset out \"varmuptjgr%s%s%s.png\";replot;",digitp,optionfilefiname,digit); */ + fprintf(ficgp,"\nset out \"%s%s.png\";replot;\n",subdirf3(optionfilefiname,"varmuptjgr",digitp),digit); free_vector(xp,1,npar); free_matrix(doldm,1,nlstate,1,nlstate); @@ -2296,9 +2699,9 @@ void varevsij(char optionfilefiname[], d free_matrix(varppt,nlstate+1,nlstate+ndeath,nlstate+1,nlstate+ndeath); if (mobilav!=0) free_ma3x(mobaverage,1, AGESUP,1,NCOVMAX, 1,NCOVMAX); fclose(ficresprobmorprev); - fclose(ficgp); - fclose(fichtm); -} + fflush(ficgp); + fflush(fichtm); +} /* end varevsij */ /************ Variance of prevlim ******************/ void varprevlim(char fileres[], double **varpl, double **matcov, double x[], double delti[], int nlstate, int stepm, double bage, double fage, double **oldm, double **savm, double **prlim, double ftolpl, int ij) @@ -2454,28 +2857,23 @@ void varprob(char optionfilefiname[], do mu=matrix(1,(nlstate)*(nlstate+ndeath), (int) bage, (int)fage); varpij=ma3x(1,nlstate*(nlstate+ndeath),1,nlstate*(nlstate+ndeath),(int) bage, (int) fage); first=1; - if((ficgp=fopen(optionfilegnuplot,"a"))==NULL) { - printf("Problem with gnuplot file: %s\n", optionfilegnuplot); - fprintf(ficlog,"Problem with gnuplot file: %s\n", optionfilegnuplot); - exit(0); - } - else{ - fprintf(ficgp,"\n# Routine varprob"); - } - if((fichtm=fopen(optionfilehtm,"a"))==NULL) { - printf("Problem with html file: %s\n", optionfilehtm); - fprintf(ficlog,"Problem with html file: %s\n", optionfilehtm); - exit(0); - } - else{ - fprintf(fichtm,"\n
  • Computing and drawing one step probabilities with their confidence intervals

  • \n"); - fprintf(fichtm,"\n"); - - fprintf(fichtm,"\n
  • Computing matrix of variance-covariance of step probabilities

  • \n"); - fprintf(fichtm,"\nWe have drawn ellipsoids of confidence around the pij, pkl to understand the covariance between two incidences. They are expressed in year-1 in order to be less dependent of stepm.
    \n"); - fprintf(fichtm,"\n
    We have drawn x'cov-1x = 4 where x is the column vector (pij,pkl). It means that if pij and pkl where uncorrelated the (2X2) matrix would have been (1/(var pij), 0 , 0, 1/(var pkl)), and the confidence interval would be 2 standard deviations wide on each axis.
    When both incidences are correlated we diagonalised the inverse of the covariance matrix and made the appropriate rotation.
    \n"); - - } + fprintf(ficgp,"\n# Routine varprob"); + fprintf(fichtm,"\n
  • Computing and drawing one step probabilities with their confidence intervals

  • \n"); + fprintf(fichtm,"\n"); + + fprintf(fichtm,"\n
  • Matrix of variance-covariance of pairs of step probabilities (drawings)

  • \n",optionfilehtmcov); + fprintf(fichtmcov,"\n

    Matrix of variance-covariance of pairs of step probabilities

    \n\ + file %s
    \n",optionfilehtmcov); + fprintf(fichtmcov,"\nEllipsoids of confidence centered on point (pij, pkl) are estimated\ +and drawn. It helps understanding how is the covariance between two incidences.\ + They are expressed in year-1 in order to be less dependent of stepm.
    \n"); + fprintf(fichtmcov,"\n
    Contour plot corresponding to x'cov-1x = 4 (where x is the column vector (pij,pkl)) are drawn. \ +It can be understood this way: if pij and pkl where uncorrelated the (2x2) matrix of covariance \ +would have been (1/(var pij), 0 , 0, 1/(var pkl)), and the confidence interval would be 2 \ +standard deviations wide on each axis.
    \ + Now, if both incidences are correlated (usual case) we diagonalised the inverse of the covariance matrix\ + and made the appropriate rotation to look at the uncorrelated principal directions.
    \ +To be simple, these graphs help to understand the significativity of each parameter in relation to a second other one.
    \n"); cov[1]=1; tj=cptcoveff; @@ -2497,9 +2895,9 @@ void varprob(char optionfilefiname[], do fprintf(ficgp, "**********\n#\n"); - fprintf(fichtm, "\n
    ********** Variable "); + fprintf(fichtmcov, "\n
    ********** Variable "); for (z1=1; z1<=cptcoveff; z1++) fprintf(fichtm, "V%d=%d ",Tvaraff[z1],nbcode[Tvaraff[z1]][codtab[j1][z1]]); - fprintf(fichtm, "**********\n
    "); + fprintf(fichtmcov, "**********\n
    "); fprintf(ficresprobcor, "\n#********** Variable "); for (z1=1; z1<=cptcoveff; z1++) fprintf(ficresprobcor, "V%d=%d ",Tvaraff[z1],nbcode[Tvaraff[z1]][codtab[j1][z1]]); @@ -2522,7 +2920,7 @@ void varprob(char optionfilefiname[], do for(theta=1; theta <=npar; theta++){ for(i=1; i<=npar; i++) - xp[i] = x[i] + (i==theta ?delti[theta]:0); + xp[i] = x[i] + (i==theta ?delti[theta]:(double)0); pmij(pmmij,cov,ncovmodel,xp,nlstate); @@ -2535,7 +2933,7 @@ void varprob(char optionfilefiname[], do } for(i=1; i<=npar; i++) - xp[i] = x[i] - (i==theta ?delti[theta]:0); + xp[i] = x[i] - (i==theta ?delti[theta]:(double)0); pmij(pmmij,cov,ncovmodel,xp,nlstate); k=0; @@ -2547,7 +2945,7 @@ void varprob(char optionfilefiname[], do } for(i=1; i<= (nlstate)*(nlstate+ndeath); i++) - gradg[theta][i]=(gp[i]-gm[i])/2./delti[theta]; + gradg[theta][i]=(gp[i]-gm[i])/(double)2./delti[theta]; } for(j=1; j<=(nlstate)*(nlstate+ndeath);j++) @@ -2657,10 +3055,14 @@ void varprob(char optionfilefiname[], do fprintf(ficgp,"\nset parametric;unset label"); fprintf(ficgp,"\nset log y;set log x; set xlabel \"p%1d%1d (year-1)\";set ylabel \"p%1d%1d (year-1)\"",k1,l1,k2,l2); fprintf(ficgp,"\nset ter png small\nset size 0.65,0.65"); - fprintf(fichtm,"\n
    Ellipsoids of confidence cov(p%1d%1d,p%1d%1d) expressed in year-1 :varpijgr%s%d%1d%1d-%1d%1d.png, ",k1,l1,k2,l2,optionfilefiname, j1,k1,l1,k2,l2,optionfilefiname, j1,k1,l1,k2,l2); - fprintf(fichtm,"\n
    ",optionfilefiname, j1,k1,l1,k2,l2); - fprintf(fichtm,"\n
    Correlation at age %d (%.3f),",(int) age, c12); - fprintf(ficgp,"\nset out \"varpijgr%s%d%1d%1d-%1d%1d.png\"",optionfilefiname, j1,k1,l1,k2,l2); + fprintf(fichtmcov,"\n
    Ellipsoids of confidence cov(p%1d%1d,p%1d%1d) expressed in year-1\ + :\ +%s%d%1d%1d-%1d%1d.png, ",k1,l1,k2,l2,\ + subdirf2(optionfilefiname,"varpijgr"), j1,k1,l1,k2,l2,\ + subdirf2(optionfilefiname,"varpijgr"), j1,k1,l1,k2,l2); + fprintf(fichtmcov,"\n
    ",subdirf2(optionfilefiname,"varpijgr"), j1,k1,l1,k2,l2); + fprintf(fichtmcov,"\n
    Correlation at age %d (%.3f),",(int) age, c12); + fprintf(ficgp,"\nset out \"%s%d%1d%1d-%1d%1d.png\"",subdirf2(optionfilefiname,"varpijgr"), j1,k1,l1,k2,l2); fprintf(ficgp,"\nset label \"%d\" at %11.3e,%11.3e center",(int) age, mu1,mu2); fprintf(ficgp,"\n# Age %d, p%1d%1d - p%1d%1d",(int) age, k1,l1,k2,l2); fprintf(ficgp,"\nplot [-pi:pi] %11.3e+ %.3f*(%11.3e*%11.3e*cos(t)+%11.3e*%11.3e*sin(t)), %11.3e +%.3f*(%11.3e*%11.3e*cos(t)+%11.3e*%11.3e*sin(t)) not",\ @@ -2668,7 +3070,7 @@ void varprob(char optionfilefiname[], do mu2,std,v21,sqrt(lc1),v22,sqrt(lc2)); }else{ first=0; - fprintf(fichtm," %d (%.3f),",(int) age, c12); + fprintf(fichtmcov," %d (%.3f),",(int) age, c12); fprintf(ficgp,"\n# Age %d, p%1d%1d - p%1d%1d",(int) age, k1,l1,k2,l2); fprintf(ficgp,"\nset label \"%d\" at %11.3e,%11.3e center",(int) age, mu1,mu2); fprintf(ficgp,"\nreplot %11.3e+ %.3f*(%11.3e*%11.3e*cos(t)+%11.3e*%11.3e*sin(t)), %11.3e +%.3f*(%11.3e*%11.3e*cos(t)+%11.3e*%11.3e*sin(t)) not",\ @@ -2677,7 +3079,7 @@ void varprob(char optionfilefiname[], do }/* if first */ } /* age mod 5 */ } /* end loop age */ - fprintf(ficgp,"\nset out \"varpijgr%s%d%1d%1d-%1d%1d.png\";replot;",optionfilefiname, j1,k1,l1,k2,l2); + fprintf(ficgp,"\nset out \"%s%d%1d%1d-%1d%1d.png\";replot;",subdirf2(optionfilefiname,"varpijgr"), j1,k1,l1,k2,l2); first=1; } /*l12 */ } /* k12 */ @@ -2691,8 +3093,8 @@ void varprob(char optionfilefiname[], do fclose(ficresprob); fclose(ficresprobcov); fclose(ficresprobcor); - fclose(ficgp); - fclose(fichtm); + fflush(ficgp); + fflush(fichtmcov); } @@ -2704,19 +3106,20 @@ void printinghtml(char fileres[], char t double jprev1, double mprev1,double anprev1, \ double jprev2, double mprev2,double anprev2){ int jj1, k1, i1, cpt; - /*char optionfilehtm[FILENAMELENGTH];*/ - if((fichtm=fopen(optionfilehtm,"a"))==NULL) { - printf("Problem with %s \n",optionfilehtm), exit(0); - fprintf(ficlog,"Problem with %s \n",optionfilehtm), exit(0); - } - fprintf(fichtm,"
    • Result files (first order: no variance)

      \n - - Observed prevalence in each state (during the period defined between %.lf/%.lf/%.lf and %.lf/%.lf/%.lf): p%s
      \n - - Estimated transition probabilities over %d (stepm) months: pij%s
      \n - - Stable prevalence in each health state: pl%s
      \n - - Life expectancies by age and initial health status (estepm=%2d months): - e%s
      \n
    • ", \ - jprev1, mprev1,anprev1,jprev2, mprev2,anprev2,fileres,fileres,stepm,fileres,fileres,fileres,fileres,estepm,fileres,fileres); + fprintf(fichtm,"
      • Result files (first order: no variance)

        \n \ + - Observed prevalence in each state (during the period defined between %.lf/%.lf/%.lf and %.lf/%.lf/%.lf): %s
        \n ", + jprev1, mprev1,anprev1,jprev2, mprev2,anprev2,subdirf2(fileres,"p"),subdirf2(fileres,"p")); + fprintf(fichtm,"\ + - Estimated transition probabilities over %d (stepm) months: %s
        \n ", + stepm,subdirf2(fileres,"pij"),subdirf2(fileres,"pij")); + fprintf(fichtm,"\ + - Stable prevalence in each health state: %s
        \n", + subdirf2(fileres,"pl"),subdirf2(fileres,"pl")); + fprintf(fichtm,"\ + - Life expectancies by age and initial health status (estepm=%2d months): \ + %s
        \n
      • ", + estepm,subdirf2(fileres,"e"),subdirf2(fileres,"e")); fprintf(fichtm," \n
        • Graphs
        • "); @@ -2734,44 +3137,57 @@ fprintf(fichtm," \n

          • Graphs fprintf(fichtm," ************\n
            "); } /* Pij */ - fprintf(fichtm,"
            - Pij or Conditional probabilities to be observed in state j being in state i %d (stepm) months before: pe%s%d1.png
            -",stepm,strtok(optionfile, "."),jj1,strtok(optionfile, "."),jj1); + fprintf(fichtm,"
            - Pij or Conditional probabilities to be observed in state j being in state i, %d (stepm) months before: %s%d1.png
            \ +",stepm,subdirf2(optionfilefiname,"pe"),jj1,subdirf2(optionfilefiname,"pe"),jj1); /* Quasi-incidences */ - fprintf(fichtm,"
            - Pij or Conditional probabilities to be observed in state j being in state i %d (stepm) months before but expressed in per year i.e. quasi incidences if stepm is small and probabilities too: pe%s%d2.png
            -",stepm,strtok(optionfile, "."),jj1,strtok(optionfile, "."),jj1); + fprintf(fichtm,"
            - Pij or Conditional probabilities to be observed in state j being in state i %d (stepm) months\ + before but expressed in per year i.e. quasi incidences if stepm is small and probabilities too: %s%d2.png
            \ +",stepm,subdirf2(optionfilefiname,"pe"),jj1,subdirf2(optionfilefiname,"pe"),jj1); /* Stable prevalence in each health state */ for(cpt=1; cpt- Stable prevalence in each health state : p%s%d%d.png
            -",strtok(optionfile, "."),cpt,jj1,strtok(optionfile, "."),cpt,jj1); + fprintf(fichtm,"
            - Stable prevalence in each health state : p%s%d%d.png
            \ +",subdirf2(optionfilefiname,"p"),cpt,jj1,subdirf2(optionfilefiname,"p"),cpt,jj1); } for(cpt=1; cpt<=nlstate;cpt++) { - fprintf(fichtm,"\n
            - Health life expectancies by age and initial health state (%d): exp%s%d%d.png
            -",cpt,strtok(optionfile, "."),cpt,jj1,strtok(optionfile, "."),cpt,jj1); + fprintf(fichtm,"\n
            - Health life expectancies by age and initial health state (%d): %s%d%d.png
            \ +",cpt,subdirf2(optionfilefiname,"exp"),cpt,jj1,subdirf2(optionfilefiname,"exp"),cpt,jj1); } - fprintf(fichtm,"\n
            - Total life expectancy by age and -health expectancies in states (1) and (2): e%s%d.png
            -",strtok(optionfile, "."),jj1,strtok(optionfile, "."),jj1); } /* end i1 */ }/* End k1 */ fprintf(fichtm,"
          "); - fprintf(fichtm,"\n
        • Result files (second order: variances)

          \n - - Parameter file with estimated parameters and covariance matrix: %s
          \n - - Variance of one-step probabilities: prob%s
          \n - - Variance-covariance of one-step probabilities: probcov%s
          \n - - Correlation matrix of one-step probabilities: probcor%s
          \n - - Variances and covariances of life expectancies by age and initial health status (estepm=%d months): v%s
          \n - - Health expectancies with their variances (no covariance): t%s
          \n - - Standard deviation of stable prevalences: vpl%s
          \n",rfileres,rfileres,fileres,fileres,fileres,fileres,fileres,fileres, estepm, fileres,fileres,fileres,fileres,fileres,fileres); - - if(popforecast==1) fprintf(fichtm,"\n - - Prevalences forecasting: f%s
          \n - - Population forecasting (if popforecast=1): pop%s
          \n -
          ",fileres,fileres,fileres,fileres); - else - fprintf(fichtm,"\n No population forecast: popforecast = %d (instead of 1) or stepm = %d (instead of 1) or model=%s (instead of .)

        • \n",popforecast, stepm, model); -fprintf(fichtm,"
          • Graphs
          • "); + fprintf(fichtm,"\ +\n

          • Result files (second order: variances)

            \n\ + - Parameter file with estimated parameters and covariance matrix: %s
            \n", rfileres,rfileres); + + fprintf(fichtm," - Variance of one-step probabilities: %s
            \n", + subdirf2(fileres,"prob"),subdirf2(fileres,"prob")); + fprintf(fichtm,"\ + - Variance-covariance of one-step probabilities: %s
            \n", + subdirf2(fileres,"probcov"),subdirf2(fileres,"probcov")); + + fprintf(fichtm,"\ + - Correlation matrix of one-step probabilities: %s
            \n", + subdirf2(fileres,"probcor"),subdirf2(fileres,"probcor")); + fprintf(fichtm,"\ + - Variances and covariances of life expectancies by age and initial health status (estepm=%d months): %s
            \n", + estepm, subdirf2(fileres,"v"),subdirf2(fileres,"v")); + fprintf(fichtm,"\ + - Health expectancies with their variances (no covariance): %s
            \n", + subdirf2(fileres,"t"),subdirf2(fileres,"t")); + fprintf(fichtm,"\ + - Standard deviation of stable prevalences: %s
            \n",\ + subdirf2(fileres,"vpl"),subdirf2(fileres,"vpl")); + +/* if(popforecast==1) fprintf(fichtm,"\n */ +/* - Prevalences forecasting: f%s
            \n */ +/* - Population forecasting (if popforecast=1): pop%s
            \n */ +/*
            ",fileres,fileres,fileres,fileres); */ +/* else */ +/* fprintf(fichtm,"\n No population forecast: popforecast = %d (instead of 1) or stepm = %d (instead of 1) or model=%s (instead of .)

          • \n",popforecast, stepm, model); */ + fflush(fichtm); + fprintf(fichtm,"
            • Graphs
            • "); m=cptcoveff; if (cptcovn < 1) {m=1;ncodemax[1]=1;} @@ -2787,76 +3203,87 @@ fprintf(fichtm,"

              • Graphs"); } for(cpt=1; cpt<=nlstate;cpt++) { - fprintf(fichtm,"
                - Observed and stationary prevalence (with confident -interval) in state (%d): v%s%d%d.png
                -",cpt,strtok(optionfile, "."),cpt,jj1,strtok(optionfile, "."),cpt,jj1); + fprintf(fichtm,"
                - Observed (cross-sectional) and period (incidence based) \ +prevalence (with 95%% confidence interval) in state (%d): %s%d%d.png
                \ +",cpt,subdirf2(optionfilefiname,"v"),cpt,jj1,subdirf2(optionfilefiname,"v"),cpt,jj1); } + fprintf(fichtm,"\n
                - Total life expectancy by age and \ +health expectancies in states (1) and (2): %s%d.png
                \ +",subdirf2(optionfilefiname,"e"),jj1,subdirf2(optionfilefiname,"e"),jj1); } /* end i1 */ }/* End k1 */ fprintf(fichtm,"
              "); -fclose(fichtm); + fflush(fichtm); } /******************* Gnuplot file **************/ -void printinggnuplot(char fileres[], double ageminpar, double agemaxpar, double fage , char pathc[], double p[]){ +void printinggnuplot(char fileres[], char optionfilefiname[], double ageminpar, double agemaxpar, double fage , char pathc[], double p[]){ + char dirfileres[132],optfileres[132]; int m,cpt,k1,i,k,j,jk,k2,k3,ij,l; int ng; - if((ficgp=fopen(optionfilegnuplot,"a"))==NULL) { - printf("Problem with file %s",optionfilegnuplot); - fprintf(ficlog,"Problem with file %s",optionfilegnuplot); - } +/* if((ficgp=fopen(optionfilegnuplot,"a"))==NULL) { */ +/* printf("Problem with file %s",optionfilegnuplot); */ +/* fprintf(ficlog,"Problem with file %s",optionfilegnuplot); */ +/* } */ /*#ifdef windows */ - fprintf(ficgp,"cd \"%s\" \n",pathc); + fprintf(ficgp,"cd \"%s\" \n",pathc); /*#endif */ -m=pow(2,cptcoveff); - + m=pow(2,cptcoveff); + + strcpy(dirfileres,optionfilefiname); + strcpy(optfileres,"vpl"); /* 1eme*/ for (cpt=1; cpt<= nlstate ; cpt ++) { for (k1=1; k1<= m ; k1 ++) { - fprintf(ficgp,"\nset out \"v%s%d%d.png\" \n",strtok(optionfile, "."),cpt,k1); - fprintf(ficgp,"set xlabel \"Age\" \nset ylabel \"Probability\" \nset ter png small\nset size 0.65,0.65\nplot [%.f:%.f] \"vpl%s\" every :::%d::%d u 1:2 \"\%%lf",ageminpar,fage,fileres,k1-1,k1-1); + fprintf(ficgp,"\nset out \"%s%d%d.png\" \n",subdirf2(optionfilefiname,"v"),cpt,k1); + fprintf(ficgp,"\n#set out \"v%s%d%d.png\" \n",optionfilefiname,cpt,k1); + fprintf(ficgp,"set xlabel \"Age\" \n\ +set ylabel \"Probability\" \n\ +set ter png small\n\ +set size 0.65,0.65\n\ +plot [%.f:%.f] \"%s\" every :::%d::%d u 1:2 \"\%%lf",ageminpar,fage,subdirf2(fileres,"vpl"),k1-1,k1-1); for (i=1; i<= nlstate ; i ++) { if (i==cpt) fprintf(ficgp," \%%lf (\%%lf)"); else fprintf(ficgp," \%%*lf (\%%*lf)"); } - fprintf(ficgp,"\" t\"Stable prevalence\" w l 0,\"vpl%s\" every :::%d::%d u 1:($2+1.96*$3) \"\%%lf",fileres,k1-1,k1-1); + fprintf(ficgp,"\" t\"Stable prevalence\" w l 0,\"%s\" every :::%d::%d u 1:($2+1.96*$3) \"\%%lf",subdirf2(fileres,"vpl"),k1-1,k1-1); for (i=1; i<= nlstate ; i ++) { if (i==cpt) fprintf(ficgp," \%%lf (\%%lf)"); else fprintf(ficgp," \%%*lf (\%%*lf)"); } - fprintf(ficgp,"\" t\"95\%% CI\" w l 1,\"vpl%s\" every :::%d::%d u 1:($2-1.96*$3) \"\%%lf",fileres,k1-1,k1-1); + fprintf(ficgp,"\" t\"95\%% CI\" w l 1,\"%s\" every :::%d::%d u 1:($2-1.96*$3) \"\%%lf",subdirf2(fileres,"vpl"),k1-1,k1-1); for (i=1; i<= nlstate ; i ++) { if (i==cpt) fprintf(ficgp," \%%lf (\%%lf)"); else fprintf(ficgp," \%%*lf (\%%*lf)"); } - fprintf(ficgp,"\" t\"\" w l 1,\"p%s\" every :::%d::%d u 1:($%d) t\"Observed prevalence \" w l 2",fileres,k1-1,k1-1,2+4*(cpt-1)); + fprintf(ficgp,"\" t\"\" w l 1,\"%s\" every :::%d::%d u 1:($%d) t\"Observed prevalence \" w l 2",subdirf2(fileres,"p"),k1-1,k1-1,2+4*(cpt-1)); } } /*2 eme*/ for (k1=1; k1<= m ; k1 ++) { - fprintf(ficgp,"\nset out \"e%s%d.png\" \n",strtok(optionfile, "."),k1); + fprintf(ficgp,"\nset out \"%s%d.png\" \n",subdirf2(optionfilefiname,"e"),k1); fprintf(ficgp,"set ylabel \"Years\" \nset ter png small\nset size 0.65,0.65\nplot [%.f:%.f] ",ageminpar,fage); for (i=1; i<= nlstate+1 ; i ++) { k=2*i; - fprintf(ficgp,"\"t%s\" every :::%d::%d u 1:2 \"\%%lf",fileres,k1-1,k1-1); + fprintf(ficgp,"\"%s\" every :::%d::%d u 1:2 \"\%%lf",subdirf2(fileres,"t"),k1-1,k1-1); for (j=1; j<= nlstate+1 ; j ++) { if (j==i) fprintf(ficgp," \%%lf (\%%lf)"); else fprintf(ficgp," \%%*lf (\%%*lf)"); } if (i== 1) fprintf(ficgp,"\" t\"TLE\" w l ,"); else fprintf(ficgp,"\" t\"LE in state (%d)\" w l ,",i-1); - fprintf(ficgp,"\"t%s\" every :::%d::%d u 1:($2-$3*2) \"\%%lf",fileres,k1-1,k1-1); + fprintf(ficgp,"\"%s\" every :::%d::%d u 1:($2-$3*2) \"\%%lf",subdirf2(fileres,"t"),k1-1,k1-1); for (j=1; j<= nlstate+1 ; j ++) { if (j==i) fprintf(ficgp," \%%lf (\%%lf)"); else fprintf(ficgp," \%%*lf (\%%*lf)"); } fprintf(ficgp,"\" t\"\" w l 0,"); - fprintf(ficgp,"\"t%s\" every :::%d::%d u 1:($2+$3*2) \"\%%lf",fileres,k1-1,k1-1); + fprintf(ficgp,"\"%s\" every :::%d::%d u 1:($2+$3*2) \"\%%lf",subdirf2(fileres,"t"),k1-1,k1-1); for (j=1; j<= nlstate+1 ; j ++) { if (j==i) fprintf(ficgp," \%%lf (\%%lf)"); else fprintf(ficgp," \%%*lf (\%%*lf)"); @@ -2871,8 +3298,10 @@ m=pow(2,cptcoveff); for (k1=1; k1<= m ; k1 ++) { for (cpt=1; cpt<= nlstate ; cpt ++) { k=2+nlstate*(2*cpt-2); - fprintf(ficgp,"\nset out \"exp%s%d%d.png\" \n",strtok(optionfile, "."),cpt,k1); - fprintf(ficgp,"set ter png small\nset size 0.65,0.65\nplot [%.f:%.f] \"e%s\" every :::%d::%d u 1:%d t \"e%d1\" w l",ageminpar,fage,fileres,k1-1,k1-1,k,cpt); + fprintf(ficgp,"\nset out \"%s%d%d.png\" \n",subdirf2(optionfilefiname,"exp"),cpt,k1); + fprintf(ficgp,"set ter png small\n\ +set size 0.65,0.65\n\ +plot [%.f:%.f] \"%s\" every :::%d::%d u 1:%d t \"e%d1\" w l",ageminpar,fage,subdirf2(fileres,"e"),k1-1,k1-1,k,cpt); /*fprintf(ficgp,",\"e%s\" every :::%d::%d u 1:($%d-2*$%d) \"\%%lf ",fileres,k1-1,k1-1,k,k+1); for (i=1; i<= nlstate*2 ; i ++) fprintf(ficgp,"\%%lf (\%%lf) "); fprintf(ficgp,"\" t \"e%d1\" w l",cpt); @@ -2882,25 +3311,28 @@ m=pow(2,cptcoveff); */ for (i=1; i< nlstate ; i ++) { - fprintf(ficgp," ,\"e%s\" every :::%d::%d u 1:%d t \"e%d%d\" w l",fileres,k1-1,k1-1,k+2*i,cpt,i+1); + fprintf(ficgp," ,\"%s\" every :::%d::%d u 1:%d t \"e%d%d\" w l",subdirf2(fileres,"e"),k1-1,k1-1,k+2*i,cpt,i+1); } } } - /* CV preval stat */ + /* CV preval stable (period) */ for (k1=1; k1<= m ; k1 ++) { - for (cpt=1; cpt=(ageminpar-((int)calagedatem %12)/12.); agedeb--){ - nhstepm=(int) rint((agelim-agedeb)*YEARM/stepm); + for (agec=fage; agec>=(ageminpar-1); agec--){ + nhstepm=(int) rint((agelim-agec)*YEARM/stepm); nhstepm = nhstepm/hstepm; - p3mat=ma3x(1,nlstate+ndeath,1, nlstate+ndeath, 0,nhstepm); oldm=oldms;savm=savms; - hpxij(p3mat,nhstepm,agedeb,hstepm,p,nlstate,stepm,oldm,savm, k); + hpxij(p3mat,nhstepm,agec,hstepm,p,nlstate,stepm,oldm,savm, k); for (h=0; h<=nhstepm; h++){ - if (h==(int) (calagedatem+YEARM*yearp)) { + if (h*hstepm/YEARM*stepm ==yearp) { fprintf(ficresf,"\n"); for(j=1;j<=cptcoveff;j++) fprintf(ficresf,"%d %d ",Tvaraff[j],nbcode[Tvaraff[j]][codtab[k][j]]); - fprintf(ficresf,"%.f %.f ",anproj1+yearp,agedeb+h*hstepm/YEARM*stepm); + fprintf(ficresf,"%.f %.f ",anproj1+yearp,agec+h*hstepm/YEARM*stepm); } for(j=1; j<=nlstate+ndeath;j++) { - kk1=0.;kk2=0; - for(i=1; i<=nlstate;i++) { + ppij=0.; + for(i=1; i<=nlstate;i++) { if (mobilav==1) - kk1=kk1+p3mat[i][j][h]*mobaverage[(int)agedeb+1][i][cptcod]; + ppij=ppij+p3mat[i][j][h]*mobaverage[(int)agec][i][cptcod]; else { - kk1=kk1+p3mat[i][j][h]*probs[(int)(agedeb+1)][i][cptcod]; + ppij=ppij+p3mat[i][j][h]*probs[(int)(agec)][i][cptcod]; } - - } - if (h==(int)(calagedatem+12*yearp)){ - fprintf(ficresf," %.3f", kk1); - + if (h*hstepm/YEARM*stepm== yearp) { + fprintf(ficresf," %.3f", p3mat[i][j][h]); + } + } /* end i */ + if (h*hstepm/YEARM*stepm==yearp) { + fprintf(ficresf," %.3f", ppij); } - } - } + }/* end j */ + } /* end h */ free_ma3x(p3mat,1,nlstate+ndeath,1, nlstate+ndeath, 0,nhstepm); - } - } - } - } + } /* end agec */ + } /* end yearp */ + } /* end cptcod */ + } /* end cptcov */ if (mobilav!=0) free_ma3x(mobaverage,1, AGESUP,1,NCOVMAX, 1,NCOVMAX); fclose(ficresf); } -/************** Forecasting ******************/ + +/************** Forecasting *****not tested NB*************/ populforecast(char fileres[], double anpyram,double mpyram,double jpyram,double ageminpar, double agemax,double dateprev1, double dateprev2, int mobilav, double agedeb, double fage, int popforecast, char popfile[], double anpyram1,double p[], int i2){ int cpt, stepsize, hstepm, nhstepm, j,k,c, cptcod, i,h; @@ -3151,7 +3589,7 @@ populforecast(char fileres[], double anp agelim=AGESUP; calagedatem=(anpyram+mpyram/12.+jpyram/365.-dateintmean)*YEARM; - prevalence(ageminpar, agemax, s, agev, nlstate, imx,Tvar,nbcode, ncodemax,mint,anint,dateprev1,dateprev2, calagedatem); + prevalence(probs, ageminpar, agemax, s, agev, nlstate, imx, Tvar, nbcode, ncodemax, mint, anint, dateprev1, dateprev2, firstpass, lastpass); strcpy(filerespop,"pop"); @@ -3293,8 +3731,144 @@ populforecast(char fileres[], double anp free_ma3x(tabpop,1, AGESUP,1,NCOVMAX, 1,NCOVMAX); free_ma3x(tabpopprev,1, AGESUP,1,NCOVMAX, 1,NCOVMAX); fclose(ficrespop); +} /* End of popforecast */ + +int fileappend(FILE *fichier, char *optionfich) +{ + if((fichier=fopen(optionfich,"a"))==NULL) { + printf("Problem with file: %s\n", optionfich); + fprintf(ficlog,"Problem with file: %s\n", optionfich); + return (0); + } + fflush(fichier); + return (1); } + +/**************** function prwizard **********************/ +void prwizard(int ncovmodel, int nlstate, int ndeath, char model[], FILE *ficparo) +{ + + /* Wizard to print covariance matrix template */ + + char ca[32], cb[32], cc[32]; + int i,j, k, l, li, lj, lk, ll, jj, npar, itimes; + int numlinepar; + + printf("# Parameters nlstate*nlstate*ncov a12*1 + b12 * age + ...\n"); + fprintf(ficparo,"# Parameters nlstate*nlstate*ncov a12*1 + b12 * age + ...\n"); + for(i=1; i <=nlstate; i++){ + jj=0; + for(j=1; j <=nlstate+ndeath; j++){ + if(j==i) continue; + jj++; + /*ca[0]= k+'a'-1;ca[1]='\0';*/ + printf("%1d%1d",i,j); + fprintf(ficparo,"%1d%1d",i,j); + for(k=1; k<=ncovmodel;k++){ + /* printf(" %lf",param[i][j][k]); */ + /* fprintf(ficparo," %lf",param[i][j][k]); */ + printf(" 0."); + fprintf(ficparo," 0."); + } + printf("\n"); + fprintf(ficparo,"\n"); + } + } + printf("# Scales (for hessian or gradient estimation)\n"); + fprintf(ficparo,"# Scales (for hessian or gradient estimation)\n"); + npar= (nlstate+ndeath-1)*nlstate*ncovmodel; /* Number of parameters*/ + for(i=1; i <=nlstate; i++){ + jj=0; + for(j=1; j <=nlstate+ndeath; j++){ + if(j==i) continue; + jj++; + fprintf(ficparo,"%1d%1d",i,j); + printf("%1d%1d",i,j); + fflush(stdout); + for(k=1; k<=ncovmodel;k++){ + /* printf(" %le",delti3[i][j][k]); */ + /* fprintf(ficparo," %le",delti3[i][j][k]); */ + printf(" 0."); + fprintf(ficparo," 0."); + } + numlinepar++; + printf("\n"); + fprintf(ficparo,"\n"); + } + } + printf("# Covariance matrix\n"); +/* # 121 Var(a12)\n\ */ +/* # 122 Cov(b12,a12) Var(b12)\n\ */ +/* # 131 Cov(a13,a12) Cov(a13,b12, Var(a13)\n\ */ +/* # 132 Cov(b13,a12) Cov(b13,b12, Cov(b13,a13) Var(b13)\n\ */ +/* # 212 Cov(a21,a12) Cov(a21,b12, Cov(a21,a13) Cov(a21,b13) Var(a21)\n\ */ +/* # 212 Cov(b21,a12) Cov(b21,b12, Cov(b21,a13) Cov(b21,b13) Cov(b21,a21) Var(b21)\n\ */ +/* # 232 Cov(a23,a12) Cov(a23,b12, Cov(a23,a13) Cov(a23,b13) Cov(a23,a21) Cov(a23,b21) Var(a23)\n\ */ +/* # 232 Cov(b23,a12) Cov(b23,b12) ... Var (b23)\n" */ + fflush(stdout); + fprintf(ficparo,"# Covariance matrix\n"); + /* # 121 Var(a12)\n\ */ + /* # 122 Cov(b12,a12) Var(b12)\n\ */ + /* # ...\n\ */ + /* # 232 Cov(b23,a12) Cov(b23,b12) ... Var (b23)\n" */ + + for(itimes=1;itimes<=2;itimes++){ + jj=0; + for(i=1; i <=nlstate; i++){ + for(j=1; j <=nlstate+ndeath; j++){ + if(j==i) continue; + for(k=1; k<=ncovmodel;k++){ + jj++; + ca[0]= k+'a'-1;ca[1]='\0'; + if(itimes==1){ + printf("#%1d%1d%d",i,j,k); + fprintf(ficparo,"#%1d%1d%d",i,j,k); + }else{ + printf("%1d%1d%d",i,j,k); + fprintf(ficparo,"%1d%1d%d",i,j,k); + /* printf(" %.5le",matcov[i][j]); */ + } + ll=0; + for(li=1;li <=nlstate; li++){ + for(lj=1;lj <=nlstate+ndeath; lj++){ + if(lj==li) continue; + for(lk=1;lk<=ncovmodel;lk++){ + ll++; + if(ll<=jj){ + cb[0]= lk +'a'-1;cb[1]='\0'; + if(ll -#include + char stra[80], strb[80], strc[80], strd[80],stre[80],modelsav[80]; + char strstart[80], *strt, strtend[80]; + char *stratrunc; + int lstra; + + long total_usecs; - /* long total_usecs; - struct timeval start_time, end_time; - - gettimeofday(&start_time, (struct timezone*)0); */ /* at first time */ +/* setlocale (LC_ALL, ""); */ +/* bindtextdomain (PACKAGE, LOCALEDIR); */ +/* textdomain (PACKAGE); */ +/* setlocale (LC_CTYPE, ""); */ +/* setlocale (LC_MESSAGES, ""); */ + + /* gettimeofday(&start_time, (struct timezone*)0); */ /* at first time */ + (void) gettimeofday(&start_time,&tzp); + curr_time=start_time; + tm = *localtime(&start_time.tv_sec); + tmg = *gmtime(&start_time.tv_sec); + strcpy(strstart,asctime(&tm)); + +/* printf("Localtime (at start)=%s",strstart); */ +/* tp.tv_sec = tp.tv_sec +86400; */ +/* tm = *localtime(&start_time.tv_sec); */ +/* tmg.tm_year=tmg.tm_year +dsign*dyear; */ +/* tmg.tm_mon=tmg.tm_mon +dsign*dmonth; */ +/* tmg.tm_hour=tmg.tm_hour + 1; */ +/* tp.tv_sec = mktime(&tmg); */ +/* strt=asctime(&tmg); */ +/* printf("Time(after) =%s",strstart); */ +/* (void) time (&time_value); +* printf("time=%d,t-=%d\n",time_value,time_value-86400); +* tm = *localtime(&time_value); +* strstart=asctime(&tm); +* printf("tim_value=%d,asctime=%s\n",time_value,strstart); +*/ + + nberr=0; /* Number of errors and warnings */ + nbwarn=0; getcwd(pathcd, size); - printf("\n%s",version); + printf("\n%s\n%s",version,fullversion); if(argc <=1){ printf("\nEnter the parameter file name: "); scanf("%s",pathtot); @@ -3363,15 +3977,25 @@ int main(int argc, char *argv[]) else{ strcpy(pathtot,argv[1]); } - /*if(getcwd(pathcd, 80)!= NULL)printf ("Error pathcd\n");*/ + /*if(getcwd(pathcd, MAXLINE)!= NULL)printf ("Error pathcd\n");*/ /*cygwin_split_path(pathtot,path,optionfile); printf("pathtot=%s, path=%s, optionfile=%s\n",pathtot,path,optionfile);*/ /* cutv(path,optionfile,pathtot,'\\');*/ split(pathtot,path,optionfile,optionfilext,optionfilefiname); - printf("pathtot=%s, path=%s, optionfile=%s optionfilext=%s optionfilefiname=%s\n",pathtot,path,optionfile,optionfilext,optionfilefiname); + printf("pathtot=%s,\npath=%s,\noptionfile=%s \noptionfilext=%s \noptionfilefiname=%s\n",pathtot,path,optionfile,optionfilext,optionfilefiname); chdir(path); - replace(pathc,path); + strcpy(command,"mkdir "); + strcat(command,optionfilefiname); + if((outcmd=system(command)) != 0){ + printf("Problem creating directory or it already exists %s%s, err=%d\n",path,optionfilefiname,outcmd); + /* fprintf(ficlog,"Problem creating directory %s%s\n",path,optionfilefiname); */ + /* fclose(ficlog); */ +/* exit(1); */ + } +/* if((imk=mkdir(optionfilefiname))<0){ */ +/* perror("mkdir"); */ +/* } */ /*-------- arguments in the command line --------*/ @@ -3383,10 +4007,19 @@ int main(int argc, char *argv[]) goto end; } fprintf(ficlog,"Log filename:%s\n",filelog); - fprintf(ficlog,"\n%s",version); + fprintf(ficlog,"\n%s\n%s",version,fullversion); fprintf(ficlog,"\nEnter the parameter file name: "); - fprintf(ficlog,"pathtot=%s, path=%s, optionfile=%s optionfilext=%s optionfilefiname=%s\n",pathtot,path,optionfile,optionfilext,optionfilefiname); + fprintf(ficlog,"pathtot=%s\n\ + path=%s \n\ + optionfile=%s\n\ + optionfilext=%s\n\ + optionfilefiname=%s\n",pathtot,path,optionfile,optionfilext,optionfilefiname); + + printf("Local time (at start):%s",strstart); + fprintf(ficlog,"Local time (at start): %s",strstart); fflush(ficlog); +/* (void) gettimeofday(&curr_time,&tzp); */ +/* printf("Elapsed time %d\n", asc_diff_time(curr_time.tv_sec-start_time.tv_sec,tmpout)); */ /* */ strcpy(fileres,"r"); @@ -3398,37 +4031,49 @@ int main(int argc, char *argv[]) if((ficpar=fopen(optionfile,"r"))==NULL) { printf("Problem with optionfile %s\n",optionfile); fprintf(ficlog,"Problem with optionfile %s\n",optionfile); + fflush(ficlog); goto end; } + + strcpy(filereso,"o"); strcat(filereso,fileres); - if((ficparo=fopen(filereso,"w"))==NULL) { + if((ficparo=fopen(filereso,"w"))==NULL) { /* opened on subdirectory */ printf("Problem with Output resultfile: %s\n", filereso); fprintf(ficlog,"Problem with Output resultfile: %s\n", filereso); + fflush(ficlog); goto end; } /* Reads comments: lines beginning with '#' */ + numlinepar=0; while((c=getc(ficpar))=='#' && c!= EOF){ ungetc(c,ficpar); fgets(line, MAXLINE, ficpar); + numlinepar++; puts(line); fputs(line,ficparo); + fputs(line,ficlog); } ungetc(c,ficpar); fscanf(ficpar,"title=%s datafile=%s lastobs=%d firstpass=%d lastpass=%d\nftol=%lf stepm=%d ncovcol=%d nlstate=%d ndeath=%d maxwav=%d mle=%d weight=%d model=%s\n",title, datafile, &lastobs, &firstpass,&lastpass,&ftol, &stepm, &ncovcol, &nlstate,&ndeath, &maxwav, &mle, &weightopt,model); + numlinepar++; printf("title=%s datafile=%s lastobs=%d firstpass=%d lastpass=%d\nftol=%e stepm=%d ncovcol=%d nlstate=%d ndeath=%d maxwav=%d mle=%d weight=%d\nmodel=%s\n", title, datafile, lastobs, firstpass,lastpass,ftol, stepm, ncovcol, nlstate,ndeath, maxwav, mle, weightopt,model); fprintf(ficparo,"title=%s datafile=%s lastobs=%d firstpass=%d lastpass=%d\nftol=%e stepm=%d ncovcol=%d nlstate=%d ndeath=%d maxwav=%d mle=%d weight=%d\nmodel=%s\n", title, datafile, lastobs, firstpass,lastpass,ftol,stepm,ncovcol,nlstate,ndeath,maxwav, mle, weightopt,model); + fprintf(ficlog,"title=%s datafile=%s lastobs=%d firstpass=%d lastpass=%d\nftol=%e stepm=%d ncovcol=%d nlstate=%d ndeath=%d maxwav=%d mle=%d weight=%d\nmodel=%s\n", title, datafile, lastobs, firstpass,lastpass,ftol,stepm,ncovcol,nlstate,ndeath,maxwav, mle, weightopt,model); + fflush(ficlog); while((c=getc(ficpar))=='#' && c!= EOF){ ungetc(c,ficpar); fgets(line, MAXLINE, ficpar); + numlinepar++; puts(line); fputs(line,ficparo); + fputs(line,ficlog); } ungetc(c,ficpar); - + covar=matrix(0,NCOVMAX,1,n); cptcovn=0; /*Number of covariates, i.e. number of '+' in model statement*/ @@ -3436,21 +4081,38 @@ int main(int argc, char *argv[]) ncovmodel=2+cptcovn; /*Number of variables = cptcovn + intercept + age */ nvar=ncovmodel-1; /* Suppressing age as a basic covariate */ - + + if(mle==-1){ /* Print a wizard for help writing covariance matrix */ + prwizard(ncovmodel, nlstate, ndeath, model, ficparo); + printf(" You choose mle=-1, look at file %s for a template of covariance matrix \n",filereso); + fprintf(ficlog," You choose mle=-1, look at file %s for a template of covariance matrix \n",filereso); + fclose (ficparo); + fclose (ficlog); + exit(0); + } /* Read guess parameters */ /* Reads comments: lines beginning with '#' */ while((c=getc(ficpar))=='#' && c!= EOF){ ungetc(c,ficpar); fgets(line, MAXLINE, ficpar); + numlinepar++; puts(line); fputs(line,ficparo); + fputs(line,ficlog); } ungetc(c,ficpar); - + param= ma3x(1,nlstate,1,nlstate+ndeath-1,1,ncovmodel); - for(i=1; i <=nlstate; i++) - for(j=1; j <=nlstate+ndeath-1; j++){ + for(i=1; i <=nlstate; i++){ + j=0; + for(jj=1; jj <=nlstate+ndeath; jj++){ + if(jj==i) continue; + j++; fscanf(ficpar,"%1d%1d",&i1,&j1); + if ((i1 != i) && (j1 != j)){ + printf("Error in line parameters number %d, %1d%1d instead of %1d%1d \n",numlinepar, i,j, i1, j1); + exit(1); + } fprintf(ficparo,"%1d%1d",i1,j1); if(mle==1) printf("%1d%1d",i,j); @@ -3466,12 +4128,15 @@ int main(int argc, char *argv[]) fprintf(ficparo," %lf",param[i][j][k]); } fscanf(ficpar,"\n"); + numlinepar++; if(mle==1) printf("\n"); fprintf(ficlog,"\n"); fprintf(ficparo,"\n"); } - + } + fflush(ficlog); + npar= (nlstate+ndeath-1)*nlstate*ncovmodel; /* Number of parameters*/ p=param[1][1]; @@ -3480,36 +4145,53 @@ int main(int argc, char *argv[]) while((c=getc(ficpar))=='#' && c!= EOF){ ungetc(c,ficpar); fgets(line, MAXLINE, ficpar); + numlinepar++; puts(line); fputs(line,ficparo); + fputs(line,ficlog); } ungetc(c,ficpar); delti3= ma3x(1,nlstate,1,nlstate+ndeath-1,1,ncovmodel); - delti=vector(1,npar); /* Scale of each paramater (output from hesscov) */ + /* delti=vector(1,npar); *//* Scale of each paramater (output from hesscov) */ for(i=1; i <=nlstate; i++){ for(j=1; j <=nlstate+ndeath-1; j++){ fscanf(ficpar,"%1d%1d",&i1,&j1); + if ((i1-i)*(j1-j)!=0){ + printf("Error in line parameters number %d, %1d%1d instead of %1d%1d \n",numlinepar, i,j, i1, j1); + exit(1); + } printf("%1d%1d",i,j); fprintf(ficparo,"%1d%1d",i1,j1); + fprintf(ficlog,"%1d%1d",i1,j1); for(k=1; k<=ncovmodel;k++){ fscanf(ficpar,"%le",&delti3[i][j][k]); printf(" %le",delti3[i][j][k]); fprintf(ficparo," %le",delti3[i][j][k]); + fprintf(ficlog," %le",delti3[i][j][k]); } fscanf(ficpar,"\n"); + numlinepar++; printf("\n"); fprintf(ficparo,"\n"); + fprintf(ficlog,"\n"); } } + fflush(ficlog); + delti=delti3[1][1]; + + + /* free_ma3x(delti3,1,nlstate,1,nlstate+ndeath-1,1,ncovmodel); */ /* Hasn't to to freed here otherwise delti is no more allocated */ /* Reads comments: lines beginning with '#' */ while((c=getc(ficpar))=='#' && c!= EOF){ ungetc(c,ficpar); fgets(line, MAXLINE, ficpar); + numlinepar++; puts(line); fputs(line,ficparo); + fputs(line,ficlog); } ungetc(c,ficpar); @@ -3524,13 +4206,12 @@ int main(int argc, char *argv[]) fscanf(ficpar," %le",&matcov[i][j]); if(mle==1){ printf(" %.5le",matcov[i][j]); - fprintf(ficlog," %.5le",matcov[i][j]); } - else - fprintf(ficlog," %.5le",matcov[i][j]); + fprintf(ficlog," %.5le",matcov[i][j]); fprintf(ficparo," %.5le",matcov[i][j]); } fscanf(ficpar,"\n"); + numlinepar++; if(mle==1) printf("\n"); fprintf(ficlog,"\n"); @@ -3544,6 +4225,7 @@ int main(int argc, char *argv[]) printf("\n"); fprintf(ficlog,"\n"); + fflush(ficlog); /*-------- Rewriting paramater file ----------*/ strcpy(rfileres,"r"); /* "Rparameterfile */ @@ -3565,7 +4247,7 @@ int main(int argc, char *argv[]) n= lastobs; severity = vector(1,maxwav); outcome=imatrix(1,maxwav+1,1,n); - num=ivector(1,n); + num=lvector(1,n); moisnais=vector(1,n); annais=vector(1,n); moisdc=vector(1,n); @@ -3601,10 +4283,16 @@ int main(int argc, char *argv[]) for (j=ncovcol;j>=1;j--){ cutv(stra, strb,line,' '); covar[j][i]=(double)(atoi(strb)); strcpy(line,stra); } - num[i]=atol(stra); + lstra=strlen(stra); + if(lstra > 9){ /* More than 2**32 or max of what printf can write with %ld */ + stratrunc = &(stra[lstra-9]); + num[i]=atol(stratrunc); + } + else + num[i]=atol(stra); /*if((s[2][i]==2) && (s[3][i]==-1)&&(s[4][i]==9)){ - printf("%d %.lf %.lf %.lf %.lf/%.lf %.lf/%.lf %.lf/%.lf %d %.lf/%.lf %d %.lf/%.lf %d %.lf/%.lf %d\n",num[i],(covar[1][i]), (covar[2][i]),weight[i], (moisnais[i]), (annais[i]), (moisdc[i]), (andc[i]), (mint[1][i]), (anint[1][i]), (s[1][i]), (mint[2][i]), (anint[2][i]), (s[2][i]), (mint[3][i]), (anint[3][i]), (s[3][i]), (mint[4][i]), (anint[4][i]), (s[4][i])); ij=ij+1;}*/ + printf("%ld %.lf %.lf %.lf %.lf/%.lf %.lf/%.lf %.lf/%.lf %d %.lf/%.lf %d %.lf/%.lf %d %.lf/%.lf %d\n",num[i],(covar[1][i]), (covar[2][i]),weight[i], (moisnais[i]), (annais[i]), (moisdc[i]), (andc[i]), (mint[1][i]), (anint[1][i]), (s[1][i]), (mint[2][i]), (anint[2][i]), (s[2][i]), (mint[3][i]), (anint[3][i]), (s[3][i]), (mint[4][i]), (anint[4][i]), (s[4][i])); ij=ij+1;}*/ i=i+1; } @@ -3620,9 +4308,13 @@ int main(int argc, char *argv[]) }*/ /* for (i=1; i<=imx; i++){ if (s[4][i]==9) s[4][i]=-1; - printf("%d %.lf %.lf %.lf %.lf/%.lf %.lf/%.lf %.lf/%.lf %d %.lf/%.lf %d %.lf/%.lf %d %.lf/%.lf %d\n",num[i],(covar[1][i]), (covar[2][i]), (weight[i]), (moisnais[i]), (annais[i]), (moisdc[i]), (andc[i]), (mint[1][i]), (anint[1][i]), (s[1][i]), (mint[2][i]), (anint[2][i]), (s[2][i]), (mint[3][i]), (anint[3][i]), (s[3][i]), (mint[4][i]), (anint[4][i]), (s[4][i]));}*/ + printf("%ld %.lf %.lf %.lf %.lf/%.lf %.lf/%.lf %.lf/%.lf %d %.lf/%.lf %d %.lf/%.lf %d %.lf/%.lf %d\n",num[i],(covar[1][i]), (covar[2][i]), (weight[i]), (moisnais[i]), (annais[i]), (moisdc[i]), (andc[i]), (mint[1][i]), (anint[1][i]), (s[1][i]), (mint[2][i]), (anint[2][i]), (s[2][i]), (mint[3][i]), (anint[3][i]), (s[3][i]), (mint[4][i]), (anint[4][i]), (s[4][i]));}*/ + for (i=1; i<=imx; i++) + /*if ((s[3][i]==3) || (s[4][i]==3)) weight[i]=0.08; + else weight[i]=1;*/ + /* Calculation of the number of parameter from char model*/ Tvar=ivector(1,15); /* stores the number n of the covariates in Vm+Vn at 1 and m at 2 */ Tprod=ivector(1,15); @@ -3714,36 +4406,48 @@ int main(int argc, char *argv[]) for (i=1; i<=imx; i++) { for(m=2; (m<= maxwav); m++) { - if ((mint[m][i]== 99) && (s[m][i] <= nlstate)){ + if (((int)mint[m][i]== 99) && (s[m][i] <= nlstate)){ anint[m][i]=9999; s[m][i]=-1; } - if(moisdc[i]==99 && andc[i]==9999 & s[m][i]>nlstate) s[m][i]=-1; + if((int)moisdc[i]==99 && (int)andc[i]==9999 && s[m][i]>nlstate){ + nberr++; + printf("Error! Date of death (month %2d and year %4d) of individual %ld on line %d was unknown, you must set an arbitrary year of death or he/she is skipped and results are biased\n",(int)moisdc[i],(int)andc[i],num[i],i); + fprintf(ficlog,"Error! Date of death (month %2d and year %4d) of individual %ld on line %d was unknown, you must set an arbitrary year of death or he/she is skipped and results are biased\n",(int)moisdc[i],(int)andc[i],num[i],i); + s[m][i]=-1; + } + if((int)moisdc[i]==99 && (int)andc[i]!=9999 && s[m][i]>nlstate){ + nberr++; + printf("Error! Month of death of individual %ld on line %d was unknown %2d, you should set it otherwise the information on the death is skipped and results are biased.\n",num[i],i,(int)moisdc[i]); + fprintf(ficlog,"Error! Month of death of individual %ld on line %d was unknown %f, you should set it otherwise the information on the death is skipped and results are biased.\n",num[i],i,moisdc[i]); + s[m][i]=-1; /* We prefer to skip it (and to skip it in version 0.8a1 too */ + } } } for (i=1; i<=imx; i++) { agedc[i]=(moisdc[i]/12.+andc[i])-(moisnais[i]/12.+annais[i]); - for(m=1; (m<= maxwav); m++){ + for(m=firstpass; (m<= lastpass); m++){ if(s[m][i] >0){ if (s[m][i] >= nlstate+1) { if(agedc[i]>0) - if(moisdc[i]!=99 && andc[i]!=9999) + if((int)moisdc[i]!=99 && (int)andc[i]!=9999) agev[m][i]=agedc[i]; /*if(moisdc[i]==99 && andc[i]==9999) s[m][i]=-1;*/ else { - if (andc[i]!=9999){ - printf("Warning negative age at death: %d line:%d\n",num[i],i); - fprintf(ficlog,"Warning negative age at death: %d line:%d\n",num[i],i); + if ((int)andc[i]!=9999){ + nbwarn++; + printf("Warning negative age at death: %ld line:%d\n",num[i],i); + fprintf(ficlog,"Warning negative age at death: %ld line:%d\n",num[i],i); agev[m][i]=-1; } } - }< + } else if(s[m][i] !=9){ /* Standard case, age in fractional years but with the precision of a month */ agev[m][i]=(mint[m][i]/12.+1./24.+anint[m][i])-(moisnais[i]/12.+1./24.+annais[i]); - if(mint[m][i]==99 || anint[m][i]==9999) + if((int)mint[m][i]==99 || (int)anint[m][i]==9999) agev[m][i]=1; else if(agev[m][i] (nlstate+ndeath)) { + nberr++; printf("Error: on wave %d of individual %d status %d > (nlstate+ndeath)=(%d+%d)=%d\n",m,i,s[m][i],nlstate, ndeath, nlstate+ndeath); fprintf(ficlog,"Error: on wave %d of individual %d status %d > (nlstate+ndeath)=(%d+%d)=%d\n",m,i,s[m][i],nlstate, ndeath, nlstate+ndeath); goto end; @@ -3776,6 +4481,14 @@ int main(int argc, char *argv[]) } } + /*for (i=1; i<=imx; i++){ + for (m=firstpass; (m\nIMaCh Cov %s\n %s
              %s
              \ +
              \n\ +Title=%s
              Datafile=%s Firstpass=%d Lastpass=%d Stepm=%d Weight=%d Model=%s
              \n",\ + fileres,version,fullversion,title,datafile,firstpass,lastpass,stepm, weightopt, model); + } + + fprintf(fichtm,"\nIMaCh %s\n %s
              %s
              \ +
              \n\ +Title=%s
              Datafile=%s Firstpass=%d Lastpass=%d Stepm=%d Weight=%d Model=%s
              \n\ +\n\ +
              \ +
              • Parameter files

                \n\ + - Copy of the parameter file: o%s
                \n\ + - Log file of the run: %s
                \n\ + - Gnuplot file name: %s
                \n\ + - Date and time at start: %s
              \n",\ + fileres,version,fullversion,title,datafile,firstpass,lastpass,stepm, weightopt, model,\ + fileres,fileres,\ + filelog,filelog,optionfilegnuplot,optionfilegnuplot,strstart); + fflush(fichtm); + + strcpy(pathr,path); + strcat(pathr,optionfilefiname); + chdir(optionfilefiname); /* Move to directory named optionfile */ + /* Calculates basic frequencies. Computes observed prevalence at single age and prints on file fileres'p'. */ + freqsummary(fileres, agemin, agemax, s, agev, nlstate, imx,Tvaraff,nbcode, ncodemax,mint,anint); - pmmij= matrix(1,nlstate+ndeath,1,nlstate+ndeath); /* creation */ + fprintf(fichtm,"\n"); + fprintf(fichtm,"
              Total number of observations=%d
              \n\ +Youngest age at first (selected) pass %.2f, oldest age %.2f
              \n\ +Interval (in months) between two waves: Min=%d Max=%d Mean=%.2lf
              \n",\ + imx,agemin,agemax,jmin,jmax,jmean); + pmmij= matrix(1,nlstate+ndeath,1,nlstate+ndeath); /* creation */ oldms= matrix(1,nlstate+ndeath,1,nlstate+ndeath); /* creation */ newms= matrix(1,nlstate+ndeath,1,nlstate+ndeath); /* creation */ savms= matrix(1,nlstate+ndeath,1,nlstate+ndeath); /* creation */ @@ -3844,6 +4614,18 @@ int main(int argc, char *argv[]) so we point p on param[1][1] so that p[1] maps on param[1][1][1] */ p=param[1][1]; /* *(*(*(param +1)+1)+0) */ + globpr=0; /* To get the number ipmx of contributions and the sum of weights*/ + likelione(ficres, p, npar, nlstate, &globpr, &ipmx, &sw, &fretone, funcone); /* Prints the contributions to the likelihood */ + printf("First Likeli=%12.6f ipmx=%ld sw=%12.6f",fretone,ipmx,sw); + for (k=1; k<=npar;k++) + printf(" %d %8.5f",k,p[k]); + printf("\n"); + globpr=1; /* to print the contributions */ + likelione(ficres, p, npar, nlstate, &globpr, &ipmx, &sw, &fretone, funcone); /* Prints the contributions to the likelihood */ + printf("Second Likeli=%12.6f ipmx=%ld sw=%12.6f",fretone,ipmx,sw); + for (k=1; k<=npar;k++) + printf(" %d %8.5f",k,p[k]); + printf("\n"); if(mle>=1){ /* Could be 1 or 2 */ mlikeli(ficres,p, npar, ncovmodel, nlstate, ftol, func); } @@ -3852,30 +4634,28 @@ int main(int argc, char *argv[]) fprintf(ficres,"title=%s datafile=%s lastobs=%d firstpass=%d lastpass=%d\nftol=%e stepm=%d ncovcol=%d nlstate=%d ndeath=%d maxwav=%d mle= 0 weight=%d\nmodel=%s\n", title, datafile, lastobs, firstpass,lastpass,ftol, stepm, ncovcol, nlstate, ndeath, maxwav, weightopt,model); - jk=1; fprintf(ficres,"# Parameters nlstate*nlstate*ncov a12*1 + b12 * age + ...\n"); printf("# Parameters nlstate*nlstate*ncov a12*1 + b12 * age + ...\n"); fprintf(ficlog,"# Parameters nlstate*nlstate*ncov a12*1 + b12 * age + ...\n"); for(i=1,jk=1; i <=nlstate; i++){ for(k=1; k <=(nlstate+ndeath); k++){ - if (k != i) - { - printf("%d%d ",i,k); - fprintf(ficlog,"%d%d ",i,k); - fprintf(ficres,"%1d%1d ",i,k); - for(j=1; j <=ncovmodel; j++){ - printf("%f ",p[jk]); - fprintf(ficlog,"%f ",p[jk]); - fprintf(ficres,"%f ",p[jk]); - jk++; - } - printf("\n"); - fprintf(ficlog,"\n"); - fprintf(ficres,"\n"); + if (k != i) { + printf("%d%d ",i,k); + fprintf(ficlog,"%d%d ",i,k); + fprintf(ficres,"%1d%1d ",i,k); + for(j=1; j <=ncovmodel; j++){ + printf("%f ",p[jk]); + fprintf(ficlog,"%f ",p[jk]); + fprintf(ficres,"%f ",p[jk]); + jk++; } + printf("\n"); + fprintf(ficlog,"\n"); + fprintf(ficres,"\n"); + } } } - if(mle==1){ + if(mle!=0){ /* Computing hessian and covariance matrix */ ftolhess=ftol; /* Usually correct */ hesscov(matcov, p, npar, delti, ftolhess, func); @@ -3903,32 +4683,91 @@ int main(int argc, char *argv[]) } fprintf(ficres,"# Covariance matrix \n# 121 Var(a12)\n# 122 Cov(b12,a12) Var(b12)\n# ...\n# 232 Cov(b23,a12) Cov(b23,b12) ... Var (b23)\n"); - if(mle==1) + if(mle>=1) printf("# Covariance matrix \n# 121 Var(a12)\n# 122 Cov(b12,a12) Var(b12)\n# ...\n# 232 Cov(b23,a12) Cov(b23,b12) ... Var (b23)\n"); fprintf(ficlog,"# Covariance matrix \n# 121 Var(a12)\n# 122 Cov(b12,a12) Var(b12)\n# ...\n# 232 Cov(b23,a12) Cov(b23,b12) ... Var (b23)\n"); - for(i=1,k=1;i<=npar;i++){ - /* if (k>nlstate) k=1; - i1=(i-1)/(ncovmodel*nlstate)+1; - fprintf(ficres,"%s%d%d",alph[k],i1,tab[i]); - printf("%s%d%d",alph[k],i1,tab[i]); - */ - fprintf(ficres,"%3d",i); - if(mle==1) - printf("%3d",i); - fprintf(ficlog,"%3d",i); - for(j=1; j<=i;j++){ - fprintf(ficres," %.5e",matcov[i][j]); - if(mle==1) - printf(" %.5e",matcov[i][j]); - fprintf(ficlog," %.5e",matcov[i][j]); - } - fprintf(ficres,"\n"); - if(mle==1) - printf("\n"); - fprintf(ficlog,"\n"); - k++; - } - +/* # 121 Var(a12)\n\ */ +/* # 122 Cov(b12,a12) Var(b12)\n\ */ +/* # 131 Cov(a13,a12) Cov(a13,b12, Var(a13)\n\ */ +/* # 132 Cov(b13,a12) Cov(b13,b12, Cov(b13,a13) Var(b13)\n\ */ +/* # 212 Cov(a21,a12) Cov(a21,b12, Cov(a21,a13) Cov(a21,b13) Var(a21)\n\ */ +/* # 212 Cov(b21,a12) Cov(b21,b12, Cov(b21,a13) Cov(b21,b13) Cov(b21,a21) Var(b21)\n\ */ +/* # 232 Cov(a23,a12) Cov(a23,b12, Cov(a23,a13) Cov(a23,b13) Cov(a23,a21) Cov(a23,b21) Var(a23)\n\ */ +/* # 232 Cov(b23,a12) Cov(b23,b12) ... Var (b23)\n" */ + + +/* Just to have a covariance matrix which will be more understandable + even is we still don't want to manage dictionary of variables +*/ + for(itimes=1;itimes<=2;itimes++){ + jj=0; + for(i=1; i <=nlstate; i++){ + for(j=1; j <=nlstate+ndeath; j++){ + if(j==i) continue; + for(k=1; k<=ncovmodel;k++){ + jj++; + ca[0]= k+'a'-1;ca[1]='\0'; + if(itimes==1){ + if(mle>=1) + printf("#%1d%1d%d",i,j,k); + fprintf(ficlog,"#%1d%1d%d",i,j,k); + fprintf(ficres,"#%1d%1d%d",i,j,k); + }else{ + if(mle>=1) + printf("%1d%1d%d",i,j,k); + fprintf(ficlog,"%1d%1d%d",i,j,k); + fprintf(ficres,"%1d%1d%d",i,j,k); + } + ll=0; + for(li=1;li <=nlstate; li++){ + for(lj=1;lj <=nlstate+ndeath; lj++){ + if(lj==li) continue; + for(lk=1;lk<=ncovmodel;lk++){ + ll++; + if(ll<=jj){ + cb[0]= lk +'a'-1;cb[1]='\0'; + if(ll=1) + printf(" Cov(%s%1d%1d,%s%1d%1d)",ca,i,j,cb, li,lj); + fprintf(ficlog," Cov(%s%1d%1d,%s%1d%1d)",ca,i,j,cb, li,lj); + fprintf(ficres," Cov(%s%1d%1d,%s%1d%1d)",ca,i,j,cb, li,lj); + }else{ + if(mle>=1) + printf(" %.5e",matcov[jj][ll]); + fprintf(ficlog," %.5e",matcov[jj][ll]); + fprintf(ficres," %.5e",matcov[jj][ll]); + } + }else{ + if(itimes==1){ + if(mle>=1) + printf(" Var(%s%1d%1d)",ca,i,j); + fprintf(ficlog," Var(%s%1d%1d)",ca,i,j); + fprintf(ficres," Var(%s%1d%1d)",ca,i,j); + }else{ + if(mle>=1) + printf(" %.5e",matcov[jj][ll]); + fprintf(ficlog," %.5e",matcov[jj][ll]); + fprintf(ficres," %.5e",matcov[jj][ll]); + } + } + } + } /* end lk */ + } /* end lj */ + } /* end li */ + if(mle>=1) + printf("\n"); + fprintf(ficlog,"\n"); + fprintf(ficres,"\n"); + numlinepar++; + } /* end k*/ + } /*end j */ + } /* end i */ + } /* end itimes */ + + fflush(ficlog); + fflush(ficres); + while((c=getc(ficpar))=='#' && c!= EOF){ ungetc(c,ficpar); fgets(line, MAXLINE, ficpar); @@ -3972,8 +4811,8 @@ int main(int argc, char *argv[]) ungetc(c,ficpar); - dateprev1=anprev1+mprev1/12.+jprev1/365.; - dateprev2=anprev2+mprev2/12.+jprev2/365.; + dateprev1=anprev1+(mprev1-1)/12.+(jprev1-1)/365.; + dateprev2=anprev2+(mprev2-1)/12.+(jprev2-1)/365.; fscanf(ficpar,"pop_based=%d\n",&popbased); fprintf(ficparo,"pop_based=%d\n",popbased); @@ -3988,10 +4827,10 @@ int main(int argc, char *argv[]) ungetc(c,ficpar); fscanf(ficpar,"prevforecast=%d starting-proj-date=%lf/%lf/%lf final-proj-date=%lf/%lf/%lf mobil_average=%d\n",&prevfcast,&jproj1,&mproj1,&anproj1,&jproj2,&mproj2,&anproj2,&mobilavproj); - fprintf(ficparo,"prevforecast=%d starting-proj-date=%.lf/%.lf/%.lf final-proj-date=%.lf/%.lf/%.lf mobil_average=%d\n",&prevfcast,jproj1,mproj1,anproj1,jproj2,mproj2,anproj2,mobilavproj); - printf("prevforecast=%d starting-proj-date=%.lf/%.lf/%.lf final-proj-date=%.lf/%.lf/%.lf mobilaverage=%d\n",&prevfcast,jproj1,mproj1,anproj1,jproj2,mproj2,anproj2,mobilavproj); - fprintf(ficlog,"prevforecast=%d starting-proj-date=%.lf/%.lf/%.lf final-proj-date=%.lf/%.lf/%.lf mobilaverage=%d\n",&prevfcast,jproj1,mproj1,anproj1,jproj2,mproj2,anproj2,mobilavproj); - fprintf(ficres,"prevforecast=%d starting-proj-date=%.lf/%.lf/%.lf final-proj-date=%.lf/%.lf/%.lf mobilaverage=%d\n",&prevfcast,jproj1,mproj1,anproj1,jproj2,mproj2,anproj2,mobilavproj); + fprintf(ficparo,"prevforecast=%d starting-proj-date=%.lf/%.lf/%.lf final-proj-date=%.lf/%.lf/%.lf mobil_average=%d\n",prevfcast,jproj1,mproj1,anproj1,jproj2,mproj2,anproj2,mobilavproj); + printf("prevforecast=%d starting-proj-date=%.lf/%.lf/%.lf final-proj-date=%.lf/%.lf/%.lf mobil_average=%d\n",prevfcast,jproj1,mproj1,anproj1,jproj2,mproj2,anproj2,mobilavproj); + fprintf(ficlog,"prevforecast=%d starting-proj-date=%.lf/%.lf/%.lf final-proj-date=%.lf/%.lf/%.lf mobil_average=%d\n",prevfcast,jproj1,mproj1,anproj1,jproj2,mproj2,anproj2,mobilavproj); + fprintf(ficres,"prevforecast=%d starting-proj-date=%.lf/%.lf/%.lf final-proj-date=%.lf/%.lf/%.lf mobil_average=%d\n",prevfcast,jproj1,mproj1,anproj1,jproj2,mproj2,anproj2,mobilavproj); /* day and month of proj2 are not used but only year anproj2.*/ while((c=getc(ficpar))=='#' && c!= EOF){ @@ -4002,55 +4841,28 @@ int main(int argc, char *argv[]) } ungetc(c,ficpar); - fscanf(ficpar,"popforecast=%d popfile=%s popfiledate=%lf/%lf/%lf last-popfiledate=%lf/%lf/%lf\n",&popforecast,popfile,&jpyram,&mpyram,&anpyram,&jpyram1,&mpyram1,&anpyram1); + /* fscanf(ficpar,"popforecast=%d popfile=%s popfiledate=%lf/%lf/%lf last-popfiledate=%lf/%lf/%lf\n",&popforecast,popfile,&jpyram,&mpyram,&anpyram,&jpyram1,&mpyram1,&anpyram1); fprintf(ficparo,"popforecast=%d popfile=%s popfiledate=%.lf/%.lf/%.lf last-popfiledate=%.lf/%.lf/%.lf\n",popforecast,popfile,jpyram,mpyram,anpyram,jpyram1,mpyram1,anpyram1); - fprintf(ficres,"popforecast=%d popfile=%s popfiledate=%.lf/%.lf/%.lf last-popfiledate=%.lf/%.lf/%.lf\n",popforecast,popfile,jpyram,mpyram,anpyram,jpyram1,mpyram1,anpyram1); - - freqsummary(fileres, agemin, agemax, s, agev, nlstate, imx,Tvaraff,nbcode, ncodemax,mint,anint,dateprev1,dateprev2,jprev1, mprev1,anprev1,jprev2, mprev2,anprev2); - - /*------------ gnuplot -------------*/ - strcpy(optionfilegnuplot,optionfilefiname); - strcat(optionfilegnuplot,".gp"); - if((ficgp=fopen(optionfilegnuplot,"w"))==NULL) { - printf("Problem with file %s",optionfilegnuplot); - } - else{ - fprintf(ficgp,"\n# %s\n", version); - fprintf(ficgp,"# %s\n", optionfilegnuplot); - fprintf(ficgp,"set missing 'NaNq'\n"); - } - fclose(ficgp); - printinggnuplot(fileres, ageminpar,agemaxpar,fage, pathc,p); - /*--------- index.htm --------*/ + fprintf(ficres,"popforecast=%d popfile=%s popfiledate=%.lf/%.lf/%.lf last-popfiledate=%.lf/%.lf/%.lf\n",popforecast,popfile,jpyram,mpyram,anpyram,jpyram1,mpyram1,anpyram1);*/ - strcpy(optionfilehtm,optionfile); - strcat(optionfilehtm,".htm"); - if((fichtm=fopen(optionfilehtm,"w"))==NULL) { - printf("Problem with %s \n",optionfilehtm), exit(0); - } + /* freqsummary(fileres, agemin, agemax, s, agev, nlstate, imx,Tvaraff,nbcode, ncodemax,mint,anint);*/ + /*,dateprev1,dateprev2,jprev1, mprev1,anprev1,jprev2, mprev2,anprev2);*/ - fprintf(fichtm," %s
              \n -Title=%s
              Datafile=%s Firstpass=%d Lastpass=%d Stepm=%d Weight=%d Model=%s
              \n -\n -Total number of observations=%d
              \n -Interval (in months) between two waves: Min=%d Max=%d Mean=%.2lf
              \n -
              -
              • Parameter files

                \n - - Copy of the parameter file: o%s
                \n - - Log file of the run: %s
                \n - - Gnuplot file name: %s
              \n",version,title,datafile,firstpass,lastpass,stepm, weightopt,model,imx,jmin,jmax,jmean,fileres,fileres,filelog,filelog,optionfilegnuplot,optionfilegnuplot); - fclose(fichtm); + replace_back_to_slash(pathc,path); /* Even gnuplot wants a / */ + printinggnuplot(fileres, optionfilefiname,ageminpar,agemaxpar,fage, pathc,p); - printinghtml(fileres,title,datafile, firstpass, lastpass, stepm, weightopt,model,imx,jmin,jmax,jmean,rfileres,popforecast,estepm,jprev1,mprev1,anprev1,jprev2,mprev2,anprev2); + printinghtml(fileres,title,datafile, firstpass, lastpass, stepm, weightopt,\ + model,imx,jmin,jmax,jmean,rfileres,popforecast,estepm,\ + jprev1,mprev1,anprev1,jprev2,mprev2,anprev2); /*------------ free_vector -------------*/ - chdir(path); + /* chdir(path); */ free_ivector(wav,1,imx); free_imatrix(dh,1,lastpass-firstpass+1,1,imx); free_imatrix(bh,1,lastpass-firstpass+1,1,imx); free_imatrix(mw,1,lastpass-firstpass+1,1,imx); - free_ivector(num,1,n); + free_lvector(num,1,n); free_vector(agedc,1,n); /*free_matrix(covar,0,NCOVMAX,1,n);*/ /*free_matrix(covar,1,NCOVMAX,1,n);*/ @@ -4129,6 +4941,7 @@ Interval (in months) between two waves: /* hstepm=1; aff par mois*/ + fprintf(ficrespij,"#****** h Pij x Probability to be in state j at age x+h being in i at x "); for(cptcov=1,k=0;cptcov<=i1;cptcov++){ for(cptcod=1;cptcod<=ncodemax[cptcov];cptcod++){ k=k+1; @@ -4146,13 +4959,13 @@ Interval (in months) between two waves: p3mat=ma3x(1,nlstate+ndeath,1, nlstate+ndeath, 0,nhstepm); oldm=oldms;savm=savms; hpxij(p3mat,nhstepm,agedeb,hstepm,p,nlstate,stepm,oldm,savm, k); - fprintf(ficrespij,"# Age"); + fprintf(ficrespij,"# Cov Agex agex+h hpijx with i,j="); for(i=1; i<=nlstate;i++) for(j=1; j<=nlstate+ndeath;j++) fprintf(ficrespij," %1d-%1d",i,j); fprintf(ficrespij,"\n"); for (h=0; h<=nhstepm; h++){ - fprintf(ficrespij,"%d %f %f",k,agedeb, agedeb+ h*hstepm/YEARM*stepm ); + fprintf(ficrespij,"%d %3.f %3.f",k,agedeb, agedeb+ h*hstepm/YEARM*stepm ); for(i=1; i<=nlstate;i++) for(j=1; j<=nlstate+ndeath;j++) fprintf(ficrespij," %.5f", p3mat[i][j][h]); @@ -4164,23 +4977,28 @@ Interval (in months) between two waves: } } - varprob(optionfilefiname, matcov, p, delti, nlstate, (int) bage, (int) fage,k,Tvar,nbcode, ncodemax); + varprob(optionfilefiname, matcov, p, delti, nlstate, bage, fage,k,Tvar,nbcode, ncodemax); fclose(ficrespij); + probs= ma3x(1,AGESUP,1,NCOVMAX, 1,NCOVMAX); + for(i=1;i<=AGESUP;i++) + for(j=1;j<=NCOVMAX;j++) + for(k=1;k<=NCOVMAX;k++) + probs[i][j][k]=0.; /*---------- Forecasting ------------------*/ /*if((stepm == 1) && (strcmp(model,".")==0)){*/ if(prevfcast==1){ - if(stepm ==1){ - prevforecast(fileres, anproj1,mproj1,jproj1, agemin,agemax, dateprev1, dateprev2,mobilavproj, agedeb, fage, popforecast, popfile, anproj2,p, i1); - if (popforecast==1) populforecast(fileres, anpyram,mpyram,jpyram, agemin,agemax, dateprev1, dateprev2,mobilav, agedeb, fage, popforecast, popfile, anpyram1,p, i1); - } - else{ - erreur=108; - printf("Warning %d!! You can only forecast the prevalences if the optimization\n has been performed with stepm = 1 (month) instead of %d or model=. instead of '%s'\n", erreur, stepm, model); - fprintf(ficlog,"Warning %d!! You can only forecast the prevalences if the optimization\n has been performed with stepm = 1 (month) instead of %d or model=. instead of '%s'\n", erreur, stepm, model); - } + /* if(stepm ==1){*/ + prevforecast(fileres, anproj1, mproj1, jproj1, agemin, agemax, dateprev1, dateprev2, mobilavproj, bage, fage, firstpass, lastpass, anproj2, p, cptcoveff); + /* (popforecast==1) populforecast(fileres, anpyram,mpyram,jpyram, agemin,agemax, dateprev1, dateprev2,mobilav, agedeb, fage, popforecast, popfile, anpyram1,p, i1);*/ +/* } */ +/* else{ */ +/* erreur=108; */ +/* printf("Warning %d!! You can only forecast the prevalences if the optimization\n has been performed with stepm = 1 (month) instead of %d or model=. instead of '%s'\n", erreur, stepm, model); */ +/* fprintf(ficlog,"Warning %d!! You can only forecast the prevalences if the optimization\n has been performed with stepm = 1 (month) instead of %d or model=. instead of '%s'\n", erreur, stepm, model); */ +/* } */ } @@ -4214,9 +5032,11 @@ Interval (in months) between two waves: printf("Computing Variance-covariance of DFLEs: file '%s' \n", fileresv); fprintf(ficlog,"Computing Variance-covariance of DFLEs: file '%s' \n", fileresv); - calagedatem=-1; - - prevalence(ageminpar, agemax, s, agev, nlstate, imx,Tvar,nbcode, ncodemax,mint,anint,dateprev1,dateprev2, calagedatem); + /* Computes prevalence between agemin (i.e minimal age computed) and no more ageminpar */ + prevalence(probs, agemin, agemax, s, agev, nlstate, imx, Tvar, nbcode, ncodemax, mint, anint, dateprev1, dateprev2, firstpass, lastpass); + /* printf("ageminpar=%f, agemax=%f, s[lastpass][imx]=%d, agev[lastpass][imx]=%f, nlstate=%d, imx=%d, mint[lastpass][imx]=%f, anint[lastpass][imx]=%f,dateprev1=%f, dateprev2=%f, firstpass=%d, lastpass=%d\n",\ +ageminpar, agemax, s[lastpass][imx], agev[lastpass][imx], nlstate, imx, mint[lastpass][imx],anint[lastpass][imx], dateprev1, dateprev2, firstpass, lastpass); + */ if (mobilav!=0) { mobaverage= ma3x(1, AGESUP,1,NCOVMAX, 1,NCOVMAX); @@ -4343,10 +5163,13 @@ Interval (in months) between two waves: free_matrix(covar,0,NCOVMAX,1,n); free_matrix(matcov,1,npar,1,npar); - free_vector(delti,1,npar); + /*free_vector(delti,1,npar);*/ + free_ma3x(delti3,1,nlstate,1, nlstate+ndeath-1,1,ncovmodel); free_matrix(agev,1,maxwav,1,imx); free_ma3x(param,1,nlstate,1, nlstate+ndeath-1,1,ncovmodel); if (mobilav!=0) free_ma3x(mobaverage,1, AGESUP,1,NCOVMAX, 1,NCOVMAX); + free_ma3x(probs,1,AGESUP,1,NCOVMAX, 1,NCOVMAX); + free_ivector(ncodemax,1,8); free_ivector(Tvar,1,15); free_ivector(Tprod,1,15); @@ -4354,51 +5177,63 @@ Interval (in months) between two waves: free_ivector(Tage,1,15); free_ivector(Tcode,1,100); - fprintf(fichtm,"\n"); - fclose(fichtm); - fclose(ficgp); + fflush(fichtm); + fflush(ficgp); - if(erreur >0){ - printf("End of Imach with error or warning %d\n",erreur); - fprintf(ficlog,"End of Imach with error or warning %d\n",erreur); + if((nberr >0) || (nbwarn>0)){ + printf("End of Imach with %d errors and/or %d warnings\n",nberr,nbwarn); + fprintf(ficlog,"End of Imach with %d errors and/or warnings %d\n",nberr,nbwarn); }else{ - printf("End of Imach\n"); - fprintf(ficlog,"End of Imach\n"); + printf("End of Imach\n"); + fprintf(ficlog,"End of Imach\n"); } printf("See log file on %s\n",filelog); - fclose(ficlog); /* gettimeofday(&end_time, (struct timezone*)0);*/ /* after time */ - - /* printf("Total time was %d Sec. %d uSec.\n", end_time.tv_sec -start_time.tv_sec, end_time.tv_usec -start_time.tv_usec);*/ - /*printf("Total time was %d uSec.\n", total_usecs);*/ + (void) gettimeofday(&end_time,&tzp); + tm = *localtime(&end_time.tv_sec); + tmg = *gmtime(&end_time.tv_sec); + strcpy(strtend,asctime(&tm)); + printf("Local time at start %s\nLocaltime at end %s",strstart, strtend); + fprintf(ficlog,"Local time at start %s\nLocal time at end %s\n",strstart, strtend); + printf("Total time used %s\n", asc_diff_time(end_time.tv_sec -start_time.tv_sec,tmpout)); + + printf("Total time was %d Sec.\n", end_time.tv_sec -start_time.tv_sec); + fprintf(ficlog,"Total time used %s\n", asc_diff_time(end_time.tv_sec -start_time.tv_sec,tmpout)); + fprintf(ficlog,"Total time was %d Sec.\n", end_time.tv_sec -start_time.tv_sec); + /* printf("Total time was %d uSec.\n", total_usecs);*/ +/* if(fileappend(fichtm,optionfilehtm)){ */ + fprintf(fichtm,"
              Local time at start %s
              Local time at end %s
              ",strstart, strtend); + fclose(fichtm); + fclose(fichtmcov); + fclose(ficgp); + fclose(ficlog); /*------ End -----------*/ - end: -#ifdef windows - /* chdir(pathcd);*/ -#endif - /*system("wgnuplot graph.plt");*/ - /*system("../gp37mgw/wgnuplot graph.plt");*/ - /*system("cd ../gp37mgw");*/ - /* system("..\\gp37mgw\\wgnuplot graph.plt");*/ + chdir(path); strcpy(plotcmd,GNUPLOTPROGRAM); strcat(plotcmd," "); strcat(plotcmd,optionfilegnuplot); - printf("Starting: %s\n",plotcmd);fflush(stdout); - system(plotcmd); - - /*#ifdef windows*/ + printf("Starting graphs with: %s",plotcmd);fflush(stdout); + if((outcmd=system(plotcmd)) != 0){ + printf(" Problem with gnuplot\n"); + } + printf(" Wait..."); while (z[0] != 'q') { /* chdir(path); */ - printf("\nType e to edit output files, g to graph again, c to start again, and q for exiting: "); + printf("\nType e to edit output files, g to graph again and q for exiting: "); scanf("%s",z); - if (z[0] == 'c') system("./imach"); - else if (z[0] == 'e') system(optionfilehtm); +/* if (z[0] == 'c') system("./imach"); */ + if (z[0] == 'e') system(optionfilehtm); else if (z[0] == 'g') system(plotcmd); else if (z[0] == 'q') exit(0); } - /*#endif */ + end: + while (z[0] != 'q') { + printf("\nType q for exiting: "); + scanf("%s",z); + } } +