--- imach/src/imach.c 2015/07/14 10:00:33 1.191
+++ imach/src/imach.c 2015/08/18 23:17:52 1.196
@@ -1,6 +1,26 @@
-/* $Id: imach.c,v 1.191 2015/07/14 10:00:33 brouard Exp $
+/* $Id: imach.c,v 1.196 2015/08/18 23:17:52 brouard Exp $
$State: Exp $
$Log: imach.c,v $
+ Revision 1.196 2015/08/18 23:17:52 brouard
+ Summary: 0.98q5
+
+ Revision 1.195 2015/08/18 16:28:39 brouard
+ Summary: Adding a hack for testing purpose
+
+ After reading the title, ftol and model lines, if the comment line has
+ a q, starting with #q, the answer at the end of the run is quit. It
+ permits to run test files in batch with ctest. The former workaround was
+ $ echo q | imach foo.imach
+
+ 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
@@ -605,6 +625,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 *\/ */
@@ -678,6 +699,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 '\\'
@@ -689,11 +711,12 @@ typedef struct {
#define ODIRSEPARATOR '\\'
#endif
-/* $Id: imach.c,v 1.191 2015/07/14 10:00:33 brouard Exp $ */
+/* $Id: imach.c,v 1.196 2015/08/18 23:17:52 brouard Exp $ */
/* $State: Exp $ */
-
-char version[]="Imach version 0.98q2, 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.191 $ $Date: 2015/07/14 10:00:33 $";
+#include "version.h"
+char version[]=__IMACH_VERSION__;
+char copyright[]="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.196 $ $Date: 2015/08/18 23:17:52 $";
char strstart[80];
char optionfilext[10], optionfilefiname[FILENAMELENGTH];
int erreur=0, nberr=0, nbwarn=0; /* Error number, number of errors number of warnings */
@@ -827,7 +850,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;
@@ -1559,10 +1588,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]) */
@@ -1572,11 +1601,11 @@ 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);
@@ -1653,7 +1682,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]);
@@ -1761,7 +1790,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];
@@ -1769,7 +1798,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. */
@@ -1798,11 +1830,11 @@ 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
@@ -1838,9 +1870,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) ****************/
@@ -2875,7 +2910,7 @@ void lubksb(double **a, int n, int *indx
void pstamp(FILE *fichier)
{
- fprintf(fichier,"# %s.%s\n#%s\n#%s\n# %s", optionfilefiname,optionfilext,version,fullversion,strstart);
+ fprintf(fichier,"# %s.%s\n#IMaCh version %s, %s\n#%s\n# %s", optionfilefiname,optionfilext,version,copyright, fullversion, strstart);
}
/************ Frequencies ********************/
@@ -3298,11 +3333,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
@@ -3325,15 +3360,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 */
@@ -3351,19 +3395,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;
@@ -3374,17 +3428,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*/
}
@@ -4470,12 +4525,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 */
@@ -4494,16 +4551,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",
@@ -4544,7 +4601,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");
@@ -4563,7 +4620,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);
@@ -5395,8 +5452,8 @@ int readdata(char datafile[], int firsto
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;
+ printf("Problem while opening datafile: %s\n", datafile);fflush(stdout);
+ fprintf(ficlog,"Problem while opening datafile: %s\n", datafile);fflush(ficlog);return 1;
}
i=1;
@@ -5597,8 +5654,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){
@@ -5611,10 +5668,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;
}
@@ -6231,7 +6288,8 @@ int main(int argc, char *argv[])
/* FILE *ficgp;*/ /*Gnuplot File */
struct stat info;
double agedeb=0.;
- double ageminpar=1.e20,agemin=1.e20, agemaxpar=-1.e20, agemax=-1.e20;
+
+ double ageminpar=AGEOVERFLOW,agemin=AGEOVERFLOW, agemaxpar=-AGEOVERFLOW, agemax=-AGEOVERFLOW;
double fret;
double dum=0.; /* Dummy variable */
@@ -6243,9 +6301,11 @@ int main(int argc, char *argv[])
char pathr[MAXLINE], pathimach[MAXLINE];
char *tok, *val; /* pathtot */
int firstobs=1, lastobs=10;
- int c, h , cpt;
+ int c, h , cpt, c2;
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;
@@ -6317,7 +6377,7 @@ int main(int argc, char *argv[])
getcwd(pathcd, size);
#endif
syscompilerinfo(0);
- printf("\n%s\n%s",version,fullversion);
+ printf("\nIMaCh version %s, %s\n%s",version, copyright, fullversion);
if(argc <=1){
printf("\nEnter the parameter file name: ");
fgets(pathr,FILENAMELENGTH,stdin);
@@ -6436,7 +6496,7 @@ 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';
@@ -6457,6 +6517,10 @@ int main(int argc, char *argv[])
ungetc(c,ficpar);
fgets(line, MAXLINE, ficpar);
numlinepar++;
+ if(line[1]=='q'){ /* This #q will quit imach (the answer is q) */
+ z[0]=line[1];
+ }
+ /* printf("****line [1] = %c \n",line[1]); */
fputs(line, stdout);
//puts(line);
fputs(line,ficparo);
@@ -6498,8 +6562,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);
}
@@ -6523,7 +6587,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);
@@ -6531,8 +6595,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){
@@ -6613,12 +6677,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){
@@ -6634,6 +6708,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];
@@ -6673,6 +6748,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)
@@ -7072,9 +7148,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);
@@ -7106,8 +7183,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);
@@ -7142,7 +7226,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");
@@ -7171,6 +7255,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");
@@ -7327,6 +7429,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);
@@ -7351,7 +7454,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,\
@@ -7646,6 +7757,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);
@@ -7753,7 +7865,7 @@ Interval (in months) between two waves:
}
end:
while (z[0] != 'q') {
- printf("\nType q for exiting: ");
+ printf("\nType q for exiting: "); fflush(stdout);
scanf("%s",z);
}
}