--- imach/src/imach.c 2002/02/20 17:22:01 1.20 +++ imach/src/imach.c 2002/02/26 17:11:54 1.25 @@ -1,34 +1,42 @@ - -/*********************** Imach ************************************** - This program computes Healthy Life Expectancies from cross-longitudinal - data. Cross-longitudinal consist in a first survey ("cross") where - individuals from different ages are interviewed on their health status - or degree of disability. At least a second wave of interviews - ("longitudinal") should measure each new individual health status. - Health expectancies are computed from the transistions observed between - waves and are computed for each degree of severity of disability (number - of life states). More degrees you consider, more time is necessary to - reach the Maximum Likelihood of the parameters involved in the model. - The simplest model is the multinomial logistic model where pij is - the probabibility to be observed in state j at the second wave conditional - to be observed in state i at the first wave. Therefore the model is: - log(pij/pii)= aij + bij*age+ cij*sex + etc , where 'age' is age and 'sex' - is a covariate. If you want to have a more complex model than "constant and - age", you should modify the program where the markup - *Covariates have to be included here again* invites you to do it. - More covariates you add, less is the speed of the convergence. - - The advantage that this computer programme claims, comes from that if the - delay between waves is not identical for each individual, or if some - individual missed an interview, the information is not rounded or lost, but - taken into account using an interpolation or extrapolation. - hPijx is the probability to be - observed in state i at age x+h conditional to the observed state i at age - x. The delay 'h' can be split into an exact number (nh*stepm) of - unobserved intermediate states. This elementary transition (by month or - quarter trimester, semester or year) is model as a multinomial logistic. - The hPx matrix is simply the matrix product of nh*stepm elementary matrices - and the contribution of each individual to the likelihood is simply hPijx. +/* $Id: imach.c,v 1.25 2002/02/26 17:11:54 lievre Exp $ + Interpolated Markov Chain + + Short summary of the programme: + + This program computes Healthy Life Expectancies from + cross-longitudinal data. Cross-longitudinal data consist in: -1- a + first survey ("cross") where individuals from different ages are + interviewed on their health status or degree of disability (in the + case of a health survey which is our main interest) -2- at least a + second wave of interviews ("longitudinal") which measure each change + (if any) in individual health status. Health expectancies are + computed from the time spent in each health state according to a + model. More health states you consider, more time is necessary to reach the + Maximum Likelihood of the parameters involved in the model. The + simplest model is the multinomial logistic model where pij is the + probabibility to be observed in state j at the second wave + conditional to be observed in state i at the first wave. Therefore + the model is: log(pij/pii)= aij + bij*age+ cij*sex + etc , where + 'age' is age and 'sex' is a covariate. If you want to have a more + complex model than "constant and age", you should modify the program + where the markup *Covariates have to be included here again* invites + you to do it. More covariates you add, slower the + convergence. + + The advantage of this computer programme, compared to a simple + multinomial logistic model, is clear when the delay between waves is not + identical for each individual. Also, if a individual missed an + intermediate interview, the information is lost, but taken into + account using an interpolation or extrapolation. + + hPijx is the probability to be observed in state i at age x+h + conditional to the observed state i at age x. The delay 'h' can be + split into an exact number (nh*stepm) of unobserved intermediate + states. This elementary transition (by month or quarter trimester, + semester or year) is model as a multinomial logistic. The hPx + matrix is simply the matrix product of nh*stepm elementary matrices + and the contribution of each individual to the likelihood is simply + hPijx. Also this programme outputs the covariance matrix of the parameters but also of the life expectancies. It also computes the prevalence limits. @@ -48,6 +56,7 @@ #include #define MAXLINE 256 +#define GNUPLOTPROGRAM "..\\gp37mgw\\wgnuplot" #define FILENAMELENGTH 80 /*#define DEBUG*/ #define windows @@ -67,6 +76,7 @@ #define AGEBASE 40 +int erreur; /* Error number */ int nvar; int cptcovn, cptcovage=0, cptcoveff=0,cptcov; int npar=NPARMAX; @@ -85,7 +95,7 @@ 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; -FILE *ficgp, *fichtm,*ficresprob,*ficpop; +FILE *ficgp,*ficresprob,*ficpop; FILE *ficreseij; char filerese[FILENAMELENGTH]; FILE *ficresvij; @@ -113,7 +123,7 @@ FILE *ficreseij; static double maxarg1,maxarg2; #define FMAX(a,b) (maxarg1=(a),maxarg2=(b),(maxarg1)>(maxarg2)? (maxarg1):(maxarg2)) #define FMIN(a,b) (maxarg1=(a),maxarg2=(b),(maxarg1)<(maxarg2)? (maxarg1):(maxarg2)) - + #define SIGN(a,b) ((b)>0.0 ? fabs(a) : -fabs(a)) #define rint(a) floor(a+0.5) @@ -140,14 +150,18 @@ double ftol=FTOL; /* Tolerance for compu double ftolhess; /* Tolerance for computing hessian */ /**************** split *************************/ -static int split( char *path, char *dirc, char *name ) +static int split( char *path, char *dirc, char *name, char *ext, char *finame ) { char *s; /* pointer */ int l1, l2; /* length counters */ l1 = strlen( path ); /* length of path */ if ( l1 == 0 ) return( GLOCK_ERROR_NOPATH ); +#ifdef windows s = strrchr( path, '\\' ); /* find last / */ +#else + s = strrchr( path, '/' ); /* find last / */ +#endif if ( s == NULL ) { /* no directory, so use current */ #if defined(__bsd__) /* get current working directory */ extern char *getwd( ); @@ -170,7 +184,18 @@ static int split( char *path, char *dirc dirc[l1-l2] = 0; /* add zero */ } l1 = strlen( dirc ); /* length of directory */ +#ifdef windows if ( dirc[l1-1] != '\\' ) { dirc[l1] = '\\'; dirc[l1+1] = 0; } +#else + if ( dirc[l1-1] != '/' ) { dirc[l1] = '/'; dirc[l1+1] = 0; } +#endif + s = strrchr( name, '.' ); /* find last / */ + s++; + strcpy(ext,s); /* save extension */ + l1= strlen( name); + l2= strlen( s)+1; + strncpy( finame, name, l1-l2); + finame[l1-l2]= 0; return( 0 ); /* we're done */ } @@ -718,7 +743,7 @@ double **pmij(double **ps, double *cov, s2 += x[(i-1)*nlstate*ncovmodel+(j-2)*ncovmodel+nc+(i-1)*(ndeath-1)*ncovmodel]*cov[nc]; /*printf("Int j>i s1=%.17e, s2=%.17e %lx %lx\n",s1,s2,s1,s2);*/ } - ps[i][j]=(s2); + ps[i][j]=s2; } } /*ps[3][2]=1;*/ @@ -901,7 +926,7 @@ void mlikeli(FILE *ficres,double p[], in powell(p,xi,npar,ftol,&iter,&fret,func); printf("\n#Number of iterations = %d, -2 Log likelihood = %.12f\n",iter,func(p)); - fprintf(ficres,"#Number of iterations = %d, -2 Log likelihood = %.12f ",iter,func(p)); + fprintf(ficres,"#Number of iterations = %d, -2 Log likelihood = %.12f \n",iter,func(p)); } @@ -1854,12 +1879,275 @@ fclose(ficresprob); exit(0); } +/******************* Printing html file ***********/ +void printinghtml(char fileres[], char title[], char datafile[], int firstpass, int lastpass, int stepm, int weightopt, char model[],int imx,int jmin, int jmax, double jmeanint,char optionfile[],char optionfilehtm[] ){ + int jj1, k1, i1, cpt; + FILE *fichtm; + /*char optionfilehtm[FILENAMELENGTH];*/ + + strcpy(optionfilehtm,optionfile); + strcat(optionfilehtm,".htm"); + if((fichtm=fopen(optionfilehtm,"w"))==NULL) { + printf("Problem with %s \n",optionfilehtm), exit(0); + } + + fprintf(fichtm,"