]> henry.ined.fr Git - .git/commitdiff
Version 0.96
authorN. Brouard <brouard@ined.fr>
Wed, 18 Jun 2003 12:26:01 +0000 (12:26 +0000)
committerN. Brouard <brouard@ined.fr>
Wed, 18 Jun 2003 12:26:01 +0000 (12:26 +0000)
src/imach.c

index 139ab73d776aee27661ddec2b1cf345660646fc3..e6b9b58f09d5a9fb83d9b1952c6555a5b66b291f 100644 (file)
@@ -1,6 +1,10 @@
 /* $Id$
   $State$
   $Log$
+  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
 /* $Id$ */
 /* $State$ */
 
-char version[]="Imach version 0.95a2, June 2003, INED-EUROREVES ";
+char version[]="Imach version 0.96, June 2003, INED-EUROREVES ";
 char fullversion[]="$Revision$ $Date$"; 
 int erreur; /* Error number */
 int nvar;
@@ -171,6 +175,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 */
@@ -1286,10 +1292,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 */
@@ -1350,54 +1358,55 @@ double funcone( double *x)
  %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,l=0.; k<=nlstate; k++) 
-         fprintf(ficresilk," %10.6f",ll[k]);
-       fprintf(ficresilk,"\n");
+       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\n");
+    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);
-    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<br>File of contributions to the likelihood: <a href=\"%s\">%s</a><br>\n",fileresilk);
-      fclose(fichtm);
-    }
-  }
+    fprintf(fichtm,"\n<br>File of contributions to the likelihood: <a href=\"%s\">%s</a><br>\n",fileresilk,fileresilk);
+    fflush(fichtm); 
+  } 
   return;
 }
 
@@ -2364,15 +2373,15 @@ void varevsij(char optionfilefiname[], double ***vareij, double **matcov, double
   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<li><h4> Computing probabilities of dying over estepm months as a weighted average (i.e global mortality independent of initial healh state)</h4></li>\n");
-    fprintf(fichtm,"\n<br>%s  <br>\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<li><h4> Computing probabilities of dying over estepm months as a weighted average (i.e global mortality independent of initial healh state)</h4></li>\n");
+  fprintf(fichtm,"\n<br>%s  <br>\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");
@@ -2602,7 +2611,7 @@ void varevsij(char optionfilefiname[], double ***vareij, double **matcov, double
   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 ******************/
@@ -2767,12 +2776,12 @@ void varprob(char optionfilefiname[], double **matcov, double x[], double delti[
   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<li><h4> Computing and drawing one step probabilities with their confidence intervals</h4></li>\n");
     fprintf(fichtm,"\n");
 
@@ -2780,7 +2789,7 @@ void varprob(char optionfilefiname[], double **matcov, double x[], double delti[
     fprintf(fichtm,"\nWe have drawn ellipsoids of confidence around the p<inf>ij</inf>, p<inf>kl</inf> to understand the covariance between two incidences. They are expressed in year<sup>-1</sup> in order to be less dependent of stepm.<br>\n");
     fprintf(fichtm,"\n<br> We have drawn x'cov<sup>-1</sup>x = 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. <br> When both incidences are correlated we diagonalised the inverse of the covariance matrix and made the appropriate rotation.<br> \n");
 
-  }
+/*   } */
 
   cov[1]=1;
   tj=cptcoveff;
@@ -2997,7 +3006,6 @@ void varprob(char optionfilefiname[], double **matcov, double x[], double delti[
   fclose(ficresprobcov);
   fclose(ficresprobcor);
   fclose(ficgp);
-  fclose(fichtm);
 }
 
 
@@ -3010,10 +3018,10 @@ void printinghtml(char fileres[], char title[], char datafile[], int firstpass,
                  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,"<ul><li><h4>Result files (first order: no variance)</h4>\n \
  - Observed prevalence in each state (during the period defined between %.lf/%.lf/%.lf and %.lf/%.lf/%.lf): <a href=\"p%s\">p%s</a> <br>\n \
@@ -3100,7 +3108,7 @@ interval) in state (%d): v%s%d%d.png <br>\
    } /* end i1 */
  }/* End k1 */
  fprintf(fichtm,"</ul>");
-fclose(fichtm);
+ fflush(fichtm);
 }
 
 /******************* Gnuplot file **************/
@@ -3607,14 +3615,15 @@ populforecast(char fileres[], double anpyram,double mpyram,double jpyram,double
   fclose(ficrespop);
 } /* End of popforecast */
 
-int fileappend(FILE *fichier, char *optionfile)
+int fileappend(FILE *fichier, char *optionfich)
 {
-  if((fichier=fopen(optionfile,"a"))==NULL) {
-    printf("Problem with file: %s\n", optionfile);
-    fprintf(ficlog,"Problem with file: %s\n", optionfile);
-    return (1);
+  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 *****************/
@@ -3626,6 +3635,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;
 
@@ -4264,13 +4275,13 @@ int main(int argc, char *argv[])
   fclose(ficgp);
   /*--------- index.htm --------*/
 
-  strcpy(optionfilehtm,optionfile);
+  strcpy(optionfilehtm,optionfilefiname);
   strcat(optionfilehtm,".htm");
   if((fichtm=fopen(optionfilehtm,"w"))==NULL)    {
     printf("Problem with %s \n",optionfilehtm), exit(0);
   }
 
-  fprintf(fichtm,"<body> <font size=\"2\">%s <br> %s</font> \
+  fprintf(fichtm,"<body>\n<title>IMaCh %s</title>\n <font size=\"2\">%s <br> %s</font> \
 <hr size=\"2\" color=\"#EC5E5E\"> \n\
 Title=%s <br>Datafile=%s Firstpass=%d Lastpass=%d Stepm=%d Weight=%d Model=%s<br>\n\
 \n\
@@ -4278,24 +4289,33 @@ Title=%s <br>Datafile=%s Firstpass=%d Lastpass=%d Stepm=%d Weight=%d Model=%s<br
  <ul><li><h4>Parameter files</h4>\n\
  - Copy of the parameter file: <a href=\"o%s\">o%s</a><br>\n\
  - Log file of the run: <a href=\"%s\">%s</a><br>\n\
- - Gnuplot file name: <a href=\"%s\">%s</a>\n\
+ - Gnuplot file name: <a href=\"%s\">%s</a><br>\n\
  - Date and time at start: %s</ul>\n",\
-         version,fullversion,title,datafile,firstpass,lastpass,stepm, weightopt,\
+         fileres,version,fullversion,title,datafile,firstpass,lastpass,stepm, weightopt,\
          model,fileres,fileres,\
          filelog,filelog,optionfilegnuplot,optionfilegnuplot,strt);
-  fclose(fichtm);
+  /*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(fileappend(fichtm, optionfilehtm)){
+/*   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,"<br>Total number of observations=%d <br>\n\
 Youngest age at first (selected) pass %.2f, oldest age %.2f<br>\n\
 Interval (in months) between two waves: Min=%d Max=%d Mean=%.2lf<br>\n",\
        imx,agemin,agemax,jmin,jmax,jmean);
-    fclose(fichtm);
-  }
+/*     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 */
@@ -4833,10 +4853,9 @@ ageminpar, agemax, s[lastpass][imx], agev[lastpass][imx], nlstate, imx, mint[las
   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,"<br>Localtime at start %s and at end=%s<br>",strt, strtend);
-    fclose(fichtm);
-  }
+/*   if(fileappend(fichtm,optionfilehtm)){ */
+  fprintf(fichtm,"<br>Localtime at start %s and at end=%s<br>",strt, strtend);
+  fclose(fichtm);
   /*------ End -----------*/
 
   end: