--- imach/src/imach.c 2016/08/22 07:17:15 1.231 +++ imach/src/imach.c 2016/08/26 09:20:19 1.237 @@ -1,6 +1,24 @@ -/* $Id: imach.c,v 1.231 2016/08/22 07:17:15 brouard Exp $ +/* $Id: imach.c,v 1.237 2016/08/26 09:20:19 brouard Exp $ $State: Exp $ $Log: imach.c,v $ + Revision 1.237 2016/08/26 09:20:19 brouard + Summary: to valgrind + + Revision 1.236 2016/08/25 10:50:18 brouard + *** empty log message *** + + Revision 1.235 2016/08/25 06:59:23 brouard + *** empty log message *** + + Revision 1.234 2016/08/23 16:51:20 brouard + *** empty log message *** + + Revision 1.233 2016/08/23 07:40:50 brouard + Summary: not working + + Revision 1.232 2016/08/22 14:20:21 brouard + Summary: not working + Revision 1.231 2016/08/22 07:17:15 brouard Summary: not working @@ -893,12 +911,12 @@ typedef struct { #define ODIRSEPARATOR '\\' #endif -/* $Id: imach.c,v 1.231 2016/08/22 07:17:15 brouard Exp $ */ +/* $Id: imach.c,v 1.237 2016/08/26 09:20:19 brouard Exp $ */ /* $State: Exp $ */ #include "version.h" char version[]=__IMACH_VERSION__; char copyright[]="February 2016,INED-EUROREVES-Institut de longevite-Japan Society for the Promotion of Science (Grant-in-Aid for Scientific Research 25293121), Intel Software 2015-2018"; -char fullversion[]="$Revision: 1.231 $ $Date: 2016/08/22 07:17:15 $"; +char fullversion[]="$Revision: 1.237 $ $Date: 2016/08/26 09:20:19 $"; char strstart[80]; char optionfilext[10], optionfilefiname[FILENAMELENGTH]; int erreur=0, nberr=0, nbwarn=0; /* Error number, number of errors number of warnings */ @@ -911,7 +929,12 @@ int cptcovsnq=0; /**< cptcovsnq number o int cptcovage=0; /**< Number of covariates with age: V3*age only =1 */ int cptcovprodnoage=0; /**< Number of covariate products without age */ int cptcoveff=0; /* Total number of covariates to vary for printing results */ -int ncoveff=0; /* Total number of effective covariates in the model */ +int ncovf=0; /* Total number of effective fixed covariates (dummy or quantitative) in the model */ +int ncovv=0; /* Total number of effective (wave) varying covariates (dummy or quantitative) in the model */ +int ncova=0; /* Total number of effective (wave and stepm) varying with age covariates (dummy of quantitative) in the model */ +int nsd=0; /**< Total number of single dummy variables (output) */ +int nsq=0; /**< Total number of single quantitative variables (output) */ +int ncoveff=0; /* Total number of effective fixed dummy covariates in the model */ int nqfveff=0; /**< nqfveff Number of Quantitative Fixed Variables Effective */ int ntveff=0; /**< ntveff number of effective time varying variables */ int nqtveff=0; /**< ntqveff number of effective time varying quantitative variables */ @@ -968,6 +991,7 @@ char fileresv[FILENAMELENGTH]; FILE *ficresvpl; char fileresvpl[FILENAMELENGTH]; char title[MAXLINE]; +char model[MAXLINE]; /**< The model line */ char optionfile[FILENAMELENGTH], datafile[FILENAMELENGTH], filerespl[FILENAMELENGTH], fileresplb[FILENAMELENGTH]; char plotcmd[FILENAMELENGTH], pplotcmd[FILENAMELENGTH]; char tmpout[FILENAMELENGTH], tmpout2[FILENAMELENGTH]; @@ -1067,6 +1091,46 @@ double ***cotvar; /* Time varying covari double ***cotqvar; /* Time varying quantitative covariate itqv */ double idx; int **nbcode, *Tvar; /**< model=V2 => Tvar[1]= 2 */ +/* V5+V4+V3+V4*V3+V5*age+V2+V1*V2+V1*age+V1 */ +/*k 1 2 3 4 5 6 7 8 9 */ +/*Tvar[k]= 5 4 3 6 5 2 7 1 1 */ +/* Tndvar[k] 1 2 3 4 5 */ +/*TDvar 4 3 6 7 1 */ /* For outputs only; combination of dummies fixed or varying */ +/* Tns[k] 1 2 2 4 5 */ /* Number of single cova */ +/* TvarsD[k] 1 2 3 */ /* Number of single dummy cova */ +/* TvarsDind 2 3 9 */ /* position K of single dummy cova */ +/* TvarsQ[k] 1 2 */ /* Number of single quantitative cova */ +/* TvarsQind 1 6 */ /* position K of single quantitative cova */ +/* Tprod[i]=k 4 7 */ +/* Tage[i]=k 5 8 */ +/* */ +/* Type */ +/* V 1 2 3 4 5 */ +/* F F V V V */ +/* D Q D D Q */ +/* */ +int *TvarsD; +int *TvarsDind; +int *TvarsQ; +int *TvarsQind; + +#define MAXRESULTLINES 10 +int nresult=0; +int TKresult[MAXRESULTLINES]; +int Tresult[MAXRESULTLINES][NCOVMAX];/* For dummy variable , value (output) */ +int Tinvresult[MAXRESULTLINES][NCOVMAX];/* For dummy variable , value (output) */ +int Tvresult[MAXRESULTLINES][NCOVMAX]; /* For dummy variable , variable # (output) */ +double Tqresult[MAXRESULTLINES][NCOVMAX]; /* For quantitative variable , value (output) */ +double Tqinvresult[MAXRESULTLINES][NCOVMAX]; /* For quantitative variable , value (output) */ +int Tvqresult[MAXRESULTLINES][NCOVMAX]; /* For quantitative variable , variable # (output) */ + +/* int *TDvar; /\**< TDvar[1]=4, TDvarF[2]=3, TDvar[3]=6 in V5+V4+V3+V4*V3+V5*age+V2+V1*V2+V1*age+V1 *\/ */ +int *TvarF; /**< TvarF[1]=Tvar[6]=2, TvarF[2]=Tvar[7]=7, TvarF[3]=Tvar[9]=1 in V5+V4+V3+V4*V3+V5*age+V2+V1*V2+V1*age+V1 */ +int *TvarFind; /**< TvarFind[1]=6, TvarFind[2]=7, Tvarind[3]=9 in V5+V4+V3+V4*V3+V5*age+V2+V1*V2+V1*age+V1 */ +int *TvarV; /**< TvarV[1]=Tvar[1]=5, TvarV[2]=Tvar[2]=4 in V5+V4+V3+V4*V3+V5*age+V2+V1*V2+V1*age+V1 */ +int *TvarVind; /**< TvarVind[1]=1, TvarVind[2]=2 in V5+V4+V3+V4*V3+V5*age+V2+V1*V2+V1*age+V1 */ +int *TvarA; /**< TvarA[1]=Tvar[5]=5, TvarA[2]=Tvar[8]=1 in V5+V4+V3+V4*V3+V5*age+V2+V1*V2+V1*age+V1 */ +int *TvarAind; /**< TvarindA[1]=5, TvarAind[2]=8 in V5+V4+V3+V4*V3+V5*age+V2+V1*V2+V1*age+V1 */ int *TvarFD; /**< TvarFD[1]=V1 in V5+V4+V3+V4*V3+V5*age+V2+V1*V2+V1*age+V1 */ int *TvarFDind; /* TvarFDind[1]=9 in V5+V4+V3+V4*V3+V5*age+V2+V1*V2+V1*age+V1 */ int *TvarFQ; /* TvarFQ[1]=V2 in V5+V4+V3+V4*V3+V5*age+V2+V1*V2+V1*age+V1 */ /* Only simple fixed quantitative variable */ @@ -1320,7 +1384,7 @@ int nbocc(char *s, char occ) i=0; lg=strlen(s); for(i=0; i<= lg; i++) { - if (s[i] == occ ) j++; + if (s[i] == occ ) j++; } return j; } @@ -2211,87 +2275,89 @@ void powell(double p[], double **xi, int 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]); - fprintf(ficlog," Before xit[%d]= %12.7f p[%d]= %12.7f",j,xit[j],j,p[j]); - if(j % ncovmodel == 0){ - printf("\n"); - fprintf(ficlog,"\n"); - } - } + 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]); + fprintf(ficlog," Before xit[%d]= %12.7f p[%d]= %12.7f",j,xit[j],j,p[j]); + if(j % ncovmodel == 0){ + printf("\n"); + fprintf(ficlog,"\n"); + } + } #endif #ifdef LINMINORIGINAL - linmin(p,xit,n,fret,func); /* computes minimum on the extrapolated direction: changes p and rescales xit.*/ + linmin(p,xit,n,fret,func); /* computes minimum on the extrapolated direction: changes p and rescales xit.*/ #else - linmin(p,xit,n,fret,func,&flat); /* computes minimum on the extrapolated direction: changes p and rescales xit.*/ - flatdir[i]=flat; /* Function is vanishing in that direction i */ + linmin(p,xit,n,fret,func,&flat); /* computes minimum on the extrapolated direction: changes p and rescales xit.*/ + flatdir[i]=flat; /* Function is vanishing in that direction i */ #endif - + #ifdef DEBUGLINMIN - for (j=1;j<=n;j++) { - printf("After xit[%d]= %12.7f p[%d]= %12.7f",j,xit[j],j,p[j]); - fprintf(ficlog,"After xit[%d]= %12.7f p[%d]= %12.7f",j,xit[j],j,p[j]); - if(j % ncovmodel == 0){ - printf("\n"); - fprintf(ficlog,"\n"); - } - } + for (j=1;j<=n;j++) { + printf("After xit[%d]= %12.7f p[%d]= %12.7f",j,xit[j],j,p[j]); + fprintf(ficlog,"After xit[%d]= %12.7f p[%d]= %12.7f",j,xit[j],j,p[j]); + if(j % ncovmodel == 0){ + printf("\n"); + fprintf(ficlog,"\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 */ - } + 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 */ + } #ifdef LINMINORIGINAL #else - for (j=1, flatd=0;j<=n;j++) { - if(flatdir[j]>0) - flatd++; - } - if(flatd >0){ - printf("%d flat directions\n",flatd); - fprintf(ficlog,"%d flat directions\n",flatd); - for (j=1;j<=n;j++) { - if(flatdir[j]>0){ - printf("%d ",j); - fprintf(ficlog,"%d ",j); - } - } - printf("\n"); - fprintf(ficlog,"\n"); - } + for (j=1, flatd=0;j<=n;j++) { + if(flatdir[j]>0) + flatd++; + } + if(flatd >0){ + printf("%d flat directions\n",flatd); + fprintf(ficlog,"%d flat directions\n",flatd); + for (j=1;j<=n;j++) { + if(flatdir[j]>0){ + printf("%d ",j); + fprintf(ficlog,"%d ",j); + } + } + printf("\n"); + fprintf(ficlog,"\n"); + } #endif - printf("Gaining to use new average direction of P0 P%d instead of biggest increase direction %d :\n",n,ibig); - fprintf(ficlog,"Gaining to use new average direction of P0 P%d instead of biggest increase direction %d :\n",n,ibig); - + printf("Gaining to use new average direction of P0 P%d instead of biggest increase direction %d :\n",n,ibig); + fprintf(ficlog,"Gaining to use new average direction of P0 P%d instead of biggest increase direction %d :\n",n,ibig); + #ifdef DEBUG - printf("Direction changed last moved %d in place of ibig=%d, new last is the average:\n",n,ibig); - fprintf(ficlog,"Direction changed last moved %d in place of ibig=%d, new last is the average:\n",n,ibig); - for(j=1;j<=n;j++){ - printf(" %lf",xit[j]); - fprintf(ficlog," %lf",xit[j]); - } - printf("\n"); - fprintf(ficlog,"\n"); + printf("Direction changed last moved %d in place of ibig=%d, new last is the average:\n",n,ibig); + fprintf(ficlog,"Direction changed last moved %d in place of ibig=%d, new last is the average:\n",n,ibig); + for(j=1;j<=n;j++){ + printf(" %lf",xit[j]); + fprintf(ficlog," %lf",xit[j]); + } + printf("\n"); + fprintf(ficlog,"\n"); #endif } /* end of t or directest negative */ #ifdef POWELLNOF3INFF1TEST #else - } /* end if (fptt < fp) */ + } /* end if (fptt < fp) */ #endif #ifdef NODIRECTIONCHANGEDUNTILNITER /* No change in drections until some iterations are done */ - } /*NODIRECTIONCHANGEDUNTILNITER No change in drections until some iterations are done */ + } /*NODIRECTIONCHANGEDUNTILNITER No change in drections until some iterations are done */ #else #endif - } /* loop iteration */ + } /* loop iteration */ } - + /**** Prevalence limit (stable or period prevalence) ****************/ - -double **prevalim(double **prlim, int nlstate, double x[], double age, double **oldm, double **savm, double ftolpl, int *ncvyear, int ij) -{ - /* Computes the prevalence limit in each live state at age x and for covariate ij by left multiplying the unit - matrix by transitions matrix until convergence is reached with precision ftolpl */ + + double **prevalim(double **prlim, int nlstate, double x[], double age, double **oldm, double **savm, double ftolpl, int *ncvyear, int ij, int nres) + { + /* Computes the prevalence limit in each live state at age x and for covariate combination ij + (and selected quantitative values in nres) + by left multiplying the unit + matrix by transitions matrix until convergence is reached with precision ftolpl */ /* Wx= Wx-1 Px-1= Wx-2 Px-2 Px-1 = Wx-n Px-n ... Px-2 Px-1 I */ /* Wx is row vector: population in state 1, population in state 2, population dead */ /* or prevalence in state 1, prevalence in state 2, 0 */ @@ -2309,7 +2375,7 @@ double **prevalim(double **prlim, int nl /* {0.51571254859325999, 0.4842874514067399, */ /* 0.51326036147820708, 0.48673963852179264} */ /* If we start from prlim again, prlim tends to a constant matrix */ - + int i, ii,j,k; double *min, *max, *meandiff, maxmax,sumnew=0.; /* double **matprod2(); */ /* test */ @@ -2339,19 +2405,40 @@ double **prevalim(double **prlim, int nl cov[2]=agefin; if(nagesqr==1) cov[3]= agefin*agefin;; - for (k=1; k<=cptcovn;k++) { - /* cov[2+nagesqr+k]=nbcode[Tvar[k]][codtabm(ij,Tvar[k])]; */ - /* Here comes the value of the covariate 'ij' */ - cov[2+nagesqr+k]=nbcode[Tvar[k]][codtabm(ij,k)]; - /* printf("prevalim ij=%d k=%d Tvar[%d]=%d nbcode=%d cov=%lf codtabm(%d,Tvar[%d])=%d \n",ij,k, k, Tvar[k],nbcode[Tvar[k]][codtabm(ij,Tvar[k])],cov[2+k], ij, k, codtabm(ij,Tvar[k])]); */ + for (k=1; k<=nsd;k++) { /* For single dummy covariates only */ + /* Here comes the value of the covariate 'ij' after renumbering k with single dummy covariates */ + cov[2+nagesqr+TvarsDind[k]]=nbcode[TvarsD[k]][codtabm(ij,k)]; + /* printf("prevalim Dummy combi=%d k=%d TvarsD[%d]=V%d TvarsDind[%d]=%d nbcode=%d cov=%lf codtabm(%d,Tvar[%d])=%d \n",ij,k, k, TvarsD[k],k,TvarsDind[k],nbcode[TvarsD[k]][codtabm(ij,k)],cov[2+nagesqr+TvarsDind[k]], ij, k, codtabm(ij,k)); */ + } + for (k=1; k<=nsq;k++) { /* For single varying covariates only */ + /* Here comes the value of quantitative after renumbering k with single quantitative covariates */ + cov[2+nagesqr+TvarsQind[k]]=Tqresult[nres][k]; + /* printf("prevalim Quantitative k=%d TvarsQind[%d]=%d, TvarsQ[%d]=V%d,Tqresult[%d][%d]=%f\n",k,k,TvarsQind[k],k,TvarsQ[k],nres,k,Tqresult[nres][k]); */ + } + for (k=1; k<=cptcovage;k++){ /* For product with age */ + if(Dummy[Tvar[Tage[k]]]){ + cov[2+nagesqr+Tage[k]]=nbcode[Tvar[Tage[k]]][codtabm(ij,k)]*cov[2]; + } else{ + cov[2+nagesqr+Tage[k]]=Tqresult[nres][k]; + } + /* printf("prevalim Age combi=%d k=%d Tage[%d]=V%d Tqresult[%d][%d]=%f\n",ij,k,k,Tage[k],nres,k,Tqresult[nres][k]); */ + } + for (k=1; k<=cptcovprod;k++){ /* For product without age */ + /* printf("prevalim Prod ij=%d k=%d Tprod[%d]=%d Tvard[%d][1]=V%d, Tvard[%d][2]=V%d\n",ij,k,k,Tprod[k], k,Tvard[k][1], k,Tvard[k][2]); */ + if(Dummy[Tvard[k][1]==0]){ + if(Dummy[Tvard[k][2]==0]){ + cov[2+nagesqr+Tprod[k]]=nbcode[Tvard[k][1]][codtabm(ij,k)] * nbcode[Tvard[k][2]][codtabm(ij,k)]; + }else{ + cov[2+nagesqr+Tprod[k]]=nbcode[Tvard[k][1]][codtabm(ij,k)] * Tqresult[nres][k]; + } + }else{ + if(Dummy[Tvard[k][2]==0]){ + cov[2+nagesqr+Tprod[k]]=nbcode[Tvard[k][2]][codtabm(ij,k)] * Tqinvresult[nres][Tvard[k][1]]; + }else{ + cov[2+nagesqr+Tprod[k]]=Tqinvresult[nres][Tvard[k][1]]* Tqinvresult[nres][Tvard[k][2]]; + } + } } - /*wrong? for (k=1; k<=cptcovage;k++) cov[2+Tage[k]]=cov[2+Tage[k]]*cov[2]; */ - /* for (k=1; k<=cptcovage;k++) cov[2+nagesqr+Tage[k]]=nbcode[Tvar[k]][codtabm(ij,Tvar[k])]*cov[2]; */ - for (k=1; k<=cptcovage;k++) cov[2+nagesqr+Tage[k]]=nbcode[Tvar[k]][codtabm(ij,k)]*cov[2]; - for (k=1; k<=cptcovprod;k++) /* Useless */ - /* cov[2+nagesqr+Tprod[k]]=nbcode[Tvard[k][1]][codtabm(ij,Tvard[k][1])] * nbcode[Tvard[k][2]][codtabm(ij,Tvard[k][2])]; */ - cov[2+nagesqr+Tprod[k]]=nbcode[Tvard[k][1]][codtabm(ij,k)] * nbcode[Tvard[k][2]][codtabm(ij,k)]; - /*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]);*/ @@ -2473,8 +2560,6 @@ Earliest age to start was %d-%d=%d, ncvl cov[2+nagesqr+k]=nbcode[Tvar[k]][codtabm(ij,k)]; /* printf("prevalim ij=%d k=%d Tvar[%d]=%d nbcode=%d cov=%lf codtabm(%d,Tvar[%d])=%d \n",ij,k, k, Tvar[k],nbcode[Tvar[k]][codtabm(ij,Tvar[k])],cov[2+k], ij, k, codtabm(ij,Tvar[k])]); */ } - /*wrong? for (k=1; k<=cptcovage;k++) cov[2+Tage[k]]=cov[2+Tage[k]]*cov[2]; */ - /* for (k=1; k<=cptcovage;k++) cov[2+nagesqr+Tage[k]]=nbcode[Tvar[k]][codtabm(ij,Tvar[k])]*cov[2]; */ for (k=1; k<=cptcovage;k++) cov[2+nagesqr+Tage[k]]=nbcode[Tvar[k]][codtabm(ij,k)]*cov[2]; for (k=1; k<=cptcovprod;k++) /* Useless */ /* cov[2+nagesqr+Tprod[k]]=nbcode[Tvard[k][1]][codtabm(ij,Tvard[k][1])] * nbcode[Tvard[k][2]][codtabm(ij,Tvard[k][2])]; */ @@ -2501,10 +2586,10 @@ Earliest age to start was %d-%d=%d, ncvl } for(j=1; j<=nlstate; j++){ for(i=1;i<=nlstate;i++){ - /* bprlim[i][j]= newm[i][j]/(1-sumnew); */ - bprlim[i][j]= newm[i][j]; - max[i]=FMAX(max[i],bprlim[i][j]); /* Max in line */ - min[i]=FMIN(min[i],bprlim[i][j]); + /* bprlim[i][j]= newm[i][j]/(1-sumnew); */ + bprlim[i][j]= newm[i][j]; + max[i]=FMAX(max[i],bprlim[i][j]); /* Max in line */ + min[i]=FMIN(min[i],bprlim[i][j]); } } @@ -2699,81 +2784,81 @@ double **bpmij(double **ps, double *cov, /*double t34;*/ int i,j, nc, ii, jj; - for(i=1; i<= nlstate; i++){ - 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(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; ji s1=%.17e, lnpijopii=%.17e %lx %lx\n",s1,lnpijopii,s1,lnpijopii); */ + } + ps[i][j]=lnpijopii; /* In fact ln(pij/pii) */ + } + } + + 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. */ - s1=s[mw[mi][i]][i]; - s2=s[mw[mi+1][i]][i]; - bbh=(double)bh[mi][i]/(double)stepm; - /* 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 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 - and not the date of a change in health state. The former idea was - to consider that at each interview the state was recorded - (healthy, disable or death) and IMaCh was corrected; but when we - introduced the exact date of death then we should have modified - the contribution of an exact death to the likelihood. This new - contribution is smaller and very dependent of the step unit - stepm. It is no more the probability to die between last interview - and month of death but the probability to survive from last - interview up to one month before death multiplied by the - probability to die within a month. Thanks to Chris - Jackson for correcting this bug. Former versions increased - mortality artificially. The bad side is that we add another loop - which slows down the processing. The difference can be up to 10% - lower mortality. - */ - /* If, at the beginning of the maximization mostly, the - cumulative probability or probability to be dead is - constant (ie = 1) over time d, the difference is equal to - 0. out[s1][3] = savm[s1][3]: probability, being at state - s1 at precedent wave, to be dead a month before current - wave is equal to probability, being at state s1 at - precedent wave, to be dead at mont of the current - wave. Then the observed probability (that this person died) - is null according to current estimated parameter. In fact, - it should be very low but not zero otherwise the log go to - infinity. - */ + s1=s[mw[mi][i]][i]; + s2=s[mw[mi+1][i]][i]; + bbh=(double)bh[mi][i]/(double)stepm; + /* 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 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 + and not the date of a change in health state. The former idea was + to consider that at each interview the state was recorded + (healthy, disable or death) and IMaCh was corrected; but when we + introduced the exact date of death then we should have modified + the contribution of an exact death to the likelihood. This new + contribution is smaller and very dependent of the step unit + stepm. It is no more the probability to die between last interview + and month of death but the probability to survive from last + interview up to one month before death multiplied by the + probability to die within a month. Thanks to Chris + Jackson for correcting this bug. Former versions increased + mortality artificially. The bad side is that we add another loop + which slows down the processing. The difference can be up to 10% + lower mortality. + */ + /* If, at the beginning of the maximization mostly, the + cumulative probability or probability to be dead is + constant (ie = 1) over time d, the difference is equal to + 0. out[s1][3] = savm[s1][3]: probability, being at state + s1 at precedent wave, to be dead a month before current + wave is equal to probability, being at state s1 at + precedent wave, to be dead at mont of the current + wave. Then the observed probability (that this person died) + is null according to current estimated parameter. In fact, + it should be very low but not zero otherwise the log go to + infinity. + */ /* #ifdef INFINITYORIGINAL */ /* lli=log(out[s1][s2] - savm[s1][s2]); */ /* #else */ @@ -3352,30 +3442,45 @@ double funcone( double *x) ioffset=0; for (i=1,ipmx=0, sw=0.; i<=imx; i++){ ioffset=2+nagesqr+cptcovage; + /* Fixed */ /* for (k=1; k<=cptcovn;k++) cov[2+nagesqr+k]=covar[Tvar[k]][i]; */ - for (k=1; k<=ncoveff;k++){ /* Simple and product fixed Dummy covariates without age* products */ - cov[++ioffset]=covar[TvarFD[k]][i];/* V5+V4+V3+V4*V3+V5*age+V2+V1*V2+V1*age+V1, only V1 is fixed (k=6)*/ - } - for (k=1; k<=nqfveff;k++){ /* Simple and product fixed Quantitative covariates without age* products */ - cov[++ioffset]=coqvar[TvarFQ[k]][i];/* V5+V4+V3+V4*V3+V5*age+V2+V1*V2+V1*age+V1, only V2 and V1*V2 is fixed (k=6 and 7?)*/ + /* for (k=1; k<=ncoveff;k++){ /\* Simple and product fixed Dummy covariates without age* products *\/ */ + for (k=1; k<=ncovf;k++){ /* Simple and product fixed covariates without age* products */ + cov[ioffset+TvarFind[k]]=covar[Tvar[TvarFind[k]]][i];/* V5+V4+V3+V4*V3+V5*age+V2+V1*V2+V1*age+V1, only V1 is fixed (k=6)*/ +/* cov[ioffset+TvarFind[1]]=covar[Tvar[TvarFind[1]]][i]; */ +/* cov[2+6]=covar[Tvar[6]][i]; */ +/* cov[2+6]=covar[2][i]; V2 */ +/* cov[TvarFind[2]]=covar[Tvar[TvarFind[2]]][i]; */ +/* cov[2+7]=covar[Tvar[7]][i]; */ +/* cov[2+7]=covar[7][i]; V7=V1*V2 */ +/* cov[TvarFind[3]]=covar[Tvar[TvarFind[3]]][i]; */ +/* cov[2+9]=covar[Tvar[9]][i]; */ +/* cov[2+9]=covar[1][i]; V1 */ } + /* for (k=1; k<=nqfveff;k++){ /\* Simple and product fixed Quantitative covariates without age* products *\/ */ + /* cov[++ioffset]=coqvar[TvarFQ[k]][i];/\* V5+V4+V3+V4*V3+V5*age+V2+V1*V2+V1*age+V1, only V2 and V1*V2 is fixed (k=6 and 7?)*\/ */ + /* } */ /* for(iqv=1; iqv <= nqfveff; iqv++){ /\* Quantitative fixed covariates *\/ */ /* cov[++ioffset]=coqvar[Tvar[iqv]][i]; /\* Only V2 k=6 and V1*V2 7 *\/ */ /* } */ + for(mi=1; mi<= wav[i]-1; mi++){ /* Varying with waves */ - for(itv=1; itv <= ntveff; itv++){ /* Varying dummy covariates (single??)*/ + /* Wave varying (but not age varying) */ + for(k=1; k <= ncovv ; k++){ /* Varying covariates (single and product but no age )*/ + cov[ioffset+TvarVind[k]]=cotvar[mw[mi][i]][Tvar[TvarVind[k]]][i]; + } + /* for(itv=1; itv <= ntveff; itv++){ /\* Varying dummy covariates (single??)*\/ */ /* iv= Tvar[Tmodelind[ioffset-2-nagesqr-cptcovage+itv]]-ncovcol-nqv; /\* Counting the # varying covariate from 1 to ntveff *\/ */ /* cov[ioffset+iv]=cotvar[mw[mi][i]][iv][i]; */ - k=ioffset-2-nagesqr-cptcovage+itv; /* position in simple model */ - cov[ioffset+itv]=cotvar[mw[mi][i]][TmodelInvind[itv]][i]; + /* k=ioffset-2-nagesqr-cptcovage+itv; /\* position in simple model *\/ */ + /* cov[ioffset+itv]=cotvar[mw[mi][i]][TmodelInvind[itv]][i]; */ /* printf(" i=%d,mi=%d,itv=%d,TmodelInvind[itv]=%d,cotvar[mw[mi][i]][TmodelInvind[itv]][i]=%f\n", i, mi, itv, TmodelInvind[itv],cotvar[mw[mi][i]][TmodelInvind[itv]][i]); */ - } - for(iqtv=1; iqtv <= nqtveff; iqtv++){ /* Varying quantitatives covariates */ - iv=TmodelInvQind[iqtv]; /* Counting the # varying covariate from 1 to ntveff */ - /* printf(" i=%d,mi=%d,iqtv=%d,TmodelInvQind[iqtv]=%d,cotqvar[mw[mi][i]][TmodelInvQind[iqtv]][i]=%f\n", i, mi, iqtv, TmodelInvQind[iqtv],cotqvar[mw[mi][i]][TmodelInvQind[iqtv]][i]); */ - cov[ioffset+ntveff+iqtv]=cotqvar[mw[mi][i]][TmodelInvQind[iqtv]][i]; - } + /* for(iqtv=1; iqtv <= nqtveff; iqtv++){ /\* Varying quantitatives covariates *\/ */ + /* iv=TmodelInvQind[iqtv]; /\* Counting the # varying covariate from 1 to ntveff *\/ */ + /* /\* printf(" i=%d,mi=%d,iqtv=%d,TmodelInvQind[iqtv]=%d,cotqvar[mw[mi][i]][TmodelInvQind[iqtv]][i]=%f\n", i, mi, iqtv, TmodelInvQind[iqtv],cotqvar[mw[mi][i]][TmodelInvQind[iqtv]][i]); *\/ */ + /* cov[ioffset+ntveff+iqtv]=cotqvar[mw[mi][i]][TmodelInvQind[iqtv]][i]; */ + /* } */ for (ii=1;ii<=nlstate+ndeath;ii++) for (j=1;j<=nlstate+ndeath;j++){ oldm[ii][j]=(ii==j ? 1.0 : 0.0); @@ -3416,48 +3521,48 @@ double funcone( double *x) * is higher than the multiple of stepm and negative otherwise. */ if( s2 > nlstate && (mle <5) ){ /* Jackson */ - lli=log(out[s1][s2] - savm[s1][s2]); + lli=log(out[s1][s2] - savm[s1][s2]); } else if ( s2==-1 ) { /* alive */ - for (j=1,survp=0. ; j<=nlstate; j++) - survp += (1.+bbh)*out[s1][j]- bbh*savm[s1][j]; - lli= log(survp); + 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 */ + 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 */ + 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 */ } else if(mle==3){ /* exponential inter-extrapolation */ - 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 */ + 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 */ + 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 */ + 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]); */ if(globpr){ - fprintf(ficresilk,"%9ld %6.1f %6.1f %6d %2d %2d %2d %2d %3d %15.6f %8.4f %8.3f\ + fprintf(ficresilk,"%9ld %6.1f %6.1f %6d %2d %2d %2d %2d %3d %15.6f %8.4f %8.3f\ %11.6f %11.6f %11.6f ", \ - num[i], agebegin, ageend, i,s1,s2,mi,mw[mi][i],dh[mi][i],exp(lli),weight[i],weight[i]*gipmx/gsw, - 2*weight[i]*lli,out[s1][s2],savm[s1][s2]); - for(k=1,llt=0.,l=0.; k<=nlstate; k++){ - llt +=ll[k]*gipmx/gsw; - fprintf(ficresilk," %10.6f",-ll[k]*gipmx/gsw); - } - fprintf(ficresilk," %10.6f\n", -llt); + num[i], agebegin, ageend, i,s1,s2,mi,mw[mi][i],dh[mi][i],exp(lli),weight[i],weight[i]*gipmx/gsw, + 2*weight[i]*lli,out[s1][s2],savm[s1][s2]); + for(k=1,llt=0.,l=0.; k<=nlstate; k++){ + llt +=ll[k]*gipmx/gsw; + fprintf(ficresilk," %10.6f",-ll[k]*gipmx/gsw); + } + fprintf(ficresilk," %10.6f\n", -llt); } - } /* end of wave */ - } /* end of individual */ - for(k=1,l=0.; k<=nlstate; k++) l += ll[k]; - /* printf("l1=%f l2=%f ",ll[1],ll[2]); */ - l= l*ipmx/sw; /* To get the same order of magnitude as if weight=1 for every body */ - if(globpr==0){ /* First time we count the contributions and weights */ - gipmx=ipmx; - gsw=sw; - } - return -l; + } /* end of wave */ +} /* end of individual */ +for(k=1,l=0.; k<=nlstate; k++) l += ll[k]; +/* printf("l1=%f l2=%f ",ll[1],ll[2]); */ +l= l*ipmx/sw; /* To get the same order of magnitude as if weight=1 for every body */ +if(globpr==0){ /* First time we count the contributions and weights */ + gipmx=ipmx; + gsw=sw; +} +return -l; } @@ -3999,7 +4104,7 @@ void freqsummary(char fileres[], int ia Title=%s
Datafile=%s Firstpass=%d Lastpass=%d Stepm=%d Weight=%d Model=1+age+%s
\n",\ fileresphtm,version,fullversion,title,datafile,firstpass,lastpass,stepm, weightopt, model); } - fprintf(ficresphtm,"Current page is file %s
\n\n

Frequencies and prevalence by age at begin of transition

\n",fileresphtm, fileresphtm); + fprintf(ficresphtm,"Current page is file %s
\n\n

Frequencies and prevalence by age at begin of transition and dummy covariate value at beginning of transition

\n",fileresphtm, fileresphtm); strcpy(fileresphtmfr,subdirfext(optionfilefiname,"PHTMFR_",".htm")); if((ficresphtmfr=fopen(fileresphtmfr,"w"))==NULL) { @@ -4060,74 +4165,74 @@ Title=%s
Datafile=%s Firstpass=%d La for (iind=1; iind<=imx; iind++) { /* For each individual iind */ bool=1; if(anyvaryingduminmodel==0){ /* If All fixed covariates */ - if (cptcoveff >0) { /* Filter is here: Must be looked at for model=V1+V2+V3+V4 */ + if (cptcoveff >0) { /* Filter is here: Must be looked at for model=V1+V2+V3+V4 */ /* for (z1=1; z1<= nqfveff; z1++) { */ /* meanq[z1]+=coqvar[Tvar[z1]][iind]; /\* Computes mean of quantitative with selected filter *\/ */ /* } */ - for (z1=1; z1<=cptcoveff; z1++) { - /* if(Tvaraff[z1] ==-20){ */ - /* /\* sumnew+=cotvar[mw[mi][iind]][z1][iind]; *\/ */ - /* }else if(Tvaraff[z1] ==-10){ */ - /* /\* sumnew+=coqvar[z1][iind]; *\/ */ - /* }else */ - if (covar[Tvaraff[z1]][iind]!= nbcode[Tvaraff[z1]][codtabm(j1,z1)]){ - /* Tests if this individual iind responded to j1 (V4=1 V3=0) */ - bool=0; - /* printf("bool=%d i=%d, z1=%d, Tvaraff[%d]=%d, covar[Tvarff][%d]=%2f, codtabm(%d,%d)=%d, nbcode[Tvaraff][codtabm(%d,%d)=%d, j1=%d\n", - bool,i,z1, z1, Tvaraff[z1],i,covar[Tvaraff[z1]][i],j1,z1,codtabm(j1,z1), - j1,z1,nbcode[Tvaraff[z1]][codtabm(j1,z1)],j1);*/ - /* For j1=7 in V1+V2+V3+V4 = 0 1 1 0 and codtabm(7,3)=1 and nbcde[3][?]=1*/ - } /* Onlyf fixed */ - } /* end z1 */ - } /* cptcovn > 0 */ + for (z1=1; z1<=cptcoveff; z1++) { + /* if(Tvaraff[z1] ==-20){ */ + /* /\* sumnew+=cotvar[mw[mi][iind]][z1][iind]; *\/ */ + /* }else if(Tvaraff[z1] ==-10){ */ + /* /\* sumnew+=coqvar[z1][iind]; *\/ */ + /* }else */ + if (covar[Tvaraff[z1]][iind]!= nbcode[Tvaraff[z1]][codtabm(j1,z1)]){ + /* Tests if this individual iind responded to j1 (V4=1 V3=0) */ + bool=0; + /* printf("bool=%d i=%d, z1=%d, Tvaraff[%d]=%d, covar[Tvarff][%d]=%2f, codtabm(%d,%d)=%d, nbcode[Tvaraff][codtabm(%d,%d)=%d, j1=%d\n", + bool,i,z1, z1, Tvaraff[z1],i,covar[Tvaraff[z1]][i],j1,z1,codtabm(j1,z1), + j1,z1,nbcode[Tvaraff[z1]][codtabm(j1,z1)],j1);*/ + /* For j1=7 in V1+V2+V3+V4 = 0 1 1 0 and codtabm(7,3)=1 and nbcde[3][?]=1*/ + } /* Onlyf fixed */ + } /* end z1 */ + } /* cptcovn > 0 */ } /* end any */ if (bool==1){ /* We selected an individual iind satisfying combination j1 or all fixed */ - /* for(m=firstpass; m<=lastpass; m++){ */ - for(mi=1; mi=firstpass && m <=lastpass){ - k2=anint[m][iind]+(mint[m][iind]/12.); - /*if ((k2>=dateprev1) && (k2<=dateprev2)) {*/ - if(agev[m][iind]==0) agev[m][iind]=iagemax+1; /* All ages equal to 0 are in iagemax+1 */ - if(agev[m][iind]==1) agev[m][iind]=iagemax+2; /* All ages equal to 1 are in iagemax+2 */ - if (s[m][iind]>0 && s[m][iind]<=nlstate) /* If status at wave m is known and a live state */ - prop[s[m][iind]][(int)agev[m][iind]] += weight[iind]; /* At age of beginning of transition, where status is known */ - if (m1) && (agev[m][iind]< (iagemax+3)) && (anint[m][iind]!=9999) && (mint[m][iind]!=99)) { - dateintsum=dateintsum+k2; - k2cpt++; - /* printf("iind=%ld dateintmean = %lf dateintsum=%lf k2cpt=%lf k2=%lf\n",iind, dateintsum/k2cpt, dateintsum,k2cpt, k2); */ - } - } /* end bool 2 */ - } /* end m */ + /* for(m=firstpass; m<=lastpass; m++){ */ + for(mi=1; mi=firstpass && m <=lastpass){ + k2=anint[m][iind]+(mint[m][iind]/12.); + /*if ((k2>=dateprev1) && (k2<=dateprev2)) {*/ + if(agev[m][iind]==0) agev[m][iind]=iagemax+1; /* All ages equal to 0 are in iagemax+1 */ + if(agev[m][iind]==1) agev[m][iind]=iagemax+2; /* All ages equal to 1 are in iagemax+2 */ + if (s[m][iind]>0 && s[m][iind]<=nlstate) /* If status at wave m is known and a live state */ + prop[s[m][iind]][(int)agev[m][iind]] += weight[iind]; /* At age of beginning of transition, where status is known */ + if (m1) && (agev[m][iind]< (iagemax+3)) && (anint[m][iind]!=9999) && (mint[m][iind]!=99)) { + dateintsum=dateintsum+k2; + k2cpt++; + /* printf("iind=%ld dateintmean = %lf dateintsum=%lf k2cpt=%lf k2=%lf\n",iind, dateintsum/k2cpt, dateintsum,k2cpt, k2); */ + } + } /* end bool 2 */ + } /* end m */ } /* end bool */ } /* end iind = 1 to imx */ /* prop[s][age] is feeded for any initial and valid live state as well as @@ -4142,9 +4247,9 @@ Title=%s
Datafile=%s Firstpass=%d La fprintf(ficresphtm, "\n

********** Variable "); fprintf(ficresphtmfr, "\n

********** Variable "); for (z1=1; z1<=cptcoveff; z1++){ - fprintf(ficresp, "V%d=%d ",Tvaraff[z1],nbcode[Tvaraff[z1]][codtabm(j1,z1)]); - fprintf(ficresphtm, "V%d=%d ",Tvaraff[z1],nbcode[Tvaraff[z1]][codtabm(j1,z1)]); - fprintf(ficresphtmfr, "V%d=%d ",Tvaraff[z1],nbcode[Tvaraff[z1]][codtabm(j1,z1)]); + fprintf(ficresp, "V%d=%d ",Tvaraff[z1],nbcode[Tvaraff[z1]][codtabm(j1,z1)]); + fprintf(ficresphtm, "V%d=%d ",Tvaraff[z1],nbcode[Tvaraff[z1]][codtabm(j1,z1)]); + fprintf(ficresphtmfr, "V%d=%d ",Tvaraff[z1],nbcode[Tvaraff[z1]][codtabm(j1,z1)]); } fprintf(ficresp, "**********\n#"); fprintf(ficresphtm, "**********

\n"); @@ -4166,8 +4271,8 @@ Title=%s
Datafile=%s Firstpass=%d La fprintf(ficresphtmfr,"Age "); for(jk=-1; jk <=nlstate+ndeath; jk++){ for(m=-1; m <=nlstate+ndeath; m++){ - if(jk!=0 && m!=0) - fprintf(ficresphtmfr,"%d%d ",jk,m); + if(jk!=0 && m!=0) + fprintf(ficresphtmfr,"%d%d ",jk,m); } } fprintf(ficresphtmfr, "\n"); @@ -4803,7 +4908,7 @@ void concatwav(int wav[], int **dh, int /*********** Health Expectancies ****************/ -void evsij(double ***eij, double x[], int nlstate, int stepm, int bage, int fage, double **oldm, double **savm, int cij, int estepm,char strstart[] ) + void evsij(double ***eij, double x[], int nlstate, int stepm, int bage, int fage, double **oldm, double **savm, int cij, int estepm,char strstart[], int nres ) { /* Health expectancies, no variances */ @@ -4876,7 +4981,7 @@ void evsij(double ***eij, double x[], in /* Computed by stepm unit matrices, product of hstepma matrices, stored in an array of nhstepma length: nhstepma=10, hstepm=4, stepm=6 months */ - hpxij(p3mat,nhstepma,age,hstepm,x,nlstate,stepm,oldm, savm, cij); + hpxij(p3mat,nhstepma,age,hstepm,x,nlstate,stepm,oldm, savm, cij, nres); hf=hstepm*stepm/YEARM; /* Duration of hstepm expressed in year unit. */ @@ -4911,7 +5016,7 @@ void evsij(double ***eij, double x[], in } -void cvevsij(double ***eij, double x[], int nlstate, int stepm, int bage, int fage, double **oldm, double **savm, int cij, int estepm,double delti[],double **matcov,char strstart[] ) + void cvevsij(double ***eij, double x[], int nlstate, int stepm, int bage, int fage, double **oldm, double **savm, int cij, int estepm,double delti[],double **matcov,char strstart[], int nres ) { /* Covariances of health expectancies eij and of total life expectancies according @@ -5024,8 +5129,8 @@ void cvevsij(double ***eij, double x[], xp[i] = x[i] + (i==theta ?delti[theta]:0); xm[i] = x[i] - (i==theta ?delti[theta]:0); } - hpxij(p3matp,nhstepm,age,hstepm,xp,nlstate,stepm,oldm,savm, cij); - hpxij(p3matm,nhstepm,age,hstepm,xm,nlstate,stepm,oldm,savm, cij); + hpxij(p3matp,nhstepm,age,hstepm,xp,nlstate,stepm,oldm,savm, cij, nres); + hpxij(p3matm,nhstepm,age,hstepm,xm,nlstate,stepm,oldm,savm, cij, nres); for(j=1; j<= nlstate; j++){ for(i=1; i<=nlstate; i++){ @@ -5066,7 +5171,7 @@ void cvevsij(double ***eij, double x[], } /* Computing expectancies */ - hpxij(p3matm,nhstepm,age,hstepm,x,nlstate,stepm,oldm, savm, cij); + hpxij(p3matm,nhstepm,age,hstepm,x,nlstate,stepm,oldm, savm, cij,nres); for(i=1; i<=nlstate;i++) for(j=1; j<=nlstate;j++) for (h=0, eij[i][j][(int)age]=0; h<=nhstepm-1; h++){ @@ -5121,7 +5226,7 @@ void cvevsij(double ***eij, double x[], } /************ Variance ******************/ - void varevsij(char optionfilefiname[], double ***vareij, double **matcov, double x[], double delti[], int nlstate, int stepm, double bage, double fage, double **oldm, double **savm, double **prlim, double ftolpl, int *ncvyearp, int ij, int estepm, int cptcov, int cptcod, int popbased, int mobilav, char strstart[]) + void varevsij(char optionfilefiname[], double ***vareij, double **matcov, double x[], double delti[], int nlstate, int stepm, double bage, double fage, double **oldm, double **savm, double **prlim, double ftolpl, int *ncvyearp, int ij, int estepm, int cptcov, int cptcod, int popbased, int mobilav, char strstart[], int nres) { /* Variance of health expectancies */ /* double **prevalim(double **prlim, int nlstate, double *xp, double age, double **oldm, double ** savm,double ftolpl);*/ @@ -5247,7 +5352,7 @@ void cvevsij(double ***eij, double x[], xp[i] = x[i] + (i==theta ?delti[theta]:0); } - prevalim(prlim,nlstate,xp,age,oldm,savm,ftolpl,ncvyearp,ij); + prevalim(prlim,nlstate,xp,age,oldm,savm,ftolpl,ncvyearp,ij, nresult); if (popbased==1) { if(mobilav ==0){ @@ -5259,7 +5364,7 @@ void cvevsij(double ***eij, double x[], } } - hpxij(p3mat,nhstepm,age,hstepm,xp,nlstate,stepm,oldm,savm, ij); /* Returns p3mat[i][j][h] for h=1 to nhstepm */ + hpxij(p3mat,nhstepm,age,hstepm,xp,nlstate,stepm,oldm,savm, ij,nres); /* Returns p3mat[i][j][h] for h=1 to nhstepm */ for(j=1; j<= nlstate; j++){ for(h=0; h<=nhstepm; h++){ for(i=1, gp[h][j]=0.;i<=nlstate;i++) @@ -5279,7 +5384,7 @@ void cvevsij(double ***eij, double x[], for(i=1; i<=npar; i++) /* Computes gradient x - delta */ xp[i] = x[i] - (i==theta ?delti[theta]:0); - prevalim(prlim,nlstate,xp,age,oldm,savm,ftolpl,ncvyearp, ij); + prevalim(prlim,nlstate,xp,age,oldm,savm,ftolpl,ncvyearp, ij, nresult); if (popbased==1) { if(mobilav ==0){ @@ -5291,7 +5396,7 @@ void cvevsij(double ***eij, double x[], } } - hpxij(p3mat,nhstepm,age,hstepm,xp,nlstate,stepm,oldm,savm, ij); + hpxij(p3mat,nhstepm,age,hstepm,xp,nlstate,stepm,oldm,savm, ij,nres); for(j=1; j<= nlstate; j++){ /* Sum of wi * eij = e.j */ for(h=0; h<=nhstepm; h++){ @@ -5356,7 +5461,7 @@ void cvevsij(double ***eij, double x[], /* end ppptj */ /* x centered again */ - prevalim(prlim,nlstate,x,age,oldm,savm,ftolpl,ncvyearp,ij); + prevalim(prlim,nlstate,x,age,oldm,savm,ftolpl,ncvyearp,ij, nresult); if (popbased==1) { if(mobilav ==0){ @@ -5372,7 +5477,7 @@ void cvevsij(double ***eij, double x[], computed over hstepm (estepm) matrices product = hstepm*stepm months) as a weighted average of prlim. */ - hpxij(p3mat,nhstepm,age,hstepm,x,nlstate,stepm,oldm,savm, ij); + hpxij(p3mat,nhstepm,age,hstepm,x,nlstate,stepm,oldm,savm, ij, nres); for(j=nlstate+1;j<=nlstate+ndeath;j++){ for(i=1,gmp[j]=0.;i<= nlstate; i++) gmp[j] += prlim[i][i]*p3mat[i][j][1]; @@ -5435,7 +5540,7 @@ void cvevsij(double ***eij, double x[], } /* 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 *ncvyearp, int ij, char strstart[]) + 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 *ncvyearp, int ij, char strstart[], int nres) { /* Variance of prevalence limit for each state ij using current parameters x[] and estimates of neighbourhood give by delti*/ /* double **prevalim(double **prlim, int nlstate, double *xp, double age, double **oldm, double **savm,double ftolpl);*/ @@ -5478,9 +5583,9 @@ void cvevsij(double ***eij, double x[], xp[i] = x[i] + (i==theta ?delti[theta]:0); } if((int)age==79 ||(int)age== 80 ||(int)age== 81 ) - prevalim(prlim,nlstate,xp,age,oldm,savm,ftolpl,ncvyearp,ij); + prevalim(prlim,nlstate,xp,age,oldm,savm,ftolpl,ncvyearp,ij,nres); else - prevalim(prlim,nlstate,xp,age,oldm,savm,ftolpl,ncvyearp,ij); + prevalim(prlim,nlstate,xp,age,oldm,savm,ftolpl,ncvyearp,ij,nres); for(i=1;i<=nlstate;i++){ gp[i] = prlim[i][i]; mgp[theta][i] = prlim[i][i]; @@ -5488,9 +5593,9 @@ void cvevsij(double ***eij, double x[], for(i=1; i<=npar; i++) /* Computes gradient */ xp[i] = x[i] - (i==theta ?delti[theta]:0); if((int)age==79 ||(int)age== 80 ||(int)age== 81 ) - prevalim(prlim,nlstate,xp,age,oldm,savm,ftolpl,ncvyearp,ij); + prevalim(prlim,nlstate,xp,age,oldm,savm,ftolpl,ncvyearp,ij,nres); else - prevalim(prlim,nlstate,xp,age,oldm,savm,ftolpl,ncvyearp,ij); + prevalim(prlim,nlstate,xp,age,oldm,savm,ftolpl,ncvyearp,ij,nres); for(i=1;i<=nlstate;i++){ gm[i] = prlim[i][i]; mgm[theta][i] = prlim[i][i]; @@ -5898,11 +6003,13 @@ void printinghtml(char fileresu[], char int popforecast, int prevfcast, int backcast, int estepm , \ double jprev1, double mprev1,double anprev1, double dateprev1, \ double jprev2, double mprev2,double anprev2, double dateprev2){ - int jj1, k1, i1, cpt; + int jj1, k1, i1, cpt, k4, nres; fprintf(fichtm,""); + fprintf(fichtm,"
  • model=1+age+%s\n \ +
", model); fprintf(fichtm,"
  • Result files (first order: no variance)

    \n"); fprintf(fichtm,"
  • - Observed frequency between two states (during the period defined between %.lf/%.lf/%.lf and %.lf/%.lf/%.lf): %s (html file)
    \n", jprev1, mprev1,anprev1,jprev2, mprev2,anprev2,subdirfext3(optionfilefiname,"PHTMFR_",".htm"),subdirfext3(optionfilefiname,"PHTMFR_",".htm")); @@ -5937,16 +6044,27 @@ void printinghtml(char fileresu[], char if (cptcovn < 1) {m=1;ncodemax[1]=1;} jj1=0; + + for(nres=1; nres <= nresult; nres++) /* For each resultline */ for(k1=1; k1<=m;k1++){ + if(TKresult[nres]!= k1) + continue; /* for(i1=1; i1<=ncodemax[k1];i1++){ */ jj1++; if (cptcovn > 0) { fprintf(fichtm,"
    ************ Results for covariates"); for (cpt=1; cpt<=cptcoveff;cpt++){ - fprintf(fichtm," V%d=%d ",Tvaraff[cpt],nbcode[Tvaraff[cpt]][codtabm(jj1,cpt)]); - printf(" V%d=%d ",Tvaraff[cpt],nbcode[Tvaraff[cpt]][codtabm(jj1,cpt)]);fflush(stdout); + fprintf(fichtm," V%d=%d ",Tvresult[nres][cpt],(int)Tresult[nres][cpt]); + printf(" V%d=%d ",Tvresult[nres][cpt],Tresult[nres][cpt]);fflush(stdout); + /* fprintf(fichtm," V%d=%d ",Tvaraff[cpt],nbcode[Tvaraff[cpt]][codtabm(jj1,cpt)]); */ + /* printf(" V%d=%d ",Tvaraff[cpt],nbcode[Tvaraff[cpt]][codtabm(jj1,cpt)]);fflush(stdout); */ } + for (k4=1; k4<= nsq; k4++){ /* For each selected (single) quantitative value */ + fprintf(fichtm," V%d=%f ",Tvqresult[nres][k4],Tqresult[nres][k4]); + printf(" V%d=%f ",Tvqresult[nres][k4],Tqresult[nres][k4]);fflush(stdout); + } + /* if(nqfveff+nqtveff 0) */ /* Test to be done */ fprintf(fichtm," ************\n
    "); if(invalidvarcomb[k1]){ @@ -6058,13 +6176,22 @@ See page 'Matrix of variance-covariance if (cptcovn < 1) {m=1;ncodemax[1]=1;} jj1=0; + + for(nres=1; nres <= nresult; nres++) /* For each resultline */ for(k1=1; k1<=m;k1++){ + if(TKresult[nres]!= k1) + continue; /* for(i1=1; i1<=ncodemax[k1];i1++){ */ jj1++; if (cptcovn > 0) { fprintf(fichtm,"
    ************ Results for covariates"); for (cpt=1; cpt<=cptcoveff;cpt++) /**< cptcoveff number of variables */ - fprintf(fichtm," V%d=%d ",Tvaraff[cpt],nbcode[Tvaraff[cpt]][codtabm(jj1,cpt)]); + fprintf(fichtm," V%d=%d ",Tvresult[nres][cpt],Tresult[nres][cpt]); + /* fprintf(fichtm," V%d=%d ",Tvaraff[cpt],nbcode[Tvaraff[cpt]][codtabm(jj1,cpt)]); */ + for (k4=1; k4<= nsq; k4++){ /* For each selected (single) quantitative value */ + fprintf(fichtm," V%d=%f ",Tvqresult[nres][k4],Tqresult[nres][k4]); + } + fprintf(fichtm," ************\n
    "); if(invalidvarcomb[k1]){ @@ -6094,11 +6221,12 @@ void printinggnuplot(char fileresu[], ch char dirfileres[132],optfileres[132]; char gplotcondition[132]; - int cpt=0,k1=0,i=0,k=0,j=0,jk=0,k2=0,k3=0,ij=0,l=0; + int cpt=0,k1=0,i=0,k=0,j=0,jk=0,k2=0,k3=0,k4=0,ij=0, ijp=0, l=0; int lv=0, vlv=0, kl=0; int ng=0; int vpopbased; int ioffset; /* variable offset for columns */ + int nres=0; /* Index of resultline */ /* if((ficgp=fopen(optionfilegnuplot,"a"))==NULL) { */ /* printf("Problem with file %s",optionfilegnuplot); */ @@ -6143,9 +6271,14 @@ void printinggnuplot(char fileresu[], ch strcpy(optfileres,"vpl"); /* 1eme*/ for (cpt=1; cpt<= nlstate ; cpt ++) { /* For each live state */ - for (k1=1; k1<= m && selected(k1) ; k1 ++) { /* For each valid combination of covariate */ - /* plot [100000000000000000000:-100000000000000000000] "mysbiaspar/vplrmysbiaspar.txt to check */ - fprintf(ficgp,"\n# 1st: Period (stable) prevalence with CI: 'VPL_' files "); + for (k1=1; k1<= m ; k1 ++) /* For each valid combination of covariate */ + for(nres=1; nres <= nresult; nres++){ /* For each resultline */ + /* plot [100000000000000000000:-100000000000000000000] "mysbiaspar/vplrmysbiaspar.txt to check */ + if(TKresult[nres]!= k1) + continue; + /* We are interested in selected combination by the resultline */ + printf("\n# 1st: Period (stable) prevalence with CI: 'VPL_' files and live state =%d ", cpt); + fprintf(ficgp,"\n# 1st: Period (stable) prevalence with CI: 'VPL_' files and live state =%d ", cpt); for (k=1; k<=cptcoveff; k++){ /* For each covariate k get corresponding value lv for combination k1 */ lv= decodtabm(k1,k,cptcoveff); /* Should be the value of the covariate corresponding to k1 combination */ /* decodtabm(1,1,4) = 1 because h=1 k= (1) 1 1 1 */ @@ -6153,21 +6286,27 @@ void printinggnuplot(char fileresu[], ch /* decodtabm(13,3,4)= 2 because h=13 k= 1 1 (2) 2 */ vlv= nbcode[Tvaraff[k]][lv]; /* vlv is the value of the covariate lv, 0 or 1 */ /* For each combination of covariate k1 (V1=1, V3=0), we printed the current covariate k and its value vlv */ + printf(" V%d=%d ",Tvaraff[k],vlv); fprintf(ficgp," V%d=%d ",Tvaraff[k],vlv); } + for (k4=1; k4<= nsq; k4++){ /* For each selected (single) quantitative value */ + printf(" V%d=%f ",Tvqresult[nres][k4],Tqresult[nres][k4]); + fprintf(ficgp," V%d=%f ",Tvqresult[nres][k4],Tqresult[nres][k4]); + } + printf("\n#\n"); fprintf(ficgp,"\n#\n"); if(invalidvarcomb[k1]){ fprintf(ficgp,"#Combination (%d) ignored because no cases \n",k1); continue; } - + fprintf(ficgp,"\nset out \"%s_%d-%d.svg\" \n",subdirf2(optionfilefiname,"V_"),cpt,k1); fprintf(ficgp,"\n#set out \"V_%s_%d-%d.svg\" \n",optionfilefiname,cpt,k1); fprintf(ficgp,"set xlabel \"Age\" \n\ -set ylabel \"Probability\" \n \ -set ter svg size 640, 480\n \ +set ylabel \"Probability\" \n \ +set ter svg size 640, 480\n \ plot [%.f:%.f] \"%s\" every :::%d::%d u 1:2 \"%%lf",ageminpar,fage,subdirf2(fileresu,"VPL_"),k1-1,k1-1); - + for (i=1; i<= nlstate ; i ++) { if (i==cpt) fprintf(ficgp," %%lf (%%lf)"); else fprintf(ficgp," %%*lf (%%*lf)"); @@ -6214,9 +6353,13 @@ plot [%.f:%.f] \"%s\" every :::%d::%d u fprintf(ficgp,"\nset out \n"); } /* k1 */ } /* cpt */ - /*2 eme*/ - for (k1=1; k1<= m ; k1 ++) { + + /*2 eme*/ + for (k1=1; k1<= m ; k1 ++) + for(nres=1; nres <= nresult; nres++){ /* For each resultline */ + if(TKresult[nres]!= k1) + continue; fprintf(ficgp,"\n# 2nd: Total life expectancy with CI: 't' files "); for (k=1; k<=cptcoveff; k++){ /* For each covariate and each value */ lv= decodtabm(k1,k,cptcoveff); /* Should be the covariate number corresponding to k1 combination */ @@ -6226,6 +6369,10 @@ plot [%.f:%.f] \"%s\" every :::%d::%d u vlv= nbcode[Tvaraff[k]][lv]; fprintf(ficgp," V%d=%d ",Tvaraff[k],vlv); } + for (k4=1; k4<= nsq; k4++){ /* For each selected (single) quantitative value */ + printf(" V%d=%f ",Tvqresult[nres][k4],Tqresult[nres][k4]); + fprintf(ficgp," V%d=%f ",Tvqresult[nres][k4],Tqresult[nres][k4]); + } fprintf(ficgp,"\n#\n"); if(invalidvarcomb[k1]){ fprintf(ficgp,"#Combination (%d) ignored because no cases \n",k1); @@ -6263,15 +6410,18 @@ plot [%.f:%.f] \"%s\" every :::%d::%d u } /* state */ } /* vpopbased */ fprintf(ficgp,"\nset out;set out \"%s_%d.svg\"; replot; set out; \n",subdirf2(optionfilefiname,"E_"),k1); /* Buggy gnuplot */ - } /* k1 */ + } /* k1 end 2 eme*/ /*3eme*/ - for (k1=1; k1<= m ; k1 ++) { + for (k1=1; k1<= m ; k1 ++) + for(nres=1; nres <= nresult; nres++){ /* For each resultline */ + if(TKresult[nres]!= k) + continue; for (cpt=1; cpt<= nlstate ; cpt ++) { - fprintf(ficgp,"\n# 3d: Life expectancy with EXP_ files: cov=%d state=%d",k1, cpt); - for (k=1; k<=cptcoveff; k++){ /* For each covariate and each value */ + fprintf(ficgp,"\n# 3d: Life expectancy with EXP_ files: combination=%d state=%d",k1, cpt); + for (k=1; k<=cptcoveff; k++){ /* For each covariate dummy combination and each value */ lv= decodtabm(k1,k,cptcoveff); /* Should be the covariate number corresponding to k1 combination */ /* decodtabm(1,1,4) = 1 because h=1 k= (1) 1 1 1 */ /* decodtabm(1,2,4) = 1 because h=1 k= 1 (1) 1 1 */ @@ -6279,6 +6429,10 @@ plot [%.f:%.f] \"%s\" every :::%d::%d u vlv= nbcode[Tvaraff[k]][lv]; fprintf(ficgp," V%d=%d ",Tvaraff[k],vlv); } + /* for(k=1; k <= ncovds; k++){ */ + for (k4=1; k4<= nsq; k4++){ /* For each selected (single) quantitative value */ + fprintf(ficgp," V%d=%f ",Tvqresult[nres][k4],Tqresult[nres][k4]); + } fprintf(ficgp,"\n#\n"); if(invalidvarcomb[k1]){ fprintf(ficgp,"#Combination (%d) ignored because no cases \n",k1); @@ -6309,7 +6463,10 @@ plot [%.f:%.f] \"%s\" every :::%d::%d u /* 4eme */ /* Survival functions (period) from state i in state j by initial state i */ - for (k1=1; k1<= m ; k1 ++) { /* For each multivariate if any */ + for (k1=1; k1<= m ; k1 ++) /* For each covariate combination if any */ + for(nres=1; nres <= nresult; nres++){ /* For each resultline */ + if(TKresult[nres]!= k1) + continue; for (cpt=1; cpt<=nlstate ; cpt ++) { /* For each life state */ fprintf(ficgp,"\n#\n#\n# Survival functions in state j : 'LIJ_' files, cov=%d state=%d",k1, cpt); @@ -6321,6 +6478,9 @@ plot [%.f:%.f] \"%s\" every :::%d::%d u vlv= nbcode[Tvaraff[k]][lv]; fprintf(ficgp," V%d=%d ",Tvaraff[k],vlv); } + for (k4=1; k4<= nsq; k4++){ /* For each selected (single) quantitative value */ + fprintf(ficgp," V%d=%f ",Tvqresult[nres][k4],Tqresult[nres][k4]); + } fprintf(ficgp,"\n#\n"); if(invalidvarcomb[k1]){ fprintf(ficgp,"#Combination (%d) ignored because no cases \n",k1); @@ -6351,7 +6511,10 @@ plot [%.f:%.f] ", ageminpar, agemaxpar) /* 5eme */ /* Survival functions (period) from state i in state j by final state j */ - for (k1=1; k1<= m ; k1 ++) { /* For each covariate if any */ + for (k1=1; k1<= m ; k1 ++) /* For each covariate combination if any */ + for(nres=1; nres <= nresult; nres++){ /* For each resultline */ + if(TKresult[nres]!= k1) + continue; for (cpt=1; cpt<=nlstate ; cpt ++) { /* For each inital state */ fprintf(ficgp,"\n#\n#\n# Survival functions in state j and all livestates from state i by final state j: 'lij' files, cov=%d state=%d",k1, cpt); @@ -6363,6 +6526,9 @@ plot [%.f:%.f] ", ageminpar, agemaxpar) vlv= nbcode[Tvaraff[k]][lv]; fprintf(ficgp," V%d=%d ",Tvaraff[k],vlv); } + for (k4=1; k4<= nsq; k4++){ /* For each selected (single) quantitative value */ + fprintf(ficgp," V%d=%f ",Tvqresult[nres][k4],Tqresult[nres][k4]); + } fprintf(ficgp,"\n#\n"); if(invalidvarcomb[k1]){ fprintf(ficgp,"#Combination (%d) ignored because no cases \n",k1); @@ -6401,7 +6567,10 @@ plot [%.f:%.f] ", ageminpar, agemaxpar) /* 6eme */ /* CV preval stable (period) for each covariate */ - for (k1=1; k1<= m ; k1 ++) { /* For each covariate combination (1 to m=2**k), if any covariate is present */ + for (k1=1; k1<= m ; k1 ++) /* For each covariate combination if any */ + for(nres=1; nres <= nresult; nres++){ /* For each resultline */ + if(TKresult[nres]!= k1) + continue; for (cpt=1; cpt<=nlstate ; cpt ++) { /* For each life state */ fprintf(ficgp,"\n#\n#\n#CV preval stable (period): 'pij' files, covariatecombination#=%d state=%d",k1, cpt); @@ -6413,6 +6582,9 @@ plot [%.f:%.f] ", ageminpar, agemaxpar) vlv= nbcode[Tvaraff[k]][lv]; fprintf(ficgp," V%d=%d ",Tvaraff[k],vlv); } + for (k4=1; k4<= nsq; k4++){ /* For each selected (single) quantitative value */ + fprintf(ficgp," V%d=%f ",Tvqresult[nres][k4],Tqresult[nres][k4]); + } fprintf(ficgp,"\n#\n"); if(invalidvarcomb[k1]){ fprintf(ficgp,"#Combination (%d) ignored because no cases \n",k1); @@ -6444,7 +6616,10 @@ plot [%.f:%.f] ", ageminpar, agemaxpar) /* 7eme */ if(backcast == 1){ /* CV back preval stable (period) for each covariate */ - for (k1=1; k1<= m ; k1 ++) { /* For each covariate combination (1 to m=2**k), if any covariate is present */ + for (k1=1; k1<= m ; k1 ++) /* For each covariate combination if any */ + for(nres=1; nres <= nresult; nres++){ /* For each resultline */ + if(TKresult[nres]!= k1) + continue; for (cpt=1; cpt<=nlstate ; cpt ++) { /* For each life state */ fprintf(ficgp,"\n#\n#\n#CV Back preval stable (period): 'pij' files, covariatecombination#=%d state=%d",k1, cpt); for (k=1; k<=cptcoveff; k++){ /* For each covariate and each value */ @@ -6455,6 +6630,9 @@ plot [%.f:%.f] ", ageminpar, agemaxpar) vlv= nbcode[Tvaraff[k]][lv]; fprintf(ficgp," V%d=%d ",Tvaraff[k],vlv); } + for (k4=1; k4<= nsq; k4++){ /* For each selected (single) quantitative value */ + fprintf(ficgp," V%d=%f ",Tvqresult[nres][k4],Tqresult[nres][k4]); + } fprintf(ficgp,"\n#\n"); if(invalidvarcomb[k1]){ fprintf(ficgp,"#Combination (%d) ignored because no cases \n",k1); @@ -6491,7 +6669,10 @@ plot [%.f:%.f] ", ageminpar, agemaxpar) if(prevfcast==1){ /* Projection from cross-sectional to stable (period) for each covariate */ - for (k1=1; k1<= m ; k1 ++) { /* For each covariate combination (1 to m=2**k), if any covariate is present */ + for (k1=1; k1<= m ; k1 ++) /* For each covariate combination if any */ + for(nres=1; nres <= nresult; nres++){ /* For each resultline */ + if(TKresult[nres]!= k1) + continue; for (cpt=1; cpt<=nlstate ; cpt ++) { /* For each life state */ fprintf(ficgp,"\n#\n#\n#Projection of prevalence to stable (period): 'PROJ_' files, covariatecombination#=%d state=%d",k1, cpt); for (k=1; k<=cptcoveff; k++){ /* For each correspondig covariate value */ @@ -6502,6 +6683,9 @@ plot [%.f:%.f] ", ageminpar, agemaxpar) vlv= nbcode[Tvaraff[k]][lv]; fprintf(ficgp," V%d=%d ",Tvaraff[k],vlv); } + for (k4=1; k4<= nsq; k4++){ /* For each selected (single) quantitative value */ + fprintf(ficgp," V%d=%f ",Tvqresult[nres][k4],Tqresult[nres][k4]); + } fprintf(ficgp,"\n#\n"); if(invalidvarcomb[k1]){ fprintf(ficgp,"#Combination (%d) ignored because no cases \n",k1); @@ -6613,10 +6797,19 @@ plot [%.f:%.f] ", ageminpar, agemaxpar) fprintf(ficgp,"# +exp(a14+b14*age+c14age*age+d14*V1+e14*V1*age)+...)\n"); fprintf(ficgp,"#\n"); for(ng=1; ng<=3;ng++){ /* Number of graphics: first is logit, 2nd is probabilities, third is incidences per year*/ + fprintf(ficgp,"#Number of graphics: first is logit, 2nd is probabilities, third is incidences per year \n"); + fprintf(ficgp,"#model=%s \n",model); fprintf(ficgp,"# ng=%d\n",ng); - fprintf(ficgp,"# jk=1 to 2^%d=%d\n",cptcoveff,m); - for(jk=1; jk <=m; jk++) { - fprintf(ficgp,"# jk=%d\n",jk); + fprintf(ficgp,"# jk=1 to 2^%d=%d\n",cptcoveff,m);/* to be checked */ + for(jk=1; jk <=m; jk++) /* For each combination of covariate */ + for(nres=1; nres <= nresult; nres++){ /* For each resultline */ + if(TKresult[nres]!= jk) + continue; + fprintf(ficgp,"# Combination of dummy jk=%d and ",jk); + for (k4=1; k4<= nsq; k4++){ /* For each selected (single) quantitative value */ + fprintf(ficgp," V%d=%f ",Tvqresult[nres][k4],Tqresult[nres][k4]); + } + fprintf(ficgp,"\n#\n"); fprintf(ficgp,"\nset out \"%s_%d-%d.svg\" ",subdirf2(optionfilefiname,"PE_"),jk,ng); fprintf(ficgp,"\nset ter svg size 640, 480 "); if (ng==1){ @@ -6657,18 +6850,49 @@ plot [%.f:%.f] ", ageminpar, agemaxpar) break; } ij=1;/* To be checked else nbcode[0][0] wrong */ - for(j=3; j <=ncovmodel-nagesqr; j++) { + ijp=1; /* product no age */ + /* for(j=3; j <=ncovmodel-nagesqr; j++) { */ + for(j=1; j <=cptcovt; j++) { /* For each covariate of the simplified model */ /* printf("Tage[%d]=%d, j=%d\n", ij, Tage[ij], j); */ - if(ij <=cptcovage) { /* Bug valgrind */ - if((j-2)==Tage[ij]) { /* Bug valgrind */ - fprintf(ficgp,"+p%d*%d*x",i+j+nagesqr-1,nbcode[Tvar[j-2]][codtabm(jk,j-2)]); - /* fprintf(ficgp,"+p%d*%d*x",i+j+nagesqr-1,nbcode[Tvar[j-2]][codtabm(jk,Tvar[j-2])]); */ + if(j==Tage[ij]) { /* Product by age */ + if(ij <=cptcovage) { /* V5+V4+V3+V4*V3+V5*age+V2+V1*V2+V1*age+V1, 2 V5 and V1 */ + if(Dummy[j]==0){ + fprintf(ficgp,"+p%d*%d*x",i+j+2+nagesqr-1,Tinvresult[nres][Tvar[j]]);; + }else{ /* quantitative */ + fprintf(ficgp,"+p%d*%f*x",i+j+2+nagesqr-1,Tqinvresult[nres][Tvar[j]]); /* Tqinvresult in decoderesult */ + /* fprintf(ficgp,"+p%d*%d*x",i+j+nagesqr-1,nbcode[Tvar[j-2]][codtabm(jk,Tvar[j-2])]); */ + } ij++; } - } - else - fprintf(ficgp,"+p%d*%d",i+j+nagesqr-1,nbcode[Tvar[j-2]][codtabm(jk,j-2)]); /* Valgrind bug nbcode */ - } + }else if(j==Tprod[ijp]) { /* */ + /* printf("Tprod[%d]=%d, j=%d\n", ij, Tprod[ijp], j); */ + if(ijp <=cptcovprod) { /* Product */ + if(Dummy[Tvard[ijp][1]]==0){/* Vn is dummy */ + if(Dummy[Tvard[ijp][2]]==0){/* Vn and Vm are dummy */ + /* fprintf(ficgp,"+p%d*%d*%d",i+j+2+nagesqr-1,nbcode[Tvard[ijp][1]][codtabm(jk,j)],nbcode[Tvard[ijp][2]][codtabm(jk,j)]); */ + fprintf(ficgp,"+p%d*%d*%d",i+j+2+nagesqr-1,Tinvresult[nres][Tvard[ijp][1]],Tinvresult[nres][Tvard[ijp][2]]); + }else{ /* Vn is dummy and Vm is quanti */ + /* fprintf(ficgp,"+p%d*%d*%f",i+j+2+nagesqr-1,nbcode[Tvard[ijp][1]][codtabm(jk,j)],Tqinvresult[nres][Tvard[ijp][2]]); */ + fprintf(ficgp,"+p%d*%d*%f",i+j+2+nagesqr-1,Tinvresult[nres][Tvard[ijp][1]],Tqinvresult[nres][Tvard[ijp][2]]); + } + }else{ /* Vn*Vm Vn is quanti */ + if(Dummy[Tvard[ijp][2]]==0){ + fprintf(ficgp,"+p%d*%d*%f",i+j+2+nagesqr-1,Tinvresult[nres][Tvard[ijp][2]],Tqinvresult[nres][Tvard[ijp][1]]); + }else{ /* Both quanti */ + fprintf(ficgp,"+p%d*%f*%f",i+j+2+nagesqr-1,Tqinvresult[nres][Tvard[ijp][1]],Tqinvresult[nres][Tvard[ijp][2]]); + } + } + } + } else{ /* simple covariate */ + /* fprintf(ficgp,"+p%d*%d",i+j+2+nagesqr-1,nbcode[Tvar[j]][codtabm(jk,j)]); /\* Valgrind bug nbcode *\/ */ + if(Dummy[j]==0){ + fprintf(ficgp,"+p%d*%d",i+j+2+nagesqr-1,Tinvresult[nres][Tvar[j]]); /* */ + }else{ /* quantitative */ + fprintf(ficgp,"+p%d*%f",i+j+2+nagesqr-1,Tqinvresult[nres][Tvar[j]]); /* */ + /* fprintf(ficgp,"+p%d*%d*x",i+j+nagesqr-1,nbcode[Tvar[j-2]][codtabm(jk,Tvar[j-2])]); */ + } + } /* end simple */ + } /* end j */ }else{ i=i-ncovmodel; if(ng !=1 ) /* For logit formula of log p11 is more difficult to get */ @@ -6686,8 +6910,8 @@ plot [%.f:%.f] ", ageminpar, agemaxpar) ij=1; for(j=3; j <=ncovmodel-nagesqr; j++){ - if(ij <=cptcovage) { /* Bug valgrind */ - if((j-2)==Tage[ij]) { /* Bug valgrind */ + if((j-2)==Tage[ij]) { /* Bug valgrind */ + if(ij <=cptcovage) { /* Bug valgrind */ fprintf(ficgp,"+p%d*%d*x",k3+(k1-1)*ncovmodel+1+j-2+nagesqr,nbcode[Tvar[j-2]][codtabm(jk,j-2)]); /* fprintf(ficgp,"+p%d*%d*x",k3+(k1-1)*ncovmodel+1+j-2+nagesqr,nbcode[Tvar[j-2]][codtabm(jk,Tvar[j-2])]); */ ij++; @@ -6839,7 +7063,7 @@ plot [%.f:%.f] ", ageminpar, agemaxpar) } /* end bad */ for (age=bage; age<=fage; age++){ - printf("%d %d ", cptcod, (int)age); + /* printf("%d %d ", cptcod, (int)age); */ sumnewp[cptcod]=0.; sumnewm[cptcod]=0.; for (i=1; i<=nlstate;i++){ @@ -6878,13 +7102,13 @@ plot [%.f:%.f] ", ageminpar, agemaxpar) /************** Forecasting ******************/ -void prevforecast(char fileres[], double anproj1, double mproj1, double jproj1, double ageminpar, double agemax, double dateprev1, double dateprev2, int mobilav, double bage, double fage, int firstpass, int lastpass, double anproj2, double p[], int cptcoveff){ + void prevforecast(char fileres[], double anproj1, double mproj1, double jproj1, double ageminpar, double agemax, double dateprev1, double dateprev2, int mobilav, double bage, double fage, int firstpass, int lastpass, double anproj2, double p[], int cptcoveff){ /* proj1, year, month, day of starting projection agemin, agemax range of age dateprev1 dateprev2 range of dates during which prevalence is computed anproj2 year of en of projection (same day and month as proj1). */ - int yearp, stepsize, hstepm, nhstepm, j, k, cptcod, i, h, i1; + int yearp, stepsize, hstepm, nhstepm, j, k, cptcod, i, h, i1, k4, nres=0; double agec; /* generic age */ double agelim, ppij, yp,yp1,yp2,jprojmean,mprojmean,anprojmean; double *popeffectif,*popcount; @@ -6906,8 +7130,8 @@ void prevforecast(char fileres[], double printf("Problem with forecast resultfile: %s\n", fileresf); fprintf(ficlog,"Problem with forecast resultfile: %s\n", fileresf); } - printf("Computing forecasting: result on file '%s', please wait... \n", fileresf); - fprintf(ficlog,"Computing forecasting: result on file '%s', please wait... \n", fileresf); + printf("\nComputing forecasting: result on file '%s', please wait... \n", fileresf); + fprintf(ficlog,"\nComputing forecasting: result on file '%s', please wait... \n", fileresf); if (cptcoveff==0) ncodemax[cptcoveff]=1; @@ -6938,7 +7162,10 @@ void prevforecast(char fileres[], double fprintf(ficresf,"#****** Routine prevforecast **\n"); /* if (h==(int)(YEARM*yearp)){ */ - for(k=1;k<=i1;k++){ + for(nres=1; nres <= nresult; nres++) /* For each resultline */ + for(k=1; k<=i1;k++){ + if(TKresult[nres]!= k) + continue; if(invalidvarcomb[k]){ printf("\nCombination (%d) projection ignored because no cases \n",k); continue; @@ -6947,6 +7174,10 @@ void prevforecast(char fileres[], double for(j=1;j<=cptcoveff;j++) { fprintf(ficresf," V%d (=) %d",Tvaraff[j],nbcode[Tvaraff[j]][codtabm(k,j)]); } + for (k4=1; k4<= nsq; k4++){ /* For each selected (single) quantitative value */ + printf(" V%d=%f ",Tvqresult[nres][k4],Tqresult[nres][k4]); + fprintf(ficlog," V%d=%f ",Tvqresult[nres][k4],Tqresult[nres][k4]); + } fprintf(ficresf," yearproj age"); for(j=1; j<=nlstate+ndeath;j++){ for(i=1; i<=nlstate;i++) @@ -6961,7 +7192,7 @@ void prevforecast(char fileres[], double nhstepm = nhstepm/hstepm; p3mat=ma3x(1,nlstate+ndeath,1, nlstate+ndeath, 0,nhstepm); oldm=oldms;savm=savms; - hpxij(p3mat,nhstepm,agec,hstepm,p,nlstate,stepm,oldm,savm, k); + hpxij(p3mat,nhstepm,agec,hstepm,p,nlstate,stepm,oldm,savm, k,nres); for (h=0; h<=nhstepm; h++){ if (h*hstepm/YEARM*stepm ==yearp) { @@ -7591,85 +7822,87 @@ int readdata(char datafile[], int firsto /* Loops on waves */ for (j=maxwav;j>=1;j--){ for (iv=nqtv;iv>=1;iv--){ /* Loop on time varying quantitative variables */ - cutv(stra, strb, line, ' '); - if(strb[0]=='.') { /* Missing value */ - lval=-1; - cotqvar[j][iv][i]=-1; /* 0.0/0.0 */ - if(isalpha(strb[1])) { /* .m or .d Really Missing value */ - printf("Error reading data around '%s' at line number %d for individual %d, '%s'\nShould be the %d th quantitative value out of %d measured at wave %d. If missing, you should remove this individual or impute a value. Exiting.\n", strb, linei,i,line,iv, nqtv, j); - fprintf(ficlog,"Error reading data around '%s' at line number %d for individual %d, '%s'\nShould be the %d th quantitative value out of %d measured at wave %d. If missing, you should remove this individual or impute a value. Exiting.\n", strb, linei,i,line,iv, nqtv, j);fflush(ficlog); - return 1; - } - }else{ - errno=0; - /* what_kind_of_number(strb); */ - dval=strtod(strb,&endptr); - /* if( strb[0]=='\0' || (*endptr != '\0')){ */ - /* if(strb != endptr && *endptr == '\0') */ - /* dval=dlval; */ - /* 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 the %d th quantitative value out of %d measured at wave %d. Setting maxwav=%d might be wrong. Exiting.\n", strb, linei,i,line,iv, nqtv, j,maxwav); - fprintf(ficlog,"Error reading data around '%s' at line number %d for individual %d, '%s'\nShould be the %d th quantitative value out of %d measured at wave %d. Setting maxwav=%d might be wrong. Exiting.\n", strb, linei,i,line, iv, nqtv, j,maxwav);fflush(ficlog); - return 1; - } - cotqvar[j][iv][i]=dval; - } - strcpy(line,stra); + cutv(stra, strb, line, ' '); + if(strb[0]=='.') { /* Missing value */ + lval=-1; + cotqvar[j][iv][i]=-1; /* 0.0/0.0 */ + cotvar[j][ntv+iv][i]=-1; /* For performance reasons */ + if(isalpha(strb[1])) { /* .m or .d Really Missing value */ + printf("Error reading data around '%s' at line number %d for individual %d, '%s'\nShould be the %d th quantitative value out of %d measured at wave %d. If missing, you should remove this individual or impute a value. Exiting.\n", strb, linei,i,line,iv, nqtv, j); + fprintf(ficlog,"Error reading data around '%s' at line number %d for individual %d, '%s'\nShould be the %d th quantitative value out of %d measured at wave %d. If missing, you should remove this individual or impute a value. Exiting.\n", strb, linei,i,line,iv, nqtv, j);fflush(ficlog); + return 1; + } + }else{ + errno=0; + /* what_kind_of_number(strb); */ + dval=strtod(strb,&endptr); + /* if( strb[0]=='\0' || (*endptr != '\0')){ */ + /* if(strb != endptr && *endptr == '\0') */ + /* dval=dlval; */ + /* 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 the %d th quantitative value out of %d measured at wave %d. Setting maxwav=%d might be wrong. Exiting.\n", strb, linei,i,line,iv, nqtv, j,maxwav); + fprintf(ficlog,"Error reading data around '%s' at line number %d for individual %d, '%s'\nShould be the %d th quantitative value out of %d measured at wave %d. Setting maxwav=%d might be wrong. Exiting.\n", strb, linei,i,line, iv, nqtv, j,maxwav);fflush(ficlog); + return 1; + } + cotqvar[j][iv][i]=dval; + cotvar[j][ntv+iv][i]=dval; + } + strcpy(line,stra); }/* end loop ntqv */ for (iv=ntv;iv>=1;iv--){ /* Loop on time varying dummies */ - cutv(stra, strb, line, ' '); - if(strb[0]=='.') { /* Missing value */ - 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 the %d th dummy covariate out of %d measured at wave %d. Setting maxwav=%d might be wrong. Exiting.\n", strb, linei,i,line,iv, ntv, j,maxwav); - fprintf(ficlog,"Error reading data around '%s' at line number %d for individual %d, '%s'\nShould be the %d dummy covariate out of %d measured wave %d. Setting maxwav=%d might be wrong. Exiting.\n", strb, linei,i,line,iv, ntv,j,maxwav);fflush(ficlog); - return 1; - } - } - if(lval <-1 || lval >1){ - printf("Error reading data around '%ld' at line number %d for individual %d, '%s'\n \ + cutv(stra, strb, line, ' '); + if(strb[0]=='.') { /* Missing value */ + 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 the %d th dummy covariate out of %d measured at wave %d. Setting maxwav=%d might be wrong. Exiting.\n", strb, linei,i,line,iv, ntv, j,maxwav); + fprintf(ficlog,"Error reading data around '%s' at line number %d for individual %d, '%s'\nShould be the %d dummy covariate out of %d measured wave %d. Setting maxwav=%d might be wrong. Exiting.\n", strb, linei,i,line,iv, ntv,j,maxwav);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 \ + 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 \ + 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 \ + 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 \ + 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 \ + output of IMaCh is often meaningless.\n \ Exiting.\n",lval,linei, i,line,j);fflush(ficlog); - return 1; - } - cotvar[j][iv][i]=(double)(lval); - strcpy(line,stra); + return 1; + } + cotvar[j][iv][i]=(double)(lval); + strcpy(line,stra); }/* end loop ntv */ /* Statuses at wave */ cutv(stra, strb, line, ' '); if(strb[0]=='.') { /* Missing value */ - lval=-1; + 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; - } + 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; @@ -7827,24 +8060,30 @@ int readdata(char datafile[], int firsto return (1); } -void removespace(char **stri){/*, char stro[]) {*/ +void removefirstspace(char **stri){/*, char stro[]) {*/ char *p1 = *stri, *p2 = *stri; - do - while (*p2 == ' ') - p2++; - while (*p1++ == *p2++); - *stri=p1; + while (*p2 == ' ') + p2++; + /* while ((*p1++ = *p2++) !=0) */ + /* ; */ + /* do */ + /* while (*p2 == ' ') */ + /* p2++; */ + /* while (*p1++ == *p2++); */ + *stri=p2; } -int decoderesult ( char resultline[]) +int decoderesult ( char resultline[], int nres) /**< This routine decode one result line and returns the combination # of dummy covariates only **/ { - int j=0, k=0; + int j=0, k=0, k1=0, k2=0, k3=0, k4=0, match=0, k2q=0, k3q=0, k4q=0; char resultsav[MAXLINE]; + int resultmodel[MAXLINE]; + int modelresult[MAXLINE]; char stra[80], strb[80], strc[80], strd[80],stre[80]; - removespace(&resultline); - printf("decoderesult=%s\n",resultline); + removefirstspace(&resultline); + printf("decoderesult:%s\n",resultline); if (strstr(resultline,"v") !=0){ printf("Error. 'v' must be in upper case 'V' result: %s ",resultline); @@ -7855,13 +8094,19 @@ int decoderesult ( char resultline[]) if (strlen(resultsav) >1){ j=nbocc(resultsav,'='); /**< j=Number of covariate values'=' */ } - - for(k=1; k<=j;k++){ /* Loop on total covariates of the model */ - cutl(stra,strb,resultsav,' '); /* keeps in strb after the first ' ' - resultsav= V4=1 V5=25.1 V3=0 strb=V3=0 stra= V4=1 V5=25.1 */ - cutl(strc,strd,strb,'='); /* strb:V4=1 strc=1 strd=V4 */ + if( j != cptcovs ){ /* Be careful if a variable is in a product but not single */ + printf("ERROR: the number of variable in the resultline, %d, differs from the number of variable used in the model line, %d.\n",j, cptcovs); + fprintf(ficlog,"ERROR: the number of variable in the resultline, %d, differs from the number of variable used in the model line, %d.\n",j, cptcovs); + } + for(k=1; k<=j;k++){ /* Loop on any covariate of the result line */ + if(nbocc(resultsav,'=') >1){ + cutl(stra,strb,resultsav,' '); /* keeps in strb after the first ' ' + resultsav= V4=1 V5=25.1 V3=0 strb=V3=0 stra= V4=1 V5=25.1 */ + cutl(strc,strd,strb,'='); /* strb:V4=1 strc=1 strd=V4 */ + }else + cutl(strc,strd,resultsav,'='); Tvalsel[k]=atof(strc); /* 1 */ - + cutl(strc,stre,strd,'V'); /* strd='V4' strc=4 stre='V' */; Tvarsel[k]=atoi(strc); /* Typevarsel[k]=1; /\* 1 for age product *\/ */ @@ -7869,14 +8114,83 @@ int decoderesult ( char resultline[]) if (nbocc(stra,'=') >0) strcpy(resultsav,stra); /* and analyzes it */ } + /* Checking for missing or useless values in comparison of current model needs */ + for(k1=1; k1<= cptcovt ;k1++){ /* model line V5+V4+V3+V4*V3+V5*age+V2+V1*V2+V1*age+V1 */ + if(Typevar[k1]==0){ /* Single covariate in model */ + match=0; + for(k2=1; k2 <=j;k2++){/* result line V4=1 V5=24.1 V3=1 V2=8 V1=0 */ + if(Tvar[k1]==Tvarsel[k2]) {/* Tvar[1]=5 == Tvarsel[2]=5 */ + modelresult[k2]=k1;/* modelresult[2]=1 modelresult[1]=2 modelresult[3]=3 modelresult[6]=4 modelresult[9]=5 */ + match=1; + break; + } + } + if(match == 0){ + printf("Error in result line: %d value missing; result: %s, model=%s\n",k1, resultline, model); + } + } + } + /* Checking for missing or useless values in comparison of current model needs */ + for(k2=1; k2 <=j;k2++){ /* result line V4=1 V5=24.1 V3=1 V2=8 V1=0 */ + match=0; + for(k1=1; k1<= cptcovt ;k1++){ /* model line V5+V4+V3+V4*V3+V5*age+V2+V1*V2+V1*age+V1 */ + if(Typevar[k1]==0){ /* Single */ + if(Tvar[k1]==Tvarsel[k2]) { /* Tvar[2]=4 == Tvarsel[1]=4 */ + resultmodel[k1]=k2; /* resultmodel[2]=1 resultmodel[1]=2 resultmodel[3]=3 resultmodel[6]=4 resultmodel[9]=5 */ + ++match; + } + } + } + if(match == 0){ + printf("Error in result line: %d value missing; result: %s, model=%s\n",k1, resultline, model); + }else if(match > 1){ + printf("Error in result line: %d doubled; result: %s, model=%s\n",k2, resultline, model); + } + } + + /* We need to deduce which combination number is chosen and save quantitative values */ + /* model line V5+V4+V3+V4*V3+V5*age+V2+V1*V2+V1*age+V1 */ + /* result line V4=1 V5=25.1 V3=0 V2=8 V1=1 */ + /* should give a combination of dummy V4=1, V3=0, V1=1 => V4*2**(0) + V3*2**(1) + V1*2**(2) = 5 + (1offset) = 6*/ + /* result line V4=1 V5=24.1 V3=1 V2=8 V1=0 */ + /* should give a combination of dummy V4=1, V3=1, V1=0 => V4*2**(0) + V3*2**(1) + V1*2**(2) = 3 + (1offset) = 4*/ + /* 1 0 0 0 */ + /* 2 1 0 0 */ + /* 3 0 1 0 */ + /* 4 1 1 0 */ /* V4=1, V3=1, V1=0 */ + /* 5 0 0 1 */ + /* 6 1 0 1 */ /* V4=1, V3=0, V1=1 */ + /* 7 0 1 1 */ + /* 8 1 1 1 */ + /* V(Tvresult)=Tresult V4=1 V3=0 V1=1 Tresult[nres=1][2]=0 */ + /* V(Tvqresult)=Tqresult V5=25.1 V2=8 Tqresult[nres=1][1]=25.1 */ + /* V5*age V5 known which value for nres? */ + /* Tqinvresult[2]=8 Tqinvresult[1]=25.1 */ + for(k1=1, k=0, k4=0, k4q=0; k1 <=cptcovt;k1++){ /* model line */ + if( Dummy[k1]==0 && Typevar[k1]==0 ){ /* Single dummy */ + k3= resultmodel[k1]; /* resultmodel[2(V4)] = 1=k3 */ + k2=(int)Tvarsel[k3]; /* Tvarsel[resultmodel[2]]= Tvarsel[1] = 4=k2 */ + k+=Tvalsel[k3]*pow(2,k4); /* Tvalsel[1]=1 */ + Tresult[nres][k4+1]=Tvalsel[k3];/* Tresult[nres][1]=1(V4=1) Tresult[nres][2]=0(V3=0) */ + Tvresult[nres][k4+1]=(int)Tvarsel[k3];/* Tvresult[nres][1]=4 Tvresult[nres][3]=1 */ + Tinvresult[nres][(int)Tvarsel[k3]]=Tvalsel[k3]; /* Tinvresult[nres][4]=1 */ + printf("Decoderesult Dummy k=%d, V(k2=V%d)= Tvalsel[%d]=%d, 2**(%d)\n",k, k2, k3, (int)Tvalsel[k3], k4); + k4++;; + } else if( Dummy[k1]==1 && Typevar[k1]==0 ){ /* Single quantitative */ + k3q= resultmodel[k1]; /* resultmodel[2] = 1=k3 */ + k2q=(int)Tvarsel[k3q]; /* Tvarsel[resultmodel[2]]= Tvarsel[1] = 4=k2 */ + Tqresult[nres][k4q+1]=Tvalsel[k3q]; /* Tqresult[nres][1]=25.1 */ + Tvqresult[nres][k4q+1]=(int)Tvarsel[k3q]; /* Tvqresult[nres][1]=5 */ + Tqinvresult[nres][(int)Tvarsel[k3q]]=Tvalsel[k3q]; /* Tqinvresult[nres][5]=25.1 */ + printf("Decoderesult Quantitative nres=%d, V(k2q=V%d)= Tvalsel[%d]=%d, Tvarsel[%d]=%f\n",nres, k2q, k3q, Tvarsel[k3q], k3q, Tvalsel[k3q]); + k4q++;; + } + } + + TKresult[nres]=++k; /* Combination for the nresult and the model */ return (0); } -int selected( int kvar){ /* Selected combination of covariates */ - if(Tvarsel[kvar]) - return (0); - else - return(1); -} + int decodemodel( char model[], int lastobs) /**< This routine decodes the model and returns: * Model V1+V2+V3+V8+V7*V8+V5*V6+V8*age+V3*age+age*age @@ -7916,21 +8230,21 @@ int decodemodel( char model[], int lasto if ((strpt=strstr(model,"age*age")) !=0){ 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 \ + 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 \ corresponding column of parameters.\n",model); - fprintf(ficlog,"Error in model: 'model=%s'; 'age*age' should in first place before other covariates\n \ + 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 \ corresponding column of parameters.\n",model); fflush(ficlog); - return 1; + return 1; } nagesqr=1; if (strstr(model,"+age*age") !=0) - substrchaine(modelsav, model, "+age*age"); + substrchaine(modelsav, model, "+age*age"); else if (strstr(model,"age*age+") !=0) - substrchaine(modelsav, model, "age*age+"); + substrchaine(modelsav, model, "age*age+"); else - substrchaine(modelsav, model, "age*age"); + substrchaine(modelsav, model, "age*age"); }else nagesqr=0; if (strlen(modelsav) >1){ @@ -8029,10 +8343,10 @@ int decodemodel( char model[], int lasto cptcovprodnoage++;k1++; cutl(stre,strb,strc,'V'); /* strc= Vn, stre is n; strb=V3*V2 stre=3 strc=*/ Tvar[k]=ncovcol+nqv+ntv+nqtv+k1; /* For model-covariate k tells which data-covariate to use but - because this model-covariate is a construction we invent a new column - which is after existing variables ncovcol+nqv+ntv+nqtv + 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 */ + because this model-covariate is a construction we invent a new column + which is after existing variables ncovcol+nqv+ntv+nqtv + 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 */ Typevar[k]=2; /* 2 for double fixed dummy covariates */ 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 */ @@ -8100,158 +8414,243 @@ Typevar: 0 for simple covariate (dummy, Fixed[k] 0=fixed (product or simple), 1 varying, 2 fixed with age product, 3 varying with age product \n\ Dummy[k] 0=dummy (0 1), 1 quantitative (single or product without age), 2 dummy with age product, 3 quant with age product\n",model); - for(k=1, ncoveff=0, nqfveff=0, ntveff=0, nqtveff=0;k<=cptcovt; k++){ /* or cptocvt */ - if (Tvar[k] <=ncovcol && (Typevar[k]==0 || Typevar[k]==2)){ /* Simple or product fixed dummy (<=ncovcol) covariates */ + for(k=1, ncovf=0, nsd=0, nsq=0, ncovv=0, ncova=0, ncoveff=0, nqfveff=0, ntveff=0, nqtveff=0;k<=cptcovt; k++){ /* or cptocvt */ + if (Tvar[k] <=ncovcol && Typevar[k]==0 ){ /* Simple fixed dummy (<=ncovcol) covariates */ + Fixed[k]= 0; + Dummy[k]= 0; + ncoveff++; + ncovf++; + nsd++; + modell[k].maintype= FTYPE; + TvarsD[nsd]=Tvar[k]; + TvarsDind[nsd]=k; + TvarF[ncovf]=Tvar[k]; + TvarFind[ncovf]=k; + TvarFD[ncoveff]=Tvar[k]; /* TvarFD[1]=V1 in V5+V4+V3+V4*V3+V5*age+V2+V1*V2+V1*age+V1 */ + TvarFDind[ncoveff]=k; /* TvarFDind[1]=9 in V5+V4+V3+V4*V3+V5*age+V2+V1*V2+V1*age+V1 */ + }else if( Tvar[k] <=ncovcol && Typevar[k]==2){ /* Product of fixed dummy (<=ncovcol) covariates */ Fixed[k]= 0; Dummy[k]= 0; ncoveff++; - modell[k].maintype= FTYPE; + ncovf++; + modell[k].maintype= FTYPE; + TvarF[ncovf]=Tvar[k]; + TvarFind[ncovf]=k; TvarFD[ncoveff]=Tvar[k]; /* TvarFD[1]=V1 in V5+V4+V3+V4*V3+V5*age+V2+V1*V2+V1*age+V1 */ TvarFDind[ncoveff]=k; /* TvarFDind[1]=9 in V5+V4+V3+V4*V3+V5*age+V2+V1*V2+V1*age+V1 */ }else if( Tvar[k] <=ncovcol+nqv && Typevar[k]==0){ /* Remind that product Vn*Vm are added in k*/ /* Only simple fixed quantitative variable */ Fixed[k]= 0; Dummy[k]= 1; nqfveff++; - modell[k].maintype= FTYPE; - modell[k].subtype= FQ; + modell[k].maintype= FTYPE; + modell[k].subtype= FQ; + nsq++; + TvarsQ[nsq]=Tvar[k]; + TvarsQind[nsq]=k; + ncovf++; + TvarF[ncovf]=Tvar[k]; + TvarFind[ncovf]=k; TvarFQ[nqfveff]=Tvar[k]-ncovcol; /* TvarFQ[1]=V2-1=1st in V5+V4+V3+V4*V3+V5*age+V2+V1*V2+V1*age+V1 */ /* Only simple fixed quantitative variable */ TvarFQind[nqfveff]=k; /* TvarFQind[1]=6 in V5+V4+V3+V4*V3+V5*age+V2+V1*V2+V1*age+V1 */ /* Only simple fixed quantitative variable */ - }else if( Tvar[k] <=ncovcol+nqv+ntv && Typevar[k]==0){ + }else if( Tvar[k] <=ncovcol+nqv+ntv && Typevar[k]==0){/* Only simple time varying variables */ Fixed[k]= 1; Dummy[k]= 0; ntveff++; /* Only simple time varying dummy variable */ - modell[k].maintype= VTYPE; - modell[k].subtype= VD; + modell[k].maintype= VTYPE; + modell[k].subtype= VD; + nsd++; + TvarsD[nsd]=Tvar[k]; + TvarsDind[nsd]=k; + ncovv++; /* Only simple time varying variables */ + TvarV[ncovv]=Tvar[k]; + TvarVind[ncovv]=k; TvarVD[ntveff]=Tvar[k]; /* TvarVD[1]=V4 TvarVD[2]=V3 in V5+V4+V3+V4*V3+V5*age+V2+V1*V2+V1*age+V1 */ /* Only simple time varying dummy variable */ TvarVDind[ntveff]=k; /* TvarVDind[1]=2 TvarVDind[2]=3 in V5+V4+V3+V4*V3+V5*age+V2+V1*V2+V1*age+V1 */ /* Only simple time varying dummy variable */ printf("Quasi Tmodelind[%d]=%d,Tvar[Tmodelind[%d]]=V%d, ncovcol=%d, nqv=%d,Tvar[k]- ncovcol-nqv=%d\n",ntveff,k,ntveff,Tvar[k], ncovcol, nqv,Tvar[k]- ncovcol-nqv); printf("Quasi TmodelInvind[%d]=%d\n",k,Tvar[k]- ncovcol-nqv); }else if( Tvar[k] <=ncovcol+nqv+ntv+nqtv && Typevar[k]==0){ /* Only simple time varying quantitative variable V5*/ - Fixed[k]= 1; - Dummy[k]= 1; - nqtveff++; - modell[k].maintype= VTYPE; - modell[k].subtype= VQ; + Fixed[k]= 1; + Dummy[k]= 1; + nqtveff++; + modell[k].maintype= VTYPE; + modell[k].subtype= VQ; + ncovv++; /* Only simple time varying variables */ + nsq++; + TvarsQ[nsq]=Tvar[k]; + TvarsQind[nsq]=k; + TvarV[ncovv]=Tvar[k]; + TvarVind[ncovv]=k; TvarVQ[nqtveff]=Tvar[k]; /* TvarVQ[1]=V5 in V5+V4+V3+V4*V3+V5*age+V2+V1*V2+V1*age+V1 */ /* Only simple time varying quantitative variable */ TvarVQind[nqtveff]=k; /* TvarVQind[1]=1 in V5+V4+V3+V4*V3+V5*age+V2+V1*V2+V1*age+V1 */ /* Only simple time varying quantitative variable */ - TmodelInvQind[nqtveff]=Tvar[k]- ncovcol-nqv-ntv;/* Only simple time varying quantitative variable */ - /* Tmodeliqind[k]=nqtveff;/\* Only simple time varying quantitative variable *\/ */ - printf("Quasi TmodelQind[%d]=%d,Tvar[TmodelQind[%d]]=V%d, ncovcol=%d, nqv=%d, ntv=%d,Tvar[k]- ncovcol-nqv-ntv=%d\n",nqtveff,k,nqtveff,Tvar[k], ncovcol, nqv, ntv, Tvar[k]- ncovcol-nqv-ntv); + TmodelInvQind[nqtveff]=Tvar[k]- ncovcol-nqv-ntv;/* Only simple time varying quantitative variable */ + /* Tmodeliqind[k]=nqtveff;/\* Only simple time varying quantitative variable *\/ */ + printf("Quasi TmodelQind[%d]=%d,Tvar[TmodelQind[%d]]=V%d, ncovcol=%d, nqv=%d, ntv=%d,Tvar[k]- ncovcol-nqv-ntv=%d\n",nqtveff,k,nqtveff,Tvar[k], ncovcol, nqv, ntv, Tvar[k]- ncovcol-nqv-ntv); printf("Quasi TmodelInvQind[%d]=%d\n",k,Tvar[k]- ncovcol-nqv-ntv); }else if (Typevar[k] == 1) { /* product with age */ + ncova++; + TvarA[ncova]=Tvar[k]; + TvarAind[ncova]=k; if (Tvar[k] <=ncovcol ){ /* Product age with fixed dummy covariatee */ - Fixed[k]= 2; - Dummy[k]= 2; - modell[k].maintype= ATYPE; - modell[k].subtype= APFD; - /* ncoveff++; */ + Fixed[k]= 2; + Dummy[k]= 2; + modell[k].maintype= ATYPE; + modell[k].subtype= APFD; + /* ncoveff++; */ }else if( Tvar[k] <=ncovcol+nqv) { /* Remind that product Vn*Vm are added in k*/ - Fixed[k]= 2; - Dummy[k]= 3; - modell[k].maintype= ATYPE; - modell[k].subtype= APFQ; /* Product age * fixed quantitative */ - /* nqfveff++; /\* Only simple fixed quantitative variable *\/ */ + Fixed[k]= 2; + Dummy[k]= 3; + modell[k].maintype= ATYPE; + modell[k].subtype= APFQ; /* Product age * fixed quantitative */ + /* nqfveff++; /\* Only simple fixed quantitative variable *\/ */ }else if( Tvar[k] <=ncovcol+nqv+ntv ){ - Fixed[k]= 3; - Dummy[k]= 2; - modell[k].maintype= ATYPE; - modell[k].subtype= APVD; /* Product age * varying dummy */ - /* ntveff++; /\* Only simple time varying dummy variable *\/ */ + Fixed[k]= 3; + Dummy[k]= 2; + modell[k].maintype= ATYPE; + modell[k].subtype= APVD; /* Product age * varying dummy */ + /* ntveff++; /\* Only simple time varying dummy variable *\/ */ }else if( Tvar[k] <=ncovcol+nqv+ntv+nqtv){ - Fixed[k]= 3; - Dummy[k]= 3; - modell[k].maintype= ATYPE; - modell[k].subtype= APVQ; /* Product age * varying quantitative */ - /* nqtveff++;/\* Only simple time varying quantitative variable *\/ */ + Fixed[k]= 3; + Dummy[k]= 3; + modell[k].maintype= ATYPE; + modell[k].subtype= APVQ; /* Product age * varying quantitative */ + /* nqtveff++;/\* Only simple time varying quantitative variable *\/ */ } }else if (Typevar[k] == 2) { /* product without age */ k1=Tposprod[k]; if(Tvard[k1][1] <=ncovcol){ - if(Tvard[k1][2] <=ncovcol){ - Fixed[k]= 1; - Dummy[k]= 0; - modell[k].maintype= FTYPE; - modell[k].subtype= FPDD; /* Product fixed dummy * fixed dummy */ - }else if(Tvard[k1][2] <=ncovcol+nqv){ - Fixed[k]= 0; /* or 2 ?*/ - Dummy[k]= 1; - modell[k].maintype= FTYPE; - modell[k].subtype= FPDQ; /* Product fixed dummy * fixed quantitative */ - }else if(Tvard[k1][2] <=ncovcol+nqv+ntv){ - Fixed[k]= 1; - Dummy[k]= 0; - modell[k].maintype= VTYPE; - modell[k].subtype= VPDD; /* Product fixed dummy * varying dummy */ - }else if(Tvard[k1][2] <=ncovcol+nqv+ntv+nqtv){ - Fixed[k]= 1; - Dummy[k]= 1; - modell[k].maintype= VTYPE; - modell[k].subtype= VPDQ; /* Product fixed dummy * varying quantitative */ - } + if(Tvard[k1][2] <=ncovcol){ + Fixed[k]= 1; + Dummy[k]= 0; + modell[k].maintype= FTYPE; + modell[k].subtype= FPDD; /* Product fixed dummy * fixed dummy */ + ncovf++; /* Fixed variables without age */ + TvarF[ncovf]=Tvar[k]; + TvarFind[ncovf]=k; + }else if(Tvard[k1][2] <=ncovcol+nqv){ + Fixed[k]= 0; /* or 2 ?*/ + Dummy[k]= 1; + modell[k].maintype= FTYPE; + modell[k].subtype= FPDQ; /* Product fixed dummy * fixed quantitative */ + ncovf++; /* Varying variables without age */ + TvarF[ncovf]=Tvar[k]; + TvarFind[ncovf]=k; + }else if(Tvard[k1][2] <=ncovcol+nqv+ntv){ + Fixed[k]= 1; + Dummy[k]= 0; + modell[k].maintype= VTYPE; + modell[k].subtype= VPDD; /* Product fixed dummy * varying dummy */ + ncovv++; /* Varying variables without age */ + TvarV[ncovv]=Tvar[k]; + TvarVind[ncovv]=k; + }else if(Tvard[k1][2] <=ncovcol+nqv+ntv+nqtv){ + Fixed[k]= 1; + Dummy[k]= 1; + modell[k].maintype= VTYPE; + modell[k].subtype= VPDQ; /* Product fixed dummy * varying quantitative */ + ncovv++; /* Varying variables without age */ + TvarV[ncovv]=Tvar[k]; + TvarVind[ncovv]=k; + } }else if(Tvard[k1][1] <=ncovcol+nqv){ - if(Tvard[k1][2] <=ncovcol){ - Fixed[k]= 0; /* or 2 ?*/ - Dummy[k]= 1; - modell[k].maintype= FTYPE; - modell[k].subtype= FPDQ; /* Product fixed quantitative * fixed dummy */ - }else if(Tvard[k1][2] <=ncovcol+nqv+ntv){ - Fixed[k]= 1; - Dummy[k]= 1; - modell[k].maintype= VTYPE; - modell[k].subtype= VPDQ; /* Product fixed quantitative * varying dummy */ - }else if(Tvard[k1][2] <=ncovcol+nqv+ntv+nqtv){ - Fixed[k]= 1; - Dummy[k]= 1; - modell[k].maintype= VTYPE; - modell[k].subtype= VPQQ; /* Product fixed quantitative * varying quantitative */ - } + if(Tvard[k1][2] <=ncovcol){ + Fixed[k]= 0; /* or 2 ?*/ + Dummy[k]= 1; + modell[k].maintype= FTYPE; + modell[k].subtype= FPDQ; /* Product fixed quantitative * fixed dummy */ + ncovf++; /* Fixed variables without age */ + TvarF[ncovf]=Tvar[k]; + TvarFind[ncovf]=k; + }else if(Tvard[k1][2] <=ncovcol+nqv+ntv){ + Fixed[k]= 1; + Dummy[k]= 1; + modell[k].maintype= VTYPE; + modell[k].subtype= VPDQ; /* Product fixed quantitative * varying dummy */ + ncovv++; /* Varying variables without age */ + TvarV[ncovv]=Tvar[k]; + TvarVind[ncovv]=k; + }else if(Tvard[k1][2] <=ncovcol+nqv+ntv+nqtv){ + Fixed[k]= 1; + Dummy[k]= 1; + modell[k].maintype= VTYPE; + modell[k].subtype= VPQQ; /* Product fixed quantitative * varying quantitative */ + ncovv++; /* Varying variables without age */ + TvarV[ncovv]=Tvar[k]; + TvarVind[ncovv]=k; + ncovv++; /* Varying variables without age */ + TvarV[ncovv]=Tvar[k]; + TvarVind[ncovv]=k; + } }else if(Tvard[k1][1] <=ncovcol+nqv+ntv){ - if(Tvard[k1][2] <=ncovcol){ - Fixed[k]= 1; - Dummy[k]= 1; - modell[k].maintype= VTYPE; - modell[k].subtype= VPDD; /* Product time varying dummy * fixed dummy */ - }else if(Tvard[k1][2] <=ncovcol+nqv){ - Fixed[k]= 1; - Dummy[k]= 1; - modell[k].maintype= VTYPE; - modell[k].subtype= VPDQ; /* Product time varying dummy * fixed quantitative */ - }else if(Tvard[k1][2] <=ncovcol+nqv+ntv){ - Fixed[k]= 1; - Dummy[k]= 0; - modell[k].maintype= VTYPE; - modell[k].subtype= VPDD; /* Product time varying dummy * time varying dummy */ - }else if(Tvard[k1][2] <=ncovcol+nqv+ntv+nqtv){ - Fixed[k]= 1; - Dummy[k]= 1; - modell[k].maintype= VTYPE; - modell[k].subtype= VPDQ; /* Product time varying dummy * time varying quantitative */ - } + if(Tvard[k1][2] <=ncovcol){ + Fixed[k]= 1; + Dummy[k]= 1; + modell[k].maintype= VTYPE; + modell[k].subtype= VPDD; /* Product time varying dummy * fixed dummy */ + ncovv++; /* Varying variables without age */ + TvarV[ncovv]=Tvar[k]; + TvarVind[ncovv]=k; + }else if(Tvard[k1][2] <=ncovcol+nqv){ + Fixed[k]= 1; + Dummy[k]= 1; + modell[k].maintype= VTYPE; + modell[k].subtype= VPDQ; /* Product time varying dummy * fixed quantitative */ + ncovv++; /* Varying variables without age */ + TvarV[ncovv]=Tvar[k]; + TvarVind[ncovv]=k; + }else if(Tvard[k1][2] <=ncovcol+nqv+ntv){ + Fixed[k]= 1; + Dummy[k]= 0; + modell[k].maintype= VTYPE; + modell[k].subtype= VPDD; /* Product time varying dummy * time varying dummy */ + ncovv++; /* Varying variables without age */ + TvarV[ncovv]=Tvar[k]; + TvarVind[ncovv]=k; + }else if(Tvard[k1][2] <=ncovcol+nqv+ntv+nqtv){ + Fixed[k]= 1; + Dummy[k]= 1; + modell[k].maintype= VTYPE; + modell[k].subtype= VPDQ; /* Product time varying dummy * time varying quantitative */ + ncovv++; /* Varying variables without age */ + TvarV[ncovv]=Tvar[k]; + TvarVind[ncovv]=k; + } }else if(Tvard[k1][1] <=ncovcol+nqv+ntv+nqtv){ - if(Tvard[k1][2] <=ncovcol){ - Fixed[k]= 1; - Dummy[k]= 1; - modell[k].maintype= VTYPE; - modell[k].subtype= VPDQ; /* Product time varying quantitative * fixed dummy */ - }else if(Tvard[k1][2] <=ncovcol+nqv){ - Fixed[k]= 1; - Dummy[k]= 1; - modell[k].maintype= VTYPE; - modell[k].subtype= VPQQ; /* Product time varying quantitative * fixed quantitative */ - }else if(Tvard[k1][2] <=ncovcol+nqv+ntv){ - Fixed[k]= 1; - Dummy[k]= 1; - modell[k].maintype= VTYPE; - modell[k].subtype= VPDQ; /* Product time varying quantitative * time varying dummy */ - }else if(Tvard[k1][2] <=ncovcol+nqv+ntv+nqtv){ - Fixed[k]= 1; - Dummy[k]= 1; - modell[k].maintype= VTYPE; - modell[k].subtype= VPQQ; /* Product time varying quantitative * time varying quantitative */ - } + if(Tvard[k1][2] <=ncovcol){ + Fixed[k]= 1; + Dummy[k]= 1; + modell[k].maintype= VTYPE; + modell[k].subtype= VPDQ; /* Product time varying quantitative * fixed dummy */ + ncovv++; /* Varying variables without age */ + TvarV[ncovv]=Tvar[k]; + TvarVind[ncovv]=k; + }else if(Tvard[k1][2] <=ncovcol+nqv){ + Fixed[k]= 1; + Dummy[k]= 1; + modell[k].maintype= VTYPE; + modell[k].subtype= VPQQ; /* Product time varying quantitative * fixed quantitative */ + ncovv++; /* Varying variables without age */ + TvarV[ncovv]=Tvar[k]; + TvarVind[ncovv]=k; + }else if(Tvard[k1][2] <=ncovcol+nqv+ntv){ + Fixed[k]= 1; + Dummy[k]= 1; + modell[k].maintype= VTYPE; + modell[k].subtype= VPDQ; /* Product time varying quantitative * time varying dummy */ + ncovv++; /* Varying variables without age */ + TvarV[ncovv]=Tvar[k]; + TvarVind[ncovv]=k; + }else if(Tvard[k1][2] <=ncovcol+nqv+ntv+nqtv){ + Fixed[k]= 1; + Dummy[k]= 1; + modell[k].maintype= VTYPE; + modell[k].subtype= VPQQ; /* Product time varying quantitative * time varying quantitative */ + ncovv++; /* Varying variables without age */ + TvarV[ncovv]=Tvar[k]; + TvarVind[ncovv]=k; + } }else{ - printf("Error unknown type of covariate: Tvard[%d][1]=%d,Tvard[%d][2]=%d\n",k1,Tvard[k1][1],k1,Tvard[k1][2]); - fprintf(ficlog,"Error unknown type of covariate: Tvard[%d][1]=%d,Tvard[%d][2]=%d\n",k1,Tvard[k1][1],k1,Tvard[k1][2]); + printf("Error unknown type of covariate: Tvard[%d][1]=%d,Tvard[%d][2]=%d\n",k1,Tvard[k1][1],k1,Tvard[k1][2]); + fprintf(ficlog,"Error unknown type of covariate: Tvard[%d][1]=%d,Tvard[%d][2]=%d\n",k1,Tvard[k1][1],k1,Tvard[k1][2]); } /* end k1 */ }else{ printf("Error, current version can't treat for performance reasons, Tvar[%d]=%d, Typevar[%d]=%d\n", k, Tvar[k], k, Typevar[k]); @@ -8265,26 +8664,28 @@ Dummy[k] 0=dummy (0 1), 1 quantitative ( for(k1=1; k1<= cptcovt;k1++){ for(k2=1; k2 =bage; agedeb--){ /* If stepm=6 months */ @@ -8823,7 +9247,7 @@ int hPijx(double *p, int bage, int fage) p3mat=ma3x(1,nlstate+ndeath,1, nlstate+ndeath, 0,nhstepm); oldm=oldms;savm=savms; - hpxij(p3mat,nhstepm,agedeb,hstepm,p,nlstate,stepm,oldm,savm, k); + hpxij(p3mat,nhstepm,agedeb,hstepm,p,nlstate,stepm,oldm,savm, k, nres); fprintf(ficrespij,"# Cov Agex agex+h hpijx with i,j="); for(i=1; i<=nlstate;i++) for(j=1; j<=nlstate+ndeath;j++) @@ -8949,6 +9373,7 @@ int main(int argc, char *argv[]) int itimes; int NDIM=2; int vpopbased=0; + int nres=0; char ca[32], cb[32]; /* FILE *fichtm; *//* Html File */ @@ -8967,7 +9392,7 @@ int main(int argc, char *argv[]) char line[MAXLINE]; char path[MAXLINE],pathc[MAXLINE],pathcd[MAXLINE],pathtot[MAXLINE]; - char model[MAXLINE], modeltemp[MAXLINE]; + char modeltemp[MAXLINE]; char resultline[MAXLINE]; char pathr[MAXLINE], pathimach[MAXLINE]; @@ -9281,7 +9706,7 @@ int main(int argc, char *argv[]) covar=matrix(0,NCOVMAX,1,n); /**< used in readdata */ coqvar=matrix(1,nqv,1,n); /**< Fixed quantitative covariate */ - cotvar=ma3x(1,maxwav,1,ntv,1,n); /**< Time varying covariate */ + cotvar=ma3x(1,maxwav,1,ntv+nqtv,1,n); /**< Time varying covariate (dummy and quantitative)*/ cotqvar=ma3x(1,maxwav,1,nqtv,1,n); /**< Time varying quantitative covariate */ cptcovn=0; /*Number of covariates, i.e. number of '+' in model statement plus one, indepently of n in Vn*/ /* v1+v2+v3+v2*v4+v5*age makes cptcovn = 5 @@ -9334,41 +9759,41 @@ int main(int argc, char *argv[]) param= ma3x(1,nlstate,1,nlstate+ndeath-1,1,ncovmodel); for(i=1; i <=nlstate; i++){ - j=0; + j=0; for(jj=1; jj <=nlstate+ndeath; jj++){ - if(jj==i) continue; - j++; - fscanf(ficpar,"%1d%1d",&i1,&j1); - if ((i1 != i) || (j1 != jj)){ - printf("Error in line parameters number %d, %1d%1d instead of %1d%1d \n \ + if(jj==i) continue; + j++; + fscanf(ficpar,"%1d%1d",&i1,&j1); + 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); - exit(1); - } - fprintf(ficparo,"%1d%1d",i1,j1); - if(mle==1) - 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){ - printf(" %lf",param[i][j][k]); - fprintf(ficlog," %lf",param[i][j][k]); - } - else - fprintf(ficlog," %lf",param[i][j][k]); - fprintf(ficparo," %lf",param[i][j][k]); - } - fscanf(ficpar,"\n"); - numlinepar++; - if(mle==1) - printf("\n"); - fprintf(ficlog,"\n"); - fprintf(ficparo,"\n"); + exit(1); + } + fprintf(ficparo,"%1d%1d",i1,j1); + if(mle==1) + 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){ + printf(" %lf",param[i][j][k]); + fprintf(ficlog," %lf",param[i][j][k]); + } + else + fprintf(ficlog," %lf",param[i][j][k]); + fprintf(ficparo," %lf",param[i][j][k]); + } + fscanf(ficpar,"\n"); + numlinepar++; + if(mle==1) + printf("\n"); + fprintf(ficlog,"\n"); + fprintf(ficparo,"\n"); } } fflush(ficlog); - + /* Reads scales values */ p=param[1][1]; @@ -9385,29 +9810,29 @@ run imach with mle=-1 to get a correct t for(i=1; i <=nlstate; i++){ for(j=1; j <=nlstate+ndeath-1; j++){ - fscanf(ficpar,"%1d%1d",&i1,&j1); - if ( (i1-i) * (j1-j) != 0){ - printf("Error in line parameters number %d, %1d%1d instead of %1d%1d \n",numlinepar, i,j, i1, j1); - exit(1); - } - printf("%1d%1d",i,j); - fprintf(ficparo,"%1d%1d",i1,j1); - fprintf(ficlog,"%1d%1d",i1,j1); - for(k=1; k<=ncovmodel;k++){ - fscanf(ficpar,"%le",&delti3[i][j][k]); - printf(" %le",delti3[i][j][k]); - fprintf(ficparo," %le",delti3[i][j][k]); - fprintf(ficlog," %le",delti3[i][j][k]); - } - fscanf(ficpar,"\n"); - numlinepar++; - printf("\n"); - fprintf(ficparo,"\n"); - fprintf(ficlog,"\n"); + fscanf(ficpar,"%1d%1d",&i1,&j1); + if ( (i1-i) * (j1-j) != 0){ + printf("Error in line parameters number %d, %1d%1d instead of %1d%1d \n",numlinepar, i,j, i1, j1); + exit(1); + } + printf("%1d%1d",i,j); + fprintf(ficparo,"%1d%1d",i1,j1); + fprintf(ficlog,"%1d%1d",i1,j1); + for(k=1; k<=ncovmodel;k++){ + fscanf(ficpar,"%le",&delti3[i][j][k]); + printf(" %le",delti3[i][j][k]); + fprintf(ficparo," %le",delti3[i][j][k]); + fprintf(ficlog," %le",delti3[i][j][k]); + } + fscanf(ficpar,"\n"); + numlinepar++; + printf("\n"); + fprintf(ficparo,"\n"); + fprintf(ficlog,"\n"); } } fflush(ficlog); - + /* Reads covariance matrix */ delti=delti3[1][1]; @@ -9497,15 +9922,15 @@ Please run with mle=-1 to get a correct agedc=vector(1,n); cod=ivector(1,n); for(i=1;i<=n;i++){ - num[i]=0; - moisnais[i]=0; - annais[i]=0; - moisdc[i]=0; - andc[i]=0; - agedc[i]=0; - cod[i]=0; - weight[i]=1.0; /* Equal weights, 1 by default */ - } + num[i]=0; + moisnais[i]=0; + annais[i]=0; + moisdc[i]=0; + andc[i]=0; + agedc[i]=0; + cod[i]=0; + weight[i]=1.0; /* Equal weights, 1 by default */ + } mint=matrix(1,maxwav,1,n); anint=matrix(1,maxwav,1,n); s=imatrix(1,maxwav+1,1,n); /* s[i][j] health state for wave i and individual j */ @@ -9518,14 +9943,24 @@ Please run with mle=-1 to get a correct goto end; /* Calculation of the number of parameters from char model */ - /* modelsav=V2+V1+V4+age*V3 strb=age*V3 stra=V2+V1+V4 + /* modelsav=V2+V1+V4+age*V3 strb=age*V3 stra=V2+V1+V4 k=4 (age*V3) Tvar[k=4]= 3 (from V3) Tag[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) - */ - - Tvar=ivector(1,NCOVMAX); /* Was 15 changed to NCOVMAX. */ + */ + + Tvar=ivector(1,NCOVMAX); /* Was 15 changed to NCOVMAX. */ + TvarsDind=ivector(1,NCOVMAX); /* */ + TvarsD=ivector(1,NCOVMAX); /* */ + TvarsQind=ivector(1,NCOVMAX); /* */ + TvarsQ=ivector(1,NCOVMAX); /* */ + TvarF=ivector(1,NCOVMAX); /* */ + TvarFind=ivector(1,NCOVMAX); /* */ + TvarV=ivector(1,NCOVMAX); /* */ + TvarVind=ivector(1,NCOVMAX); /* */ + TvarA=ivector(1,NCOVMAX); /* */ + TvarAind=ivector(1,NCOVMAX); /* */ TvarFD=ivector(1,NCOVMAX); /* */ TvarFDind=ivector(1,NCOVMAX); /* */ TvarFQ=ivector(1,NCOVMAX); /* */ @@ -9536,6 +9971,7 @@ Please run with mle=-1 to get a correct TvarVQind=ivector(1,NCOVMAX); /* */ Tvalsel=vector(1,NCOVMAX); /* */ + Tvarsel=ivector(1,NCOVMAX); /* */ Typevar=ivector(-1,NCOVMAX); /* -1 to 2 */ Fixed=ivector(-1,NCOVMAX); /* -1 to 3 */ Dummy=ivector(-1,NCOVMAX); /* -1 to 3 */ @@ -10341,6 +10777,7 @@ Please run with mle=-1 to get a correct /* day and month of proj2 are not used but only year anproj2.*/ /* Results */ + nresult=0; while(fgets(line, MAXLINE, ficpar)) { /* If line starts with a # it is a comment */ if (line[0] == '#') { @@ -10358,8 +10795,14 @@ Please run with mle=-1 to get a correct else if (num_filled != 1){ printf("ERROR %d: result line should be at minimum 'result=' %s\n",num_filled, line); } - printf("Result %d: result line should be at minimum 'line=' %s, result=%s\n",num_filled, line, resultline); - decoderesult(resultline); + nresult++; /* Sum of resultlines */ + printf("Result %d: result=%s\n",nresult, resultline); + if(nresult > MAXRESULTLINES){ + printf("ERROR: Current version of IMaCh limits the number of resultlines to %d, you used %d\n",MAXRESULTLINES,nresult); + fprintf(ficlog,"ERROR: Current version of IMaCh limits the number of resultlines to %d, you used %d\n",MAXRESULTLINES,nresult); + goto end; + } + decoderesult(resultline, nresult); /* Fills TKresult[nresult] combination and Tresult[nresult][k4+1] combination values */ while(fgets(line, MAXLINE, ficpar)) { /* If line starts with a # it is a comment */ if (line[0] == '#') { @@ -10446,6 +10889,7 @@ Please run with mle=-1 to get a correct mobaverages[i][j][k]=0.; mobaverage=mobaverages; if (mobilav!=0) { + printf("Movingaveraging observed prevalence\n"); if (movingaverage(probs, ageminpar, agemaxpar, mobaverage, mobilav)!=0){ fprintf(ficlog," Error in movingaverage mobilav=%d\n",mobilav); printf(" Error in movingaverage mobilav=%d\n",mobilav); @@ -10454,6 +10898,7 @@ Please run with mle=-1 to get a correct /* /\* Prevalence for each covariates in probs[age][status][cov] *\/ */ /* prevalence(probs, ageminpar, agemaxpar, s, agev, nlstate, imx, Tvar, nbcode, ncodemax, mint, anint, dateprev1, dateprev2, firstpass, lastpass); */ else if (mobilavproj !=0) { + printf("Movingaveraging projected observed prevalence\n"); if (movingaverage(probs, ageminpar, agemaxpar, mobaverage, mobilavproj)!=0){ fprintf(ficlog," Error in movingaverage mobilavproj=%d\n",mobilavproj); printf(" Error in movingaverage mobilavproj=%d\n",mobilavproj); @@ -10509,16 +10954,29 @@ Please run with mle=-1 to get a correct printf("Computing Health Expectancies: result on file '%s' ...", filerese);fflush(stdout); fprintf(ficlog,"Computing Health Expectancies: result on file '%s' ...", filerese);fflush(ficlog); - for (k=1; k <= (int) pow(2,cptcoveff); k++){ /* For any combination of dummy covariates, fixed and varying */ + i1=pow(2,cptcoveff); /* Number of combination of dummy covariates */ + if (cptcovn < 1){i1=1;} + + for(nres=1; nres <= nresult; nres++) /* For each resultline */ + for(k=1; k<=i1;k++){ /* For any combination of dummy covariates, fixed and varying */ + if(TKresult[nres]!= k) + continue; fprintf(ficreseij,"\n#****** "); + printf("\n#****** "); for(j=1;j<=cptcoveff;j++) { fprintf(ficreseij,"V%d=%d ",Tvaraff[j],nbcode[Tvaraff[j]][codtabm(k,j)]); + printf("V%d=%d ",Tvaraff[j],nbcode[Tvaraff[j]][codtabm(k,j)]); + } + for (j=1; j<= nsq; j++){ /* For each selected (single) quantitative value */ + printf(" V%d=%f ",Tvqresult[nres][j],Tqresult[nres][j]); + fprintf(ficreseij," V%d=%f ",Tvqresult[nres][j],Tqresult[nres][j]); } fprintf(ficreseij,"******\n"); + printf("******\n"); eij=ma3x(1,nlstate,1,nlstate,(int) bage, (int) fage); oldm=oldms;savm=savms; - evsij(eij, p, nlstate, stepm, (int) bage, (int)fage, oldm, savm, k, estepm, strstart); + evsij(eij, p, nlstate, stepm, (int) bage, (int)fage, oldm, savm, k, estepm, strstart, nres); free_ma3x(eij,1,nlstate,1,nlstate,(int) bage, (int)fage); } @@ -10569,15 +11027,26 @@ Please run with mle=-1 to get a correct /*for(cptcov=1,k=0;cptcov<=i1;cptcov++){ for(cptcod=1;cptcod<=ncodemax[cptcov];cptcod++){*/ - for (k=1; k <= (int) pow(2,cptcoveff); k++){ - printf("\n#****** "); - fprintf(ficrest,"\n#****** "); - fprintf(ficlog,"\n#****** "); + i1=pow(2,cptcoveff); /* Number of combination of dummy covariates */ + if (cptcovn < 1){i1=1;} + + for(nres=1; nres <= nresult; nres++) /* For each resultline */ + for(k=1; k<=i1;k++){ /* For any combination of dummy covariates, fixed and varying */ + if(TKresult[nres]!= k) + continue; + printf("\n#****** Selected:"); + fprintf(ficrest,"\n#****** Selected:"); + fprintf(ficlog,"\n#****** Selected:"); for(j=1;j<=cptcoveff;j++){ printf("V%d=%d ",Tvaraff[j],nbcode[Tvaraff[j]][codtabm(k,j)]); fprintf(ficrest,"V%d=%d ",Tvaraff[j],nbcode[Tvaraff[j]][codtabm(k,j)]); fprintf(ficlog,"V%d=%d ",Tvaraff[j],nbcode[Tvaraff[j]][codtabm(k,j)]); } + for (j=1; j<= nsq; j++){ /* For each selected (single) quantitative value */ + printf(" V%d=%f ",Tvqresult[nres][j],Tqresult[nres][j]); + fprintf(ficrest," V%d=%f ",Tvqresult[nres][j],Tqresult[nres][j]); + fprintf(ficlog," V%d=%f ",Tvqresult[nres][j],Tqresult[nres][j]); + } fprintf(ficrest,"******\n"); fprintf(ficlog,"******\n"); printf("******\n"); @@ -10588,19 +11057,26 @@ Please run with mle=-1 to get a correct fprintf(ficresstdeij,"V%d=%d ",Tvaraff[j],nbcode[Tvaraff[j]][codtabm(k,j)]); fprintf(ficrescveij,"V%d=%d ",Tvaraff[j],nbcode[Tvaraff[j]][codtabm(k,j)]); } + for (j=1; j<= nsq; j++){ /* For each selected (single) quantitative value */ + fprintf(ficresstdeij," V%d=%f ",Tvqresult[nres][j],Tqresult[nres][j]); + fprintf(ficrescveij," V%d=%f ",Tvqresult[nres][j],Tqresult[nres][j]); + } fprintf(ficresstdeij,"******\n"); fprintf(ficrescveij,"******\n"); fprintf(ficresvij,"\n#****** "); for(j=1;j<=cptcoveff;j++) fprintf(ficresvij,"V%d=%d ",Tvaraff[j],nbcode[Tvaraff[j]][codtabm(k,j)]); + for (j=1; j<= nsq; j++){ /* For each selected (single) quantitative value */ + fprintf(ficresvij," V%d=%f ",Tvqresult[nres][j],Tqresult[nres][j]); + } fprintf(ficresvij,"******\n"); eij=ma3x(1,nlstate,1,nlstate,(int) bage, (int) fage); oldm=oldms;savm=savms; - printf(" cvevsij combination#=%d, ",k); - fprintf(ficlog, " cvevsij combination#=%d, ",k); - cvevsij(eij, p, nlstate, stepm, (int) bage, (int)fage, oldm, savm, k, estepm, delti, matcov, strstart); + printf(" cvevsij "); + fprintf(ficlog, " cvevsij "); + cvevsij(eij, p, nlstate, stepm, (int) bage, (int)fage, oldm, savm, k, estepm, delti, matcov, strstart, nres); printf(" end cvevsij \n "); fprintf(ficlog, " end cvevsij \n "); @@ -10617,7 +11093,7 @@ Please run with mle=-1 to get a correct cptcod= 0; /* To be deleted */ printf("varevsij vpopbased=%d \n",vpopbased); fprintf(ficlog, "varevsij vpopbased=%d \n",vpopbased); - varevsij(optionfilefiname, vareij, matcov, p, delti, nlstate, stepm, (int) bage, (int) fage, oldm, savm, prlim, ftolpl, &ncvyear, k, estepm, cptcov,cptcod,vpopbased,mobilav, strstart); /* cptcod not initialized Intel */ + varevsij(optionfilefiname, vareij, matcov, p, delti, nlstate, stepm, (int) bage, (int) fage, oldm, savm, prlim, ftolpl, &ncvyear, k, estepm, cptcov,cptcod,vpopbased,mobilav, strstart, nres); /* cptcod not initialized Intel */ fprintf(ficrest,"# Total life expectancy with std error and decomposition into time to be expected in each health state\n# (weighted average of eij where weights are "); if(vpopbased==1) fprintf(ficrest,"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); @@ -10631,7 +11107,7 @@ Please run with mle=-1 to get a correct printf("Computing age specific period (stable) prevalences in each health state \n"); fprintf(ficlog,"Computing age specific period (stable) prevalences in each health state \n"); for(age=bage; age <=fage ;age++){ - prevalim(prlim, nlstate, p, age, oldm, savm, ftolpl, &ncvyear, k); /*ZZ Is it the correct prevalim */ + prevalim(prlim, nlstate, p, age, oldm, savm, ftolpl, &ncvyear, k, nres); /*ZZ Is it the correct prevalim */ if (vpopbased==1) { if(mobilav ==0){ for(i=1; i<=nlstate;i++) @@ -10668,11 +11144,11 @@ Please run with mle=-1 to get a correct free_ma3x(eij,1,nlstate,1,nlstate,(int) bage, (int)fage); free_ma3x(vareij,1,nlstate,1,nlstate,(int) bage, (int)fage); free_vector(epj,1,nlstate+1); - printf("done \n");fflush(stdout); - fprintf(ficlog,"done\n");fflush(ficlog); + printf("done selection\n");fflush(stdout); + fprintf(ficlog,"done selection\n");fflush(ficlog); /*}*/ - } /* End k */ + } /* End k selection */ printf("done State-specific expectancies\n");fflush(stdout); fprintf(ficlog,"done State-specific expectancies\n");fflush(ficlog); @@ -10691,7 +11167,13 @@ Please run with mle=-1 to get a correct /*for(cptcov=1,k=0;cptcov<=i1;cptcov++){ for(cptcod=1;cptcod<=ncodemax[cptcov];cptcod++){*/ - for (k=1; k <= (int) pow(2,cptcoveff); k++){ + i1=pow(2,cptcoveff); + if (cptcovn < 1){i1=1;} + + for(nres=1; nres <= nresult; nres++) /* For each resultline */ + for(k=1; k<=i1;k++){ + if(TKresult[nres]!= k) + continue; fprintf(ficresvpl,"\n#****** "); printf("\n#****** "); fprintf(ficlog,"\n#****** "); @@ -10700,13 +11182,18 @@ Please run with mle=-1 to get a correct fprintf(ficlog,"V%d=%d ",Tvaraff[j],nbcode[Tvaraff[j]][codtabm(k,j)]); printf("V%d=%d ",Tvaraff[j],nbcode[Tvaraff[j]][codtabm(k,j)]); } + for (j=1; j<= nsq; j++){ /* For each selected (single) quantitative value */ + printf(" V%d=%f ",Tvqresult[nres][j],Tqresult[nres][j]); + fprintf(ficresvpl," V%d=%f ",Tvqresult[nres][j],Tqresult[nres][j]); + fprintf(ficlog," V%d=%f ",Tvqresult[nres][j],Tqresult[nres][j]); + } fprintf(ficresvpl,"******\n"); printf("******\n"); fprintf(ficlog,"******\n"); varpl=matrix(1,nlstate,(int) bage, (int) fage); oldm=oldms;savm=savms; - varprevlim(fileres, varpl, matcov, p, delti, nlstate, stepm, (int) bage, (int) fage, oldm, savm, prlim, ftolpl, &ncvyear, k, strstart); + varprevlim(fileres, varpl, matcov, p, delti, nlstate, stepm, (int) bage, (int) fage, oldm, savm, prlim, ftolpl, &ncvyear, k, strstart, nres); free_matrix(varpl,1,nlstate,(int) bage, (int)fage); /*}*/ } @@ -10741,7 +11228,7 @@ Please run with mle=-1 to get a correct free_matrix(newms, 1,nlstate+ndeath,1,nlstate+ndeath); free_matrix(savms, 1,nlstate+ndeath,1,nlstate+ndeath); free_ma3x(cotqvar,1,maxwav,1,nqtv,1,n); - free_ma3x(cotvar,1,maxwav,1,ntv,1,n); + free_ma3x(cotvar,1,maxwav,1,ntv+nqtv,1,n); free_matrix(coqvar,1,maxwav,1,n); free_matrix(covar,0,NCOVMAX,1,n); free_matrix(matcov,1,npar,1,npar); @@ -10757,8 +11244,18 @@ Please run with mle=-1 to get a correct free_ivector(Fixed,-1,NCOVMAX); free_ivector(Typevar,-1,NCOVMAX); free_ivector(Tvar,1,NCOVMAX); + free_ivector(TvarsQ,1,NCOVMAX); + free_ivector(TvarsQind,1,NCOVMAX); + free_ivector(TvarsD,1,NCOVMAX); + free_ivector(TvarsDind,1,NCOVMAX); free_ivector(TvarFD,1,NCOVMAX); free_ivector(TvarFDind,1,NCOVMAX); + free_ivector(TvarF,1,NCOVMAX); + free_ivector(TvarFind,1,NCOVMAX); + free_ivector(TvarV,1,NCOVMAX); + free_ivector(TvarVind,1,NCOVMAX); + free_ivector(TvarA,1,NCOVMAX); + free_ivector(TvarAind,1,NCOVMAX); free_ivector(TvarFQ,1,NCOVMAX); free_ivector(TvarFQind,1,NCOVMAX); free_ivector(TvarVD,1,NCOVMAX);