--- imach/src/imach.c 2015/11/18 17:41:20 1.210 +++ imach/src/imach.c 2015/12/23 17:18:31 1.217 @@ -1,6 +1,34 @@ -/* $Id: imach.c,v 1.210 2015/11/18 17:41:20 brouard Exp $ +/* $Id: imach.c,v 1.217 2015/12/23 17:18:31 brouard Exp $ $State: Exp $ $Log: imach.c,v $ + Revision 1.217 2015/12/23 17:18:31 brouard + Summary: Experimental backcast + + Revision 1.216 2015/12/18 17:32:11 brouard + Summary: 0.98r4 Warning and status=-2 + + Version 0.98r4 is now: + - displaying an error when status is -1, date of interview unknown and date of death known; + - permitting a status -2 when the vital status is unknown at a known date of right truncation. + Older changes concerning s=-2, dating from 2005 have been supersed. + + Revision 1.215 2015/12/16 08:52:24 brouard + Summary: 0.98r4 working + + Revision 1.214 2015/12/16 06:57:54 brouard + Summary: temporary not working + + Revision 1.213 2015/12/11 18:22:17 brouard + Summary: 0.98r4 + + Revision 1.212 2015/11/21 12:47:24 brouard + Summary: minor typo + + Revision 1.211 2015/11/21 12:41:11 brouard + Summary: 0.98r3 with some graph of projected cross-sectional + + Author: Nicolas Brouard + Revision 1.210 2015/11/18 17:41:20 brouard Summary: Start working on projected prevalences @@ -757,6 +785,8 @@ typedef struct { #define NDEATHMAX 8 /**< Maximum number of dead states (for func) */ #define NCOVMAX 20 /**< Maximum number of covariates, including generated covariates V1*V2 */ #define codtabm(h,k) (1 & (h-1) >> (k-1))+1 +/*#define decodtabm(h,k,cptcoveff)= (h <= (1<> (k-1)) & 1) +1 : -1)*/ +#define decodtabm(h,k,cptcoveff) (((h-1) >> (k-1)) & 1) +1 #define MAXN 20000 #define YEARM 12. /**< Number of months per year */ #define AGESUP 130 @@ -773,12 +803,12 @@ typedef struct { #define ODIRSEPARATOR '\\' #endif -/* $Id: imach.c,v 1.210 2015/11/18 17:41:20 brouard Exp $ */ +/* $Id: imach.c,v 1.217 2015/12/23 17:18:31 brouard Exp $ */ /* $State: Exp $ */ #include "version.h" char version[]=__IMACH_VERSION__; char copyright[]="October 2015,INED-EUROREVES-Institut de longevite-Japan Society for the Promotion of Science (Grant-in-Aid for Scientific Research 25293121), Intel Software 2015"; -char fullversion[]="$Revision: 1.210 $ $Date: 2015/11/18 17:41:20 $"; +char fullversion[]="$Revision: 1.217 $ $Date: 2015/12/23 17:18:31 $"; char strstart[80]; char optionfilext[10], optionfilefiname[FILENAMELENGTH]; int erreur=0, nberr=0, nbwarn=0; /* Error number, number of errors number of warnings */ @@ -814,7 +844,7 @@ double **matprod2(); /* test */ double **oldm, **newm, **savm; /* Working pointers to matrices */ double **oldms, **newms, **savms; /* Fixed working pointers to matrices */ /*FILE *fic ; */ /* Used in readdata only */ -FILE *ficpar, *ficparo,*ficres, *ficresp, *ficrespl, *ficrespij, *ficrest,*ficresf,*ficrespop; +FILE *ficpar, *ficparo,*ficres, *ficresp, *ficresphtm, *ficresphtmfr, *ficrespl, *ficresplb,*ficrespij, *ficrespijb, *ficrest,*ficresf, *ficresfb,*ficrespop; FILE *ficlog, *ficrespow; int globpr=0; /* Global variable for printing or not */ double fretone; /* Only one call to likelihood */ @@ -837,13 +867,13 @@ char fileresv[FILENAMELENGTH]; FILE *ficresvpl; char fileresvpl[FILENAMELENGTH]; char title[MAXLINE]; -char optionfile[FILENAMELENGTH], datafile[FILENAMELENGTH], filerespl[FILENAMELENGTH]; +char optionfile[FILENAMELENGTH], datafile[FILENAMELENGTH], filerespl[FILENAMELENGTH], fileresplb[FILENAMELENGTH]; char plotcmd[FILENAMELENGTH], pplotcmd[FILENAMELENGTH]; char tmpout[FILENAMELENGTH], tmpout2[FILENAMELENGTH]; char command[FILENAMELENGTH]; int outcmd=0; -char fileres[FILENAMELENGTH], filerespij[FILENAMELENGTH], filereso[FILENAMELENGTH], rfileres[FILENAMELENGTH]; +char fileres[FILENAMELENGTH], filerespij[FILENAMELENGTH], filerespijb[FILENAMELENGTH], filereso[FILENAMELENGTH], rfileres[FILENAMELENGTH]; char fileresu[FILENAMELENGTH]; /* fileres without r in front */ char filelog[FILENAMELENGTH]; /* Log file */ char filerest[FILENAMELENGTH]; @@ -1376,7 +1406,30 @@ char *subdirf3(char fileres[], char *pre strcat(tmpout,fileres); return tmpout; } + +/*************** function subdirfext ***********/ +char *subdirfext(char fileres[], char *preop, char *postop) +{ + + strcpy(tmpout,preop); + strcat(tmpout,fileres); + strcat(tmpout,postop); + return tmpout; +} +/*************** function subdirfext3 ***********/ +char *subdirfext3(char fileres[], char *preop, char *postop) +{ + + /* Caution optionfilefiname is hidden */ + strcpy(tmpout,optionfilefiname); + strcat(tmpout,"/"); + strcat(tmpout,preop); + strcat(tmpout,fileres); + strcat(tmpout,postop); + return tmpout; +} + char *asc_diff_time(long time_sec, char ascdiff[]) { long sec_left, days, hours, minutes; @@ -2091,6 +2144,123 @@ Earliest age to start was %d-%d=%d, ncvl return prlim; /* should not reach here */ } + + /**** Back Prevalence limit (stable or period prevalence) ****************/ + +double **bprevalim(double **bprlim, 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 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 */ + /* newm is the matrix after multiplications, its rows are identical at a factor */ + /* Initial matrix pimij */ + /* {0.85204250825084937, 0.13044499163996345, 0.017512500109187184, */ + /* 0.090851990222114765, 0.88271245433047185, 0.026435555447413338, */ + /* 0, 0 , 1} */ + /* + * and after some iteration: */ + /* {0.45504275246439968, 0.42731458730878791, 0.11764266022681241, */ + /* 0.45201005341706885, 0.42865420071559901, 0.11933574586733192, */ + /* 0, 0 , 1} */ + /* And prevalence by suppressing the deaths are close to identical rows in prlim: */ + /* {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 */ + double **out, cov[NCOVMAX+1], **bmij(); + double **newm; + double agefin, delaymax=200. ; /* 100 Max number of years to converge */ + int ncvloop=0; + + min=vector(1,nlstate); + max=vector(1,nlstate); + meandiff=vector(1,nlstate); + + for (ii=1;ii<=nlstate+ndeath;ii++) + for (j=1;j<=nlstate+ndeath;j++){ + oldm[ii][j]=(ii==j ? 1.0 : 0.0); + } + + cov[1]=1.; + + /* Even if hstepm = 1, at least one multiplication by the unit matrix */ + /* Start at agefin= age, computes the matrix of passage and loops decreasing agefin until convergence is reached */ + for(agefin=age+stepm/YEARM; agefin<=age+delaymax; agefin=agefin+stepm/YEARM){ + ncvloop++; + newm=savm; + /* Covariates have to be included here again */ + 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])]; */ + 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])]; */ + 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]);*/ + /* savm=pmij(pmmij,cov,ncovmodel,x,nlstate); */ + /* out=matprod2(newm, pmij(pmmij,cov,ncovmodel,x,nlstate),1,nlstate+ndeath,1,nlstate+ndeath,1,nlstate+ndeath, oldm); /\* Bug Valgrind *\/ */ + out=matprod2(newm, oldm ,1,nlstate+ndeath,1,nlstate+ndeath,1,nlstate+ndeath, bmij(pmmij,cov,ncovmodel,x,nlstate)); /* Bug Valgrind */ + + savm=oldm; + oldm=newm; + + for(j=1; j<=nlstate; j++){ + max[j]=0.; + min[j]=1.; + } + /* sumnew=0; */ + /* for(k=1; k<=ndeath; k++) sumnew+=newm[i][nlstate+k]; */ + 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]); + min[i]=FMIN(min[i],bprlim[i][j]); + } + } + + maxmax=0.; + for(i=1; i<=nlstate; i++){ + meandiff[i]=(max[i]-min[i])/(max[i]+min[i])*2.; /* mean difference for each column */ + maxmax=FMAX(maxmax,meandiff[i]); + /* printf("Back age= %d meandiff[%d]=%f, agefin=%d max[%d]=%f min[%d]=%f maxmax=%f\n", (int)age, i, meandiff[i],(int)agefin, i, max[i], i, min[i],maxmax); */ + } /* j loop */ + *ncvyear= -( (int)age- (int)agefin); + /* printf("Back maxmax=%lf ncvloop=%d, age=%d, agefin=%d ncvyear=%d \n", maxmax, ncvloop, (int)age, (int)agefin, *ncvyear); */ + if(maxmax < ftolpl){ + printf("OK Back maxmax=%lf ncvloop=%d, age=%d, agefin=%d ncvyear=%d \n", maxmax, ncvloop, (int)age, (int)agefin, *ncvyear); + free_vector(min,1,nlstate); + free_vector(max,1,nlstate); + free_vector(meandiff,1,nlstate); + return bprlim; + } + } /* age loop */ + /* After some age loop it doesn't converge */ + printf("Warning: the back stable prevalence at age %d did not converge with the required precision (%g > ftolpl=%g) within %.0f years. Try to lower 'ftolpl'. \n\ +Oldest age to start was %d-%d=%d, ncvloop=%d, ncvyear=%d\n", (int)age, maxmax, ftolpl, delaymax, (int)age, (int)delaymax, (int)agefin, ncvloop, *ncvyear); + /* Try to lower 'ftol', for example from 1.e-8 to 6.e-9.\n", ftolpl, (int)age, (int)delaymax, (int)agefin, ncvloop, (int)age-(int)agefin); */ + free_vector(min,1,nlstate); + free_vector(max,1,nlstate); + free_vector(meandiff,1,nlstate); + + return bprlim; /* should not reach here */ +} + /*************** transition probabilities ***************/ double **pmij(double **ps, double *cov, int ncovmodel, double *x, int nlstate ) @@ -2173,6 +2343,98 @@ double **pmij(double **ps, double *cov, return ps; } +/*************** transition probabilities ***************/ + +double **bmij(double **ps, double *cov, int ncovmodel, double *x, int nlstate ) +{ + /* According to parameters values stored in x and the covariate's values stored in cov, + computes the probability to be observed in state j being in state i by appying the + model to the ncovmodel covariates (including constant and age). + lnpijopii=ln(pij/pii)= aij+bij*age+cij*v1+dij*v2+... = sum_nc=1^ncovmodel xij(nc)*cov[nc] + and, according on how parameters are entered, the position of the coefficient xij(nc) of the + ncth covariate in the global vector x is given by the formula: + j=i nc + ((i-1)*(nlstate+ndeath-1)+(j-2))*ncovmodel + Computes ln(pij/pii) (lnpijopii), deduces pij/pii by exponentiation, + sums on j different of i to get 1-pii/pii, deduces pii, and then all pij. + Outputs ps[i][j] the probability to be observed in j being in j according to + the values of the covariates cov[nc] and corresponding parameter values x[nc+shiftij] + */ + double s1, lnpijopii; + /*double t34;*/ + int i,j, 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; j(double)1.e-8 ?log((1.+bbh)*out[s1][s2]- bbh*(savm[s1][s2])):log((1.+bbh)*out[s1][s2]));*/ /* linear interpolation */ @@ -2535,6 +2893,10 @@ double func( double *x) s2=s[mw[mi+1][i]][i]; if( s2 > nlstate){ lli=log(out[s1][s2] - savm[s1][s2]); + } else if ( s2==-1 ) { /* alive */ + for (j=1,survp=0. ; j<=nlstate; j++) + survp += out[s1][j]; + lli= log(survp); }else{ lli=log(out[s[mw[mi][i]][i]][s[mw[mi+1][i]][i]]); /* Original formula */ } @@ -2597,6 +2959,7 @@ double funcone( double *x) int s1, s2; double bbh, survp; double agexact; + double agebegin, ageend; /*extern weight */ /* We are differentiating ll according to initial status */ /* for (i=1;i<=npar;i++) printf("%f ", x[i]);*/ @@ -2615,7 +2978,12 @@ double funcone( double *x) oldm[ii][j]=(ii==j ? 1.0 : 0.0); savm[ii][j]=(ii==j ? 1.0 : 0.0); } - for(d=0; d nlstate && (mle <5) ){ /* Jackson */ lli=log(out[s1][s2] - savm[s1][s2]); - } else if (s2==-2) { + } 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); @@ -2663,9 +3035,9 @@ double funcone( double *x) 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 %6d %2d %2d %2d %2d %3d %11.6f %8.4f %8.3f\ + fprintf(ficresilk,"%9ld %6.1f %6.1f %6d %2d %2d %2d %2d %3d %11.6f %8.4f %8.3f\ %11.6f %11.6f %11.6f ", \ - num[i], agexact, i,s1,s2,mi,mw[mi][i],dh[mi][i],exp(lli),weight[i],weight[i]*gipmx/gsw, + 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; @@ -2703,8 +3075,8 @@ void likelione(FILE *ficres,double p[], printf("Problem with resultfile: %s\n", fileresilk); fprintf(ficlog,"Problem with resultfile: %s\n", fileresilk); } - fprintf(ficresilk, "#individual(line's_record) count age s1 s2 wave# effective_wave# number_of_matrices_product pij weight weight/gpw -2ln(pij)*weight 0pij_x 0pij_(x-stepm) cumulating_loglikeli_by_health_state(reweighted=-2ll*weightXnumber_of_contribs/sum_of_weights) and_total\n"); - fprintf(ficresilk, "#num_i age i s1 s2 mi mw dh likeli weight %%weight 2wlli out sav "); + fprintf(ficresilk, "#individual(line's_record) count ageb ageend s1 s2 wave# effective_wave# number_of_matrices_product pij weight weight/gpw -2ln(pij)*weight 0pij_x 0pij_(x-stepm) cumulating_loglikeli_by_health_state(reweighted=-2ll*weightXnumber_of_contribs/sum_of_weights) and_total\n"); + fprintf(ficresilk, "#num_i ageb agend i s1 s2 mi mw dh likeli weight %%weight 2wlli out sav "); /* i,s1,s2,mi,mw[mi][i],dh[mi][i],exp(lli),weight[i],2*weight[i]*lli,out[s1][s2],savm[s1][s2]); */ for(k=1; k<=nlstate; k++) fprintf(ficresilk," -2*gipw/gsw*weight*ll[%d]++",k); @@ -2722,7 +3094,7 @@ void likelione(FILE *ficres,double p[], for (k=1; k<= nlstate ; k++) { - fprintf(fichtm,"
- Probability p%dj by origin %d and destination j %s-p%dj.png
\ + fprintf(fichtm,"
- Probability p%dj by origin %d and destination j. Dot's sizes are related to corresponding weight: %s-p%dj.png
\ ",k,k,subdirf2(optionfilefiname,"ILK_"),k,subdirf2(optionfilefiname,"ILK_"),k,subdirf2(optionfilefiname,"ILK_"),k); } fprintf(fichtm,"
- The function drawn is -2Log(L) in Log scale: by state of origin %s-ori.png
\ @@ -3178,25 +3550,61 @@ void pstamp(FILE *fichier) } /************ Frequencies ********************/ -void freqsummary(char fileres[], int iagemin, int iagemax, int **s, double **agev, int nlstate, int imx, int *Tvaraff, int **nbcode, int *ncodemax,double **mint,double **anint, char strstart[]) +void freqsummary(char fileres[], int iagemin, int iagemax, int **s, double **agev, int nlstate, int imx, \ + int *Tvaraff, int **nbcode, int *ncodemax,double **mint,double **anint, char strstart[],\ + int firstpass, int lastpass, int stepm, int weightopt, char model[]) { /* Some frequencies */ int i, m, jk, j1, bool, z1,j; + int mi; /* Effective wave */ int first; double ***freq; /* Frequencies */ double *pp, **prop; double pos,posprop, k2, dateintsum=0,k2cpt=0; - char fileresp[FILENAMELENGTH]; - + char fileresp[FILENAMELENGTH], fileresphtm[FILENAMELENGTH], fileresphtmfr[FILENAMELENGTH]; + double agebegin, ageend; + pp=vector(1,nlstate); prop=matrix(1,nlstate,iagemin,iagemax+3); strcpy(fileresp,"P_"); strcat(fileresp,fileresu); + /*strcat(fileresphtm,fileresu);*/ if((ficresp=fopen(fileresp,"w"))==NULL) { printf("Problem with prevalence resultfile: %s\n", fileresp); fprintf(ficlog,"Problem with prevalence resultfile: %s\n", fileresp); exit(0); } + + strcpy(fileresphtm,subdirfext(optionfilefiname,"PHTM_",".htm")); + if((ficresphtm=fopen(fileresphtm,"w"))==NULL) { + printf("Problem with prevalence HTM resultfile '%s' with errno='%s'\n",fileresphtm,strerror(errno)); + fprintf(ficlog,"Problem with prevalence HTM resultfile '%s' with errno='%s'\n",fileresphtm,strerror(errno)); + fflush(ficlog); + exit(70); + } + else{ + fprintf(ficresphtm,"\nIMaCh PHTM_ %s\n %s
%s
\ +
\n\ +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); + + strcpy(fileresphtmfr,subdirfext(optionfilefiname,"PHTMFR_",".htm")); + if((ficresphtmfr=fopen(fileresphtmfr,"w"))==NULL) { + printf("Problem with frequency table HTM resultfile '%s' with errno='%s'\n",fileresphtmfr,strerror(errno)); + fprintf(ficlog,"Problem with frequency table HTM resultfile '%s' with errno='%s'\n",fileresphtmfr,strerror(errno)); + fflush(ficlog); + exit(70); + } + else{ + fprintf(ficresphtmfr,"\nIMaCh PHTM_Frequency table %s\n %s
%s
\ +
\n\ +Title=%s
Datafile=%s Firstpass=%d Lastpass=%d Stepm=%d Weight=%d Model=1+age+%s
\n",\ + fileresphtmfr,version,fullversion,title,datafile,firstpass,lastpass,stepm, weightopt, model); + } + fprintf(ficresphtmfr,"Current page is file %s
\n\n

Frequencies of all effective transitions by age at begin of transition

Unknown status is -1
\n",fileresphtmfr, fileresphtmfr); + freq= ma3x(-5,nlstate+ndeath,-5,nlstate+ndeath,iagemin,iagemax+3); j1=0; @@ -3205,10 +3613,7 @@ void freqsummary(char fileres[], int ia first=1; - /* for(k1=1; k1<=j ; k1++){ */ /* Loop on covariates */ - /* for(i1=1; i1<=ncodemax[k1];i1++){ */ /* Now it is 2 */ - /* j1++; */ - for (j1 = 1; j1 <= (int) pow(2,cptcoveff); j1++){ + for (j1 = 1; j1 <= (int) pow(2,cptcoveff); j1++){ /* Loop on covariates combination */ /*printf("cptcoveff=%d Tvaraff=%d", cptcoveff,Tvaraff[1]); scanf("%d", i);*/ for (i=-5; i<=nlstate+ndeath; i++) @@ -3222,7 +3627,7 @@ void freqsummary(char fileres[], int ia dateintsum=0; k2cpt=0; - for (i=1; i<=imx; i++) { + for (i=1; i<=imx; i++) { /* For each individual i */ bool=1; if (cptcovn>0) { /* Filter is here: Must be looked at for model=V1+V2+V3+V4 */ for (z1=1; z1<=cptcoveff; z1++) @@ -3235,25 +3640,38 @@ void freqsummary(char fileres[], int ia /* For j1=7 in V1+V2+V3+V4 = 0 1 1 0 and codtabm(7,3)=1 and nbcde[3][?]=1*/ } } /* cptcovn > 0 */ - + if (bool==1){ - for(m=firstpass; m<=lastpass; m++){ - k2=anint[m][i]+(mint[m][i]/12.); - /*if ((k2>=dateprev1) && (k2<=dateprev2)) {*/ - if(agev[m][i]==0) agev[m][i]=iagemax+1; - if(agev[m][i]==1) agev[m][i]=iagemax+2; - if (s[m][i]>0 && s[m][i]<=nlstate) prop[s[m][i]][(int)agev[m][i]] += weight[i]; + /* for(m=firstpass; m<=lastpass; m++){ */ + for(mi=1; mi=firstpass && m <=lastpass){ + k2=anint[m][i]+(mint[m][i]/12.); + /*if ((k2>=dateprev1) && (k2<=dateprev2)) {*/ + if(agev[m][i]==0) agev[m][i]=iagemax+1; /* All ages equal to 0 are in iagemax+1 */ + if(agev[m][i]==1) agev[m][i]=iagemax+2; /* All ages equal to 1 are in iagemax+2 */ + if (s[m][i]>0 && s[m][i]<=nlstate) /* If status at wave m is known and a live state */ + prop[s[m][i]][(int)agev[m][i]] += weight[i]; /* At age of beginning of transition, where status is known */ if (m1) && (agev[m][i]< (iagemax+3)) && (anint[m][i]!=9999) && (mint[m][i]!=99)) { - dateintsum=dateintsum+k2; - k2cpt++; - /* printf("i=%ld dateintmean = %lf dateintsum=%lf k2cpt=%lf k2=%lf\n",i, dateintsum/k2cpt, dateintsum,k2cpt, k2); */ + /* if(s[m][i]==4 && s[m+1][i]==4) */ + /* printf(" num=%ld m=%d, i=%d s1=%d s2=%d agev at m=%d\n", num[i], m, i,s[m][i],s[m+1][i], (int)agev[m][i]); */ + if(s[m][i]==-1) + printf(" num=%ld m=%d, i=%d s1=%d s2=%d agev at m=%d agebegin=%.2f ageend=%.2f, agemed=%d\n", num[i], m, i,s[m][i],s[m+1][i], (int)agev[m][i],agebegin, ageend, (int)((agebegin+ageend)/2.)); + freq[s[m][i]][s[m+1][i]][(int)agev[m][i]] += weight[i]; /* At age of beginning of transition, where status is known */ + /* freq[s[m][i]][s[m+1][i]][(int)((agebegin+ageend)/2.)] += weight[i]; */ + freq[s[m][i]][s[m+1][i]][iagemax+3] += weight[i]; /* Total is in iagemax+3 *//* At age of beginning of transition, where status is known */ } - /*}*/ + } + if ((agev[m][i]>1) && (agev[m][i]< (iagemax+3)) && (anint[m][i]!=9999) && (mint[m][i]!=99)) { + dateintsum=dateintsum+k2; + k2cpt++; + /* printf("i=%ld dateintmean = %lf dateintsum=%lf k2cpt=%lf k2=%lf\n",i, dateintsum/k2cpt, dateintsum,k2cpt, k2); */ + } + /*}*/ } /* end m */ } /* end bool */ } /* end i = 1 to imx */ @@ -3262,24 +3680,57 @@ void freqsummary(char fileres[], int ia pstamp(ficresp); if (cptcovn>0) { fprintf(ficresp, "\n#********** Variable "); - for (z1=1; z1<=cptcoveff; z1++) fprintf(ficresp, "V%d=%d ",Tvaraff[z1],nbcode[Tvaraff[z1]][codtabm(j1,z1)]); - fprintf(ficresp, "**********\n#"); + 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, "**********\n#"); + fprintf(ficresphtm, "**********

\n"); + fprintf(ficresphtmfr, "**********\n"); fprintf(ficlog, "\n#********** Variable "); for (z1=1; z1<=cptcoveff; z1++) fprintf(ficlog, "V%d=%d ",Tvaraff[z1],nbcode[Tvaraff[z1]][codtabm(j1,z1)]); - fprintf(ficlog, "**********\n#"); + fprintf(ficlog, "**********\n"); } - for(i=1; i<=nlstate;i++) + fprintf(ficresphtm,""); + for(i=1; i<=nlstate;i++) { fprintf(ficresp, " Age Prev(%d) N(%d) N",i,i); + fprintf(ficresphtm, "",i,i); + } fprintf(ficresp, "\n"); + fprintf(ficresphtm, "\n"); + /* Header of frequency table by age */ + fprintf(ficresphtmfr,"
AgePrev(%d)N(%d)N
"); + fprintf(ficresphtmfr," "); + for(jk=-1; jk <=nlstate+ndeath; jk++){ + for(m=-1; m <=nlstate+ndeath; m++){ + if(jk!=0 && m!=0) + fprintf(ficresphtmfr," ",jk,m); + } + } + fprintf(ficresphtmfr, "\n"); + + /* For each age */ for(i=iagemin; i <= iagemax+3; i++){ - if(i==iagemax+3){ + fprintf(ficresphtm,""); + if(i==iagemax+1){ + fprintf(ficlog,"1"); + fprintf(ficresphtmfr," "); + }else if(i==iagemax+2){ + fprintf(ficlog,"0"); + fprintf(ficresphtmfr," "); + }else if(i==iagemax+3){ fprintf(ficlog,"Total"); + fprintf(ficresphtmfr," "); }else{ if(first==1){ first=0; printf("See log file for details...\n"); } + fprintf(ficresphtmfr," ",i); fprintf(ficlog,"Age %d", i); } for(jk=1; jk <=nlstate ; jk++){ @@ -3322,32 +3773,47 @@ void freqsummary(char fileres[], int ia if( i <= iagemax){ if(pos>=1.e-5){ fprintf(ficresp," %d %.5f %.0f %.0f",i,prop[jk][i]/posprop, prop[jk][i],posprop); + fprintf(ficresphtm,"",i,prop[jk][i]/posprop, prop[jk][i],posprop); /*probs[i][jk][j1]= pp[jk]/pos;*/ /*printf("\ni=%d jk=%d j1=%d %.5f %.0f %.0f %f",i,jk,j1,pp[jk]/pos, pp[jk],pos,probs[i][jk][j1]);*/ } - else + else{ fprintf(ficresp," %d NaNq %.0f %.0f",i,prop[jk][i],posprop); + fprintf(ficresphtm,"",i, prop[jk][i],posprop); + } } } - for(jk=-1; jk <=nlstate+ndeath; jk++) - for(m=-1; m <=nlstate+ndeath; m++) - if(freq[jk][m][i] !=0 ) { - if(first==1) - printf(" %d%d=%.0f",jk,m,freq[jk][m][i]); + for(jk=-1; jk <=nlstate+ndeath; jk++){ + for(m=-1; m <=nlstate+ndeath; m++){ + if(freq[jk][m][i] !=0 ) { /* minimizing output */ + if(first==1){ + printf(" %d%d=%.0f",jk,m,freq[jk][m][i]); + } fprintf(ficlog," %d%d=%.0f",jk,m,freq[jk][m][i]); } - if(i <= iagemax) + if(jk!=0 && m!=0) + fprintf(ficresphtmfr," ",freq[jk][m][i]); + } + } + fprintf(ficresphtmfr,"\n "); + if(i <= iagemax){ fprintf(ficresp,"\n"); + fprintf(ficresphtm,"\n"); + } if(first==1) printf("Others in log...\n"); fprintf(ficlog,"\n"); } /* end loop i */ + fprintf(ficresphtm,"
Age%d%d
0
Unknown
Total
%d%d%.5f%.0f%.0f%dNaNq%.0f%.0f%.0f
\n"); + fprintf(ficresphtmfr,"\n"); /*}*/ } /* end j1 */ dateintmean=dateintsum/k2cpt; fclose(ficresp); + fclose(ficresphtm); + fclose(ficresphtmfr); free_ma3x(freq,-5,nlstate+ndeath,-5,nlstate+ndeath, iagemin, iagemax+3); free_vector(pp,1,nlstate); free_matrix(prop,1,nlstate,iagemin, iagemax+3); @@ -3363,6 +3829,9 @@ void prevalence(double ***probs, double */ int i, m, jk, j1, bool, z1,j; + int mi; /* Effective wave */ + int iage; + double agebegin, ageend; double **prop; double posprop; @@ -3382,54 +3851,57 @@ void prevalence(double ***probs, double first=1; for(j1=1; j1<= (int) pow(2,cptcoveff);j1++){ - /*for(i1=1; i1<=ncodemax[k1];i1++){ - j1++;*/ - - for (i=1; i<=nlstate; i++) - for(m=iagemin; m <= iagemax+3; m++) - prop[i][m]=0.0; - - for (i=1; i<=imx; i++) { /* Each individual */ - bool=1; - if (cptcovn>0) { - for (z1=1; z1<=cptcoveff; z1++) - if (covar[Tvaraff[z1]][i]!= nbcode[Tvaraff[z1]][codtabm(j1,z1)]) - bool=0; - } - if (bool==1) { - for(m=firstpass; m<=lastpass; m++){/* Other selection (we can limit to certain interviews*/ + for (i=1; i<=nlstate; i++) + for(iage=iagemin; iage <= iagemax+3; iage++) + prop[i][iage]=0.0; + + for (i=1; i<=imx; i++) { /* Each individual */ + bool=1; + if (cptcovn>0) { /* Filter is here: Must be looked at for model=V1+V2+V3+V4 */ + for (z1=1; z1<=cptcoveff; z1++) + if (covar[Tvaraff[z1]][i]!= nbcode[Tvaraff[z1]][codtabm(j1,z1)]) + bool=0; + } + if (bool==1) { + /* for(m=firstpass; m<=lastpass; m++){/\* Other selection (we can limit to certain interviews*\/ */ + for(mi=1; mi=firstpass && m <=lastpass){ y2=anint[m][i]+(mint[m][i]/12.); /* Fractional date in year */ if ((y2>=dateprev1) && (y2<=dateprev2)) { /* Here is the main selection (fractional years) */ if(agev[m][i]==0) agev[m][i]=iagemax+1; if(agev[m][i]==1) agev[m][i]=iagemax+2; if((int)agev[m][i] iagemax+3) printf("Error on individual =%d agev[m][i]=%f m=%d\n",i, agev[m][i],m); - if (s[m][i]>0 && s[m][i]<=nlstate) { + if (s[m][i]>0 && s[m][i]<=nlstate) { /*if(i>4620) printf(" i=%d m=%d s[m][i]=%d (int)agev[m][i]=%d weight[i]=%f prop=%f\n",i,m,s[m][i],(int)agev[m][m],weight[i],prop[s[m][i]][(int)agev[m][i]]);*/ - prop[s[m][i]][(int)agev[m][i]] += weight[i]; - prop[s[m][i]][iagemax+3] += weight[i]; - } - } + prop[s[m][i]][(int)agev[m][i]] += weight[i];/* At age of beginning of transition, where status is known */ + prop[s[m][i]][iagemax+3] += weight[i]; + } /* end valid statuses */ + } /* end selection of dates */ } /* end selection of waves */ - } - } - for(i=iagemin; i <= iagemax+3; i++){ - for(jk=1,posprop=0; jk <=nlstate ; jk++) { - posprop += prop[jk][i]; - } - - for(jk=1; jk <=nlstate ; jk++){ - if( i <= iagemax){ - if(posprop>=1.e-5){ - probs[i][jk][j1]= prop[jk][i]/posprop; - } else{ - if(first==1){ - first=0; - printf("Warning Observed prevalence probs[%d][%d][%d]=%lf because of lack of cases\nSee others on log file...\n",jk,i,j1,probs[i][jk][j1]); - } + } /* end effective waves */ + } /* end bool */ + } + for(i=iagemin; i <= iagemax+3; i++){ + for(jk=1,posprop=0; jk <=nlstate ; jk++) { + posprop += prop[jk][i]; + } + + for(jk=1; jk <=nlstate ; jk++){ + if( i <= iagemax){ + if(posprop>=1.e-5){ + probs[i][jk][j1]= prop[jk][i]/posprop; + } else{ + if(first==1){ + first=0; + printf("Warning Observed prevalence probs[%d][%d][%d]=%lf because of lack of cases\nSee others on log file...\n",jk,i,j1,probs[i][jk][j1]); } - } - }/* end jk */ - }/* end i */ + } + } + }/* end jk */ + }/* end i */ /*} *//* end i1 */ } /* end j1 */ @@ -3452,31 +3924,67 @@ void concatwav(int wav[], int **dh, int int i, mi, m; /* int j, k=0,jk, ju, jl,jmin=1e+5, jmax=-1; double sum=0., jmean=0.;*/ - int first; + int first, firstwo, firsthree; int j, k=0,jk, ju, jl; double sum=0.; first=0; + firstwo=0; + firsthree=0; jmin=100000; jmax=-1; jmean=0.; - for(i=1; i<=imx; i++){ + for(i=1; i<=imx; i++){ /* For simple cases and if state is death */ mi=0; m=firstpass; - while(s[m][i] <= nlstate){ - if(s[m][i]>=1 || s[m][i]==-2 || s[m][i]==-4 || s[m][i]==-5) + while(s[m][i] <= nlstate){ /* a live state */ + if(s[m][i]>=1 || s[m][i]==-4 || s[m][i]==-5){ /* Since 0.98r4 if status=-2 vital status is really unknown, wave should be skipped */ mw[++mi][i]=m; - if(m >=lastpass) + } + if(m >=lastpass){ + if(s[m][i]==-1 && (int) andc[i] == 9999 && (int)anint[m][i] != 9999){ + if(firsthree == 0){ + printf("Information! Unknown health status for individual %ld line=%d occurred at last wave %d at known date %d/%d. Please, check if your unknown date of death %d/%d means a live state %d at wave %d. This case(%d)/wave(%d) contributes to the likelihood.\nOthers in log file only\n",num[i],i,lastpass,(int)mint[m][i],(int)anint[m][i], (int) moisdc[i], (int) andc[i], s[m][i], m, i, m); + fprintf(ficlog,"Information! Unknown status for individual %ld line=%d occurred at last wave %d at known date %d/%d. Please, check if your unknown date of death %d/%d means a live state %d at wave %d. This case(%d)/wave(%d) contributes to the likelihood.\nOthers in log file only\n",num[i],i,lastpass,(int)mint[m][i],(int)anint[m][i], (int) moisdc[i], (int) andc[i], s[m][i], m, i, m); + firsthree=1; + }else{ + fprintf(ficlog,"Information! Unknown status for individual %ld line=%d occurred at last wave %d at known date %d/%d. Please, check if your unknown date of death %d/%d means a live state %d at wave %d. This case(%d)/wave(%d) contributes to the likelihood.\nOthers in log file only\n",num[i],i,lastpass,(int)mint[m][i],(int)anint[m][i], (int) moisdc[i], (int) andc[i], s[m][i], m, i, m); + } + mw[++mi][i]=m; + } + if(s[m][i]==-2){ /* Vital status is really unknown */ + nbwarn++; + if((int)anint[m][i] == 9999){ /* Has the vital status really been verified? */ + printf("Warning! Vital status for individual %ld (line=%d) at last wave %d interviewed at date %d/%d is unknown %d. Please, check if the vital status and the date of death %d/%d are really unknown. This case (%d)/wave (%d) is skipped, no contribution to likelihood.\nOthers in log file only\n",num[i],i,lastpass,(int)mint[m][i],(int)anint[m][i], s[m][i], (int) moisdc[i], (int) andc[i], i, m); + fprintf(ficlog,"Warning! Vital status for individual %ld (line=%d) at last wave %d interviewed at date %d/%d is unknown %d. Please, check if the vital status and the date of death %d/%d are really unknown. This case (%d)/wave (%d) is skipped, no contribution to likelihood.\nOthers in log file only\n",num[i],i,lastpass,(int)mint[m][i],(int)anint[m][i], s[m][i], (int) moisdc[i], (int) andc[i], i, m); + } + break; + } break; + } else m++; }/* end while */ - if (s[m][i] > nlstate){ + + /* After last pass */ + if (s[m][i] > nlstate){ /* In a death state */ mi++; /* Death is another wave */ /* if(mi==0) never been interviewed correctly before death */ /* Only death is a correct wave */ mw[mi][i]=m; + }else if ((int) andc[i] != 9999) { /* Status is either death or negative. A death occured after lastpass, we can't take it into account because of potential bias */ + /* m++; */ + /* mi++; */ + /* s[m][i]=nlstate+1; /\* We are setting the status to the last of non live state *\/ */ + /* mw[mi][i]=m; */ + nberr++; + if(firstwo==0){ + printf("Error! Death for individual %ld line=%d occurred %d/%d after last wave %d interviewed at %d/%d. Potential bias if other individuals are still alive at this date but ignored. This case (%d)/wave (%d) is skipped, no contribution to likelihood.\nOthers in log file only\n",num[i],i,(int) moisdc[i], (int) andc[i], lastpass,(int)mint[m][i],(int)anint[m][i], i,m ); + fprintf(ficlog,"Error! Death for individual %ld line=%d occurred %d/%d after last wave %d interviewed at %d/%d. Potential bias if other individuals are still alive at this date but ignored. This case (%d)/wave (%d) is skipped, no contribution to likelihood.\nOthers in log file only\n",num[i],i,(int) moisdc[i], (int) andc[i], lastpass,(int)mint[m][i],(int)anint[m][i], i,m ); + firstwo=1; + }else if(firstwo==1){ + fprintf(ficlog,"Error! Death for individual %ld line=%d occurred %d/%d after last wave %d interviewed at %d/%d. Potential bias if other individuals are still alive at this date but ignored. This case (%d)/wave (%d) is skipped, no contribution to likelihood.\nOthers in log file only\n",num[i],i,(int) moisdc[i], (int) andc[i], lastpass,(int)mint[m][i],(int)anint[m][i], i,m ); + } } - wav[i]=mi; if(mi==0){ nbwarn++; @@ -3489,7 +3997,9 @@ void concatwav(int wav[], int **dh, int } } /* end mi==0 */ } /* End individuals */ + /* wav and mw are no more changed */ + for(i=1; i<=imx; i++){ for(mi=1; mi
  • Result files (first order: no variance)\n \
  • Result files (second order (variance)\n \ "); - fprintf(fichtm,"
    • Result files (first order: no variance)

      \n \ - - Observed prevalence in each state (during the period defined between %.lf/%.lf/%.lf and %.lf/%.lf/%.lf): %s
      \n ", - jprev1, mprev1,anprev1,jprev2, mprev2,anprev2,subdirf2(fileresu,"P_"),subdirf2(fileresu,"P_")); + 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")); + fprintf(fichtm,"
      • - Observed prevalence in each state (during the period defined between %.lf/%.lf/%.lf and %.lf/%.lf/%.lf): %s (html file) ", + jprev1, mprev1,anprev1,jprev2, mprev2,anprev2,subdirfext3(optionfilefiname,"PHTM_",".htm"),subdirfext3(optionfilefiname,"PHTM_",".htm")); + fprintf(fichtm,", %s (text file)
        \n",subdirf2(fileresu,"P_"),subdirf2(fileresu,"P_")); fprintf(fichtm,"\ - Estimated transition probabilities over %d (stepm) months: %s
        \n ", stepm,subdirf2(fileresu,"PIJ_"),subdirf2(fileresu,"PIJ_")); fprintf(fichtm,"\ + - Estimated back transition probabilities over %d (stepm) months: %s
        \n ", + stepm,subdirf2(fileresu,"PIJB_"),subdirf2(fileresu,"PIJB_")); + fprintf(fichtm,"\ - Period (stable) prevalence in each health state: %s
        \n", subdirf2(fileresu,"PL_"),subdirf2(fileresu,"PL_")); fprintf(fichtm,"\ - - (a) Life expectancies by health status at initial age, ei. (b) health expectancies by health status at initial age, eij . If one or more covariates are included, specific tables for each value of the covariate are output in sequences within the same file (estepm=%2d months): \ + - Period (stable) back prevalence in each health state: %s
        \n", + subdirf2(fileresu,"PLB_"),subdirf2(fileresu,"PLB_")); + fprintf(fichtm,"\ + - (a) Life expectancies by health status at initial age, ei. (b) health expectancies by health status at initial age, eij . If one or more covariates are included, specific tables for each value of the covariate are output in sequences within the same file (estepm=%2d months): \ %s
        \n", estepm,subdirf2(fileresu,"E_"),subdirf2(fileresu,"E_")); - fprintf(fichtm,"\ - - Population projections by age and states: \ + if(prevfcast==1){ + fprintf(fichtm,"\ + - Prevalence projections by age and states: \ %s
        \n
      • ", subdirf2(fileresu,"F_"),subdirf2(fileresu,"F_")); + } fprintf(fichtm," \n
        • Graphs
        • "); @@ -4847,16 +5368,16 @@ fprintf(fichtm," \n

          • Graphs fprintf(fichtm," ************\n
            "); } /* aij, bij */ - fprintf(fichtm,"
            - Logit model, for example: logit(pij)=log(pij/pii)= aij+ bij age + V1 age + etc. as a function of age: %s_%d-1.svg
            \ -",subdirf2(optionfilefiname,"PE_"),jj1,subdirf2(optionfilefiname,"PE_"),jj1,subdirf2(optionfilefiname,"PE_"),jj1); + fprintf(fichtm,"
            - Logit model (yours is: 1+age+%s), for example: logit(pij)=log(pij/pii)= aij+ bij age + V1 age + etc. as a function of age: %s_%d-1.svg
            \ +",model,subdirf2(optionfilefiname,"PE_"),jj1,subdirf2(optionfilefiname,"PE_"),jj1,subdirf2(optionfilefiname,"PE_"),jj1); /* Pij */ - fprintf(fichtm,"
            \n- Pij or conditional probabilities to be observed in state j being in state i, %d (stepm) months before: %s_%d-2.svg
            \ + fprintf(fichtm,"
            \n- Pij or conditional probabilities to be observed in state j being in state i, %d (stepm) months before: %s_%d-2.svg
            \ ",stepm,subdirf2(optionfilefiname,"PE_"),jj1,subdirf2(optionfilefiname,"PE_"),jj1,subdirf2(optionfilefiname,"PE_"),jj1); /* Quasi-incidences */ - fprintf(fichtm,"
            \n- Iij or Conditional probabilities to be observed in state j being in state i %d (stepm) months\ + fprintf(fichtm,"
            \n- Iij or Conditional probabilities to be observed in state j being in state i %d (stepm) months\ before but expressed in per year i.e. quasi incidences if stepm is small and probabilities too,\ - incidence (rates) are the limit when h tends to zero of the ratio of the probability hPij \ -divided by h: hPij/h : %s_%d-3.svg
            \ + incidence (rates) are the limit when h tends to zero of the ratio of the probability hPij \ +divided by h: hPij/h : %s_%d-3.svg
            \ ",stepm,subdirf2(optionfilefiname,"PE_"),jj1,subdirf2(optionfilefiname,"PE_"),jj1,subdirf2(optionfilefiname,"PE_"),jj1); /* Survival functions (period) in state j */ for(cpt=1; cpt<=nlstate;cpt++){ @@ -4871,9 +5392,24 @@ divided by h: hPij/h : \n- Convergence to period (stable) prevalence in state %d. Or probability to be in state %d being in state (1 to %d) at different ages. %s%d_%d.svg
            \ + fprintf(fichtm,"
            \n- Convergence to period (stable) prevalence in state %d. Or probability to be in state %d being in state (1 to %d) at different ages. %s_%d-%d.svg
            \ ", cpt, cpt, nlstate, subdirf2(optionfilefiname,"P_"),cpt,jj1,subdirf2(optionfilefiname,"P_"),cpt,jj1,subdirf2(optionfilefiname,"P_"),cpt,jj1); } + if(backcast==1){ + /* Period (stable) back prevalence in each health state */ + for(cpt=1; cpt<=nlstate;cpt++){ + fprintf(fichtm,"
            \n- Convergence to period (stable) back prevalence in state %d. Or probability to be in state %d being in state (1 to %d) at different ages. %s_%d-%d.svg
            \ +", cpt, cpt, nlstate, subdirf2(optionfilefiname,"PB_"),cpt,jj1,subdirf2(optionfilefiname,"PB_"),cpt,jj1,subdirf2(optionfilefiname,"PB_"),cpt,jj1); + } + } + if(prevfcast==1){ + /* Projection of prevalence up to period (stable) prevalence in each health state */ + for(cpt=1; cpt<=nlstate;cpt++){ + fprintf(fichtm,"
            \n- Projection of cross-sectional prevalence (estimated with cases observed from %.1f to %.1f) up to period (stable) prevalence in state %d. Or probability to be in state %d being in state (1 to %d) at different ages. %s%d_%d.svg
            \ +", dateprev1, dateprev2, cpt, cpt, nlstate, subdirf2(optionfilefiname,"PROJ_"),cpt,jj1,subdirf2(optionfilefiname,"PROJ_"),cpt,jj1,subdirf2(optionfilefiname,"PROJ_"),cpt,jj1); + } + } + for(cpt=1; cpt<=nlstate;cpt++) { fprintf(fichtm,"\n
            - Life expectancy by health state (%d) at initial age and its decomposition into health expectancies in each alive state (1 to %d) (or area under each survival functions): %s_%d%d.svg
            \ ",cpt,nlstate,subdirf2(optionfilefiname,"EXP_"),cpt,jj1,subdirf2(optionfilefiname,"EXP_"),cpt,jj1,subdirf2(optionfilefiname,"EXP_"),cpt,jj1); @@ -4961,10 +5497,11 @@ true period expectancies (those weighted } /******************* Gnuplot file **************/ -void printinggnuplot(char fileresu[], char optionfilefiname[], double ageminpar, double agemaxpar, double fage , char pathc[], double p[]){ + void printinggnuplot(char fileresu[], char optionfilefiname[], double ageminpar, double agemaxpar, double fage , int prevfcast, char pathc[], double p[]){ char dirfileres[132],optfileres[132]; int cpt=0,k1=0,i=0,k=0,j=0,jk=0,k2=0,k3=0,ij=0,l=0; + int lv=0, vlv=0, kl=0; int ng=0; int vpopbased; /* if((ficgp=fopen(optionfilegnuplot,"a"))==NULL) { */ @@ -4977,11 +5514,6 @@ void printinggnuplot(char fileresu[], ch /*#endif */ m=pow(2,cptcoveff); - /* Projected Prevalences */ -/* plot "NAGI0w_V1V2_monthlyb2b-proj/F_NAGI0w_V1V2_monthlyb2b-proj.txt" u 6:((($1 == 1) && ($2==0) && ($3==2) &&($4==0))? $7/(1-$13):1/0) t 'p11' w line */ -/* replot "" u 6:((($1 == 1) && ($2==0) && ($3==2) &&($4==0))? $8/(1-$14):1/0) t 'p21' w line */ -/* replot "" u 6:((($1 == 1) && ($2==0) && ($3==2) &&($4==0)&&($9!=0))? $9/(1-$15):1/0) t 'p.1' w line */ - /* Contribution to likelihood */ /* Plot the probability implied in the likelihood */ fprintf(ficgp,"\n# Contributions to the Likelihood, mle >=1. For mle=4 no interpolation, pure matrix products.\n#\n"); @@ -4993,15 +5525,15 @@ void printinggnuplot(char fileresu[], ch /* replot exp(p1+p2*x)/(1+exp(p1+p2*x)+exp(p3+p4*x)+exp(p5+p6*x)) t "p12(x)" */ /* fprintf(ficgp,"\nset out \"%s.svg\";",subdirf2(optionfilefiname,"ILK_")); */ fprintf(ficgp,"\nset out \"%s-dest.png\";",subdirf2(optionfilefiname,"ILK_")); - fprintf(ficgp,"\nset log y;plot \"%s\" u 2:(-$12):5 t \"All sample, transitions colored by destination\" with dots lc variable; set out;\n",subdirf(fileresilk)); + fprintf(ficgp,"\nset log y;plot \"%s\" u 2:(-$13):6 t \"All sample, transitions colored by destination\" with dots lc variable; set out;\n",subdirf(fileresilk)); fprintf(ficgp,"\nset out \"%s-ori.png\";",subdirf2(optionfilefiname,"ILK_")); - fprintf(ficgp,"\nset log y;plot \"%s\" u 2:(-$12):4 t \"All sample, transitions colored by origin\" with dots lc variable; set out;\n\n",subdirf(fileresilk)); + fprintf(ficgp,"\nset log y;plot \"%s\" u 2:(-$13):5 t \"All sample, transitions colored by origin\" with dots lc variable; set out;\n\n",subdirf(fileresilk)); for (i=1; i<= nlstate ; i ++) { fprintf(ficgp,"\nset out \"%s-p%dj.png\";set ylabel \"Probability for each individual/wave\";",subdirf2(optionfilefiname,"ILK_"),i); fprintf(ficgp,"unset log;\n# plot weighted, mean weight should have point size of 0.5\n plot \"%s\"",subdirf(fileresilk)); - fprintf(ficgp," u 2:($4 == %d && $5==%d ? $9 : 1/0):($11/4.):5 t \"p%d%d\" with points pointtype 7 ps variable lc variable \\\n",i,1,i,1); + fprintf(ficgp," u 2:($5 == %d && $6==%d ? $10 : 1/0):($12/4.):6 t \"p%d%d\" with points pointtype 7 ps variable lc variable \\\n",i,1,i,1); for (j=2; j<= nlstate+ndeath ; j ++) { - fprintf(ficgp,",\\\n \"\" u 2:($4 == %d && $5==%d ? $9 : 1/0):($11/4.):5 t \"p%d%d\" with points pointtype 7 ps variable lc variable ",i,j,i,j); + fprintf(ficgp,",\\\n \"\" u 2:($5 == %d && $6==%d ? $10 : 1/0):($12/4.):6 t \"p%d%d\" with points pointtype 7 ps variable lc variable ",i,j,i,j); } fprintf(ficgp,";\nset out; unset ylabel;\n"); } @@ -5014,9 +5546,20 @@ void printinggnuplot(char fileresu[], ch strcpy(dirfileres,optionfilefiname); strcpy(optfileres,"vpl"); /* 1eme*/ - fprintf(ficgp,"\n# 1st: Period (stable) prevalence with CI: 'VPL_' files\n"); - for (cpt=1; cpt<= nlstate ; cpt ++) { - for (k1=1; k1<= m ; k1 ++) { /* plot [100000000000000000000:-100000000000000000000] "mysbiaspar/vplrmysbiaspar.txt to check */ + for (cpt=1; cpt<= nlstate ; cpt ++) { /* For each live state */ + for (k1=1; k1<= m ; k1 ++) { /* For each combination of covariate */ + /* plot [100000000000000000000:-100000000000000000000] "mysbiaspar/vplrmysbiaspar.txt to check */ + fprintf(ficgp,"\n# 1st: Period (stable) prevalence with CI: 'VPL_' 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 */ + /* 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 */ + /* decodtabm(13,3,4)= 2 because h=13 k= 1 1 (2) 2 */ + vlv= nbcode[Tvaraff[lv]][lv]; + fprintf(ficgp," V%d=%d ",k,vlv); + } + fprintf(ficgp,"\n#\n"); + 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\ @@ -5043,8 +5586,18 @@ plot [%.f:%.f] \"%s\" every :::%d::%d u } /* k1 */ } /* cpt */ /*2 eme*/ - fprintf(ficgp,"\n# 2nd: Total life expectancy with CI: 't' files\n"); for (k1=1; k1<= m ; k1 ++) { + 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 */ + /* 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 */ + /* decodtabm(13,3,4)= 2 because h=13 k= 1 1 (2) 2 */ + vlv= nbcode[Tvaraff[lv]][lv]; + fprintf(ficgp," V%d=%d ",k,vlv); + } + fprintf(ficgp,"\n#\n"); + fprintf(ficgp,"\nset out \"%s_%d.svg\" \n",subdirf2(optionfilefiname,"E_"),k1); for(vpopbased=0; vpopbased <= popbased; vpopbased++){ /* Done for vpopbased=0 and vpopbased=1 if popbased==1*/ if(vpopbased==0) @@ -5077,10 +5630,22 @@ plot [%.f:%.f] \"%s\" every :::%d::%d u } /* vpopbased */ fprintf(ficgp,"\nset out;set out \"%s_%d.svg\"; replot; set out; \n",subdirf2(optionfilefiname,"E_"),k1); /* Buggy gnuplot */ } /* k1 */ + + /*3eme*/ - for (k1=1; k1<= m ; k1 ++) { 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 */ + 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 */ + /* decodtabm(13,3,4)= 2 because h=13 k= 1 1 (2) 2 */ + vlv= nbcode[Tvaraff[lv]][lv]; + fprintf(ficgp," V%d=%d ",k,vlv); + } + fprintf(ficgp,"\n#\n"); + /* k=2+nlstate*(2*cpt-2); */ k=2+(nlstate+1)*(cpt-1); fprintf(ficgp,"\nset out \"%s_%d%d.svg\" \n",subdirf2(optionfilefiname,"EXP_"),cpt,k1); @@ -5106,18 +5671,29 @@ plot [%.f:%.f] \"%s\" every :::%d::%d u /* 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 (cpt=1; cpt<=nlstate ; cpt ++) { /* For each life state */ - k=3; - fprintf(ficgp,"\n#\n#\n# Survival functions in state j : 'lij' files, cov=%d state=%d",k1, cpt); + fprintf(ficgp,"\n#\n#\n# Survival functions in state j : 'LIJ_' files, cov=%d state=%d",k1, cpt); + 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 */ + /* 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 */ + /* decodtabm(13,3,4)= 2 because h=13 k= 1 1 (2) 2 */ + vlv= nbcode[Tvaraff[lv]][lv]; + fprintf(ficgp," V%d=%d ",k,vlv); + } + fprintf(ficgp,"\n#\n"); + fprintf(ficgp,"\nset out \"%s_%d-%d.svg\" \n",subdirf2(optionfilefiname,"LIJ_"),cpt,k1); fprintf(ficgp,"set xlabel \"Age\" \nset ylabel \"Probability to be alive\" \n\ set ter svg size 640, 480\n\ unset log y\n\ plot [%.f:%.f] ", ageminpar, agemaxpar); + k=3; for (i=1; i<= nlstate ; i ++){ - if(i==1) + if(i==1){ fprintf(ficgp,"\"%s\"",subdirf2(fileresu,"PIJ_")); - else + }else{ fprintf(ficgp,", '' "); + } l=(nlstate+ndeath)*(i-1)+1; fprintf(ficgp," u ($1==%d ? ($3):1/0):($%d/($%d",k1,k+l+(cpt-1),k+l); for (j=2; j<= nlstate+ndeath ; j ++) @@ -5131,13 +5707,23 @@ plot [%.f:%.f] ", ageminpar, agemaxpar) /* 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 (cpt=1; cpt<=nlstate ; cpt ++) { /* For each inital state */ - k=3; 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); + 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 */ + /* 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 */ + /* decodtabm(13,3,4)= 2 because h=13 k= 1 1 (2) 2 */ + vlv= nbcode[Tvaraff[lv]][lv]; + fprintf(ficgp," V%d=%d ",k,vlv); + } + fprintf(ficgp,"\n#\n"); + fprintf(ficgp,"\nset out \"%s_%d-%d.svg\" \n",subdirf2(optionfilefiname,"LIJT_"),cpt,k1); fprintf(ficgp,"set xlabel \"Age\" \nset ylabel \"Probability to be alive\" \n\ set ter svg size 640, 480\n\ unset log y\n\ plot [%.f:%.f] ", ageminpar, agemaxpar); + k=3; for (j=1; j<= nlstate ; j ++){ /* Lived in state j */ if(j==1) fprintf(ficgp,"\"%s\"",subdirf2(fileresu,"PIJ_")); @@ -5163,22 +5749,67 @@ plot [%.f:%.f] ", ageminpar, agemaxpar) } /* end covariate */ /* CV preval stable (period) for each covariate */ - for (k1=1; k1<= m ; k1 ++) { /* For each covariate if any */ + for (k1=1; k1<= m ; k1 ++) { /* For each covariate combination (1 to m=2**k), if any covariate is present */ for (cpt=1; cpt<=nlstate ; cpt ++) { /* For each life state */ - k=3; - fprintf(ficgp,"\n#\n#\n#CV preval stable (period): 'pij' files, cov=%d state=%d",k1, cpt); + fprintf(ficgp,"\n#\n#\n#CV preval stable (period): 'pij' files, covariatecombination#=%d state=%d",k1, cpt); + 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 */ + /* 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 */ + /* decodtabm(13,3,4)= 2 because h=13 k= 1 1 (2) 2 */ + vlv= nbcode[Tvaraff[lv]][lv]; + fprintf(ficgp," V%d=%d ",k,vlv); + } + fprintf(ficgp,"\n#\n"); + fprintf(ficgp,"\nset out \"%s_%d-%d.svg\" \n",subdirf2(optionfilefiname,"P_"),cpt,k1); fprintf(ficgp,"set xlabel \"Age\" \nset ylabel \"Probability\" \n\ set ter svg size 640, 480\n\ unset log y\n\ plot [%.f:%.f] ", ageminpar, agemaxpar); + k=3; /* Offset */ for (i=1; i<= nlstate ; i ++){ if(i==1) fprintf(ficgp,"\"%s\"",subdirf2(fileresu,"PIJ_")); else fprintf(ficgp,", '' "); l=(nlstate+ndeath)*(i-1)+1; - fprintf(ficgp," u ($1==%d ? ($3):1/0):($%d/($%d",k1,k+l+(cpt-1),k+l); + fprintf(ficgp," u ($1==%d ? ($3):1/0):($%d/($%d",k1,k+l+(cpt-1),k+l); + for (j=2; j<= nlstate ; j ++) + fprintf(ficgp,"+$%d",k+l+j-1); + fprintf(ficgp,")) t \"prev(%d,%d)\" w l",i,cpt); + } /* nlstate */ + fprintf(ficgp,"\nset out\n"); + } /* end cpt state*/ + } /* end covariate */ + + /* 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 (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 */ + 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 */ + /* decodtabm(13,3,4)= 2 because h=13 k= 1 1 (2) 2 */ + vlv= nbcode[Tvaraff[lv]][lv]; + fprintf(ficgp," V%d=%d ",k,vlv); + } + fprintf(ficgp,"\n#\n"); + + fprintf(ficgp,"\nset out \"%s_%d-%d.svg\" \n",subdirf2(optionfilefiname,"PB_"),cpt,k1); + fprintf(ficgp,"set xlabel \"Age\" \nset ylabel \"Probability\" \n\ +set ter svg size 640, 480\n\ +unset log y\n\ +plot [%.f:%.f] ", ageminpar, agemaxpar); + k=3; /* Offset */ + for (i=1; i<= nlstate ; i ++){ + if(i==1) + fprintf(ficgp,"\"%s\"",subdirf2(fileresu,"PIJB_")); + else + fprintf(ficgp,", '' "); + l=(nlstate+ndeath)*(i-1)+1; + fprintf(ficgp," u ($1==%d ? ($3):1/0):($%d/($%d",k1,k+l+(cpt-1),k+l); /* a vérifier */ for (j=2; j<= nlstate ; j ++) fprintf(ficgp,"+$%d",k+l+j-1); fprintf(ficgp,")) t \"prev(%d,%d)\" w l",i,cpt); @@ -5187,6 +5818,84 @@ plot [%.f:%.f] ", ageminpar, agemaxpar) } /* end cpt state*/ } /* end covariate */ + 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 (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 */ + lv= decodtabm(k1,k,cptcoveff); /* Should be the covariate value corresponding to k1 combination and kth covariate */ + /* 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 */ + /* decodtabm(13,3,4)= 2 because h=13 k= 1 1 (2) 2 */ + vlv= nbcode[Tvaraff[lv]][lv]; + fprintf(ficgp," V%d=%d ",k,vlv); + } + fprintf(ficgp,"\n#\n"); + + fprintf(ficgp,"# hpijx=probability over h years, hp.jx is weighted by observed prev\n "); + fprintf(ficgp,"\nset out \"%s_%d-%d.svg\" \n",subdirf2(optionfilefiname,"PROJ_"),cpt,k1); + fprintf(ficgp,"set xlabel \"Age\" \nset ylabel \"Prevalence\" \n\ +set ter svg size 640, 480\n\ +unset log y\n\ +plot [%.f:%.f] ", ageminpar, agemaxpar); + for (i=1; i<= nlstate+1 ; i ++){ /* nlstate +1 p11 p21 p.1 */ + /*# V1 = 1 V2 = 0 yearproj age p11 p21 p.1 p12 p22 p.2 p13 p23 p.3*/ + /*# 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 */ + /*# yearproj age p11 p21 p.1 p12 p22 p.2 p13 p23 p.3*/ + /*# 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 */ + if(i==1){ + fprintf(ficgp,"\"%s\"",subdirf2(fileresu,"F_")); + }else{ + fprintf(ficgp,",\\\n '' "); + } + if(cptcoveff ==0){ /* No covariate */ + fprintf(ficgp," u 2:("); /* Age is in 2 */ + /*# yearproj age p11 p21 p31 p.1 p12 p22 p32 p.2 p13 p23 p33 p.3 p14 p24 p34 p.4*/ + /*# 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 */ + if(i==nlstate+1) + fprintf(ficgp," $%d/(1.-$%d)) t 'p.%d' with line ", \ + 2+(cpt-1)*(nlstate+1)+1+(i-1), 2+1+(i-1)+(nlstate+1)*nlstate,cpt ); + else + fprintf(ficgp," $%d/(1.-$%d)) t 'p%d%d' with line ", \ + 2+(cpt-1)*(nlstate+1)+1+(i-1), 2+1+(i-1)+(nlstate+1)*nlstate,i,cpt ); + }else{ + fprintf(ficgp,"u 6:(("); /* Age is in 6 */ + /*# V1 = 1 V2 = 0 yearproj age p11 p21 p.1 p12 p22 p.2 p13 p23 p.3*/ + /*# 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 */ + kl=0; + for (k=1; k<=cptcoveff; k++){ /* For each covariate */ + lv= decodtabm(k1,k,cptcoveff); /* Should be the covariate value corresponding to k1 combination and kth covariate */ + /* 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 */ + /* decodtabm(13,3,4)= 2 because h=13 k= 1 1 (2) 2 */ + vlv= nbcode[Tvaraff[lv]][lv]; + kl++; + /* kl=6+(cpt-1)*(nlstate+1)+1+(i-1); /\* 6+(1-1)*(2+1)+1+(1-1)=7, 6+(2-1)(2+1)+1+(1-1)=10 *\/ */ + /*6+(cpt-1)*(nlstate+1)+1+(i-1)+(nlstate+1)*nlstate; 6+(1-1)*(2+1)+1+(1-1) +(2+1)*2=13 */ + /*6+1+(i-1)+(nlstate+1)*nlstate; 6+1+(1-1) +(2+1)*2=13 */ + /* '' u 6:(($1==1 && $2==0 && $3==2 && $4==0)? $9/(1.-$15) : 1/0):($5==2000? 3:2) t 'p.1' with line lc variable*/ + if(k==cptcoveff) + if(i==nlstate+1) + fprintf(ficgp,"$%d==%d && $%d==%d)? $%d/(1.-$%d) : 1/0) t 'p.%d' with line ",kl, k,kl+1,nbcode[Tvaraff[lv]][lv], \ + 6+(cpt-1)*(nlstate+1)+1+(i-1), 6+1+(i-1)+(nlstate+1)*nlstate,cpt ); + else + fprintf(ficgp,"$%d==%d && $%d==%d)? $%d/(1.-$%d) : 1/0) t 'p%d%d' with line ",kl, k,kl+1,nbcode[Tvaraff[lv]][lv], \ + 6+(cpt-1)*(nlstate+1)+1+(i-1), 6+1+(i-1)+(nlstate+1)*nlstate,i,cpt ); + else{ + fprintf(ficgp,"$%d==%d && $%d==%d && ",kl, k,kl+1,nbcode[Tvaraff[lv]][lv]); + kl++; + } + } /* end covariate */ + } /* end if covariate */ + } /* nlstate */ + fprintf(ficgp,"\nset out\n"); + } /* end cpt state*/ + } /* end covariate */ + } /* End if prevfcast */ + + /* proba elementaires */ fprintf(ficgp,"\n##############\n#MLE estimated parameters\n#############\n"); for(i=1,jk=1; i <=nlstate; i++){ @@ -5276,40 +5985,49 @@ plot [%.f:%.f] ", ageminpar, agemaxpar) else fprintf(ficgp,"+p%d*%d",i+j+nagesqr-1,nbcode[Tvar[j-2]][codtabm(jk,j-2)]); } - if(ng != 1){ - fprintf(ficgp,")/(1"); + }else{ + i=i-ncovmodel; + if(ng !=1 ) /* For logit formula of log p11 is more difficult to get */ + fprintf(ficgp," (1."); + } + + if(ng != 1){ + fprintf(ficgp,")/(1"); - for(k1=1; k1 <=nlstate; k1++){ - if(nagesqr==0) - fprintf(ficgp,"+exp(p%d+p%d*x",k3+(k1-1)*ncovmodel,k3+(k1-1)*ncovmodel+1); - else /* nagesqr =1 */ - fprintf(ficgp,"+exp(p%d+p%d*x+p%d*x*x",k3+(k1-1)*ncovmodel,k3+(k1-1)*ncovmodel+1,k3+(k1-1)*ncovmodel+1+nagesqr); - - ij=1; - for(j=3; j <=ncovmodel-nagesqr; j++){ - if(ij <=cptcovage) { /* Bug valgrind */ - if((j-2)==Tage[ij]) { /* 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++; - } + for(k1=1; k1 <=nlstate; k1++){ + if(nagesqr==0) + fprintf(ficgp,"+exp(p%d+p%d*x",k3+(k1-1)*ncovmodel,k3+(k1-1)*ncovmodel+1); + else /* nagesqr =1 */ + fprintf(ficgp,"+exp(p%d+p%d*x+p%d*x*x",k3+(k1-1)*ncovmodel,k3+(k1-1)*ncovmodel+1,k3+(k1-1)*ncovmodel+1+nagesqr); + + ij=1; + for(j=3; j <=ncovmodel-nagesqr; j++){ + if(ij <=cptcovage) { /* Bug valgrind */ + if((j-2)==Tage[ij]) { /* 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++; } - else - fprintf(ficgp,"+p%d*%d",k3+(k1-1)*ncovmodel+1+j-2+nagesqr,nbcode[Tvar[j-2]][codtabm(jk,j-2)]); } - fprintf(ficgp,")"); + else + fprintf(ficgp,"+p%d*%d",k3+(k1-1)*ncovmodel+1+j-2+nagesqr,nbcode[Tvar[j-2]][codtabm(jk,j-2)]); } fprintf(ficgp,")"); - if(ng ==2) - fprintf(ficgp," t \"p%d%d\" ", k2,k); - else /* ng= 3 */ - fprintf(ficgp," t \"i%d%d\" ", k2,k); - }else{ /* end ng <> 1 */ - fprintf(ficgp," t \"logit(p%d%d)\" ", k2,k); } - if ((k+k2)!= (nlstate*2+ndeath)) fprintf(ficgp,","); - i=i+ncovmodel; + fprintf(ficgp,")"); + if(ng ==2) + fprintf(ficgp," t \"p%d%d\" ", k2,k); + else /* ng= 3 */ + fprintf(ficgp," t \"i%d%d\" ", k2,k); + }else{ /* end ng <> 1 */ + if( k !=k2) /* logit p11 is hard to draw */ + fprintf(ficgp," t \"logit(p%d%d)\" ", k2,k); } + if ((k+k2)!= (nlstate*2+ndeath) && ng != 1) + fprintf(ficgp,","); + if (ng == 1 && k!=k2 && (k+k2)!= (nlstate*2+ndeath)) + fprintf(ficgp,","); + i=i+ncovmodel; } /* end k */ } /* end k2 */ fprintf(ficgp,"\n set out\n"); @@ -5378,6 +6096,12 @@ void prevforecast(char fileres[], double char fileresf[FILENAMELENGTH]; agelim=AGESUP; + /* Compute observed prevalence between dateprev1 and dateprev2 by counting the number of people + in each health status at the date of interview (if between dateprev1 and dateprev2). + We still use firstpass and lastpass as another selection. + */ + /* freqsummary(fileres, agemin, agemax, s, agev, nlstate, imx,Tvaraff,nbcode, ncodemax,mint,anint,strstart,\ */ + /* firstpass, lastpass, stepm, weightopt, model); */ prevalence(probs, ageminpar, agemax, s, agev, nlstate, imx, Tvar, nbcode, ncodemax, mint, anint, dateprev1, dateprev2, firstpass, lastpass); strcpy(fileresf,"F_"); @@ -5386,8 +6110,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' \n", fileresf); - fprintf(ficlog,"Computing forecasting: result on file '%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); if (cptcoveff==0) ncodemax[cptcoveff]=1; @@ -5428,27 +6152,25 @@ void prevforecast(char fileres[], double for(cptcov=1, k=0;cptcov<=i1;cptcov++){ for(cptcod=1;cptcod<=ncodemax[cptcoveff];cptcod++){ k=k+1; - fprintf(ficresf,"\n#******"); + fprintf(ficresf,"\n#****** hpijx=probability over h years, hp.jx is weighted by observed prev \n#"); for(j=1;j<=cptcoveff;j++) { - fprintf(ficresf," V%d=%d, hpijx=probability over h years, hp.jx is weighted by observed prev ",Tvaraff[j],nbcode[Tvaraff[j]][codtabm(k,j)]); + fprintf(ficresf," V%d (=) %d",Tvaraff[j],nbcode[Tvaraff[j]][codtabm(k,j)]); } - fprintf(ficresf,"******\n"); - fprintf(ficresf,"# Covariate valuofcovar yearproj age"); + fprintf(ficresf," yearproj age"); for(j=1; j<=nlstate+ndeath;j++){ for(i=1; i<=nlstate;i++) fprintf(ficresf," p%d%d",i,j); fprintf(ficresf," p.%d",j); } - for (yearp=0; yearp<=(anproj2-anproj1);yearp +=stepsize) { + for (yearp=0; yearp<=(anproj2-anproj1);yearp +=stepsize) { fprintf(ficresf,"\n"); fprintf(ficresf,"\n# Forecasting at date %.lf/%.lf/%.lf ",jproj1,mproj1,anproj1+yearp); - for (agec=fage; agec>=(ageminpar-1); agec--){ nhstepm=(int) rint((agelim-agec)*YEARM/stepm); 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); for (h=0; h<=nhstepm; h++){ if (h*hstepm/YEARM*stepm ==yearp) { @@ -5483,6 +6205,140 @@ void prevforecast(char fileres[], double if (mobilav!=0) free_ma3x(mobaverage,1, AGESUP,1,NCOVMAX, 1,NCOVMAX); fclose(ficresf); + printf("End of Computing forecasting \n"); + fprintf(ficlog,"End of Computing forecasting\n"); + +} + +/************** Back Forecasting ******************/ +void prevbackforecast(char fileres[], double anback1, double mback1, double jback1, double ageminpar, double agemax, double dateprev1, double dateprev2, int mobilav, double bage, double fage, int firstpass, int lastpass, double anback2, double p[], int cptcoveff){ + /* back1, year, month, day of starting backection + agemin, agemax range of age + dateprev1 dateprev2 range of dates during which prevalence is computed + anback2 year of en of backection (same day and month as back1). + */ + int yearp, stepsize, hstepm, nhstepm, j, k, cptcod, i, h, i1; + double agec; /* generic age */ + double agelim, ppij, yp,yp1,yp2,jprojmean,mprojmean,anprojmean; + double *popeffectif,*popcount; + double ***p3mat; + double ***mobaverage; + char fileresfb[FILENAMELENGTH]; + + agelim=AGESUP; + /* Compute observed prevalence between dateprev1 and dateprev2 by counting the number of people + in each health status at the date of interview (if between dateprev1 and dateprev2). + We still use firstpass and lastpass as another selection. + */ + /* freqsummary(fileres, agemin, agemax, s, agev, nlstate, imx,Tvaraff,nbcode, ncodemax,mint,anint,strstart,\ */ + /* firstpass, lastpass, stepm, weightopt, model); */ + prevalence(probs, ageminpar, agemax, s, agev, nlstate, imx, Tvar, nbcode, ncodemax, mint, anint, dateprev1, dateprev2, firstpass, lastpass); + + strcpy(fileresfb,"FB_"); + strcat(fileresfb,fileresu); + if((ficresfb=fopen(fileresfb,"w"))==NULL) { + printf("Problem with back forecast resultfile: %s\n", fileresfb); + fprintf(ficlog,"Problem with back forecast resultfile: %s\n", fileresfb); + } + printf("Computing back forecasting: result on file '%s', please wait... \n", fileresfb); + fprintf(ficlog,"Computing back forecasting: result on file '%s', please wait... \n", fileresfb); + + if (cptcoveff==0) ncodemax[cptcoveff]=1; + + if (mobilav!=0) { + mobaverage= ma3x(1, AGESUP,1,NCOVMAX, 1,NCOVMAX); + if (movingaverage(probs, ageminpar, fage, mobaverage,mobilav)!=0){ + fprintf(ficlog," Error in movingaverage mobilav=%d\n",mobilav); + printf(" Error in movingaverage mobilav=%d\n",mobilav); + } + } + + stepsize=(int) (stepm+YEARM-1)/YEARM; + if (stepm<=12) stepsize=1; + if(estepm < stepm){ + printf ("Problem %d lower than %d\n",estepm, stepm); + } + else hstepm=estepm; + + hstepm=hstepm/stepm; + yp1=modf(dateintmean,&yp);/* extracts integral of datemean in yp and + fractional in yp1 */ + anprojmean=yp; + yp2=modf((yp1*12),&yp); + mprojmean=yp; + yp1=modf((yp2*30.5),&yp); + jprojmean=yp; + if(jprojmean==0) jprojmean=1; + if(mprojmean==0) jprojmean=1; + + i1=cptcoveff; + if (cptcovn < 1){i1=1;} + + fprintf(ficresfb,"# Mean day of interviews %.lf/%.lf/%.lf (%.2f) between %.2f and %.2f \n",jprojmean,mprojmean,anprojmean,dateintmean,dateprev1,dateprev2); + + fprintf(ficresfb,"#****** Routine prevbackforecast **\n"); + +/* if (h==(int)(YEARM*yearp)){ */ + for(cptcov=1, k=0;cptcov<=i1;cptcov++){ + for(cptcod=1;cptcod<=ncodemax[cptcoveff];cptcod++){ + k=k+1; + fprintf(ficresfb,"\n#****** hbijx=probability over h years, hp.jx is weighted by observed prev \n#"); + for(j=1;j<=cptcoveff;j++) { + fprintf(ficresfb," V%d (=) %d",Tvaraff[j],nbcode[Tvaraff[j]][codtabm(k,j)]); + } + fprintf(ficresfb," yearbproj age"); + for(j=1; j<=nlstate+ndeath;j++){ + for(i=1; i<=nlstate;i++) + fprintf(ficresfb," p%d%d",i,j); + fprintf(ficresfb," p.%d",j); + } + for (yearp=0; yearp>=(anback2-anback1);yearp -=stepsize) { + /* for (yearp=0; yearp<=(anproj2-anproj1);yearp +=stepsize) { */ + fprintf(ficresfb,"\n"); + fprintf(ficresfb,"\n# Back Forecasting at date %.lf/%.lf/%.lf ",jback1,mback1,anback1+yearp); + for (agec=fage; agec>=(ageminpar-1); agec--){ + nhstepm=(int) rint((agelim-agec)*YEARM/stepm); + nhstepm = nhstepm/hstepm; + p3mat=ma3x(1,nlstate+ndeath,1, nlstate+ndeath, 0,nhstepm); + oldm=oldms;savm=savms; + hbxij(p3mat,nhstepm,agec,hstepm,p,nlstate,stepm,oldm,savm, k); + + for (h=0; h<=nhstepm; h++){ + if (h*hstepm/YEARM*stepm ==yearp) { + fprintf(ficresfb,"\n"); + for(j=1;j<=cptcoveff;j++) + fprintf(ficresfb,"%d %d ",Tvaraff[j],nbcode[Tvaraff[j]][codtabm(k,j)]); + fprintf(ficresfb,"%.f %.f ",anback1+yearp,agec+h*hstepm/YEARM*stepm); + } + for(j=1; j<=nlstate+ndeath;j++) { + ppij=0.; + for(i=1; i<=nlstate;i++) { + if (mobilav==1) + ppij=ppij+p3mat[i][j][h]*mobaverage[(int)agec][i][cptcod]; + else { + ppij=ppij+p3mat[i][j][h]*probs[(int)(agec)][i][cptcod]; + } + if (h*hstepm/YEARM*stepm== yearp) { + fprintf(ficresfb," %.3f", p3mat[i][j][h]); + } + } /* end i */ + if (h*hstepm/YEARM*stepm==yearp) { + fprintf(ficresfb," %.3f", ppij); + } + }/* end j */ + } /* end h */ + free_ma3x(p3mat,1,nlstate+ndeath,1, nlstate+ndeath, 0,nhstepm); + } /* end agec */ + } /* end yearp */ + } /* end cptcod */ + } /* end cptcov */ + + if (mobilav!=0) free_ma3x(mobaverage,1, AGESUP,1,NCOVMAX, 1,NCOVMAX); + + fclose(ficresfb); + printf("End of Computing Back forecasting \n"); + fprintf(ficlog,"End of Computing Back forecasting\n"); + } /************** Forecasting *****not tested NB*************/ @@ -6302,7 +7158,8 @@ int calandcheckages(int imx, int maxwav, for(m=2; (m<= maxwav); m++) { if (((int)mint[m][i]== 99) && (s[m][i] <= nlstate)){ anint[m][i]=9999; - s[m][i]=-1; + if (s[m][i] != -2) /* Keeping initial status of unknown vital status */ + s[m][i]=-1; } if((int)moisdc[i]==99 && (int)andc[i]==9999 && s[m][i]>nlstate){ *nberr = *nberr + 1; @@ -6322,12 +7179,12 @@ int calandcheckages(int imx, int maxwav, for (i=1; i<=imx; i++) { agedc[i]=(moisdc[i]/12.+andc[i])-(moisnais[i]/12.+annais[i]); for(m=firstpass; (m<= lastpass); m++){ - if(s[m][i] >0 || s[m][i]==-2 || s[m][i]==-4 || s[m][i]==-5){ + if(s[m][i] >0 || s[m][i]==-1 || s[m][i]==-2 || s[m][i]==-4 || s[m][i]==-5){ /* What if s[m][i]=-1 */ if (s[m][i] >= nlstate+1) { if(agedc[i]>0){ if((int)moisdc[i]!=99 && (int)andc[i]!=9999){ agev[m][i]=agedc[i]; - /*if(moisdc[i]==99 && andc[i]==9999) s[m][i]=-1;*/ + /*if(moisdc[i]==99 && andc[i]==9999) s[m][i]=-1;*/ }else { if ((int)andc[i]!=9999){ nbwarn++; @@ -6337,7 +7194,7 @@ int calandcheckages(int imx, int maxwav, } } } /* agedc > 0 */ - } + } /* end if */ else if(s[m][i] !=9){ /* Standard case, age in fractional years but with the precision of a month */ agev[m][i]=(mint[m][i]/12.+1./24.+anint[m][i])-(moisnais[i]/12.+1./24.+annais[i]); @@ -6353,17 +7210,23 @@ int calandcheckages(int imx, int maxwav, } /*agev[m][i]=anint[m][i]-annais[i];*/ /* agev[m][i] = age[i]+2*m;*/ - } + } /* en if 9*/ else { /* =9 */ + /* printf("Debug num[%d]=%ld s[%d][%d]=%d\n",i,num[i], m,i, s[m][i]); */ agev[m][i]=1; s[m][i]=-1; } } - else /*= 0 Unknown */ + else if(s[m][i]==0) /*= 0 Unknown */ agev[m][i]=1; - } - + else{ + printf("Warning, num[%d]=%ld, s[%d][%d]=%d\n", i, num[i], m, i,s[m][i]); + fprintf(ficlog, "Warning, num[%d]=%ld, s[%d][%d]=%d\n", i, num[i], m, i,s[m][i]); + agev[m][i]=0; + } + } /* End for lastpass */ } + for (i=1; i<=imx; i++) { for(m=firstpass; (m<=lastpass); m++){ if (s[m][i] > (nlstate+ndeath)) { @@ -6661,6 +7524,78 @@ void syscompilerinfo(int logged) return 0; } + int back_prevalence_limit(double *p, double **bprlim, double ageminpar, double agemaxpar, double ftolpl, int *ncvyearp){ + /*--------------- Back Prevalence limit (period or stable prevalence) --------------*/ + int i, j, k, i1 ; + /* double ftolpl = 1.e-10; */ + double age, agebase, agelim; + double tot; + + strcpy(fileresplb,"PLB_"); + strcat(fileresplb,fileresu); + if((ficresplb=fopen(fileresplb,"w"))==NULL) { + printf("Problem with period (stable) back prevalence resultfile: %s\n", fileresplb);return 1; + fprintf(ficlog,"Problem with period (stable) back prevalence resultfile: %s\n", fileresplb);return 1; + } + printf("Computing period (stable) back prevalence: result on file '%s' \n", fileresplb); + fprintf(ficlog,"Computing period (stable) back prevalence: result on file '%s' \n", fileresplb); + pstamp(ficresplb); + fprintf(ficresplb,"# Period (stable) back prevalence. Precision given by ftolpl=%g \n", ftolpl); + fprintf(ficresplb,"#Age "); + for(i=1; i<=nlstate;i++) fprintf(ficresplb,"%d-%d ",i,i); + fprintf(ficresplb,"\n"); + + /* prlim=matrix(1,nlstate,1,nlstate);*/ /* back in main */ + + agebase=ageminpar; + agelim=agemaxpar; + + i1=pow(2,cptcoveff); + if (cptcovn < 1){i1=1;} + + for(cptcov=1,k=0;cptcov<=i1;cptcov++){ + /* for(cptcov=1,k=0;cptcov<=1;cptcov++){ */ + //for(cptcod=1;cptcod<=ncodemax[cptcov];cptcod++){ + k=k+1; + /* to clean */ + //printf("cptcov=%d cptcod=%d codtab=%d\n",cptcov, cptcod,codtabm(cptcod,cptcov)); + fprintf(ficresplb,"#******"); + printf("#******"); + fprintf(ficlog,"#******"); + for(j=1;j<=cptcoveff;j++) { + fprintf(ficresplb," V%d=%d ",Tvaraff[j],nbcode[Tvaraff[j]][codtabm(k,j)]); + printf(" V%d=%d ",Tvaraff[j],nbcode[Tvaraff[j]][codtabm(k,j)]); + fprintf(ficlog," V%d=%d ",Tvaraff[j],nbcode[Tvaraff[j]][codtabm(k,j)]); + } + fprintf(ficresplb,"******\n"); + printf("******\n"); + fprintf(ficlog,"******\n"); + + fprintf(ficresplb,"#Age "); + for(j=1;j<=cptcoveff;j++) { + fprintf(ficresplb,"V%d %d ",Tvaraff[j],nbcode[Tvaraff[j]][codtabm(k,j)]); + } + for(i=1; i<=nlstate;i++) fprintf(ficresplb," %d-%d ",i,i); + fprintf(ficresplb,"Total Years_to_converge\n"); + + for (age=agebase; age<=agelim; age++){ + /* for (age=agebase; age<=agebase; age++){ */ + bprevalim(bprlim, nlstate, p, age, oldm, savm, ftolpl, ncvyearp, k); + fprintf(ficresplb,"%.0f ",age ); + for(j=1;j<=cptcoveff;j++) + fprintf(ficresplb,"%d %d ",Tvaraff[j],nbcode[Tvaraff[j]][codtabm(k,j)]); + tot=0.; + for(i=1; i<=nlstate;i++){ + tot += bprlim[i][i]; + fprintf(ficresplb," %.5f", bprlim[i][i]); + } + fprintf(ficresplb," %.3f %d\n", tot, *ncvyearp); + } /* Age */ + /* was end of cptcod */ + } /* cptcov */ + return 0; +} + int hPijx(double *p, int bage, int fage){ /*------------- h Pij x at various ages ------------*/ @@ -6731,6 +7666,78 @@ int hPijx(double *p, int bage, int fage) return 0; } + int hBijx(double *p, int bage, int fage){ + /*------------- h Bij x at various ages ------------*/ + + int stepsize; + int agelim; + int hstepm; + int nhstepm; + int h, i, i1, j, k; + + double agedeb; + double ***p3mat; + + strcpy(filerespijb,"PIJB_"); strcat(filerespijb,fileresu); + if((ficrespijb=fopen(filerespijb,"w"))==NULL) { + printf("Problem with Pij back resultfile: %s\n", filerespijb); return 1; + fprintf(ficlog,"Problem with Pij back resultfile: %s\n", filerespijb); return 1; + } + printf("Computing pij back: result on file '%s' \n", filerespijb); + fprintf(ficlog,"Computing pij back: result on file '%s' \n", filerespijb); + + stepsize=(int) (stepm+YEARM-1)/YEARM; + /*if (stepm<=24) stepsize=2;*/ + + agelim=AGESUP; + hstepm=stepsize*YEARM; /* Every year of age */ + hstepm=hstepm/stepm; /* Typically 2 years, = 2/6 months = 4 */ + + /* hstepm=1; aff par mois*/ + pstamp(ficrespijb); + fprintf(ficrespijb,"#****** h Pij x Back Probability to be in state i at age x-h being in j at x "); + i1= pow(2,cptcoveff); + /* for(cptcov=1,k=0;cptcov<=i1;cptcov++){ */ + /* /\*for(cptcod=1;cptcod<=ncodemax[cptcov];cptcod++){*\/ */ + /* k=k+1; */ + for (k=1; k <= (int) pow(2,cptcoveff); k++){ + fprintf(ficrespijb,"\n#****** "); + for(j=1;j<=cptcoveff;j++) + fprintf(ficrespijb,"V%d=%d ",Tvaraff[j],nbcode[Tvaraff[j]][codtabm(k,j)]); + fprintf(ficrespijb,"******\n"); + + /* for (agedeb=fage; agedeb>=bage; agedeb--){ /\* If stepm=6 months *\/ */ + for (agedeb=bage; agedeb<=fage; agedeb++){ /* If stepm=6 months */ + nhstepm=(int) rint((agelim-agedeb)*YEARM/stepm); /* Typically 20 years = 20*12/6=40 */ + nhstepm = nhstepm/hstepm; /* Typically 40/4=10 */ + + /* nhstepm=nhstepm*YEARM; aff par mois*/ + + p3mat=ma3x(1,nlstate+ndeath,1, nlstate+ndeath, 0,nhstepm); + oldm=oldms;savm=savms; + hbxij(p3mat,nhstepm,agedeb,hstepm,p,nlstate,stepm,oldm,savm, k); + fprintf(ficrespijb,"# Cov Agex agex-h hpijx with i,j="); + for(i=1; i<=nlstate;i++) + for(j=1; j<=nlstate+ndeath;j++) + fprintf(ficrespijb," %1d-%1d",i,j); + fprintf(ficrespijb,"\n"); + for (h=0; h<=nhstepm; h++){ + /*agedebphstep = agedeb + h*hstepm/YEARM*stepm;*/ + fprintf(ficrespijb,"%d %3.f %3.f",k, agedeb, agedeb - h*hstepm/YEARM*stepm ); + /* fprintf(ficrespijb,"%d %3.f %3.f",k, agedeb, agedeb + h*hstepm/YEARM*stepm ); */ + for(i=1; i<=nlstate;i++) + for(j=1; j<=nlstate+ndeath;j++) + fprintf(ficrespijb," %.5f", p3mat[i][j][h]); + fprintf(ficrespijb,"\n"); + } + free_ma3x(p3mat,1,nlstate+ndeath,1, nlstate+ndeath, 0,nhstepm); + fprintf(ficrespijb,"\n"); + } + /*}*/ + } + return 0; +} + /***********************************************/ /**************** Main Program *****************/ @@ -6782,6 +7789,7 @@ int main(int argc, char *argv[]) int *tab; int mobilavproj=0 , prevfcast=0 ; /* moving average of prev, If prevfcast=1 prevalence projection */ + int backcast=0; int mobilav=0,popforecast=0; int hstepm=0, nhstepm=0; int agemortsup; @@ -6792,6 +7800,7 @@ int main(int argc, char *argv[]) double bage=0, fage=110., age, agelim=0., agebase=0.; double ftolpl=FTOL; double **prlim; + double **bprlim; double ***param; /* Matrix of parameters */ double *p; double **matcov; /* Matrix of covariance */ @@ -6803,6 +7812,8 @@ int main(int argc, char *argv[]) double *epj, vepp; double dateprev1, dateprev2,jproj1=1,mproj1=1,anproj1=2000,jproj2=1,mproj2=1,anproj2=2000; + double jback1=1,mback1=1,anback1=2000,jback2=1,mback2=1,anback2=2000; + double **ximort; char *alph[]={"a","a","b","c","d","e"}, str[4]="1234"; int *dcwave; @@ -7362,19 +8373,32 @@ Please run with mle=-1 to get a correct free_vector(annais,1,n); /* free_matrix(mint,1,maxwav,1,n); free_matrix(anint,1,maxwav,1,n);*/ - free_vector(moisdc,1,n); - free_vector(andc,1,n); + /* free_vector(moisdc,1,n); */ + /* free_vector(andc,1,n); */ /* */ wav=ivector(1,imx); - dh=imatrix(1,lastpass-firstpass+1,1,imx); - bh=imatrix(1,lastpass-firstpass+1,1,imx); - mw=imatrix(1,lastpass-firstpass+1,1,imx); + /* dh=imatrix(1,lastpass-firstpass+1,1,imx); */ + /* bh=imatrix(1,lastpass-firstpass+1,1,imx); */ + /* mw=imatrix(1,lastpass-firstpass+1,1,imx); */ + dh=imatrix(1,lastpass-firstpass+2,1,imx); /* We are adding a wave if status is unknown at last wave but death occurs after last wave.*/ + bh=imatrix(1,lastpass-firstpass+2,1,imx); + mw=imatrix(1,lastpass-firstpass+2,1,imx); /* Concatenates waves */ + /* Concatenates waves: wav[i] is the number of effective (useful waves) of individual i. + Death is a valid wave (if date is known). + mw[mi][i] is the number of (mi=1 to wav[i]) effective wave out of mi of individual i + dh[m][i] or dh[mw[mi][i]][i] is the delay between two effective waves m=mw[mi][i] + and mw[mi+1][i]. dh depends on stepm. + */ + concatwav(wav, dh, bh, mw, s, agedc, agev, firstpass, lastpass, imx, nlstate, stepm); /* */ + free_vector(moisdc,1,n); + free_vector(andc,1,n); + /* Routine tricode is to calculate cptcoveff (real number of unique covariates) and to associate covariable number and modality */ nbcode=imatrix(0,NCOVMAX,0,NCOVMAX); @@ -7382,13 +8406,20 @@ Please run with mle=-1 to get a correct Ndum =ivector(-1,NCOVMAX); if (ncovmodel-nagesqr > 2 ) /* That is if covariate other than cst, age and age*age */ tricode(Tvar,nbcode,imx, Ndum); /**< Fills nbcode[Tvar[j]][l]; */ - /* Nbcode gives the value of the lth modality of jth covariate, in + /* Nbcode gives the value of the lth modality (currently 1 to 2) of jth covariate, in V2+V1*age, there are 3 covariates Tvar[2]=1 (V1).*/ - /* 1 to ncodemax[j] is the maximum value of this jth covariate */ + /* 1 to ncodemax[j] which is the maximum value of this jth covariate */ /* codtab=imatrix(1,100,1,10);*/ /* codtab[h,k]=( (h-1) - mod(k-1,2**(k-1) )/2**(k-1) */ /*printf(" codtab[1,1],codtab[100,10]=%d,%d\n", codtab[1][1],codtabm(100,10));*/ /* codtab gives the value 1 or 2 of the hth combination of k covariates (1 or 2).*/ + /* nbcode[Tvaraff[j]][codtabm(h,j)]) : if there are only 2 modalities for a covariate j, + * codtabm(h,j) gives its value classified at position h and nbcode gives how it is coded + * (currently 0 or 1) in the data. + * In a loop on h=1 to 2**k, and a loop on j (=1 to k), we get the value of + * corresponding modality (h,j). + */ + h=0; @@ -7398,8 +8429,9 @@ Please run with mle=-1 to get a correct m=pow(2,cptcoveff); /**< codtab(h,k) k = codtab[h,k]=( (h-1) - mod(k-1,2**(k-1) )/2**(k-1) + 1 - * For k=4 covariates, h goes from 1 to 2**k - * codtabm(h,k)= 1 & (h-1) >> (k-1) ; + * For k=4 covariates, h goes from 1 to m=2**k + * codtabm(h,k)= (1 & (h-1) >> (k-1)) + 1; + * #define codtabm(h,k) (1 & (h-1) >> (k-1))+1 * h\k 1 2 3 4 *______________________________ * 1 i=1 1 i=1 1 i=1 1 i=1 1 @@ -7419,6 +8451,49 @@ Please run with mle=-1 to get a correct * 15 i=8 1 2 2 2 * 16 2 2 2 2 */ + /* How to do the opposite? From combination h (=1 to 2**k) how to get the value on the covariates? */ + /* from h=5 and m, we get then number of covariates k=log(m)/log(2)=4 + * and the value of each covariate? + * V1=1, V2=1, V3=2, V4=1 ? + * h-1=4 and 4 is 0100 or reverse 0010, and +1 is 1121 ok. + * h=6, 6-1=5, 5 is 0101, 1010, 2121, V1=2nd, V2=1st, V3=2nd, V4=1st. + * In order to get the real value in the data, we use nbcode + * nbcode[Tvar[3][2nd]]=1 and nbcode[Tvar[4][1]]=0 + * We are keeping this crazy system in order to be able (in the future?) + * to have more than 2 values (0 or 1) for a covariate. + * #define codtabm(h,k) (1 & (h-1) >> (k-1))+1 + * h=6, k=2? h-1=5=0101, reverse 1010, +1=2121, k=2nd position: value is 1: codtabm(6,2)=1 + * bbbbbbbb + * 76543210 + * h-1 00000101 (6-1=5) + *(h-1)>>(k-1)= 00000001 >> (2-1) = 1 right shift + * & + * 1 00000001 (1) + * 00000001 = 1 & ((h-1) >> (k-1)) + * +1= 00000010 =2 + * + * h=14, k=3 => h'=h-1=13, k'=k-1=2 + * h' 1101 =2^3+2^2+0x2^1+2^0 + * >>k' 11 + * & 00000001 + * = 00000001 + * +1 = 00000010=2 = codtabm(14,3) + * Reverse h=6 and m=16? + * cptcoveff=log(16)/log(2)=4 covariate: 6-1=5=0101 reversed=1010 +1=2121 =>V1=2, V2=1, V3=2, V4=1. + * for (j=1 to cptcoveff) Vj=decodtabm(j,h,cptcoveff) + * decodtabm(h,j,cptcoveff)= (((h-1) >> (j-1)) & 1) +1 + * decodtabm(h,j,cptcoveff)= (h <= (1<> (j-1)) & 1) +1 : -1) + * V3=decodtabm(14,3,2**4)=2 + * h'=13 1101 =2^3+2^2+0x2^1+2^0 + *(h-1) >> (j-1) 0011 =13 >> 2 + * &1 000000001 + * = 000000001 + * +1= 000000010 =2 + * 2211 + * V1=1+1, V2=0+1, V3=1+1, V4=1+1 + * V3=2 + */ + /* /\* for(h=1; h <=100 ;h++){ *\/ */ /* /\* printf("h=%2d ", h); *\/ */ /* /\* for(k=1; k <=10; k++){ *\/ */ @@ -7497,7 +8572,7 @@ Title=%s
            Datafile=%s Firstpass=%d La optionfilehtmcov,version,fullversion,title,datafile,firstpass,lastpass,stepm, weightopt, model); } - fprintf(fichtm,"\n\n\nIMaCh %s\n IMaCh for Interpolated Markov Chain
            \nSponsored by Copyright (C) 2002-2015 INED-EUROREVES-Institut de longévité-Japan Society for the Promotion of Sciences 日本学術振興会 (Grant-in-Aid for Scientific Research 25293121) - Intel Software 2015
            \ + fprintf(fichtm,"\n\n\nIMaCh %s\n IMaCh for Interpolated Markov Chain
            \nSponsored by Copyright (C) 2002-2015 INED-EUROREVES-Institut de longévité-2013-2016-Japan Society for the Promotion of Sciences 日本学術振興会 (Grant-in-Aid for Scientific Research 25293121) - Intel Software 2015-2018
            \
            \n\ IMaCh-%s
            %s
            \
            \n\ @@ -7527,7 +8602,8 @@ Title=%s
            Datafile=%s Firstpass=%d La /* Calculates basic frequencies. Computes observed prevalence at single age and prints on file fileres'p'. */ - freqsummary(fileres, agemin, agemax, s, agev, nlstate, imx,Tvaraff,nbcode, ncodemax,mint,anint,strstart); + freqsummary(fileres, agemin, agemax, s, agev, nlstate, imx,Tvaraff,nbcode, ncodemax,mint,anint,strstart,\ + firstpass, lastpass, stepm, weightopt, model); fprintf(fichtm,"\n"); fprintf(fichtm,"
            Total number of observations=%d
            \n\ @@ -7990,8 +9066,8 @@ Please run with mle=-1 to get a correct } fprintf(ficres,"# agemin agemax for life expectancy, bage fage (if mle==0 ie no data nor Max likelihood).\n"); - fprintf(ficres,"agemin=%.0f agemax=%.0f bage=%.0f fage=%.0f estepm=%d\n",ageminpar,agemaxpar,bage,fage, estepm); - fprintf(ficparo,"agemin=%.0f agemax=%.0f bage=%.0f fage=%.0f estepm=%d\n",ageminpar,agemaxpar,bage,fage, estepm); + fprintf(ficres,"agemin=%.0f agemax=%.0f bage=%.0f fage=%.0f estepm=%d ftolpl=%e\n",ageminpar,agemaxpar,bage,fage, estepm, ftolpl); + fprintf(ficparo,"agemin=%.0f agemax=%.0f bage=%.0f fage=%.0f estepm=%d, ftolpl=%e\n",ageminpar,agemaxpar,bage,fage, estepm, ftolpl); /* Other stuffs, more or less useful */ while((c=getc(ficpar))=='#' && c!= EOF){ @@ -8040,6 +9116,19 @@ Please run with mle=-1 to get a correct fprintf(ficres,"prevforecast=%d starting-proj-date=%.lf/%.lf/%.lf final-proj-date=%.lf/%.lf/%.lf mobil_average=%d\n",prevfcast,jproj1,mproj1,anproj1,jproj2,mproj2,anproj2,mobilavproj); /* day and month of proj2 are not used but only year anproj2.*/ + while((c=getc(ficpar))=='#' && c!= EOF){ + ungetc(c,ficpar); + fgets(line, MAXLINE, ficpar); + fputs(line,stdout); + fputs(line,ficparo); + } + ungetc(c,ficpar); + + fscanf(ficpar,"backcast=%d starting-back-date=%lf/%lf/%lf final-back-date=%lf/%lf/%lf mobil_average=%d\n",&backcast,&jback1,&mback1,&anback1,&jback2,&mback2,&anback2,&mobilavproj); + fscanf(ficparo,"backcast=%d starting-back-date=%lf/%lf/%lf final-back-date=%lf/%lf/%lf mobil_average=%d\n",&backcast,&jback1,&mback1,&anback1,&jback2,&mback2,&anback2,&mobilavproj); + fscanf(ficlog,"backcast=%d starting-back-date=%lf/%lf/%lf final-back-date=%lf/%lf/%lf mobil_average=%d\n",&backcast,&jback1,&mback1,&anback1,&jback2,&mback2,&anback2,&mobilavproj); + fscanf(ficres,"backcast=%d starting-back-date=%lf/%lf/%lf final-back-date=%lf/%lf/%lf mobil_average=%d\n",&backcast,&jback1,&mback1,&anback1,&jback2,&mback2,&anback2,&mobilavproj); + /* day and month of proj2 are not used but only year anproj2.*/ /* freqsummary(fileres, agemin, agemax, s, agev, nlstate, imx,Tvaraff,nbcode, ncodemax,mint,anint); */ @@ -8054,19 +9143,19 @@ Please run with mle=-1 to get a correct This is probably because your parameter file doesn't \n contain the exact number of lines (or columns) corresponding to your model line.\n\ Please run with mle=-1 to get a correct covariance matrix.\n",ageminpar,agemaxpar); }else - printinggnuplot(fileresu, optionfilefiname,ageminpar,agemaxpar,fage, pathc,p); + printinggnuplot(fileresu, optionfilefiname,ageminpar,agemaxpar,fage, prevfcast, pathc,p); printinghtml(fileresu,title,datafile, firstpass, lastpass, stepm, weightopt,\ - model,imx,jmin,jmax,jmean,rfileres,popforecast,estepm,\ - jprev1,mprev1,anprev1,jprev2,mprev2,anprev2); + model,imx,jmin,jmax,jmean,rfileres,popforecast,prevfcast,backcast, estepm, \ + jprev1,mprev1,anprev1,dateprev1,jprev2,mprev2,anprev2,dateprev2); /*------------ free_vector -------------*/ /* chdir(path); */ - free_ivector(wav,1,imx); - free_imatrix(dh,1,lastpass-firstpass+1,1,imx); - free_imatrix(bh,1,lastpass-firstpass+1,1,imx); - free_imatrix(mw,1,lastpass-firstpass+1,1,imx); + /* free_ivector(wav,1,imx); */ /* Moved after last prevalence call */ + /* free_imatrix(dh,1,lastpass-firstpass+2,1,imx); */ + /* free_imatrix(bh,1,lastpass-firstpass+2,1,imx); */ + /* free_imatrix(mw,1,lastpass-firstpass+2,1,imx); */ free_lvector(num,1,n); free_vector(agedc,1,n); /*free_matrix(covar,0,NCOVMAX,1,n);*/ @@ -8084,6 +9173,13 @@ Please run with mle=-1 to get a correct prevalence_limit(p, prlim, ageminpar, agemaxpar, ftolpl, &ncvyear); fclose(ficrespl); + /*--------------- Back Prevalence limit (period or stable prevalence) --------------*/ + /*#include "prevlim.h"*/ /* Use ficresplb, ficlog */ + bprlim=matrix(1,nlstate,1,nlstate); + back_prevalence_limit(p, bprlim, ageminpar, agemaxpar, ftolpl, &ncvyear); + fclose(ficresplb); + + #ifdef FREEEXIT2 #include "freeexit2.h" #endif @@ -8093,6 +9189,9 @@ Please run with mle=-1 to get a correct hPijx(p, bage, fage); fclose(ficrespij); + hBijx(p, bage, fage); + fclose(ficrespijb); + /*-------------- Variance of one-step probabilities---*/ k=1; varprob(optionfilefiname, matcov, p, delti, nlstate, bage, fage,k,Tvar,nbcode, ncodemax,strstart); @@ -8109,14 +9208,18 @@ Please run with mle=-1 to get a correct if(prevfcast==1){ /* if(stepm ==1){*/ prevforecast(fileresu, anproj1, mproj1, jproj1, agemin, agemax, dateprev1, dateprev2, mobilavproj, bage, fage, firstpass, lastpass, anproj2, p, cptcoveff); - /* (popforecast==1) populforecast(fileres, anpyram,mpyram,jpyram, agemin,agemax, dateprev1, dateprev2,mobilav, agedeb, fage, popforecast, popfile, anpyram1,p, i1);*/ - /* } */ - /* else{ */ - /* erreur=108; */ - /* printf("Warning %d!! You can only forecast the prevalences if the optimization\n has been performed with stepm = 1 (month) instead of %d or model=. instead of '%s'\n", erreur, stepm, model); */ - /* fprintf(ficlog,"Warning %d!! You can only forecast the prevalences if the optimization\n has been performed with stepm = 1 (month) instead of %d or model=. instead of '%s'\n", erreur, stepm, model); */ - /* } */ } + if(backcast==1){ + prevbackforecast(fileresu, anback1, mback1, jback1, agemin, agemax, dateprev1, dateprev2, mobilavproj, bage, fage, firstpass, lastpass, anback2, p, cptcoveff); + } + /* (popforecast==1) populforecast(fileres, anpyram,mpyram,jpyram, agemin,agemax, dateprev1, dateprev2,mobilav, agedeb, fage, popforecast, popfile, anpyram1,p, i1);*/ + /* } */ + /* else{ */ + /* erreur=108; */ + /* printf("Warning %d!! You can only forecast the prevalences if the optimization\n has been performed with stepm = 1 (month) instead of %d or model=. instead of '%s'\n", erreur, stepm, model); */ + /* fprintf(ficlog,"Warning %d!! You can only forecast the prevalences if the optimization\n has been performed with stepm = 1 (month) instead of %d or model=. instead of '%s'\n", erreur, stepm, model); */ + /* } */ + /* ------ Other prevalence ratios------------ */ @@ -8126,6 +9229,11 @@ Please run with mle=-1 to get a correct /* printf("ageminpar=%f, agemax=%f, s[lastpass][imx]=%d, agev[lastpass][imx]=%f, nlstate=%d, imx=%d, mint[lastpass][imx]=%f, anint[lastpass][imx]=%f,dateprev1=%f, dateprev2=%f, firstpass=%d, lastpass=%d\n",\ ageminpar, agemax, s[lastpass][imx], agev[lastpass][imx], nlstate, imx, mint[lastpass][imx],anint[lastpass][imx], dateprev1, dateprev2, firstpass, lastpass); */ + free_ivector(wav,1,imx); + free_imatrix(dh,1,lastpass-firstpass+2,1,imx); + free_imatrix(bh,1,lastpass-firstpass+2,1,imx); + free_imatrix(mw,1,lastpass-firstpass+2,1,imx); + if (mobilav!=0) { mobaverage= ma3x(1, AGESUP,1,NCOVMAX, 1,NCOVMAX); @@ -8385,8 +9493,8 @@ Please run with mle=-1 to get a correct if((nberr >0) || (nbwarn>0)){ - printf("End of Imach with %d errors and/or %d warnings\n",nberr,nbwarn); - fprintf(ficlog,"End of Imach with %d errors and/or warnings %d\n",nberr,nbwarn); + printf("End of Imach with %d errors and/or %d warnings. Please look at the log file for details.\n",nberr,nbwarn); + fprintf(ficlog,"End of Imach with %d errors and/or warnings %d. Please look at the log file for details.\n",nberr,nbwarn); }else{ printf("End of Imach\n"); fprintf(ficlog,"End of Imach\n");