--- imach/src/imach.c 2003/06/17 13:12:43 1.85 +++ imach/src/imach.c 2003/06/18 12:26:01 1.87 @@ -1,6 +1,13 @@ -/* $Id: imach.c,v 1.85 2003/06/17 13:12:43 brouard Exp $ +/* $Id: imach.c,v 1.87 2003/06/18 12:26:01 brouard Exp $ $State: Exp $ $Log: imach.c,v $ + 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 @@ -19,7 +26,7 @@ place. It differs from routine "prevalence" which may be called many times. Probs is memory consuming and must be used with parcimony. - Version 0.95a2 (should output exactly the same maximization than 0.8a2) + 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 *** @@ -122,6 +129,10 @@ #include #include +#include +#include +#include "timeval.h" + #define MAXLINE 256 #define GNUPLOTPROGRAM "gnuplot" /*#define GNUPLOTPROGRAM "..\\gp37mgw\\wgnuplot"*/ @@ -150,11 +161,11 @@ #define ODIRSEPARATOR '/' #endif -/* $Id: imach.c,v 1.85 2003/06/17 13:12:43 brouard Exp $ */ +/* $Id: imach.c,v 1.87 2003/06/18 12:26:01 brouard Exp $ */ /* $State: Exp $ */ -char version[]="Imach version 0.95a2, June 2003, INED-EUROREVES "; -char fullversion[]="$Revision: 1.85 $ $Date: 2003/06/17 13:12:43 $"; +char version[]="Imach version 0.96, June 2003, INED-EUROREVES "; +char fullversion[]="$Revision: 1.87 $ $Date: 2003/06/18 12:26:01 $"; int erreur; /* Error number */ int nvar; int cptcovn=0, cptcovage=0, cptcoveff=0,cptcov; @@ -167,6 +178,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 */ @@ -1282,10 +1295,12 @@ double func( double *x) /*************** log-likelihood *************/ double funcone( double *x) { + /* Same as likeli but slower because of a lot of printf and if */ int i, ii, j, k, mi, d, kk; double l, ll[NLSTATEMAX], cov[NCOVMAX]; double **out; double lli; /* Individual log likelihood */ + double llt; int s1, s2; double bbh, survp; /*extern weight */ @@ -1342,46 +1357,59 @@ double funcone( double *x) 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,"%6d %1d %1d %1d %1d %3d %10.6f %6.4f %10.6f %10.6f %10.6f ", \ - 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,l=0.; k<=nlstate; k++) - fprintf(ficresilk," %10.6f",ll[k]); - fprintf(ficresilk,"\n"); + fprintf(ficresilk,"%ld %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; } -void likelione(FILE *ficres,double p[], int npar, int nlstate, int *globpr, long *ipmx, double *sw, double *fretone, double (*funcone)(double [])) +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 + /* 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(globpr !=0){ /* Just counts and sums no printings */ + + 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_product_matrix pij weight 2ln(pij)*weight 0pij_x 0pij_(x-stepm) cumulating_loglikeli_by_health_state"); - fprintf(ficresilk, "# i s1 s2 mi mw dh likeli weight out sav "); + 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 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," ll[%d]",k); - fprintf(ficresilk,"\n"); + fprintf(ficresilk," -2*gipw/gsw*weight*ll[%d]++",k); + fprintf(ficresilk," -2*gipw/gsw*weight*ll(total)\n"); } *fretone=(*funcone)(p); - if(globpr !=0) + if(*globpri !=0){ fclose(ficresilk); + fprintf(fichtm,"\n
File of contributions to the likelihood: %s
\n",fileresilk,fileresilk); + fflush(fichtm); + } return; } @@ -1984,7 +2012,7 @@ void concatwav(int wav[], int **dh, int else if(j<0){ 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; /* Careful 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 fixe the contradiction between dates.\n",stepm); + 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); 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]); 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); } @@ -2348,15 +2376,15 @@ void varevsij(char optionfilefiname[], d 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); - } +/* 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); +/* } */ 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"); @@ -2586,7 +2614,7 @@ void varevsij(char optionfilefiname[], d if (mobilav!=0) free_ma3x(mobaverage,1, AGESUP,1,NCOVMAX, 1,NCOVMAX); fclose(ficresprobmorprev); fclose(ficgp); - fclose(fichtm); +/* fclose(fichtm); */ } /* end varevsij */ /************ Variance of prevlim ******************/ @@ -2751,12 +2779,12 @@ void varprob(char optionfilefiname[], do 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{ +/* 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"); @@ -2764,7 +2792,7 @@ void varprob(char optionfilefiname[], do 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"); - } +/* } */ cov[1]=1; tj=cptcoveff; @@ -2981,7 +3009,6 @@ void varprob(char optionfilefiname[], do fclose(ficresprobcov); fclose(ficresprobcor); fclose(ficgp); - fclose(fichtm); } @@ -2994,10 +3021,10 @@ void printinghtml(char fileres[], char t 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); - } +/* 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 \ @@ -3084,7 +3111,7 @@ interval) in state (%d): v%s%d%d.png
      "); -fclose(fichtm); + fflush(fichtm); } /******************* Gnuplot file **************/ @@ -3591,6 +3618,16 @@ populforecast(char fileres[], double anp 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); +} /***********************************************/ /**************** Main Program *****************/ /***********************************************/ @@ -3601,6 +3638,8 @@ int main(int argc, char *argv[]) int i,j, k, n=MAXN,iter,m,size=100,cptcode, cptcod; int jj; int numlinepar=0; /* Current linenumber of parameter file */ + /* FILE *fichtm; *//* Html File */ + /* FILE *ficgp;*/ /*Gnuplot File */ double agedeb, agefin,hf; double ageminpar=1.e20,agemin=1.e20, agemaxpar=-1.e20, agemax=-1.e20; @@ -3644,8 +3683,7 @@ int main(int argc, char *argv[]) char z[1]="c", occ; -#include -#include + char stra[80], strb[80], strc[80], strd[80],stre[80],modelsav[80]; char *strt, *strtend; char *stratrunc; @@ -3664,6 +3702,7 @@ int main(int argc, char *argv[]) tm = *localtime(&start_time.tv_sec); tmg = *gmtime(&start_time.tv_sec); strt=asctime(&tm); + /* printf("Localtime (at start)=%s",strt); */ /* tp.tv_sec = tp.tv_sec +86400; */ /* tm = *localtime(&start_time.tv_sec); */ @@ -3713,8 +3752,9 @@ int main(int argc, char *argv[]) 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); - printf("Localtime (at start)=%s",strt); - fprintf(ficlog,"Localtime (at start)=%s",strt); + + printf("Localtime (at start)=%s",strt); + fprintf(ficlog,"Localtime (at start)=%s",strt); fflush(ficlog); /* */ @@ -4224,10 +4264,61 @@ int main(int argc, char *argv[]) } scanf("%d",i);*/ + /*------------ 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); + /*--------- index.htm --------*/ + + strcpy(optionfilehtm,optionfilefiname); + strcat(optionfilehtm,".htm"); + if((fichtm=fopen(optionfilehtm,"w"))==NULL) { + printf("Problem with %s \n",optionfilehtm), exit(0); + } + + 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,strt); + /*fclose(fichtm);*/ + fflush(fichtm); + /* 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); +/* if((fichtm=fopen(optionfilehtm,"a"))==NULL) { */ +/* printf("Problem with file: %s\n", optionfilehtm); */ +/* fprintf(ficlog,"Problem with file: %s\n", optionfilehtm); */ +/* } */ + + +/* if(fileappend(fichtm, optionfilehtm)){ */ + 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); +/* fclose(fichtm); */ +/* } */ + 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 */ @@ -4239,7 +4330,7 @@ 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 ipmx number of contributions and sum of weights*/ + 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++) @@ -4413,45 +4504,10 @@ int main(int argc, char *argv[]) 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); + /* 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 --------*/ - - strcpy(optionfilehtm,optionfile); - strcat(optionfilehtm,".htm"); - if((fichtm=fopen(optionfilehtm,"w"))==NULL) { - printf("Problem with %s \n",optionfilehtm), exit(0); - } - - 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\ -Youngest age at first (selected) pass %.2f, oldest age %.2f
      \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,agemin,agemax,jmin,jmax,jmean,fileres,fileres,\ - filelog,filelog,optionfilegnuplot,optionfilegnuplot); - fclose(fichtm); printinghtml(fileres,title,datafile, firstpass, lastpass, stepm, weightopt,\ model,imx,jmin,jmax,jmean,rfileres,popforecast,estepm,\ @@ -4800,6 +4856,9 @@ ageminpar, agemax, s[lastpass][imx], age 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); fprintf(ficlog,"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);*/ +/* if(fileappend(fichtm,optionfilehtm)){ */ + fprintf(fichtm,"
      Localtime at start %s and at end=%s
      ",strt, strtend); + fclose(fichtm); /*------ End -----------*/ end: