--- imach/src/imach.c 2003/06/23 17:54:56 1.88 +++ imach/src/imach.c 2014/06/10 21:23:15 1.145 @@ -1,6 +1,285 @@ -/* $Id: imach.c,v 1.88 2003/06/23 17:54:56 brouard Exp $ +/* $Id: imach.c,v 1.145 2014/06/10 21:23:15 brouard Exp $ $State: Exp $ $Log: imach.c,v $ + Revision 1.145 2014/06/10 21:23:15 brouard + Summary: Debugging with valgrind + Author: Nicolas Brouard + + Lot of changes in order to output the results with some covariates + After the Edimburgh REVES conference 2014, it seems mandatory to + improve the code. + No more memory valgrind error but a lot has to be done in order to + continue the work of splitting the code into subroutines. + Also, decodemodel has been improved. Tricode is still not + optimal. nbcode should be improved. Documentation has been added in + the source code. + + Revision 1.143 2014/01/26 09:45:38 brouard + Summary: Version 0.98nR (to be improved, but gives same optimization results as 0.98k. Nice, promising + + * imach.c (Module): Trying to merge old staffs together while being at Tokyo. Not tested... + (Module): Version 0.98nR Running ok, but output format still only works for three covariates. + + Revision 1.142 2014/01/26 03:57:36 brouard + Summary: gnuplot changed plot w l 1 has to be changed to plot w l lt 2 + + * imach.c (Module): Trying to merge old staffs together while being at Tokyo. Not tested... + + Revision 1.141 2014/01/26 02:42:01 brouard + * imach.c (Module): Trying to merge old staffs together while being at Tokyo. Not tested... + + Revision 1.140 2011/09/02 10:37:54 brouard + Summary: times.h is ok with mingw32 now. + + Revision 1.139 2010/06/14 07:50:17 brouard + After the theft of my laptop, I probably lost some lines of codes which were not uploaded to the CVS tree. + I remember having already fixed agemin agemax which are pointers now but not cvs saved. + + Revision 1.138 2010/04/30 18:19:40 brouard + *** empty log message *** + + Revision 1.137 2010/04/29 18:11:38 brouard + (Module): Checking covariates for more complex models + than V1+V2. A lot of change to be done. Unstable. + + Revision 1.136 2010/04/26 20:30:53 brouard + (Module): merging some libgsl code. Fixing computation + of likelione (using inter/intrapolation if mle = 0) in order to + get same likelihood as if mle=1. + Some cleaning of code and comments added. + + Revision 1.135 2009/10/29 15:33:14 brouard + (Module): Now imach stops if date of birth, at least year of birth, is not given. Some cleaning of the code. + + Revision 1.134 2009/10/29 13:18:53 brouard + (Module): Now imach stops if date of birth, at least year of birth, is not given. Some cleaning of the code. + + Revision 1.133 2009/07/06 10:21:25 brouard + just nforces + + Revision 1.132 2009/07/06 08:22:05 brouard + Many tings + + Revision 1.131 2009/06/20 16:22:47 brouard + Some dimensions resccaled + + Revision 1.130 2009/05/26 06:44:34 brouard + (Module): Max Covariate is now set to 20 instead of 8. A + lot of cleaning with variables initialized to 0. Trying to make + V2+V3*age+V1+V4 strb=V3*age+V1+V4 working better. + + Revision 1.129 2007/08/31 13:49:27 lievre + Modification of the way of exiting when the covariate is not binary in order to see on the window the error message before exiting + + Revision 1.128 2006/06/30 13:02:05 brouard + (Module): Clarifications on computing e.j + + Revision 1.127 2006/04/28 18:11:50 brouard + (Module): Yes the sum of survivors was wrong since + imach-114 because nhstepm was no more computed in the age + loop. Now we define nhstepma in the age loop. + (Module): In order to speed up (in case of numerous covariates) we + compute health expectancies (without variances) in a first step + and then all the health expectancies with variances or standard + deviation (needs data from the Hessian matrices) which slows the + computation. + In the future we should be able to stop the program is only health + expectancies and graph are needed without standard deviations. + + Revision 1.126 2006/04/28 17:23:28 brouard + (Module): Yes the sum of survivors was wrong since + imach-114 because nhstepm was no more computed in the age + loop. Now we define nhstepma in the age loop. + Version 0.98h + + Revision 1.125 2006/04/04 15:20:31 lievre + Errors in calculation of health expectancies. Age was not initialized. + Forecasting file added. + + Revision 1.124 2006/03/22 17:13:53 lievre + Parameters are printed with %lf instead of %f (more numbers after the comma). + The log-likelihood is printed in the log file + + Revision 1.123 2006/03/20 10:52:43 brouard + * imach.c (Module):
=(p+1))(v[j-p-1] = t[j]);
- }
-}
+/* for(j=0; j<= lg; j++) { */
+/* if (j>=(p+1))(v[j-p-1] = t[j]); */
+/* } */
+/* } */
/********************** nrerror ********************/
@@ -473,7 +905,9 @@ 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])
+ /* print *(*(m+1)+70) or print m[1][70]; print m+1 or print &(m[1]) or &(m[1][0])
+m[i] = address of ith row of the table. &(m[i]) is its value which is another adress
+that of m[i][0]. In order to get the value p m[i][0] but it is unitialized.
*/
}
@@ -528,6 +962,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;
@@ -703,6 +1172,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,"%ld day(s) %ld hour(s) %ld minute(s) %ld 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 []))
@@ -713,6 +1195,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);
@@ -723,17 +1207,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);
- fprintf(ficrespow,"%d %.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); fflush(ficlog);
+/* 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 %.12lf",i, p[i]);
fprintf(ficrespow," %.12lf", p[i]);
}
printf("\n");
fprintf(ficlog,"\n");
- fprintf(ficrespow,"\n");
+ fprintf(ficrespow,"\n");fflush(ficrespow);
+ if(*iter <=3){
+ tm = *localtime(&curr_time.tv_sec);
+ strcpy(strcurr,asctime(&tm));
+/* asctime_r(&tm,strcurr); */
+ forecast_time=curr_time;
+ itmp = strlen(strcurr);
+ if(strcurr[itmp-1]=='\n') /* Windows outputs with a new line */
+ 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 i.e.\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 i.e.\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);
@@ -825,7 +1333,7 @@ void powell(double p[], double **xi, int
}
}
-/**** Prevalence limit (stable prevalence) ****************/
+/**** Prevalence limit (stable or period prevalence) ****************/
double **prevalim(double **prlim, int nlstate, double x[], double age, double **oldm, double **savm, double ftolpl, int ij)
{
@@ -834,8 +1342,8 @@ double **prevalim(double **prlim, int nl
int i, ii,j,k;
double min, max, maxmin, maxmax,sumnew=0.;
- double **matprod2();
- double **out, cov[NCOVMAX], **pmij();
+ /* double **matprod2(); */ /* test */
+ double **out, cov[NCOVMAX+1], **pmij();
double **newm;
double agefin, delaymax=50 ; /* Max number of years to converge */
@@ -850,21 +1358,23 @@ double **prevalim(double **prlim, int nl
for(agefin=age-stepm/YEARM; agefin>=age-delaymax; agefin=agefin-stepm/YEARM){
newm=savm;
/* Covariates have to be included here again */
- cov[2]=agefin;
-
- for (k=1; k<=cptcovn;k++) {
- cov[2+k]=nbcode[Tvar[k]][codtab[ij][Tvar[k]]];
- /* printf("ij=%d k=%d Tvar[k]=%d nbcode=%d cov=%lf codtab[ij][Tvar[k]]=%d \n",ij,k, Tvar[k],nbcode[Tvar[k]][codtab[ij][Tvar[k]]],cov[2+k], codtab[ij][Tvar[k]]);*/
- }
- for (k=1; k<=cptcovage;k++) cov[2+Tage[k]]=cov[2+Tage[k]]*cov[2];
- for (k=1; k<=cptcovprod;k++)
- cov[2+Tprod[k]]=nbcode[Tvard[k][1]][codtab[ij][Tvard[k][1]]]*nbcode[Tvard[k][2]][codtab[ij][Tvard[k][2]]];
-
- /*printf("ij=%d cptcovprod=%d tvar=%d ", ij, cptcovprod, Tvar[1]);*/
- /*printf("ij=%d cov[3]=%lf cov[4]=%lf \n",ij, cov[3],cov[4]);*/
- /*printf("ij=%d cov[3]=%lf \n",ij, cov[3]);*/
- out=matprod2(newm, pmij(pmmij,cov,ncovmodel,x,nlstate),1,nlstate+ndeath,1,nlstate+ndeath,1,nlstate+ndeath, oldm);
-
+ cov[2]=agefin;
+
+ for (k=1; k<=cptcovn;k++) {
+ cov[2+k]=nbcode[Tvar[k]][codtab[ij][Tvar[k]]];
+ /*printf("prevalim ij=%d k=%d Tvar[%d]=%d nbcode=%d cov=%lf codtab[%d][Tvar[%d]]=%d \n",ij,k, k, Tvar[k],nbcode[Tvar[k]][codtab[ij][Tvar[k]]],cov[2+k], ij, k, codtab[ij][Tvar[k]]);*/
+ }
+ /* for (k=1; k<=cptcovage;k++) cov[2+Tage[k]]=cov[2+Tage[k]]*cov[2]; */
+ /* for (k=1; k<=cptcovprod;k++) /\* Useless *\/ */
+ /* cov[2+Tprod[k]]=nbcode[Tvard[k][1]][codtab[ij][Tvard[k][1]]] * nbcode[Tvard[k][2]][codtab[ij][Tvard[k][2]]]; */
+
+ /*printf("ij=%d cptcovprod=%d tvar=%d ", ij, cptcovprod, Tvar[1]);*/
+ /*printf("ij=%d cov[3]=%lf cov[4]=%lf \n",ij, cov[3],cov[4]);*/
+ /*printf("ij=%d cov[3]=%lf \n",ij, cov[3]);*/
+ /* savm=pmij(pmmij,cov,ncovmodel,x,nlstate); */
+ /* out=matprod2(newm, pmij(pmmij,cov,ncovmodel,x,nlstate),1,nlstate+ndeath,1,nlstate+ndeath,1,nlstate+ndeath, oldm); /\* Bug Valgrind *\/ */
+ out=matprod2(newm, pmij(pmmij,cov,ncovmodel,x,nlstate),1,nlstate+ndeath,1,nlstate+ndeath,1,nlstate+ndeath, oldm); /* Bug Valgrind */
+
savm=oldm;
oldm=newm;
maxmax=0.;
@@ -875,6 +1385,7 @@ double **prevalim(double **prlim, int nl
sumnew=0;
for(k=1; k<=ndeath; k++) sumnew+=newm[i][nlstate+k];
prlim[i][j]= newm[i][j]/(1-sumnew);
+ /*printf(" prevalim i=%d, j=%d, prmlim[%d][%d]=%f, agefin=%d \n", i, j, i, j, prlim[i][j],(int)agefin);*/
max=FMAX(max,prlim[i][j]);
min=FMIN(min,prlim[i][j]);
}
@@ -891,80 +1402,100 @@ double **prevalim(double **prlim, int nl
double **pmij(double **ps, double *cov, int ncovmodel, double *x, int nlstate )
{
- double s1, s2;
+ /* According to parameters values stored in x and the covariate's values stored in cov,
+ computes the probability to be observed in state j being in state i by appying the
+ model to the ncovmodel covariates (including constant and age).
+ lnpijopii=ln(pij/pii)= aij+bij*age+cij*v1+dij*v2+... = sum_nc=1^ncovmodel xij(nc)*cov[nc]
+ and, according on how parameters are entered, the position of the coefficient xij(nc) of the
+ ncth covariate in the global vector x is given by the formula:
+ j=i nc + ((i-1)*(nlstate+ndeath-1)+(j-2))*ncovmodel
+ Computes ln(pij/pii) (lnpijopii), deduces pij/pii by exponentiation,
+ sums on j different of i to get 1-pii/pii, deduces pii, and then all pij.
+ Outputs ps[i][j] the probability to be observed in j being in j according to
+ the values of the covariates cov[nc] and corresponding parameter values x[nc+shiftij]
+ */
+ double s1, lnpijopii;
/*double t34;*/
int i,j,j1, nc, ii, jj;
for(i=1; i<= nlstate; i++){
- for(j=1; ji s1=%.17e, s2=%.17e %lx %lx\n",s1,s2,s1,s2);*/
- }
- ps[i][j]=s2;
- }
- }
- /*ps[3][2]=1;*/
-
- for(i=1; i<= nlstate; i++){
- s1=0;
- for(j=1; ji s1=%.17e, lnpijopii=%.17e %lx %lx\n",s1,lnpijopii,s1,lnpijopii); */
+ }
+ ps[i][j]=lnpijopii; /* In fact ln(pij/pii) */
+ }
}
- }
-
-
- /* for(ii=1; ii<= nlstate+ndeath; ii++){
- for(jj=1; jj<= nlstate+ndeath; jj++){
- printf("%lf ",ps[ii][jj]);
- }
- printf("\n ");
+
+ for(i=1; i<= nlstate; i++){
+ s1=0;
+ for(j=1; ji} pij/pii=(1-pii)/pii and thus pii is known from s1 */
+ ps[i][i]=1./(s1+1.);
+ /* Computing other pijs */
+ for(j=1; j 1 the results are less biased than in previous versions.
@@ -1085,15 +1628,16 @@ double func( double *x)
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
+ /* bias bh is positive if real duration
* 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]));*/
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 .
+ /* 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 equal to probability to die before dh
+ minus 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
@@ -1113,7 +1657,28 @@ double func( double *x)
lower mortality.
*/
lli=log(out[s1][s2] - savm[s1][s2]);
- }else{
+
+
+ } else if (s2==-2) {
+ for (j=1,survp=0. ; j<=nlstate; j++)
+ survp += (1.+bbh)*out[s1][j]- bbh*savm[s1][j];
+ /*survp += out[s1][j]; */
+ lli= log(survp);
+ }
+
+ else if (s2==-4) {
+ for (j=3,survp=0. ; j<=nlstate; j++)
+ survp += (1.+bbh)*out[s1][j]- bbh*savm[s1][j];
+ lli= log(survp);
+ }
+
+ else if (s2==-5) {
+ for (j=1,survp=0. ; j<=2; j++)
+ survp += (1.+bbh)*out[s1][j]- bbh*savm[s1][j];
+ lli= log(survp);
+ }
+
+ 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 */
}
@@ -1146,31 +1711,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;
@@ -1197,30 +1741,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])); /* 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;
@@ -1304,7 +1828,7 @@ 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 l, ll[NLSTATEMAX+1], cov[NCOVMAX+1];
double **out;
double lli; /* Individual log likelihood */
double llt;
@@ -1334,8 +1858,11 @@ double funcone( double *x)
for (kk=1; kk<=cptcovage;kk++) {
cov[Tage[kk]+2]=covar[Tvar[Tage[kk]]][i]*cov[2];
}
+ /* savm=pmij(pmmij,cov,ncovmodel,x,nlstate); */
out=matprod2(newm,oldm,1,nlstate+ndeath,1,nlstate+ndeath,
1,nlstate+ndeath,pmij(pmmij,cov,ncovmodel,x,nlstate));
+ /* out=matprod2(newm,oldm,1,nlstate+ndeath,1,nlstate+ndeath, */
+ /* 1,nlstate+ndeath,pmij(pmmij,cov,ncovmodel,x,nlstate)); */
savm=oldm;
oldm=newm;
} /* end mult */
@@ -1348,7 +1875,11 @@ double funcone( double *x)
*/
if( s2 > nlstate && (mle <5) ){ /* Jackson */
lli=log(out[s1][s2] - savm[s1][s2]);
- } else if (mle==1){
+ } else if (s2==-2) {
+ for (j=1,survp=0. ; j<=nlstate; j++)
+ survp += (1.+bbh)*out[s1][j]- bbh*savm[s1][j];
+ lli= log(survp);
+ }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 */
@@ -1356,16 +1887,17 @@ double funcone( double *x)
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 */
+ } else{ /* mle=0 back to 1 */
+ lli= log((1.+bbh)*out[s1][s2]- bbh*savm[s1][s2]); /* linear interpolation */
+ /*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]); */
+ /*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 ", \
+ fprintf(ficresilk,"%9ld %6d %2d %2d %1d %1d %3d %11.6f %8.4f\
+ %11.6f %11.6f %11.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++){
@@ -1386,35 +1918,8 @@ double funcone( double *x)
return -l;
}
-char *subdirf(char fileres[])
-{
-
- strcpy(tmpout,optionfilefiname);
- strcat(tmpout,"/"); /* Add to the right */
- strcat(tmpout,fileres);
- return tmpout;
-}
-
-char *subdirf2(char fileres[], char *preop)
-{
-
- strcpy(tmpout,optionfilefiname);
- strcat(tmpout,"/");
- strcat(tmpout,preop);
- strcat(tmpout,fileres);
- return tmpout;
-}
-char *subdirf3(char fileres[], char *preop, char *preop2)
-{
-
- strcpy(tmpout,optionfilefiname);
- strcat(tmpout,"/");
- strcat(tmpout,preop);
- strcat(tmpout,preop2);
- strcat(tmpout,fileres);
- return tmpout;
-}
+/*************** 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
@@ -1457,7 +1962,7 @@ void mlikeli(FILE *ficres,double p[], in
double **xi;
double fret;
double fretone; /* Only one call to likelihood */
- char filerespow[FILENAMELENGTH];
+ /* char filerespow[FILENAMELENGTH];*/
xi=matrix(1,npar,1,npar);
for (i=1;i<=npar;i++)
for (j=1;j<=npar;j++)
@@ -1477,6 +1982,7 @@ void mlikeli(FILE *ficres,double p[], in
powell(p,xi,npar,ftol,&iter,&fret,func);
+ free_matrix(xi,1,npar,1,npar);
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));
@@ -1492,11 +1998,11 @@ void hesscov(double **matcov, double p[]
int i, j,jk;
int *indx;
- double hessii(double p[], double delta, int theta, double delti[]);
- double hessij(double p[], double delti[], int i, int j);
+ double hessii(double p[], double delta, int theta, double delti[],double (*func)(double []),int npar);
+ double hessij(double p[], double delti[], int i, int j,double (*func)(double []),int npar);
void lubksb(double **a, int npar, int *indx, double b[]) ;
void ludcmp(double **a, int npar, int *indx, double *d) ;
-
+ double gompertz(double p[]);
hess=matrix(1,npar,1,npar);
printf("\nCalculation of the hessian matrix. Wait...\n");
@@ -1504,9 +2010,11 @@ void hesscov(double **matcov, double p[]
for (i=1;i<=npar;i++){
printf("%d",i);fflush(stdout);
fprintf(ficlog,"%d",i);fflush(ficlog);
- hess[i][i]=hessii(p,ftolhess,i,delti);
- /*printf(" %f ",p[i]);*/
- /*printf(" %lf ",hess[i][i]);*/
+
+ hess[i][i]=hessii(p,ftolhess,i,delti,func,npar);
+
+ /* printf(" %f ",p[i]);
+ printf(" %lf %lf %lf",hess[i][i],ftolhess,delti[i]);*/
}
for (i=1;i<=npar;i++) {
@@ -1514,7 +2022,8 @@ void hesscov(double **matcov, double p[]
if (j>i) {
printf(".%d%d",i,j);fflush(stdout);
fprintf(ficlog,".%d%d",i,j);fflush(ficlog);
- hess[i][j]=hessij(p,delti,i,j);
+ hess[i][j]=hessij(p,delti,i,j,func,npar);
+
hess[j][i]=hess[i][j];
/*printf(" %lf ",hess[i][j]);*/
}
@@ -1585,33 +2094,33 @@ void hesscov(double **matcov, double p[]
}
/*************** hessian matrix ****************/
-double hessii( double x[], double delta, int theta, double delti[])
+double hessii(double x[], double delta, int theta, double delti[], double (*func)(double []), int npar)
{
int i;
int l=1, lmax=20;
double k1,k2;
- double p2[NPARMAX+1];
+ double p2[MAXPARM+1]; /* identical to x */
double res;
- double delt, delts, nkhi=10.,nkhif=1., khi=1.e-4;
+ double delt=0.0001, delts, nkhi=10.,nkhif=1., khi=1.e-4;
double fx;
int k=0,kmax=10;
double l1;
fx=func(x);
for (i=1;i<=npar;i++) p2[i]=x[i];
- for(l=0 ; l <=lmax; l++){
+ for(l=0 ; l <=lmax; l++){ /* Enlarging the zone around the Maximum */
l1=pow(10,l);
delts=delt;
for(k=1 ; k ");
- m=cptcoveff;
+ m=pow(2,cptcoveff);
if (cptcovn < 1) {m=1;ncodemax[1]=1;}
jj1=0;
@@ -3066,43 +3852,55 @@ fprintf(fichtm," \n ");
+ fflush(fichtm);
+ fprintf(fichtm," ");
- m=cptcoveff;
+ m=pow(2,cptcoveff);
if (cptcovn < 1) {m=1;ncodemax[1]=1;}
jj1=0;
@@ -3127,10 +3926,16 @@ fprintf(fichtm," Computing probabilities of dying over estepm months as a weighted average (i.e global mortality independent of initial healh state)
%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");
+ pstamp(ficresvij);
+ fprintf(ficresvij,"# Variance and covariance of health expectancies e.j \n# (weighted average of eij where weights are ");
+ if(popbased==1)
+ fprintf(ficresvij,"the age specific prevalence observed (cross-sectionally) in the population i.e cross-sectionally\n in each health state (popbased=1) (mobilav=%d\n",mobilav);
+ else
+ fprintf(ficresvij,"the age specific period (stable) prevalences in each health state \n");
fprintf(ficresvij,"# Age");
for(i=1; i<=nlstate;i++)
for(j=1; j<=nlstate;j++)
- fprintf(ficresvij," Cov(e%1d, e%1d)",i,j);
+ fprintf(ficresvij," Cov(e.%1d, e.%1d)",i,j);
fprintf(ficresvij,"\n");
xp=vector(1,npar);
@@ -2436,8 +3187,7 @@ void varevsij(char optionfilefiname[], d
/* hstepm beeing the number of stepms, if hstepm=1 the length of hstepm is stepm.
nhstepm is the number of hstepm from age to agelim
nstepm is the number of stepm from age to agelin.
- Look at hpijx to understand the reason of that which relies in memory size
- and note for a fixed period like k years */
+ Look at function hpijx to understand why (it is linked to memory size questions) */
/* We decided (b) to get a life expectancy respecting the most precise curvature of the
survival function given by stepm (the optimization length). Unfortunately it
means that if the survival funtion is printed every two years of age and if
@@ -2503,7 +3253,7 @@ void varevsij(char optionfilefiname[], d
}
}
- for(j=1; j<= nlstate; j++){
+ for(j=1; j<= nlstate; j++){ /* Sum of wi * eij = e.j */
for(h=0; h<=nhstepm; h++){
for(i=1, gm[h][j]=0.;i<=nlstate;i++)
gm[h][j] += prlim[i][i]*p3mat[i][j][h];
@@ -2613,21 +3363,21 @@ void varevsij(char optionfilefiname[], d
free_vector(gmp,nlstate+1,nlstate+ndeath);
free_matrix(gradgp,1,npar,nlstate+1,nlstate+ndeath);
free_matrix(trgradgp,nlstate+1,nlstate+ndeath,1,npar); /* mu or p point j*/
- fprintf(ficgp,"\nset noparametric;set nolabel; set ter png small;set size 0.65, 0.65");
+ fprintf(ficgp,"\nunset parametric;unset label; set ter png small size 320, 240");
/* for(j=nlstate+1; j<= nlstate+ndeath; j++){ *//* Only the first actually */
- fprintf(ficgp,"\n set log y; set nolog x;set xlabel \"Age\"; set ylabel \"Force of mortality (year-1)\";");
+ fprintf(ficgp,"\n set log y; unset log x;set xlabel \"Age\"; set ylabel \"Force of mortality (year-1)\";");
/* 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 ",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(ficgp,"\n plot \"%s\" u 1:($3) not w l lt 1 ",subdirf(fileresprobmorprev));
+ fprintf(ficgp,"\n replot \"%s\" u 1:(($3+1.96*$4)) t \"95\%% interval\" w l lt 2 ",subdirf(fileresprobmorprev));
+ fprintf(ficgp,"\n replot \"%s\" u 1:(($3-1.96*$4)) not w l lt 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%s.png\";replot;",digitp,optionfilefiname,digit); */
- fprintf(ficgp,"\nset out \"%s%s.png\";replot;",digitp,subdirf3(optionfilefiname,"varmuptjgr",digitp),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);
@@ -2642,7 +3392,7 @@ void varevsij(char optionfilefiname[], d
} /* 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)
+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, char strstart[])
{
/* Variance of prevalence limit */
/* double **prevalim(double **prlim, int nlstate, double *xp, double age, double **oldm, double **savm,double ftolpl);*/
@@ -2655,8 +3405,9 @@ void varprevlim(char fileres[], double *
double **gradg, **trgradg;
double age,agelim;
int theta;
-
- fprintf(ficresvpl,"# Standard deviation of stable prevalences \n");
+
+ pstamp(ficresvpl);
+ fprintf(ficresvpl,"# Standard deviation of period (stable) prevalences \n");
fprintf(ficresvpl,"# Age");
for(i=1; i<=nlstate;i++)
fprintf(ficresvpl," %1d-%1d",i,i);
@@ -2725,25 +3476,24 @@ void varprevlim(char fileres[], double *
}
/************ Variance of one-step probabilities ******************/
-void varprob(char optionfilefiname[], double **matcov, double x[], double delti[], int nlstate, double bage, double fage, int ij, int *Tvar, int **nbcode, int *ncodemax)
+void varprob(char optionfilefiname[], double **matcov, double x[], double delti[], int nlstate, double bage, double fage, int ij, int *Tvar, int **nbcode, int *ncodemax, char strstart[])
{
int i, j=0, i1, k1, l1, t, tj;
int k2, l2, j1, z1;
int k=0,l, cptcode;
- int first=1, first1;
+ int first=1, first1, first2;
double cv12, mu1, mu2, lc1, lc2, v12, v21, v11, v22,v1,v2, c12, tnalp;
double **dnewm,**doldm;
double *xp;
double *gp, *gm;
double **gradg, **trgradg;
double **mu;
- double age,agelim, cov[NCOVMAX];
+ double age,agelim, cov[NCOVMAX+1];
double std=2.0; /* Number of standard deviation wide of confidence ellipsoids */
int theta;
char fileresprob[FILENAMELENGTH];
char fileresprobcov[FILENAMELENGTH];
char fileresprobcor[FILENAMELENGTH];
-
double ***varpij;
strcpy(fileresprob,"prob");
@@ -2770,13 +3520,15 @@ void varprob(char optionfilefiname[], do
fprintf(ficlog,"Computing matrix of variance covariance of one-step probabilities: result on file '%s' \n",fileresprobcov);
printf("and correlation matrix of one-step probabilities: result on file '%s' \n",fileresprobcor);
fprintf(ficlog,"and correlation matrix of one-step probabilities: result on file '%s' \n",fileresprobcor);
-
+ pstamp(ficresprob);
fprintf(ficresprob,"#One-step probabilities and stand. devi in ()\n");
fprintf(ficresprob,"# Age");
+ pstamp(ficresprobcov);
fprintf(ficresprobcov,"#One-step probabilities and covariance matrix\n");
fprintf(ficresprobcov,"# Age");
+ pstamp(ficresprobcor);
fprintf(ficresprobcor,"#One-step probabilities and correlation matrix\n");
- fprintf(ficresprobcov,"# Age");
+ fprintf(ficresprobcor,"# Age");
for(i=1; i<=nlstate;i++)
@@ -2789,7 +3541,7 @@ void varprob(char optionfilefiname[], do
fprintf(ficresprobcov,"\n");
fprintf(ficresprobcor,"\n");
*/
- xp=vector(1,npar);
+ xp=vector(1,npar);
dnewm=matrix(1,(nlstate)*(nlstate+ndeath),1,npar);
doldm=matrix(1,(nlstate)*(nlstate+ndeath),1,(nlstate)*(nlstate+ndeath));
mu=matrix(1,(nlstate)*(nlstate+ndeath), (int) bage, (int)fage);
@@ -2799,17 +3551,28 @@ void varprob(char optionfilefiname[], do
fprintf(fichtm,"\n Computing and drawing one step probabilities with their confidence intervals
Computing matrix of variance-covariance of step probabilities
\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(fichtm,"\n Matrix of variance-covariance of pairs of step probabilities (drawings)
Matrix of variance-covariance of pairs of step probabilities
\n\
+ file %s
\n",optionfilehtmcov);
+ fprintf(fichtmcov,"\nEllipsoids of confidence centered on point (p
\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;
+ /* tj=cptcoveff; */
+ tj = (int) pow(2,cptcoveff);
if (cptcovn<1) {tj=1;ncodemax[1]=1;}
j1=0;
- for(t=1; t<=tj;t++){
- for(i1=1; i1<=ncodemax[t];i1++){
- j1++;
+ for(j1=1; j1<=tj;j1++){
+ /*for(i1=1; i1<=ncodemax[t];i1++){ */
+ /*j1++;*/
if (cptcovn>0) {
fprintf(ficresprob, "\n#********** Variable ");
for (z1=1; z1<=cptcoveff; z1++) fprintf(ficresprob, "V%d=%d ",Tvaraff[z1],nbcode[Tvaraff[z1]][codtab[j1][z1]]);
@@ -2823,28 +3586,33 @@ 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]]);
fprintf(ficresprobcor, "**********\n#");
}
+ gradg=matrix(1,npar,1,(nlstate)*(nlstate+ndeath));
+ trgradg=matrix(1,(nlstate)*(nlstate+ndeath),1,npar);
+ gp=vector(1,(nlstate)*(nlstate+ndeath));
+ gm=vector(1,(nlstate)*(nlstate+ndeath));
for (age=bage; age<=fage; age ++){
cov[2]=age;
for (k=1; k<=cptcovn;k++) {
- cov[2+k]=nbcode[Tvar[k]][codtab[j1][Tvar[k]]];
+ cov[2+k]=nbcode[Tvar[k]][codtab[j1][Tvar[k]]];/* j1 1 2 3 4
+ * 1 1 1 1 1
+ * 2 2 1 1 1
+ * 3 1 2 1 1
+ */
+ /* nbcode[1][1]=0 nbcode[1][2]=1;*/
}
for (k=1; k<=cptcovage;k++) cov[2+Tage[k]]=cov[2+Tage[k]]*cov[2];
for (k=1; k<=cptcovprod;k++)
cov[2+Tprod[k]]=nbcode[Tvard[k][1]][codtab[ij][Tvard[k][1]]]*nbcode[Tvard[k][2]][codtab[ij][Tvard[k][2]]];
- gradg=matrix(1,npar,1,(nlstate)*(nlstate+ndeath));
- trgradg=matrix(1,(nlstate)*(nlstate+ndeath),1,npar);
- gp=vector(1,(nlstate)*(nlstate+ndeath));
- gm=vector(1,(nlstate)*(nlstate+ndeath));
for(theta=1; theta <=npar; theta++){
for(i=1; i<=npar; i++)
@@ -2882,10 +3650,6 @@ void varprob(char optionfilefiname[], do
matprod2(dnewm,trgradg,1,(nlstate)*(nlstate+ndeath),1,npar,1,npar,matcov);
matprod2(doldm,dnewm,1,(nlstate)*(nlstate+ndeath),1,npar,1,(nlstate)*(nlstate+ndeath),gradg);
- free_vector(gp,1,(nlstate+ndeath)*(nlstate+ndeath));
- free_vector(gm,1,(nlstate+ndeath)*(nlstate+ndeath));
- free_matrix(trgradg,1,(nlstate+ndeath)*(nlstate+ndeath),1,npar);
- free_matrix(gradg,1,(nlstate+ndeath)*(nlstate+ndeath),1,npar);
pmij(pmmij,cov,ncovmodel,x,nlstate);
@@ -2919,20 +3683,25 @@ void varprob(char optionfilefiname[], do
i=0;
for (k=1; k<=(nlstate);k++){
for (l=1; l<=(nlstate+ndeath);l++){
- i=i++;
+ i++;
fprintf(ficresprobcov,"\n%d %d-%d",(int)age,k,l);
fprintf(ficresprobcor,"\n%d %d-%d",(int)age,k,l);
for (j=1; j<=i;j++){
+ /* printf(" k=%d l=%d i=%d j=%d\n",k,l,i,j);fflush(stdout); */
fprintf(ficresprobcov," %11.3e",varpij[i][j][(int)age]);
fprintf(ficresprobcor," %11.3e",varpij[i][j][(int) age]/sqrt(varpij[i][i][(int) age])/sqrt(varpij[j][j][(int)age]));
}
}
}/* end of loop for state */
} /* end of loop for age */
-
+ free_vector(gp,1,(nlstate+ndeath)*(nlstate+ndeath));
+ free_vector(gm,1,(nlstate+ndeath)*(nlstate+ndeath));
+ free_matrix(trgradg,1,(nlstate+ndeath)*(nlstate+ndeath),1,npar);
+ free_matrix(gradg,1,(nlstate+ndeath)*(nlstate+ndeath),1,npar);
+
/* Confidence intervalle of pij */
/*
- fprintf(ficgp,"\nset noparametric;unset label");
+ fprintf(ficgp,"\nunset parametric;unset label");
fprintf(ficgp,"\nset log y;unset log x; set xlabel \"Age\";set ylabel \"probability (year-1)\"");
fprintf(ficgp,"\nset ter png small\nset size 0.65,0.65");
fprintf(fichtm,"\n
Probability with confidence intervals expressed in year-1 :pijgr%s.png, ",optionfilefiname,optionfilefiname);
@@ -2942,7 +3711,7 @@ void varprob(char optionfilefiname[], do
*/
/* Drawing ellipsoids of confidence of two variables p(k1-l1,k2-l2)*/
- first1=1;
+ first1=1;first2=2;
for (k2=1; k2<=(nlstate);k2++){
for (l2=1; l2<=(nlstate+ndeath);l2++){
if(l2==k2) continue;
@@ -2963,6 +3732,16 @@ void varprob(char optionfilefiname[], do
/* Computing eigen value of matrix of covariance */
lc1=((v1+v2)+sqrt((v1+v2)*(v1+v2) - 4*(v1*v2-cv12*cv12)))/2.;
lc2=((v1+v2)-sqrt((v1+v2)*(v1+v2) - 4*(v1*v2-cv12*cv12)))/2.;
+ if ((lc2 <0) || (lc1 <0) ){
+ if(first2==1){
+ first1=0;
+ printf("Strange: j1=%d One eigen value of 2x2 matrix of covariance is negative, lc1=%11.3e, lc2=%11.3e, v1=%11.3e, v2=%11.3e, cv12=%11.3e.\n It means that the matrix was not well estimated (varpij), for i=%2d, j=%2d, age=%4d .\n See files %s and %s. Probably WRONG RESULTS. See log file for details...\n", j1, lc1, lc2, v1, v2, cv12, i, j, (int)age,fileresprobcov, fileresprobcor);
+ }
+ fprintf(ficlog,"Strange: j1=%d One eigen value of 2x2 matrix of covariance is negative, lc1=%11.3e, lc2=%11.3e, v1=%11.3e, v2=%11.3e, cv12=%11.3e.\n It means that the matrix was not well estimated (varpij), for i=%2d, j=%2d, age=%4d .\n See files %s and %s. Probably WRONG RESULTS.\n", j1, lc1, lc2, v1, v2, cv12, i, j, (int)age,fileresprobcov, fileresprobcor);fflush(ficlog);
+ /* lc1=fabs(lc1); */ /* If we want to have them positive */
+ /* lc2=fabs(lc2); */
+ }
+
/* Eigen vectors */
v11=(1./sqrt(1+(v1-lc1)*(v1-lc1)/cv12/cv12));
/*v21=sqrt(1.-v11*v11); *//* error */
@@ -2982,14 +3761,14 @@ void varprob(char optionfilefiname[], do
first=0;
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\
+ fprintf(ficgp,"\nset ter png small size 320, 240");
+ 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(fichtm,"\n
",subdirf2(optionfilefiname,"varpijgr"), j1,k1,l1,k2,l2);
- fprintf(fichtm,"\n
Correlation at age %d (%.3f),",(int) age, c12);
+ 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);
@@ -2998,7 +3777,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",\
@@ -3013,15 +3792,18 @@ void varprob(char optionfilefiname[], do
} /* k12 */
} /*l1 */
}/* k1 */
- } /* loop covariates */
+ /* } /* loop covariates */
}
free_ma3x(varpij,1,nlstate,1,nlstate+ndeath,(int) bage, (int)fage);
free_matrix(mu,1,(nlstate+ndeath)*(nlstate+ndeath),(int) bage, (int)fage);
+ free_matrix(doldm,1,(nlstate)*(nlstate+ndeath),1,(nlstate)*(nlstate+ndeath));
+ free_matrix(dnewm,1,(nlstate)*(nlstate+ndeath),1,npar);
free_vector(xp,1,npar);
fclose(ficresprob);
fclose(ficresprobcov);
fclose(ficresprobcor);
- /* fclose(ficgp);*/
+ fflush(ficgp);
+ fflush(fichtmcov);
}
@@ -3033,26 +3815,30 @@ 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): %s
\n \
- - Estimated transition probabilities over %d (stepm) months: %s
\n \
- - Stable prevalence in each health state: %s
\n \
- - Life expectancies by age and initial health status (estepm=%2d months): \
- %s
\nResult 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,"\
+ - Period (stable) prevalence in each health state: %s
\n",
+ subdirf2(fileres,"pl"),subdirf2(fileres,"pl"));
+ fprintf(fichtm,"\
+ - (a) Life expectancies by health status at initial age, ei. (b) health expectancies by health status at initial age, eij . If one or more covariates are included, specific tables for each value of the covariate are output in sequences within the same file (estepm=%2d months): \
+ %s
\n",
estepm,subdirf2(fileres,"e"),subdirf2(fileres,"e"));
+ fprintf(fichtm,"\
+ - Population projections by age and states: \
+ %s
\n
");
- fprintf(fichtm,"\n
");
}
/* Pij */
- 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);
+ fprintf(fichtm,"
- Pij or Conditional probabilities to be observed in state j being in state i, %d (stepm) months before: %s%d_1.png
\
+",stepm,subdirf2(optionfilefiname,"pe"),jj1,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: %s%d2.png
\
-",stepm,subdirf2(optionfilefiname,"pe"),jj1,subdirf2(optionfilefiname,"pe"),jj1);
- /* Stable prevalence in each health state */
+ before but expressed in per year i.e. quasi incidences if stepm is small and probabilities too: %s%d_2.png
\
+",stepm,subdirf2(optionfilefiname,"pe"),jj1,subdirf2(optionfilefiname,"pe"),jj1,subdirf2(optionfilefiname,"pe"),jj1);
+ /* Period (stable) prevalence in each health state */
for(cpt=1; cpt
\
-",subdirf2(optionfilefiname,"p"),cpt,jj1,subdirf2(optionfilefiname,"p"),cpt,jj1);
+ fprintf(fichtm,"
- Period (stable) prevalence in each health state : %s%d_%d.png
\
+",subdirf2(optionfilefiname,"p"),cpt,jj1,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): %s%d%d.png
\
-",cpt,subdirf2(optionfilefiname,"exo"),cpt,jj1,subdirf2(optionfilefiname,"exp"),cpt,jj1);
+ fprintf(fichtm,"\n
- Life expectancy by health state (%d) at initial age and its decomposition into health expectancies : %s%d%d.png
\
+",cpt,subdirf2(optionfilefiname,"exp"),cpt,jj1,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): %s%d.png
\
-",subdirf2(optionfilefiname,"e"),jj1,subdirf2(optionfilefiname,"e"),jj1);
} /* end i1 */
}/* End k1 */
fprintf(fichtm," Result files (second order: variances)
\n\
- - Parameter file with estimated parameters and covariance matrix: %s
\n\
- - Variance of one-step probabilities: %s
\n\
- - Variance-covariance of one-step probabilities: %s
\n\
- - Correlation matrix of one-step probabilities: %s
\n\
- - Variances and covariances of life expectancies by age and initial health status (estepm=%d months): %s
\n\
- - Health expectancies with their variances (no covariance): %s
\n\
- - Standard deviation of stable prevalences: %s
\n",\
- rfileres,rfileres,\
- subdirf2(fileres,"prob"),subdirf2(fileres,"prob"),\
- subdirf2(fileres,"probcov"),subdirf2(fileres,"probcov"),\
- subdirf2(fileres,"probcor"),subdirf2(fileres,"probcor"),\
- estepm, subdirf2(fileres,"v"),subdirf2(fileres,"v"),\
- subdirf2(fileres,"t"),subdirf2(fileres,"t"),\
+ 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 health expectancies by age and initial health status (cov(eij,ekl)(estepm=%2d months): \
+ %s
\n
\n",
+ estepm,subdirf2(fileres,"stde"),subdirf2(fileres,"stde"));
+ fprintf(fichtm,"\
+ - Variances and covariances of health expectancies by age. Status (i) based health expectancies (in state j), eij are weighted by the period prevalences in each state i (if popbased=1, an additional computation is done using the cross-sectional prevalences, i.e population based) (estepm=%d months): %s
\n",
+ estepm, subdirf2(fileres,"v"),subdirf2(fileres,"v"));
+ fprintf(fichtm,"\
+ - Total life expectancy and total health expectancies to be spent in each health state e.j with their standard errors (if popbased=1, an additional computation is done using the cross-sectional prevalences, i.e population based) (estepm=%d months): %s
\n",
+ estepm, subdirf2(fileres,"t"),subdirf2(fileres,"t"));
+ fprintf(fichtm,"\
+ - Standard deviation of period (stable) prevalences: %s
\n",\
subdirf2(fileres,"vpl"),subdirf2(fileres,"vpl"));
/* if(popforecast==1) fprintf(fichtm,"\n */
@@ -3111,9 +3909,10 @@ health expectancies in states (1) and (2
/*
",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,"
");
@@ -3138,18 +3943,18 @@ interval) in state (%d): %s%d%d.png
");
}
for(cpt=1; cpt<=nlstate;cpt++) {
- fprintf(fichtm,"
- Observed and period prevalence (with confident\
-interval) in state (%d): %s%d%d.png
\
-",cpt,subdirf2(optionfilefiname,"pe"),cpt,jj1,subdirf2(optionfilefiname,"pe"),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). If popbased=1 the smooth (due to the model) \
+true period expectancies (those weighted with period prevalences are also\
+ drawn in addition to the population based expectancies computed using\
+ observed and cahotic prevalences: %s%d.png
\
+",subdirf2(optionfilefiname,"e"),jj1,subdirf2(optionfilefiname,"e"),jj1);
} /* end i1 */
}/* End k1 */
fprintf(fichtm,"
}
/******************* Gnuplot file **************/
-void printinggnuplot(char fileres[], char optionfilefiname[], double ageminpar, double agemaxpar, double fage , char path[], 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;
+ int m0,cpt=0,k1=0,i=0,k=0,j=0,jk=0,k2=0,k3=0,ij=0,l=0;
+ int ng=0;
/* 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",path);
+ fprintf(ficgp,"cd \"%s\" \n",pathc);
/*#endif */
m=pow(2,cptcoveff);
@@ -3157,37 +3962,36 @@ void printinggnuplot(char fileres[], cha
strcpy(optfileres,"vpl");
/* 1eme*/
for (cpt=1; cpt<= nlstate ; cpt ++) {
- for (k1=1; k1<= m ; k1 ++) {
- 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);
+ for (k1=1; k1<= m ; k1 ++) { /* plot [100000000000000000000:-100000000000000000000] "mysbiaspar/vplrmysbiaspar.txt to check */
+ 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\
+set ter png small size 320, 240\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)");
+ else fprintf(ficgp," \%%*lf (\%%*lf)");
}
- 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);
+ fprintf(ficgp,"\" t\"Period (stable) prevalence\" w l lt 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,\"%s\" every :::%d::%d u 1:($2-1.96*$3) \"\%%lf",subdirf2(fileres,"vpl"),k1-1,k1-1);
+ fprintf(ficgp,"\" t\"95\%% CI\" w l lt 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,\"%s\" every :::%d::%d u 1:($%d) t\"Observed prevalence \" w l 2",subdirf2(fileres,"p"),k1-1,k1-1,2+4*(cpt-1));
+ fprintf(ficgp,"\" t\"\" w l lt 1,\"%s\" every :::%d::%d u 1:($%d) t\"Observed prevalence \" w l lt 2",subdirf2(fileres,"p"),k1-1,k1-1,2+4*(cpt-1));
}
}
/*2 eme*/
for (k1=1; k1<= m ; 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);
+ fprintf(ficgp,"set ylabel \"Years\" \nset ter png small size 320, 240\nplot [%.f:%.f] ",ageminpar,fage);
for (i=1; i<= nlstate+1 ; i ++) {
k=2*i;
@@ -3203,14 +4007,14 @@ plot [%.f:%.f] \"%s\" every :::%d::%d u
if (j==i) fprintf(ficgp," \%%lf (\%%lf)");
else fprintf(ficgp," \%%*lf (\%%*lf)");
}
- fprintf(ficgp,"\" t\"\" w l 0,");
+ fprintf(ficgp,"\" t\"\" w l lt 0,");
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)");
}
- if (i== (nlstate+1)) fprintf(ficgp,"\" t\"\" w l 0");
- else fprintf(ficgp,"\" t\"\" w l 0,");
+ if (i== (nlstate+1)) fprintf(ficgp,"\" t\"\" w l lt 0");
+ else fprintf(ficgp,"\" t\"\" w l lt 0,");
}
}
@@ -3218,10 +4022,10 @@ plot [%.f:%.f] \"%s\" every :::%d::%d u
for (k1=1; k1<= m ; k1 ++) {
for (cpt=1; cpt<= nlstate ; cpt ++) {
- k=2+nlstate*(2*cpt-2);
+ /* k=2+nlstate*(2*cpt-2); */
+ k=2+(nlstate+1)*(cpt-1);
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\
+ fprintf(ficgp,"set ter png small size 320, 240\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) ");
@@ -3232,9 +4036,11 @@ plot [%.f:%.f] \"%s\" every :::%d::%d u
*/
for (i=1; i< nlstate ; i ++) {
- 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);
+ fprintf(ficgp," ,\"%s\" every :::%d::%d u 1:%d t \"e%d%d\" w l",subdirf2(fileres,"e"),k1-1,k1-1,k+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);*/
}
+ fprintf(ficgp," ,\"%s\" every :::%d::%d u 1:%d t \"e%d.\" w l",subdirf2(fileres,"e"),k1-1,k1-1,k+nlstate,cpt);
}
}
@@ -3242,9 +4048,10 @@ plot [%.f:%.f] \"%s\" every :::%d::%d u
for (k1=1; k1<= m ; k1 ++) {
for (cpt=1; cpt<=nlstate ; cpt ++) {
k=3;
- fprintf(ficgp,"\nset out \"%s%d%d.png\" \n",subdirf2(optionfilefiname,"p"),cpt,k1);
+ fprintf(ficgp,"\nset out \"%s%d_%d.png\" \n",subdirf2(optionfilefiname,"p"),cpt,k1);
fprintf(ficgp,"set xlabel \"Age\" \nset ylabel \"Probability\" \n\
-set ter png small\nset size 0.65,0.65\n\
+set ter png small size 320, 240\n\
+unset log y\n\
plot [%.f:%.f] \"%s\" u ($1==%d ? ($3):1/0):($%d/($%d",ageminpar,agemaxpar,subdirf2(fileres,"pij"),k1,k+cpt+1,k+1);
for (i=1; i< nlstate ; i ++)
@@ -3273,15 +4080,15 @@ plot [%.f:%.f] \"%s\" u ($1==%d ? ($3):1
}
}
}
-
+ /*goto avoid;*/
for(ng=1; ng<=2;ng++){ /* Number of graphics: first is probabilities second is incidence per year*/
for(jk=1; jk <=m; jk++) {
- fprintf(ficgp,"\nset out \"%s%d%d.png\" \n",subdirf2(optionfilefiname,"pe"),jk,ng);
+ fprintf(ficgp,"\nset out \"%s%d_%d.png\" \n",subdirf2(optionfilefiname,"pe"),jk,ng);
if (ng==2)
fprintf(ficgp,"\nset ylabel \"Quasi-incidence per year\"\n");
else
fprintf(ficgp,"\nset title \"Probability\"\n");
- fprintf(ficgp,"\nset ter png small\nset size 0.65,0.65\nset log y\nplot [%.f:%.f] ",ageminpar,agemaxpar);
+ fprintf(ficgp,"\nset ter png small size 320, 240\nset log y\nplot [%.f:%.f] ",ageminpar,agemaxpar);
i=1;
for(k2=1; k2<=nlstate; k2++) {
k3=i;
@@ -3291,13 +4098,13 @@ plot [%.f:%.f] \"%s\" u ($1==%d ? ($3):1
fprintf(ficgp," %f*exp(p%d+p%d*x",YEARM/stepm,i,i+1);
else
fprintf(ficgp," exp(p%d+p%d*x",i,i+1);
- ij=1;
+ ij=1;/* To be checked else nbcode[0][0] wrong */
for(j=3; j <=ncovmodel; j++) {
- if(((j-2)==Tage[ij]) &&(ij <=cptcovage)) {
- fprintf(ficgp,"+p%d*%d*x",i+j-1,nbcode[Tvar[j-2]][codtab[jk][Tvar[j-2]]]);
- ij++;
- }
- else
+ /* if(((j-2)==Tage[ij]) &&(ij <=cptcovage)) { /\* Bug valgrind *\/ */
+ /* /\*fprintf(ficgp,"+p%d*%d*x",i+j-1,nbcode[Tvar[j-2]][codtab[jk][Tvar[j-2]]]);*\/ */
+ /* ij++; */
+ /* } */
+ /* else */
fprintf(ficgp,"+p%d*%d",i+j-1,nbcode[Tvar[j-2]][codtab[jk][j-2]]);
}
fprintf(ficgp,")/(1");
@@ -3306,11 +4113,11 @@ plot [%.f:%.f] \"%s\" u ($1==%d ? ($3):1
fprintf(ficgp,"+exp(p%d+p%d*x",k3+(k1-1)*ncovmodel,k3+(k1-1)*ncovmodel+1);
ij=1;
for(j=3; j <=ncovmodel; j++){
- if(((j-2)==Tage[ij]) &&(ij <=cptcovage)) {
- fprintf(ficgp,"+p%d*%d*x",k3+(k1-1)*ncovmodel+1+j-2,nbcode[Tvar[j-2]][codtab[jk][Tvar[j-2]]]);
- ij++;
- }
- else
+ /* if(((j-2)==Tage[ij]) &&(ij <=cptcovage)) { */
+ /* fprintf(ficgp,"+p%d*%d*x",k3+(k1-1)*ncovmodel+1+j-2,nbcode[Tvar[j-2]][codtab[jk][Tvar[j-2]]]); */
+ /* ij++; */
+ /* } */
+ /* else */
fprintf(ficgp,"+p%d*%d",k3+(k1-1)*ncovmodel+1+j-2,nbcode[Tvar[j-2]][codtab[jk][j-2]]);
}
fprintf(ficgp,")");
@@ -3323,6 +4130,7 @@ plot [%.f:%.f] \"%s\" u ($1==%d ? ($3):1
} /* end k2 */
} /* end jk */
} /* end ng */
+ avoid:
fflush(ficgp);
} /* end gnuplot */
@@ -3663,9 +4471,14 @@ int fileappend(FILE *fichier, char *opti
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;
@@ -3779,108 +4592,720 @@ void prwizard(int ncovmodel, int nlstate
} /* end k*/
} /*end j */
} /* end i */
- }
+ } /* end itimes */
} /* end of prwizard */
+/******************* Gompertz Likelihood ******************************/
+double gompertz(double x[])
+{
+ double A,B,L=0.0,sump=0.,num=0.;
+ int i,n=0; /* n is the size of the sample */
-/***********************************************/
-/**************** Main Program *****************/
-/***********************************************/
+ for (i=0;i<=imx-1 ; i++) {
+ sump=sump+weight[i];
+ /* sump=sump+1;*/
+ num=num+1;
+ }
+
+
+ /* for (i=0; i<=imx; i++)
+ if (wav[i]>0) printf("i=%d ageex=%lf agecens=%lf agedc=%lf cens=%d %d\n" ,i,ageexmed[i],agecens[i],agedc[i],cens[i],wav[i]);*/
-int main(int argc, char *argv[])
-{
- int movingaverage(double ***probs, double bage,double fage, double ***mobaverage, int mobilav);
- int i,j, k, n=MAXN,iter,m,size=100,cptcode, cptcod;
- int jj, imk;
- 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;
+ for (i=1;i<=imx ; i++)
+ {
+ if (cens[i] == 1 && wav[i]>1)
+ A=-x[1]/(x[2])*(exp(x[2]*(agecens[i]-agegomp))-exp(x[2]*(ageexmed[i]-agegomp)));
+
+ if (cens[i] == 0 && wav[i]>1)
+ A=-x[1]/(x[2])*(exp(x[2]*(agedc[i]-agegomp))-exp(x[2]*(ageexmed[i]-agegomp)))
+ +log(x[1]/YEARM)+x[2]*(agedc[i]-agegomp)+log(YEARM);
+
+ /*if (wav[i] > 1 && agecens[i] > 15) {*/ /* ??? */
+ if (wav[i] > 1 ) { /* ??? */
+ L=L+A*weight[i];
+ /* printf("\ni=%d A=%f L=%lf x[1]=%lf x[2]=%lf ageex=%lf agecens=%lf cens=%d agedc=%lf weight=%lf\n",i,A,L,x[1],x[2],ageexmed[i]*12,agecens[i]*12,cens[i],agedc[i]*12,weight[i]);*/
+ }
+ }
- double fret;
- double **xi,tmp,delta;
+ /*printf("x1=%2.9f x2=%2.9f x3=%2.9f L=%f\n",x[1],x[2],x[3],L);*/
+
+ return -2*L*num/sump;
+}
- double dum; /* Dummy variable */
- double ***p3mat;
- double ***mobaverage;
- int *indx;
- char line[MAXLINE], linepar[MAXLINE];
- char path[MAXLINE],pathc[MAXLINE],pathcd[MAXLINE],pathtot[MAXLINE],model[MAXLINE];
- char pathr[MAXLINE];
- int firstobs=1, lastobs=10;
- int sdeb, sfin; /* Status at beginning and end */
- int c, h , cpt,l;
- int ju,jl, mi;
- int i1,j1, k1,k2,k3,jk,aa,bb, stepsize, ij;
- int jnais,jdc,jint4,jint1,jint2,jint3,**outcome,*tab;
- int mobilavproj=0 , prevfcast=0 ; /* moving average of prev, If prevfcast=1 prevalence projection */
- int mobilav=0,popforecast=0;
- int hstepm, nhstepm;
- double jprev1=1, mprev1=1,anprev1=2000,jprev2=1, mprev2=1,anprev2=2000;
- double jpyram=1, mpyram=1,anpyram=2000,jpyram1=1, mpyram1=1,anpyram1=2000;
+#ifdef GSL
+/******************* Gompertz_f Likelihood ******************************/
+double gompertz_f(const gsl_vector *v, void *params)
+{
+ double A,B,LL=0.0,sump=0.,num=0.;
+ double *x= (double *) v->data;
+ int i,n=0; /* n is the size of the sample */
+
+ for (i=0;i<=imx-1 ; i++) {
+ sump=sump+weight[i];
+ /* sump=sump+1;*/
+ num=num+1;
+ }
+
+
+ /* for (i=0; i<=imx; i++)
+ if (wav[i]>0) printf("i=%d ageex=%lf agecens=%lf agedc=%lf cens=%d %d\n" ,i,ageexmed[i],agecens[i],agedc[i],cens[i],wav[i]);*/
+ printf("x[0]=%lf x[1]=%lf\n",x[0],x[1]);
+ for (i=1;i<=imx ; i++)
+ {
+ if (cens[i] == 1 && wav[i]>1)
+ A=-x[0]/(x[1])*(exp(x[1]*(agecens[i]-agegomp))-exp(x[1]*(ageexmed[i]-agegomp)));
+
+ if (cens[i] == 0 && wav[i]>1)
+ A=-x[0]/(x[1])*(exp(x[1]*(agedc[i]-agegomp))-exp(x[1]*(ageexmed[i]-agegomp)))
+ +log(x[0]/YEARM)+x[1]*(agedc[i]-agegomp)+log(YEARM);
+
+ /*if (wav[i] > 1 && agecens[i] > 15) {*/ /* ??? */
+ if (wav[i] > 1 ) { /* ??? */
+ LL=LL+A*weight[i];
+ /* printf("\ni=%d A=%f L=%lf x[1]=%lf x[2]=%lf ageex=%lf agecens=%lf cens=%d agedc=%lf weight=%lf\n",i,A,L,x[1],x[2],ageexmed[i]*12,agecens[i]*12,cens[i],agedc[i]*12,weight[i]);*/
+ }
+ }
- double bage, fage, age, agelim, agebase;
- double ftolpl=FTOL;
- double **prlim;
- double *severity;
- double ***param; /* Matrix of parameters */
- double *p;
- double **matcov; /* Matrix of covariance */
- double ***delti3; /* Scale */
- double *delti; /* Scale */
- double ***eij, ***vareij;
- double **varpl; /* Variances of prevalence limits by age */
- double *epj, vepp;
- double kk1, kk2;
- double dateprev1, dateprev2,jproj1=1,mproj1=1,anproj1=2000,jproj2=1,mproj2=1,anproj2=2000;
+ /*printf("x1=%2.9f x2=%2.9f x3=%2.9f L=%f\n",x[1],x[2],x[3],L);*/
+ printf("x[0]=%lf x[1]=%lf -2*LL*num/sump=%lf\n",x[0],x[1],-2*LL*num/sump);
+
+ return -2*LL*num/sump;
+}
+#endif
- char *alph[]={"a","a","b","c","d","e"}, str[4];
+/******************* Printing html file ***********/
+void printinghtmlmort(char fileres[], char title[], char datafile[], int firstpass, \
+ int lastpass, int stepm, int weightopt, char model[],\
+ int imx, double p[],double **matcov,double agemortsup){
+ int i,k;
+ fprintf(fichtm,"
");
- char z[1]="c", occ;
+fprintf(fichtm,"Result files
\n Force of mortality. Parameters of the Gompertz fit (with confidence interval in brackets):
");
+ fprintf(fichtm," mu(age) =%lf*exp(%lf*(age-%d)) per year
",p[1],p[2],agegomp);
+ for (i=1;i<=2;i++)
+ fprintf(fichtm," p[%d] = %lf [%f ; %f]
\n",i,p[i],p[i]-2*sqrt(matcov[i][i]),p[i]+2*sqrt(matcov[i][i]));
+ fprintf(fichtm,"
");
+ fprintf(fichtm,"Life table
\n
");
- char stra[80], strb[80], strc[80], strd[80],stre[80],modelsav[80];
- char strstart[80], *strt, strtend[80];
- char *stratrunc;
- int lstra;
+ fprintf(fichtm,"\nAge l
");
+
+ for (k=agegomp;k<(agemortsup-2);k++)
+ fprintf(fichtm,"%d %.0lf %lf %.0lf %.0lf %.0lf %lf
\n",k,lsurv[k],p[1]*exp(p[2]*(k-agegomp)),(p[1]*exp(p[2]*(k-agegomp)))*lsurv[k],lpop[k],tpop[k],tpop[k]/lsurv[k]);
- long total_usecs;
- struct timeval start_time, end_time, curr_time;
- struct timezone tzp;
- extern int gettimeofday();
- struct tm tmg, tm, *gmtime(), *localtime();
- long time_value;
- extern long time();
- /* gettimeofday(&start_time, (struct timezone*)0); */ /* at first time */
- (void) gettimeofday(&start_time,&tzp);
- tm = *localtime(&start_time.tv_sec);
- tmg = *gmtime(&start_time.tv_sec);
- strcpy(strstart,asctime(&tm));
+ fflush(fichtm);
+}
-/* 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);
+/******************* Gnuplot file **************/
+void printinggnuplotmort(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;
+
+
+ /*#ifdef windows */
+ fprintf(ficgp,"cd \"%s\" \n",pathc);
+ /*#endif */
+
+
+ strcpy(dirfileres,optionfilefiname);
+ strcpy(optfileres,"vpl");
+ fprintf(ficgp,"set out \"graphmort.png\"\n ");
+ fprintf(ficgp,"set xlabel \"Age\"\n set ylabel \"Force of mortality (per year)\" \n ");
+ fprintf(ficgp, "set ter png small size 320, 240\n set log y\n");
+ /* fprintf(ficgp, "set size 0.65,0.65\n"); */
+ fprintf(ficgp,"plot [%d:100] %lf*exp(%lf*(x-%d))",agegomp,p[1],p[2],agegomp);
+
+}
+
+int readdata(char datafile[], int firstobs, int lastobs, int *imax)
+{
+
+ /*-------- data file ----------*/
+ FILE *fic;
+ char dummy[]=" ";
+ int i, j, n;
+ int linei, month, year,iout;
+ char line[MAXLINE], linetmp[MAXLINE];
+ char stra[80], strb[80];
+ char *stratrunc;
+ int lstra;
+
+
+ if((fic=fopen(datafile,"r"))==NULL) {
+ printf("Problem while opening datafile: %s\n", datafile);return 1;
+ fprintf(ficlog,"Problem while opening datafile: %s\n", datafile);return 1;
+ }
+
+ i=1;
+ linei=0;
+ while ((fgets(line, MAXLINE, fic) != NULL) &&((i >= firstobs) && (i <=lastobs))) {
+ linei=linei+1;
+ for(j=strlen(line); j>=0;j--){ /* Untabifies line */
+ if(line[j] == '\t')
+ line[j] = ' ';
+ }
+ for(j=strlen(line)-1; (line[j]==' ')||(line[j]==10)||(line[j]==13);j--){
+ ;
+ };
+ line[j+1]=0; /* Trims blanks at end of line */
+ if(line[0]=='#'){
+ fprintf(ficlog,"Comment line\n%s\n",line);
+ printf("Comment line\n%s\n",line);
+ continue;
+ }
+ trimbb(linetmp,line); /* Trims multiple blanks in line */
+ for (j=0; line[j]!='\0';j++){
+ line[j]=linetmp[j];
+ }
+
+
+ for (j=maxwav;j>=1;j--){
+ cutv(stra, strb, line, ' ');
+ if(strb[0]=='.') { /* Missing status */
+ lval=-1;
+ }else{
+ errno=0;
+ lval=strtol(strb,&endptr,10);
+ /* if (errno == ERANGE && (lval == LONG_MAX || lval == LONG_MIN))*/
+ if( strb[0]=='\0' || (*endptr != '\0')){
+ printf("Error reading data around '%s' at line number %d for individual %d, '%s'\nShould be a status of wave %d. Setting maxwav=%d might be wrong. Exiting.\n", strb, linei,i,line,j,maxwav);
+ fprintf(ficlog,"Error reading data around '%s' at line number %d for individual %d, '%s'\nShould be a status of wave %d. Setting maxwav=%d might be wrong. Exiting.\n", strb, linei,i,line,j,maxwav);fflush(ficlog);
+ return 1;
+ }
+ }
+ s[j][i]=lval;
+
+ strcpy(line,stra);
+ cutv(stra, strb,line,' ');
+ if(iout=sscanf(strb,"%d/%d",&month, &year) != 0){
+ }
+ else if(iout=sscanf(strb,"%s.",dummy) != 0){
+ month=99;
+ year=9999;
+ }else{
+ printf("Error reading data around '%s' at line number %d for individual %d, '%s'\nShould be a date of interview (mm/yyyy or .) at wave %d. Exiting.\n",strb, linei,i, line,j);
+ fprintf(ficlog,"Error reading data around '%s' at line number %d for individual %d, '%s'\nShould be a date of interview (mm/yyyy or .) at wave %d. Exiting.\n",strb, linei,i, line,j);fflush(ficlog);
+ return 1;
+ }
+ anint[j][i]= (double) year;
+ mint[j][i]= (double)month;
+ strcpy(line,stra);
+ } /* ENd Waves */
+
+ cutv(stra, strb,line,' ');
+ if(iout=sscanf(strb,"%d/%d",&month, &year) != 0){
+ }
+ else if(iout=sscanf(strb,"%s.",dummy) != 0){
+ month=99;
+ year=9999;
+ }else{
+ printf("Error reading data around '%s' at line number %d for individual %d, '%s'\nShould be a date of death (mm/yyyy or .). Exiting.\n",strb, linei,i,line);
+ fprintf(ficlog,"Error reading data around '%s' at line number %d for individual %d, '%s'\nShould be a date of death (mm/yyyy or .). Exiting.\n",strb, linei,i,line);fflush(ficlog);
+ return 1;
+ }
+ andc[i]=(double) year;
+ moisdc[i]=(double) month;
+ strcpy(line,stra);
+
+ cutv(stra, strb,line,' ');
+ if(iout=sscanf(strb,"%d/%d",&month, &year) != 0){
+ }
+ else if(iout=sscanf(strb,"%s.", dummy) != 0){
+ month=99;
+ year=9999;
+ }else{
+ printf("Error reading data around '%s' at line number %d for individual %d, '%s'\nShould be a date of birth (mm/yyyy or .). Exiting.\n",strb, linei,i,line);
+ fprintf(ficlog,"Error reading data around '%s' at line number %d for individual %d, '%s'\nShould be a date of birth (mm/yyyy or .). Exiting.\n",strb, linei,i,line);fflush(ficlog);
+ return 1;
+ }
+ if (year==9999) {
+ printf("Error reading data around '%s' at line number %d for individual %d, '%s'\nShould be a date of birth (mm/yyyy) but at least the year of birth should be given. Exiting.\n",strb, linei,i,line);
+ fprintf(ficlog,"Error reading data around '%s' at line number %d for individual %d, '%s'\nShould be a date of birth (mm/yyyy) but at least the year of birth should be given. Exiting.\n",strb, linei,i,line);fflush(ficlog);
+ return 1;
+
+ }
+ annais[i]=(double)(year);
+ moisnais[i]=(double)(month);
+ strcpy(line,stra);
+
+ cutv(stra, strb,line,' ');
+ errno=0;
+ dval=strtod(strb,&endptr);
+ if( strb[0]=='\0' || (*endptr != '\0')){
+ printf("Error reading data around '%f' at line number %d, \"%s\" for individual %d\nShould be a weight. Exiting.\n",dval, i,line,linei);
+ fprintf(ficlog,"Error reading data around '%f' at line number %d, \"%s\" for individual %d\nShould be a weight. Exiting.\n",dval, i,line,linei);
+ fflush(ficlog);
+ return 1;
+ }
+ weight[i]=dval;
+ strcpy(line,stra);
+
+ for (j=ncovcol;j>=1;j--){
+ cutv(stra, strb,line,' ');
+ if(strb[0]=='.') { /* Missing status */
+ lval=-1;
+ }else{
+ errno=0;
+ lval=strtol(strb,&endptr,10);
+ if( strb[0]=='\0' || (*endptr != '\0')){
+ printf("Error reading data around '%ld' at line number %d for individual %d, '%s'\nShould be a covariate value (=0 for the reference or 1 for alternative). Exiting.\n",lval, linei,i, line);
+ fprintf(ficlog,"Error reading data around '%ld' at line number %d for individual %d, '%s'\nShould be a covariate value (=0 for the reference or 1 for alternative). Exiting.\n",lval, linei,i, line);fflush(ficlog);
+ return 1;
+ }
+ }
+ if(lval <-1 || lval >1){
+ printf("Error reading data around '%ld' at line number %d for individual %d, '%s'\n \
+ Should be a value of %d(nth) covariate (0 should be the value for the reference and 1\n \
+ for the alternative. IMaCh does not build design variables automatically, do it yourself.\n \
+ For example, for multinomial values like 1, 2 and 3,\n \
+ build V1=0 V2=0 for the reference value (1),\n \
+ V1=1 V2=0 for (2) \n \
+ and V1=0 V2=1 for (3). V1=1 V2=1 should not exist and the corresponding\n \
+ output of IMaCh is often meaningless.\n \
+ Exiting.\n",lval,linei, i,line,j);
+ fprintf(ficlog,"Error reading data around '%ld' at line number %d for individual %d, '%s'\n \
+ Should be a value of %d(nth) covariate (0 should be the value for the reference and 1\n \
+ for the alternative. IMaCh does not build design variables automatically, do it yourself.\n \
+ For example, for multinomial values like 1, 2 and 3,\n \
+ build V1=0 V2=0 for the reference value (1),\n \
+ V1=1 V2=0 for (2) \n \
+ and V1=0 V2=1 for (3). V1=1 V2=1 should not exist and the corresponding\n \
+ output of IMaCh is often meaningless.\n \
+ Exiting.\n",lval,linei, i,line,j);fflush(ficlog);
+ return 1;
+ }
+ covar[j][i]=(double)(lval);
+ strcpy(line,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("%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;
+ } /* End loop reading data */
+
+ *imax=i-1; /* Number of individuals */
+ fclose(fic);
+
+ return (0);
+ endread:
+ printf("Exiting readdata: ");
+ fclose(fic);
+ return (1);
+
+
+
+}
+void removespace(char *str) {
+ char *p1 = str, *p2 = str;
+ do
+ while (*p2 == ' ')
+ p2++;
+ while (*p1++ = *p2++);
+}
+
+int decodemodel ( char model[], int lastobs) /**< This routine decode the model and returns:
+ * Model V1+V2+V3+V8+V7*V8+V5*V6+V8*age+V3*age
+ * - cptcovt total number of covariates of the model nbocc(+)+1 = 8
+ * - cptcovn or number of covariates k of the models excluding age*products =6
+ * - cptcovage number of covariates with age*products =2
+ * - cptcovs number of simple covariates
+ * - Tvar[k] is the id of the kth covariate Tvar[1]@12 {1, 2, 3, 8, 10, 11, 8, 3, 7, 8, 5, 6}, thus Tvar[5=V7*V8]=10
+ * which is a new column after the 9 (ncovcol) variables.
+ * - if k is a product Vn*Vm covar[k][i] is filled with correct values for each individual
+ * - Tprod[l] gives the kth covariates of the product Vn*Vm l=1 to cptcovprod-cptcovage
+ * Tprod[1]@2 {5, 6}: position of first product V7*V8 is 5, and second V5*V6 is 6.
+ * - Tvard[k] p Tvard[1][1]@4 {7, 8, 5, 6} for V7*V8 and V5*V6 .
+ */
+{
+ int i, j, k, ks;
+ int i1, j1, k1, k2;
+ char modelsav[80];
+ char stra[80], strb[80], strc[80], strd[80],stre[80];
+
+ /*removespace(model);*/
+ if (strlen(model) >1){ /* If there is at least 1 covariate */
+ j=0, j1=0, k1=0, k2=-1, ks=0, cptcovn=0;
+ j=nbocc(model,'+'); /**< j=Number of '+' */
+ j1=nbocc(model,'*'); /**< j1=Number of '*' */
+ cptcovs=j+1-j1; /**< Number of simple covariates V1+V2*age+V3 +V3*V4=> V1 + V3 =2 */
+ cptcovt= j+1; /* Number of total covariates in the model V1 + V2*age+ V3 + V3*V4=> 4*/
+ /* including age products which are counted in cptcovage.
+ /* but the covariates which are products must be treated separately: ncovn=4- 2=2 (V1+V3). */
+ cptcovprod=j1; /**< Number of products V1*V2 +v3*age = 2 */
+ cptcovprodnoage=0; /**< Number of covariate products without age: V3*V4 =1 */
+ strcpy(modelsav,model);
+ if (strstr(model,"AGE") !=0){
+ printf("Error. AGE must be in lower case 'age' model=%s ",model);
+ fprintf(ficlog,"Error. AGE must be in lower case model=%s ",model);fflush(ficlog);
+ return 1;
+ }
+ if (strstr(model,"v") !=0){
+ printf("Error. 'v' must be in upper case 'V' model=%s ",model);
+ fprintf(ficlog,"Error. 'v' must be in upper case model=%s ",model);fflush(ficlog);
+ return 1;
+ }
+
+ /* Design
+ * V1 V2 V3 V4 V5 V6 V7 V8 V9 Weight
+ * < ncovcol=8 >
+ * Model V2 + V1 + V3*age + V3 + V5*V6 + V7*V8 + V8*age + V8
+ * k= 1 2 3 4 5 6 7 8
+ * cptcovn number of covariates (not including constant and age ) = # of + plus 1 = 7+1=8
+ * covar[k,i], value of kth covariate if not including age for individual i:
+ * covar[1][i]= (V2), covar[4][i]=(V3), covar[8][i]=(V8)
+ * Tvar[k] # of the kth covariate: Tvar[1]=2 Tvar[4]=3 Tvar[8]=8
+ * if multiplied by age: V3*age Tvar[3=V3*age]=3 (V3) Tvar[7]=8 and
+ * Tage[++cptcovage]=k
+ * if products, new covar are created after ncovcol with k1
+ * Tvar[k]=ncovcol+k1; # of the kth covariate product: Tvar[5]=ncovcol+1=10 Tvar[6]=ncovcol+1=11
+ * Tprod[k1]=k; Tprod[1]=5 Tprod[2]= 6; gives the position of the k1th product
+ * Tvard[k1][1]=m Tvard[k1][2]=m; Tvard[1][1]=5 (V5) Tvard[1][2]=6 Tvard[2][1]=7 (V7) Tvard[2][2]=8
+ * Tvar[cptcovn+k2]=Tvard[k1][1];Tvar[cptcovn+k2+1]=Tvard[k1][2];
+ * Tvar[8+1]=5;Tvar[8+2]=6;Tvar[8+3]=7;Tvar[8+4]=8 inverted
+ * V1 V2 V3 V4 V5 V6 V7 V8 V9 V10 V11
+ * < ncovcol=8 >
+ * Model V2 + V1 + V3*age + V3 + V5*V6 + V7*V8 + V8*age + V8 d1 d1 d2 d2
+ * k= 1 2 3 4 5 6 7 8 9 10 11 12
+ * Tvar[k]= 2 1 3 3 10 11 8 8 5 6 7 8
+ * p Tvar[1]@12={2, 1, 3, 3, 11, 10, 8, 8, 7, 8, 5, 6}
+ * p Tprod[1]@2={ 6, 5}
+ *p Tvard[1][1]@4= {7, 8, 5, 6}
+ * covar[k][i]= V2 V1 ? V3 V5*V6? V7*V8? ? V8
+ * cov[Tage[kk]+2]=covar[Tvar[Tage[kk]]][i]*cov[2];
+ *How to reorganize?
+ * Model V1 + V2 + V3 + V8 + V5*V6 + V7*V8 + V3*age + V8*age
+ * Tvars {2, 1, 3, 3, 11, 10, 8, 8, 7, 8, 5, 6}
+ * {2, 1, 4, 8, 5, 6, 3, 7}
+ * Struct []
+ */
+
+ /* This loop fills the array Tvar from the string 'model'.*/
+ /* j is the number of + signs in the model V1+V2+V3 j=2 i=3 to 1 */
+ /* modelsav=V2+V1+V4+age*V3 strb=age*V3 stra=V2+V1+V4 */
+ /* k=4 (age*V3) Tvar[k=4]= 3 (from V3) Tage[cptcovage=1]=4 */
+ /* k=3 V4 Tvar[k=3]= 4 (from V4) */
+ /* k=2 V1 Tvar[k=2]= 1 (from V1) */
+ /* k=1 Tvar[1]=2 (from V2) */
+ /* k=5 Tvar[5] */
+ /* for (k=1; k<=cptcovn;k++) { */
+ /* cov[2+k]=nbcode[Tvar[k]][codtab[ij][Tvar[k]]]; */
+ /* } */
+ /* for (k=1; k<=cptcovage;k++) cov[2+Tage[k]]=cov[2+Tage[k]]*cov[2]; */
+ /*
+ * Treating invertedly V2+V1+V3*age+V2*V4 is as if written V2*V4 +V3*age + V1 + V2 */
+ for(k=cptcovt; k>=1;k--) /**< Number of covariates */
+ Tvar[k]=0;
+ cptcovage=0;
+ for(k=1; k<=cptcovt;k++){ /* Loop on total covariates of the model */
+ cutl(stra,strb,modelsav,'+'); /* keeps in strb after the first '+'
+ modelsav==V2+V1+V4+V3*age strb=V3*age stra=V2+V1+V4 */
+ if (nbocc(modelsav,'+')==0) strcpy(strb,modelsav); /* and analyzes it */
+ /* printf("i=%d a=%s b=%s sav=%s\n",i, stra,strb,modelsav);*/
+ /*scanf("%d",i);*/
+ if (strchr(strb,'*')) { /**< Model includes a product V2+V1+V4+V3*age strb=V3*age */
+ cutl(strc,strd,strb,'*'); /**< strd*strc Vm*Vn: strb=V3*age(input) strc=age strd=V3 ; V3*V2 strc=V2, strd=V3 */
+ if (strcmp(strc,"age")==0) { /**< Model includes age: Vn*age */
+ /* covar is not filled and then is empty */
+ cptcovprod--;
+ cutl(stre,strb,strd,'V'); /* strd=V3(input): stre="3" */
+ Tvar[k]=atoi(stre); /* V2+V1+V4+V3*age Tvar[4]=3 ; V1+V2*age Tvar[2]=2 */
+ cptcovage++; /* Sums the number of covariates which include age as a product */
+ Tage[cptcovage]=k; /* Tage[1] = 4 */
+ /*printf("stre=%s ", stre);*/
+ } else if (strcmp(strd,"age")==0) { /* or age*Vn */
+ cptcovprod--;
+ cutl(stre,strb,strc,'V');
+ Tvar[k]=atoi(stre);
+ cptcovage++;
+ Tage[cptcovage]=k;
+ } else { /* Age is not in the model product V2+V1+V1*V4+V3*age+V3*V2 strb=V3*V2*/
+ /* loops on k1=1 (V3*V2) and k1=2 V4*V3 */
+ cptcovn++;
+ cptcovprodnoage++;k1++;
+ cutl(stre,strb,strc,'V'); /* strc= Vn, stre is n; strb=V3*V2 stre=3 strc=*/
+ Tvar[k]=ncovcol+k1; /* For model-covariate k tells which data-covariate to use but
+ because this model-covariate is a construction we invent a new column
+ ncovcol + k1
+ If already ncovcol=4 and model=V2+V1+V1*V4+age*V3+V3*V2
+ Tvar[3=V1*V4]=4+1 Tvar[5=V3*V2]=4 + 2= 6, etc */
+ cutl(strc,strb,strd,'V'); /* strd was Vm, strc is m */
+ Tprod[k1]=k; /* Tprod[1]=3(=V1*V4) for V2+V1+V1*V4+age*V3+V3*V2 */
+ Tvard[k1][1] =atoi(strc); /* m 1 for V1*/
+ Tvard[k1][2] =atoi(stre); /* n 4 for V4*/
+ k2=k2+2;
+ Tvar[cptcovt+k2]=Tvard[k1][1]; /* Tvar[(cptcovt=4+k2=1)=5]= 1 (V1) */
+ Tvar[cptcovt+k2+1]=Tvard[k1][2]; /* Tvar[(cptcovt=4+(k2=1)+1)=6]= 4 (V4) */
+ for (i=1; i<=lastobs;i++){
+ /* Computes the new covariate which is a product of
+ covar[n][i]* covar[m][i] and stores it at ncovol+k1 May not be defined */
+ covar[ncovcol+k1][i]=covar[atoi(stre)][i]*covar[atoi(strc)][i];
+ }
+ } /* End age is not in the model */
+ } /* End if model includes a product */
+ else { /* no more sum */
+ /*printf("d=%s c=%s b=%s\n", strd,strc,strb);*/
+ /* scanf("%d",i);*/
+ cutl(strd,strc,strb,'V');
+ ks++; /**< Number of simple covariates */
+ cptcovn++;
+ Tvar[k]=atoi(strd);
+ }
+ strcpy(modelsav,stra); /* modelsav=V2+V1+V4 stra=V2+V1+V4 */
+ /*printf("a=%s b=%s sav=%s\n", stra,strb,modelsav);
+ scanf("%d",i);*/
+ } /* end of loop + */
+ } /* end model */
+
+ /*The number n of Vn is stored in Tvar. cptcovage =number of age covariate. Tage gives the position of age. cptcovprod= number of products.
+ If model=V1+V1*age then Tvar[1]=1 Tvar[2]=1 cptcovage=1 Tage[1]=2 cptcovprod=0*/
+
+ /* printf("tvar1=%d tvar2=%d tvar3=%d cptcovage=%d Tage=%d",Tvar[1],Tvar[2],Tvar[3],cptcovage,Tage[1]);
+ printf("cptcovprod=%d ", cptcovprod);
+ fprintf(ficlog,"cptcovprod=%d ", cptcovprod);
+
+ scanf("%d ",i);*/
+
+
+ return (0); /* with covar[new additional covariate if product] and Tage if age */
+ endread:
+ printf("Exiting decodemodel: ");
+ return (1);
+}
+
+calandcheckages(int imx, int maxwav, double *agemin, double *agemax, int *nberr, int *nbwarn )
+{
+ int i, m;
+
+ for (i=1; i<=imx; i++) {
+ for(m=2; (m<= maxwav); m++) {
+ if (((int)mint[m][i]== 99) && (s[m][i] <= nlstate)){
+ anint[m][i]=9999;
+ 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=firstpass; (m<= lastpass); m++){
+ if(s[m][i] >0 || s[m][i]==-2 || s[m][i]==-4 || s[m][i]==-5){
+ if (s[m][i] >= nlstate+1) {
+ if(agedc[i]>0)
+ 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 ((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((int)mint[m][i]==99 || (int)anint[m][i]==9999)
+ agev[m][i]=1;
+ else if(agev[m][i] < *agemin){
+ *agemin=agev[m][i];
+ printf(" Min anint[%d][%d]=%.2f annais[%d]=%.2f, agemin=%.2f\n",m,i,anint[m][i], i,annais[i], *agemin);
+ }
+ else if(agev[m][i] >*agemax){
+ *agemax=agev[m][i];
+ printf(" Max anint[%d][%d]=%.0f annais[%d]=%.0f, agemax=%.2f\n",m,i,anint[m][i], i,annais[i], *agemax);
+ }
+ /*agev[m][i]=anint[m][i]-annais[i];*/
+ /* agev[m][i] = age[i]+2*m;*/
+ }
+ else { /* =9 */
+ agev[m][i]=1;
+ s[m][i]=-1;
+ }
+ }
+ else /*= 0 Unknown */
+ agev[m][i]=1;
+ }
+
+ }
+ for (i=1; i<=imx; i++) {
+ for(m=firstpass; (m<=lastpass); m++){
+ if (s[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);
+ return 1;
+ }
+ }
+ }
+
+ /*for (i=1; i<=imx; i++){
+ for (m=firstpass; (m
%s \
+
\n\
+Title=%s
Datafile=%s Firstpass=%d Lastpass=%d Stepm=%d Weight=%d Model=%s
\n",\
+ optionfilehtmcov,version,fullversion,title,datafile,firstpass,lastpass,stepm, weightopt, model);
}
- fprintf(fichtm,"\n
%s \
+ fprintf(fichtm,"\n
%s \
\n\
Title=%s
Datafile=%s Firstpass=%d Lastpass=%d Stepm=%d Weight=%d Model=%s
\n\
\n\
\
\n",\
- fileres,version,fullversion,title,datafile,firstpass,lastpass,stepm, weightopt,\
- model,fileres,fileres,\
+ optionfilehtm,version,fullversion,title,datafile,firstpass,lastpass,stepm, weightopt, model,\
+ optionfilefiname,optionfilext,optionfilefiname,optionfilext,\
+ fileres,fileres,\
filelog,filelog,optionfilegnuplot,optionfilegnuplot,strstart);
- /*fclose(fichtm);*/
fflush(fichtm);
strcpy(pathr,path);
strcat(pathr,optionfilefiname);
chdir(optionfilefiname); /* Move to directory named optionfile */
- strcpy(lfileres,fileres);
- strcat(lfileres,"/");
- strcat(lfileres,optionfilefiname);
- /* replace(pathc,path);*/
-
/* 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);
+ freqsummary(fileres, agemin, agemax, s, agev, nlstate, imx,Tvaraff,nbcode, ncodemax,mint,anint,strstart);
fprintf(fichtm,"\n");
fprintf(fichtm,"Parameter files
\n\
+ - Parameter file: %s.%s
\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
Total number of observations=%d
\n\
@@ -4510,564 +5845,824 @@ Interval (in months) between two waves:
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);
- }
+
+ if (mle==-3){
+ ximort=matrix(1,NDIM,1,NDIM);
+/* ximort=gsl_matrix_alloc(1,NDIM,1,NDIM); */
+ cens=ivector(1,n);
+ ageexmed=vector(1,n);
+ agecens=vector(1,n);
+ dcwave=ivector(1,n);
+
+ for (i=1; i<=imx; i++){
+ dcwave[i]=-1;
+ for (m=firstpass; m<=lastpass; m++)
+ if (s[m][i]>nlstate) {
+ dcwave[i]=m;
+ /* printf("i=%d j=%d s=%d dcwave=%d\n",i,j, s[j][i],dcwave[i]);*/
+ break;
+ }
+ }
+
+ for (i=1; i<=imx; i++) {
+ if (wav[i]>0){
+ ageexmed[i]=agev[mw[1][i]][i];
+ j=wav[i];
+ agecens[i]=1.;
+
+ if (ageexmed[i]> 1 && wav[i] > 0){
+ agecens[i]=agev[mw[j][i]][i];
+ cens[i]= 1;
+ }else if (ageexmed[i]< 1)
+ cens[i]= -1;
+ if (agedc[i]< AGESUP && agedc[i]>1 && dcwave[i]>firstpass && dcwave[i]<=lastpass)
+ cens[i]=0 ;
+ }
+ else cens[i]=-1;
+ }
+
+ for (i=1;i<=NDIM;i++) {
+ for (j=1;j<=NDIM;j++)
+ ximort[i][j]=(i == j ? 1.0 : 0.0);
+ }
+
+ /*p[1]=0.0268; p[NDIM]=0.083;*/
+ /*printf("%lf %lf", p[1], p[2]);*/
+
+
+#ifdef GSL
+ printf("GSL optimization\n"); fprintf(ficlog,"Powell\n");
+#elsedef
+ printf("Powell\n"); fprintf(ficlog,"Powell\n");
+#endif
+ strcpy(filerespow,"pow-mort");
+ strcat(filerespow,fileres);
+ if((ficrespow=fopen(filerespow,"w"))==NULL) {
+ printf("Problem with resultfile: %s\n", filerespow);
+ fprintf(ficlog,"Problem with resultfile: %s\n", filerespow);
+ }
+#ifdef GSL
+ fprintf(ficrespow,"# GSL optimization\n# iter -2*LL");
+#elsedef
+ fprintf(ficrespow,"# Powell\n# iter -2*LL");
+#endif
+ /* 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");
+#ifdef GSL
+ /* gsl starts here */
+ T = gsl_multimin_fminimizer_nmsimplex;
+ gsl_multimin_fminimizer *sfm = NULL;
+ gsl_vector *ss, *x;
+ gsl_multimin_function minex_func;
+
+ /* Initial vertex size vector */
+ ss = gsl_vector_alloc (NDIM);
+
+ if (ss == NULL){
+ GSL_ERROR_VAL ("failed to allocate space for ss", GSL_ENOMEM, 0);
+ }
+ /* Set all step sizes to 1 */
+ gsl_vector_set_all (ss, 0.001);
+
+ /* Starting point */
- /*--------- results files --------------*/
- 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);
+ x = gsl_vector_alloc (NDIM);
+
+ if (x == NULL){
+ gsl_vector_free(ss);
+ GSL_ERROR_VAL ("failed to allocate space for x", GSL_ENOMEM, 0);
+ }
+ /* Initialize method and iterate */
+ /* p[1]=0.0268; p[NDIM]=0.083; */
+/* gsl_vector_set(x, 0, 0.0268); */
+/* gsl_vector_set(x, 1, 0.083); */
+ gsl_vector_set(x, 0, p[1]);
+ gsl_vector_set(x, 1, p[2]);
+
+ minex_func.f = &gompertz_f;
+ minex_func.n = NDIM;
+ minex_func.params = (void *)&p; /* ??? */
+
+ sfm = gsl_multimin_fminimizer_alloc (T, NDIM);
+ gsl_multimin_fminimizer_set (sfm, &minex_func, x, ss);
+
+ printf("Iterations beginning .....\n\n");
+ printf("Iter. # Intercept Slope -Log Likelihood Simplex size\n");
- 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)
- {
+ iteri=0;
+ while (rval == GSL_CONTINUE){
+ iteri++;
+ status = gsl_multimin_fminimizer_iterate(sfm);
+
+ if (status) printf("error: %s\n", gsl_strerror (status));
+ fflush(0);
+
+ if (status)
+ break;
+
+ rval = gsl_multimin_test_size (gsl_multimin_fminimizer_size (sfm), 1e-6);
+ ssval = gsl_multimin_fminimizer_size (sfm);
+
+ if (rval == GSL_SUCCESS)
+ printf ("converged to a local maximum at\n");
+
+ printf("%5d ", iteri);
+ for (it = 0; it < NDIM; it++){
+ printf ("%10.5f ", gsl_vector_get (sfm->x, it));
+ }
+ printf("f() = %-10.5f ssize = %.7f\n", sfm->fval, ssval);
+ }
+
+ printf("\n\n Please note: Program should be run many times with varying starting points to detemine global maximum\n\n");
+
+ gsl_vector_free(x); /* initial values */
+ gsl_vector_free(ss); /* inital step size */
+ for (it=0; it
Local time at start %s
Local time at end %s
",strstart, strtend);
+ fprintf(fichtm,"
Local time at start %s
Local time at end %s
\n",strstart, strtend);
fclose(fichtm);
+ fprintf(fichtmcov,"
Local time at start %s
Local time at end %s
\n",strstart, strtend);
+ fclose(fichtmcov);
fclose(ficgp);
+ fclose(ficlog);
/*------ End -----------*/
- end:
-#ifdef windows
- /* chdir(pathcd);*/
-#endif
- chdir(path);
- /*system("wgnuplot graph.plt");*/
- /*system("../gp37mgw/wgnuplot graph.plt");*/
- /*system("cd ../gp37mgw");*/
- /* system("..\\gp37mgw\\wgnuplot graph.plt");*/
- strcpy(plotcmd,GNUPLOTPROGRAM);
- strcat(plotcmd," ");
- strcat(plotcmd,optionfilegnuplot);
- printf("Starting graphs with: %s",plotcmd);fflush(stdout);
- system(plotcmd);
- printf(" Wait...");
- /*#ifdef windows*/
+ printf("Before Current directory %s!\n",pathcd);
+ if(chdir(pathcd) != 0)
+ printf("Can't move to directory %s!\n",path);
+ if(getcwd(pathcd,MAXLINE) > 0)
+ printf("Current directory %s!\n",pathcd);
+ /*strcat(plotcmd,CHARSEPARATOR);*/
+ sprintf(plotcmd,"gnuplot");
+#ifndef UNIX
+ sprintf(plotcmd,"\"%sgnuplot.exe\"",pathimach);
+#endif
+ if(!stat(plotcmd,&info)){
+ printf("Error gnuplot program not found: %s\n",plotcmd);fflush(stdout);
+ if(!stat(getenv("GNUPLOTBIN"),&info)){
+ printf("Error gnuplot program not found: %s Environment GNUPLOTBIN not set.\n",plotcmd);fflush(stdout);
+ }else
+ strcpy(pplotcmd,plotcmd);
+#ifdef UNIX
+ strcpy(plotcmd,GNUPLOTPROGRAM);
+ if(!stat(plotcmd,&info)){
+ printf("Error gnuplot program not found: %s\n",plotcmd);fflush(stdout);
+ }else
+ strcpy(pplotcmd,plotcmd);
+#endif
+ }else
+ strcpy(pplotcmd,plotcmd);
+
+ sprintf(plotcmd,"%s %s",pplotcmd, optionfilegnuplot);
+ printf("Starting graphs with: %s\n",plotcmd);fflush(stdout);
+
+ if((outcmd=system(plotcmd)) != 0){
+ printf("\n 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') {
+ printf("Starting browser with: %s",optionfilehtm);fflush(stdout);
+ 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);
+ }
}