--- imach/src/imach.c 2015/04/29 09:11:15 1.187
+++ imach/src/imach.c 2015/08/18 13:32:00 1.194
@@ -1,6 +1,29 @@
-/* $Id: imach.c,v 1.187 2015/04/29 09:11:15 brouard Exp $
+/* $Id: imach.c,v 1.194 2015/08/18 13:32:00 brouard Exp $
$State: Exp $
$Log: imach.c,v $
+ Revision 1.194 2015/08/18 13:32:00 brouard
+ Summary: Adding error when the covariance matrix doesn't contain the exact number of lines required by the model line.
+
+ Revision 1.193 2015/08/04 07:17:42 brouard
+ Summary: 0.98q4
+
+ Revision 1.192 2015/07/16 16:49:02 brouard
+ Summary: Fixing some outputs
+
+ Revision 1.191 2015/07/14 10:00:33 brouard
+ Summary: Some fixes
+
+ Revision 1.190 2015/05/05 08:51:13 brouard
+ Summary: Adding digits in output parameters (7 digits instead of 6)
+
+ Fix 1+age+.
+
+ Revision 1.189 2015/04/30 14:45:16 brouard
+ Summary: 0.98q2
+
+ Revision 1.188 2015/04/30 08:27:53 brouard
+ *** empty log message ***
+
Revision 1.187 2015/04/29 09:11:15 brouard
*** empty log message ***
@@ -591,6 +614,7 @@
/* #define DEBUG */
/* #define DEBUGBRENT */
#define POWELL /* Instead of NLOPT */
+#define POWELLF1F3 /* Skip test */
/* #define POWELLORIGINAL /\* Don't use Directest to decide new direction but original Powell test *\/ */
/* #define MNBRAKORIGINAL /\* Don't use mnbrak fix *\/ */
@@ -664,6 +688,7 @@ typedef struct {
#define YEARM 12. /**< Number of months per year */
#define AGESUP 130
#define AGEBASE 40
+#define AGEOVERFLOW 1.e20
#define AGEGOMP 10 /**< Minimal age for Gompertz adjustment */
#ifdef _WIN32
#define DIRSEPARATOR '\\'
@@ -675,11 +700,11 @@ typedef struct {
#define ODIRSEPARATOR '\\'
#endif
-/* $Id: imach.c,v 1.187 2015/04/29 09:11:15 brouard Exp $ */
+/* $Id: imach.c,v 1.194 2015/08/18 13:32:00 brouard Exp $ */
/* $State: Exp $ */
-char version[]="Imach version 0.98q1, April 2015,INED-EUROREVES-Institut de longevite-Japan Society for the Promotion of Science (Grant-in-Aid for Scientific Research 25293121), Intel Software 2015";
-char fullversion[]="$Revision: 1.187 $ $Date: 2015/04/29 09:11:15 $";
+char version[]="Imach version 0.98q5, August 2015,INED-EUROREVES-Institut de longevite-Japan Society for the Promotion of Science (Grant-in-Aid for Scientific Research 25293121), Intel Software 2015";
+char fullversion[]="$Revision: 1.194 $ $Date: 2015/08/18 13:32:00 $";
char strstart[80];
char optionfilext[10], optionfilefiname[FILENAMELENGTH];
int erreur=0, nberr=0, nbwarn=0; /* Error number, number of errors number of warnings */
@@ -813,7 +838,13 @@ int estepm;
int m,nb;
long *num;
-int firstpass=0, lastpass=4,*cod, *ncodemax, *Tage,*cens;
+int firstpass=0, lastpass=4,*cod, *Tage,*cens;
+int *ncodemax; /* ncodemax[j]= Number of modalities of the j th
+ covariate for which somebody answered excluding
+ undefined. Usually 2: 0 and 1. */
+int *ncodemaxwundef; /* ncodemax[j]= Number of modalities of the j th
+ covariate for which somebody answered including
+ undefined. Usually 3: -1, 0 and 1. */
double **agev,*moisnais, *annais, *moisdc, *andc,**mint, **anint;
double **pmmij, ***probs;
double *ageexmed,*agecens;
@@ -1439,31 +1470,41 @@ values at the three points, fa, fb , and
#endif
#ifdef MNBRAKORIGINAL
#else
- if (fu > *fc) {
-#ifdef DEBUG
- printf("mnbrak4 fu > fc \n");
- fprintf(ficlog, "mnbrak4 fu > fc\n");
-#endif
- /* SHFT(u,*cx,*cx,u) /\* ie a=c, c=u and u=c; in that case, next SHFT(a,b,c,u) will give a=b=b, b=c=u, c=u=c and *\/ */
- /* SHFT(*fa,*fc,fu,*fc) /\* (b, u, c) is a bracket while test fb > fc will be fu > fc will exit *\/ */
- dum=u; /* Shifting c and u */
- u = *cx;
- *cx = dum;
- dum = fu;
- fu = *fc;
- *fc =dum;
- } else { /* end */
+/* if (fu > *fc) { */
+/* #ifdef DEBUG */
+/* printf("mnbrak4 fu > fc \n"); */
+/* fprintf(ficlog, "mnbrak4 fu > fc\n"); */
+/* #endif */
+/* /\* SHFT(u,*cx,*cx,u) /\\* ie a=c, c=u and u=c; in that case, next SHFT(a,b,c,u) will give a=b=b, b=c=u, c=u=c and *\\/ *\/ */
+/* /\* SHFT(*fa,*fc,fu,*fc) /\\* (b, u, c) is a bracket while test fb > fc will be fu > fc will exit *\\/ *\/ */
+/* dum=u; /\* Shifting c and u *\/ */
+/* u = *cx; */
+/* *cx = dum; */
+/* dum = fu; */
+/* fu = *fc; */
+/* *fc =dum; */
+/* } else { /\* end *\/ */
+/* #ifdef DEBUG */
+/* printf("mnbrak3 fu < fc \n"); */
+/* fprintf(ficlog, "mnbrak3 fu < fc\n"); */
+/* #endif */
+/* dum=u; /\* Shifting c and u *\/ */
+/* u = *cx; */
+/* *cx = dum; */
+/* dum = fu; */
+/* fu = *fc; */
+/* *fc =dum; */
+/* } */
#ifdef DEBUG
- printf("mnbrak3 fu < fc \n");
- fprintf(ficlog, "mnbrak3 fu < fc\n");
+ printf("mnbrak34 fu < or >= fc \n");
+ fprintf(ficlog, "mnbrak34 fu < fc\n");
#endif
- dum=u; /* Shifting c and u */
- u = *cx;
- *cx = dum;
- dum = fu;
- fu = *fc;
- *fc =dum;
- }
+ dum=u; /* Shifting c and u */
+ u = *cx;
+ *cx = dum;
+ dum = fu;
+ fu = *fc;
+ *fc =dum;
#endif
} else if ((*cx-u)*(u-ulim) > 0.0) { /* u is after c but before ulim */
#ifdef DEBUG
@@ -1535,10 +1576,10 @@ void linmin(double p[], double xi[], int
xicom[j]=xi[j];
}
- axs=0.0;
- xxss=1; /* 1 and using scale */
+ /* axs=0.0; */
+ /* xxss=1; /\* 1 and using scale *\/ */
xxs=1;
- do{
+ /* do{ */
ax=0.;
xx= xxs;
mnbrak(&ax,&xx,&bx,&fa,&fx,&fb,f1dim); /* Outputs: xtx[j]=pcom[j]+(*xx)*xicom[j]; fx=f(xtx[j]) */
@@ -1548,12 +1589,15 @@ void linmin(double p[], double xi[], int
/* Given input ax=axs and xx=xxs, xx might be too far from ax to get a finite f(xx) */
/* Searches on line, outputs (ax, xx, bx) such that fx < min(fa and fb) */
/* Find a bracket a,x,b in direction n=xi ie xicom, order may change. Scale is [0:xxs*xi[j]] et non plus [0:xi[j]]*/
- if (fx != fx){
- xxs=xxs/scale; /* Trying a smaller xx, closer to initial ax=0 */
- printf("\nLinmin NAN : input [axs=%lf:xxs=%lf], mnbrak outputs fx=%lf <(fb=%lf and fa=%lf) with xx=%lf in [ax=%lf:bx=%lf] \n", axs, xxs, fx,fb, fa, xx, ax, bx);
- }
- }while(fx != fx);
+ /* if (fx != fx){ */
+ /* xxs=xxs/scale; /\* Trying a smaller xx, closer to initial ax=0 *\/ */
+ /* printf("\nLinmin NAN : input [axs=%lf:xxs=%lf], mnbrak outputs fx=%lf <(fb=%lf and fa=%lf) with xx=%lf in [ax=%lf:bx=%lf] \n", axs, xxs, fx,fb, fa, xx, ax, bx); */
+ /* } */
+ /* }while(fx != fx); */
+#ifdef DEBUGLINMIN
+ printf("\nLinmin after mnbrak: ax=%12.7f xx=%12.7f bx=%12.7f fa=%12.2f fx=%12.2f fb=%12.2f\n", ax,xx,bx,fa,fx,fb);
+#endif
*fret=brent(ax,xx,bx,f1dim,TOL,&xmin); /* Giving a bracketting triplet (ax, xx, bx), find a minimum, xmin, according to f1dim, *fret(xmin),*/
/* fa = f(p[j] + ax * xi[j]), fx = f(p[j] + xx * xi[j]), fb = f(p[j] + bx * xi[j]) */
/* fmin = f(p[j] + xmin * xi[j]) */
@@ -1563,15 +1607,25 @@ void linmin(double p[], double xi[], int
printf("retour brent fret=%.12e xmin=%.12e\n",*fret,xmin);
fprintf(ficlog,"retour brent fret=%.12e xmin=%.12e\n",*fret,xmin);
#endif
+#ifdef DEBUGLINMIN
printf("linmin end ");
+#endif
for (j=1;j<=n;j++) {
- printf(" before xi[%d]=%12.8f", j,xi[j]);
+ /* printf(" before xi[%d]=%12.8f", j,xi[j]); */
xi[j] *= xmin; /* xi rescaled by xmin: if xmin=-1.237 and xi=(1,0,...,0) xi=(-1.237,0,...,0) */
- if(xxs <1.0)
- printf(" after xi[%d]=%12.8f, xmin=%12.8f, ax=%12.8f, xx=%12.8f, bx=%12.8f, xxs=%12.8f", j,xi[j], xmin, ax, xx, bx,xxs );
+ /* if(xxs <1.0) */
+ /* printf(" after xi[%d]=%12.8f, xmin=%12.8f, ax=%12.8f, xx=%12.8f, bx=%12.8f, xxs=%12.8f", j,xi[j], xmin, ax, xx, bx,xxs ); */
p[j] += xi[j]; /* Parameters values are updated accordingly */
}
- printf("\n");
+ /* printf("\n"); */
+#ifdef DEBUGLINMIN
+ printf("Comparing last *frec(xmin=%12.8f)=%12.8f from Brent and frec(0.)=%12.8f \n", xmin, *fret, (*func)(p));
+ for (j=1;j<=n;j++) {
+ printf(" xi[%d]= %12.7f p[%d]= %12.7f",j,xi[j],j,p[j]);
+ if(j % ncovmodel == 0)
+ printf("\n");
+ }
+#endif
free_vector(xicom,1,n);
free_vector(pcom,1,n);
}
@@ -1616,7 +1670,7 @@ void powell(double p[], double **xi, int
printf("\nPowell iter=%d -2*LL=%.12f %ld sec. %ld sec.",*iter,*fret, rcurr_time-rlast_time, rcurr_time-rstart_time);fflush(stdout);
fprintf(ficlog,"\nPowell iter=%d -2*LL=%.12f %ld sec. %ld sec.",*iter,*fret,rcurr_time-rlast_time, rcurr_time-rstart_time); fflush(ficlog);
/* fprintf(ficrespow,"%d %.12f %ld",*iter,*fret,curr_time.tm_sec-start_time.tm_sec); */
- for (i=1;i<=n;i++) {
+ for (i=1;i<=n;i++) {
printf(" %d %.12f",i, p[i]);
fprintf(ficlog," %d %.12lf",i, p[i]);
fprintf(ficrespow," %.12lf", p[i]);
@@ -1653,13 +1707,13 @@ void powell(double p[], double **xi, int
#endif
printf("%d",i);fflush(stdout); /* print direction (parameter) i */
fprintf(ficlog,"%d",i);fflush(ficlog);
- linmin(p,xit,n,fret,func); /* Point p[n]. xit[n] has been loaded for direction i as input. Outputs are fret(new point p) p is updated and xit rescaled */
- if (fabs(fptt-(*fret)) > del) { /* We are keeping the max gain on each of the n directions
- because that direction will be replaced unless the gain del is small
- in comparison with the 'probable' gain, mu^2, with the last average direction.
- Unless the n directions are conjugate some gain in the determinant may be obtained
- with the new direction.
- */
+ linmin(p,xit,n,fret,func); /* Point p[n]. xit[n] has been loaded for direction i as input.*/
+ /* Outputs are fret(new point p) p is updated and xit rescaled */
+ if (fabs(fptt-(*fret)) > del) { /* We are keeping the max gain on each of the n directions */
+ /* because that direction will be replaced unless the gain del is small */
+ /* in comparison with the 'probable' gain, mu^2, with the last average direction. */
+ /* Unless the n directions are conjugate some gain in the determinant may be obtained */
+ /* with the new direction. */
del=fabs(fptt-(*fret));
ibig=i;
}
@@ -1680,9 +1734,21 @@ void powell(double p[], double **xi, int
#endif
} /* end loop on each direction i */
/* Convergence test will use last linmin estimation (fret) and compare former iteration (fp) */
- /* But p and xit have been updated at the end of linmin and do not produce *fret any more! */
+ /* But p and xit have been updated at the end of linmin, *fret corresponds to new p, xit */
/* New value of last point Pn is not computed, P(n-1) */
if (2.0*fabs(fp-(*fret)) <= ftol*(fabs(fp)+fabs(*fret))) { /* Did we reach enough precision? */
+ /* We could compare with a chi^2. chisquare(0.95,ddl=1)=3.84 */
+ /* By adding age*age in a model, the new -2LL should be lower and the difference follows a */
+ /* a chisquare statistics with 1 degree. To be significant at the 95% level, it should have */
+ /* decreased of more than 3.84 */
+ /* By adding age*age and V1*age the gain (-2LL) should be more than 5.99 (ddl=2) */
+ /* By using V1+V2+V3, the gain should be 7.82, compared with basic 1+age. */
+ /* By adding 10 parameters more the gain should be 18.31 */
+
+ /* Starting the program with initial values given by a former maximization will simply change */
+ /* the scales of the directions and the directions, because the are reset to canonical directions */
+ /* Thus the first calls to linmin will give new points and better maximizations until fp-(*fret) is */
+ /* under the tolerance value. If the tolerance is very small 1.e-9, it could last long. */
#ifdef DEBUG
int k[2],l;
k[0]=1;
@@ -1712,7 +1778,7 @@ void powell(double p[], double **xi, int
free_vector(ptt,1,n);
free_vector(pt,1,n);
return;
- }
+ } /* enough precision */
if (*iter == ITMAX) nrerror("powell exceeding maximum iterations.");
for (j=1;j<=n;j++) { /* Computes the extrapolated point P_0 + 2 (P_n-P_0) */
ptt[j]=2.0*p[j]-pt[j];
@@ -1720,7 +1786,10 @@ void powell(double p[], double **xi, int
pt[j]=p[j];
}
fptt=(*func)(ptt); /* f_3 */
+#ifdef POWELLF1F3
+#else
if (fptt < fp) { /* If extrapolated point is better, decide if we keep that new direction or not */
+#endif
/* (x1 f1=fp), (x2 f2=*fret), (x3 f3=fptt), (xm fm) */
/* From x1 (P0) distance of x2 is at h and x3 is 2h */
/* Let f"(x2) be the 2nd derivative equal everywhere. */
@@ -1749,14 +1818,29 @@ void powell(double p[], double **xi, int
if (t < 0.0) { /* Then we use it for new direction */
#else
if (directest*t < 0.0) { /* Contradiction between both tests */
- printf("directest= %.12lf, t= %.12lf, f1= %.12lf,f2= %.12lf,f3= %.12lf, del= %.12lf\n",directest, t, fp,(*fret),fptt,del);
- printf("f1-2f2+f3= %.12lf, f1-f2-del= %.12lf, f1-f3= %.12lf\n",fp-2.0*(*fret)+fptt, fp -(*fret) -del, fp-fptt);
- fprintf(ficlog,"directest= %.12lf, t= %.12lf, f1= %.12lf,f2= %.12lf,f3= %.12lf, del= %.12lf\n",directest, t, fp,(*fret),fptt, del);
- fprintf(ficlog,"f1-2f2+f3= %.12lf, f1-f2-del= %.12lf, f1-f3= %.12lf\n",fp-2.0*(*fret)+fptt, fp -(*fret) -del, fp-fptt);
- }
+ printf("directest= %.12lf, t= %.12lf, f1= %.12lf,f2= %.12lf,f3= %.12lf, del= %.12lf\n",directest, t, fp,(*fret),fptt,del);
+ printf("f1-2f2+f3= %.12lf, f1-f2-del= %.12lf, f1-f3= %.12lf\n",fp-2.0*(*fret)+fptt, fp -(*fret) -del, fp-fptt);
+ fprintf(ficlog,"directest= %.12lf, t= %.12lf, f1= %.12lf,f2= %.12lf,f3= %.12lf, del= %.12lf\n",directest, t, fp,(*fret),fptt, del);
+ fprintf(ficlog,"f1-2f2+f3= %.12lf, f1-f2-del= %.12lf, f1-f3= %.12lf\n",fp-2.0*(*fret)+fptt, fp -(*fret) -del, fp-fptt);
+ }
if (directest < 0.0) { /* Then we use it for new direction */
#endif
+#ifdef DEBUGLINMIN
+ printf("Before linmin in direction P%d-P0\n",n);
+ for (j=1;j<=n;j++) {
+ printf("Before xit[%d]= %12.7f p[%d]= %12.7f",j,xit[j],j,p[j]);
+ if(j % ncovmodel == 0)
+ printf("\n");
+ }
+#endif
linmin(p,xit,n,fret,func); /* computes minimum on the extrapolated direction: changes p and rescales xit.*/
+#ifdef DEBUGLINMIN
+ for (j=1;j<=n;j++) {
+ printf("After xit[%d]= %12.7f p[%d]= %12.7f",j,xit[j],j,p[j]);
+ if(j % ncovmodel == 0)
+ printf("\n");
+ }
+#endif
for (j=1;j<=n;j++) {
xi[j][ibig]=xi[j][n]; /* Replace direction with biggest decrease by last direction n */
xi[j][n]=xit[j]; /* and this nth direction by the by the average p_0 p_n */
@@ -1774,9 +1858,12 @@ void powell(double p[], double **xi, int
printf("\n");
fprintf(ficlog,"\n");
#endif
- } /* end of t negative */
+ } /* end of t or directest negative */
+#ifdef POWELLF1F3
+#else
} /* end if (fptt < fp) */
- }
+#endif
+ } /* loop iteration */
}
/**** Prevalence limit (stable or period prevalence) ****************/
@@ -3234,11 +3321,11 @@ void tricode(int *Tvar, int **nbcode, in
cptcoveff=0;
- for (k=-1; k < maxncov; k++) Ndum[k]=0;
for (k=1; k <= maxncov; k++) ncodemax[k]=0; /* Horrible constant again replaced by NCOVMAX */
/* Loop on covariates without age and products */
for (j=1; j<=(cptcovs); j++) { /* From model V1 + V2*age+ V3 + V3*V4 keeps V1 + V3 = 2 only */
+ for (k=-1; k < maxncov; k++) Ndum[k]=0;
for (i=1; i<=imx; i++) { /* Loop on individuals: reads the data file to get the maximum value of the
modality of this covariate Vj*/
ij=(int)(covar[Tvar[j]][i]); /* ij=0 or 1 or -1. Value of the covariate Tvar[j] for individual i
@@ -3261,15 +3348,24 @@ void tricode(int *Tvar, int **nbcode, in
/* getting the maximum value of the modality of the covariate
(should be 0 or 1 now) Tvar[j]. If V=sex and male is coded 0 and
female is 1, then modmaxcovj=1.*/
- } /* end for loop on individuals */
+ } /* end for loop on individuals i */
printf(" Minimal and maximal values of %d th covariate V%d: min=%d max=%d \n", j, Tvar[j], modmincovj, modmaxcovj);
+ fprintf(ficlog," Minimal and maximal values of %d th covariate V%d: min=%d max=%d \n", j, Tvar[j], modmincovj, modmaxcovj);
cptcode=modmaxcovj;
/* Ndum[0] = frequency of 0 for model-covariate j, Ndum[1] frequency of 1 etc. */
/*for (i=0; i<=cptcode; i++) {*/
- for (i=modmincovj; i<=modmaxcovj; i++) { /* i=-1 ? 0 and 1*//* For each value of the modality of model-cov j */
- printf("Frequencies of covariates %d ie V%d with value %d: %d\n", j, Tvar[j], i, Ndum[i]);
- if( Ndum[i] != 0 ){ /* Counts if nobody answered, empty modality */
- ncodemax[j]++; /* ncodemax[j]= Number of non-null modalities of the j th covariate. */
+ for (k=modmincovj; k<=modmaxcovj; k++) { /* k=-1 ? 0 and 1*//* For each value k of the modality of model-cov j */
+ printf("Frequencies of covariates %d ie V%d with value %d: %d\n", j, Tvar[j], k, Ndum[k]);
+ fprintf(ficlog, "Frequencies of covariates %d ie V%d with value %d: %d\n", j, Tvar[j], k, Ndum[k]);
+ if( Ndum[k] != 0 ){ /* Counts if nobody answered modality k ie empty modality, we skip it and reorder */
+ if( k != -1){
+ ncodemax[j]++; /* ncodemax[j]= Number of modalities of the j th
+ covariate for which somebody answered excluding
+ undefined. Usually 2: 0 and 1. */
+ }
+ ncodemaxwundef[j]++; /* ncodemax[j]= Number of modalities of the j th
+ covariate for which somebody answered including
+ undefined. Usually 3: -1, 0 and 1. */
}
/* In fact ncodemax[j]=2 (dichotom. variables only) but it could be more for
historical reasons: 3 if coded 1, 2, 3 and 4 and Ndum[2]=0 */
@@ -3287,19 +3383,29 @@ void tricode(int *Tvar, int **nbcode, in
nbcode[Tvar[j]][2]=1;
nbcode[Tvar[j]][3]=2;
*/
- ij=1; /* ij is similar to i but can jumps over null modalities */
- for (i=modmincovj; i<=modmaxcovj; i++) { /* i= 1 to 2 for dichotomous, or from 1 to 3 */
- for (k=0; k<= cptcode; k++) { /* k=-1 ? k=0 to 1 *//* Could be 1 to 4 */
- /*recode from 0 */
- if (Ndum[k] != 0) { /* If at least one individual responded to this modality k */
- nbcode[Tvar[j]][ij]=k; /* stores the modality k in an array nbcode.
- k is a modality. If we have model=V1+V1*sex
- then: nbcode[1][1]=0 ; nbcode[1][2]=1; nbcode[2][1]=0 ; nbcode[2][2]=1; */
- ij++;
- }
- if (ij > ncodemax[j]) break;
- } /* end of loop on */
- } /* end of loop on modality */
+ ij=0; /* ij is similar to i but can jumps over null modalities */
+ for (i=modmincovj; i<=modmaxcovj; i++) { /* i= 1 to 2 for dichotomous, or from 1 to 3 or from -1 to 1*/
+ if (Ndum[i] == 0) { /* If at least one individual responded to this modality k */
+ break;
+ }
+ ij++;
+ nbcode[Tvar[j]][ij]=i; /* stores the original modality i in an array nbcode, ij modality from 1 to last non-nul modality.*/
+ cptcode = ij; /* New max modality for covar j */
+ } /* end of loop on modality i=-1 to 1 or more */
+
+ /* for (k=0; k<= cptcode; k++) { /\* k=-1 ? k=0 to 1 *\//\* Could be 1 to 4 *\//\* cptcode=modmaxcovj *\/ */
+ /* /\*recode from 0 *\/ */
+ /* k is a modality. If we have model=V1+V1*sex */
+ /* then: nbcode[1][1]=0 ; nbcode[1][2]=1; nbcode[2][1]=0 ; nbcode[2][2]=1; */
+ /* But if some modality were not used, it is recoded from 0 to a newer modmaxcovj=cptcode *\/ */
+ /* } */
+ /* /\* cptcode = ij; *\/ /\* New max modality for covar j *\/ */
+ /* if (ij > ncodemax[j]) { */
+ /* printf( " Error ij=%d > ncodemax[%d]=%d\n", ij, j, ncodemax[j]); */
+ /* fprintf(ficlog, " Error ij=%d > ncodemax[%d]=%d\n", ij, j, ncodemax[j]); */
+ /* break; */
+ /* } */
+ /* } /\* end of loop on modality k *\/ */
} /* end of loop on model-covariate j. nbcode[Tvarj][1]=0 and nbcode[Tvarj][2]=1 sets the value of covariate j*/
for (k=-1; k< maxncov; k++) Ndum[k]=0;
@@ -3310,17 +3416,18 @@ void tricode(int *Tvar, int **nbcode, in
Ndum[ij]++; /* Might be supersed V1 + V1*age */
}
- ij=1;
+ ij=0;
for (i=0; i<= maxncov-1; i++) { /* modmaxcovj is unknown here. Only Ndum[2(V2),3(age*V3), 5(V3*V2) 6(V1*V4) */
/*printf("Ndum[%d]=%d\n",i, Ndum[i]);*/
if((Ndum[i]!=0) && (i<=ncovcol)){
+ ij++;
/*printf("diff Ndum[%d]=%d\n",i, Ndum[i]);*/
Tvaraff[ij]=i; /*For printing (unclear) */
- ij++;
- }else
- Tvaraff[ij]=0;
+ }else{
+ /* Tvaraff[ij]=0; */
+ }
}
- ij--;
+ /* ij--; */
cptcoveff=ij; /*Number of total covariates*/
}
@@ -4406,12 +4513,14 @@ fprintf(fichtm," \n
- Graphs
jj1=0;
for(k1=1; k1<=m;k1++){
- for(i1=1; i1<=ncodemax[k1];i1++){
+ /* for(i1=1; i1<=ncodemax[k1];i1++){ */
jj1++;
if (cptcovn > 0) {
fprintf(fichtm,"
************ Results for covariates");
- for (cpt=1; cpt<=cptcoveff;cpt++)
+ for (cpt=1; cpt<=cptcoveff;cpt++){
fprintf(fichtm," V%d=%d ",Tvaraff[cpt],nbcode[Tvaraff[cpt]][codtab[jj1][cpt]]);
+ printf(" V%d=%d ",Tvaraff[cpt],nbcode[Tvaraff[cpt]][codtab[jj1][cpt]]);fflush(stdout);
+ }
fprintf(fichtm," ************\n
");
}
/* Pij */
@@ -4430,16 +4539,16 @@ fprintf(fichtm," \n- Graphs
fprintf(fichtm,"\n
- Life expectancy by health state (%d) at initial age and its decomposition into health expectancies in each alive state (1 to %d) : %s%d%d.png
\
",cpt,nlstate,subdirf2(optionfilefiname,"exp"),cpt,jj1,subdirf2(optionfilefiname,"exp"),cpt,jj1,subdirf2(optionfilefiname,"exp"),cpt,jj1);
}
- } /* end i1 */
+ /* } /\* end i1 *\/ */
}/* End k1 */
fprintf(fichtm,"
");
-
fprintf(fichtm,"\
\n
- \n\
- - Parameter file with estimated parameters and covariance matrix: %s
\n", rfileres,rfileres);
+ - Parameter file with estimated parameters and covariance matrix: %s
\
+ - 95%% confidence intervals and T statistics are in the log file.
\n", rfileres,rfileres);
- fprintf(fichtm," - Variance of one-step probabilities: %s
\n",
+ fprintf(fichtm," - Standard deviation of one-step probabilities: %s
\n",
subdirf2(fileres,"prob"),subdirf2(fileres,"prob"));
fprintf(fichtm,"\
- Variance-covariance of one-step probabilities: %s
\n",
@@ -4480,7 +4589,7 @@ fprintf(fichtm," \n- Graphs
jj1=0;
for(k1=1; k1<=m;k1++){
- for(i1=1; i1<=ncodemax[k1];i1++){
+ /* for(i1=1; i1<=ncodemax[k1];i1++){ */
jj1++;
if (cptcovn > 0) {
fprintf(fichtm,"
************ Results for covariates");
@@ -4499,7 +4608,7 @@ true period expectancies (those weighted
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 i1 *\/ */
}/* End k1 */
fprintf(fichtm,"
");
fflush(fichtm);
@@ -5533,8 +5642,8 @@ int decodemodel ( char model[], int last
if (strlen(model) >1){ /* If there is at least 1 covariate */
j=0, j1=0, k1=0, k2=-1, ks=0, cptcovn=0;
if (strstr(model,"AGE") !=0){
- printf("Error. AGE must be in lower case 'age' model=1+age+%s ",model);
- fprintf(ficlog,"Error. AGE must be in lower case model=1+age+%s ",model);fflush(ficlog);
+ printf("Error. AGE must be in lower case 'age' model=1+age+%s. ",model);
+ fprintf(ficlog,"Error. AGE must be in lower case model=1+age+%s. ",model);fflush(ficlog);
return 1;
}
if (strstr(model,"v") !=0){
@@ -5547,10 +5656,10 @@ int decodemodel ( char model[], int last
printf(" strpt=%s, model=%s\n",strpt, model);
if(strpt != model){
printf("Error in model: 'model=%s'; 'age*age' should in first place before other covariates\n \
- 'model=1+age+age*age+V1' or 'model=1+age+age*age+V1+V1*age', please swap as well as \n \
+ 'model=1+age+age*age+V1.' or 'model=1+age+age*age+V1+V1*age.', please swap as well as \n \
corresponding column of parameters.\n",model);
fprintf(ficlog,"Error in model: 'model=%s'; 'age*age' should in first place before other covariates\n \
- 'model=1+age+age*age+V1' or 'model=1+age+age*age+V1+V1*age', please swap as well as \n \
+ 'model=1+age+age*age+V1.' or 'model=1+age+age*age+V1+V1*age.', please swap as well as \n \
corresponding column of parameters.\n",model); fflush(ficlog);
return 1;
}
@@ -5841,7 +5950,7 @@ BOOL IsWow64()
}
#endif
-void syscompilerinfo()
+void syscompilerinfo(int logged)
{
/* #include "syscompilerinfo.h"*/
/* command line Intel compiler 32bit windows, XP compatible:*/
@@ -5890,52 +5999,52 @@ void syscompilerinfo()
int cross = CROSS;
if (cross){
printf("Cross-");
- fprintf(ficlog, "Cross-");
+ if(logged) fprintf(ficlog, "Cross-");
}
#endif
#include
- printf("Compiled with:");fprintf(ficlog,"Compiled with:");
+ printf("Compiled with:");if(logged)fprintf(ficlog,"Compiled with:");
#if defined(__clang__)
- printf(" Clang/LLVM");fprintf(ficlog," Clang/LLVM"); /* Clang/LLVM. ---------------------------------------------- */
+ printf(" Clang/LLVM");if(logged)fprintf(ficlog," Clang/LLVM"); /* Clang/LLVM. ---------------------------------------------- */
#endif
#if defined(__ICC) || defined(__INTEL_COMPILER)
- printf(" Intel ICC/ICPC");fprintf(ficlog," Intel ICC/ICPC");/* Intel ICC/ICPC. ------------------------------------------ */
+ printf(" Intel ICC/ICPC");if(logged)fprintf(ficlog," Intel ICC/ICPC");/* Intel ICC/ICPC. ------------------------------------------ */
#endif
#if defined(__GNUC__) || defined(__GNUG__)
- printf(" GNU GCC/G++");fprintf(ficlog," GNU GCC/G++");/* GNU GCC/G++. --------------------------------------------- */
+ printf(" GNU GCC/G++");if(logged)fprintf(ficlog," GNU GCC/G++");/* GNU GCC/G++. --------------------------------------------- */
#endif
#if defined(__HP_cc) || defined(__HP_aCC)
- printf(" Hewlett-Packard C/aC++");fprintf(fcilog," Hewlett-Packard C/aC++"); /* Hewlett-Packard C/aC++. ---------------------------------- */
+ printf(" Hewlett-Packard C/aC++");if(logged)fprintf(fcilog," Hewlett-Packard C/aC++"); /* Hewlett-Packard C/aC++. ---------------------------------- */
#endif
#if defined(__IBMC__) || defined(__IBMCPP__)
- printf(" IBM XL C/C++"); fprintf(ficlog," IBM XL C/C++");/* IBM XL C/C++. -------------------------------------------- */
+ printf(" IBM XL C/C++"); if(logged) fprintf(ficlog," IBM XL C/C++");/* IBM XL C/C++. -------------------------------------------- */
#endif
#if defined(_MSC_VER)
- printf(" Microsoft Visual Studio");fprintf(ficlog," Microsoft Visual Studio");/* Microsoft Visual Studio. --------------------------------- */
+ printf(" Microsoft Visual Studio");if(logged)fprintf(ficlog," Microsoft Visual Studio");/* Microsoft Visual Studio. --------------------------------- */
#endif
#if defined(__PGI)
- printf(" Portland Group PGCC/PGCPP");fprintf(ficlog," Portland Group PGCC/PGCPP");/* Portland Group PGCC/PGCPP. ------------------------------- */
+ printf(" Portland Group PGCC/PGCPP");if(logged) fprintf(ficlog," Portland Group PGCC/PGCPP");/* Portland Group PGCC/PGCPP. ------------------------------- */
#endif
#if defined(__SUNPRO_C) || defined(__SUNPRO_CC)
- printf(" Oracle Solaris Studio");fprintf(ficlog," Oracle Solaris Studio\n");/* Oracle Solaris Studio. ----------------------------------- */
+ printf(" Oracle Solaris Studio");if(logged)fprintf(ficlog," Oracle Solaris Studio\n");/* Oracle Solaris Studio. ----------------------------------- */
#endif
- printf(" for ");fprintf(ficlog," for ");
+ printf(" for "); if (logged) fprintf(ficlog, " for ");
// http://stackoverflow.com/questions/4605842/how-to-identify-platform-compiler-from-preprocessor-macros
#ifdef _WIN32 // note the underscore: without it, it's not msdn official!
// Windows (x64 and x86)
- printf("Windows (x64 and x86) ");fprintf(ficlog,"Windows (x64 and x86) ");
+ printf("Windows (x64 and x86) ");if(logged) fprintf(ficlog,"Windows (x64 and x86) ");
#elif __unix__ // all unices, not all compilers
// Unix
- printf("Unix ");fprintf(ficlog,"Unix ");
+ printf("Unix ");if(logged) fprintf(ficlog,"Unix ");
#elif __linux__
// linux
- printf("linux ");fprintf(ficlog,"linux ");
+ printf("linux ");if(logged) fprintf(ficlog,"linux ");
#elif __APPLE__
// Mac OS, not sure if this is covered by __posix__ and/or __unix__ though..
- printf("Mac OS ");fprintf(ficlog,"Mac OS ");
+ printf("Mac OS ");if(logged) fprintf(ficlog,"Mac OS ");
#endif
/* __MINGW32__ */
@@ -5949,11 +6058,11 @@ void syscompilerinfo()
/* _DEBUG // Defined when you compile with /LDd, /MDd, and /MTd. */
#if UINTPTR_MAX == 0xffffffff
- printf(" 32-bit"); fprintf(ficlog," 32-bit");/* 32-bit */
+ printf(" 32-bit"); if(logged) fprintf(ficlog," 32-bit");/* 32-bit */
#elif UINTPTR_MAX == 0xffffffffffffffff
- printf(" 64-bit"); fprintf(ficlog," 64-bit");/* 64-bit */
+ printf(" 64-bit"); if(logged) fprintf(ficlog," 64-bit");/* 64-bit */
#else
- printf(" wtf-bit"); fprintf(ficlog," wtf-bit");/* wtf */
+ printf(" wtf-bit"); if(logged) fprintf(ficlog," wtf-bit");/* wtf */
#endif
#if defined(__GNUC__)
@@ -5966,18 +6075,18 @@ void syscompilerinfo()
+ __GNUC_MINOR__ * 100)
# endif
printf(" using GNU C version %d.\n", __GNUC_VERSION__);
- fprintf(ficlog, " using GNU C version %d.\n", __GNUC_VERSION__);
+ if(logged) fprintf(ficlog, " using GNU C version %d.\n", __GNUC_VERSION__);
if (uname(&sysInfo) != -1) {
printf("Running on: %s %s %s %s %s\n",sysInfo.sysname, sysInfo.nodename, sysInfo.release, sysInfo.version, sysInfo.machine);
- fprintf(ficlog,"Running on: %s %s %s %s %s\n ",sysInfo.sysname, sysInfo.nodename, sysInfo.release, sysInfo.version, sysInfo.machine);
+ if(logged) fprintf(ficlog,"Running on: %s %s %s %s %s\n ",sysInfo.sysname, sysInfo.nodename, sysInfo.release, sysInfo.version, sysInfo.machine);
}
else
perror("uname() error");
//#ifndef __INTEL_COMPILER
#if !defined (__INTEL_COMPILER) && !defined(__APPLE__)
printf("GNU libc version: %s\n", gnu_get_libc_version());
- fprintf(ficlog,"GNU libc version: %s\n", gnu_get_libc_version());
+ if(logged) fprintf(ficlog,"GNU libc version: %s\n", gnu_get_libc_version());
#endif
#endif
@@ -5985,12 +6094,12 @@ void syscompilerinfo()
// {
#if defined(_MSC_VER)
if (IsWow64()){
- printf("The program (probably compiled for 32bit) is running under WOW64 (64bit) emulation.\n");
- fprintf(ficlog, "The program (probably compiled for 32bit) is running under WOW64 (64bit) emulation.\n");
+ printf("\nThe program (probably compiled for 32bit) is running under WOW64 (64bit) emulation.\n");
+ if (logged) fprintf(ficlog, "\nThe program (probably compiled for 32bit) is running under WOW64 (64bit) emulation.\n");
}
else{
- printf("The process is not running under WOW64 (i.e probably on a 64bit Windows).\n");
- fprintf(ficlog,"The programm is not running under WOW64 (i.e probably on a 64bit Windows).\n");
+ printf("\nThe program is not running under WOW64 (i.e probably on a 64bit Windows).\n");
+ if (logged) fprintf(ficlog, "\nThe programm is not running under WOW64 (i.e probably on a 64bit Windows).\n");
}
// printf("\nPress Enter to continue...");
// getchar();
@@ -6166,11 +6275,12 @@ int main(int argc, char *argv[])
/* FILE *fichtm; *//* Html File */
/* FILE *ficgp;*/ /*Gnuplot File */
struct stat info;
- double agedeb;
- double ageminpar=1.e20,agemin=1.e20, agemaxpar=-1.e20, agemax=-1.e20;
+ double agedeb=0.;
+
+ double ageminpar=AGEOVERFLOW,agemin=AGEOVERFLOW, agemaxpar=-AGEOVERFLOW, agemax=-AGEOVERFLOW;
double fret;
- double dum; /* Dummy variable */
+ double dum=0.; /* Dummy variable */
double ***p3mat;
double ***mobaverage;
@@ -6180,18 +6290,20 @@ int main(int argc, char *argv[])
char *tok, *val; /* pathtot */
int firstobs=1, lastobs=10;
int c, h , cpt;
- int jl;
- int i1, j1, jk, stepsize;
+ int jl=0;
+ int i1, j1, jk, stepsize=0;
+ int count=0;
+
int *tab;
int mobilavproj=0 , prevfcast=0 ; /* moving average of prev, If prevfcast=1 prevalence projection */
int mobilav=0,popforecast=0;
- int hstepm, nhstepm;
+ int hstepm=0, nhstepm=0;
int agemortsup;
float sumlpop=0.;
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;
- double bage=0, fage=110, age, agelim, agebase;
+ double bage=0, fage=110., age, agelim=0., agebase=0.;
double ftolpl=FTOL;
double **prlim;
double ***param; /* Matrix of parameters */
@@ -6252,7 +6364,7 @@ int main(int argc, char *argv[])
#else
getcwd(pathcd, size);
#endif
-
+ syscompilerinfo(0);
printf("\n%s\n%s",version,fullversion);
if(argc <=1){
printf("\nEnter the parameter file name: ");
@@ -6325,7 +6437,7 @@ int main(int argc, char *argv[])
optionfilext=%s\n\
optionfilefiname='%s'\n",pathimach,pathtot,path,optionfile,optionfilext,optionfilefiname);
- syscompilerinfo();
+ syscompilerinfo(0);
printf("Local time (at start):%s",strstart);
fprintf(ficlog,"Local time (at start): %s",strstart);
@@ -6372,14 +6484,15 @@ int main(int argc, char *argv[])
ungetc(c,ficpar);
fscanf(ficpar,"title=%s datafile=%s lastobs=%d firstpass=%d lastpass=%d\nftol=%lf stepm=%d ncovcol=%d nlstate=%d ndeath=%d maxwav=%d mle=%d weight=%d model=1+age+%s\n",title, datafile, &lastobs, &firstpass,&lastpass,&ftol, &stepm, &ncovcol, &nlstate,&ndeath, &maxwav, &mle, &weightopt,model);
- numlinepar++;
+ numlinepar=numlinepar+3; /* In general */
printf("title=%s datafile=%s lastobs=%d firstpass=%d lastpass=%d\nftol=%e stepm=%d ncovcol=%d nlstate=%d ndeath=%d maxwav=%d mle=%d weight=%d\nmodel=1+age+%s\n", title, datafile, lastobs, firstpass,lastpass,ftol, stepm, ncovcol, nlstate,ndeath, maxwav, mle, weightopt,model);
if(model[strlen(model)-1]=='.') /* Suppressing leading dot in the model */
model[strlen(model)-1]='\0';
fprintf(ficparo,"title=%s datafile=%s lastobs=%d firstpass=%d lastpass=%d\nftol=%e stepm=%d ncovcol=%d nlstate=%d ndeath=%d maxwav=%d mle=%d weight=%d\nmodel=1+age+%s.\n", title, datafile, lastobs, firstpass,lastpass,ftol,stepm,ncovcol,nlstate,ndeath,maxwav, mle, weightopt,model);
fprintf(ficlog,"title=%s datafile=%s lastobs=%d firstpass=%d lastpass=%d\nftol=%e stepm=%d ncovcol=%d nlstate=%d ndeath=%d maxwav=%d mle=%d weight=%d\nmodel=1+age+%s.\n", title, datafile, lastobs, firstpass,lastpass,ftol,stepm,ncovcol,nlstate,ndeath,maxwav, mle, weightopt,model);
fflush(ficlog);
- if(model[0]=='#'|| model[0]== '\0'){
+ /* if(model[0]=='#'|| model[0]== '\0'){ */
+ if(model[0]=='#'){
printf("Error in 'model' line: model should start with 'model=1+age+' and end with '.' \n \
'model=1+age+.' or 'model=1+age+V1.' or 'model=1+age+age*age+V1+V1*age.' or \n \
'model=1+age+V1+V2.' or 'model=1+age+V1+V2+V1*V2.' etc. \n"); \
@@ -6423,8 +6536,8 @@ int main(int argc, char *argv[])
/*delti=vector(1,npar); *//* Scale of each paramater (output from hesscov)*/
if(mle==-1){ /* Print a wizard for help writing covariance matrix */
prwizard(ncovmodel, nlstate, ndeath, model, ficparo);
- printf(" You choose mle=-1, look at file %s for a template of covariance matrix \n",filereso);
- fprintf(ficlog," You choose mle=-1, look at file %s for a template of covariance matrix \n",filereso);
+ printf(" You chose mle=-1, look at file %s for a template of covariance matrix \n",filereso);
+ fprintf(ficlog," You chose mle=-1, look at file %s for a template of covariance matrix \n",filereso);
free_ma3x(delti3,1,nlstate,1, nlstate+ndeath-1,1,ncovmodel);
fclose (ficparo);
fclose (ficlog);
@@ -6433,8 +6546,8 @@ int main(int argc, char *argv[])
}
else if(mle==-3) { /* Main Wizard */
prwizard(ncovmodel, nlstate, ndeath, model, ficparo);
- printf(" You choose mle=-3, look at file %s for a template of covariance matrix \n",filereso);
- fprintf(ficlog," You choose mle=-3, look at file %s for a template of covariance matrix \n",filereso);
+ printf(" You chose mle=-3, look at file %s for a template of covariance matrix \n",filereso);
+ fprintf(ficlog," You chose mle=-3, look at file %s for a template of covariance matrix \n",filereso);
param= ma3x(1,nlstate,1,nlstate+ndeath-1,1,ncovmodel);
matcov=matrix(1,npar,1,npar);
}
@@ -6458,7 +6571,7 @@ int main(int argc, char *argv[])
if(jj==i) continue;
j++;
fscanf(ficpar,"%1d%1d",&i1,&j1);
- if ((i1 != i) && (j1 != j)){
+ if ((i1 != i) || (j1 != jj)){
printf("Error in line parameters number %d, %1d%1d instead of %1d%1d \n \
It might be a problem of design; if ncovcol and the model are correct\n \
run imach with mle=-1 to get a correct template of the parameter file.\n",numlinepar, i,j, i1, j1);
@@ -6466,8 +6579,8 @@ run imach with mle=-1 to get a correct t
}
fprintf(ficparo,"%1d%1d",i1,j1);
if(mle==1)
- printf("%1d%1d",i,j);
- fprintf(ficlog,"%1d%1d",i,j);
+ printf("%1d%1d",i,jj);
+ fprintf(ficlog,"%1d%1d",i,jj);
for(k=1; k<=ncovmodel;k++){
fscanf(ficpar," %lf",¶m[i][j][k]);
if(mle==1){
@@ -6548,12 +6661,22 @@ run imach with mle=-1 to get a correct t
for(i=1; i <=npar; i++)
for(j=1; j <=npar; j++) matcov[i][j]=0.;
+ /* Scans npar lines */
for(i=1; i <=npar; i++){
- fscanf(ficpar,"%s",str);
+ count=fscanf(ficpar,"%1d%1d%1d",&i1,&j1,&jk);
+ if(count != 3){
+ printf("Error! Error in parameter file %s at line %d after line starting with %1d%1d%1d\n\
+This is probably because your covariance matrix doesn't \n contain exactly %d lines corresponding to your model line '1+age+%s'.\n\
+Please run with mle=-1 to get a correct covariance matrix.\n",optionfile,numlinepar, i1,j1,jk, npar, model);
+ fprintf(ficlog,"Error! Error in parameter file %s at line %d after line starting with %1d%1d%1d\n\
+This is probably because your covariance matrix doesn't \n contain exactly %d lines corresponding to your model line '1+age+%s'.\n\
+Please run with mle=-1 to get a correct covariance matrix.\n",optionfile,numlinepar, i1,j1,jk, npar, model);
+ exit(1);
+ }else
if(mle==1)
- printf("%s",str);
- fprintf(ficlog,"%s",str);
- fprintf(ficparo,"%s",str);
+ printf("%1d%1d%1d",i1,j1,jk);
+ fprintf(ficlog,"%1d%1d%1d",i1,j1,jk);
+ fprintf(ficparo,"%1d%1d%1d",i1,j1,jk);
for(j=1; j <=i; j++){
fscanf(ficpar," %le",&matcov[i][j]);
if(mle==1){
@@ -6569,6 +6692,7 @@ run imach with mle=-1 to get a correct t
fprintf(ficlog,"\n");
fprintf(ficparo,"\n");
}
+ /* End of read covariance matrix npar lines */
for(i=1; i <=npar; i++)
for(j=i+1;j<=npar;j++)
matcov[i][j]=matcov[j][i];
@@ -6608,6 +6732,7 @@ run imach with mle=-1 to get a correct t
s=imatrix(1,maxwav+1,1,n); /* s[i][j] health state for wave i and individual j */
tab=ivector(1,NCOVMAX);
ncodemax=ivector(1,NCOVMAX); /* Number of code per covariate; if O and 1 only, 2**ncov; V1+V2+V3+V4=>16 */
+ ncodemaxwundef=ivector(1,NCOVMAX); /* Number of code per covariate; if - 1 O and 1 only, 2**ncov; V1+V2+V3+V4=>16 */
/* Reads data from file datafile */
if (readdata(datafile, firstobs, lastobs, &imx)==1)
@@ -7007,9 +7132,10 @@ Interval (in months) between two waves:
}
printf("iter=%d MLE=%f Eq=%lf*exp(%lf*(age-%d))\n",iter,-gompertz(p),p[1],p[2],agegomp);
- for (i=1;i<=NDIM;i++)
+ for (i=1;i<=NDIM;i++) {
printf("%f [%f ; %f]\n",p[i],p[i]-2*sqrt(matcov[i][i]),p[i]+2*sqrt(matcov[i][i]));
-
+ fprintf(ficlog,"%f [%f ; %f]\n",p[i],p[i]-2*sqrt(matcov[i][i]),p[i]+2*sqrt(matcov[i][i]));
+ }
lsurv=vector(1,AGESUP);
lpop=vector(1,AGESUP);
tpop=vector(1,AGESUP);
@@ -7041,8 +7167,15 @@ Interval (in months) between two waves:
replace_back_to_slash(pathc,pathcd); /* Even gnuplot wants a / */
- printinggnuplotmort(fileres, optionfilefiname,ageminpar,agemaxpar,fage, pathc,p);
-
+ if(ageminpar == AGEOVERFLOW ||agemaxpar == AGEOVERFLOW){
+ printf("Warning! Error in gnuplot file with ageminpar %f or agemaxpar %f overflow\n\
+This is probably because your parameter file doesn't \n contain the exact number of lines (or columns) corresponding to your model line.\n\
+Please run with mle=-1 to get a correct covariance matrix.\n",ageminpar,agemaxpar);
+ fprintf(ficlog,"Warning! Error in gnuplot file with ageminpar %f or agemaxpar %f overflow\n\
+This is probably because your parameter file doesn't \n contain the exact number of lines (or columns) corresponding to your model line.\n\
+Please run with mle=-1 to get a correct covariance matrix.\n",ageminpar,agemaxpar);
+ }else
+ printinggnuplotmort(fileres, optionfilefiname,ageminpar,agemaxpar,fage, pathc,p);
printinghtmlmort(fileres,title,datafile, firstpass, lastpass, \
stepm, weightopt,\
model,imx,p,matcov,agemortsup);
@@ -7077,7 +7210,7 @@ Interval (in months) between two waves:
}
/*--------- 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=1+age+%s\n", title, datafile, lastobs, firstpass,lastpass,ftol, stepm, ncovcol, nlstate, ndeath, maxwav, weightopt,model);
+ 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=1+age+%s.\n", title, datafile, lastobs, firstpass,lastpass,ftol, stepm, ncovcol, nlstate, ndeath, maxwav, weightopt,model);
fprintf(ficres,"# Parameters nlstate*nlstate*ncov a12*1 + b12 * age + ...\n");
@@ -7090,9 +7223,9 @@ Interval (in months) between two waves:
fprintf(ficlog,"%d%d ",i,k);
fprintf(ficres,"%1d%1d ",i,k);
for(j=1; j <=ncovmodel; j++){
- printf("%lf ",p[jk]);
- fprintf(ficlog,"%lf ",p[jk]);
- fprintf(ficres,"%lf ",p[jk]);
+ printf("%12.7f ",p[jk]);
+ fprintf(ficlog,"%12.7f ",p[jk]);
+ fprintf(ficres,"%12.7f ",p[jk]);
jk++;
}
printf("\n");
@@ -7106,6 +7239,24 @@ Interval (in months) between two waves:
ftolhess=ftol; /* Usually correct */
hesscov(matcov, p, npar, delti, ftolhess, func);
}
+ printf("Parameters and 95%% confidence intervals\n");
+ fprintf(ficlog, "Parameters, T and confidence intervals\n");
+ for(i=1,jk=1; i <=nlstate; i++){
+ for(k=1; k <=(nlstate+ndeath); k++){
+ if (k != i) {
+ printf("%d%d ",i,k);
+ fprintf(ficlog,"%d%d ",i,k);
+ for(j=1; j <=ncovmodel; j++){
+ printf("%12.7f T=%8.3f CI=[%12.7f ; %12.7f] ",p[jk], p[jk]/sqrt(matcov[jk][jk]), p[jk]-2*sqrt(matcov[jk][jk]),p[jk]+2*sqrt(matcov[jk][jk]));
+ fprintf(ficlog,"%12.7f T=%8.3f CI=[%12.7f ; %12.7f] ",p[jk], p[jk]/sqrt(matcov[jk][jk]), p[jk]-2*sqrt(matcov[jk][jk]),p[jk]+2*sqrt(matcov[jk][jk]));
+ jk++;
+ }
+ printf("\n");
+ fprintf(ficlog,"\n");
+ }
+ }
+ }
+
fprintf(ficres,"# Scales (for hessian or gradient estimation)\n");
printf("# Scales (for hessian or gradient estimation)\n");
fprintf(ficlog,"# Scales (for hessian or gradient estimation)\n");
@@ -7262,6 +7413,7 @@ Interval (in months) between two waves:
dateprev2=anprev2+(mprev2-1)/12.+(jprev2-1)/365.;
fscanf(ficpar,"pop_based=%d\n",&popbased);
+ fprintf(ficlog,"pop_based=%d\n",popbased);
fprintf(ficparo,"pop_based=%d\n",popbased);
fprintf(ficres,"pop_based=%d\n",popbased);
@@ -7286,7 +7438,15 @@ Interval (in months) between two waves:
/* ,dateprev1,dateprev2,jprev1, mprev1,anprev1,jprev2, mprev2,anprev2); */
replace_back_to_slash(pathc,pathcd); /* Even gnuplot wants a / */
- printinggnuplot(fileres, optionfilefiname,ageminpar,agemaxpar,fage, pathc,p);
+ if(ageminpar == AGEOVERFLOW ||agemaxpar == -AGEOVERFLOW){
+ printf("Warning! Error in gnuplot file with ageminpar %f or agemaxpar %f overflow\n\
+This is probably because your parameter file doesn't \n contain the exact number of lines (or columns) corresponding to your model line.\n\
+Please run with mle=-1 to get a correct covariance matrix.\n",ageminpar,agemaxpar);
+ fprintf(ficlog,"Warning! Error in gnuplot file with ageminpar %f or agemaxpar %f overflow\n\
+This is probably because your parameter file doesn't \n contain the exact number of lines (or columns) corresponding to your model line.\n\
+Please run with mle=-1 to get a correct covariance matrix.\n",ageminpar,agemaxpar);
+ }else
+ printinggnuplot(fileres, optionfilefiname,ageminpar,agemaxpar,fage, pathc,p);
printinghtml(fileres,title,datafile, firstpass, lastpass, stepm, weightopt,\
model,imx,jmin,jmax,jmean,rfileres,popforecast,estepm,\
@@ -7581,6 +7741,7 @@ Interval (in months) between two waves:
free_ma3x(param,1,nlstate,1, nlstate+ndeath-1,1,ncovmodel);
free_ivector(ncodemax,1,NCOVMAX);
+ free_ivector(ncodemaxwundef,1,NCOVMAX);
free_ivector(Tvar,1,NCOVMAX);
free_ivector(Tprod,1,NCOVMAX);
free_ivector(Tvaraff,1,NCOVMAX);