From fcfe6b34c005e911e90fc540e0dcbe4ad334af6e Mon Sep 17 00:00:00 2001 From: "N. Brouard" Date: Wed, 18 Jun 2003 12:26:01 +0000 Subject: [PATCH] Version 0.96 --- src/imach.c | 143 +++++++++++++++++++++++++++++----------------------- 1 file changed, 81 insertions(+), 62 deletions(-) diff --git a/src/imach.c b/src/imach.c index 139ab73..e6b9b58 100644 --- a/src/imach.c +++ b/src/imach.c @@ -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 @@ -157,7 +161,7 @@ /* $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
File of contributions to the likelihood: %s
\n",fileresilk); - fclose(fichtm); - } - } + fprintf(fichtm,"\n
File of contributions to the likelihood: %s
\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
  • 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"); @@ -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
  • Computing and drawing one step probabilities with their confidence intervals

  • \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 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; @@ -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,""); -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," %s
    %s
    \ + fprintf(fichtm,"\nIMaCh %s\n %s
    %s
    \
    \n\ Title=%s
    Datafile=%s Firstpass=%d Lastpass=%d Stepm=%d Weight=%d Model=%s
    \n\ \n\ @@ -4278,24 +4289,33 @@ Title=%s
    Datafile=%s Firstpass=%d Lastpass=%d Stepm=%d Weight=%d Model=%s
  • Parameter files

    \n\ - Copy of the parameter file: o%s
    \n\ - Log file of the run: %s
    \n\ - - Gnuplot file name: %s\n\ + - Gnuplot file name: %s
    \n\ - Date and time at start: %s\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,"
    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); - } +/* 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,"
    Localtime at start %s and at end=%s
    ",strt, strtend); - fclose(fichtm); - } +/* if(fileappend(fichtm,optionfilehtm)){ */ + fprintf(fichtm,"
    Localtime at start %s and at end=%s
    ",strt, strtend); + fclose(fichtm); /*------ End -----------*/ end: -- 2.43.0