*/
-/* #define _(String) gettext (String) */
+ Revision 1.270 2017/05/24 05:45:29 brouard
+ *** empty log message ***
-#define MAXLINE 256
+ Revision 1.269 2017/05/23 08:39:25 brouard
+ Summary: Code into subroutine, cleanings
-#define GNUPLOTPROGRAM "gnuplot"
-/*#define GNUPLOTPROGRAM "..\\gp37mgw\\wgnuplot"*/
-#define FILENAMELENGTH 132
+ Revision 1.268 2017/05/18 20:09:32 brouard
+ Summary: backprojection and confidence intervals of backprevalence
-#define GLOCK_ERROR_NOPATH -1 /* empty path */
-#define GLOCK_ERROR_GETCWD -2 /* cannot get cwd */
+ Revision 1.267 2017/05/13 10:25:05 brouard
+ Summary: temporary save for backprojection
-#define MAXPARM 30 /* Maximum number of parameters for the optimization */
-#define NPARMAX 64 /* (nlstate+ndeath-1)*nlstate*ncovmodel */
+ Revision 1.266 2017/05/13 07:26:12 brouard
+ Summary: Version 0.99r13 (improvements and bugs fixed)
-#define NINTERVMAX 8
-#define NLSTATEMAX 8 /* Maximum number of live states (for func) */
-#define NDEATHMAX 8 /* Maximum number of dead states (for func) */
-#define NCOVMAX 8 /* Maximum number of covariates */
-#define MAXN 20000
-#define YEARM 12. /* Number of months per year */
-#define AGESUP 130
-#define AGEBASE 40
-#define AGEGOMP 10. /* Minimal age for Gompertz adjustment */
-#ifdef UNIX
-#define DIRSEPARATOR '/'
-#define CHARSEPARATOR "/"
-#define ODIRSEPARATOR '\\'
-#else
-#define DIRSEPARATOR '\\'
-#define CHARSEPARATOR "\\"
-#define ODIRSEPARATOR '/'
-#endif
+ Revision 1.265 2017/04/26 16:22:11 brouard
+ Summary: imach 0.99r13 Some bugs fixed
-/* $Id: imach.c,v 1.127 2006/04/28 18:11:50 brouard Exp $ */
-/* $State: Exp $ */
+ Revision 1.264 2017/04/26 06:01:29 brouard
+ Summary: Labels in graphs
-char version[]="Imach version 0.98h, April 2006, INED-EUROREVES-Institut de longevite ";
-char fullversion[]="$Revision: 1.127 $ $Date: 2006/04/28 18:11:50 $";
-char strstart[80];
-char optionfilext[10], optionfilefiname[FILENAMELENGTH];
-int erreur, nberr=0, nbwarn=0; /* Error number, number of errors number of warnings */
-int nvar;
-int cptcovn=0, cptcovage=0, cptcoveff=0,cptcov;
-int npar=NPARMAX;
-int nlstate=2; /* Number of live states */
-int ndeath=1; /* Number of dead states */
-int ncovmodel, ncovcol; /* Total number of covariables including constant a12*1 +b12*x ncovmodel=2 */
-int popbased=0;
+ Revision 1.263 2017/04/24 15:23:15 brouard
+ Summary: to save
-int *wav; /* Number of waves for this individuual 0 is possible */
-int maxwav; /* Maxim number of waves */
-int jmin, jmax; /* min, max spacing between 2 waves */
-int ijmin, ijmax; /* Individuals having jmin and jmax */
-int gipmx, gsw; /* Global variables on the number of contributions
- to the likelihood and the sum of weights (done by funcone)*/
-int mle, weightopt;
-int **mw; /* mw[mi][i] is number of the mi wave for this individual */
-int **dh; /* dh[mi][i] is number of steps between mi,mi+1 for this individual */
-int **bh; /* bh[mi][i] is the bias (+ or -) for this individual if the delay between
- * wave mi and wave mi+1 is not an exact multiple of stepm. */
-double jmean; /* Mean space between 2 waves */
-double **oldm, **newm, **savm; /* Working pointers to matrices */
-double **oldms, **newms, **savms; /* Fixed working pointers to matrices */
-FILE *fic,*ficpar, *ficparo,*ficres, *ficresp, *ficrespl, *ficrespij, *ficrest,*ficresf,*ficrespop;
-FILE *ficlog, *ficrespow;
-int globpr; /* Global variable for printing or not */
-double fretone; /* Only one call to likelihood */
-long ipmx; /* Number of contributions */
-double sw; /* Sum of weights */
-char filerespow[FILENAMELENGTH];
-char fileresilk[FILENAMELENGTH]; /* File of individual contributions to the likelihood */
-FILE *ficresilk;
-FILE *ficgp,*ficresprob,*ficpop, *ficresprobcov, *ficresprobcor;
-FILE *ficresprobmorprev;
-FILE *fichtm, *fichtmcov; /* Html File */
-FILE *ficreseij;
-char filerese[FILENAMELENGTH];
-FILE *ficresstdeij;
-char fileresstde[FILENAMELENGTH];
-FILE *ficrescveij;
-char filerescve[FILENAMELENGTH];
-FILE *ficresvij;
-char fileresv[FILENAMELENGTH];
-FILE *ficresvpl;
-char fileresvpl[FILENAMELENGTH];
-char title[MAXLINE];
-char optionfile[FILENAMELENGTH], datafile[FILENAMELENGTH], filerespl[FILENAMELENGTH];
-char plotcmd[FILENAMELENGTH], pplotcmd[FILENAMELENGTH];
-char tmpout[FILENAMELENGTH], tmpout2[FILENAMELENGTH];
-char command[FILENAMELENGTH];
-int outcmd=0;
+ Revision 1.262 2017/04/18 16:48:12 brouard
+ *** empty log message ***
-char fileres[FILENAMELENGTH], filerespij[FILENAMELENGTH], filereso[FILENAMELENGTH], rfileres[FILENAMELENGTH];
+ Revision 1.261 2017/04/05 10:14:09 brouard
+ Summary: Bug in E_ as well as in T_ fixed nres-1 vs k1-1
-char filelog[FILENAMELENGTH]; /* Log file */
-char filerest[FILENAMELENGTH];
-char fileregp[FILENAMELENGTH];
-char popfile[FILENAMELENGTH];
+ Revision 1.260 2017/04/04 17:46:59 brouard
+ Summary: Gnuplot indexations fixed (humm)
-char optionfilegnuplot[FILENAMELENGTH], optionfilehtm[FILENAMELENGTH], optionfilehtmcov[FILENAMELENGTH] ;
+ Revision 1.259 2017/04/04 13:01:16 brouard
+ Summary: Some errors to warnings only if date of death is unknown but status is death we could set to pi3
-struct timeval start_time, end_time, curr_time, last_time, forecast_time;
-struct timezone tzp;
-extern int gettimeofday();
-struct tm tmg, tm, tmf, *gmtime(), *localtime();
-long time_value;
-extern long time();
-char strcurr[80], strfor[80];
+ Revision 1.258 2017/04/03 10:17:47 brouard
+ Summary: Version 0.99r12
-char *endptr;
-long lval;
-double dval;
+ Some cleanings, conformed with updated documentation.
-#define NR_END 1
-#define FREE_ARG char*
-#define FTOL 1.0e-10
+ Revision 1.257 2017/03/29 16:53:30 brouard
+ Summary: Temp
-#define NRANSI
-#define ITMAX 200
+ Revision 1.256 2017/03/27 05:50:23 brouard
+ Summary: Temporary
-#define TOL 2.0e-4
+ Revision 1.255 2017/03/08 16:02:28 brouard
+ Summary: IMaCh version 0.99r10 bugs in gnuplot fixed
-#define CGOLD 0.3819660
-#define ZEPS 1.0e-10
-#define SHFT(a,b,c,d) (a)=(b);(b)=(c);(c)=(d);
+ Revision 1.254 2017/03/08 07:13:00 brouard
+ Summary: Fixing data parameter line
-#define GOLD 1.618034
-#define GLIMIT 100.0
-#define TINY 1.0e-20
+ Revision 1.253 2016/12/15 11:59:41 brouard
+ Summary: 0.99 in progress
-static double maxarg1,maxarg2;
-#define FMAX(a,b) (maxarg1=(a),maxarg2=(b),(maxarg1)>(maxarg2)? (maxarg1):(maxarg2))
-#define FMIN(a,b) (maxarg1=(a),maxarg2=(b),(maxarg1)<(maxarg2)? (maxarg1):(maxarg2))
-
-#define SIGN(a,b) ((b)>0.0 ? fabs(a) : -fabs(a))
-#define rint(a) floor(a+0.5)
+ Revision 1.252 2016/09/15 21:15:37 brouard
+ *** empty log message ***
-static double sqrarg;
-#define SQR(a) ((sqrarg=(a)) == 0.0 ? 0.0 :sqrarg*sqrarg)
-#define SWAP(a,b) {temp=(a);(a)=(b);(b)=temp;}
-int agegomp= AGEGOMP;
+ Revision 1.251 2016/09/15 15:01:13 brouard
+ Summary: not working
-int imx;
-int stepm=1;
-/* Stepm, step in month: minimum step interpolation*/
+ Revision 1.250 2016/09/08 16:07:27 brouard
+ Summary: continue
-int estepm;
-/* Estepm, step in month to interpolate survival function in order to approximate Life Expectancy*/
+ Revision 1.249 2016/09/07 17:14:18 brouard
+ Summary: Starting values from frequencies
-int m,nb;
-long *num;
-int firstpass=0, lastpass=4,*cod, *ncodemax, *Tage,*cens;
-double **agev,*moisnais, *annais, *moisdc, *andc,**mint, **anint;
-double **pmmij, ***probs;
-double *ageexmed,*agecens;
-double dateintmean=0;
+ Revision 1.248 2016/09/07 14:10:18 brouard
+ *** empty log message ***
-double *weight;
-int **s; /* Status */
-double *agedc, **covar, idx;
-int **nbcode, *Tcode, *Tvar, **codtab, **Tvard, *Tprod, cptcovprod, *Tvaraff;
-double *lsurv, *lpop, *tpop;
+ Revision 1.247 2016/09/02 11:11:21 brouard
+ *** empty log message ***
-double ftol=FTOL; /* Tolerance for computing Max Likelihood */
-double ftolhess; /* Tolerance for computing hessian */
+ Revision 1.246 2016/09/02 08:49:22 brouard
+ *** empty log message ***
-/**************** split *************************/
-static int split( char *path, char *dirc, char *name, char *ext, char *finame )
-{
- /* From a file name with (full) path (either Unix or Windows) we extract the directory (dirc)
- the name of the file (name), its extension only (ext) and its first part of the name (finame)
- */
- char *ss; /* pointer */
- int l1, l2; /* length counters */
+ Revision 1.245 2016/09/02 07:25:01 brouard
+ *** empty log message ***
- l1 = strlen(path ); /* length of path */
- if ( l1 == 0 ) return( GLOCK_ERROR_NOPATH );
- ss= strrchr( path, DIRSEPARATOR ); /* find last / */
- if ( ss == NULL ) { /* no directory, so determine current directory */
- strcpy( name, path ); /* we got the fullname name because no directory */
- /*if(strrchr(path, ODIRSEPARATOR )==NULL)
- printf("Warning you should use %s as a separator\n",DIRSEPARATOR);*/
- /* get current working directory */
- /* extern char* getcwd ( char *buf , int len);*/
- if ( getcwd( dirc, FILENAME_MAX ) == NULL ) {
- return( GLOCK_ERROR_GETCWD );
- }
- /* got dirc from getcwd*/
- printf(" DIRC = %s \n",dirc);
- } else { /* strip direcotry from path */
- ss++; /* after this, the filename */
- l2 = strlen( ss ); /* length of filename */
- if ( l2 == 0 ) return( GLOCK_ERROR_NOPATH );
- strcpy( name, ss ); /* save file name */
- strncpy( dirc, path, l1 - l2 ); /* now the directory */
- dirc[l1-l2] = 0; /* add zero */
- printf(" DIRC2 = %s \n",dirc);
- }
- /* We add a separator at the end of dirc if not exists */
- l1 = strlen( dirc ); /* length of directory */
- if( dirc[l1-1] != DIRSEPARATOR ){
- dirc[l1] = DIRSEPARATOR;
- dirc[l1+1] = 0;
- printf(" DIRC3 = %s \n",dirc);
- }
- ss = strrchr( name, '.' ); /* find last / */
- if (ss >0){
- ss++;
- strcpy(ext,ss); /* save extension */
- l1= strlen( name);
- l2= strlen(ss)+1;
- strncpy( finame, name, l1-l2);
- finame[l1-l2]= 0;
- }
+ Revision 1.244 2016/09/02 07:17:34 brouard
+ *** empty log message ***
- return( 0 ); /* we're done */
-}
+ Revision 1.243 2016/09/02 06:45:35 brouard
+ *** empty log message ***
+ Revision 1.242 2016/08/30 15:01:20 brouard
+ Summary: Fixing a lots
-/******************************************/
+ Revision 1.241 2016/08/29 17:17:25 brouard
+ Summary: gnuplot problem in Back projection to fix
-void replace_back_to_slash(char *s, char*t)
-{
- int i;
- int lg=0;
- i=0;
- lg=strlen(t);
- for(i=0; i<= lg; i++) {
- (s[i] = t[i]);
- if (t[i]== '\\') s[i]='/';
- }
-}
+ Revision 1.240 2016/08/29 07:53:18 brouard
+ Summary: Better
-int nbocc(char *s, char occ)
-{
- int i,j=0;
- int lg=20;
- i=0;
- lg=strlen(s);
- for(i=0; i<= lg; i++) {
- if (s[i] == occ ) j++;
- }
- return j;
-}
+ Revision 1.239 2016/08/26 15:51:03 brouard
+ Summary: Improvement in Powell output in order to copy and paste
-void cutv(char *u,char *v, char*t, char occ)
-{
- /* cuts string t into u and v where u ends before first occurence of char 'occ'
- and v starts after first occurence of char 'occ' : ex cutv(u,v,"abcdef2ghi2j",'2')
- gives u="abcedf" and v="ghi2j" */
- int i,lg,j,p=0;
- i=0;
- for(j=0; j<=strlen(t)-1; j++) {
- if((t[j]!= occ) && (t[j+1]== occ)) p=j+1;
- }
+ Author:
- lg=strlen(t);
- for(j=0; j=(p+1))(v[j-p-1] = t[j]);
- }
-}
+ Revision 1.237 2016/08/26 09:20:19 brouard
+ Summary: to valgrind
-/********************** nrerror ********************/
+ Revision 1.236 2016/08/25 10:50:18 brouard
+ *** empty log message ***
-void nrerror(char error_text[])
-{
- fprintf(stderr,"ERREUR ...\n");
- fprintf(stderr,"%s\n",error_text);
- exit(EXIT_FAILURE);
-}
-/*********************** vector *******************/
-double *vector(int nl, int nh)
-{
- double *v;
- v=(double *) malloc((size_t)((nh-nl+1+NR_END)*sizeof(double)));
- if (!v) nrerror("allocation failure in vector");
- return v-nl+NR_END;
-}
+ Revision 1.235 2016/08/25 06:59:23 brouard
+ *** empty log message ***
-/************************ free vector ******************/
-void free_vector(double*v, int nl, int nh)
-{
- free((FREE_ARG)(v+nl-NR_END));
-}
+ Revision 1.234 2016/08/23 16:51:20 brouard
+ *** empty log message ***
-/************************ivector *******************************/
-int *ivector(long nl,long nh)
-{
- int *v;
- v=(int *) malloc((size_t)((nh-nl+1+NR_END)*sizeof(int)));
- if (!v) nrerror("allocation failure in ivector");
- return v-nl+NR_END;
-}
+ Revision 1.233 2016/08/23 07:40:50 brouard
+ Summary: not working
-/******************free ivector **************************/
-void free_ivector(int *v, long nl, long nh)
-{
- free((FREE_ARG)(v+nl-NR_END));
-}
+ Revision 1.232 2016/08/22 14:20:21 brouard
+ Summary: not working
-/************************lvector *******************************/
-long *lvector(long nl,long nh)
-{
- long *v;
- v=(long *) malloc((size_t)((nh-nl+1+NR_END)*sizeof(long)));
- if (!v) nrerror("allocation failure in ivector");
- return v-nl+NR_END;
-}
+ Revision 1.231 2016/08/22 07:17:15 brouard
+ Summary: not working
-/******************free lvector **************************/
-void free_lvector(long *v, long nl, long nh)
-{
- free((FREE_ARG)(v+nl-NR_END));
-}
+ Revision 1.230 2016/08/22 06:55:53 brouard
+ Summary: Not working
-/******************* imatrix *******************************/
-int **imatrix(long nrl, long nrh, long ncl, long nch)
- /* allocate a int matrix with subscript range m[nrl..nrh][ncl..nch] */
-{
- long i, nrow=nrh-nrl+1,ncol=nch-ncl+1;
- int **m;
-
- /* allocate pointers to rows */
- m=(int **) malloc((size_t)((nrow+NR_END)*sizeof(int*)));
- if (!m) nrerror("allocation failure 1 in matrix()");
- m += NR_END;
- m -= nrl;
-
-
- /* allocate rows and set pointers to them */
- m[nrl]=(int *) malloc((size_t)((nrow*ncol+NR_END)*sizeof(int)));
- if (!m[nrl]) nrerror("allocation failure 2 in matrix()");
- m[nrl] += NR_END;
- m[nrl] -= ncl;
-
- for(i=nrl+1;i<=nrh;i++) m[i]=m[i-1]+ncol;
-
- /* return pointer to array of pointers to rows */
- return m;
-}
+ Revision 1.229 2016/07/23 09:45:53 brouard
+ Summary: Completing for func too
-/****************** free_imatrix *************************/
-void free_imatrix(m,nrl,nrh,ncl,nch)
- int **m;
- long nch,ncl,nrh,nrl;
- /* free an int matrix allocated by imatrix() */
-{
- free((FREE_ARG) (m[nrl]+ncl-NR_END));
- free((FREE_ARG) (m+nrl-NR_END));
-}
+ Revision 1.228 2016/07/22 17:45:30 brouard
+ Summary: Fixing some arrays, still debugging
-/******************* matrix *******************************/
-double **matrix(long nrl, long nrh, long ncl, long nch)
-{
- long i, nrow=nrh-nrl+1, ncol=nch-ncl+1;
- double **m;
+ Revision 1.226 2016/07/12 18:42:34 brouard
+ Summary: temp
- m=(double **) malloc((size_t)((nrow+NR_END)*sizeof(double*)));
- if (!m) nrerror("allocation failure 1 in matrix()");
- m += NR_END;
- m -= nrl;
+ Revision 1.225 2016/07/12 08:40:03 brouard
+ Summary: saving but not running
- m[nrl]=(double *) malloc((size_t)((nrow*ncol+NR_END)*sizeof(double)));
- if (!m[nrl]) nrerror("allocation failure 2 in matrix()");
- m[nrl] += NR_END;
- m[nrl] -= ncl;
+ Revision 1.224 2016/07/01 13:16:01 brouard
+ Summary: Fixes
- for (i=nrl+1; i<=nrh; i++) m[i]=m[i-1]+ncol;
- return m;
- /* print *(*(m+1)+70) or print m[1][70]; print m+1 or print &(m[1])
- */
-}
+ Revision 1.223 2016/02/19 09:23:35 brouard
+ Summary: temporary
-/*************************free matrix ************************/
-void free_matrix(double **m, long nrl, long nrh, long ncl, long nch)
-{
- free((FREE_ARG)(m[nrl]+ncl-NR_END));
- free((FREE_ARG)(m+nrl-NR_END));
-}
+ Revision 1.222 2016/02/17 08:14:50 brouard
+ Summary: Probably last 0.98 stable version 0.98r6
-/******************* ma3x *******************************/
-double ***ma3x(long nrl, long nrh, long ncl, long nch, long nll, long nlh)
-{
- long i, j, nrow=nrh-nrl+1, ncol=nch-ncl+1, nlay=nlh-nll+1;
- double ***m;
+ Revision 1.221 2016/02/15 23:35:36 brouard
+ Summary: minor bug
- m=(double ***) malloc((size_t)((nrow+NR_END)*sizeof(double*)));
- if (!m) nrerror("allocation failure 1 in matrix()");
- m += NR_END;
- m -= nrl;
+ Revision 1.219 2016/02/15 00:48:12 brouard
+ *** empty log message ***
- m[nrl]=(double **) malloc((size_t)((nrow*ncol+NR_END)*sizeof(double)));
- if (!m[nrl]) nrerror("allocation failure 2 in matrix()");
- m[nrl] += NR_END;
- m[nrl] -= ncl;
+ Revision 1.218 2016/02/12 11:29:23 brouard
+ Summary: 0.99 Back projections
- for (i=nrl+1; i<=nrh; i++) m[i]=m[i-1]+ncol;
+ Revision 1.217 2015/12/23 17:18:31 brouard
+ Summary: Experimental backcast
- m[nrl][ncl]=(double *) malloc((size_t)((nrow*ncol*nlay+NR_END)*sizeof(double)));
- if (!m[nrl][ncl]) nrerror("allocation failure 3 in matrix()");
- m[nrl][ncl] += NR_END;
- m[nrl][ncl] -= nll;
- for (j=ncl+1; j<=nch; j++)
- m[nrl][j]=m[nrl][j-1]+nlay;
-
- for (i=nrl+1; i<=nrh; i++) {
- m[i][ncl]=m[i-1l][ncl]+ncol*nlay;
- for (j=ncl+1; j<=nch; j++)
- m[i][j]=m[i][j-1]+nlay;
- }
- return m;
- /* gdb: p *(m+1) <=> p m[1] and p (m+1) <=> p (m+1) <=> p &(m[1])
- &(m[i][j][k]) <=> *((*(m+i) + j)+k)
- */
-}
+ Revision 1.216 2015/12/18 17:32:11 brouard
+ Summary: 0.98r4 Warning and status=-2
-/*************************free ma3x ************************/
-void free_ma3x(double ***m, long nrl, long nrh, long ncl, long nch,long nll, long nlh)
-{
- free((FREE_ARG)(m[nrl][ncl]+ nll-NR_END));
- free((FREE_ARG)(m[nrl]+ncl-NR_END));
- free((FREE_ARG)(m+nrl-NR_END));
-}
+ 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.
-/*************** function subdirf ***********/
-char *subdirf(char fileres[])
-{
- /* Caution optionfilefiname is hidden */
- strcpy(tmpout,optionfilefiname);
- strcat(tmpout,"/"); /* Add to the right */
- strcat(tmpout,fileres);
- return tmpout;
-}
+ Revision 1.215 2015/12/16 08:52:24 brouard
+ Summary: 0.98r4 working
-/*************** function subdirf2 ***********/
-char *subdirf2(char fileres[], char *preop)
-{
-
- /* Caution optionfilefiname is hidden */
- strcpy(tmpout,optionfilefiname);
- strcat(tmpout,"/");
- strcat(tmpout,preop);
- strcat(tmpout,fileres);
- return tmpout;
-}
+ Revision 1.214 2015/12/16 06:57:54 brouard
+ Summary: temporary not working
-/*************** function subdirf3 ***********/
-char *subdirf3(char fileres[], char *preop, char *preop2)
-{
-
- /* Caution optionfilefiname is hidden */
- strcpy(tmpout,optionfilefiname);
- strcat(tmpout,"/");
- strcat(tmpout,preop);
- strcat(tmpout,preop2);
- strcat(tmpout,fileres);
- return tmpout;
-}
+ Revision 1.213 2015/12/11 18:22:17 brouard
+ Summary: 0.98r4
-/***************** f1dim *************************/
-extern int ncom;
-extern double *pcom,*xicom;
-extern double (*nrfunc)(double []);
-
-double f1dim(double x)
-{
- int j;
- double f;
- double *xt;
-
- xt=vector(1,ncom);
- for (j=1;j<=ncom;j++) xt[j]=pcom[j]+x*xicom[j];
- f=(*nrfunc)(xt);
- free_vector(xt,1,ncom);
- return f;
-}
+ Revision 1.212 2015/11/21 12:47:24 brouard
+ Summary: minor typo
-/*****************brent *************************/
-double brent(double ax, double bx, double cx, double (*f)(double), double tol, double *xmin)
-{
- int iter;
- double a,b,d,etemp;
- double fu,fv,fw,fx;
- double ftemp;
- double p,q,r,tol1,tol2,u,v,w,x,xm;
- double e=0.0;
-
- a=(ax < cx ? ax : cx);
- b=(ax > cx ? ax : cx);
- x=w=v=bx;
- fw=fv=fx=(*f)(x);
- for (iter=1;iter<=ITMAX;iter++) {
- xm=0.5*(a+b);
- tol2=2.0*(tol1=tol*fabs(x)+ZEPS);
- /* if (2.0*fabs(fp-(*fret)) <= ftol*(fabs(fp)+fabs(*fret)))*/
- printf(".");fflush(stdout);
- fprintf(ficlog,".");fflush(ficlog);
-#ifdef DEBUG
- printf("br %d,x=%.10e xm=%.10e b=%.10e a=%.10e tol=%.10e tol1=%.10e tol2=%.10e x-xm=%.10e fx=%.12e fu=%.12e,fw=%.12e,ftemp=%.12e,ftol=%.12e\n",iter,x,xm,b,a,tol,tol1,tol2,(x-xm),fx,fu,fw,ftemp,ftol);
- fprintf(ficlog,"br %d,x=%.10e xm=%.10e b=%.10e a=%.10e tol=%.10e tol1=%.10e tol2=%.10e x-xm=%.10e fx=%.12e fu=%.12e,fw=%.12e,ftemp=%.12e,ftol=%.12e\n",iter,x,xm,b,a,tol,tol1,tol2,(x-xm),fx,fu,fw,ftemp,ftol);
- /* if ((fabs(x-xm) <= (tol2-0.5*(b-a)))||(2.0*fabs(fu-ftemp) <= ftol*1.e-2*(fabs(fu)+fabs(ftemp)))) { */
-#endif
- if (fabs(x-xm) <= (tol2-0.5*(b-a))){
- *xmin=x;
- return fx;
- }
- ftemp=fu;
- if (fabs(e) > tol1) {
- r=(x-w)*(fx-fv);
- q=(x-v)*(fx-fw);
- p=(x-v)*q-(x-w)*r;
- q=2.0*(q-r);
- if (q > 0.0) p = -p;
- q=fabs(q);
- etemp=e;
- e=d;
- if (fabs(p) >= fabs(0.5*q*etemp) || p <= q*(a-x) || p >= q*(b-x))
- d=CGOLD*(e=(x >= xm ? a-x : b-x));
- else {
- d=p/q;
- u=x+d;
- if (u-a < tol2 || b-u < tol2)
- d=SIGN(tol1,xm-x);
- }
- } else {
- d=CGOLD*(e=(x >= xm ? a-x : b-x));
- }
- u=(fabs(d) >= tol1 ? x+d : x+SIGN(tol1,d));
- fu=(*f)(u);
- if (fu <= fx) {
- if (u >= x) a=x; else b=x;
- SHFT(v,w,x,u)
- SHFT(fv,fw,fx,fu)
- } else {
- if (u < x) a=u; else b=u;
- if (fu <= fw || w == x) {
- v=w;
- w=u;
- fv=fw;
- fw=fu;
- } else if (fu <= fv || v == x || v == w) {
- v=u;
- fv=fu;
- }
- }
- }
- nrerror("Too many iterations in brent");
- *xmin=x;
- return fx;
-}
+ Revision 1.211 2015/11/21 12:41:11 brouard
+ Summary: 0.98r3 with some graph of projected cross-sectional
-/****************** mnbrak ***********************/
+ Author: Nicolas Brouard
-void mnbrak(double *ax, double *bx, double *cx, double *fa, double *fb, double *fc,
- double (*func)(double))
-{
- double ulim,u,r,q, dum;
- double fu;
-
- *fa=(*func)(*ax);
- *fb=(*func)(*bx);
- if (*fb > *fa) {
- SHFT(dum,*ax,*bx,dum)
- SHFT(dum,*fb,*fa,dum)
- }
- *cx=(*bx)+GOLD*(*bx-*ax);
- *fc=(*func)(*cx);
- while (*fb > *fc) {
- r=(*bx-*ax)*(*fb-*fc);
- q=(*bx-*cx)*(*fb-*fa);
- u=(*bx)-((*bx-*cx)*q-(*bx-*ax)*r)/
- (2.0*SIGN(FMAX(fabs(q-r),TINY),q-r));
- ulim=(*bx)+GLIMIT*(*cx-*bx);
- if ((*bx-u)*(u-*cx) > 0.0) {
- fu=(*func)(u);
- } else if ((*cx-u)*(u-ulim) > 0.0) {
- fu=(*func)(u);
- if (fu < *fc) {
- SHFT(*bx,*cx,u,*cx+GOLD*(*cx-*bx))
- SHFT(*fb,*fc,fu,(*func)(u))
- }
- } else if ((u-ulim)*(ulim-*cx) >= 0.0) {
- u=ulim;
- fu=(*func)(u);
- } else {
- u=(*cx)+GOLD*(*cx-*bx);
- fu=(*func)(u);
- }
- SHFT(*ax,*bx,*cx,u)
- SHFT(*fa,*fb,*fc,fu)
- }
-}
+ Revision 1.210 2015/11/18 17:41:20 brouard
+ Summary: Start working on projected prevalences Revision 1.209 2015/11/17 22:12:03 brouard
+ Summary: Adding ftolpl parameter
+ Author: N Brouard
-/*************** linmin ************************/
+ We had difficulties to get smoothed confidence intervals. It was due
+ to the period prevalence which wasn't computed accurately. The inner
+ parameter ftolpl is now an outer parameter of the .imach parameter
+ file after estepm. If ftolpl is small 1.e-4 and estepm too,
+ computation are long.
-int ncom;
-double *pcom,*xicom;
-double (*nrfunc)(double []);
-
-void linmin(double p[], double xi[], int n, double *fret,double (*func)(double []))
-{
- double brent(double ax, double bx, double cx,
- double (*f)(double), double tol, double *xmin);
- double f1dim(double x);
- void mnbrak(double *ax, double *bx, double *cx, double *fa, double *fb,
- double *fc, double (*func)(double));
- int j;
- double xx,xmin,bx,ax;
- double fx,fb,fa;
-
- ncom=n;
- pcom=vector(1,n);
- xicom=vector(1,n);
- nrfunc=func;
- for (j=1;j<=n;j++) {
- pcom[j]=p[j];
- xicom[j]=xi[j];
- }
- ax=0.0;
- xx=1.0;
- mnbrak(&ax,&xx,&bx,&fa,&fx,&fb,f1dim);
- *fret=brent(ax,xx,bx,f1dim,TOL,&xmin);
-#ifdef DEBUG
- printf("retour brent fret=%.12e xmin=%.12e\n",*fret,xmin);
- fprintf(ficlog,"retour brent fret=%.12e xmin=%.12e\n",*fret,xmin);
-#endif
- for (j=1;j<=n;j++) {
- xi[j] *= xmin;
- p[j] += xi[j];
- }
- free_vector(xicom,1,n);
- free_vector(pcom,1,n);
-}
+ Revision 1.208 2015/11/17 14:31:57 brouard
+ Summary: temporary
-char *asc_diff_time(long time_sec, char ascdiff[])
-{
- long sec_left, days, hours, minutes;
- days = (time_sec) / (60*60*24);
- sec_left = (time_sec) % (60*60*24);
- hours = (sec_left) / (60*60) ;
- sec_left = (sec_left) %(60*60);
- minutes = (sec_left) /60;
- sec_left = (sec_left) % (60);
- sprintf(ascdiff,"%d day(s) %d hour(s) %d minute(s) %d second(s)",days, hours, minutes, sec_left);
- return ascdiff;
-}
+ Revision 1.207 2015/10/27 17:36:57 brouard
+ *** empty log message ***
-/*************** powell ************************/
-void powell(double p[], double **xi, int n, double ftol, int *iter, double *fret,
- double (*func)(double []))
-{
- void linmin(double p[], double xi[], int n, double *fret,
- double (*func)(double []));
- int i,ibig,j;
- double del,t,*pt,*ptt,*xit;
- double fp,fptt;
- double *xits;
- int niterf, itmp;
+ Revision 1.206 2015/10/24 07:14:11 brouard
+ *** empty log message ***
- pt=vector(1,n);
- ptt=vector(1,n);
- xit=vector(1,n);
- xits=vector(1,n);
- *fret=(*func)(p);
- for (j=1;j<=n;j++) pt[j]=p[j];
- for (*iter=1;;++(*iter)) {
- fp=(*fret);
- ibig=0;
- del=0.0;
- last_time=curr_time;
- (void) gettimeofday(&curr_time,&tzp);
- printf("\nPowell iter=%d -2*LL=%.12f %ld sec. %ld sec.",*iter,*fret, curr_time.tv_sec-last_time.tv_sec, curr_time.tv_sec-start_time.tv_sec);fflush(stdout);
- fprintf(ficlog,"\nPowell iter=%d -2*LL=%.12f %ld sec. %ld sec.",*iter,*fret, curr_time.tv_sec-last_time.tv_sec, curr_time.tv_sec-start_time.tv_sec); fflush(ficlog);
-/* fprintf(ficrespow,"%d %.12f %ld",*iter,*fret,curr_time.tv_sec-start_time.tv_sec); */
- for (i=1;i<=n;i++) {
- printf(" %d %.12f",i, p[i]);
- fprintf(ficlog," %d %.12lf",i, p[i]);
- fprintf(ficrespow," %.12lf", p[i]);
- }
- printf("\n");
- fprintf(ficlog,"\n");
- fprintf(ficrespow,"\n");fflush(ficrespow);
- if(*iter <=3){
- tm = *localtime(&curr_time.tv_sec);
- strcpy(strcurr,asctime(&tm));
-/* asctime_r(&tm,strcurr); */
- forecast_time=curr_time;
- itmp = strlen(strcurr);
- if(strcurr[itmp-1]=='\n') /* Windows outputs with a new line */
- strcurr[itmp-1]='\0';
- printf("\nConsidering the time needed for this last iteration #%d: %ld seconds,\n",*iter,curr_time.tv_sec-last_time.tv_sec);
- fprintf(ficlog,"\nConsidering the time needed for this last iteration #%d: %ld seconds,\n",*iter,curr_time.tv_sec-last_time.tv_sec);
- for(niterf=10;niterf<=30;niterf+=10){
- forecast_time.tv_sec=curr_time.tv_sec+(niterf-*iter)*(curr_time.tv_sec-last_time.tv_sec);
- tmf = *localtime(&forecast_time.tv_sec);
-/* asctime_r(&tmf,strfor); */
- strcpy(strfor,asctime(&tmf));
- itmp = strlen(strfor);
- if(strfor[itmp-1]=='\n')
- strfor[itmp-1]='\0';
- printf(" - if your program needs %d iterations to converge, convergence will be \n reached in %s i.e.\n on %s (current time is %s);\n",niterf, asc_diff_time(forecast_time.tv_sec-curr_time.tv_sec,tmpout),strfor,strcurr);
- fprintf(ficlog," - if your program needs %d iterations to converge, convergence will be \n reached in %s i.e.\n on %s (current time is %s);\n",niterf, asc_diff_time(forecast_time.tv_sec-curr_time.tv_sec,tmpout),strfor,strcurr);
- }
- }
- for (i=1;i<=n;i++) {
- for (j=1;j<=n;j++) xit[j]=xi[j][i];
- fptt=(*fret);
-#ifdef DEBUG
- printf("fret=%lf \n",*fret);
- fprintf(ficlog,"fret=%lf \n",*fret);
-#endif
- printf("%d",i);fflush(stdout);
- fprintf(ficlog,"%d",i);fflush(ficlog);
- linmin(p,xit,n,fret,func);
- if (fabs(fptt-(*fret)) > del) {
- del=fabs(fptt-(*fret));
- ibig=i;
- }
-#ifdef DEBUG
- printf("%d %.12e",i,(*fret));
- fprintf(ficlog,"%d %.12e",i,(*fret));
- for (j=1;j<=n;j++) {
- xits[j]=FMAX(fabs(p[j]-pt[j]),1.e-5);
- printf(" x(%d)=%.12e",j,xit[j]);
- fprintf(ficlog," x(%d)=%.12e",j,xit[j]);
- }
- for(j=1;j<=n;j++) {
- printf(" p=%.12e",p[j]);
- fprintf(ficlog," p=%.12e",p[j]);
- }
- printf("\n");
- fprintf(ficlog,"\n");
-#endif
- }
- if (2.0*fabs(fp-(*fret)) <= ftol*(fabs(fp)+fabs(*fret))) {
-#ifdef DEBUG
- int k[2],l;
- k[0]=1;
- k[1]=-1;
- printf("Max: %.12e",(*func)(p));
- fprintf(ficlog,"Max: %.12e",(*func)(p));
- for (j=1;j<=n;j++) {
- printf(" %.12e",p[j]);
- fprintf(ficlog," %.12e",p[j]);
- }
- printf("\n");
- fprintf(ficlog,"\n");
- for(l=0;l<=1;l++) {
- for (j=1;j<=n;j++) {
- ptt[j]=p[j]+(p[j]-pt[j])*k[l];
- printf("l=%d j=%d ptt=%.12e, xits=%.12e, p=%.12e, xit=%.12e", l,j,ptt[j],xits[j],p[j],xit[j]);
- fprintf(ficlog,"l=%d j=%d ptt=%.12e, xits=%.12e, p=%.12e, xit=%.12e", l,j,ptt[j],xits[j],p[j],xit[j]);
- }
- printf("func(ptt)=%.12e, deriv=%.12e\n",(*func)(ptt),(ptt[j]-p[j])/((*func)(ptt)-(*func)(p)));
- fprintf(ficlog,"func(ptt)=%.12e, deriv=%.12e\n",(*func)(ptt),(ptt[j]-p[j])/((*func)(ptt)-(*func)(p)));
- }
-#endif
+ Revision 1.205 2015/10/23 15:50:53 brouard
+ Summary: 0.98r3 some clarification for graphs on likelihood contributions
+ Revision 1.204 2015/10/01 16:20:26 brouard
+ Summary: Some new graphs of contribution to likelihood
- free_vector(xit,1,n);
- free_vector(xits,1,n);
- free_vector(ptt,1,n);
- free_vector(pt,1,n);
- return;
- }
- if (*iter == ITMAX) nrerror("powell exceeding maximum iterations.");
- for (j=1;j<=n;j++) {
- ptt[j]=2.0*p[j]-pt[j];
- xit[j]=p[j]-pt[j];
- pt[j]=p[j];
- }
- fptt=(*func)(ptt);
- if (fptt < fp) {
- t=2.0*(fp-2.0*(*fret)+fptt)*SQR(fp-(*fret)-del)-del*SQR(fp-fptt);
- if (t < 0.0) {
- linmin(p,xit,n,fret,func);
- for (j=1;j<=n;j++) {
- xi[j][ibig]=xi[j][n];
- xi[j][n]=xit[j];
- }
-#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(" %.12e",xit[j]);
- fprintf(ficlog," %.12e",xit[j]);
- }
- printf("\n");
- fprintf(ficlog,"\n");
-#endif
- }
- }
- }
-}
+ Revision 1.203 2015/09/30 17:45:14 brouard
+ Summary: looking at better estimation of the hessian
-/**** Prevalence limit (stable or period prevalence) ****************/
+ Also a better criteria for convergence to the period prevalence And
+ therefore adding the number of years needed to converge. (The
+ prevalence in any alive state shold sum to one
-double **prevalim(double **prlim, int nlstate, double x[], double age, double **oldm, double **savm, double ftolpl, 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 */
+ Revision 1.202 2015/09/22 19:45:16 brouard
+ Summary: Adding some overall graph on contribution to likelihood. Might change
- int i, ii,j,k;
- double min, max, maxmin, maxmax,sumnew=0.;
- double **matprod2();
- double **out, cov[NCOVMAX], **pmij();
- double **newm;
- double agefin, delaymax=50 ; /* Max number of years to converge */
+ Revision 1.201 2015/09/15 17:34:58 brouard
+ Summary: 0.98r0
- for (ii=1;ii<=nlstate+ndeath;ii++)
- for (j=1;j<=nlstate+ndeath;j++){
- oldm[ii][j]=(ii==j ? 1.0 : 0.0);
- }
+ - Some new graphs like suvival functions
+ - Some bugs fixed like model=1+age+V2.
- cov[1]=1.;
-
- /* Even if hstepm = 1, at least one multiplication by the unit matrix */
- for(agefin=age-stepm/YEARM; agefin>=age-delaymax; agefin=agefin-stepm/YEARM){
- newm=savm;
- /* Covariates have to be included here again */
- cov[2]=agefin;
-
- for (k=1; k<=cptcovn;k++) {
- cov[2+k]=nbcode[Tvar[k]][codtab[ij][Tvar[k]]];
- /* printf("ij=%d k=%d Tvar[k]=%d nbcode=%d cov=%lf codtab[ij][Tvar[k]]=%d \n",ij,k, Tvar[k],nbcode[Tvar[k]][codtab[ij][Tvar[k]]],cov[2+k], codtab[ij][Tvar[k]]);*/
- }
- for (k=1; k<=cptcovage;k++) cov[2+Tage[k]]=cov[2+Tage[k]]*cov[2];
- for (k=1; k<=cptcovprod;k++)
- cov[2+Tprod[k]]=nbcode[Tvard[k][1]][codtab[ij][Tvard[k][1]]]*nbcode[Tvard[k][2]][codtab[ij][Tvard[k][2]]];
-
- /*printf("ij=%d cptcovprod=%d tvar=%d ", ij, cptcovprod, Tvar[1]);*/
- /*printf("ij=%d cov[3]=%lf cov[4]=%lf \n",ij, cov[3],cov[4]);*/
- /*printf("ij=%d cov[3]=%lf \n",ij, cov[3]);*/
- out=matprod2(newm, pmij(pmmij,cov,ncovmodel,x,nlstate),1,nlstate+ndeath,1,nlstate+ndeath,1,nlstate+ndeath, oldm);
+ Revision 1.200 2015/09/09 16:53:55 brouard
+ Summary: Big bug thanks to Flavia
- savm=oldm;
- oldm=newm;
- maxmax=0.;
- for(j=1;j<=nlstate;j++){
- min=1.;
- max=0.;
- for(i=1; i<=nlstate; i++) {
- sumnew=0;
- for(k=1; k<=ndeath; k++) sumnew+=newm[i][nlstate+k];
- prlim[i][j]= newm[i][j]/(1-sumnew);
- max=FMAX(max,prlim[i][j]);
- min=FMIN(min,prlim[i][j]);
- }
- maxmin=max-min;
- maxmax=FMAX(maxmax,maxmin);
- }
- if(maxmax < ftolpl){
- return prlim;
- }
- }
-}
+ Even model=1+age+V2. did not work anymore
-/*************** transition probabilities ***************/
+ Revision 1.199 2015/09/07 14:09:23 brouard
+ Summary: 0.98q6 changing default small png format for graph to vectorized svg.
-double **pmij(double **ps, double *cov, int ncovmodel, double *x, int nlstate )
-{
- double s1, s2;
- /*double t34;*/
- int i,j,j1, nc, ii, jj;
+ Revision 1.198 2015/09/03 07:14:39 brouard
+ Summary: 0.98q5 Flavia
- for(i=1; i<= nlstate; i++){
- for(j=1; ji s1=%.17e, s2=%.17e %lx %lx\n",s1,s2,s1,s2); */
- }
- ps[i][j]=s2;
- }
- }
- /*ps[3][2]=1;*/
-
- for(i=1; i<= nlstate; i++){
- s1=0;
- for(j=1; 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.
- */
- lli=log(out[s1][s2] - savm[s1][s2]);
+ Revision 1.184 2015/03/11 11:52:39 brouard
+ Summary: Back from Windows 8. Intel Compiler
+ Revision 1.183 2015/03/10 20:34:32 brouard
+ Summary: 0.98q0, trying with directest, mnbrak fixed
- } else if (s2==-2) {
- for (j=1,survp=0. ; j<=nlstate; j++)
- survp += (1.+bbh)*out[s1][j]- bbh*savm[s1][j];
- /*survp += out[s1][j]; */
- lli= log(survp);
- }
-
- else if (s2==-4) {
- for (j=3,survp=0. ; j<=nlstate; j++)
- survp += (1.+bbh)*out[s1][j]- bbh*savm[s1][j];
- lli= log(survp);
- }
+ We use directest instead of original Powell test; probably no
+ incidence on the results, but better justifications;
+ We fixed Numerical Recipes mnbrak routine which was wrong and gave
+ wrong results.
- else if (s2==-5) {
- for (j=1,survp=0. ; j<=2; j++)
- survp += (1.+bbh)*out[s1][j]- bbh*savm[s1][j];
- lli= log(survp);
- }
-
- else{
- lli= log((1.+bbh)*out[s1][s2]- bbh*savm[s1][s2]); /* linear interpolation */
- /* lli= (savm[s1][s2]>(double)1.e-8 ?log((1.+bbh)*out[s1][s2]- bbh*(savm[s1][s2])):log((1.+bbh)*out[s1][s2]));*/ /* linear interpolation */
- }
- /*lli=(1.+bbh)*log(out[s1][s2])- bbh*log(savm[s1][s2]);*/
- /*if(lli ==000.0)*/
- /*printf("bbh= %f lli=%f savm=%f out=%f %d\n",bbh,lli,savm[s1][s2], out[s[mw[mi][i]][i]][s[mw[mi+1][i]][i]],i); */
- ipmx +=1;
- sw += weight[i];
- ll[s[mw[mi][i]][i]] += 2*weight[i]*lli;
- } /* end of wave */
- } /* end of individual */
- } else if(mle==2){
- for (i=1,ipmx=0, sw=0.; i<=imx; i++){
- for (k=1; k<=cptcovn;k++) cov[2+k]=covar[Tvar[k]][i];
- for(mi=1; mi<= wav[i]-1; mi++){
- for (ii=1;ii<=nlstate+ndeath;ii++)
- for (j=1;j<=nlstate+ndeath;j++){
- oldm[ii][j]=(ii==j ? 1.0 : 0.0);
- savm[ii][j]=(ii==j ? 1.0 : 0.0);
- }
- for(d=0; d<=dh[mi][i]; d++){
- newm=savm;
- cov[2]=agev[mw[mi][i]][i]+d*stepm/YEARM;
- for (kk=1; kk<=cptcovage;kk++) {
- cov[Tage[kk]+2]=covar[Tvar[Tage[kk]]][i]*cov[2];
- }
- out=matprod2(newm,oldm,1,nlstate+ndeath,1,nlstate+ndeath,
- 1,nlstate+ndeath,pmij(pmmij,cov,ncovmodel,x,nlstate));
- savm=oldm;
- oldm=newm;
- } /* end mult */
-
- s1=s[mw[mi][i]][i];
- s2=s[mw[mi+1][i]][i];
- bbh=(double)bh[mi][i]/(double)stepm;
- 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 */
- ipmx +=1;
- sw += weight[i];
- ll[s[mw[mi][i]][i]] += 2*weight[i]*lli;
- } /* end of wave */
- } /* end of individual */
- } else if(mle==3){ /* exponential inter-extrapolation */
- for (i=1,ipmx=0, sw=0.; i<=imx; i++){
- for (k=1; k<=cptcovn;k++) cov[2+k]=covar[Tvar[k]][i];
- for(mi=1; mi<= wav[i]-1; mi++){
- for (ii=1;ii<=nlstate+ndeath;ii++)
- for (j=1;j<=nlstate+ndeath;j++){
- oldm[ii][j]=(ii==j ? 1.0 : 0.0);
- savm[ii][j]=(ii==j ? 1.0 : 0.0);
- }
- for(d=0; d1.e-8 ?(1.+bbh)*log(out[s1][s2])- bbh*log(savm[s1][s2]):log((1.+bbh)*out[s1][s2])); /* exponential inter-extrapolation */
- ipmx +=1;
- sw += weight[i];
- ll[s[mw[mi][i]][i]] += 2*weight[i]*lli;
- } /* end of wave */
- } /* end of individual */
- }else if (mle==4){ /* ml=4 no inter-extrapolation */
- for (i=1,ipmx=0, sw=0.; i<=imx; i++){
- for (k=1; k<=cptcovn;k++) cov[2+k]=covar[Tvar[k]][i];
- for(mi=1; mi<= wav[i]-1; mi++){
- for (ii=1;ii<=nlstate+ndeath;ii++)
- for (j=1;j<=nlstate+ndeath;j++){
- oldm[ii][j]=(ii==j ? 1.0 : 0.0);
- savm[ii][j]=(ii==j ? 1.0 : 0.0);
- }
- for(d=0; d nlstate){
- lli=log(out[s1][s2] - savm[s1][s2]);
- }else{
- lli=log(out[s[mw[mi][i]][i]][s[mw[mi+1][i]][i]]); /* Original formula */
- }
- 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]); */
- } /* end of wave */
- } /* end of individual */
- }else{ /* ml=5 no inter-extrapolation no jackson =0.8a */
- for (i=1,ipmx=0, sw=0.; i<=imx; i++){
- for (k=1; k<=cptcovn;k++) cov[2+k]=covar[Tvar[k]][i];
- for(mi=1; mi<= wav[i]-1; mi++){
- for (ii=1;ii<=nlstate+ndeath;ii++)
- for (j=1;j<=nlstate+ndeath;j++){
- 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) {
- for (j=1,survp=0. ; j<=nlstate; j++)
- survp += (1.+bbh)*out[s1][j]- bbh*savm[s1][j];
- lli= log(survp);
- }else if (mle==1){
- lli= log((1.+bbh)*out[s1][s2]- bbh*savm[s1][s2]); /* linear interpolation */
- } else if(mle==2){
- lli= (savm[s1][s2]>(double)1.e-8 ?log((1.+bbh)*out[s1][s2]- bbh*savm[s1][s2]):log((1.+bbh)*out[s1][s2])); /* linear interpolation */
- } 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 */
- } else if (mle==4){ /* mle=4 no inter-extrapolation */
- lli=log(out[s1][s2]); /* Original formula */
- } else{ /* ml>=5 no inter-extrapolation no jackson =0.8a */
- lli=log(out[s1][s2]); /* Original formula */
- } /* 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,"%9d %6d %2d %2d %1d %1d %3d %11.6f %8.4f\
- %11.6f %11.6f %11.6f ", \
- num[i],i,s1,s2,mi,mw[mi][i],dh[mi][i],exp(lli),weight[i],
- 2*weight[i]*lli,out[s1][s2],savm[s1][s2]);
- for(k=1,llt=0.,l=0.; k<=nlstate; k++){
- 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;
-}
+ Revision 1.180 2015/02/11 17:33:45 brouard
+ Summary: Finishing move from main to function (hpijx and prevalence_limit)
+ Revision 1.179 2015/01/04 09:57:06 brouard
+ Summary: back to OS/X
-/*************** function likelione ***********/
-void likelione(FILE *ficres,double p[], int npar, int nlstate, int *globpri, long *ipmx, double *sw, double *fretone, double (*funcone)(double []))
-{
- /* This routine should help understanding what is done with
- the selection of individuals/waves and
- to check the exact contribution to the likelihood.
- Plotting could be done.
- */
- int k;
+ Revision 1.178 2015/01/04 09:35:48 brouard
+ *** empty log message ***
- if(*globpri !=0){ /* Just counts and sums, no printings */
- strcpy(fileresilk,"ilk");
- strcat(fileresilk,fileres);
- if((ficresilk=fopen(fileresilk,"w"))==NULL) {
- printf("Problem with resultfile: %s\n", fileresilk);
- fprintf(ficlog,"Problem with resultfile: %s\n", fileresilk);
- }
- fprintf(ficresilk, "#individual(line's_record) s1 s2 wave# effective_wave# number_of_matrices_product pij weight -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 i s1 s2 mi mw dh likeli 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);
- fprintf(ficresilk," -2*gipw/gsw*weight*ll(total)\n");
- }
+ Revision 1.177 2015/01/03 18:40:56 brouard
+ Summary: Still testing ilc32 on OSX
- *fretone=(*funcone)(p);
- if(*globpri !=0){
- fclose(ficresilk);
- fprintf(fichtm,"\n
File of contributions to the likelihood: %s
\n",subdirf(fileresilk),subdirf(fileresilk));
- fflush(fichtm);
- }
- return;
-}
+ Revision 1.176 2015/01/03 16:45:04 brouard
+ *** empty log message ***
+ Revision 1.175 2015/01/03 16:33:42 brouard
+ *** empty log message ***
-/*********** Maximum Likelihood Estimation ***************/
+ Revision 1.174 2015/01/03 16:15:49 brouard
+ Summary: Still in cross-compilation
-void mlikeli(FILE *ficres,double p[], int npar, int ncovmodel, int nlstate, double ftol, double (*func)(double []))
-{
- int i,j, iter;
- double **xi;
- double fret;
- double fretone; /* Only one call to likelihood */
- /* char filerespow[FILENAMELENGTH];*/
- xi=matrix(1,npar,1,npar);
- for (i=1;i<=npar;i++)
- for (j=1;j<=npar;j++)
- xi[i][j]=(i==j ? 1.0 : 0.0);
- printf("Powell\n"); fprintf(ficlog,"Powell\n");
- strcpy(filerespow,"pow");
- strcat(filerespow,fileres);
- if((ficrespow=fopen(filerespow,"w"))==NULL) {
- printf("Problem with resultfile: %s\n", filerespow);
- fprintf(ficlog,"Problem with resultfile: %s\n", filerespow);
- }
- fprintf(ficrespow,"# Powell\n# iter -2*LL");
- for (i=1;i<=nlstate;i++)
- for(j=1;j<=nlstate+ndeath;j++)
- if(j!=i)fprintf(ficrespow," p%1d%1d",i,j);
- fprintf(ficrespow,"\n");
+ Revision 1.173 2015/01/03 12:06:26 brouard
+ Summary: trying to detect cross-compilation
- powell(p,xi,npar,ftol,&iter,&fret,func);
+ Revision 1.172 2014/12/27 12:07:47 brouard
+ Summary: Back from Visual Studio and Intel, options for compiling for Windows XP
- free_matrix(xi,1,npar,1,npar);
- fclose(ficrespow);
- printf("\n#Number of iterations = %d, -2 Log likelihood = %.12f\n",iter,func(p));
- fprintf(ficlog,"\n#Number of iterations = %d, -2 Log likelihood = %.12f \n",iter,func(p));
- fprintf(ficres,"#Number of iterations = %d, -2 Log likelihood = %.12f \n",iter,func(p));
+ Revision 1.171 2014/12/23 13:26:59 brouard
+ Summary: Back from Visual C
-}
+ Still problem with utsname.h on Windows
-/**** Computes Hessian and covariance matrix ***/
-void hesscov(double **matcov, double p[], int npar, double delti[], double ftolhess, double (*func)(double []))
-{
- double **a,**y,*x,pd;
- double **hess;
- int i, j,jk;
- int *indx;
+ Revision 1.170 2014/12/23 11:17:12 brouard
+ Summary: Cleaning some \%% back to %%
- double hessii(double p[], double delta, int theta, double delti[],double (*func)(double []),int npar);
- double hessij(double p[], double delti[], int i, int j,double (*func)(double []),int npar);
- void lubksb(double **a, int npar, int *indx, double b[]) ;
- void ludcmp(double **a, int npar, int *indx, double *d) ;
- double gompertz(double p[]);
- hess=matrix(1,npar,1,npar);
+ The escape was mandatory for a specific compiler (which one?), but too many warnings.
- printf("\nCalculation of the hessian matrix. Wait...\n");
- fprintf(ficlog,"\nCalculation of the hessian matrix. Wait...\n");
- for (i=1;i<=npar;i++){
- printf("%d",i);fflush(stdout);
- fprintf(ficlog,"%d",i);fflush(ficlog);
-
- hess[i][i]=hessii(p,ftolhess,i,delti,func,npar);
-
- /* printf(" %f ",p[i]);
- printf(" %lf %lf %lf",hess[i][i],ftolhess,delti[i]);*/
- }
-
- for (i=1;i<=npar;i++) {
- for (j=1;j<=npar;j++) {
- if (j>i) {
- printf(".%d%d",i,j);fflush(stdout);
- fprintf(ficlog,".%d%d",i,j);fflush(ficlog);
- hess[i][j]=hessij(p,delti,i,j,func,npar);
-
- hess[j][i]=hess[i][j];
- /*printf(" %lf ",hess[i][j]);*/
- }
- }
- }
- printf("\n");
- fprintf(ficlog,"\n");
+ Revision 1.169 2014/12/22 23:08:31 brouard
+ Summary: 0.98p
- printf("\nInverting the hessian to get the covariance matrix. Wait...\n");
- fprintf(ficlog,"\nInverting the hessian to get the covariance matrix. Wait...\n");
-
- a=matrix(1,npar,1,npar);
- y=matrix(1,npar,1,npar);
- x=vector(1,npar);
- indx=ivector(1,npar);
- for (i=1;i<=npar;i++)
- for (j=1;j<=npar;j++) a[i][j]=hess[i][j];
- ludcmp(a,npar,indx,&pd);
+ Outputs some informations on compiler used, OS etc. Testing on different platforms.
- for (j=1;j<=npar;j++) {
- for (i=1;i<=npar;i++) x[i]=0;
- x[j]=1;
- lubksb(a,npar,indx,x);
- for (i=1;i<=npar;i++){
- matcov[i][j]=x[i];
- }
- }
+ Revision 1.168 2014/12/22 15:17:42 brouard
+ Summary: update
- printf("\n#Hessian matrix#\n");
- fprintf(ficlog,"\n#Hessian matrix#\n");
- for (i=1;i<=npar;i++) {
- for (j=1;j<=npar;j++) {
- printf("%.3e ",hess[i][j]);
- fprintf(ficlog,"%.3e ",hess[i][j]);
- }
- printf("\n");
- fprintf(ficlog,"\n");
- }
+ Revision 1.167 2014/12/22 13:50:56 brouard
+ Summary: Testing uname and compiler version and if compiled 32 or 64
- /* Recompute Inverse */
- for (i=1;i<=npar;i++)
- for (j=1;j<=npar;j++) a[i][j]=matcov[i][j];
- ludcmp(a,npar,indx,&pd);
+ Testing on Linux 64
- /* printf("\n#Hessian matrix recomputed#\n");
+ Revision 1.166 2014/12/22 11:40:47 brouard
+ *** empty log message ***
- for (j=1;j<=npar;j++) {
- for (i=1;i<=npar;i++) x[i]=0;
- x[j]=1;
- lubksb(a,npar,indx,x);
- for (i=1;i<=npar;i++){
- y[i][j]=x[i];
- printf("%.3e ",y[i][j]);
- fprintf(ficlog,"%.3e ",y[i][j]);
- }
- printf("\n");
- fprintf(ficlog,"\n");
- }
- */
+ Revision 1.165 2014/12/16 11:20:36 brouard
+ Summary: After compiling on Visual C
- free_matrix(a,1,npar,1,npar);
- free_matrix(y,1,npar,1,npar);
- free_vector(x,1,npar);
- free_ivector(indx,1,npar);
- free_matrix(hess,1,npar,1,npar);
+ * imach.c (Module): Merging 1.61 to 1.162
+ Revision 1.164 2014/12/16 10:52:11 brouard
+ Summary: Merging with Visual C after suppressing some warnings for unused variables. Also fixing Saito's bug 0.98Xn
-}
+ * imach.c (Module): Merging 1.61 to 1.162
-/*************** hessian matrix ****************/
-double hessii(double x[], double delta, int theta, double delti[], double (*func)(double []), int npar)
-{
- int i;
- int l=1, lmax=20;
- double k1,k2;
- double p2[NPARMAX+1];
- double res;
- double delt=0.0001, delts, nkhi=10.,nkhif=1., khi=1.e-4;
- double fx;
- int k=0,kmax=10;
- double l1;
+ Revision 1.163 2014/12/16 10:30:11 brouard
+ * imach.c (Module): Merging 1.61 to 1.162
- fx=func(x);
- for (i=1;i<=npar;i++) p2[i]=x[i];
- for(l=0 ; l <=lmax; l++){
- l1=pow(10,l);
- delts=delt;
- for(k=1 ; k khi/nkhif) || (k2 >khi/nkhif)){ /* Keeps lastvalue before 3.84/2 KHI2 5% 1d.f. */
- k=kmax; l=lmax*10.;
- }
- else if((k1 >khi/nkhi) || (k2 >khi/nkhi)){
- delts=delt;
- }
- }
- }
- delti[theta]=delts;
- return res;
-
-}
+ Revision 1.162 2014/09/25 11:43:39 brouard
+ Summary: temporary backup 0.99!
-double hessij( double x[], double delti[], int thetai,int thetaj,double (*func)(double []),int npar)
-{
- int i;
- int l=1, l1, lmax=20;
- double k1,k2,k3,k4,res,fx;
- double p2[NPARMAX+1];
- int k;
+ Revision 1.1 2014/09/16 11:06:58 brouard
+ Summary: With some code (wrong) for nlopt
- fx=func(x);
- for (k=1; k<=2; k++) {
- for (i=1;i<=npar;i++) p2[i]=x[i];
- p2[thetai]=x[thetai]+delti[thetai]/k;
- p2[thetaj]=x[thetaj]+delti[thetaj]/k;
- k1=func(p2)-fx;
-
- p2[thetai]=x[thetai]+delti[thetai]/k;
- p2[thetaj]=x[thetaj]-delti[thetaj]/k;
- k2=func(p2)-fx;
-
- p2[thetai]=x[thetai]-delti[thetai]/k;
- p2[thetaj]=x[thetaj]+delti[thetaj]/k;
- k3=func(p2)-fx;
-
- p2[thetai]=x[thetai]-delti[thetai]/k;
- p2[thetaj]=x[thetaj]-delti[thetaj]/k;
- k4=func(p2)-fx;
- res=(k1-k2-k3+k4)/4.0/delti[thetai]*k/delti[thetaj]*k/2.; /* Because of L not 2*L */
-#ifdef DEBUG
- printf("%d %d k=%d, k1=%.12e k2=%.12e k3=%.12e k4=%.12e delti/k=%.12e deltj/k=%.12e, xi-de/k=%.12e xj-de/k=%.12e res=%.12e k1234=%.12e,k1-2=%.12e,k3-4=%.12e\n",thetai,thetaj,k,k1,k2,k3,k4,delti[thetai]/k,delti[thetaj]/k,x[thetai]-delti[thetai]/k,x[thetaj]-delti[thetaj]/k, res,k1-k2-k3+k4,k1-k2,k3-k4);
- fprintf(ficlog,"%d %d k=%d, k1=%.12e k2=%.12e k3=%.12e k4=%.12e delti/k=%.12e deltj/k=%.12e, xi-de/k=%.12e xj-de/k=%.12e res=%.12e k1234=%.12e,k1-2=%.12e,k3-4=%.12e\n",thetai,thetaj,k,k1,k2,k3,k4,delti[thetai]/k,delti[thetaj]/k,x[thetai]-delti[thetai]/k,x[thetaj]-delti[thetaj]/k, res,k1-k2-k3+k4,k1-k2,k3-k4);
-#endif
- }
- return res;
-}
+ Author:
-/************** Inverse of matrix **************/
-void ludcmp(double **a, int n, int *indx, double *d)
-{
- int i,imax,j,k;
- double big,dum,sum,temp;
- double *vv;
-
- vv=vector(1,n);
- *d=1.0;
- for (i=1;i<=n;i++) {
- big=0.0;
- for (j=1;j<=n;j++)
- if ((temp=fabs(a[i][j])) > big) big=temp;
- if (big == 0.0) nrerror("Singular matrix in routine ludcmp");
- vv[i]=1.0/big;
- }
- for (j=1;j<=n;j++) {
- for (i=1;i= big) {
- big=dum;
- imax=i;
- }
- }
- if (j != imax) {
- for (k=1;k<=n;k++) {
- dum=a[imax][k];
- a[imax][k]=a[j][k];
- a[j][k]=dum;
- }
- *d = -(*d);
- vv[imax]=vv[j];
- }
- indx[j]=imax;
- if (a[j][j] == 0.0) a[j][j]=TINY;
- if (j != n) {
- dum=1.0/(a[j][j]);
- for (i=j+1;i<=n;i++) a[i][j] *= dum;
- }
- }
- free_vector(vv,1,n); /* Doesn't work */
-;
-}
+ Revision 1.161 2014/09/15 20:41:41 brouard
+ Summary: Problem with macro SQR on Intel compiler
-void lubksb(double **a, int n, int *indx, double b[])
-{
- int i,ii=0,ip,j;
- double sum;
+ Revision 1.160 2014/09/02 09:24:05 brouard
+ *** empty log message ***
+
+ Revision 1.159 2014/09/01 10:34:10 brouard
+ Summary: WIN32
+ Author: Brouard
+
+ Revision 1.158 2014/08/27 17:11:51 brouard
+ *** empty log message ***
+
+ Revision 1.157 2014/08/27 16:26:55 brouard
+ Summary: Preparing windows Visual studio version
+ Author: Brouard
+
+ In order to compile on Visual studio, time.h is now correct and time_t
+ and tm struct should be used. difftime should be used but sometimes I
+ just make the differences in raw time format (time(&now).
+ Trying to suppress #ifdef LINUX
+ Add xdg-open for __linux in order to open default browser.
+
+ Revision 1.156 2014/08/25 20:10:10 brouard
+ *** empty log message ***
+
+ Revision 1.155 2014/08/25 18:32:34 brouard
+ Summary: New compile, minor changes
+ Author: Brouard
+
+ Revision 1.154 2014/06/20 17:32:08 brouard
+ Summary: Outputs now all graphs of convergence to period prevalence
+
+ Revision 1.153 2014/06/20 16:45:46 brouard
+ Summary: If 3 live state, convergence to period prevalence on same graph
+ Author: Brouard
+
+ Revision 1.152 2014/06/18 17:54:09 brouard
+ Summary: open browser, use gnuplot on same dir than imach if not found in the path
+
+ Revision 1.151 2014/06/18 16:43:30 brouard
+ *** empty log message ***
+
+ Revision 1.150 2014/06/18 16:42:35 brouard
+ Summary: If gnuplot is not in the path try on same directory than imach binary (OSX)
+ Author: brouard
+
+ Revision 1.149 2014/06/18 15:51:14 brouard
+ Summary: Some fixes in parameter files errors
+ Author: Nicolas Brouard
+
+ Revision 1.148 2014/06/17 17:38:48 brouard
+ Summary: Nothing new
+ Author: Brouard
+
+ Just a new packaging for OS/X version 0.98nS
+
+ Revision 1.147 2014/06/16 10:33:11 brouard
+ *** empty log message ***
+
+ Revision 1.146 2014/06/16 10:20:28 brouard
+ Summary: Merge
+ Author: Brouard
+
+ Merge, before building revised version.
+
+ Revision 1.145 2014/06/10 21:23:15 brouard
+ Summary: Debugging with valgrind
+ Author: Nicolas Brouard
+
+ Lot of changes in order to output the results with some covariates
+ After the Edimburgh REVES conference 2014, it seems mandatory to
+ improve the code.
+ No more memory valgrind error but a lot has to be done in order to
+ continue the work of splitting the code into subroutines.
+ Also, decodemodel has been improved. Tricode is still not
+ optimal. nbcode should be improved. Documentation has been added in
+ the source code.
+
+ Revision 1.143 2014/01/26 09:45:38 brouard
+ Summary: Version 0.98nR (to be improved, but gives same optimization results as 0.98k. Nice, promising
+
+ * imach.c (Module): Trying to merge old staffs together while being at Tokyo. Not tested...
+ (Module): Version 0.98nR Running ok, but output format still only works for three covariates.
+
+ Revision 1.142 2014/01/26 03:57:36 brouard
+ Summary: gnuplot changed plot w l 1 has to be changed to plot w l lt 2
+
+ * imach.c (Module): Trying to merge old staffs together while being at Tokyo. Not tested...
+
+ Revision 1.141 2014/01/26 02:42:01 brouard
+ * imach.c (Module): Trying to merge old staffs together while being at Tokyo. Not tested...
+
+ Revision 1.140 2011/09/02 10:37:54 brouard
+ Summary: times.h is ok with mingw32 now.
+
+ Revision 1.139 2010/06/14 07:50:17 brouard
+ After the theft of my laptop, I probably lost some lines of codes which were not uploaded to the CVS tree.
+ I remember having already fixed agemin agemax which are pointers now but not cvs saved.
+
+ Revision 1.138 2010/04/30 18:19:40 brouard
+ *** empty log message ***
+
+ Revision 1.137 2010/04/29 18:11:38 brouard
+ (Module): Checking covariates for more complex models
+ than V1+V2. A lot of change to be done. Unstable.
+
+ Revision 1.136 2010/04/26 20:30:53 brouard
+ (Module): merging some libgsl code. Fixing computation
+ of likelione (using inter/intrapolation if mle = 0) in order to
+ get same likelihood as if mle=1.
+ Some cleaning of code and comments added.
+
+ Revision 1.135 2009/10/29 15:33:14 brouard
+ (Module): Now imach stops if date of birth, at least year of birth, is not given. Some cleaning of the code.
+
+ Revision 1.134 2009/10/29 13:18:53 brouard
+ (Module): Now imach stops if date of birth, at least year of birth, is not given. Some cleaning of the code.
+
+ Revision 1.133 2009/07/06 10:21:25 brouard
+ just nforces
+
+ Revision 1.132 2009/07/06 08:22:05 brouard
+ Many tings
+
+ Revision 1.131 2009/06/20 16:22:47 brouard
+ Some dimensions resccaled
+
+ Revision 1.130 2009/05/26 06:44:34 brouard
+ (Module): Max Covariate is now set to 20 instead of 8. A
+ lot of cleaning with variables initialized to 0. Trying to make
+ V2+V3*age+V1+V4 strb=V3*age+V1+V4 working better.
+
+ Revision 1.129 2007/08/31 13:49:27 lievre
+ Modification of the way of exiting when the covariate is not binary in order to see on the window the error message before exiting
+
+ Revision 1.128 2006/06/30 13:02:05 brouard
+ (Module): Clarifications on computing e.j
+
+ Revision 1.127 2006/04/28 18:11:50 brouard
+ (Module): Yes the sum of survivors was wrong since
+ imach-114 because nhstepm was no more computed in the age
+ loop. Now we define nhstepma in the age loop.
+ (Module): In order to speed up (in case of numerous covariates) we
+ compute health expectancies (without variances) in a first step
+ and then all the health expectancies with variances or standard
+ deviation (needs data from the Hessian matrices) which slows the
+ computation.
+ In the future we should be able to stop the program is only health
+ expectancies and graph are needed without standard deviations.
+
+ Revision 1.126 2006/04/28 17:23:28 brouard
+ (Module): Yes the sum of survivors was wrong since
+ imach-114 because nhstepm was no more computed in the age
+ loop. Now we define nhstepma in the age loop.
+ Version 0.98h
+
+ Revision 1.125 2006/04/04 15:20:31 lievre
+ Errors in calculation of health expectancies. Age was not initialized.
+ Forecasting file added.
+
+ Revision 1.124 2006/03/22 17:13:53 lievre
+ Parameters are printed with %lf instead of %f (more numbers after the comma).
+ The log-likelihood is printed in the log file
+
+ Revision 1.123 2006/03/20 10:52:43 brouard
+ * imach.c (Module): changed, corresponds to .htm file
+ name. headers where missing.
+
+ * imach.c (Module): Weights can have a decimal point as for
+ English (a comma might work with a correct LC_NUMERIC environment,
+ otherwise the weight is truncated).
+ Modification of warning when the covariates values are not 0 or
+ 1.
+ Version 0.98g
+
+ Revision 1.122 2006/03/20 09:45:41 brouard
+ (Module): Weights can have a decimal point as for
+ English (a comma might work with a correct LC_NUMERIC environment,
+ otherwise the weight is truncated).
+ Modification of warning when the covariates values are not 0 or
+ 1.
+ Version 0.98g
+
+ Revision 1.121 2006/03/16 17:45:01 lievre
+ * imach.c (Module): Comments concerning covariates added
+
+ * imach.c (Module): refinements in the computation of lli if
+ status=-2 in order to have more reliable computation if stepm is
+ not 1 month. Version 0.98f
+
+ Revision 1.120 2006/03/16 15:10:38 lievre
+ (Module): refinements in the computation of lli if
+ status=-2 in order to have more reliable computation if stepm is
+ not 1 month. Version 0.98f
+
+ Revision 1.119 2006/03/15 17:42:26 brouard
+ (Module): Bug if status = -2, the loglikelihood was
+ computed as likelihood omitting the logarithm. Version O.98e
+
+ Revision 1.118 2006/03/14 18:20:07 brouard
+ (Module): varevsij Comments added explaining the second
+ table of variances if popbased=1 .
+ (Module): Covariances of eij, ekl added, graphs fixed, new html link.
+ (Module): Function pstamp added
+ (Module): Version 0.98d
+
+ Revision 1.117 2006/03/14 17:16:22 brouard
+ (Module): varevsij Comments added explaining the second
+ table of variances if popbased=1 .
+ (Module): Covariances of eij, ekl added, graphs fixed, new html link.
+ (Module): Function pstamp added
+ (Module): Version 0.98d
+
+ Revision 1.116 2006/03/06 10:29:27 brouard
+ (Module): Variance-covariance wrong links and
+ varian-covariance of ej. is needed (Saito).
+
+ Revision 1.115 2006/02/27 12:17:45 brouard
+ (Module): One freematrix added in mlikeli! 0.98c
+
+ Revision 1.114 2006/02/26 12:57:58 brouard
+ (Module): Some improvements in processing parameter
+ filename with strsep.
+
+ Revision 1.113 2006/02/24 14:20:24 brouard
+ (Module): Memory leaks checks with valgrind and:
+ datafile was not closed, some imatrix were not freed and on matrix
+ allocation too.
+
+ Revision 1.112 2006/01/30 09:55:26 brouard
+ (Module): Back to gnuplot.exe instead of wgnuplot.exe
+
+ Revision 1.111 2006/01/25 20:38:18 brouard
+ (Module): Lots of cleaning and bugs added (Gompertz)
+ (Module): Comments can be added in data file. Missing date values
+ can be a simple dot '.'.
+
+ Revision 1.110 2006/01/25 00:51:50 brouard
+ (Module): Lots of cleaning and bugs added (Gompertz)
+
+ Revision 1.109 2006/01/24 19:37:15 brouard
+ (Module): Comments (lines starting with a #) are allowed in data.
+
+ Revision 1.108 2006/01/19 18:05:42 lievre
+ Gnuplot problem appeared...
+ To be fixed
+
+ Revision 1.107 2006/01/19 16:20:37 brouard
+ Test existence of gnuplot in imach path
+
+ Revision 1.106 2006/01/19 13:24:36 brouard
+ Some cleaning and links added in html output
+
+ Revision 1.105 2006/01/05 20:23:19 lievre
+ *** empty log message ***
+
+ Revision 1.104 2005/09/30 16:11:43 lievre
+ (Module): sump fixed, loop imx fixed, and simplifications.
+ (Module): If the status is missing at the last wave but we know
+ that the person is alive, then we can code his/her status as -2
+ (instead of missing=-1 in earlier versions) and his/her
+ contributions to the likelihood is 1 - Prob of dying from last
+ health status (= 1-p13= p11+p12 in the easiest case of somebody in
+ the healthy state at last known wave). Version is 0.98
+
+ Revision 1.103 2005/09/30 15:54:49 lievre
+ (Module): sump fixed, loop imx fixed, and simplifications.
+
+ Revision 1.102 2004/09/15 17:31:30 brouard
+ Add the possibility to read data file including tab characters.
+
+ Revision 1.101 2004/09/15 10:38:38 brouard
+ Fix on curr_time
+
+ Revision 1.100 2004/07/12 18:29:06 brouard
+ Add version for Mac OS X. Just define UNIX in Makefile
+
+ Revision 1.99 2004/06/05 08:57:40 brouard
+ *** empty log message ***
+
+ Revision 1.98 2004/05/16 15:05:56 brouard
+ New version 0.97 . First attempt to estimate force of mortality
+ directly from the data i.e. without the need of knowing the health
+ state at each age, but using a Gompertz model: log u =a + b*age .
+ This is the basic analysis of mortality and should be done before any
+ other analysis, in order to test if the mortality estimated from the
+ cross-longitudinal survey is different from the mortality estimated
+ from other sources like vital statistic data.
+
+ The same imach parameter file can be used but the option for mle should be -3.
+
+ Agnès, who wrote this part of the code, tried to keep most of the
+ former routines in order to include the new code within the former code.
+
+ The output is very simple: only an estimate of the intercept and of
+ the slope with 95% confident intervals.
+
+ Current limitations:
+ A) Even if you enter covariates, i.e. with the
+ model= V1+V2 equation for example, the programm does only estimate a unique global model without covariates.
+ B) There is no computation of Life Expectancy nor Life Table.
+
+ Revision 1.97 2004/02/20 13:25:42 lievre
+ Version 0.96d. Population forecasting command line is (temporarily)
+ suppressed.
+
+ Revision 1.96 2003/07/15 15:38:55 brouard
+ * imach.c (Repository): Errors in subdirf, 2, 3 while printing tmpout is
+ rewritten within the same printf. Workaround: many printfs.
+
+ Revision 1.95 2003/07/08 07:54:34 brouard
+ * imach.c (Repository):
+ (Repository): Using imachwizard code to output a more meaningful covariance
+ matrix (cov(a12,c31) instead of numbers.
+
+ Revision 1.94 2003/06/27 13:00:02 brouard
+ Just cleaning
+
+ Revision 1.93 2003/06/25 16:33:55 brouard
+ (Module): On windows (cygwin) function asctime_r doesn't
+ exist so I changed back to asctime which exists.
+ (Module): Version 0.96b
+
+ Revision 1.92 2003/06/25 16:30:45 brouard
+ (Module): On windows (cygwin) function asctime_r doesn't
+ exist so I changed back to asctime which exists.
+
+ Revision 1.91 2003/06/25 15:30:29 brouard
+ * imach.c (Repository): Duplicated warning errors corrected.
+ (Repository): Elapsed time after each iteration is now output. It
+ helps to forecast when convergence will be reached. Elapsed time
+ is stamped in powell. We created a new html file for the graphs
+ concerning matrix of covariance. It has extension -cov.htm.
+
+ Revision 1.90 2003/06/24 12:34:15 brouard
+ (Module): Some bugs corrected for windows. Also, when
+ mle=-1 a template is output in file "or"mypar.txt with the design
+ of the covariance matrix to be input.
+
+ Revision 1.89 2003/06/24 12:30:52 brouard
+ (Module): Some bugs corrected for windows. Also, when
+ mle=-1 a template is output in file "or"mypar.txt with the design
+ of the covariance matrix to be input.
+
+ Revision 1.88 2003/06/23 17:54:56 brouard
+ * imach.c (Repository): Create a sub-directory where all the secondary files are. Only imach, htm, gp and r(imach) are on the main directory. Correct time and other things.
+
+ Revision 1.87 2003/06/18 12:26:01 brouard
+ Version 0.96
+
+ Revision 1.86 2003/06/17 20:04:08 brouard
+ (Module): Change position of html and gnuplot routines and added
+ routine fileappend.
+
+ Revision 1.85 2003/06/17 13:12:43 brouard
+ * imach.c (Repository): Check when date of death was earlier that
+ current date of interview. It may happen when the death was just
+ prior to the death. In this case, dh was negative and likelihood
+ was wrong (infinity). We still send an "Error" but patch by
+ assuming that the date of death was just one stepm after the
+ interview.
+ (Repository): Because some people have very long ID (first column)
+ we changed int to long in num[] and we added a new lvector for
+ memory allocation. But we also truncated to 8 characters (left
+ truncation)
+ (Repository): No more line truncation errors.
+
+ Revision 1.84 2003/06/13 21:44:43 brouard
+ * imach.c (Repository): Replace "freqsummary" at a correct
+ place. It differs from routine "prevalence" which may be called
+ many times. Probs is memory consuming and must be used with
+ parcimony.
+ Version 0.95a3 (should output exactly the same maximization than 0.8a2)
+
+ Revision 1.83 2003/06/10 13:39:11 lievre
+ *** empty log message ***
+
+ Revision 1.82 2003/06/05 15:57:20 brouard
+ Add log in imach.c and fullversion number is now printed.
+
+*/
+/*
+ Interpolated Markov Chain
+
+ Short summary of the programme:
+
+ This program computes Healthy Life Expectancies or State-specific
+ (if states aren't health statuses) Expectancies from
+ cross-longitudinal data. Cross-longitudinal data consist in:
+
+ -1- a first survey ("cross") where individuals from different ages
+ are interviewed on their health status or degree of disability (in
+ the case of a health survey which is our main interest)
+
+ -2- at least a second wave of interviews ("longitudinal") which
+ measure each change (if any) in individual health status. Health
+ expectancies are computed from the time spent in each health state
+ according to a model. More health states you consider, more time is
+ necessary to reach the Maximum Likelihood of the parameters involved
+ in the model. The simplest model is the multinomial logistic model
+ where pij is the probability to be observed in state j at the second
+ wave conditional to be observed in state i at the first
+ wave. Therefore the model is: log(pij/pii)= aij + bij*age+ cij*sex +
+ etc , where 'age' is age and 'sex' is a covariate. If you want to
+ have a more complex model than "constant and age", you should modify
+ the program where the markup *Covariates have to be included here
+ again* invites you to do it. More covariates you add, slower the
+ convergence.
+
+ The advantage of this computer programme, compared to a simple
+ multinomial logistic model, is clear when the delay between waves is not
+ identical for each individual. Also, if a individual missed an
+ intermediate interview, the information is lost, but taken into
+ account using an interpolation or extrapolation.
+
+ hPijx is the probability to be observed in state i at age x+h
+ conditional to the observed state i at age x. The delay 'h' can be
+ split into an exact number (nh*stepm) of unobserved intermediate
+ states. This elementary transition (by month, quarter,
+ semester or year) is modelled as a multinomial logistic. The hPx
+ matrix is simply the matrix product of nh*stepm elementary matrices
+ and the contribution of each individual to the likelihood is simply
+ hPijx.
+
+ Also this programme outputs the covariance matrix of the parameters but also
+ of the life expectancies. It also computes the period (stable) prevalence.
+
+Back prevalence and projections:
+
+ - back_prevalence_limit(double *p, double **bprlim, double ageminpar,
+ double agemaxpar, double ftolpl, int *ncvyearp, double
+ dateprev1,double dateprev2, int firstpass, int lastpass, int
+ mobilavproj)
+
+ Computes the back prevalence limit for any combination of
+ covariate values k at any age between ageminpar and agemaxpar and
+ returns it in **bprlim. In the loops,
+
+ - **bprevalim(**bprlim, ***mobaverage, nlstate, *p, age, **oldm,
+ **savm, **dnewm, **doldm, **dsavm, ftolpl, ncvyearp, k);
+
+ - hBijx Back Probability to be in state i at age x-h being in j at x
+ Computes for any combination of covariates k and any age between bage and fage
+ 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, nres);
+ Computes the transition matrix starting at age 'age' over
+ 'nhstepm*hstepm*stepm' months (i.e. until
+ age (in years) age+nhstepm*hstepm*stepm/12) by multiplying
+ nhstepm*hstepm matrices.
+
+ Returns p3mat[i][j][h] after calling
+ p3mat[i][j][h]=matprod2(newm,
+ bmij(pmmij,cov,ncovmodel,x,nlstate,prevacurrent, dnewm, doldm,
+ dsavm,ij),\ 1,nlstate+ndeath,1,nlstate+ndeath,1,nlstate+ndeath,
+ oldm);
+
+Important routines
+
+- func (or funcone), computes logit (pij) distinguishing
+ o fixed variables (single or product dummies or quantitative);
+ o varying variables by:
+ (1) wave (single, product dummies, quantitative),
+ (2) by age (can be month) age (done), age*age (done), age*Vn where Vn can be:
+ % fixed dummy (treated) or quantitative (not done because time-consuming);
+ % varying dummy (not done) or quantitative (not done);
+- Tricode which tests the modality of dummy variables (in order to warn with wrong or empty modalities)
+ and returns the number of efficient covariates cptcoveff and modalities nbcode[Tvar[k]][1]= 0 and nbcode[Tvar[k]][2]= 1 usually.
+- printinghtml which outputs results like life expectancy in and from a state for a combination of modalities of dummy variables
+ o There are 2**cptcoveff combinations of (0,1) for cptcoveff variables. Outputting only combinations with people, eÌliminating 1 1 if
+ race White (0 0), Black vs White (1 0), Hispanic (0 1) and 1 1 being meaningless.
+
+
+
+ Authors: Nicolas Brouard (brouard@ined.fr) and Agnès Lièvre (lievre@ined.fr).
+ Institut national d'eÌtudes deÌmographiques, Paris.
+ This software have been partly granted by Euro-REVES, a concerted action
+ from the European Union.
+ It is copyrighted identically to a GNU software product, ie programme and
+ software can be distributed freely for non commercial use. Latest version
+ can be accessed at http://euroreves.ined.fr/imach .
+
+ Help to debug: LD_PRELOAD=/usr/local/lib/libnjamd.so ./imach foo.imach
+ or better on gdb : set env LD_PRELOAD=/usr/local/lib/libnjamd.so
+
+ **********************************************************************/
+/*
+ main
+ read parameterfile
+ read datafile
+ concatwav
+ freqsummary
+ if (mle >= 1)
+ mlikeli
+ print results files
+ if mle==1
+ computes hessian
+ read end of parameter file: agemin, agemax, bage, fage, estepm
+ begin-prev-date,...
+ open gnuplot file
+ open html file
+ period (stable) prevalence | pl_nom 1-1 2-2 etc by covariate
+ for age prevalim() | #****** V1=0 V2=1 V3=1 V4=0 ******
+ | 65 1 0 2 1 3 1 4 0 0.96326 0.03674
+ freexexit2 possible for memory heap.
+
+ h Pij x | pij_nom ficrestpij
+ # Cov Agex agex+h hpijx with i,j= 1-1 1-2 1-3 2-1 2-2 2-3
+ 1 85 85 1.00000 0.00000 0.00000 0.00000 1.00000 0.00000
+ 1 85 86 0.68299 0.22291 0.09410 0.71093 0.00000 0.28907
+
+ 1 65 99 0.00364 0.00322 0.99314 0.00350 0.00310 0.99340
+ 1 65 100 0.00214 0.00204 0.99581 0.00206 0.00196 0.99597
+ variance of p one-step probabilities varprob | prob_nom ficresprob #One-step probabilities and stand. devi in ()
+ Standard deviation of one-step probabilities | probcor_nom ficresprobcor #One-step probabilities and correlation matrix
+ Matrix of variance covariance of one-step probabilities | probcov_nom ficresprobcov #One-step probabilities and covariance matrix
+
+ forecasting if prevfcast==1 prevforecast call prevalence()
+ health expectancies
+ Variance-covariance of DFLE
+ prevalence()
+ movingaverage()
+ varevsij()
+ if popbased==1 varevsij(,popbased)
+ total life expectancies
+ Variance of period (stable) prevalence
+ end
+*/
+
+/* #define DEBUG */
+/* #define DEBUGBRENT */
+/* #define DEBUGLINMIN */
+/* #define DEBUGHESS */
+#define DEBUGHESSIJ
+/* #define LINMINORIGINAL /\* Don't use loop on scale in linmin (accepting nan) *\/ */
+#define POWELL /* Instead of NLOPT */
+#define POWELLNOF3INFF1TEST /* Skip test */
+/* #define POWELLORIGINAL /\* Don't use Directest to decide new direction but original Powell test *\/ */
+/* #define MNBRAKORIGINAL /\* Don't use mnbrak fix *\/ */
+/* #define FLATSUP *//* Suppresses directions where likelihood is flat */
+
+#include
+#include
+#include
+#include
+#include
+
+#ifdef _WIN32
+#include
+#include
+#include
+#else
+#include
+#endif
+
+#include
+#include
+
+#if defined(__GNUC__)
+#include /* Doesn't work on Windows */
+#endif
+
+#include
+#include
+/* extern int errno; */
+
+/* #ifdef LINUX */
+/* #include */
+/* #include "timeval.h" */
+/* #else */
+/* #include */
+/* #endif */
+
+#include
+
+#ifdef GSL
+#include
+#include
+#endif
+
+
+#ifdef NLOPT
+#include
+typedef struct {
+ double (* function)(double [] );
+} myfunc_data ;
+#endif
+
+/* #include */
+/* #define _(String) gettext (String) */
+
+#define MAXLINE 2048 /* Was 256 and 1024. Overflow with 312 with 2 states and 4 covariates. Should be ok */
+
+#define GNUPLOTPROGRAM "gnuplot"
+/*#define GNUPLOTPROGRAM "..\\gp37mgw\\wgnuplot"*/
+#define FILENAMELENGTH 132
+
+#define GLOCK_ERROR_NOPATH -1 /* empty path */
+#define GLOCK_ERROR_GETCWD -2 /* cannot get cwd */
+
+#define MAXPARM 128 /**< Maximum number of parameters for the optimization */
+#define NPARMAX 64 /**< (nlstate+ndeath-1)*nlstate*ncovmodel */
+
+#define NINTERVMAX 8
+#define NLSTATEMAX 8 /**< Maximum number of live states (for func) */
+#define NDEATHMAX 8 /**< Maximum number of dead states (for func) */
+#define NCOVMAX 30 /**< Maximum number of covariates used in the model, including generated covariates V1*V2 or V1*age */
+#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 */ /* Should by replaced by nobs, real number of observations and unlimited */
+#define YEARM 12. /**< Number of months per year */
+/* #define AGESUP 130 */
+/* #define AGESUP 150 */
+#define AGESUP 200
+#define AGEINF 0
+#define AGEMARGE 25 /* Marge for agemin and agemax for(iage=agemin-AGEMARGE; iage <= agemax+3+AGEMARGE; iage++) */
+#define AGEBASE 40
+#define AGEOVERFLOW 1.e20
+#define AGEGOMP 10 /**< Minimal age for Gompertz adjustment */
+#ifdef _WIN32
+#define DIRSEPARATOR '\\'
+#define CHARSEPARATOR "\\"
+#define ODIRSEPARATOR '/'
+#else
+#define DIRSEPARATOR '/'
+#define CHARSEPARATOR "/"
+#define ODIRSEPARATOR '\\'
+#endif
+
+/* $Id: imach.c,v 1.328 2022/07/27 17:40:48 brouard Exp $ */
+/* $State: Exp $ */
+#include "version.h"
+char version[]=__IMACH_VERSION__;
+char copyright[]="July 2022,INED-EUROREVES-Institut de longevite-Japan Society for the Promotion of Science (Grant-in-Aid for Scientific Research 25293121), Intel Software 2015-2020, Nihon University 2021-202, INED 2000-2022";
+char fullversion[]="$Revision: 1.328 $ $Date: 2022/07/27 17:40:48 $";
+char strstart[80];
+char optionfilext[10], optionfilefiname[FILENAMELENGTH];
+int erreur=0, nberr=0, nbwarn=0; /* Error number, number of errors number of warnings */
+int nagesqr=0, nforce=0; /* nagesqr=1 if model is including age*age, number of forces */
+/* Number of covariates model=V2+V1+ V3*age+V2*V4 */
+int cptcovn=0; /**< cptcovn number of covariates added in the model (excepting constant and age and age*product) */
+int cptcovt=0; /**< cptcovt number of covariates added in the model (excepting constant and age) */
+int cptcovs=0; /**< cptcovs number of simple covariates in the model V2+V1 =2 */
+int cptcovsnq=0; /**< cptcovsnq number of simple covariates in the model but non quantitative V2+V1 =2 */
+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 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 */
+int cptcov=0; /* Working variable */
+int nobs=10; /* Number of observations in the data lastobs-firstobs */
+int ncovcombmax=NCOVMAX; /* Maximum calculated number of covariate combination = pow(2, cptcoveff) */
+int npar=NPARMAX; /* Number of parameters (nlstate+ndeath-1)*nlstate*ncovmodel; */
+int nlstate=2; /* Number of live states */
+int ndeath=1; /* Number of dead states */
+int ncovmodel=0, ncovcol=0; /* Total number of covariables including constant a12*1 +b12*x ncovmodel=2 */
+int nqv=0, ntv=0, nqtv=0; /* Total number of quantitative variables, time variable (dummy), quantitative and time variable */
+int popbased=0;
+
+int *wav; /* Number of waves for this individuual 0 is possible */
+int maxwav=0; /* Maxim number of waves */
+int jmin=0, jmax=0; /* min, max spacing between 2 waves */
+int ijmin=0, ijmax=0; /* Individuals having jmin and jmax */
+int gipmx=0, gsw=0; /* Global variables on the number of contributions
+ to the likelihood and the sum of weights (done by funcone)*/
+int mle=1, weightopt=0;
+int **mw; /* mw[mi][i] is number of the mi wave for this individual */
+int **dh; /* dh[mi][i] is number of steps between mi,mi+1 for this individual */
+int **bh; /* bh[mi][i] is the bias (+ or -) for this individual if the delay between
+ * wave mi and wave mi+1 is not an exact multiple of stepm. */
+int countcallfunc=0; /* Count the number of calls to func */
+int selected(int kvar); /* Is covariate kvar selected for printing results */
+
+double jmean=1; /* Mean space between 2 waves */
+double **matprod2(); /* test */
+double **oldm, **newm, **savm; /* Working pointers to matrices */
+double **oldms, **newms, **savms; /* Fixed working pointers to matrices */
+double **ddnewms, **ddoldms, **ddsavms; /* for freeing later */
+
+/*FILE *fic ; */ /* Used in readdata only */
+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 */
+long ipmx=0; /* Number of contributions */
+double sw; /* Sum of weights */
+char filerespow[FILENAMELENGTH];
+char fileresilk[FILENAMELENGTH]; /* File of individual contributions to the likelihood */
+FILE *ficresilk;
+FILE *ficgp,*ficresprob,*ficpop, *ficresprobcov, *ficresprobcor;
+FILE *ficresprobmorprev;
+FILE *fichtm, *fichtmcov; /* Html File */
+FILE *ficreseij;
+char filerese[FILENAMELENGTH];
+FILE *ficresstdeij;
+char fileresstde[FILENAMELENGTH];
+FILE *ficrescveij;
+char filerescve[FILENAMELENGTH];
+FILE *ficresvij;
+char fileresv[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];
+char command[FILENAMELENGTH];
+int outcmd=0;
+
+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];
+char fileregp[FILENAMELENGTH];
+char popfile[FILENAMELENGTH];
+
+char optionfilegnuplot[FILENAMELENGTH], optionfilehtm[FILENAMELENGTH], optionfilehtmcov[FILENAMELENGTH] ;
+
+/* struct timeval start_time, end_time, curr_time, last_time, forecast_time; */
+/* struct timezone tzp; */
+/* extern int gettimeofday(); */
+struct tm tml, *gmtime(), *localtime();
+
+extern time_t time();
+
+struct tm start_time, end_time, curr_time, last_time, forecast_time;
+time_t rstart_time, rend_time, rcurr_time, rlast_time, rforecast_time; /* raw time */
+struct tm tm;
+
+char strcurr[80], strfor[80];
+
+char *endptr;
+long lval;
+double dval;
+
+#define NR_END 1
+#define FREE_ARG char*
+#define FTOL 1.0e-10
+
+#define NRANSI
+#define ITMAX 200
+#define ITPOWMAX 20 /* This is now multiplied by the number of parameters */
+
+#define TOL 2.0e-4
+
+#define CGOLD 0.3819660
+#define ZEPS 1.0e-10
+#define SHFT(a,b,c,d) (a)=(b);(b)=(c);(c)=(d);
+
+#define GOLD 1.618034
+#define GLIMIT 100.0
+#define TINY 1.0e-20
+
+static double maxarg1,maxarg2;
+#define FMAX(a,b) (maxarg1=(a),maxarg2=(b),(maxarg1)>(maxarg2)? (maxarg1):(maxarg2))
+#define FMIN(a,b) (maxarg1=(a),maxarg2=(b),(maxarg1)<(maxarg2)? (maxarg1):(maxarg2))
+
+#define SIGN(a,b) ((b)>0.0 ? fabs(a) : -fabs(a))
+#define rint(a) floor(a+0.5)
+/* http://www.thphys.uni-heidelberg.de/~robbers/cmbeasy/doc/html/myutils_8h-source.html */
+#define mytinydouble 1.0e-16
+/* #define DEQUAL(a,b) (fabs((a)-(b)) Tvar[1]= 2 */
+/* Some documentation */
+ /* Design original data
+ * V1 V2 V3 V4 V5 V6 V7 V8 Weight ddb ddth d1st s1 V9 V10 V11 V12 s2 V9 V10 V11 V12
+ * < ncovcol=6 > nqv=2 (V7 V8) dv dv dv qtv dv dv dvv qtv
+ * ntv=3 nqtv=1
+ * cptcovn number of covariates (not including constant and age) = # of + plus 1 = 10+1=11
+ * For time varying covariate, quanti or dummies
+ * cotqvar[wav][iv(1 to nqtv)][i]= [1][12][i]=(V12) quanti
+ * cotvar[wav][ntv+iv][i]= [3+(1 to nqtv)][i]=(V12) quanti
+ * cotvar[wav][iv(1 to ntv)][i]= [1][1][i]=(V9) dummies at wav 1
+ * cotvar[wav][iv(1 to ntv)][i]= [1][2][i]=(V10) dummies at wav 1
+ * covar[k,i], value of kth fixed covariate dummy or quanti :
+ * covar[1][i]= (V1), covar[4][i]=(V4), covar[8][i]=(V8)
+ * Model V2 + V1 + V3*age + V3 + V5*V6 + V7*V8 + V8*age + V8 + V9 + V9*age + V10
+ * k= 1 2 3 4 5 6 7 8 9 10 11
+ */
+/* According to the model, more columns can be added to covar by the product of covariates */
+/* ncovcol=1(Males=0 Females=1) nqv=1(raedyrs) ntv=2(withoutiadl=0 withiadl=1, witoutadl=0 withoutadl=1) nqtv=1(bmi) nlstate=3 ndeath=1
+ # States 1=Coresidence, 2 Living alone, 3 Institution
+ # V1=sex, V2=raedyrs Quant Fixed, State=livarnb4..livarnb11, V3=iadl4..iald11, V4=adlw4..adlw11, V5=r4bmi..r11bmi
+*/
+/* V5+V4+V3+V4*V3+V5*age+V2+V1*V2+V1*age+V1 */
+/* k 1 2 3 4 5 6 7 8 9 */
+/*Typevar[k]= 0 0 0 2 1 0 2 1 0 *//*0 for simple covariate (dummy, quantitative,*/
+ /* fixed or varying), 1 for age product, 2 for*/
+ /* product */
+/*Dummy[k]= 1 0 0 1 3 1 1 2 0 *//*Dummy[k] 0=dummy (0 1), 1 quantitative */
+ /*(single or product without age), 2 dummy*/
+ /* with age product, 3 quant with age product*/
+/*Tvar[k]= 5 4 3 6 5 2 7 1 1 */
+/* nsd 1 2 3 */ /* Counting single dummies covar fixed or tv */
+/*TvarsD[nsd] 4 3 1 */ /* ID of single dummy cova fixed or timevary*/
+/*TvarsDind[k] 2 3 9 */ /* position K of single dummy cova */
+/* nsq 1 2 */ /* Counting single quantit tv */
+/* TvarsQ[k] 5 2 */ /* Number of single quantitative cova */
+/* TvarsQind 1 6 */ /* position K of single quantitative cova */
+/* Tprod[i]=k 1 2 */ /* Position in model of the ith prod without age */
+/* cptcovage 1 2 */ /* Counting cov*age in the model equation */
+/* Tage[cptcovage]=k 5 8 */ /* Position in the model of ith cov*age */
+/* Tvard[1][1]@4={4,3,1,2} V4*V3 V1*V2 */ /* Position in model of the ith prod without age */
+/* TvarF TvarF[1]=Tvar[6]=2, TvarF[2]=Tvar[7]=7, TvarF[3]=Tvar[9]=1 ID of fixed covariates or product V2, V1*V2, V1 */
+/* TvarFind; TvarFind[1]=6, TvarFind[2]=7, TvarFind[3]=9 *//* Inverse V2(6) is first fixed (single or prod) */
+/* 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 MAXRESULTLINESPONE 10+1
+int nresult=0;
+int parameterline=0; /* # of the parameter (type) line */
+int TKresult[MAXRESULTLINESPONE];
+int Tresult[MAXRESULTLINESPONE][NCOVMAX];/* For dummy variable , value (output) */
+int Tinvresult[MAXRESULTLINESPONE][NCOVMAX];/* For dummy variable , value (output) */
+int Tvresult[MAXRESULTLINESPONE][NCOVMAX]; /* For dummy variable , variable # (output) */
+double Tqresult[MAXRESULTLINESPONE][NCOVMAX]; /* For quantitative variable , value (output) */
+double Tqinvresult[MAXRESULTLINESPONE][NCOVMAX]; /* For quantitative variable , value (output) */
+int Tvqresult[MAXRESULTLINESPONE][NCOVMAX]; /* For quantitative variable , variable # (output) */
+
+/* ncovcol=1(Males=0 Females=1) nqv=1(raedyrs) ntv=2(withoutiadl=0 withiadl=1, witoutadl=0 withoutadl=1) nqtv=1(bmi) nlstate=3 ndeath=1
+ # States 1=Coresidence, 2 Living alone, 3 Institution
+ # V1=sex, V2=raedyrs Quant Fixed, State=livarnb4..livarnb11, V3=iadl4..iald11, V4=adlw4..adlw11, V5=r4bmi..r11bmi
+*/
+/* 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 */
+int *TvarFQind; /* TvarFQind[1]=6 in V5+V4+V3+V4*V3+V5*age+V2+V1*V2+V1*age+V1 */ /* Only simple fixed quantitative variable */
+int *TvarVD; /* TvarVD[1]=V5 in V5+V4+V3+V4*V3+V5*age+V2+V1*V2+V1*age+V1 */ /* Only simple fixed quantitative variable */
+int *TvarVDind; /* TvarVDind[1]=1 in V5+V4+V3+V4*V3+V5*age+V2+V1*V2+V1*age+V1 */ /* Only simple fixed quantitative variable */
+int *TvarVQ; /* TvarVQ[1]=V5 in V5+V4+V3+V4*V3+V5*age+V2+V1*V2+V1*age+V1 */ /* Only simple time varying quantitative variable */
+int *TvarVQind; /* TvarVQind[1]=1 in V5+V4+V3+V4*V3+V5*age+V2+V1*V2+V1*age+V1 */ /* Only simple time varying quantitative variable */
+
+int *Tvarsel; /**< Selected covariates for output */
+double *Tvalsel; /**< Selected modality value of covariate for output */
+int *Typevar; /**< 0 for simple covariate (dummy, quantitative, fixed or varying), 1 for age product, 2 for product */
+int *Fixed; /** Fixed[k] 0=fixed, 1 varying, 2 fixed with age product, 3 varying with age product */
+int *Dummy; /** Dummy[k] 0=dummy (0 1), 1 quantitative (single or product without age), 2 dummy with age product, 3 quant with age product */
+int *DummyV; /** Dummy[v] 0=dummy (0 1), 1 quantitative */
+int *FixedV; /** FixedV[v] 0 fixed, 1 varying */
+int *Tage;
+int anyvaryingduminmodel=0; /**< Any varying dummy in Model=1 yes, 0 no, to avoid a loop on waves in freq */
+int *Tmodelind; /** Tmodelind[Tvaraff[3]]=9 for V1 position,Tvaraff[1]@9={4, 3, 1, 0, 0, 0, 0, 0, 0}, model=V5+V4+V3+V4*V3+V5*age+V2+V1*V2+V1*age+V1*/
+int *TmodelInvind; /** Tmodelind[Tvaraff[3]]=9 for V1 position,Tvaraff[1]@9={4, 3, 1, 0, 0, 0, 0, 0, 0}, model=V5+V4+V3+V4*V3+V5*age+V2+V1*V2+V1*age+V1*/
+int *TmodelInvQind; /** Tmodelqind[1]=1 for V5(quantitative varying) position,Tvaraff[1]@9={4, 3, 1, 0, 0, 0, 0, 0, 0}, model=V5+V4+V3+V4*V3+V5*age+V2+V1*V2+V1*age+V1 */
+int *Ndum; /** Freq of modality (tricode */
+/* int **codtab;*/ /**< codtab=imatrix(1,100,1,10); */
+int **Tvard;
+int *Tprod;/**< Gives the k position of the k1 product */
+/* Tprod[k1=1]=3(=V1*V4) for V2+V1+V1*V4+age*V3 */
+int *Tposprod; /**< Gives the k1 product from the k position */
+ /* if V2+V1+V1*V4+age*V3+V3*V2 TProd[k1=2]=5 (V3*V2) */
+ /* Tposprod[k]=k1 , Tposprod[3]=1, Tposprod[5(V3*V2)]=2 (2nd product without age) */
+int cptcovprod, *Tvaraff, *invalidvarcomb;
+double *lsurv, *lpop, *tpop;
+
+#define FD 1; /* Fixed dummy covariate */
+#define FQ 2; /* Fixed quantitative covariate */
+#define FP 3; /* Fixed product covariate */
+#define FPDD 7; /* Fixed product dummy*dummy covariate */
+#define FPDQ 8; /* Fixed product dummy*quantitative covariate */
+#define FPQQ 9; /* Fixed product quantitative*quantitative covariate */
+#define VD 10; /* Varying dummy covariate */
+#define VQ 11; /* Varying quantitative covariate */
+#define VP 12; /* Varying product covariate */
+#define VPDD 13; /* Varying product dummy*dummy covariate */
+#define VPDQ 14; /* Varying product dummy*quantitative covariate */
+#define VPQQ 15; /* Varying product quantitative*quantitative covariate */
+#define APFD 16; /* Age product * fixed dummy covariate */
+#define APFQ 17; /* Age product * fixed quantitative covariate */
+#define APVD 18; /* Age product * varying dummy covariate */
+#define APVQ 19; /* Age product * varying quantitative covariate */
+
+#define FTYPE 1; /* Fixed covariate */
+#define VTYPE 2; /* Varying covariate (loop in wave) */
+#define ATYPE 2; /* Age product covariate (loop in dh within wave)*/
+
+struct kmodel{
+ int maintype; /* main type */
+ int subtype; /* subtype */
+};
+struct kmodel modell[NCOVMAX];
+
+double ftol=FTOL; /**< Tolerance for computing Max Likelihood */
+double ftolhess; /**< Tolerance for computing hessian */
+
+/**************** split *************************/
+static int split( char *path, char *dirc, char *name, char *ext, char *finame )
+{
+ /* From a file name with (full) path (either Unix or Windows) we extract the directory (dirc)
+ the name of the file (name), its extension only (ext) and its first part of the name (finame)
+ */
+ char *ss; /* pointer */
+ int l1=0, l2=0; /* length counters */
+
+ l1 = strlen(path ); /* length of path */
+ if ( l1 == 0 ) return( GLOCK_ERROR_NOPATH );
+ ss= strrchr( path, DIRSEPARATOR ); /* find last / */
+ if ( ss == NULL ) { /* no directory, so determine current directory */
+ strcpy( name, path ); /* we got the fullname name because no directory */
+ /*if(strrchr(path, ODIRSEPARATOR )==NULL)
+ printf("Warning you should use %s as a separator\n",DIRSEPARATOR);*/
+ /* get current working directory */
+ /* extern char* getcwd ( char *buf , int len);*/
+#ifdef WIN32
+ if (_getcwd( dirc, FILENAME_MAX ) == NULL ) {
+#else
+ if (getcwd(dirc, FILENAME_MAX) == NULL) {
+#endif
+ return( GLOCK_ERROR_GETCWD );
+ }
+ /* got dirc from getcwd*/
+ printf(" DIRC = %s \n",dirc);
+ } else { /* strip directory from path */
+ ss++; /* after this, the filename */
+ l2 = strlen( ss ); /* length of filename */
+ if ( l2 == 0 ) return( GLOCK_ERROR_NOPATH );
+ strcpy( name, ss ); /* save file name */
+ strncpy( dirc, path, l1 - l2 ); /* now the directory */
+ dirc[l1-l2] = '\0'; /* add zero */
+ printf(" DIRC2 = %s \n",dirc);
+ }
+ /* We add a separator at the end of dirc if not exists */
+ l1 = strlen( dirc ); /* length of directory */
+ if( dirc[l1-1] != DIRSEPARATOR ){
+ dirc[l1] = DIRSEPARATOR;
+ dirc[l1+1] = 0;
+ printf(" DIRC3 = %s \n",dirc);
+ }
+ ss = strrchr( name, '.' ); /* find last / */
+ if (ss >0){
+ ss++;
+ strcpy(ext,ss); /* save extension */
+ l1= strlen( name);
+ l2= strlen(ss)+1;
+ strncpy( finame, name, l1-l2);
+ finame[l1-l2]= 0;
+ }
+
+ return( 0 ); /* we're done */
+}
+
+
+/******************************************/
+
+void replace_back_to_slash(char *s, char*t)
+{
+ int i;
+ int lg=0;
+ i=0;
+ lg=strlen(t);
+ for(i=0; i<= lg; i++) {
+ (s[i] = t[i]);
+ if (t[i]== '\\') s[i]='/';
+ }
+}
+
+char *trimbb(char *out, char *in)
+{ /* Trim multiple blanks in line but keeps first blanks if line starts with blanks */
+ char *s;
+ s=out;
+ while (*in != '\0'){
+ while( *in == ' ' && *(in+1) == ' '){ /* && *(in+1) != '\0'){*/
+ in++;
+ }
+ *out++ = *in++;
+ }
+ *out='\0';
+ return s;
+}
+
+/* char *substrchaine(char *out, char *in, char *chain) */
+/* { */
+/* /\* Substract chain 'chain' from 'in', return and output 'out' *\/ */
+/* char *s, *t; */
+/* t=in;s=out; */
+/* while ((*in != *chain) && (*in != '\0')){ */
+/* *out++ = *in++; */
+/* } */
+
+/* /\* *in matches *chain *\/ */
+/* while ((*in++ == *chain++) && (*in != '\0')){ */
+/* printf("*in = %c, *out= %c *chain= %c \n", *in, *out, *chain); */
+/* } */
+/* in--; chain--; */
+/* while ( (*in != '\0')){ */
+/* printf("Bef *in = %c, *out= %c *chain= %c \n", *in, *out, *chain); */
+/* *out++ = *in++; */
+/* printf("Aft *in = %c, *out= %c *chain= %c \n", *in, *out, *chain); */
+/* } */
+/* *out='\0'; */
+/* out=s; */
+/* return out; */
+/* } */
+char *substrchaine(char *out, char *in, char *chain)
+{
+ /* Substract chain 'chain' from 'in', return and output 'out' */
+ /* in="V1+V1*age+age*age+V2", chain="age*age" */
+
+ char *strloc;
+
+ strcpy (out, in);
+ strloc = strstr(out, chain); /* strloc points to out at age*age+V2 */
+ printf("Bef strloc=%s chain=%s out=%s \n", strloc, chain, out);
+ if(strloc != NULL){
+ /* will affect out */ /* strloc+strlenc(chain)=+V2 */ /* Will also work in Unicode */
+ memmove(strloc,strloc+strlen(chain), strlen(strloc+strlen(chain))+1);
+ /* strcpy (strloc, strloc +strlen(chain));*/
+ }
+ printf("Aft strloc=%s chain=%s in=%s out=%s \n", strloc, chain, in, out);
+ return out;
+}
+
+
+char *cutl(char *blocc, char *alocc, char *in, char occ)
+{
+ /* cuts string in into blocc and alocc where blocc ends before FIRST occurence of char 'occ'
+ and alocc starts after first occurence of char 'occ' : ex cutv(blocc,alocc,"abcdef2ghi2j",'2')
+ gives alocc="abcdef" and blocc="ghi2j".
+ If occ is not found blocc is null and alocc is equal to in. Returns blocc
+ */
+ char *s, *t;
+ t=in;s=in;
+ while ((*in != occ) && (*in != '\0')){
+ *alocc++ = *in++;
+ }
+ if( *in == occ){
+ *(alocc)='\0';
+ s=++in;
+ }
+
+ if (s == t) {/* occ not found */
+ *(alocc-(in-s))='\0';
+ in=s;
+ }
+ while ( *in != '\0'){
+ *blocc++ = *in++;
+ }
+
+ *blocc='\0';
+ return t;
+}
+char *cutv(char *blocc, char *alocc, char *in, char occ)
+{
+ /* cuts string in into blocc and alocc where blocc ends before LAST occurence of char 'occ'
+ and alocc starts after last occurence of char 'occ' : ex cutv(blocc,alocc,"abcdef2ghi2j",'2')
+ gives blocc="abcdef2ghi" and alocc="j".
+ If occ is not found blocc is null and alocc is equal to in. Returns alocc
+ */
+ char *s, *t;
+ t=in;s=in;
+ while (*in != '\0'){
+ while( *in == occ){
+ *blocc++ = *in++;
+ s=in;
+ }
+ *blocc++ = *in++;
+ }
+ if (s == t) /* occ not found */
+ *(blocc-(in-s))='\0';
+ else
+ *(blocc-(in-s)-1)='\0';
+ in=s;
+ while ( *in != '\0'){
+ *alocc++ = *in++;
+ }
+
+ *alocc='\0';
+ return s;
+}
+
+int nbocc(char *s, char occ)
+{
+ int i,j=0;
+ int lg=20;
+ i=0;
+ lg=strlen(s);
+ for(i=0; i<= lg; i++) {
+ if (s[i] == occ ) j++;
+ }
+ return j;
+}
+
+/* void cutv(char *u,char *v, char*t, char occ) */
+/* { */
+/* /\* cuts string t into u and v where u ends before last occurence of char 'occ' */
+/* and v starts after last occurence of char 'occ' : ex cutv(u,v,"abcdef2ghi2j",'2') */
+/* gives u="abcdef2ghi" and v="j" *\/ */
+/* int i,lg,j,p=0; */
+/* i=0; */
+/* lg=strlen(t); */
+/* for(j=0; j<=lg-1; j++) { */
+/* if((t[j]!= occ) && (t[j+1]== occ)) p=j+1; */
+/* } */
+
+/* for(j=0; j=(p+1))(v[j-p-1] = t[j]); */
+/* } */
+/* } */
+
+#ifdef _WIN32
+char * strsep(char **pp, const char *delim)
+{
+ char *p, *q;
+
+ if ((p = *pp) == NULL)
+ return 0;
+ if ((q = strpbrk (p, delim)) != NULL)
+ {
+ *pp = q + 1;
+ *q = '\0';
+ }
+ else
+ *pp = 0;
+ return p;
+}
+#endif
+
+/********************** nrerror ********************/
+
+void nrerror(char error_text[])
+{
+ fprintf(stderr,"ERREUR ...\n");
+ fprintf(stderr,"%s\n",error_text);
+ exit(EXIT_FAILURE);
+}
+/*********************** vector *******************/
+double *vector(int nl, int nh)
+{
+ double *v;
+ v=(double *) malloc((size_t)((nh-nl+1+NR_END)*sizeof(double)));
+ if (!v) nrerror("allocation failure in vector");
+ return v-nl+NR_END;
+}
+
+/************************ free vector ******************/
+void free_vector(double*v, int nl, int nh)
+{
+ free((FREE_ARG)(v+nl-NR_END));
+}
+
+/************************ivector *******************************/
+int *ivector(long nl,long nh)
+{
+ int *v;
+ v=(int *) malloc((size_t)((nh-nl+1+NR_END)*sizeof(int)));
+ if (!v) nrerror("allocation failure in ivector");
+ return v-nl+NR_END;
+}
+
+/******************free ivector **************************/
+void free_ivector(int *v, long nl, long nh)
+{
+ free((FREE_ARG)(v+nl-NR_END));
+}
+
+/************************lvector *******************************/
+long *lvector(long nl,long nh)
+{
+ long *v;
+ v=(long *) malloc((size_t)((nh-nl+1+NR_END)*sizeof(long)));
+ if (!v) nrerror("allocation failure in ivector");
+ return v-nl+NR_END;
+}
+
+/******************free lvector **************************/
+void free_lvector(long *v, long nl, long nh)
+{
+ free((FREE_ARG)(v+nl-NR_END));
+}
+
+/******************* imatrix *******************************/
+int **imatrix(long nrl, long nrh, long ncl, long nch)
+ /* allocate a int matrix with subscript range m[nrl..nrh][ncl..nch] */
+{
+ long i, nrow=nrh-nrl+1,ncol=nch-ncl+1;
+ int **m;
+
+ /* allocate pointers to rows */
+ m=(int **) malloc((size_t)((nrow+NR_END)*sizeof(int*)));
+ if (!m) nrerror("allocation failure 1 in matrix()");
+ m += NR_END;
+ m -= nrl;
+
+
+ /* allocate rows and set pointers to them */
+ m[nrl]=(int *) malloc((size_t)((nrow*ncol+NR_END)*sizeof(int)));
+ if (!m[nrl]) nrerror("allocation failure 2 in matrix()");
+ m[nrl] += NR_END;
+ m[nrl] -= ncl;
+
+ for(i=nrl+1;i<=nrh;i++) m[i]=m[i-1]+ncol;
+
+ /* return pointer to array of pointers to rows */
+ return m;
+}
+
+/****************** free_imatrix *************************/
+void free_imatrix(m,nrl,nrh,ncl,nch)
+ int **m;
+ long nch,ncl,nrh,nrl;
+ /* free an int matrix allocated by imatrix() */
+{
+ free((FREE_ARG) (m[nrl]+ncl-NR_END));
+ free((FREE_ARG) (m+nrl-NR_END));
+}
+
+/******************* matrix *******************************/
+double **matrix(long nrl, long nrh, long ncl, long nch)
+{
+ long i, nrow=nrh-nrl+1, ncol=nch-ncl+1;
+ double **m;
+
+ m=(double **) malloc((size_t)((nrow+NR_END)*sizeof(double*)));
+ if (!m) nrerror("allocation failure 1 in matrix()");
+ m += NR_END;
+ m -= nrl;
+
+ m[nrl]=(double *) malloc((size_t)((nrow*ncol+NR_END)*sizeof(double)));
+ if (!m[nrl]) nrerror("allocation failure 2 in matrix()");
+ m[nrl] += NR_END;
+ m[nrl] -= ncl;
+
+ for (i=nrl+1; i<=nrh; i++) m[i]=m[i-1]+ncol;
+ return m;
+ /* print *(*(m+1)+70) or print m[1][70]; print m+1 or print &(m[1]) or &(m[1][0])
+m[i] = address of ith row of the table. &(m[i]) is its value which is another adress
+that of m[i][0]. In order to get the value p m[i][0] but it is unitialized.
+ */
+}
+
+/*************************free matrix ************************/
+void free_matrix(double **m, long nrl, long nrh, long ncl, long nch)
+{
+ free((FREE_ARG)(m[nrl]+ncl-NR_END));
+ free((FREE_ARG)(m+nrl-NR_END));
+}
+
+/******************* ma3x *******************************/
+double ***ma3x(long nrl, long nrh, long ncl, long nch, long nll, long nlh)
+{
+ long i, j, nrow=nrh-nrl+1, ncol=nch-ncl+1, nlay=nlh-nll+1;
+ double ***m;
+
+ m=(double ***) malloc((size_t)((nrow+NR_END)*sizeof(double*)));
+ if (!m) nrerror("allocation failure 1 in matrix()");
+ m += NR_END;
+ m -= nrl;
+
+ m[nrl]=(double **) malloc((size_t)((nrow*ncol+NR_END)*sizeof(double)));
+ if (!m[nrl]) nrerror("allocation failure 2 in matrix()");
+ m[nrl] += NR_END;
+ m[nrl] -= ncl;
+
+ for (i=nrl+1; i<=nrh; i++) m[i]=m[i-1]+ncol;
+
+ m[nrl][ncl]=(double *) malloc((size_t)((nrow*ncol*nlay+NR_END)*sizeof(double)));
+ if (!m[nrl][ncl]) nrerror("allocation failure 3 in matrix()");
+ m[nrl][ncl] += NR_END;
+ m[nrl][ncl] -= nll;
+ for (j=ncl+1; j<=nch; j++)
+ m[nrl][j]=m[nrl][j-1]+nlay;
+
+ for (i=nrl+1; i<=nrh; i++) {
+ m[i][ncl]=m[i-1l][ncl]+ncol*nlay;
+ for (j=ncl+1; j<=nch; j++)
+ m[i][j]=m[i][j-1]+nlay;
+ }
+ return m;
+ /* gdb: p *(m+1) <=> p m[1] and p (m+1) <=> p (m+1) <=> p &(m[1])
+ &(m[i][j][k]) <=> *((*(m+i) + j)+k)
+ */
+}
+
+/*************************free ma3x ************************/
+void free_ma3x(double ***m, long nrl, long nrh, long ncl, long nch,long nll, long nlh)
+{
+ free((FREE_ARG)(m[nrl][ncl]+ nll-NR_END));
+ free((FREE_ARG)(m[nrl]+ncl-NR_END));
+ free((FREE_ARG)(m+nrl-NR_END));
+}
+
+/*************** function subdirf ***********/
+char *subdirf(char fileres[])
+{
+ /* Caution optionfilefiname is hidden */
+ strcpy(tmpout,optionfilefiname);
+ strcat(tmpout,"/"); /* Add to the right */
+ strcat(tmpout,fileres);
+ return tmpout;
+}
+
+/*************** function subdirf2 ***********/
+char *subdirf2(char fileres[], char *preop)
+{
+ /* Example subdirf2(optionfilefiname,"FB_") with optionfilefiname="texte", result="texte/FB_texte"
+ Errors in subdirf, 2, 3 while printing tmpout is
+ rewritten within the same printf. Workaround: many printfs */
+ /* Caution optionfilefiname is hidden */
+ strcpy(tmpout,optionfilefiname);
+ strcat(tmpout,"/");
+ strcat(tmpout,preop);
+ strcat(tmpout,fileres);
+ return tmpout;
+}
+
+/*************** function subdirf3 ***********/
+char *subdirf3(char fileres[], char *preop, char *preop2)
+{
+
+ /* Caution optionfilefiname is hidden */
+ strcpy(tmpout,optionfilefiname);
+ strcat(tmpout,"/");
+ strcat(tmpout,preop);
+ strcat(tmpout,preop2);
+ strcat(tmpout,fileres);
+ return tmpout;
+}
+
+/*************** 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;
+ days = (time_sec) / (60*60*24);
+ sec_left = (time_sec) % (60*60*24);
+ hours = (sec_left) / (60*60) ;
+ sec_left = (sec_left) %(60*60);
+ minutes = (sec_left) /60;
+ sec_left = (sec_left) % (60);
+ sprintf(ascdiff,"%ld day(s) %ld hour(s) %ld minute(s) %ld second(s)",days, hours, minutes, sec_left);
+ return ascdiff;
+}
+
+/***************** f1dim *************************/
+extern int ncom;
+extern double *pcom,*xicom;
+extern double (*nrfunc)(double []);
+
+double f1dim(double x)
+{
+ int j;
+ double f;
+ double *xt;
+
+ xt=vector(1,ncom);
+ for (j=1;j<=ncom;j++) xt[j]=pcom[j]+x*xicom[j];
+ f=(*nrfunc)(xt);
+ free_vector(xt,1,ncom);
+ return f;
+}
+
+/*****************brent *************************/
+double brent(double ax, double bx, double cx, double (*f)(double), double tol, double *xmin)
+{
+ /* Given a function f, and given a bracketing triplet of abscissas ax, bx, cx (such that bx is
+ * between ax and cx, and f(bx) is less than both f(ax) and f(cx) ), this routine isolates
+ * the minimum to a fractional precision of about tol using Brent’s method. The abscissa of
+ * the minimum is returned as xmin, and the minimum function value is returned as brent , the
+ * returned function value.
+ */
+ int iter;
+ double a,b,d,etemp;
+ double fu=0,fv,fw,fx;
+ double ftemp=0.;
+ double p,q,r,tol1,tol2,u,v,w,x,xm;
+ double e=0.0;
+
+ a=(ax < cx ? ax : cx);
+ b=(ax > cx ? ax : cx);
+ x=w=v=bx;
+ fw=fv=fx=(*f)(x);
+ for (iter=1;iter<=ITMAX;iter++) {
+ xm=0.5*(a+b);
+ tol2=2.0*(tol1=tol*fabs(x)+ZEPS);
+ /* if (2.0*fabs(fp-(*fret)) <= ftol*(fabs(fp)+fabs(*fret)))*/
+ printf(".");fflush(stdout);
+ fprintf(ficlog,".");fflush(ficlog);
+#ifdef DEBUGBRENT
+ printf("br %d,x=%.10e xm=%.10e b=%.10e a=%.10e tol=%.10e tol1=%.10e tol2=%.10e x-xm=%.10e fx=%.12e fu=%.12e,fw=%.12e,ftemp=%.12e,ftol=%.12e\n",iter,x,xm,b,a,tol,tol1,tol2,(x-xm),fx,fu,fw,ftemp,ftol);
+ fprintf(ficlog,"br %d,x=%.10e xm=%.10e b=%.10e a=%.10e tol=%.10e tol1=%.10e tol2=%.10e x-xm=%.10e fx=%.12e fu=%.12e,fw=%.12e,ftemp=%.12e,ftol=%.12e\n",iter,x,xm,b,a,tol,tol1,tol2,(x-xm),fx,fu,fw,ftemp,ftol);
+ /* if ((fabs(x-xm) <= (tol2-0.5*(b-a)))||(2.0*fabs(fu-ftemp) <= ftol*1.e-2*(fabs(fu)+fabs(ftemp)))) { */
+#endif
+ if (fabs(x-xm) <= (tol2-0.5*(b-a))){
+ *xmin=x;
+ return fx;
+ }
+ ftemp=fu;
+ if (fabs(e) > tol1) {
+ r=(x-w)*(fx-fv);
+ q=(x-v)*(fx-fw);
+ p=(x-v)*q-(x-w)*r;
+ q=2.0*(q-r);
+ if (q > 0.0) p = -p;
+ q=fabs(q);
+ etemp=e;
+ e=d;
+ if (fabs(p) >= fabs(0.5*q*etemp) || p <= q*(a-x) || p >= q*(b-x))
+ d=CGOLD*(e=(x >= xm ? a-x : b-x));
+ else {
+ d=p/q;
+ u=x+d;
+ if (u-a < tol2 || b-u < tol2)
+ d=SIGN(tol1,xm-x);
+ }
+ } else {
+ d=CGOLD*(e=(x >= xm ? a-x : b-x));
+ }
+ u=(fabs(d) >= tol1 ? x+d : x+SIGN(tol1,d));
+ fu=(*f)(u);
+ if (fu <= fx) {
+ if (u >= x) a=x; else b=x;
+ SHFT(v,w,x,u)
+ SHFT(fv,fw,fx,fu)
+ } else {
+ if (u < x) a=u; else b=u;
+ if (fu <= fw || w == x) {
+ v=w;
+ w=u;
+ fv=fw;
+ fw=fu;
+ } else if (fu <= fv || v == x || v == w) {
+ v=u;
+ fv=fu;
+ }
+ }
+ }
+ nrerror("Too many iterations in brent");
+ *xmin=x;
+ return fx;
+}
+
+/****************** mnbrak ***********************/
+
+void mnbrak(double *ax, double *bx, double *cx, double *fa, double *fb, double *fc,
+ double (*func)(double))
+{ /* Given a function func , and given distinct initial points ax and bx , this routine searches in
+the downhill direction (defined by the function as evaluated at the initial points) and returns
+new points ax , bx , cx that bracket a minimum of the function. Also returned are the function
+values at the three points, fa, fb , and fc such that fa > fb and fb < fc.
+ */
+ double ulim,u,r,q, dum;
+ double fu;
+
+ double scale=10.;
+ int iterscale=0;
+
+ *fa=(*func)(*ax); /* xta[j]=pcom[j]+(*ax)*xicom[j]; fa=f(xta[j])*/
+ *fb=(*func)(*bx); /* xtb[j]=pcom[j]+(*bx)*xicom[j]; fb=f(xtb[j]) */
+
+
+ /* while(*fb != *fb){ /\* *ax should be ok, reducing distance to *ax *\/ */
+ /* printf("Warning mnbrak *fb = %lf, *bx=%lf *ax=%lf *fa==%lf iter=%d\n",*fb, *bx, *ax, *fa, iterscale++); */
+ /* *bx = *ax - (*ax - *bx)/scale; */
+ /* *fb=(*func)(*bx); /\* xtb[j]=pcom[j]+(*bx)*xicom[j]; fb=f(xtb[j]) *\/ */
+ /* } */
+
+ if (*fb > *fa) {
+ SHFT(dum,*ax,*bx,dum)
+ SHFT(dum,*fb,*fa,dum)
+ }
+ *cx=(*bx)+GOLD*(*bx-*ax);
+ *fc=(*func)(*cx);
+#ifdef DEBUG
+ printf("mnbrak0 a=%lf *fa=%lf, b=%lf *fb=%lf, c=%lf *fc=%lf\n",*ax,*fa,*bx,*fb,*cx, *fc);
+ fprintf(ficlog,"mnbrak0 a=%lf *fa=%lf, b=%lf *fb=%lf, c=%lf *fc=%lf\n",*ax,*fa,*bx,*fb,*cx, *fc);
+#endif
+ while (*fb > *fc) { /* Declining a,b,c with fa> fb > fc. If fc=inf it exits and if flat fb=fc it exits too.*/
+ r=(*bx-*ax)*(*fb-*fc);
+ q=(*bx-*cx)*(*fb-*fa); /* What if fa=inf */
+ u=(*bx)-((*bx-*cx)*q-(*bx-*ax)*r)/
+ (2.0*SIGN(FMAX(fabs(q-r),TINY),q-r)); /* Minimum abscissa of a parabolic estimated from (a,fa), (b,fb) and (c,fc). */
+ ulim=(*bx)+GLIMIT*(*cx-*bx); /* Maximum abscissa where function should be evaluated */
+ if ((*bx-u)*(u-*cx) > 0.0) { /* if u_p is between b and c */
+ fu=(*func)(u);
+#ifdef DEBUG
+ /* f(x)=A(x-u)**2+f(u) */
+ double A, fparabu;
+ A= (*fb - *fa)/(*bx-*ax)/(*bx+*ax-2*u);
+ fparabu= *fa - A*(*ax-u)*(*ax-u);
+ printf("\nmnbrak (*ax=%.12f, *fa=%.12lf), (*bx=%.12f, *fb=%.12lf), (*cx=%.12f, *fc=%.12lf), (*u=%.12f, fu=%.12lf, fparabu=%.12f, q=%lf < %lf=r)\n",*ax,*fa,*bx,*fb,*cx,*fc,u,fu, fparabu,q,r);
+ fprintf(ficlog,"\nmnbrak (*ax=%.12f, *fa=%.12lf), (*bx=%.12f, *fb=%.12lf), (*cx=%.12f, *fc=%.12lf), (*u=%.12f, fu=%.12lf, fparabu=%.12f, q=%lf < %lf=r)\n",*ax,*fa,*bx,*fb,*cx,*fc,u,fu, fparabu,q,r);
+ /* And thus,it can be that fu > *fc even if fparabu < *fc */
+ /* mnbrak (*ax=7.666299858533, *fa=299039.693133272231), (*bx=8.595447774979, *fb=298976.598289369489),
+ (*cx=10.098840694817, *fc=298946.631474258087), (*u=9.852501168332, fu=298948.773013752128, fparabu=298945.434711494134) */
+ /* In that case, there is no bracket in the output! Routine is wrong with many consequences.*/
+#endif
+#ifdef MNBRAKORIGINAL
+#else
+/* if (fu > *fc) { */
+/* #ifdef DEBUG */
+/* printf("mnbrak4 fu > fc \n"); */
+/* fprintf(ficlog, "mnbrak4 fu > fc\n"); */
+/* #endif */
+/* /\* SHFT(u,*cx,*cx,u) /\\* ie a=c, c=u and u=c; in that case, next SHFT(a,b,c,u) will give a=b=b, b=c=u, c=u=c and *\\/ *\/ */
+/* /\* SHFT(*fa,*fc,fu,*fc) /\\* (b, u, c) is a bracket while test fb > fc will be fu > fc will exit *\\/ *\/ */
+/* dum=u; /\* Shifting c and u *\/ */
+/* u = *cx; */
+/* *cx = dum; */
+/* dum = fu; */
+/* fu = *fc; */
+/* *fc =dum; */
+/* } else { /\* end *\/ */
+/* #ifdef DEBUG */
+/* printf("mnbrak3 fu < fc \n"); */
+/* fprintf(ficlog, "mnbrak3 fu < fc\n"); */
+/* #endif */
+/* dum=u; /\* Shifting c and u *\/ */
+/* u = *cx; */
+/* *cx = dum; */
+/* dum = fu; */
+/* fu = *fc; */
+/* *fc =dum; */
+/* } */
+#ifdef DEBUGMNBRAK
+ double A, fparabu;
+ A= (*fb - *fa)/(*bx-*ax)/(*bx+*ax-2*u);
+ fparabu= *fa - A*(*ax-u)*(*ax-u);
+ printf("\nmnbrak35 ax=%lf fa=%lf bx=%lf fb=%lf, u=%lf fp=%lf fu=%lf < or >= fc=%lf cx=%lf, q=%lf < %lf=r \n",*ax, *fa, *bx,*fb,u,fparabu,fu,*fc,*cx,q,r);
+ fprintf(ficlog,"\nmnbrak35 ax=%lf fa=%lf bx=%lf fb=%lf, u=%lf fp=%lf fu=%lf < or >= fc=%lf cx=%lf, q=%lf < %lf=r \n",*ax, *fa, *bx,*fb,u,fparabu,fu,*fc,*cx,q,r);
+#endif
+ dum=u; /* Shifting c and u */
+ u = *cx;
+ *cx = dum;
+ dum = fu;
+ fu = *fc;
+ *fc =dum;
+#endif
+ } else if ((*cx-u)*(u-ulim) > 0.0) { /* u is after c but before ulim */
+#ifdef DEBUG
+ printf("\nmnbrak2 u=%lf after c=%lf but before ulim\n",u,*cx);
+ fprintf(ficlog,"\nmnbrak2 u=%lf after c=%lf but before ulim\n",u,*cx);
+#endif
+ fu=(*func)(u);
+ if (fu < *fc) {
+#ifdef DEBUG
+ printf("\nmnbrak2 u=%lf after c=%lf but before ulim=%lf AND fu=%lf < %lf=fc\n",u,*cx,ulim,fu, *fc);
+ fprintf(ficlog,"\nmnbrak2 u=%lf after c=%lf but before ulim=%lf AND fu=%lf < %lf=fc\n",u,*cx,ulim,fu, *fc);
+#endif
+ SHFT(*bx,*cx,u,*cx+GOLD*(*cx-*bx))
+ SHFT(*fb,*fc,fu,(*func)(u))
+#ifdef DEBUG
+ printf("\nmnbrak2 shift GOLD c=%lf",*cx+GOLD*(*cx-*bx));
+#endif
+ }
+ } else if ((u-ulim)*(ulim-*cx) >= 0.0) { /* u outside ulim (verifying that ulim is beyond c) */
+#ifdef DEBUG
+ printf("\nmnbrak2 u=%lf outside ulim=%lf (verifying that ulim is beyond c=%lf)\n",u,ulim,*cx);
+ fprintf(ficlog,"\nmnbrak2 u=%lf outside ulim=%lf (verifying that ulim is beyond c=%lf)\n",u,ulim,*cx);
+#endif
+ u=ulim;
+ fu=(*func)(u);
+ } else { /* u could be left to b (if r > q parabola has a maximum) */
+#ifdef DEBUG
+ printf("\nmnbrak2 u=%lf could be left to b=%lf (if r=%lf > q=%lf parabola has a maximum)\n",u,*bx,r,q);
+ fprintf(ficlog,"\nmnbrak2 u=%lf could be left to b=%lf (if r=%lf > q=%lf parabola has a maximum)\n",u,*bx,r,q);
+#endif
+ u=(*cx)+GOLD*(*cx-*bx);
+ fu=(*func)(u);
+#ifdef DEBUG
+ printf("\nmnbrak2 new u=%lf fu=%lf shifted gold left from c=%lf and b=%lf \n",u,fu,*cx,*bx);
+ fprintf(ficlog,"\nmnbrak2 new u=%lf fu=%lf shifted gold left from c=%lf and b=%lf \n",u,fu,*cx,*bx);
+#endif
+ } /* end tests */
+ SHFT(*ax,*bx,*cx,u)
+ SHFT(*fa,*fb,*fc,fu)
+#ifdef DEBUG
+ printf("\nmnbrak2 shift (*ax=%.12f, *fa=%.12lf), (*bx=%.12f, *fb=%.12lf), (*cx=%.12f, *fc=%.12lf)\n",*ax,*fa,*bx,*fb,*cx,*fc);
+ fprintf(ficlog, "\nmnbrak2 shift (*ax=%.12f, *fa=%.12lf), (*bx=%.12f, *fb=%.12lf), (*cx=%.12f, *fc=%.12lf)\n",*ax,*fa,*bx,*fb,*cx,*fc);
+#endif
+ } /* end while; ie return (a, b, c, fa, fb, fc) such that a < b < c with f(a) > f(b) and fb < f(c) */
+}
+
+/*************** linmin ************************/
+/* Given an n -dimensional point p[1..n] and an n -dimensional direction xi[1..n] , moves and
+resets p to where the function func(p) takes on a minimum along the direction xi from p ,
+and replaces xi by the actual vector displacement that p was moved. Also returns as fret
+the value of func at the returned location p . This is actually all accomplished by calling the
+routines mnbrak and brent .*/
+int ncom;
+double *pcom,*xicom;
+double (*nrfunc)(double []);
+
+#ifdef LINMINORIGINAL
+void linmin(double p[], double xi[], int n, double *fret,double (*func)(double []))
+#else
+void linmin(double p[], double xi[], int n, double *fret,double (*func)(double []), int *flat)
+#endif
+{
+ double brent(double ax, double bx, double cx,
+ double (*f)(double), double tol, double *xmin);
+ double f1dim(double x);
+ void mnbrak(double *ax, double *bx, double *cx, double *fa, double *fb,
+ double *fc, double (*func)(double));
+ int j;
+ double xx,xmin,bx,ax;
+ double fx,fb,fa;
+
+#ifdef LINMINORIGINAL
+#else
+ double scale=10., axs, xxs; /* Scale added for infinity */
+#endif
+
+ ncom=n;
+ pcom=vector(1,n);
+ xicom=vector(1,n);
+ nrfunc=func;
+ for (j=1;j<=n;j++) {
+ pcom[j]=p[j];
+ xicom[j]=xi[j]; /* Former scale xi[j] of currrent direction i */
+ }
+
+#ifdef LINMINORIGINAL
+ xx=1.;
+#else
+ axs=0.0;
+ xxs=1.;
+ do{
+ xx= xxs;
+#endif
+ ax=0.;
+ mnbrak(&ax,&xx,&bx,&fa,&fx,&fb,f1dim); /* Outputs: xtx[j]=pcom[j]+(*xx)*xicom[j]; fx=f(xtx[j]) */
+ /* brackets with inputs ax=0 and xx=1, but points, pcom=p, and directions values, xicom=xi, are sent via f1dim(x) */
+ /* xt[x,j]=pcom[j]+x*xicom[j] f(ax) = f(xt(a,j=1,n)) = f(p(j) + 0 * xi(j)) and f(xx) = f(xt(x, j=1,n)) = f(p(j) + 1 * xi(j)) */
+ /* Outputs: fa=f(p(j)) and fx=f(p(j) + xxs * xi(j) ) and f(bx)= f(p(j)+ bx* xi(j)) */
+ /* Given input ax=axs and xx=xxs, xx might be too far from ax to get a finite f(xx) */
+ /* Searches on line, outputs (ax, xx, bx) such that fx < min(fa and fb) */
+ /* Find a bracket a,x,b in direction n=xi ie xicom, order may change. Scale is [0:xxs*xi[j]] et non plus [0:xi[j]]*/
+#ifdef LINMINORIGINAL
+#else
+ if (fx != fx){
+ xxs=xxs/scale; /* Trying a smaller xx, closer to initial ax=0 */
+ printf("|");
+ fprintf(ficlog,"|");
+#ifdef DEBUGLINMIN
+ printf("\nLinmin NAN : input [axs=%lf:xxs=%lf], mnbrak outputs fx=%lf <(fb=%lf and fa=%lf) with xx=%lf in [ax=%lf:bx=%lf] \n", axs, xxs, fx,fb, fa, xx, ax, bx);
+#endif
+ }
+ }while(fx != fx && xxs > 1.e-5);
+#endif
+
+#ifdef DEBUGLINMIN
+ printf("\nLinmin after mnbrak: ax=%12.7f xx=%12.7f bx=%12.7f fa=%12.2f fx=%12.2f fb=%12.2f\n", ax,xx,bx,fa,fx,fb);
+ fprintf(ficlog,"\nLinmin after mnbrak: ax=%12.7f xx=%12.7f bx=%12.7f fa=%12.2f fx=%12.2f fb=%12.2f\n", ax,xx,bx,fa,fx,fb);
+#endif
+#ifdef LINMINORIGINAL
+#else
+ if(fb == fx){ /* Flat function in the direction */
+ xmin=xx;
+ *flat=1;
+ }else{
+ *flat=0;
+#endif
+ /*Flat mnbrak2 shift (*ax=0.000000000000, *fa=51626.272983130431), (*bx=-1.618034000000, *fb=51590.149499362531), (*cx=-4.236068025156, *fc=51590.149499362531) */
+ *fret=brent(ax,xx,bx,f1dim,TOL,&xmin); /* Giving a bracketting triplet (ax, xx, bx), find a minimum, xmin, according to f1dim, *fret(xmin),*/
+ /* fa = f(p[j] + ax * xi[j]), fx = f(p[j] + xx * xi[j]), fb = f(p[j] + bx * xi[j]) */
+ /* fmin = f(p[j] + xmin * xi[j]) */
+ /* P+lambda n in that direction (lambdamin), with TOL between abscisses */
+ /* f1dim(xmin): for (j=1;j<=ncom;j++) xt[j]=pcom[j]+xmin*xicom[j]; */
+#ifdef DEBUG
+ printf("retour brent from bracket (a=%lf fa=%lf, xx=%lf fx=%lf, b=%lf fb=%lf): fret=%lf xmin=%lf\n",ax,fa,xx,fx,bx,fb,*fret,xmin);
+ fprintf(ficlog,"retour brent from bracket (a=%lf fa=%lf, xx=%lf fx=%lf, b=%lf fb=%lf): fret=%lf xmin=%lf\n",ax,fa,xx,fx,bx,fb,*fret,xmin);
+#endif
+#ifdef LINMINORIGINAL
+#else
+ }
+#endif
+#ifdef DEBUGLINMIN
+ printf("linmin end ");
+ fprintf(ficlog,"linmin end ");
+#endif
+ for (j=1;j<=n;j++) {
+#ifdef LINMINORIGINAL
+ xi[j] *= xmin;
+#else
+#ifdef DEBUGLINMIN
+ if(xxs <1.0)
+ printf(" before xi[%d]=%12.8f", j,xi[j]);
+#endif
+ xi[j] *= xmin*xxs; /* xi rescaled by xmin and number of loops: if xmin=-1.237 and xi=(1,0,...,0) xi=(-1.237,0,...,0) */
+#ifdef DEBUGLINMIN
+ if(xxs <1.0)
+ printf(" after xi[%d]=%12.8f, xmin=%12.8f, ax=%12.8f, xx=%12.8f, bx=%12.8f, xxs=%12.8f", j,xi[j], xmin, ax, xx, bx,xxs );
+#endif
+#endif
+ p[j] += xi[j]; /* Parameters values are updated accordingly */
+ }
+#ifdef DEBUGLINMIN
+ printf("\n");
+ printf("Comparing last *frec(xmin=%12.8f)=%12.8f from Brent and frec(0.)=%12.8f \n", xmin, *fret, (*func)(p));
+ fprintf(ficlog,"Comparing last *frec(xmin=%12.8f)=%12.8f from Brent and frec(0.)=%12.8f \n", xmin, *fret, (*func)(p));
+ for (j=1;j<=n;j++) {
+ printf(" xi[%d]= %14.10f p[%d]= %12.7f",j,xi[j],j,p[j]);
+ fprintf(ficlog," xi[%d]= %14.10f p[%d]= %12.7f",j,xi[j],j,p[j]);
+ if(j % ncovmodel == 0){
+ printf("\n");
+ fprintf(ficlog,"\n");
+ }
+ }
+#else
+#endif
+ free_vector(xicom,1,n);
+ free_vector(pcom,1,n);
+}
+
+
+/*************** powell ************************/
+/*
+Minimization of a function func of n variables. Input consists in an initial starting point
+p[1..n] ; an initial matrix xi[1..n][1..n] whose columns contain the initial set of di-
+rections (usually the n unit vectors); and ftol, the fractional tolerance in the function value
+such that failure to decrease by more than this amount in one iteration signals doneness. On
+output, p is set to the best point found, xi is the then-current direction set, fret is the returned
+function value at p , and iter is the number of iterations taken. The routine linmin is used.
+ */
+#ifdef LINMINORIGINAL
+#else
+ int *flatdir; /* Function is vanishing in that direction */
+ int flat=0, flatd=0; /* Function is vanishing in that direction */
+#endif
+void powell(double p[], double **xi, int n, double ftol, int *iter, double *fret,
+ double (*func)(double []))
+{
+#ifdef LINMINORIGINAL
+ void linmin(double p[], double xi[], int n, double *fret,
+ double (*func)(double []));
+#else
+ void linmin(double p[], double xi[], int n, double *fret,
+ double (*func)(double []),int *flat);
+#endif
+ int i,ibig,j,jk,k;
+ double del,t,*pt,*ptt,*xit;
+ double directest;
+ double fp,fptt;
+ double *xits;
+ int niterf, itmp;
+
+ pt=vector(1,n);
+ ptt=vector(1,n);
+ xit=vector(1,n);
+ xits=vector(1,n);
+ *fret=(*func)(p);
+ for (j=1;j<=n;j++) pt[j]=p[j];
+ rcurr_time = time(NULL);
+ for (*iter=1;;++(*iter)) {
+ ibig=0;
+ del=0.0;
+ rlast_time=rcurr_time;
+ /* (void) gettimeofday(&curr_time,&tzp); */
+ rcurr_time = time(NULL);
+ curr_time = *localtime(&rcurr_time);
+ printf("\nPowell iter=%d -2*LL=%.12f gain=%.12f=%.3g %ld sec. %ld sec.",*iter,*fret, fp-*fret,fp-*fret, rcurr_time-rlast_time, rcurr_time-rstart_time);fflush(stdout);
+ fprintf(ficlog,"\nPowell iter=%d -2*LL=%.12f gain=%.12f=%.3g %ld sec. %ld sec.",*iter,*fret, fp-*fret,fp-*fret,rcurr_time-rlast_time, rcurr_time-rstart_time); fflush(ficlog);
+/* fprintf(ficrespow,"%d %.12f %ld",*iter,*fret,curr_time.tm_sec-start_time.tm_sec); */
+ fp=(*fret); /* From former iteration or initial value */
+ for (i=1;i<=n;i++) {
+ fprintf(ficrespow," %.12lf", p[i]);
+ }
+ fprintf(ficrespow,"\n");fflush(ficrespow);
+ printf("\n#model= 1 + age ");
+ fprintf(ficlog,"\n#model= 1 + age ");
+ if(nagesqr==1){
+ printf(" + age*age ");
+ fprintf(ficlog," + age*age ");
+ }
+ for(j=1;j <=ncovmodel-2;j++){
+ if(Typevar[j]==0) {
+ printf(" + V%d ",Tvar[j]);
+ fprintf(ficlog," + V%d ",Tvar[j]);
+ }else if(Typevar[j]==1) {
+ printf(" + V%d*age ",Tvar[j]);
+ fprintf(ficlog," + V%d*age ",Tvar[j]);
+ }else if(Typevar[j]==2) {
+ printf(" + V%d*V%d ",Tvard[Tposprod[j]][1],Tvard[Tposprod[j]][2]);
+ fprintf(ficlog," + V%d*V%d ",Tvard[Tposprod[j]][1],Tvard[Tposprod[j]][2]);
+ }
+ }
+ printf("\n");
+/* printf("12 47.0114589 0.0154322 33.2424412 0.3279905 2.3731903 */
+/* 13 -21.5392400 0.1118147 1.2680506 1.2973408 -1.0663662 */
+ fprintf(ficlog,"\n");
+ for(i=1,jk=1; i <=nlstate; i++){
+ for(k=1; k <=(nlstate+ndeath); k++){
+ if (k != i) {
+ printf("%d%d ",i,k);
+ fprintf(ficlog,"%d%d ",i,k);
+ for(j=1; j <=ncovmodel; j++){
+ printf("%12.7f ",p[jk]);
+ fprintf(ficlog,"%12.7f ",p[jk]);
+ jk++;
+ }
+ printf("\n");
+ fprintf(ficlog,"\n");
+ }
+ }
+ }
+ if(*iter <=3 && *iter >1){
+ tml = *localtime(&rcurr_time);
+ strcpy(strcurr,asctime(&tml));
+ rforecast_time=rcurr_time;
+ itmp = strlen(strcurr);
+ if(strcurr[itmp-1]=='\n') /* Windows outputs with a new line */
+ strcurr[itmp-1]='\0';
+ printf("\nConsidering the time needed for the last iteration #%d: %ld seconds,\n",*iter,rcurr_time-rlast_time);
+ fprintf(ficlog,"\nConsidering the time needed for this last iteration #%d: %ld seconds,\n",*iter,rcurr_time-rlast_time);
+ for(niterf=10;niterf<=30;niterf+=10){
+ rforecast_time=rcurr_time+(niterf-*iter)*(rcurr_time-rlast_time);
+ forecast_time = *localtime(&rforecast_time);
+ strcpy(strfor,asctime(&forecast_time));
+ itmp = strlen(strfor);
+ if(strfor[itmp-1]=='\n')
+ strfor[itmp-1]='\0';
+ printf(" - if your program needs %d iterations to converge, convergence will be \n reached in %s i.e.\n on %s (current time is %s);\n",niterf, asc_diff_time(rforecast_time-rcurr_time,tmpout),strfor,strcurr);
+ fprintf(ficlog," - if your program needs %d iterations to converge, convergence will be \n reached in %s i.e.\n on %s (current time is %s);\n",niterf, asc_diff_time(rforecast_time-rcurr_time,tmpout),strfor,strcurr);
+ }
+ }
+ for (i=1;i<=n;i++) { /* For each direction i */
+ for (j=1;j<=n;j++) xit[j]=xi[j][i]; /* Directions stored from previous iteration with previous scales */
+ fptt=(*fret);
+#ifdef DEBUG
+ printf("fret=%lf, %lf, %lf \n", *fret, *fret, *fret);
+ fprintf(ficlog, "fret=%lf, %lf, %lf \n", *fret, *fret, *fret);
+#endif
+ printf("%d",i);fflush(stdout); /* print direction (parameter) i */
+ fprintf(ficlog,"%d",i);fflush(ficlog);
+#ifdef LINMINORIGINAL
+ linmin(p,xit,n,fret,func); /* Point p[n]. xit[n] has been loaded for direction i as input.*/
+#else
+ linmin(p,xit,n,fret,func,&flat); /* Point p[n]. xit[n] has been loaded for direction i as input.*/
+ flatdir[i]=flat; /* Function is vanishing in that direction i */
+#endif
+ /* Outputs are fret(new point p) p is updated and xit rescaled */
+ if (fabs(fptt-(*fret)) > del) { /* We are keeping the max gain on each of the n directions */
+ /* because that direction will be replaced unless the gain del is small */
+ /* in comparison with the 'probable' gain, mu^2, with the last average direction. */
+ /* Unless the n directions are conjugate some gain in the determinant may be obtained */
+ /* with the new direction. */
+ del=fabs(fptt-(*fret));
+ ibig=i;
+ }
+#ifdef DEBUG
+ printf("%d %.12e",i,(*fret));
+ fprintf(ficlog,"%d %.12e",i,(*fret));
+ for (j=1;j<=n;j++) {
+ xits[j]=FMAX(fabs(p[j]-pt[j]),1.e-5);
+ printf(" x(%d)=%.12e",j,xit[j]);
+ fprintf(ficlog," x(%d)=%.12e",j,xit[j]);
+ }
+ for(j=1;j<=n;j++) {
+ printf(" p(%d)=%.12e",j,p[j]);
+ fprintf(ficlog," p(%d)=%.12e",j,p[j]);
+ }
+ printf("\n");
+ fprintf(ficlog,"\n");
+#endif
+ } /* end loop on each direction i */
+ /* Convergence test will use last linmin estimation (fret) and compare former iteration (fp) */
+ /* But p and xit have been updated at the end of linmin, *fret corresponds to new p, xit */
+ /* New value of last point Pn is not computed, P(n-1) */
+ for(j=1;j<=n;j++) {
+ if(flatdir[j] >0){
+ printf(" p(%d)=%lf flat=%d ",j,p[j],flatdir[j]);
+ fprintf(ficlog," p(%d)=%lf flat=%d ",j,p[j],flatdir[j]);
+ }
+ /* printf("\n"); */
+ /* fprintf(ficlog,"\n"); */
+ }
+ /* if (2.0*fabs(fp-(*fret)) <= ftol*(fabs(fp)+fabs(*fret))) { /\* Did we reach enough precision? *\/ */
+ if (2.0*fabs(fp-(*fret)) <= ftol) { /* Did we reach enough precision? */
+ /* We could compare with a chi^2. chisquare(0.95,ddl=1)=3.84 */
+ /* By adding age*age in a model, the new -2LL should be lower and the difference follows a */
+ /* a chisquare statistics with 1 degree. To be significant at the 95% level, it should have */
+ /* decreased of more than 3.84 */
+ /* By adding age*age and V1*age the gain (-2LL) should be more than 5.99 (ddl=2) */
+ /* By using V1+V2+V3, the gain should be 7.82, compared with basic 1+age. */
+ /* By adding 10 parameters more the gain should be 18.31 */
+
+ /* Starting the program with initial values given by a former maximization will simply change */
+ /* the scales of the directions and the directions, because the are reset to canonical directions */
+ /* Thus the first calls to linmin will give new points and better maximizations until fp-(*fret) is */
+ /* under the tolerance value. If the tolerance is very small 1.e-9, it could last long. */
+#ifdef DEBUG
+ int k[2],l;
+ k[0]=1;
+ k[1]=-1;
+ printf("Max: %.12e",(*func)(p));
+ fprintf(ficlog,"Max: %.12e",(*func)(p));
+ for (j=1;j<=n;j++) {
+ printf(" %.12e",p[j]);
+ fprintf(ficlog," %.12e",p[j]);
+ }
+ printf("\n");
+ fprintf(ficlog,"\n");
+ for(l=0;l<=1;l++) {
+ for (j=1;j<=n;j++) {
+ ptt[j]=p[j]+(p[j]-pt[j])*k[l];
+ printf("l=%d j=%d ptt=%.12e, xits=%.12e, p=%.12e, xit=%.12e", l,j,ptt[j],xits[j],p[j],xit[j]);
+ fprintf(ficlog,"l=%d j=%d ptt=%.12e, xits=%.12e, p=%.12e, xit=%.12e", l,j,ptt[j],xits[j],p[j],xit[j]);
+ }
+ printf("func(ptt)=%.12e, deriv=%.12e\n",(*func)(ptt),(ptt[j]-p[j])/((*func)(ptt)-(*func)(p)));
+ fprintf(ficlog,"func(ptt)=%.12e, deriv=%.12e\n",(*func)(ptt),(ptt[j]-p[j])/((*func)(ptt)-(*func)(p)));
+ }
+#endif
+
+ free_vector(xit,1,n);
+ free_vector(xits,1,n);
+ free_vector(ptt,1,n);
+ free_vector(pt,1,n);
+ return;
+ } /* enough precision */
+ if (*iter == ITMAX*n) nrerror("powell exceeding maximum iterations.");
+ for (j=1;j<=n;j++) { /* Computes the extrapolated point P_0 + 2 (P_n-P_0) */
+ ptt[j]=2.0*p[j]-pt[j];
+ xit[j]=p[j]-pt[j];
+ pt[j]=p[j];
+ }
+ fptt=(*func)(ptt); /* f_3 */
+#ifdef NODIRECTIONCHANGEDUNTILNITER /* No change in drections until some iterations are done */
+ if (*iter <=4) {
+#else
+#endif
+#ifdef POWELLNOF3INFF1TEST /* skips test F3 0 */
+ /* mu² and del² are equal when f3=f1 */
+ /* f3 < f1 : mu² < del <= lambda^2 both test are equivalent */
+ /* f3 < f1 : mu² < lambda^2 < del then directtest is negative and powell t is positive */
+ /* f3 > f1 : lambda² < mu^2 < del then t is negative and directest >0 */
+ /* f3 > f1 : lambda² < del < mu^2 then t is positive and directest >0 */
+#ifdef NRCORIGINAL
+ t=2.0*(fp-2.0*(*fret)+fptt)*SQR(fp-(*fret)-del)- del*SQR(fp-fptt); /* Original Numerical Recipes in C*/
+#else
+ t=2.0*(fp-2.0*(*fret)+fptt)*SQR(fp-(*fret)-del); /* Intel compiler doesn't work on one line; bug reported */
+ t= t- del*SQR(fp-fptt);
+#endif
+ directest = fp-2.0*(*fret)+fptt - 2.0 * del; /* If delta was big enough we change it for a new direction */
+#ifdef DEBUG
+ printf("t1= %.12lf, t2= %.12lf, t=%.12lf directest=%.12lf\n", 2.0*(fp-2.0*(*fret)+fptt)*SQR(fp-(*fret)-del),del*SQR(fp-fptt),t,directest);
+ fprintf(ficlog,"t1= %.12lf, t2= %.12lf, t=%.12lf directest=%.12lf\n", 2.0*(fp-2.0*(*fret)+fptt)*SQR(fp-(*fret)-del),del*SQR(fp-fptt),t,directest);
+ printf("t3= %.12lf, t4= %.12lf, t3*= %.12lf, t4*= %.12lf\n",SQR(fp-(*fret)-del),SQR(fp-fptt),
+ (fp-(*fret)-del)*(fp-(*fret)-del),(fp-fptt)*(fp-fptt));
+ fprintf(ficlog,"t3= %.12lf, t4= %.12lf, t3*= %.12lf, t4*= %.12lf\n",SQR(fp-(*fret)-del),SQR(fp-fptt),
+ (fp-(*fret)-del)*(fp-(*fret)-del),(fp-fptt)*(fp-fptt));
+ printf("tt= %.12lf, t=%.12lf\n",2.0*(fp-2.0*(*fret)+fptt)*(fp-(*fret)-del)*(fp-(*fret)-del)-del*(fp-fptt)*(fp-fptt),t);
+ fprintf(ficlog, "tt= %.12lf, t=%.12lf\n",2.0*(fp-2.0*(*fret)+fptt)*(fp-(*fret)-del)*(fp-(*fret)-del)-del*(fp-fptt)*(fp-fptt),t);
+#endif
+#ifdef POWELLORIGINAL
+ if (t < 0.0) { /* Then we use it for new direction */
+#else
+ if (directest*t < 0.0) { /* Contradiction between both tests */
+ printf("directest= %.12lf (if <0 we include P0 Pn as new direction), t= %.12lf, f1= %.12lf,f2= %.12lf,f3= %.12lf, del= %.12lf\n",directest, t, fp,(*fret),fptt,del);
+ printf("f1-2f2+f3= %.12lf, f1-f2-del= %.12lf, f1-f3= %.12lf\n",fp-2.0*(*fret)+fptt, fp -(*fret) -del, fp-fptt);
+ fprintf(ficlog,"directest= %.12lf (if directest<0 or t<0 we include P0 Pn as new direction), t= %.12lf, f1= %.12lf,f2= %.12lf,f3= %.12lf, del= %.12lf\n",directest, t, fp,(*fret),fptt, del);
+ fprintf(ficlog,"f1-2f2+f3= %.12lf, f1-f2-del= %.12lf, f1-f3= %.12lf\n",fp-2.0*(*fret)+fptt, fp -(*fret) -del, fp-fptt);
+ }
+ if (directest < 0.0) { /* Then we use it for new direction */
+#endif
+#ifdef DEBUGLINMIN
+ printf("Before linmin in direction P%d-P0\n",n);
+ for (j=1;j<=n;j++) {
+ printf(" Before xit[%d]= %12.7f p[%d]= %12.7f",j,xit[j],j,p[j]);
+ 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.*/
+#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 */
+#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");
+ }
+ }
+#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 */
+ }
+#ifdef LINMINORIGINAL
+#else
+ for (j=1, flatd=0;j<=n;j++) {
+ if(flatdir[j]>0)
+ flatd++;
+ }
+ if(flatd >0){
+ printf("%d flat directions: ",flatd);
+ fprintf(ficlog,"%d flat directions :",flatd);
+ for (j=1;j<=n;j++) {
+ if(flatdir[j]>0){
+ printf("%d ",j);
+ fprintf(ficlog,"%d ",j);
+ }
+ }
+ printf("\n");
+ fprintf(ficlog,"\n");
+#ifdef FLATSUP
+ free_vector(xit,1,n);
+ free_vector(xits,1,n);
+ free_vector(ptt,1,n);
+ free_vector(pt,1,n);
+ return;
+#endif
+ }
+#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);
+
+#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");
+#endif
+ } /* end of t or directest negative */
+#ifdef POWELLNOF3INFF1TEST
+#else
+ } /* 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 */
+#else
+#endif
+ } /* 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, 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
+ * newm is the matrix after multiplications, its rows are identical at a factor.
+ * Inputs are the parameter, age, a tolerance for the prevalence limit ftolpl.
+ * Output is prlim.
+ * 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], **pmij(); /* **pmmij is a global variable feeded with oldms etc */
+ double **newm;
+ double agefin, delaymax=200. ; /* 100 Max number of years to converge */
+ int ncvloop=0;
+ int first=0;
+
+ min=vector(1,nlstate);
+ max=vector(1,nlstate);
+ meandiff=vector(1,nlstate);
+
+ /* Starting with matrix unity */
+ 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<=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)];
+ /* cov[++k1]=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];
+ /* cov[++k1]=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[Tage[k]]==2){ /* dummy with age */
+ cov[2+nagesqr+Tage[k]]=nbcode[Tvar[Tage[k]]][codtabm(ij,k)]*cov[2];
+ /* cov[++k1]=nbcode[Tvar[Tage[k]]][codtabm(ij,k)]*cov[2]; */
+ } else if(Dummy[Tage[k]]==3){ /* quantitative with age */
+ cov[2+nagesqr+Tage[k]]=Tqresult[nres][k];
+ /* cov[++k1]=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)];
+ /* cov[++k1]=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];
+ /* cov[++k1]=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]];
+ /* cov[++k1]=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]];
+ /* cov[++k1]=Tqinvresult[nres][Tvard[k][1]]* Tqinvresult[nres][Tvard[k][2]]; */
+ }
+ }
+ }
+ /*printf("ij=%d cptcovprod=%d tvar=%d ", ij, cptcovprod, Tvar[1]);*/
+ /*printf("ij=%d cov[3]=%lf cov[4]=%lf \n",ij, cov[3],cov[4]);*/
+ /*printf("ij=%d cov[3]=%lf \n",ij, cov[3]);*/
+ /* savm=pmij(pmmij,cov,ncovmodel,x,nlstate); */
+ /* out=matprod2(newm, pmij(pmmij,cov,ncovmodel,x,nlstate),1,nlstate+ndeath,1,nlstate+ndeath,1,nlstate+ndeath, oldm); /\* Bug Valgrind *\/ */
+ /* age and covariate values of ij are in 'cov' */
+ out=matprod2(newm, pmij(pmmij,cov,ncovmodel,x,nlstate),1,nlstate+ndeath,1,nlstate+ndeath,1,nlstate+ndeath, oldm); /* Bug Valgrind */
+
+ savm=oldm;
+ oldm=newm;
+
+ for(j=1; j<=nlstate; j++){
+ max[j]=0.;
+ min[j]=1.;
+ }
+ for(i=1;i<=nlstate;i++){
+ sumnew=0;
+ for(k=1; k<=ndeath; k++) sumnew+=newm[i][nlstate+k];
+ for(j=1; j<=nlstate; j++){
+ prlim[i][j]= newm[i][j]/(1-sumnew);
+ max[j]=FMAX(max[j],prlim[i][j]);
+ min[j]=FMIN(min[j],prlim[i][j]);
+ }
+ }
+
+ maxmax=0.;
+ for(j=1; j<=nlstate; j++){
+ meandiff[j]=(max[j]-min[j])/(max[j]+min[j])*2.; /* mean difference for each column */
+ maxmax=FMAX(maxmax,meandiff[j]);
+ /* printf(" age= %d meandiff[%d]=%f, agefin=%d max[%d]=%f min[%d]=%f maxmax=%f\n", (int)age, j, meandiff[j],(int)agefin, j, max[j], j, min[j],maxmax); */
+ } /* j loop */
+ *ncvyear= (int)age- (int)agefin;
+ /* printf("maxmax=%lf maxmin=%lf ncvloop=%d, age=%d, agefin=%d ncvyear=%d \n", maxmax, maxmin, ncvloop, (int)age, (int)agefin, *ncvyear); */
+ if(maxmax < ftolpl){
+ /* printf("maxmax=%lf ncvloop=%ld, 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 prlim;
+ }
+ } /* agefin loop */
+ /* After some age loop it doesn't converge */
+ if(!first){
+ first=1;
+ printf("Warning: the stable prevalence at age %d did not converge with the required precision (%g > ftolpl=%g) within %.d years and %d loops. Try to lower 'ftolpl'. Youngest age to start was %d=(%d-%d). Others in log file only...\n", (int)age, maxmax, ftolpl, *ncvyear, ncvloop, (int)(agefin+stepm/YEARM), (int)(age-stepm/YEARM), (int)delaymax);
+ fprintf(ficlog, "Warning: the stable prevalence at age %d did not converge with the required precision (%g > ftolpl=%g) within %.d years and %d loops. Try to lower 'ftolpl'. Youngest age to start was %d=(%d-%d).\n", (int)age, maxmax, ftolpl, *ncvyear, ncvloop, (int)(agefin+stepm/YEARM), (int)(age-stepm/YEARM), (int)delaymax);
+ }else if (first >=1 && first <10){
+ fprintf(ficlog, "Warning: the stable prevalence at age %d did not converge with the required precision (%g > ftolpl=%g) within %.d years and %d loops. Try to lower 'ftolpl'. Youngest age to start was %d=(%d-%d).\n", (int)age, maxmax, ftolpl, *ncvyear, ncvloop, (int)(agefin+stepm/YEARM), (int)(age-stepm/YEARM), (int)delaymax);
+ first++;
+ }else if (first ==10){
+ fprintf(ficlog, "Warning: the stable prevalence at age %d did not converge with the required precision (%g > ftolpl=%g) within %.d years and %d loops. Try to lower 'ftolpl'. Youngest age to start was %d=(%d-%d).\n", (int)age, maxmax, ftolpl, *ncvyear, ncvloop, (int)(agefin+stepm/YEARM), (int)(age-stepm/YEARM), (int)delaymax);
+ printf("Warning: the stable prevalence dit not converge. This warning came too often, IMaCh will stop notifying, even in its log file. Look at the graphs to appreciate the non convergence.\n");
+ fprintf(ficlog,"Warning: the stable prevalence no convergence; too many cases, giving up noticing, even in log file\n");
+ first++;
+ }
+
+ /* 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 prlim; /* should not reach here */
+}
+
+
+ /**** Back Prevalence limit (stable or period prevalence) ****************/
+
+ /* double **bprevalim(double **bprlim, double ***prevacurrent, int nlstate, double x[], double age, double ageminpar, double agemaxpar, double **oldm, double **savm, double **dnewm, double **doldm, double **dsavm, double ftolpl, int *ncvyear, int ij) */
+ /* double **bprevalim(double **bprlim, double ***prevacurrent, int nlstate, double x[], double age, double **oldm, double **savm, double **dnewm, double **doldm, double **dsavm, double ftolpl, int *ncvyear, int ij) */
+ double **bprevalim(double **bprlim, double ***prevacurrent, int nlstate, double x[], double age, double ftolpl, int *ncvyear, int ij, int nres)
+{
+ /* Computes the prevalence limit in each live state at age x and for covariate combination ij (<=2**cptcoveff) 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;
+ int first=0;
+ double *min, *max, *meandiff, maxmax,sumnew=0.;
+ /* double **matprod2(); */ /* test */
+ double **out, cov[NCOVMAX+1], **bmij();
+ double **newm;
+ double **dnewm, **doldm, **dsavm; /* for use */
+ double **oldm, **savm; /* for use */
+
+ 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);
+
+ dnewm=ddnewms; doldm=ddoldms; dsavm=ddsavms;
+ oldm=oldms; savm=savms;
+
+ /* Starting with matrix unity */
+ 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){ /\* A changer en age *\/ */
+ /* for(agefin=age; agefin ftolpl=%g) within %.0f years. Try to lower 'ftolpl'. Others in log file only...\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);
+ }
+ fprintf(ficlog,"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 )
+{
+ /* According to parameters values stored in x and the covariate's values stored in cov,
+ computes the probability to be observed in state j (after stepm years) 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] or probability to be observed in j being in i according to
+ the values of the covariates cov[nc] and corresponding parameter values x[nc+shiftij]
+ Sum on j ps[i][j] should equal to 1.
+ */
+ 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; j0.01){ /* At least some value in the prevalence */
+ for (ii=1;ii<=nlstate+ndeath;ii++){
+ for (j=1;j<=nlstate+ndeath;j++)
+ doldm[ii][j]=(ii==j ? prevacurrent[(int)agefin][ii][ij]/sumnew : 0.0);
+ }
+ }else{
+ for (ii=1;ii<=nlstate+ndeath;ii++){
+ for (j=1;j<=nlstate+ndeath;j++)
+ doldm[ii][j]=(ii==j ? 1./nlstate : 0.0);
+ }
+ /* if(sumnew <0.9){ */
+ /* printf("Problem internal bmij B: sum on i wi <0.9: j=%d, sum_i wi=%lf,agefin=%d\n",j,sumnew, (int)agefin); */
+ /* } */
+ }
+ k3=0.0; /* We put the last diagonal to 0 */
+ for (ii=nlstate+1;ii<=nlstate+ndeath;ii++){
+ doldm[ii][ii]= k3;
+ }
+ /* End doldm, At the end doldm is diag[(w_i)] */
+
+ /* Left product of this diag matrix by pmmij=Px (dnewm=dsavm*doldm): diag[(w_i)*Px */
+ bbmij=matprod2(dnewm, doldm,1,nlstate+ndeath,1,nlstate+ndeath,1,nlstate+ndeath, pmmij); /* was a Bug Valgrind */
+
+ /* Diag(Sum_i w^i_x p^ij_x, should be the prevalence at age x+stepm */
+ /* w1 p11 + w2 p21 only on live states N1./N..*N11/N1. + N2./N..*N21/N2.=(N11+N21)/N..=N.1/N.. */
+ for (j=1;j<=nlstate+ndeath;j++){
+ sumnew=0.;
+ for (ii=1;ii<=nlstate;ii++){
+ /* sumnew+=dsavm[ii][j]*prevacurrent[(int)agefin][ii][ij]; */
+ sumnew+=pmmij[ii][j]*doldm[ii][ii]; /* Yes prevalence at beginning of transition */
+ } /* sumnew is (N11+N21)/N..= N.1/N.. = sum on i of w_i pij */
+ for (ii=1;ii<=nlstate+ndeath;ii++){
+ /* if(agefin >= agemaxpar && agefin <= agemaxpar+stepm/YEARM){ */
+ /* dsavm[ii][j]=(ii==j ? 1./sumnew : 0.0); */
+ /* }else if(agefin >= agemaxpar+stepm/YEARM){ */
+ /* dsavm[ii][j]=(ii==j ? 1./sumnew : 0.0); */
+ /* }else */
+ dsavm[ii][j]=(ii==j ? 1./sumnew : 0.0);
+ } /*End ii */
+ } /* End j, At the end dsavm is diag[1/(w_1p1i+w_2 p2i)] for ALL states even if the sum is only for live states */
+
+ ps=matprod2(ps, dnewm,1,nlstate+ndeath,1,nlstate+ndeath,1,nlstate+ndeath, dsavm); /* was a Bug Valgrind */
+ /* ps is now diag[w_i] * Px * diag [1/(w_1p1i+w_2 p2i)] */
+ /* end bmij */
+ return ps; /*pointer is unchanged */
+}
+/*************** transition probabilities ***************/
+
+double **bpmij(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> (k-1))+1 */
+/* 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 */
+/* nsd 1 2 3 */ /* Counting single dummies covar fixed or tv */
+/*TvarsD[nsd] 4 3 1 */ /* ID of single dummy cova fixed or timevary*/
+/*TvarsDind[k] 2 3 9 */ /* position K of single dummy cova */
+ cov[2+nagesqr+TvarsDind[k]]=nbcode[TvarsD[k]][codtabm(ij,k)];
+ /* printf("hpxij 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("hPxij 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 V1+V1*age +V4 +age*V3 */
+ /* 1+2 Tage[1]=2 TVar[2]=1 Dummy[2]=2, Tage[2]=4 TVar[4]=3 Dummy[4]=3 quant*/
+ /* */
+ if(Dummy[Tage[k]]== 2){ /* dummy with age */
+ /* if(Dummy[Tvar[Tage[k]]]== 2){ /\* dummy with age *\/ */
+ cov[2+nagesqr+Tage[k]]=nbcode[Tvar[Tage[k]]][codtabm(ij,k)]*cov[2];
+ } else if(Dummy[Tage[k]]== 3){ /* quantitative with age */
+ cov[2+nagesqr+Tage[k]]=Tqresult[nres][k];
+ }
+ /* printf("hPxij 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("hPxij 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]); */
+ /* cov[2+nagesqr+Tprod[k]]=nbcode[Tvard[k][1]][codtabm(ij,k)] * nbcode[Tvard[k][2]][codtabm(ij,k)]; */
+ 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]];
+ }
+ }
+ }
+ /* for (k=1; k<=cptcovn;k++) */
+ /* cov[2+nagesqr+k]=nbcode[Tvar[k]][codtabm(ij,k)]; */
+ /* for (k=1; k<=cptcovage;k++) /\* Should start at cptcovn+1 *\/ */
+ /* cov[2+nagesqr+Tage[k]]=nbcode[Tvar[Tage[k]]][codtabm(ij,k)]*cov[2]; */
+ /* for (k=1; k<=cptcovprod;k++) /\* Useless because included in cptcovn *\/ */
+ /* cov[2+nagesqr+Tprod[k]]=nbcode[Tvard[k][1]][codtabm(ij,k)]*nbcode[Tvard[k][2]][codtabm(ij,k)]; */
+
+
+ /*printf("hxi cptcov=%d cptcode=%d\n",cptcov,cptcode);*/
+ /*printf("h=%d d=%d age=%f cov=%f\n",h,d,age,cov[2]);*/
+ /* right multiplication of oldm by the current matrix */
+ out=matprod2(newm,oldm,1,nlstate+ndeath,1,nlstate+ndeath,1,nlstate+ndeath,
+ pmij(pmmij,cov,ncovmodel,x,nlstate));
+ /* if((int)age == 70){ */
+ /* printf(" Forward hpxij age=%d agexact=%f d=%d nhstepm=%d hstepm=%d\n", (int) age, agexact, d, nhstepm, hstepm); */
+ /* for(i=1; i<=nlstate+ndeath; i++) { */
+ /* printf("%d pmmij ",i); */
+ /* for(j=1;j<=nlstate+ndeath;j++) { */
+ /* printf("%f ",pmmij[i][j]); */
+ /* } */
+ /* printf(" oldm "); */
+ /* for(j=1;j<=nlstate+ndeath;j++) { */
+ /* printf("%f ",oldm[i][j]); */
+ /* } */
+ /* printf("\n"); */
+ /* } */
+ /* } */
+ savm=oldm;
+ oldm=newm;
+ }
+ for(i=1; i<=nlstate+ndeath; i++)
+ for(j=1;j<=nlstate+ndeath;j++) {
+ po[i][j][h]=newm[i][j];
+ /*if(h==nhstepm) printf("po[%d][%d][%d]=%f ",i,j,h,po[i][j][h]);*/
+ }
+ /*printf("h=%d ",h);*/
+ } /* end h */
+ /* printf("\n H=%d \n",h); */
+ return po;
+}
+
+/************* Higher Back Matrix Product ***************/
+/* double ***hbxij(double ***po, int nhstepm, double age, int hstepm, double *x, double ***prevacurrent, int nlstate, int stepm, double **oldm, double **savm, double **dnewm, double **doldm, double **dsavm, int ij ) */
+double ***hbxij(double ***po, int nhstepm, double age, int hstepm, double *x, double ***prevacurrent, int nlstate, int stepm, int ij, int nres )
+{
+ /* For a combination of dummy covariate ij, computes the transition matrix starting at age 'age' over
+ 'nhstepm*hstepm*stepm' months (i.e. until
+ age (in years) age+nhstepm*hstepm*stepm/12) by multiplying
+ nhstepm*hstepm matrices.
+ Output is stored in matrix po[i][j][h] for h every 'hstepm' step
+ (typically every 2 years instead of every month which is too big
+ for the memory).
+ Model is determined by parameters x and covariates have to be
+ included manually here. Then we use a call to bmij(x and cov)
+ The addresss of po (p3mat allocated to the dimension of nhstepm) should be stored for output
+ */
+
+ int i, j, d, h, k;
+ double **out, cov[NCOVMAX+1], **bmij();
+ double **newm, ***newmm;
+ double agexact;
+ double agebegin, ageend;
+ double **oldm, **savm;
+
+ newmm=po; /* To be saved */
+ oldm=oldms;savm=savms; /* Global pointers */
+ /* Hstepm could be zero and should return the unit matrix */
+ for (i=1;i<=nlstate+ndeath;i++)
+ for (j=1;j<=nlstate+ndeath;j++){
+ oldm[i][j]=(i==j ? 1.0 : 0.0);
+ po[i][j][0]=(i==j ? 1.0 : 0.0);
+ }
+ /* Even if hstepm = 1, at least one multiplication by the unit matrix */
+ for(h=1; h <=nhstepm; h++){
+ for(d=1; d <=hstepm; d++){
+ newm=savm;
+ /* Covariates have to be included here again */
+ cov[1]=1.;
+ agexact=age-( (h-1)*hstepm + (d) )*stepm/YEARM; /* age just before transition, d or d-1? */
+ /* agexact=age+((h-1)*hstepm + (d-1))*stepm/YEARM; /\* age just before transition *\/ */
+ /* Debug */
+ /* printf("hBxij age=%lf, agexact=%lf\n", age, agexact); */
+ cov[2]=agexact;
+ if(nagesqr==1)
+ cov[3]= agexact*agexact;
+ for (k=1; k<=nsd;k++){ /* For single dummy covariates only *//* cptcovn error */
+ /* cov[2+nagesqr+k]=nbcode[Tvar[k]][codtabm(ij,k)]; */
+ /* /\* cov[2+nagesqr+k]=nbcode[Tvar[k]][codtabm(ij,Tvar[k])]; *\/ */
+ cov[2+nagesqr+TvarsDind[k]]=nbcode[TvarsD[k]][codtabm(ij,k)];/* Bug valgrind */
+ /* printf("hbxij Dummy agexact=%.0f combi=%d k=%d TvarsD[%d]=V%d TvarsDind[%d]=%d nbcode=%d cov[%d]=%lf codtabm(%d,Tvar[%d])=%d \n",agexact,ij,k, k, TvarsD[k],k,TvarsDind[k],nbcode[TvarsD[k]][codtabm(ij,k)],2+nagesqr+TvarsDind[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("hPxij 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++){ /* Should start at cptcovn+1 *//* For product with age */
+ /* if(Dummy[Tvar[Tage[k]]]== 2){ /\* dummy with age error!!!*\/ */
+ if(Dummy[Tage[k]]== 2){ /* dummy with age */
+ cov[2+nagesqr+Tage[k]]=nbcode[Tvar[Tage[k]]][codtabm(ij,k)]*cov[2];
+ } else if(Dummy[Tage[k]]== 3){ /* quantitative with age */
+ cov[2+nagesqr+Tage[k]]=Tqresult[nres][k];
+ }
+ /* printf("hBxij 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++){ /* Useless because included in cptcovn */
+ cov[2+nagesqr+Tprod[k]]=nbcode[Tvard[k][1]][codtabm(ij,k)]*nbcode[Tvard[k][2]][codtabm(ij,k)];
+ 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]];
+ }
+ }
+ }
+ /*printf("hxi cptcov=%d cptcode=%d\n",cptcov,cptcode);*/
+ /*printf("h=%d d=%d age=%f cov=%f\n",h,d,age,cov[2]);*/
+
+ /* Careful transposed matrix */
+ /* age is in cov[2], prevacurrent at beginning of transition. */
+ /* out=matprod2(newm, bmij(pmmij,cov,ncovmodel,x,nlstate,prevacurrent, dnewm, doldm, dsavm,ij),\ */
+ /* 1,nlstate+ndeath,1,nlstate+ndeath,1,nlstate+ndeath, oldm); */
+ out=matprod2(newm, bmij(pmmij,cov,ncovmodel,x,nlstate,prevacurrent,ij),\
+ 1,nlstate+ndeath,1,nlstate+ndeath,1,nlstate+ndeath, oldm);/* Bug valgrind */
+ /* if((int)age == 70){ */
+ /* printf(" Backward hbxij age=%d agexact=%f d=%d nhstepm=%d hstepm=%d\n", (int) age, agexact, d, nhstepm, hstepm); */
+ /* for(i=1; i<=nlstate+ndeath; i++) { */
+ /* printf("%d pmmij ",i); */
+ /* for(j=1;j<=nlstate+ndeath;j++) { */
+ /* printf("%f ",pmmij[i][j]); */
+ /* } */
+ /* printf(" oldm "); */
+ /* for(j=1;j<=nlstate+ndeath;j++) { */
+ /* printf("%f ",oldm[i][j]); */
+ /* } */
+ /* printf("\n"); */
+ /* } */
+ /* } */
+ savm=oldm;
+ oldm=newm;
+ }
+ for(i=1; i<=nlstate+ndeath; i++)
+ for(j=1;j<=nlstate+ndeath;j++) {
+ po[i][j][h]=newm[i][j];
+ /* if(h==nhstepm) */
+ /* printf("po[%d][%d][%d]=%f ",i,j,h,po[i][j][h]); */
+ }
+ /* printf("h=%d %.1f ",h, agexact); */
+ } /* end h */
+ /* printf("\n H=%d nhs=%d \n",h, nhstepm); */
+ return po;
+}
+
+
+#ifdef NLOPT
+ double myfunc(unsigned n, const double *p1, double *grad, void *pd){
+ double fret;
+ double *xt;
+ int j;
+ myfunc_data *d2 = (myfunc_data *) pd;
+/* xt = (p1-1); */
+ xt=vector(1,n);
+ for (j=1;j<=n;j++) xt[j]=p1[j-1]; /* xt[1]=p1[0] */
+
+ fret=(d2->function)(xt); /* p xt[1]@8 is fine */
+ /* fret=(*func)(xt); /\* p xt[1]@8 is fine *\/ */
+ printf("Function = %.12lf ",fret);
+ for (j=1;j<=n;j++) printf(" %d %.8lf", j, xt[j]);
+ printf("\n");
+ free_vector(xt,1,n);
+ return fret;
+}
+#endif
+
+/*************** log-likelihood *************/
+double func( double *x)
+{
+ int i, ii, j, k, mi, d, kk;
+ int ioffset=0;
+ double l, ll[NLSTATEMAX+1], cov[NCOVMAX+1];
+ double **out;
+ double lli; /* Individual log likelihood */
+ int s1, s2;
+ int iv=0, iqv=0, itv=0, iqtv=0 ; /* Index of varying covariate, fixed quantitative cov, time varying covariate, quantitative time varying covariate */
+ double bbh, survp;
+ long ipmx;
+ double agexact;
+ /*extern weight */
+ /* We are differentiating ll according to initial status */
+ /* for (i=1;i<=npar;i++) printf("%f ", x[i]);*/
+ /*for(i=1;i 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.
+ */
+/* #ifdef INFINITYORIGINAL */
+/* lli=log(out[s1][s2] - savm[s1][s2]); */
+/* #else */
+/* if ((out[s1][s2] - savm[s1][s2]) < mytinydouble) */
+/* lli=log(mytinydouble); */
+/* else */
+/* lli=log(out[s1][s2] - savm[s1][s2]); */
+/* #endif */
+ 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];
+ /*survp += out[s1][j]; */
+ lli= log(survp);
+ }
+ else if (s2==-4) {
+ for (j=3,survp=0. ; j<=nlstate; j++)
+ survp += (1.+bbh)*out[s1][j]- bbh*savm[s1][j];
+ lli= log(survp);
+ }
+ else if (s2==-5) {
+ for (j=1,survp=0. ; j<=2; j++)
+ survp += (1.+bbh)*out[s1][j]- bbh*savm[s1][j];
+ lli= log(survp);
+ }
+ else{
+ lli= log((1.+bbh)*out[s1][s2]- bbh*savm[s1][s2]); /* linear interpolation */
+ /* lli= (savm[s1][s2]>(double)1.e-8 ?log((1.+bbh)*out[s1][s2]- bbh*(savm[s1][s2])):log((1.+bbh)*out[s1][s2]));*/ /* linear interpolation */
+ }
+ /*lli=(1.+bbh)*log(out[s1][s2])- bbh*log(savm[s1][s2]);*/
+ /*if(lli ==000.0)*/
+ /*printf("bbh= %f lli=%f savm=%f out=%f %d\n",bbh,lli,savm[s1][s2], out[s[mw[mi][i]][i]][s[mw[mi+1][i]][i]],i); */
+ ipmx +=1;
+ sw += weight[i];
+ ll[s[mw[mi][i]][i]] += 2*weight[i]*lli;
+ /* if (lli < log(mytinydouble)){ */
+ /* printf("Close to inf lli = %.10lf < %.10lf i= %d mi= %d, s[%d][i]=%d s1=%d s2=%d\n", lli,log(mytinydouble), i, mi,mw[mi][i], s[mw[mi][i]][i], s1,s2); */
+ /* fprintf(ficlog,"Close to inf lli = %.10lf i= %d mi= %d, s[mw[mi][i]][i]=%d\n", lli, i, mi,s[mw[mi][i]][i]); */
+ /* } */
+ } /* end of wave */
+ } /* end of individual */
+ } else if(mle==2){
+ for (i=1,ipmx=0, sw=0.; i<=imx; i++){
+ ioffset=2+nagesqr ;
+ for (k=1; k<=ncovf;k++)
+ cov[ioffset+TvarFind[k]]=covar[Tvar[TvarFind[k]]][i];
+ for(mi=1; mi<= wav[i]-1; mi++){
+ for(k=1; k <= ncovv ; k++){
+ cov[ioffset+TvarVind[k]]=cotvar[mw[mi][i]][Tvar[TvarVind[k]]-ncovcol-nqv][i];
+ }
+ for (ii=1;ii<=nlstate+ndeath;ii++)
+ for (j=1;j<=nlstate+ndeath;j++){
+ oldm[ii][j]=(ii==j ? 1.0 : 0.0);
+ savm[ii][j]=(ii==j ? 1.0 : 0.0);
+ }
+ for(d=0; d<=dh[mi][i]; d++){
+ newm=savm;
+ agexact=agev[mw[mi][i]][i]+d*stepm/YEARM;
+ cov[2]=agexact;
+ if(nagesqr==1)
+ cov[3]= agexact*agexact;
+ for (kk=1; kk<=cptcovage;kk++) {
+ cov[Tage[kk]+2+nagesqr]=covar[Tvar[Tage[kk]]][i]*agexact;
+ }
+ out=matprod2(newm,oldm,1,nlstate+ndeath,1,nlstate+ndeath,
+ 1,nlstate+ndeath,pmij(pmmij,cov,ncovmodel,x,nlstate));
+ savm=oldm;
+ oldm=newm;
+ } /* end mult */
+
+ s1=s[mw[mi][i]][i];
+ s2=s[mw[mi+1][i]][i];
+ bbh=(double)bh[mi][i]/(double)stepm;
+ 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 */
+ ipmx +=1;
+ sw += weight[i];
+ ll[s[mw[mi][i]][i]] += 2*weight[i]*lli;
+ } /* end of wave */
+ } /* end of individual */
+ } else if(mle==3){ /* exponential inter-extrapolation */
+ for (i=1,ipmx=0, sw=0.; i<=imx; i++){
+ for (k=1; k<=cptcovn;k++) cov[2+nagesqr+k]=covar[Tvar[k]][i];
+ for(mi=1; mi<= wav[i]-1; mi++){
+ for (ii=1;ii<=nlstate+ndeath;ii++)
+ for (j=1;j<=nlstate+ndeath;j++){
+ oldm[ii][j]=(ii==j ? 1.0 : 0.0);
+ savm[ii][j]=(ii==j ? 1.0 : 0.0);
+ }
+ for(d=0; d1.e-8 ?(1.+bbh)*log(out[s1][s2])- bbh*log(savm[s1][s2]):log((1.+bbh)*out[s1][s2])); /* exponential inter-extrapolation */
+ ipmx +=1;
+ sw += weight[i];
+ ll[s[mw[mi][i]][i]] += 2*weight[i]*lli;
+ } /* end of wave */
+ } /* end of individual */
+ }else if (mle==4){ /* ml=4 no inter-extrapolation */
+ for (i=1,ipmx=0, sw=0.; i<=imx; i++){
+ for (k=1; k<=cptcovn;k++) cov[2+nagesqr+k]=covar[Tvar[k]][i];
+ for(mi=1; mi<= wav[i]-1; mi++){
+ for (ii=1;ii<=nlstate+ndeath;ii++)
+ for (j=1;j<=nlstate+ndeath;j++){
+ oldm[ii][j]=(ii==j ? 1.0 : 0.0);
+ savm[ii][j]=(ii==j ? 1.0 : 0.0);
+ }
+ for(d=0; d 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 */
+ }
+ 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]); */
+ } /* end of wave */
+ } /* end of individual */
+ }else{ /* ml=5 no inter-extrapolation no jackson =0.8a */
+ for (i=1,ipmx=0, sw=0.; i<=imx; i++){
+ for (k=1; k<=cptcovn;k++) cov[2+nagesqr+k]=covar[Tvar[k]][i];
+ for(mi=1; mi<= wav[i]-1; mi++){
+ for (ii=1;ii<=nlstate+ndeath;ii++)
+ for (j=1;j<=nlstate+ndeath;j++){
+ 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==-1 ) { /* alive */
+ for (j=1,survp=0. ; j<=nlstate; j++)
+ survp += (1.+bbh)*out[s1][j]- bbh*savm[s1][j];
+ lli= log(survp);
+ }else if (mle==1){
+ lli= log((1.+bbh)*out[s1][s2]- bbh*savm[s1][s2]); /* linear interpolation */
+ } else if(mle==2){
+ lli= (savm[s1][s2]>(double)1.e-8 ?log((1.+bbh)*out[s1][s2]- bbh*savm[s1][s2]):log((1.+bbh)*out[s1][s2])); /* linear interpolation */
+ } 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 */
+ } else if (mle==4){ /* mle=4 no inter-extrapolation */
+ lli=log(out[s1][s2]); /* Original formula */
+ } else{ /* mle=0 back to 1 */
+ lli= log((1.+bbh)*out[s1][s2]- bbh*savm[s1][s2]); /* linear interpolation */
+ /*lli=log(out[s1][s2]); */ /* Original formula */
+ } /* End of if */
+ ipmx +=1;
+ sw += weight[i];
+ ll[s[mw[mi][i]][i]] += 2*weight[i]*lli;
+ /*printf("i=%6d s1=%1d s2=%1d mi=%1d mw=%1d dh=%3d prob=%10.6f w=%6.4f out=%10.6f sav=%10.6f\n",i,s1,s2,mi,mw[mi][i],dh[mi][i],exp(lli),weight[i],out[s1][s2],savm[s1][s2]); */
+ if(globpr){
+ fprintf(ficresilk,"%09ld %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,(s2==-1? -1: out[s1][s2]),(s2==-1? -1: 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;
+}
+
+
+/*************** function likelione ***********/
+void likelione(FILE *ficres,double p[], int npar, int nlstate, int *globpri, long *ipmx, double *sw, double *fretone, double (*func)(double []))
+{
+ /* This routine should help understanding what is done with
+ the selection of individuals/waves and
+ to check the exact contribution to the likelihood.
+ Plotting could be done.
+ */
+ int k;
+
+ if(*globpri !=0){ /* Just counts and sums, no printings */
+ strcpy(fileresilk,"ILK_");
+ strcat(fileresilk,fileresu);
+ if((ficresilk=fopen(fileresilk,"w"))==NULL) {
+ printf("Problem with resultfile: %s\n", fileresilk);
+ fprintf(ficlog,"Problem with resultfile: %s\n", fileresilk);
+ }
+ 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);
+ fprintf(ficresilk," -2*gipw/gsw*weight*ll(total)\n");
+ }
+
+ *fretone=(*func)(p);
+ if(*globpri !=0){
+ fclose(ficresilk);
+ if (mle ==0)
+ fprintf(fichtm,"\n
File of contributions to the likelihood computed with initial parameters and mle = %d.",mle);
+ else if(mle >=1)
+ fprintf(fichtm,"\n
File of contributions to the likelihood computed with optimized parameters mle = %d.",mle);
+ fprintf(fichtm," You should at least run with mle >= 1 to get starting values corresponding to the optimized parameters in order to visualize the real contribution of each individual/wave: %s
\n",subdirf(fileresilk),subdirf(fileresilk));
+ fprintf(fichtm,"\n
Equation of the model: model=1+age+%s
\n",model);
+
+ for (k=1; k<= nlstate ; k++) {
+ 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
\
+",subdirf2(optionfilefiname,"ILK_"),subdirf2(optionfilefiname,"ILK_"),subdirf2(optionfilefiname,"ILK_"));
+ fprintf(fichtm,"
- and by state of destination %s-dest.png
\
+",subdirf2(optionfilefiname,"ILK_"),subdirf2(optionfilefiname,"ILK_"),subdirf2(optionfilefiname,"ILK_"));
+ fflush(fichtm);
+ }
+ return;
+}
+
+
+/*********** Maximum Likelihood Estimation ***************/
+
+void mlikeli(FILE *ficres,double p[], int npar, int ncovmodel, int nlstate, double ftol, double (*func)(double []))
+{
+ int i,j,k, jk, jkk=0, iter=0;
+ double **xi;
+ double fret;
+ double fretone; /* Only one call to likelihood */
+ /* char filerespow[FILENAMELENGTH];*/
+
+#ifdef NLOPT
+ int creturn;
+ nlopt_opt opt;
+ /* double lb[9] = { -HUGE_VAL, -HUGE_VAL, -HUGE_VAL, -HUGE_VAL, -HUGE_VAL, -HUGE_VAL, -HUGE_VAL, -HUGE_VAL, -HUGE_VAL }; /\* lower bounds *\/ */
+ double *lb;
+ double minf; /* the minimum objective value, upon return */
+ double * p1; /* Shifted parameters from 0 instead of 1 */
+ myfunc_data dinst, *d = &dinst;
+#endif
+
+
+ xi=matrix(1,npar,1,npar);
+ for (i=1;i<=npar;i++)
+ for (j=1;j<=npar;j++)
+ xi[i][j]=(i==j ? 1.0 : 0.0);
+ printf("Powell\n"); fprintf(ficlog,"Powell\n");
+ strcpy(filerespow,"POW_");
+ strcat(filerespow,fileres);
+ if((ficrespow=fopen(filerespow,"w"))==NULL) {
+ printf("Problem with resultfile: %s\n", filerespow);
+ fprintf(ficlog,"Problem with resultfile: %s\n", filerespow);
+ }
+ fprintf(ficrespow,"# Powell\n# iter -2*LL");
+ for (i=1;i<=nlstate;i++)
+ for(j=1;j<=nlstate+ndeath;j++)
+ if(j!=i)fprintf(ficrespow," p%1d%1d",i,j);
+ fprintf(ficrespow,"\n");
+#ifdef POWELL
+#ifdef LINMINORIGINAL
+#else /* LINMINORIGINAL */
+
+ flatdir=ivector(1,npar);
+ for (j=1;j<=npar;j++) flatdir[j]=0;
+#endif /*LINMINORIGINAL */
+
+#ifdef FLATSUP
+ powell(p,xi,npar,ftol,&iter,&fret,flatdir,func);
+ /* reorganizing p by suppressing flat directions */
+ for(i=1, jk=1; i <=nlstate; i++){
+ for(k=1; k <=(nlstate+ndeath); k++){
+ if (k != i) {
+ printf("%d%d flatdir[%d]=%d",i,k,jk, flatdir[jk]);
+ if(flatdir[jk]==1){
+ printf(" To be skipped %d%d flatdir[%d]=%d ",i,k,jk, flatdir[jk]);
+ }
+ for(j=1; j <=ncovmodel; j++){
+ printf("%12.7f ",p[jk]);
+ jk++;
+ }
+ printf("\n");
+ }
+ }
+ }
+/* skipping */
+ /* for(i=1, jk=1, jkk=1;(flatdir[jk]==0)&& (i <=nlstate); i++){ */
+ for(i=1, jk=1, jkk=1;i <=nlstate; i++){
+ for(k=1; k <=(nlstate+ndeath); k++){
+ if (k != i) {
+ printf("%d%d flatdir[%d]=%d",i,k,jk, flatdir[jk]);
+ if(flatdir[jk]==1){
+ printf(" To be skipped %d%d flatdir[%d]=%d jk=%d p[%d] ",i,k,jk, flatdir[jk],jk, jk);
+ for(j=1; j <=ncovmodel; jk++,j++){
+ printf(" p[%d]=%12.7f",jk, p[jk]);
+ /*q[jjk]=p[jk];*/
+ }
+ }else{
+ printf(" To be kept %d%d flatdir[%d]=%d jk=%d q[%d]=p[%d] ",i,k,jk, flatdir[jk],jk, jkk, jk);
+ for(j=1; j <=ncovmodel; jk++,jkk++,j++){
+ printf(" p[%d]=%12.7f=q[%d]",jk, p[jk],jkk);
+ /*q[jjk]=p[jk];*/
+ }
+ }
+ printf("\n");
+ }
+ fflush(stdout);
+ }
+ }
+ powell(p,xi,npar,ftol,&iter,&fret,flatdir,func);
+#else /* FLATSUP */
+ powell(p,xi,npar,ftol,&iter,&fret,func);
+#endif /* FLATSUP */
+
+#ifdef LINMINORIGINAL
+#else
+ free_ivector(flatdir,1,npar);
+#endif /* LINMINORIGINAL*/
+#endif /* POWELL */
+
+#ifdef NLOPT
+#ifdef NEWUOA
+ opt = nlopt_create(NLOPT_LN_NEWUOA,npar);
+#else
+ opt = nlopt_create(NLOPT_LN_BOBYQA,npar);
+#endif
+ lb=vector(0,npar-1);
+ for (i=0;ifunction = func;
+ printf(" Func %.12lf \n",myfunc(npar,p1,NULL,d));
+ nlopt_set_min_objective(opt, myfunc, d);
+ nlopt_set_xtol_rel(opt, ftol);
+ if ((creturn=nlopt_optimize(opt, p1, &minf)) < 0) {
+ printf("nlopt failed! %d\n",creturn);
+ }
+ else {
+ printf("found minimum after %d evaluations (NLOPT=%d)\n", countcallfunc ,NLOPT);
+ printf("found minimum at f(%g,%g) = %0.10g\n", p[0], p[1], minf);
+ iter=1; /* not equal */
+ }
+ nlopt_destroy(opt);
+#endif
+#ifdef FLATSUP
+ /* npared = npar -flatd/ncovmodel; */
+ /* xired= matrix(1,npared,1,npared); */
+ /* paramred= ma3x(1,nlstate,1,nlstate+ndeath-1,1,ncovmodel); */
+ /* powell(pred,xired,npared,ftol,&iter,&fret,flatdir,func); */
+ /* free_matrix(xire,1,npared,1,npared); */
+#else /* FLATSUP */
+#endif /* FLATSUP */
+ free_matrix(xi,1,npar,1,npar);
+ fclose(ficrespow);
+ printf("\n#Number of iterations & function calls = %d & %d, -2 Log likelihood = %.12f\n",iter, countcallfunc,func(p));
+ fprintf(ficlog,"\n#Number of iterations & function calls = %d & %d, -2 Log likelihood = %.12f\n",iter, countcallfunc,func(p));
+ fprintf(ficres,"#Number of iterations & function calls = %d & %d, -2 Log likelihood = %.12f\n",iter, countcallfunc,func(p));
+
+}
+
+/**** Computes Hessian and covariance matrix ***/
+void hesscov(double **matcov, double **hess, double p[], int npar, double delti[], double ftolhess, double (*func)(double []))
+{
+ double **a,**y,*x,pd;
+ /* double **hess; */
+ int i, j;
+ int *indx;
+
+ double hessii(double p[], double delta, int theta, double delti[],double (*func)(double []),int npar);
+ double hessij(double p[], double **hess, double delti[], int i, int j,double (*func)(double []),int npar);
+ void lubksb(double **a, int npar, int *indx, double b[]) ;
+ void ludcmp(double **a, int npar, int *indx, double *d) ;
+ double gompertz(double p[]);
+ /* hess=matrix(1,npar,1,npar); */
+
+ printf("\nCalculation of the hessian matrix. Wait...\n");
+ fprintf(ficlog,"\nCalculation of the hessian matrix. Wait...\n");
+ for (i=1;i<=npar;i++){
+ printf("%d-",i);fflush(stdout);
+ fprintf(ficlog,"%d-",i);fflush(ficlog);
+
+ hess[i][i]=hessii(p,ftolhess,i,delti,func,npar);
+
+ /* printf(" %f ",p[i]);
+ printf(" %lf %lf %lf",hess[i][i],ftolhess,delti[i]);*/
+ }
+
+ for (i=1;i<=npar;i++) {
+ for (j=1;j<=npar;j++) {
+ if (j>i) {
+ printf(".%d-%d",i,j);fflush(stdout);
+ fprintf(ficlog,".%d-%d",i,j);fflush(ficlog);
+ hess[i][j]=hessij(p,hess, delti,i,j,func,npar);
+
+ hess[j][i]=hess[i][j];
+ /*printf(" %lf ",hess[i][j]);*/
+ }
+ }
+ }
+ printf("\n");
+ fprintf(ficlog,"\n");
+
+ printf("\nInverting the hessian to get the covariance matrix. Wait...\n");
+ fprintf(ficlog,"\nInverting the hessian to get the covariance matrix. Wait...\n");
+
+ a=matrix(1,npar,1,npar);
+ y=matrix(1,npar,1,npar);
+ x=vector(1,npar);
+ indx=ivector(1,npar);
+ for (i=1;i<=npar;i++)
+ for (j=1;j<=npar;j++) a[i][j]=hess[i][j];
+ ludcmp(a,npar,indx,&pd);
+
+ for (j=1;j<=npar;j++) {
+ for (i=1;i<=npar;i++) x[i]=0;
+ x[j]=1;
+ lubksb(a,npar,indx,x);
+ for (i=1;i<=npar;i++){
+ matcov[i][j]=x[i];
+ }
+ }
+
+ printf("\n#Hessian matrix#\n");
+ fprintf(ficlog,"\n#Hessian matrix#\n");
+ for (i=1;i<=npar;i++) {
+ for (j=1;j<=npar;j++) {
+ printf("%.6e ",hess[i][j]);
+ fprintf(ficlog,"%.6e ",hess[i][j]);
+ }
+ printf("\n");
+ fprintf(ficlog,"\n");
+ }
+
+ /* printf("\n#Covariance matrix#\n"); */
+ /* fprintf(ficlog,"\n#Covariance matrix#\n"); */
+ /* for (i=1;i<=npar;i++) { */
+ /* for (j=1;j<=npar;j++) { */
+ /* printf("%.6e ",matcov[i][j]); */
+ /* fprintf(ficlog,"%.6e ",matcov[i][j]); */
+ /* } */
+ /* printf("\n"); */
+ /* fprintf(ficlog,"\n"); */
+ /* } */
+
+ /* Recompute Inverse */
+ /* for (i=1;i<=npar;i++) */
+ /* for (j=1;j<=npar;j++) a[i][j]=matcov[i][j]; */
+ /* ludcmp(a,npar,indx,&pd); */
+
+ /* printf("\n#Hessian matrix recomputed#\n"); */
+
+ /* for (j=1;j<=npar;j++) { */
+ /* for (i=1;i<=npar;i++) x[i]=0; */
+ /* x[j]=1; */
+ /* lubksb(a,npar,indx,x); */
+ /* for (i=1;i<=npar;i++){ */
+ /* y[i][j]=x[i]; */
+ /* printf("%.3e ",y[i][j]); */
+ /* fprintf(ficlog,"%.3e ",y[i][j]); */
+ /* } */
+ /* printf("\n"); */
+ /* fprintf(ficlog,"\n"); */
+ /* } */
+
+ /* Verifying the inverse matrix */
+#ifdef DEBUGHESS
+ y=matprod2(y,hess,1,npar,1,npar,1,npar,matcov);
+
+ printf("\n#Verification: multiplying the matrix of covariance by the Hessian matrix, should be unity:#\n");
+ fprintf(ficlog,"\n#Verification: multiplying the matrix of covariance by the Hessian matrix. Should be unity:#\n");
+
+ for (j=1;j<=npar;j++) {
+ for (i=1;i<=npar;i++){
+ printf("%.2f ",y[i][j]);
+ fprintf(ficlog,"%.2f ",y[i][j]);
+ }
+ printf("\n");
+ fprintf(ficlog,"\n");
+ }
+#endif
+
+ free_matrix(a,1,npar,1,npar);
+ free_matrix(y,1,npar,1,npar);
+ free_vector(x,1,npar);
+ free_ivector(indx,1,npar);
+ /* free_matrix(hess,1,npar,1,npar); */
+
+
+}
+
+/*************** hessian matrix ****************/
+double hessii(double x[], double delta, int theta, double delti[], double (*func)(double []), int npar)
+{ /* Around values of x, computes the function func and returns the scales delti and hessian */
+ int i;
+ int l=1, lmax=20;
+ double k1,k2, res, fx;
+ double p2[MAXPARM+1]; /* identical to x */
+ double delt=0.0001, delts, nkhi=10.,nkhif=1., khi=1.e-4;
+ int k=0,kmax=10;
+ double l1;
+
+ fx=func(x);
+ for (i=1;i<=npar;i++) p2[i]=x[i];
+ for(l=0 ; l <=lmax; l++){ /* Enlarging the zone around the Maximum */
+ l1=pow(10,l);
+ delts=delt;
+ for(k=1 ; k khi/nkhif) || (k2 >khi/nkhif)){ /* Keeps lastvalue before 3.84/2 KHI2 5% 1d.f. */
+ k=kmax; l=lmax*10;
+ }
+ else if((k1 >khi/nkhi) || (k2 >khi/nkhi)){
+ delts=delt;
+ }
+ } /* End loop k */
+ }
+ delti[theta]=delts;
+ return res;
+
+}
+
+double hessij( double x[], double **hess, double delti[], int thetai,int thetaj,double (*func)(double []),int npar)
+{
+ int i;
+ int l=1, lmax=20;
+ double k1,k2,k3,k4,res,fx;
+ double p2[MAXPARM+1];
+ int k, kmax=1;
+ double v1, v2, cv12, lc1, lc2;
+
+ int firstime=0;
+
+ fx=func(x);
+ for (k=1; k<=kmax; k=k+10) {
+ for (i=1;i<=npar;i++) p2[i]=x[i];
+ p2[thetai]=x[thetai]+delti[thetai]*k;
+ p2[thetaj]=x[thetaj]+delti[thetaj]*k;
+ k1=func(p2)-fx;
+
+ p2[thetai]=x[thetai]+delti[thetai]*k;
+ p2[thetaj]=x[thetaj]-delti[thetaj]*k;
+ k2=func(p2)-fx;
+
+ p2[thetai]=x[thetai]-delti[thetai]*k;
+ p2[thetaj]=x[thetaj]+delti[thetaj]*k;
+ k3=func(p2)-fx;
+
+ p2[thetai]=x[thetai]-delti[thetai]*k;
+ p2[thetaj]=x[thetaj]-delti[thetaj]*k;
+ k4=func(p2)-fx;
+ res=(k1-k2-k3+k4)/4.0/delti[thetai]/k/delti[thetaj]/k/2.; /* Because of L not 2*L */
+ if(k1*k2*k3*k4 <0.){
+ firstime=1;
+ kmax=kmax+10;
+ }
+ if(kmax >=10 || firstime ==1){
+ printf("Warning: directions %d-%d, you are not estimating the Hessian at the exact maximum likelihood; you could increase ftol=%.2e\n",thetai,thetaj, ftol);
+ fprintf(ficlog,"Warning: directions %d-%d, you are not estimating the Hessian at the exact maximum likelihood; you could increase ftol=%.2e\n",thetai,thetaj, ftol);
+ printf("%d %d k=%d, k1=%.12e k2=%.12e k3=%.12e k4=%.12e delti*k=%.12e deltj*k=%.12e, xi-de*k=%.12e xj-de*k=%.12e res=%.12e k1234=%.12e,k1-2=%.12e,k3-4=%.12e\n",thetai,thetaj,k,k1,k2,k3,k4,delti[thetai]/k,delti[thetaj]/k,x[thetai]-delti[thetai]/k,x[thetaj]-delti[thetaj]/k, res,k1-k2-k3+k4,k1-k2,k3-k4);
+ fprintf(ficlog,"%d %d k=%d, k1=%.12e k2=%.12e k3=%.12e k4=%.12e delti*k=%.12e deltj*k=%.12e, xi-de*k=%.12e xj-de*k=%.12e res=%.12e k1234=%.12e,k1-2=%.12e,k3-4=%.12e\n",thetai,thetaj,k,k1,k2,k3,k4,delti[thetai]/k,delti[thetaj]/k,x[thetai]-delti[thetai]/k,x[thetaj]-delti[thetaj]/k, res,k1-k2-k3+k4,k1-k2,k3-k4);
+ }
+#ifdef DEBUGHESSIJ
+ v1=hess[thetai][thetai];
+ v2=hess[thetaj][thetaj];
+ cv12=res;
+ /* Computing eigen value of Hessian matrix */
+ lc1=((v1+v2)+sqrt((v1+v2)*(v1+v2) - 4*(v1*v2-cv12*cv12)))/2.;
+ lc2=((v1+v2)-sqrt((v1+v2)*(v1+v2) - 4*(v1*v2-cv12*cv12)))/2.;
+ if ((lc2 <0) || (lc1 <0) ){
+ printf("Warning: sub Hessian matrix '%d%d' does not have positive eigen values \n",thetai,thetaj);
+ fprintf(ficlog, "Warning: sub Hessian matrix '%d%d' does not have positive eigen values \n",thetai,thetaj);
+ printf("%d %d k=%d, k1=%.12e k2=%.12e k3=%.12e k4=%.12e delti/k=%.12e deltj/k=%.12e, xi-de/k=%.12e xj-de/k=%.12e res=%.12e k1234=%.12e,k1-2=%.12e,k3-4=%.12e\n",thetai,thetaj,k,k1,k2,k3,k4,delti[thetai]/k,delti[thetaj]/k,x[thetai]-delti[thetai]/k,x[thetaj]-delti[thetaj]/k, res,k1-k2-k3+k4,k1-k2,k3-k4);
+ fprintf(ficlog,"%d %d k=%d, k1=%.12e k2=%.12e k3=%.12e k4=%.12e delti/k=%.12e deltj/k=%.12e, xi-de/k=%.12e xj-de/k=%.12e res=%.12e k1234=%.12e,k1-2=%.12e,k3-4=%.12e\n",thetai,thetaj,k,k1,k2,k3,k4,delti[thetai]/k,delti[thetaj]/k,x[thetai]-delti[thetai]/k,x[thetaj]-delti[thetaj]/k, res,k1-k2-k3+k4,k1-k2,k3-k4);
+ }
+#endif
+ }
+ return res;
+}
+
+ /* Not done yet: Was supposed to fix if not exactly at the maximum */
+/* double hessij( double x[], double delti[], int thetai,int thetaj,double (*func)(double []),int npar) */
+/* { */
+/* int i; */
+/* int l=1, lmax=20; */
+/* double k1,k2,k3,k4,res,fx; */
+/* double p2[MAXPARM+1]; */
+/* double delt=0.0001, delts, nkhi=10.,nkhif=1., khi=1.e-4; */
+/* int k=0,kmax=10; */
+/* double l1; */
+
+/* fx=func(x); */
+/* for(l=0 ; l <=lmax; l++){ /\* Enlarging the zone around the Maximum *\/ */
+/* l1=pow(10,l); */
+/* delts=delt; */
+/* for(k=1 ; k khi/nkhif) || (k2 >khi/nkhif) || (k4 >khi/nkhif) || (k4 >khi/nkhif)){ /\* Keeps lastvalue before 3.84/2 KHI2 5% 1d.f. *\/ */
+/* k=kmax; l=lmax*10; */
+/* } */
+/* else if((k1 >khi/nkhi) || (k2 >khi/nkhi)){ */
+/* delts=delt; */
+/* } */
+/* } /\* End loop k *\/ */
+/* } */
+/* delti[theta]=delts; */
+/* return res; */
+/* } */
+
+
+/************** Inverse of matrix **************/
+void ludcmp(double **a, int n, int *indx, double *d)
+{
+ int i,imax,j,k;
+ double big,dum,sum,temp;
+ double *vv;
+
+ vv=vector(1,n);
+ *d=1.0;
+ for (i=1;i<=n;i++) {
+ big=0.0;
+ for (j=1;j<=n;j++)
+ if ((temp=fabs(a[i][j])) > big) big=temp;
+ if (big == 0.0){
+ printf(" Singular Hessian matrix at row %d:\n",i);
+ for (j=1;j<=n;j++) {
+ printf(" a[%d][%d]=%f,",i,j,a[i][j]);
+ fprintf(ficlog," a[%d][%d]=%f,",i,j,a[i][j]);
+ }
+ fflush(ficlog);
+ fclose(ficlog);
+ nrerror("Singular matrix in routine ludcmp");
+ }
+ vv[i]=1.0/big;
+ }
+ for (j=1;j<=n;j++) {
+ for (i=1;i= big) {
+ big=dum;
+ imax=i;
+ }
+ }
+ if (j != imax) {
+ for (k=1;k<=n;k++) {
+ dum=a[imax][k];
+ a[imax][k]=a[j][k];
+ a[j][k]=dum;
+ }
+ *d = -(*d);
+ vv[imax]=vv[j];
+ }
+ indx[j]=imax;
+ if (a[j][j] == 0.0) a[j][j]=TINY;
+ if (j != n) {
+ dum=1.0/(a[j][j]);
+ for (i=j+1;i<=n;i++) a[i][j] *= dum;
+ }
+ }
+ free_vector(vv,1,n); /* Doesn't work */
+;
+}
+
+void lubksb(double **a, int n, int *indx, double b[])
+{
+ int i,ii=0,ip,j;
+ double sum;
+
+ for (i=1;i<=n;i++) {
+ ip=indx[i];
+ sum=b[ip];
+ b[ip]=b[i];
+ if (ii)
+ for (j=ii;j<=i-1;j++) sum -= a[i][j]*b[j];
+ else if (sum) ii=i;
+ b[i]=sum;
+ }
+ for (i=n;i>=1;i--) {
+ sum=b[i];
+ for (j=i+1;j<=n;j++) sum -= a[i][j]*b[j];
+ b[i]=sum/a[i][i];
+ }
+}
+
+void pstamp(FILE *fichier)
+{
+ fprintf(fichier,"# %s.%s\n#IMaCh version %s, %s\n#%s\n# %s", optionfilefiname,optionfilext,version,copyright, fullversion, strstart);
+}
+
+void date2dmy(double date,double *day, double *month, double *year){
+ double yp=0., yp1=0., yp2=0.;
+
+ yp1=modf(date,&yp);/* extracts integral of date in yp and
+ fractional in yp1 */
+ *year=yp;
+ yp2=modf((yp1*12),&yp);
+ *month=yp;
+ yp1=modf((yp2*30.5),&yp);
+ *day=yp;
+ if(*day==0) *day=1;
+ if(*month==0) *month=1;
+}
+
+
+
+/************ Frequencies ********************/
+void freqsummary(char fileres[], double p[], double pstart[], int iagemin, int iagemax, int **s, double **agev, int nlstate, int imx, \
+ int *Tvaraff, int *invalidvarcomb, int **nbcode, int *ncodemax,double **mint,double **anint, char strstart[], \
+ int firstpass, int lastpass, int stepm, int weightopt, char model[])
+{ /* Some frequencies as well as proposing some starting values */
+
+ int i, m, jk, j1, bool, z1,j, nj, nl, k, iv, jj=0, s1=1, s2=1;
+ int iind=0, iage=0;
+ int mi; /* Effective wave */
+ int first;
+ double ***freq; /* Frequencies */
+ double *x, *y, a=0.,b=0.,r=1., sa=0., sb=0.; /* for regression, y=b+m*x and r is the correlation coefficient */
+ int no=0, linreg(int ifi, int ila, int *no, const double x[], const double y[], double* a, double* b, double* r, double* sa, double * sb);
+ double *meanq, *stdq, *idq;
+ double **meanqt;
+ double *pp, **prop, *posprop, *pospropt;
+ double pos=0., posproptt=0., pospropta=0., k2, dateintsum=0,k2cpt=0;
+ char fileresp[FILENAMELENGTH], fileresphtm[FILENAMELENGTH], fileresphtmfr[FILENAMELENGTH];
+ double agebegin, ageend;
+
+ pp=vector(1,nlstate);
+ prop=matrix(1,nlstate,iagemin-AGEMARGE,iagemax+4+AGEMARGE);
+ posprop=vector(1,nlstate); /* Counting the number of transition starting from a live state per age */
+ pospropt=vector(1,nlstate); /* Counting the number of transition starting from a live state */
+ /* prop=matrix(1,nlstate,iagemin,iagemax+3); */
+ meanq=vector(1,nqfveff); /* Number of Quantitative Fixed Variables Effective */
+ stdq=vector(1,nqfveff); /* Number of Quantitative Fixed Variables Effective */
+ idq=vector(1,nqfveff); /* Number of Quantitative Fixed Variables Effective */
+ meanqt=matrix(1,lastpass,1,nqtveff);
+ 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\nFrequencies (weight=%d) and prevalence by age at begin of transition and dummy covariate value at beginning of transition
\n",fileresphtm, fileresphtm, weightopt);
+
+ 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(weight=%d) frequencies of all effective transitions of the model, by age at begin of transition, and covariate value at the begin of transition (if the covariate is a varying covariate)
Unknown status is -1
\n",fileresphtmfr, fileresphtmfr,weightopt);
+
+ y= vector(iagemin-AGEMARGE,iagemax+4+AGEMARGE);
+ x= vector(iagemin-AGEMARGE,iagemax+4+AGEMARGE);
+ freq= ma3x(-5,nlstate+ndeath,-5,nlstate+ndeath,iagemin-AGEMARGE,iagemax+4+AGEMARGE);
+ j1=0;
+
+ /* j=ncoveff; /\* Only fixed dummy covariates *\/ */
+ j=cptcoveff; /* Only dummy covariates of the model */
+ if (cptcovn<1) {j=1;ncodemax[1]=1;}
+
+
+ /* Detects if a combination j1 is empty: for a multinomial variable like 3 education levels:
+ reference=low_education V1=0,V2=0
+ med_educ V1=1 V2=0,
+ high_educ V1=0 V2=1
+ Then V1=1 and V2=1 is a noisy combination that we want to exclude for the list 2**cptcoveff
+ */
+ dateintsum=0;
+ k2cpt=0;
+
+ if(cptcoveff == 0 )
+ nl=1; /* Constant and age model only */
+ else
+ nl=2;
+
+ /* if a constant only model, one pass to compute frequency tables and to write it on ficresp */
+ /* Loop on nj=1 or 2 if dummy covariates j!=0
+ * Loop on j1(1 to 2**cptcoveff) covariate combination
+ * freq[s1][s2][iage] =0.
+ * Loop on iind
+ * ++freq[s1][s2][iage] weighted
+ * end iind
+ * if covariate and j!0
+ * headers Variable on one line
+ * endif cov j!=0
+ * header of frequency table by age
+ * Loop on age
+ * pp[s1]+=freq[s1][s2][iage] weighted
+ * pos+=freq[s1][s2][iage] weighted
+ * Loop on s1 initial state
+ * fprintf(ficresp
+ * end s1
+ * end age
+ * if j!=0 computes starting values
+ * end compute starting values
+ * end j1
+ * end nl
+ */
+ for (nj = 1; nj <= nl; nj++){ /* nj= 1 constant model, nl number of loops. */
+ if(nj==1)
+ j=0; /* First pass for the constant */
+ else{
+ j=cptcoveff; /* Other passes for the covariate values */
+ }
+ first=1;
+ for (j1 = 1; j1 <= (int) pow(2,j); j1++){ /* Loop on all covariates combination of the model, excluding quantitatives, V4=0, V3=0 for example, fixed or varying covariates */
+ posproptt=0.;
+ /*printf("cptcoveff=%d Tvaraff=%d", cptcoveff,Tvaraff[1]);
+ scanf("%d", i);*/
+ for (i=-5; i<=nlstate+ndeath; i++)
+ for (s2=-5; s2<=nlstate+ndeath; s2++)
+ for(m=iagemin; m <= iagemax+3; m++)
+ freq[i][s2][m]=0;
+
+ for (i=1; i<=nlstate; i++) {
+ for(m=iagemin; m <= iagemax+3; m++)
+ prop[i][m]=0;
+ posprop[i]=0;
+ pospropt[i]=0;
+ }
+ for (z1=1; z1<= nqfveff; z1++) { /* zeroing for each combination j1 as well as for the total */
+ idq[z1]=0.;
+ meanq[z1]=0.;
+ stdq[z1]=0.;
+ }
+ /* for (z1=1; z1<= nqtveff; z1++) { */
+ /* for(m=1;m<=lastpass;m++){ */
+ /* meanqt[m][z1]=0.; */
+ /* } */
+ /* } */
+ /* dateintsum=0; */
+ /* k2cpt=0; */
+
+ /* For that combination of covariates j1 (V4=1 V3=0 for example), we count and print the frequencies in one pass */
+ for (iind=1; iind<=imx; iind++) { /* For each individual iind */
+ bool=1;
+ if(j !=0){
+ if(anyvaryingduminmodel==0){ /* If All fixed covariates */
+ if (cptcoveff >0) { /* Filter is here: Must be looked at for model=V1+V2+V3+V4 */
+ for (z1=1; z1<=cptcoveff; z1++) { /* loops on covariates in the model */
+ /* 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)]){ /* for combination j1 of covariates */
+ /* Tests if the value of the covariate z1 for this individual iind responded to combination j1 (V4=1 V3=0) */
+ bool=0; /* bool should be equal to 1 to be selected, one covariate value failed */
+ /* 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 */
+ }/* end j==0 */
+ if (bool==1){ /* We selected an individual iind satisfying combination j1 (V4=1 V3=0) or all fixed covariates */
+ /* 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) && (j==0)) {
+ dateintsum=dateintsum+k2; /* on all covariates ?*/
+ k2cpt++;
+ /* printf("iind=%ld dateintmean = %lf dateintsum=%lf k2cpt=%lf k2=%lf\n",iind, dateintsum/k2cpt, dateintsum,k2cpt, k2); */
+ }
+ }else{
+ bool=1;
+ }/* end bool 2 */
+ } /* end m */
+ /* for (z1=1; z1<= nqfveff; z1++) { /\* Quantitative variables, calculating mean *\/ */
+ /* idq[z1]=idq[z1]+weight[iind]; */
+ /* meanq[z1]+=covar[ncovcol+z1][iind]*weight[iind]; /\* Computes mean of quantitative with selected filter *\/ */
+ /* stdq[z1]+=covar[ncovcol+z1][iind]*covar[ncovcol+z1][iind]*weight[iind]*weight[iind]; /\* *weight[iind];*\/ /\* Computes mean of quantitative with selected filter *\/ */
+ /* } */
+ } /* end bool */
+ } /* end iind = 1 to imx */
+ /* prop[s][age] is fed for any initial and valid live state as well as
+ freq[s1][s2][age] at single age of beginning the transition, for a combination j1 */
+
+
+ /* fprintf(ficresp, "#Count between %.lf/%.lf/%.lf and %.lf/%.lf/%.lf\n",jprev1, mprev1,anprev1,jprev2, mprev2,anprev2);*/
+ if(cptcoveff==0 && nj==1) /* no covariate and first pass */
+ pstamp(ficresp);
+ if (cptcoveff>0 && j!=0){
+ pstamp(ficresp);
+ printf( "\n#********** Variable ");
+ fprintf(ficresp, "\n#********** Variable ");
+ fprintf(ficresphtm, "\n
********** Variable ");
+ fprintf(ficresphtmfr, "\n
********** Variable ");
+ fprintf(ficlog, "\n#********** Variable ");
+ for (z1=1; z1<=cptcoveff; z1++){
+ if(!FixedV[Tvaraff[z1]]){
+ printf( "V%d(fixed)=%d ",Tvaraff[z1],nbcode[Tvaraff[z1]][codtabm(j1,z1)]);
+ fprintf(ficresp, "V%d(fixed)=%d ",Tvaraff[z1],nbcode[Tvaraff[z1]][codtabm(j1,z1)]);
+ fprintf(ficresphtm, "V%d(fixed)=%d ",Tvaraff[z1],nbcode[Tvaraff[z1]][codtabm(j1,z1)]);
+ fprintf(ficresphtmfr, "V%d(fixed)=%d ",Tvaraff[z1],nbcode[Tvaraff[z1]][codtabm(j1,z1)]);
+ fprintf(ficlog, "V%d(fixed)=%d ",Tvaraff[z1],nbcode[Tvaraff[z1]][codtabm(j1,z1)]);
+ }else{
+ printf( "V%d(varying)=%d ",Tvaraff[z1],nbcode[Tvaraff[z1]][codtabm(j1,z1)]);
+ fprintf(ficresp, "V%d(varying)=%d ",Tvaraff[z1],nbcode[Tvaraff[z1]][codtabm(j1,z1)]);
+ fprintf(ficresphtm, "V%d(varying)=%d ",Tvaraff[z1],nbcode[Tvaraff[z1]][codtabm(j1,z1)]);
+ fprintf(ficresphtmfr, "V%d(varying)=%d ",Tvaraff[z1],nbcode[Tvaraff[z1]][codtabm(j1,z1)]);
+ fprintf(ficlog, "V%d(varying)=%d ",Tvaraff[z1],nbcode[Tvaraff[z1]][codtabm(j1,z1)]);
+ }
+ }
+ printf( "**********\n#");
+ fprintf(ficresp, "**********\n#");
+ fprintf(ficresphtm, "**********
\n");
+ fprintf(ficresphtmfr, "**********
\n");
+ fprintf(ficlog, "**********\n");
+ }
+ /*
+ Printing means of quantitative variables if any
+ */
+ for (z1=1; z1<= nqfveff; z1++) {
+ fprintf(ficlog,"Mean of fixed quantitative variable V%d on %.3g (weighted) individuals sum=%f", ncovcol+z1, idq[z1], meanq[z1]);
+ fprintf(ficlog,", mean=%.3g\n",meanq[z1]/idq[z1]);
+ if(weightopt==1){
+ printf(" Weighted mean and standard deviation of");
+ fprintf(ficlog," Weighted mean and standard deviation of");
+ fprintf(ficresphtmfr," Weighted mean and standard deviation of");
+ }
+ /* mu = \frac{w x}{\sum w}
+ var = \frac{\sum w (x-mu)^2}{\sum w} = \frac{w x^2}{\sum w} - mu^2
+ */
+ printf(" fixed quantitative variable V%d on %.3g (weighted) representatives of the population : %8.5g (%8.5g)\n", ncovcol+z1, idq[z1],meanq[z1]/idq[z1], sqrt(stdq[z1]/idq[z1]-meanq[z1]*meanq[z1]/idq[z1]/idq[z1]));
+ fprintf(ficlog," fixed quantitative variable V%d on %.3g (weighted) representatives of the population : %8.5g (%8.5g)\n", ncovcol+z1, idq[z1],meanq[z1]/idq[z1], sqrt(stdq[z1]/idq[z1]-meanq[z1]*meanq[z1]/idq[z1]/idq[z1]));
+ fprintf(ficresphtmfr," fixed quantitative variable V%d on %.3g (weighted) representatives of the population : %8.5g (%8.5g)\n", ncovcol+z1, idq[z1],meanq[z1]/idq[z1], sqrt(stdq[z1]/idq[z1]-meanq[z1]*meanq[z1]/idq[z1]/idq[z1]));
+ }
+ /* for (z1=1; z1<= nqtveff; z1++) { */
+ /* for(m=1;m<=lastpass;m++){ */
+ /* fprintf(ficresphtmfr,"V quantitative id %d, pass id=%d, mean=%f
\n", z1, m, meanqt[m][z1]); */
+ /* } */
+ /* } */
+
+ fprintf(ficresphtm,"
");
+ if((cptcoveff==0 && nj==1)|| nj==2 ) /* no covariate and first pass */
+ fprintf(ficresp, " Age");
+ if(nj==2) for (z1=1; z1<=cptcoveff; z1++) fprintf(ficresp, " V%d=%d",Tvaraff[z1],nbcode[Tvaraff[z1]][codtabm(j1,z1)]);
+ for(i=1; i<=nlstate;i++) {
+ if((cptcoveff==0 && nj==1)|| nj==2 ) fprintf(ficresp," Prev(%d) N(%d) N ",i,i);
+ fprintf(ficresphtm, "Age | Prev(%d) | N(%d) | N | ",i,i);
+ }
+ if((cptcoveff==0 && nj==1)|| nj==2 ) fprintf(ficresp, "\n");
+ fprintf(ficresphtm, "\n");
+
+ /* Header of frequency table by age */
+ fprintf(ficresphtmfr,"");
+ fprintf(ficresphtmfr,"Age | ");
+ for(s2=-1; s2 <=nlstate+ndeath; s2++){
+ for(m=-1; m <=nlstate+ndeath; m++){
+ if(s2!=0 && m!=0)
+ fprintf(ficresphtmfr,"%d%d | ",s2,m);
+ }
+ }
+ fprintf(ficresphtmfr, "\n");
+
+ /* For each age */
+ for(iage=iagemin; iage <= iagemax+3; iage++){
+ fprintf(ficresphtm,"");
+ if(iage==iagemax+1){
+ fprintf(ficlog,"1");
+ fprintf(ficresphtmfr,"
0 | ");
+ }else if(iage==iagemax+2){
+ fprintf(ficlog,"0");
+ fprintf(ficresphtmfr,"
---|
Unknown | ");
+ }else if(iage==iagemax+3){
+ fprintf(ficlog,"Total");
+ fprintf(ficresphtmfr,"
---|
Total | ");
+ }else{
+ if(first==1){
+ first=0;
+ printf("See log file for details...\n");
+ }
+ fprintf(ficresphtmfr,"
---|
%d | ",iage);
+ fprintf(ficlog,"Age %d", iage);
+ }
+ for(s1=1; s1 <=nlstate ; s1++){
+ for(m=-1, pp[s1]=0; m <=nlstate+ndeath ; m++)
+ pp[s1] += freq[s1][m][iage];
+ }
+ for(s1=1; s1 <=nlstate ; s1++){
+ for(m=-1, pos=0; m <=0 ; m++)
+ pos += freq[s1][m][iage];
+ if(pp[s1]>=1.e-10){
+ if(first==1){
+ printf(" %d.=%.0f loss[%d]=%.1f%%",s1,pp[s1],s1,100*pos/pp[s1]);
+ }
+ fprintf(ficlog," %d.=%.0f loss[%d]=%.1f%%",s1,pp[s1],s1,100*pos/pp[s1]);
+ }else{
+ if(first==1)
+ printf(" %d.=%.0f loss[%d]=NaNQ%%",s1,pp[s1],s1);
+ fprintf(ficlog," %d.=%.0f loss[%d]=NaNQ%%",s1,pp[s1],s1);
+ }
+ }
+
+ for(s1=1; s1 <=nlstate ; s1++){
+ /* posprop[s1]=0; */
+ for(m=0, pp[s1]=0; m <=nlstate+ndeath; m++)/* Summing on all ages */
+ pp[s1] += freq[s1][m][iage];
+ } /* pp[s1] is the total number of transitions starting from state s1 and any ending status until this age */
+
+ for(s1=1,pos=0, pospropta=0.; s1 <=nlstate ; s1++){
+ pos += pp[s1]; /* pos is the total number of transitions until this age */
+ posprop[s1] += prop[s1][iage]; /* prop is the number of transitions from a live state
+ from s1 at age iage prop[s[m][iind]][(int)agev[m][iind]] += weight[iind] */
+ pospropta += prop[s1][iage]; /* prop is the number of transitions from a live state
+ from s1 at age iage prop[s[m][iind]][(int)agev[m][iind]] += weight[iind] */
+ }
+
+ /* Writing ficresp */
+ if(cptcoveff==0 && nj==1){ /* no covariate and first pass */
+ if( iage <= iagemax){
+ fprintf(ficresp," %d",iage);
+ }
+ }else if( nj==2){
+ if( iage <= iagemax){
+ fprintf(ficresp," %d",iage);
+ for (z1=1; z1<=cptcoveff; z1++) fprintf(ficresp, " %d %d",Tvaraff[z1],nbcode[Tvaraff[z1]][codtabm(j1,z1)]);
+ }
+ }
+ for(s1=1; s1 <=nlstate ; s1++){
+ if(pos>=1.e-5){
+ if(first==1)
+ printf(" %d.=%.0f prev[%d]=%.1f%%",s1,pp[s1],s1,100*pp[s1]/pos);
+ fprintf(ficlog," %d.=%.0f prev[%d]=%.1f%%",s1,pp[s1],s1,100*pp[s1]/pos);
+ }else{
+ if(first==1)
+ printf(" %d.=%.0f prev[%d]=NaNQ%%",s1,pp[s1],s1);
+ fprintf(ficlog," %d.=%.0f prev[%d]=NaNQ%%",s1,pp[s1],s1);
+ }
+ if( iage <= iagemax){
+ if(pos>=1.e-5){
+ if(cptcoveff==0 && nj==1){ /* no covariate and first pass */
+ fprintf(ficresp," %.5f %.0f %.0f",prop[s1][iage]/pospropta, prop[s1][iage],pospropta);
+ }else if( nj==2){
+ fprintf(ficresp," %.5f %.0f %.0f",prop[s1][iage]/pospropta, prop[s1][iage],pospropta);
+ }
+ fprintf(ficresphtm,"%d | %.5f | %.0f | %.0f | ",iage,prop[s1][iage]/pospropta, prop[s1][iage],pospropta);
+ /*probs[iage][s1][j1]= pp[s1]/pos;*/
+ /*printf("\niage=%d s1=%d j1=%d %.5f %.0f %.0f %f",iage,s1,j1,pp[s1]/pos, pp[s1],pos,probs[iage][s1][j1]);*/
+ } else{
+ if((cptcoveff==0 && nj==1)|| nj==2 ) fprintf(ficresp," NaNq %.0f %.0f",prop[s1][iage],pospropta);
+ fprintf(ficresphtm,"%d | NaNq | %.0f | %.0f | ",iage, prop[s1][iage],pospropta);
+ }
+ }
+ pospropt[s1] +=posprop[s1];
+ } /* end loop s1 */
+ /* pospropt=0.; */
+ for(s1=-1; s1 <=nlstate+ndeath; s1++){
+ for(m=-1; m <=nlstate+ndeath; m++){
+ if(freq[s1][m][iage] !=0 ) { /* minimizing output */
+ if(first==1){
+ printf(" %d%d=%.0f",s1,m,freq[s1][m][iage]);
+ }
+ /* printf(" %d%d=%.0f",s1,m,freq[s1][m][iage]); */
+ fprintf(ficlog," %d%d=%.0f",s1,m,freq[s1][m][iage]);
+ }
+ if(s1!=0 && m!=0)
+ fprintf(ficresphtmfr,"%.0f | ",freq[s1][m][iage]);
+ }
+ } /* end loop s1 */
+ posproptt=0.;
+ for(s1=1; s1 <=nlstate; s1++){
+ posproptt += pospropt[s1];
+ }
+ fprintf(ficresphtmfr,"
\n ");
+ fprintf(ficresphtm,"\n");
+ if((cptcoveff==0 && nj==1)|| nj==2 ) {
+ if(iage <= iagemax)
+ fprintf(ficresp,"\n");
+ }
+ if(first==1)
+ printf("Others in log...\n");
+ fprintf(ficlog,"\n");
+ } /* end loop age iage */
+
+ fprintf(ficresphtm,"Tot | ");
+ for(s1=1; s1 <=nlstate ; s1++){
+ if(posproptt < 1.e-5){
+ fprintf(ficresphtm,"Nanq | %.0f | %.0f | ",pospropt[s1],posproptt);
+ }else{
+ fprintf(ficresphtm,"%.5f | %.0f | %.0f | ",pospropt[s1]/posproptt,pospropt[s1],posproptt);
+ }
+ }
+ fprintf(ficresphtm,"
\n");
+ fprintf(ficresphtm,"
\n");
+ fprintf(ficresphtmfr,"
\n");
+ if(posproptt < 1.e-5){
+ fprintf(ficresphtm,"\n This combination (%d) is not valid and no result will be produced
",j1);
+ fprintf(ficresphtmfr,"\n This combination (%d) is not valid and no result will be produced
",j1);
+ fprintf(ficlog,"# This combination (%d) is not valid and no result will be produced\n",j1);
+ printf("# This combination (%d) is not valid and no result will be produced\n",j1);
+ invalidvarcomb[j1]=1;
+ }else{
+ fprintf(ficresphtm,"\n This combination (%d) is valid and result will be produced.
",j1);
+ invalidvarcomb[j1]=0;
+ }
+ fprintf(ficresphtmfr,"\n");
+ fprintf(ficlog,"\n");
+ if(j!=0){
+ printf("#Freqsummary: Starting values for combination j1=%d:\n", j1);
+ for(i=1,s1=1; i <=nlstate; i++){
+ for(k=1; k <=(nlstate+ndeath); k++){
+ if (k != i) {
+ for(jj=1; jj <=ncovmodel; jj++){ /* For counting s1 */
+ if(jj==1){ /* Constant case (in fact cste + age) */
+ if(j1==1){ /* All dummy covariates to zero */
+ freq[i][k][iagemax+4]=freq[i][k][iagemax+3]; /* Stores case 0 0 0 */
+ freq[i][i][iagemax+4]=freq[i][i][iagemax+3]; /* Stores case 0 0 0 */
+ printf("%d%d ",i,k);
+ fprintf(ficlog,"%d%d ",i,k);
+ printf("%12.7f ln(%.0f/%.0f)= %f, OR=%f sd=%f \n",p[s1],freq[i][k][iagemax+3],freq[i][i][iagemax+3], log(freq[i][k][iagemax+3]/freq[i][i][iagemax+3]),freq[i][k][iagemax+3]/freq[i][i][iagemax+3], sqrt(1/freq[i][k][iagemax+3]+1/freq[i][i][iagemax+3]));
+ fprintf(ficlog,"%12.7f ln(%.0f/%.0f)= %12.7f \n",p[s1],freq[i][k][iagemax+3],freq[i][i][iagemax+3], log(freq[i][k][iagemax+3]/freq[i][i][iagemax+3]));
+ pstart[s1]= log(freq[i][k][iagemax+3]/freq[i][i][iagemax+3]);
+ }
+ }else if((j1==1) && (jj==2 || nagesqr==1)){ /* age or age*age parameter without covariate V4*age (to be done later) */
+ for(iage=iagemin; iage <= iagemax+3; iage++){
+ x[iage]= (double)iage;
+ y[iage]= log(freq[i][k][iage]/freq[i][i][iage]);
+ /* printf("i=%d, k=%d, s1=%d, j1=%d, jj=%d, y[%d]=%f\n",i,k,s1,j1,jj, iage, y[iage]); */
+ }
+ /* Some are not finite, but linreg will ignore these ages */
+ no=0;
+ linreg(iagemin,iagemax,&no,x,y,&a,&b,&r, &sa, &sb ); /* y= a+b*x with standard errors */
+ pstart[s1]=b;
+ pstart[s1-1]=a;
+ }else if( j1!=1 && (j1==2 || (log(j1-1.)/log(2.)-(int)(log(j1-1.)/log(2.))) <0.010) && ( TvarsDind[(int)(log(j1-1.)/log(2.))+1]+2+nagesqr == jj) && Dummy[jj-2-nagesqr]==0){ /* We want only if the position, jj, in model corresponds to unique covariate equal to 1 in j1 combination */
+ printf("j1=%d, jj=%d, (int)(log(j1-1.)/log(2.))+1=%d, TvarsDind[(int)(log(j1-1.)/log(2.))+1]=%d\n",j1, jj,(int)(log(j1-1.)/log(2.))+1,TvarsDind[(int)(log(j1-1.)/log(2.))+1]);
+ printf("j1=%d, jj=%d, (log(j1-1.)/log(2.))+1=%f, TvarsDind[(int)(log(j1-1.)/log(2.))+1]=%d\n",j1, jj,(log(j1-1.)/log(2.))+1,TvarsDind[(int)(log(j1-1.)/log(2.))+1]);
+ pstart[s1]= log((freq[i][k][iagemax+3]/freq[i][i][iagemax+3])/(freq[i][k][iagemax+4]/freq[i][i][iagemax+4]));
+ printf("%d%d ",i,k);
+ fprintf(ficlog,"%d%d ",i,k);
+ printf("s1=%d,i=%d,k=%d,p[%d]=%12.7f ln((%.0f/%.0f)/(%.0f/%.0f))= %f, OR=%f sd=%f \n",s1,i,k,s1,p[s1],freq[i][k][iagemax+3],freq[i][i][iagemax+3],freq[i][k][iagemax+4],freq[i][i][iagemax+4], log((freq[i][k][iagemax+3]/freq[i][i][iagemax+3])/(freq[i][k][iagemax+4]/freq[i][i][iagemax+4])),(freq[i][k][iagemax+3]/freq[i][i][iagemax+3])/(freq[i][k][iagemax+4]/freq[i][i][iagemax+4]), sqrt(1/freq[i][k][iagemax+3]+1/freq[i][i][iagemax+3]+1/freq[i][k][iagemax+4]+1/freq[i][i][iagemax+4]));
+ }else{ /* Other cases, like quantitative fixed or varying covariates */
+ ;
+ }
+ /* printf("%12.7f )", param[i][jj][k]); */
+ /* fprintf(ficlog,"%12.7f )", param[i][jj][k]); */
+ s1++;
+ } /* end jj */
+ } /* end k!= i */
+ } /* end k */
+ } /* end i, s1 */
+ } /* end j !=0 */
+ } /* end selected combination of covariate j1 */
+ if(j==0){ /* We can estimate starting values from the occurences in each case */
+ printf("#Freqsummary: Starting values for the constants:\n");
+ fprintf(ficlog,"\n");
+ for(i=1,s1=1; i <=nlstate; i++){
+ for(k=1; k <=(nlstate+ndeath); k++){
+ if (k != i) {
+ printf("%d%d ",i,k);
+ fprintf(ficlog,"%d%d ",i,k);
+ for(jj=1; jj <=ncovmodel; jj++){
+ pstart[s1]=p[s1]; /* Setting pstart to p values by default */
+ if(jj==1){ /* Age has to be done */
+ pstart[s1]= log(freq[i][k][iagemax+3]/freq[i][i][iagemax+3]);
+ printf("%12.7f ln(%.0f/%.0f)= %12.7f ",p[s1],freq[i][k][iagemax+3],freq[i][i][iagemax+3], log(freq[i][k][iagemax+3]/freq[i][i][iagemax+3]));
+ fprintf(ficlog,"%12.7f ln(%.0f/%.0f)= %12.7f ",p[s1],freq[i][k][iagemax+3],freq[i][i][iagemax+3], log(freq[i][k][iagemax+3]/freq[i][i][iagemax+3]));
+ }
+ /* printf("%12.7f )", param[i][jj][k]); */
+ /* fprintf(ficlog,"%12.7f )", param[i][jj][k]); */
+ s1++;
+ }
+ printf("\n");
+ fprintf(ficlog,"\n");
+ }
+ }
+ } /* end of state i */
+ printf("#Freqsummary\n");
+ fprintf(ficlog,"\n");
+ for(s1=-1; s1 <=nlstate+ndeath; s1++){
+ for(s2=-1; s2 <=nlstate+ndeath; s2++){
+ /* param[i]|j][k]= freq[s1][s2][iagemax+3] */
+ printf(" %d%d=%.0f",s1,s2,freq[s1][s2][iagemax+3]);
+ fprintf(ficlog," %d%d=%.0f",s1,s2,freq[s1][s2][iagemax+3]);
+ /* if(freq[s1][s2][iage] !=0 ) { /\* minimizing output *\/ */
+ /* printf(" %d%d=%.0f",s1,s2,freq[s1][s2][iagemax+3]); */
+ /* fprintf(ficlog," %d%d=%.0f",s1,s2,freq[s1][s2][iagemax+3]); */
+ /* } */
+ }
+ } /* end loop s1 */
+
+ printf("\n");
+ fprintf(ficlog,"\n");
+ } /* end j=0 */
+ } /* end j */
+
+ if(mle == -2){ /* We want to use these values as starting values */
+ for(i=1, jk=1; i <=nlstate; i++){
+ for(j=1; j <=nlstate+ndeath; j++){
+ if(j!=i){
+ /*ca[0]= k+'a'-1;ca[1]='\0';*/
+ printf("%1d%1d",i,j);
+ fprintf(ficparo,"%1d%1d",i,j);
+ for(k=1; k<=ncovmodel;k++){
+ /* printf(" %lf",param[i][j][k]); */
+ /* fprintf(ficparo," %lf",param[i][j][k]); */
+ p[jk]=pstart[jk];
+ printf(" %f ",pstart[jk]);
+ fprintf(ficparo," %f ",pstart[jk]);
+ jk++;
+ }
+ printf("\n");
+ fprintf(ficparo,"\n");
+ }
+ }
+ }
+ } /* end mle=-2 */
+ dateintmean=dateintsum/k2cpt;
+ date2dmy(dateintmean,&jintmean,&mintmean,&aintmean);
+
+ fclose(ficresp);
+ fclose(ficresphtm);
+ fclose(ficresphtmfr);
+ free_vector(idq,1,nqfveff);
+ free_vector(meanq,1,nqfveff);
+ free_vector(stdq,1,nqfveff);
+ free_matrix(meanqt,1,lastpass,1,nqtveff);
+ free_vector(x, iagemin-AGEMARGE, iagemax+4+AGEMARGE);
+ free_vector(y, iagemin-AGEMARGE, iagemax+4+AGEMARGE);
+ free_ma3x(freq,-5,nlstate+ndeath,-5,nlstate+ndeath, iagemin-AGEMARGE, iagemax+4+AGEMARGE);
+ free_vector(pospropt,1,nlstate);
+ free_vector(posprop,1,nlstate);
+ free_matrix(prop,1,nlstate,iagemin-AGEMARGE, iagemax+4+AGEMARGE);
+ free_vector(pp,1,nlstate);
+ /* End of freqsummary */
+}
+
+/* Simple linear regression */
+int linreg(int ifi, int ila, int *no, const double x[], const double y[], double* a, double* b, double* r, double* sa, double * sb) {
+
+ /* y=a+bx regression */
+ double sumx = 0.0; /* sum of x */
+ double sumx2 = 0.0; /* sum of x**2 */
+ double sumxy = 0.0; /* sum of x * y */
+ double sumy = 0.0; /* sum of y */
+ double sumy2 = 0.0; /* sum of y**2 */
+ double sume2 = 0.0; /* sum of square or residuals */
+ double yhat;
+
+ double denom=0;
+ int i;
+ int ne=*no;
+
+ for ( i=ifi, ne=0;i<=ila;i++) {
+ if(!isfinite(x[i]) || !isfinite(y[i])){
+ /* printf(" x[%d]=%f, y[%d]=%f\n",i,x[i],i,y[i]); */
+ continue;
+ }
+ ne=ne+1;
+ sumx += x[i];
+ sumx2 += x[i]*x[i];
+ sumxy += x[i] * y[i];
+ sumy += y[i];
+ sumy2 += y[i]*y[i];
+ denom = (ne * sumx2 - sumx*sumx);
+ /* printf("ne=%d, i=%d,x[%d]=%f, y[%d]=%f sumx=%f, sumx2=%f, sumxy=%f, sumy=%f, sumy2=%f, denom=%f\n",ne,i,i,x[i],i,y[i], sumx, sumx2,sumxy, sumy, sumy2,denom); */
+ }
+
+ denom = (ne * sumx2 - sumx*sumx);
+ if (denom == 0) {
+ // vertical, slope m is infinity
+ *b = INFINITY;
+ *a = 0;
+ if (r) *r = 0;
+ return 1;
+ }
+
+ *b = (ne * sumxy - sumx * sumy) / denom;
+ *a = (sumy * sumx2 - sumx * sumxy) / denom;
+ if (r!=NULL) {
+ *r = (sumxy - sumx * sumy / ne) / /* compute correlation coeff */
+ sqrt((sumx2 - sumx*sumx/ne) *
+ (sumy2 - sumy*sumy/ne));
+ }
+ *no=ne;
+ for ( i=ifi, ne=0;i<=ila;i++) {
+ if(!isfinite(x[i]) || !isfinite(y[i])){
+ /* printf(" x[%d]=%f, y[%d]=%f\n",i,x[i],i,y[i]); */
+ continue;
+ }
+ ne=ne+1;
+ yhat = y[i] - *a -*b* x[i];
+ sume2 += yhat * yhat ;
+
+ denom = (ne * sumx2 - sumx*sumx);
+ /* printf("ne=%d, i=%d,x[%d]=%f, y[%d]=%f sumx=%f, sumx2=%f, sumxy=%f, sumy=%f, sumy2=%f, denom=%f\n",ne,i,i,x[i],i,y[i], sumx, sumx2,sumxy, sumy, sumy2,denom); */
+ }
+ *sb = sqrt(sume2/(double)(ne-2)/(sumx2 - sumx * sumx /(double)ne));
+ *sa= *sb * sqrt(sumx2/ne);
+
+ return 0;
+}
+
+/************ Prevalence ********************/
+void prevalence(double ***probs, double agemin, double agemax, int **s, double **agev, int nlstate, int imx, int *Tvar, int **nbcode, int *ncodemax,double **mint,double **anint, double dateprev1,double dateprev2, int firstpass, int lastpass)
+{
+ /* 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.
+ */
+
+ int i, m, jk, j1, bool, z1,j, iv;
+ int mi; /* Effective wave */
+ int iage;
+ double agebegin, ageend;
+
+ double **prop;
+ double posprop;
+ double y2; /* in fractional years */
+ int iagemin, iagemax;
+ int first; /** to stop verbosity which is redirected to log file */
+
+ iagemin= (int) agemin;
+ iagemax= (int) agemax;
+ /*pp=vector(1,nlstate);*/
+ prop=matrix(1,nlstate,iagemin-AGEMARGE,iagemax+4+AGEMARGE);
+ /* freq=ma3x(-1,nlstate+ndeath,-1,nlstate+ndeath,iagemin,iagemax+3);*/
+ j1=0;
+
+ /*j=cptcoveff;*/
+ if (cptcovn<1) {j=1;ncodemax[1]=1;}
+
+ first=0;
+ for(j1=1; j1<= (int) pow(2,cptcoveff);j1++){ /* For each combination of covariate */
+ for (i=1; i<=nlstate; i++)
+ for(iage=iagemin-AGEMARGE; iage <= iagemax+4+AGEMARGE; iage++)
+ prop[i][iage]=0.0;
+ printf("Prevalence combination of varying and fixed dummies %d\n",j1);
+ /* fprintf(ficlog," V%d=%d ",Tvaraff[j1],nbcode[Tvaraff[j1]][codtabm(k,j1)]); */
+ fprintf(ficlog,"Prevalence combination of varying and fixed dummies %d\n",j1);
+
+ for (i=1; i<=imx; i++) { /* Each individual */
+ 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+4+AGEMARGE){
+ printf("Error on individual # %d agev[m][i]=%f <%d-%d or > %d+3+%d m=%d; either change agemin or agemax or fix data\n",i, agev[m][i],iagemin,AGEMARGE, iagemax,AGEMARGE,m);
+ exit(1);
+ }
+ 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];/* 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 */
+ } /* end bool */
+ } /* end wave */
+ } /* end individual */
+ 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){
+ first=1;
+ printf("Warning Observed prevalence doesn't sum to 1 for state %d: probs[%d][%d][%d]=%lf because of lack of cases\nSee others in log file...\n",jk,i,jk, j1,probs[i][jk][j1]);
+ }else{
+ fprintf(ficlog,"Warning Observed prevalence doesn't sum to 1 for state %d: probs[%d][%d][%d]=%lf because of lack of cases.\n",jk,i,jk, j1,probs[i][jk][j1]);
+ }
+ }
+ }
+ }/* end jk */
+ }/* end i */
+ /*} *//* end i1 */
+ } /* end j1 */
+
+ /* free_ma3x(freq,-1,nlstate+ndeath,-1,nlstate+ndeath, iagemin, iagemax+3);*/
+ /*free_vector(pp,1,nlstate);*/
+ free_matrix(prop,1,nlstate, iagemin-AGEMARGE,iagemax+4+AGEMARGE);
+} /* End of prevalence */
+
+/************* Waves Concatenation ***************/
+
+void concatwav(int wav[], int **dh, int **bh, int **mw, int **s, double *agedc, double **agev, int firstpass, int lastpass, int imx, int nlstate, int stepm)
+{
+ /* Concatenates waves: wav[i] is the number of effective (useful waves in the sense that a non interview is useless) of individual i.
+ Death is a valid wave (if date is known).
+ mw[mi][i] is the mi (mi=1 to wav[i]) effective wave 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. s[m][i] exists for any wave from firstpass to lastpass
+ */
+
+ int i=0, mi=0, m=0, mli=0;
+ /* int j, k=0,jk, ju, jl,jmin=1e+5, jmax=-1;
+ double sum=0., jmean=0.;*/
+ int first=0, firstwo=0, firsthree=0, firstfour=0, firstfiv=0;
+ int j, k=0,jk, ju, jl;
+ double sum=0.;
+ first=0;
+ firstwo=0;
+ firsthree=0;
+ firstfour=0;
+ jmin=100000;
+ jmax=-1;
+ jmean=0.;
+
+/* Treating live states */
+ for(i=1; i<=imx; i++){ /* For simple cases and if state is death */
+ mi=0; /* First valid wave */
+ mli=0; /* Last valid wave */
+ m=firstpass; /* Loop on waves */
+ while(s[m][i] <= nlstate){ /* a live state or unknown state */
+ if(m >firstpass && s[m][i]==s[m-1][i] && mint[m][i]==mint[m-1][i] && anint[m][i]==anint[m-1][i]){/* Two succesive identical information on wave m */
+ mli=m-1;/* mw[++mi][i]=m-1; */
+ }else 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; /* Valid wave: incrementing mi and updating mi; mw[mi] is the wave number of mi_th valid transition */
+ mli=m;
+ } /* else might be a useless wave -1 and mi is not incremented and mw[mi] not updated */
+ if(m < lastpass){ /* m < lastpass, standard case */
+ m++; /* mi gives the "effective" current wave, m the current wave, go to next wave by incrementing m */
+ }
+ else{ /* m = lastpass, eventual special issue with warning */
+#ifdef UNKNOWNSTATUSNOTCONTRIBUTING
+ break;
+#else
+ if(s[m][i]==-1 && (int) andc[i] == 9999 && (int)anint[m][i] != 9999){ /* no death date and known date of interview, case -2 (vital status unknown is warned later */
+ if(firsthree == 0){
+ printf("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 as 1-p_{%d%d} .\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, s[m][i], nlstate+ndeath);
+ firsthree=1;
+ }else if(firsthree >=1 && firsthree < 10){
+ 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 as 1-p_{%d%d} .\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, s[m][i], nlstate+ndeath);
+ firsthree++;
+ }else if(firsthree == 10){
+ printf("Information, too many Information flags: no more reported to log either\n");
+ fprintf(ficlog,"Information, too many Information flags: no more reported to log either\n");
+ firsthree++;
+ }else{
+ firsthree++;
+ }
+ mw[++mi][i]=m; /* Valid transition with unknown status */
+ mli=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?not a transition */
+ 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.\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;
+#endif
+ }/* End m >= lastpass */
+ }/* end while */
+
+ /* mi is the last effective wave, m is lastpass, mw[j][i] gives the # of j-th effective wave for individual i */
+ /* After last pass */
+/* Treating death states */
+ if (s[m][i] > nlstate){ /* In a death state */
+ /* if( mint[m][i]==mdc[m][i] && anint[m][i]==andc[m][i]){ /\* same date of death and date of interview *\/ */
+ /* } */
+ 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 not in a death state */
+#ifndef DISPATCHINGKNOWNDEATHAFTERLASTWAVE
+ else if ((int) andc[i] != 9999) { /* Date of death is known */
+ if ((int)anint[m][i]!= 9999) { /* date of last interview is known */
+ if((andc[i]+moisdc[i]/12.) <=(anint[m][i]+mint[m][i]/12.)){ /* month of death occured before last wave month and status should have been death instead of -1 */
+ nbwarn++;
+ if(firstfiv==0){
+ printf("Warning! Death for individual %ld line=%d occurred at %d/%d before last wave %d, interviewed on %d/%d and should have been coded as death instead of '%d'. This case (%d)/wave (%d) is contributing 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], s[m][i], i,m );
+ firstfiv=1;
+ }else{
+ fprintf(ficlog,"Warning! Death for individual %ld line=%d occurred at %d/%d before last wave %d, interviewed on %d/%d and should have been coded as death instead of '%d'. This case (%d)/wave (%d) is contributing to likelihood.\n",num[i],i,(int) moisdc[i], (int) andc[i], lastpass,(int)mint[m][i],(int)anint[m][i], s[m][i], i,m );
+ }
+ s[m][i]=nlstate+1; /* Fixing the status as death. Be careful if multiple death states */
+ }else{ /* Month of Death occured afer last wave month, potential bias */
+ nberr++;
+ if(firstwo==0){
+ printf("Error! Death for individual %ld line=%d occurred at %d/%d after last wave %d interviewed at %d/%d with status %d. Potential bias if other individuals are still alive on this date but ignored. This case (%d)/wave (%d) is skipped, no contribution to likelihood. Please add a new fictitious wave at the date of last vital status scan, with a dead status. See documentation\nOthers in log file only\n",num[i],i,(int) moisdc[i], (int) andc[i], lastpass,(int)mint[m][i],(int)anint[m][i], s[m][i], i,m );
+ firstwo=1;
+ }
+ fprintf(ficlog,"Error! Death for individual %ld line=%d occurred at %d/%d after last wave %d interviewed at %d/%d with status %d. Potential bias if other individuals are still alive on this date but ignored. This case (%d)/wave (%d) is skipped, no contribution to likelihood. Please add a new fictitious wave at the date of last vital status scan, with a dead status. See documentation\n\n",num[i],i,(int) moisdc[i], (int) andc[i], lastpass,(int)mint[m][i],(int)anint[m][i], s[m][i], i,m );
+ }
+ }else{ /* if date of interview is unknown */
+ /* death is known but not confirmed by death status at any wave */
+ if(firstfour==0){
+ printf("Error! Death for individual %ld line=%d occurred %d/%d but not confirmed by any death status for any wave, including last wave %d at unknown date %d/%d with status %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], s[m][i], i,m );
+ firstfour=1;
+ }
+ fprintf(ficlog,"Error! Death for individual %ld line=%d occurred %d/%d but not confirmed by any death status for any wave, including last wave %d at unknown date %d/%d with status %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.\n",num[i],i,(int) moisdc[i], (int) andc[i], lastpass,(int)mint[m][i],(int)anint[m][i], s[m][i], i,m );
+ }
+ } /* end if date of death is known */
+#endif
+ wav[i]=mi; /* mi should be the last effective wave (or mli), */
+ /* wav[i]=mw[mi][i]; */
+ if(mi==0){
+ nbwarn++;
+ if(first==0){
+ printf("Warning! No valid information for individual %ld line=%d (skipped) and may be others, see log file\n",num[i],i);
+ first=1;
+ }
+ if(first==1){
+ fprintf(ficlog,"Warning! No valid information for individual %ld line=%d (skipped)\n",num[i],i);
+ }
+ } /* end mi==0 */
+ } /* End individuals */
+ /* wav and mw are no more changed */
+
+ printf("Information, you have to check %d informations which haven't been logged!\n",firsthree);
+ fprintf(ficlog,"Information, you have to check %d informations which haven't been logged!\n",firsthree);
+
+
+ for(i=1; i<=imx; i++){
+ for(mi=1; mi nlstate) { /* A death, but what if date is unknown? */
+ if (agedc[i] < 2*AGESUP) {
+ j= rint(agedc[i]*12-agev[mw[mi][i]][i]*12);
+ if(j==0) j=1; /* Survives at least one month after exam */
+ else if(j<0){
+ nberr++;
+ printf("Error! Negative delay (%d to death) between waves %d and %d of individual %ld at line %d who is aged %.1f with statuses from %d to %d\n ",j,mw[mi][i],mw[mi+1][i],num[i], i,agev[mw[mi][i]][i],s[mw[mi][i]][i] ,s[mw[mi+1][i]][i]);
+ j=1; /* Temporary Dangerous patch */
+ printf(" We assumed that the date of interview was correct (and not the date of death) and postponed the death %d month(s) (one stepm) after the interview. You MUST fix the contradiction between dates.\n",stepm);
+ fprintf(ficlog,"Error! Negative delay (%d to death) between waves %d and %d of individual %ld at line %d who is aged %.1f with statuses from %d to %d\n ",j,mw[mi][i],mw[mi+1][i],num[i], i,agev[mw[mi][i]][i],s[mw[mi][i]][i] ,s[mw[mi+1][i]][i]);
+ fprintf(ficlog," We assumed that the date of interview was correct (and not the date of death) and postponed the death %d month(s) (one stepm) after the interview. You MUST fix the contradiction between dates.\n",stepm);
+ }
+ k=k+1;
+ if (j >= jmax){
+ jmax=j;
+ ijmax=i;
+ }
+ if (j <= jmin){
+ jmin=j;
+ ijmin=i;
+ }
+ sum=sum+j;
+ /*if (j<0) printf("j=%d num=%d \n",j,i);*/
+ /* printf("%d %d %d %d\n", s[mw[mi][i]][i] ,s[mw[mi+1][i]][i],j,i);*/
+ }
+ }
+ else{
+ j= rint( (agev[mw[mi+1][i]][i]*12 - agev[mw[mi][i]][i]*12));
+/* if (j<0) printf("%d %lf %lf %d %d %d\n", i,agev[mw[mi+1][i]][i], agev[mw[mi][i]][i],j,s[mw[mi][i]][i] ,s[mw[mi+1][i]][i]); */
+
+ k=k+1;
+ if (j >= jmax) {
+ jmax=j;
+ ijmax=i;
+ }
+ else if (j <= jmin){
+ jmin=j;
+ ijmin=i;
+ }
+ /* if (j<10) printf("j=%d jmin=%d num=%d ",j,jmin,i); */
+ /*printf("%d %lf %d %d %d\n", i,agev[mw[mi][i]][i],j,s[mw[mi][i]][i] ,s[mw[mi+1][i]][i]);*/
+ if(j<0){
+ nberr++;
+ printf("Error! Negative delay (%d) between waves %d and %d of individual %ld at line %d who is aged %.1f with statuses from %d to %d\n ",j,mw[mi][i],mw[mi+1][i],num[i], i,agev[mw[mi][i]][i],s[mw[mi][i]][i] ,s[mw[mi+1][i]][i]);
+ fprintf(ficlog,"Error! Negative delay (%d) between waves %d and %d of individual %ld at line %d who is aged %.1f with statuses from %d to %d\n ",j,mw[mi][i],mw[mi+1][i],num[i], i,agev[mw[mi][i]][i],s[mw[mi][i]][i] ,s[mw[mi+1][i]][i]);
+ }
+ sum=sum+j;
+ }
+ jk= j/stepm;
+ jl= j -jk*stepm;
+ ju= j -(jk+1)*stepm;
+ if(mle <=1){ /* only if we use a the linear-interpoloation pseudo-likelihood */
+ if(jl==0){
+ dh[mi][i]=jk;
+ bh[mi][i]=0;
+ }else{ /* We want a negative bias in order to only have interpolation ie
+ * to avoid the price of an extra matrix product in likelihood */
+ dh[mi][i]=jk+1;
+ bh[mi][i]=ju;
+ }
+ }else{
+ if(jl <= -ju){
+ dh[mi][i]=jk;
+ bh[mi][i]=jl; /* bias is positive if real duration
+ * is higher than the multiple of stepm and negative otherwise.
+ */
+ }
+ else{
+ dh[mi][i]=jk+1;
+ bh[mi][i]=ju;
+ }
+ if(dh[mi][i]==0){
+ dh[mi][i]=1; /* At least one step */
+ bh[mi][i]=ju; /* At least one step */
+ /* printf(" bh=%d ju=%d jl=%d dh=%d jk=%d stepm=%d %d\n",bh[mi][i],ju,jl,dh[mi][i],jk,stepm,i);*/
+ }
+ } /* end if mle */
+ }
+ } /* end wave */
+ }
+ jmean=sum/k;
+ printf("Delay (in months) between two waves Min=%d (for indiviudal %ld) Max=%d (%ld) Mean=%f\n\n ",jmin, num[ijmin], jmax, num[ijmax], jmean);
+ fprintf(ficlog,"Delay (in months) between two waves Min=%d (for indiviudal %d) Max=%d (%d) Mean=%f\n\n ",jmin, ijmin, jmax, ijmax, jmean);
+}
+
+/*********** Tricode ****************************/
+ void tricode(int *cptcov, int *Tvar, int **nbcode, int imx, int *Ndum)
+ {
+ /**< Uses cptcovn+2*cptcovprod as the number of covariates */
+ /* Tvar[i]=atoi(stre); find 'n' in Vn and stores in Tvar. If model=V2+V1 Tvar[1]=2 and Tvar[2]=1
+ * Boring subroutine which should only output nbcode[Tvar[j]][k]
+ * Tvar[5] in V2+V1+V3*age+V2*V4 is 4 (V4) even it is a time varying or quantitative variable
+ * nbcode[Tvar[5]][1]= nbcode[4][1]=0, nbcode[4][2]=1 (usually);
+ */
+
+ int ij=1, k=0, j=0, i=0, maxncov=NCOVMAX;
+ int modmaxcovj=0; /* Modality max of covariates j */
+ int cptcode=0; /* Modality max of covariates j */
+ int modmincovj=0; /* Modality min of covariates j */
+
+
+ /* cptcoveff=0; */
+ /* *cptcov=0; */
+
+ for (k=1; k <= maxncov; k++) ncodemax[k]=0; /* Horrible constant again replaced by NCOVMAX */
+ for (k=1; k <= maxncov; k++)
+ for(j=1; j<=2; j++)
+ nbcode[k][j]=0; /* Valgrind */
+
+ /* Loop on covariates without age and products and no quantitative variable */
+ for (k=1; k<=cptcovt; k++) { /* From model V1 + V2*age + V3 + V3*V4 keeps V1 + V3 = 2 only */
+ for (j=-1; (j < maxncov); j++) Ndum[j]=0;
+ if(Dummy[k]==0 && Typevar[k] !=1){ /* Dummy covariate and not age product */
+ switch(Fixed[k]) {
+ case 0: /* Testing on fixed dummy covariate, simple or product of fixed */
+ modmaxcovj=0;
+ modmincovj=0;
+ for (i=1; i<=imx; i++) { /* Loop on individuals: reads the data file to get the maximum value of the modality of this covariate Vj*/
+ ij=(int)(covar[Tvar[k]][i]);
+ /* ij=0 or 1 or -1. Value of the covariate Tvar[j] for individual i
+ * If product of Vn*Vm, still boolean *:
+ * If it was coded 1, 2, 3, 4 should be splitted into 3 boolean variables
+ * 1 => 0 0 0, 2 => 0 0 1, 3 => 0 1 1, 4=1 0 0 */
+ /* Finds for covariate j, n=Tvar[j] of Vn . ij is the
+ modality of the nth covariate of individual i. */
+ if (ij > modmaxcovj)
+ modmaxcovj=ij;
+ else if (ij < modmincovj)
+ modmincovj=ij;
+ if (ij <0 || ij >1 ){
+ printf("ERROR, IMaCh doesn't treat covariate with missing values V%d=-1, individual %d will be skipped.\n",Tvar[k],i);
+ fprintf(ficlog,"ERROR, currently IMaCh doesn't treat covariate with missing values V%d=-1, individual %d will be skipped.\n",Tvar[k],i);
+ fflush(ficlog);
+ exit(1);
+ }
+ if ((ij < -1) || (ij > NCOVMAX)){
+ printf( "Error: minimal is less than -1 or maximal is bigger than %d. Exiting. \n", NCOVMAX );
+ exit(1);
+ }else
+ Ndum[ij]++; /*counts and stores the occurence of this modality 0, 1, -1*/
+ /* If coded 1, 2, 3 , counts the number of 1 Ndum[1], number of 2, Ndum[2], etc */
+ /*printf("i=%d ij=%d Ndum[ij]=%d imx=%d",i,ij,Ndum[ij],imx);*/
+ /* getting the maximum value of the modality of the covariate
+ (should be 0 or 1 now) Tvar[j]. If V=sex and male is coded 0 and
+ female ies 1, then modmaxcovj=1.
+ */
+ } /* end for loop on individuals i */
+ printf(" Minimal and maximal values of %d th (fixed) covariate V%d: min=%d max=%d \n", k, Tvar[k], modmincovj, modmaxcovj);
+ fprintf(ficlog," Minimal and maximal values of %d th (fixed) covariate V%d: min=%d max=%d \n", k, Tvar[k], modmincovj, modmaxcovj);
+ cptcode=modmaxcovj;
+ /* Ndum[0] = frequency of 0 for model-covariate j, Ndum[1] frequency of 1 etc. */
+ /*for (i=0; i<=cptcode; i++) {*/
+ for (j=modmincovj; j<=modmaxcovj; j++) { /* j=-1 ? 0 and 1*//* For each value j of the modality of model-cov k */
+ printf("Frequencies of (fixed) covariate %d ie V%d with value %d: %d\n", k, Tvar[k], j, Ndum[j]);
+ fprintf(ficlog, "Frequencies of (fixed) covariate %d ie V%d with value %d: %d\n", k, Tvar[k], j, Ndum[j]);
+ if( Ndum[j] != 0 ){ /* Counts if nobody answered modality j ie empty modality, we skip it and reorder */
+ if( j != -1){
+ ncodemax[k]++; /* ncodemax[k]= Number of modalities of the k th
+ covariate for which somebody answered excluding
+ undefined. Usually 2: 0 and 1. */
+ }
+ ncodemaxwundef[k]++; /* ncodemax[j]= Number of modalities of the k th
+ covariate for which somebody answered including
+ undefined. Usually 3: -1, 0 and 1. */
+ } /* In fact ncodemax[k]=2 (dichotom. variables only) but it could be more for
+ * historical reasons: 3 if coded 1, 2, 3 and 4 and Ndum[2]=0 */
+ } /* Ndum[-1] number of undefined modalities */
+
+ /* j is a covariate, n=Tvar[j] of Vn; Fills nbcode */
+ /* For covariate j, modalities could be 1, 2, 3, 4, 5, 6, 7. */
+ /* If Ndum[1]=0, Ndum[2]=0, Ndum[3]= 635, Ndum[4]=0, Ndum[5]=0, Ndum[6]=27, Ndum[7]=125; */
+ /* modmincovj=3; modmaxcovj = 7; */
+ /* There are only 3 modalities non empty 3, 6, 7 (or 2 if 27 is too few) : ncodemax[j]=3; */
+ /* which will be coded 0, 1, 2 which in binary on 2=3-1 digits are 0=00 1=01, 2=10; */
+ /* defining two dummy variables: variables V1_1 and V1_2.*/
+ /* nbcode[Tvar[j]][ij]=k; */
+ /* nbcode[Tvar[j]][1]=0; */
+ /* nbcode[Tvar[j]][2]=1; */
+ /* nbcode[Tvar[j]][3]=2; */
+ /* To be continued (not working yet). */
+ ij=0; /* ij is similar to i but can jump over null modalities */
+
+ /* for (i=modmincovj; i<=modmaxcovj; i++) { */ /* i= 1 to 2 for dichotomous, or from 1 to 3 or from -1 or 0 to 1 currently*/
+ /* Skipping the case of missing values by reducing nbcode to 0 and 1 and not -1, 0, 1 */
+ /* model=V1+V2+V3, if V2=-1, 0 or 1, then nbcode[2][1]=0 and nbcode[2][2]=1 instead of
+ * nbcode[2][1]=-1, nbcode[2][2]=0 and nbcode[2][3]=1 */
+ /*, could be restored in the future */
+ for (i=0; i<=1; i++) { /* i= 1 to 2 for dichotomous, or from 1 to 3 or from -1 or 0 to 1 currently*/
+ if (Ndum[i] == 0) { /* If nobody responded to this modality k */
+ break;
+ }
+ ij++;
+ nbcode[Tvar[k]][ij]=i; /* stores the original value of modality i in an array nbcode, ij modality from 1 to last non-nul modality. nbcode[1][1]=0 nbcode[1][2]=1 . Could be -1*/
+ cptcode = ij; /* New max modality for covar j */
+ } /* end of loop on modality i=-1 to 1 or more */
+ break;
+ case 1: /* Testing on varying covariate, could be simple and
+ * should look at waves or product of fixed *
+ * varying. No time to test -1, assuming 0 and 1 only */
+ ij=0;
+ for(i=0; i<=1;i++){
+ nbcode[Tvar[k]][++ij]=i;
+ }
+ break;
+ default:
+ break;
+ } /* end switch */
+ } /* end dummy test */
+ if(Dummy[k]==1 && Typevar[k] !=1){ /* Dummy covariate and not age product */
+ for (i=1; i<=imx; i++) { /* Loop on individuals: reads the data file to get the maximum value of the modality of this covariate Vj*/
+ if(isnan(covar[Tvar[k]][i])){
+ printf("ERROR, IMaCh doesn't treat fixed quantitative covariate with missing values V%d=., individual %d will be skipped.\n",Tvar[k],i);
+ fprintf(ficlog,"ERROR, currently IMaCh doesn't treat covariate with missing values V%d=., individual %d will be skipped.\n",Tvar[k],i);
+ fflush(ficlog);
+ exit(1);
+ }
+ }
+ }
+ } /* end of loop on model-covariate k. nbcode[Tvark][1]=-1, nbcode[Tvark][1]=0 and nbcode[Tvark][2]=1 sets the value of covariate k*/
+
+ for (k=-1; k< maxncov; k++) Ndum[k]=0;
+ /* Look at fixed dummy (single or product) covariates to check empty modalities */
+ for (i=1; i<=ncovmodel-2-nagesqr; i++) { /* -2, cste and age and eventually age*age */
+ /* Listing of all covariables in statement model to see if some covariates appear twice. For example, V1 appears twice in V1+V1*V2.*/
+ ij=Tvar[i]; /* Tvar 5,4,3,6,5,7,1,4 in V5+V4+V3+V4*V3+V5*age+V2+V1*V2+V1*age+V4*age */
+ Ndum[ij]++; /* Count the # of 1, 2 etc: {1,1,1,2,2,1,1} because V1 once, V2 once, two V4 and V5 in above */
+ /* V5+V4+V3+V4*V3+V5*age+V2+V1*V2+V1*age+V1, {2, 1, 1, 1, 2, 1, 1, 0, 0} */
+ } /* V4+V3+V5, Ndum[1]@5={0, 0, 1, 1, 1} */
+
+ ij=0;
+ /* for (i=0; i<= maxncov-1; i++) { /\* modmaxcovj is unknown here. Only Ndum[2(V2),3(age*V3), 5(V3*V2) 6(V1*V4) *\/ */
+ for (k=1; k<= cptcovt; k++) { /* modmaxcovj is unknown here. Only Ndum[2(V2),3(age*V3), 5(V3*V2) 6(V1*V4) */
+ /*printf("Ndum[%d]=%d\n",i, Ndum[i]);*/
+ /* if((Ndum[i]!=0) && (i<=ncovcol)){ /\* Tvar[i] <= ncovmodel ? *\/ */
+ if(Ndum[Tvar[k]]!=0 && Dummy[k] == 0 && Typevar[k]==0){ /* Only Dummy and non empty in the model */
+ /* If product not in single variable we don't print results */
+ /*printf("diff Ndum[%d]=%d\n",i, Ndum[i]);*/
+ ++ij;/* V5+V4+V3+V4*V3+V5*age+V2+V1*V2+V1*age+V1, */
+ Tvaraff[ij]=Tvar[k]; /* For printing combination *//* V5+V4+V3+V4*V3+V5*age+V2+V1*V2+V1*age+V1, Tvar {5, 4, 3, 6, 5, 2, 7, 1, 1} Tvaraff={4, 3, 1} V4, V3, V1*/
+ Tmodelind[ij]=k; /* Tmodelind: index in model of dummies Tmodelind[1]=2 V4: pos=2; V3: pos=3, V1=9 {2, 3, 9, ?, ?,} */
+ TmodelInvind[ij]=Tvar[k]- ncovcol-nqv; /* Inverse TmodelInvind[2=V4]=2 second dummy varying cov (V4)4-1-1 {0, 2, 1, } TmodelInvind[3]=1 */
+ if(Fixed[k]!=0)
+ anyvaryingduminmodel=1;
+ /* }else if((Ndum[i]!=0) && (i<=ncovcol+nqv)){ */
+ /* Tvaraff[++ij]=-10; /\* Dont'n know how to treat quantitative variables yet *\/ */
+ /* }else if((Ndum[i]!=0) && (i<=ncovcol+nqv+ntv)){ */
+ /* Tvaraff[++ij]=i; /\*For printing (unclear) *\/ */
+ /* }else if((Ndum[i]!=0) && (i<=ncovcol+nqv+ntv+nqtv)){ */
+ /* Tvaraff[++ij]=-20; /\* Dont'n know how to treat quantitative variables yet *\/ */
+ }
+ } /* Tvaraff[1]@5 {3, 4, -20, 0, 0} Very strange */
+ /* ij--; */
+ /* cptcoveff=ij; /\*Number of total covariates*\/ */
+ *cptcov=ij; /*Number of total real effective covariates: effective
+ * because they can be excluded from the model and real
+ * if in the model but excluded because missing values, but how to get k from ij?*/
+ for(j=ij+1; j<= cptcovt; j++){
+ Tvaraff[j]=0;
+ Tmodelind[j]=0;
+ }
+ for(j=ntveff+1; j<= cptcovt; j++){
+ TmodelInvind[j]=0;
+ }
+ /* To be sorted */
+ ;
+ }
+
+
+/*********** 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[], int nres )
+
+{
+ /* Health expectancies, no variances */
+ int i, j, nhstepm, hstepm, h, nstepm;
+ int nhstepma, nstepma; /* Decreasing with age */
+ double age, agelim, hf;
+ double ***p3mat;
+ double eip;
+
+ /* pstamp(ficreseij); */
+ fprintf(ficreseij,"# (a) Life expectancies by health status at initial age and (b) health expectancies by health status at initial age\n");
+ fprintf(ficreseij,"# Age");
+ for(i=1; i<=nlstate;i++){
+ for(j=1; j<=nlstate;j++){
+ fprintf(ficreseij," e%1d%1d ",i,j);
+ }
+ fprintf(ficreseij," e%1d. ",i);
+ }
+ fprintf(ficreseij,"\n");
+
+
+ if(estepm < stepm){
+ printf ("Problem %d lower than %d\n",estepm, stepm);
+ }
+ else hstepm=estepm;
+ /* We compute the life expectancy from trapezoids spaced every estepm months
+ * This is mainly to measure the difference between two models: for example
+ * if stepm=24 months pijx are given only every 2 years and by summing them
+ * we are calculating an estimate of the Life Expectancy assuming a linear
+ * progression in between and thus overestimating or underestimating according
+ * to the curvature of the survival function. If, for the same date, we
+ * estimate the model with stepm=1 month, we can keep estepm to 24 months
+ * to compare the new estimate of Life expectancy with the same linear
+ * hypothesis. A more precise result, taking into account a more precise
+ * curvature will be obtained if estepm is as small as stepm. */
+
+ /* For example we decided to compute the life expectancy with the smallest unit */
+ /* hstepm beeing the number of stepms, if hstepm=1 the length of hstepm is stepm.
+ nhstepm is the number of hstepm from age to agelim
+ nstepm is the number of stepm from age to agelin.
+ Look at hpijx to understand the reason which relies in memory size consideration
+ and note for a fixed period like estepm months */
+ /* We decided (b) to get a life expectancy respecting the most precise curvature of the
+ survival function given by stepm (the optimization length). Unfortunately it
+ means that if the survival funtion is printed only each two years of age and if
+ you sum them up and add 1 year (area under the trapezoids) you won't get the same
+ results. So we changed our mind and took the option of the best precision.
+ */
+ hstepm=hstepm/stepm; /* Typically in stepm units, if stepm=6 & estepm=24 , = 24/6 months = 4 */
+
+ agelim=AGESUP;
+ /* If stepm=6 months */
+ /* Computed by stepm unit matrices, product of hstepm matrices, stored
+ in an array of nhstepm length: nhstepm=10, hstepm=4, stepm=6 months */
+
+/* nhstepm age range expressed in number of stepm */
+ nstepm=(int) rint((agelim-bage)*YEARM/stepm); /* Biggest nstepm */
+ /* Typically if 20 years nstepm = 20*12/6=40 stepm */
+ /* if (stepm >= YEARM) hstepm=1;*/
+ nhstepm = nstepm/hstepm;/* Expressed in hstepm, typically nhstepm=40/4=10 */
+ p3mat=ma3x(1,nlstate+ndeath,1, nlstate+ndeath, 0,nhstepm);
+
+ for (age=bage; age<=fage; age ++){
+ nstepma=(int) rint((agelim-bage)*YEARM/stepm); /* Biggest nstepm */
+ /* Typically if 20 years nstepm = 20*12/6=40 stepm */
+ /* if (stepm >= YEARM) hstepm=1;*/
+ nhstepma = nstepma/hstepm;/* Expressed in hstepm, typically nhstepma=40/4=10 */
+
+ /* If stepm=6 months */
+ /* 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, nres);
+
+ hf=hstepm*stepm/YEARM; /* Duration of hstepm expressed in year unit. */
+
+ printf("%d|",(int)age);fflush(stdout);
+ fprintf(ficlog,"%d|",(int)age);fflush(ficlog);
+
+ /* Computing expectancies */
+ 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++){
+ eij[i][j][(int)age] += (p3mat[i][j][h]+p3mat[i][j][h+1])/2.0*hf;
+
+ /* if((int)age==70)printf("i=%2d,j=%2d,h=%2d,age=%3d,%9.4f,%9.4f,%9.4f\n",i,j,h,(int)age,p3mat[i][j][h],hf,eij[i][j][(int)age]);*/
+
+ }
+
+ fprintf(ficreseij,"%3.0f",age );
+ for(i=1; i<=nlstate;i++){
+ eip=0;
+ for(j=1; j<=nlstate;j++){
+ eip +=eij[i][j][(int)age];
+ fprintf(ficreseij,"%9.4f", eij[i][j][(int)age] );
+ }
+ fprintf(ficreseij,"%9.4f", eip );
+ }
+ fprintf(ficreseij,"\n");
+
+ }
+ free_ma3x(p3mat,1,nlstate+ndeath,1, nlstate+ndeath, 0,nhstepm);
+ printf("\n");
+ fprintf(ficlog,"\n");
+
+}
+
+ 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
+ to initial status i, ei. .
+ */
+ int i, j, nhstepm, hstepm, h, nstepm, k, cptj, cptj2, i2, j2, ij, ji;
+ int nhstepma, nstepma; /* Decreasing with age */
+ double age, agelim, hf;
+ double ***p3matp, ***p3matm, ***varhe;
+ double **dnewm,**doldm;
+ double *xp, *xm;
+ double **gp, **gm;
+ double ***gradg, ***trgradg;
+ int theta;
+
+ double eip, vip;
+
+ varhe=ma3x(1,nlstate*nlstate,1,nlstate*nlstate,(int) bage, (int) fage);
+ xp=vector(1,npar);
+ xm=vector(1,npar);
+ dnewm=matrix(1,nlstate*nlstate,1,npar);
+ doldm=matrix(1,nlstate*nlstate,1,nlstate*nlstate);
+
+ pstamp(ficresstdeij);
+ fprintf(ficresstdeij,"# Health expectancies with standard errors\n");
+ fprintf(ficresstdeij,"# Age");
+ for(i=1; i<=nlstate;i++){
+ for(j=1; j<=nlstate;j++)
+ fprintf(ficresstdeij," e%1d%1d (SE)",i,j);
+ fprintf(ficresstdeij," e%1d. ",i);
+ }
+ fprintf(ficresstdeij,"\n");
+
+ pstamp(ficrescveij);
+ fprintf(ficrescveij,"# Subdiagonal matrix of covariances of health expectancies by age: cov(eij,ekl)\n");
+ fprintf(ficrescveij,"# Age");
+ for(i=1; i<=nlstate;i++)
+ for(j=1; j<=nlstate;j++){
+ cptj= (j-1)*nlstate+i;
+ for(i2=1; i2<=nlstate;i2++)
+ for(j2=1; j2<=nlstate;j2++){
+ cptj2= (j2-1)*nlstate+i2;
+ if(cptj2 <= cptj)
+ fprintf(ficrescveij," %1d%1d,%1d%1d",i,j,i2,j2);
+ }
+ }
+ fprintf(ficrescveij,"\n");
+
+ if(estepm < stepm){
+ printf ("Problem %d lower than %d\n",estepm, stepm);
+ }
+ else hstepm=estepm;
+ /* We compute the life expectancy from trapezoids spaced every estepm months
+ * This is mainly to measure the difference between two models: for example
+ * if stepm=24 months pijx are given only every 2 years and by summing them
+ * we are calculating an estimate of the Life Expectancy assuming a linear
+ * progression in between and thus overestimating or underestimating according
+ * to the curvature of the survival function. If, for the same date, we
+ * estimate the model with stepm=1 month, we can keep estepm to 24 months
+ * to compare the new estimate of Life expectancy with the same linear
+ * hypothesis. A more precise result, taking into account a more precise
+ * curvature will be obtained if estepm is as small as stepm. */
+
+ /* For example we decided to compute the life expectancy with the smallest unit */
+ /* hstepm beeing the number of stepms, if hstepm=1 the length of hstepm is stepm.
+ nhstepm is the number of hstepm from age to agelim
+ nstepm is the number of stepm from age to agelin.
+ Look at hpijx to understand the reason of that which relies in memory size
+ and note for a fixed period like estepm months */
+ /* We decided (b) to get a life expectancy respecting the most precise curvature of the
+ survival function given by stepm (the optimization length). Unfortunately it
+ means that if the survival funtion is printed only each two years of age and if
+ you sum them up and add 1 year (area under the trapezoids) you won't get the same
+ results. So we changed our mind and took the option of the best precision.
+ */
+ hstepm=hstepm/stepm; /* Typically in stepm units, if stepm=6 & estepm=24 , = 24/6 months = 4 */
+
+ /* If stepm=6 months */
+ /* nhstepm age range expressed in number of stepm */
+ agelim=AGESUP;
+ nstepm=(int) rint((agelim-bage)*YEARM/stepm);
+ /* Typically if 20 years nstepm = 20*12/6=40 stepm */
+ /* if (stepm >= YEARM) hstepm=1;*/
+ nhstepm = nstepm/hstepm;/* Expressed in hstepm, typically nhstepm=40/4=10 */
+
+ p3matp=ma3x(1,nlstate+ndeath,1, nlstate+ndeath, 0,nhstepm);
+ p3matm=ma3x(1,nlstate+ndeath,1, nlstate+ndeath, 0,nhstepm);
+ gradg=ma3x(0,nhstepm,1,npar,1,nlstate*nlstate);
+ trgradg =ma3x(0,nhstepm,1,nlstate*nlstate,1,npar);
+ gp=matrix(0,nhstepm,1,nlstate*nlstate);
+ gm=matrix(0,nhstepm,1,nlstate*nlstate);
+
+ for (age=bage; age<=fage; age ++){
+ nstepma=(int) rint((agelim-bage)*YEARM/stepm); /* Biggest nstepm */
+ /* Typically if 20 years nstepm = 20*12/6=40 stepm */
+ /* if (stepm >= YEARM) hstepm=1;*/
+ nhstepma = nstepma/hstepm;/* Expressed in hstepm, typically nhstepma=40/4=10 */
+
+ /* If stepm=6 months */
+ /* Computed by stepm unit matrices, product of hstepma matrices, stored
+ in an array of nhstepma length: nhstepma=10, hstepm=4, stepm=6 months */
+
+ hf=hstepm*stepm/YEARM; /* Duration of hstepm expressed in year unit. */
+
+ /* Computing Variances of health expectancies */
+ /* Gradient is computed with plus gp and minus gm. Code is duplicated in order to
+ decrease memory allocation */
+ for(theta=1; theta <=npar; theta++){
+ for(i=1; i<=npar; i++){
+ 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, 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++){
+ for(h=0; h<=nhstepm-1; h++){
+ gp[h][(j-1)*nlstate + i] = (p3matp[i][j][h]+p3matp[i][j][h+1])/2.;
+ gm[h][(j-1)*nlstate + i] = (p3matm[i][j][h]+p3matm[i][j][h+1])/2.;
+ }
+ }
+ }
+
+ for(ij=1; ij<= nlstate*nlstate; ij++)
+ for(h=0; h<=nhstepm-1; h++){
+ gradg[h][theta][ij]= (gp[h][ij]-gm[h][ij])/2./delti[theta];
+ }
+ }/* End theta */
+
+
+ for(h=0; h<=nhstepm-1; h++)
+ for(j=1; j<=nlstate*nlstate;j++)
+ for(theta=1; theta <=npar; theta++)
+ trgradg[h][j][theta]=gradg[h][theta][j];
+
+
+ for(ij=1;ij<=nlstate*nlstate;ij++)
+ for(ji=1;ji<=nlstate*nlstate;ji++)
+ varhe[ij][ji][(int)age] =0.;
+
+ printf("%d|",(int)age);fflush(stdout);
+ fprintf(ficlog,"%d|",(int)age);fflush(ficlog);
+ for(h=0;h<=nhstepm-1;h++){
+ for(k=0;k<=nhstepm-1;k++){
+ matprod2(dnewm,trgradg[h],1,nlstate*nlstate,1,npar,1,npar,matcov);
+ matprod2(doldm,dnewm,1,nlstate*nlstate,1,npar,1,nlstate*nlstate,gradg[k]);
+ for(ij=1;ij<=nlstate*nlstate;ij++)
+ for(ji=1;ji<=nlstate*nlstate;ji++)
+ varhe[ij][ji][(int)age] += doldm[ij][ji]*hf*hf;
+ }
+ }
+ /* if((int)age ==50){ */
+ /* printf(" age=%d cij=%d nres=%d varhe[%d][%d]=%f ",(int)age, cij, nres, 1,2,varhe[1][2]); */
+ /* } */
+ /* Computing expectancies */
+ 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++){
+ eij[i][j][(int)age] += (p3matm[i][j][h]+p3matm[i][j][h+1])/2.0*hf;
+
+ /* if((int)age==70)printf("i=%2d,j=%2d,h=%2d,age=%3d,%9.4f,%9.4f,%9.4f\n",i,j,h,(int)age,p3mat[i][j][h],hf,eij[i][j][(int)age]);*/
+
+ }
+
+ /* Standard deviation of expectancies ij */
+ fprintf(ficresstdeij,"%3.0f",age );
+ for(i=1; i<=nlstate;i++){
+ eip=0.;
+ vip=0.;
+ for(j=1; j<=nlstate;j++){
+ eip += eij[i][j][(int)age];
+ for(k=1; k<=nlstate;k++) /* Sum on j and k of cov(eij,eik) */
+ vip += varhe[(j-1)*nlstate+i][(k-1)*nlstate+i][(int)age];
+ fprintf(ficresstdeij," %9.4f (%.4f)", eij[i][j][(int)age], sqrt(varhe[(j-1)*nlstate+i][(j-1)*nlstate+i][(int)age]) );
+ }
+ fprintf(ficresstdeij," %9.4f (%.4f)", eip, sqrt(vip));
+ }
+ fprintf(ficresstdeij,"\n");
+
+ /* Variance of expectancies ij */
+ fprintf(ficrescveij,"%3.0f",age );
+ for(i=1; i<=nlstate;i++)
+ for(j=1; j<=nlstate;j++){
+ cptj= (j-1)*nlstate+i;
+ for(i2=1; i2<=nlstate;i2++)
+ for(j2=1; j2<=nlstate;j2++){
+ cptj2= (j2-1)*nlstate+i2;
+ if(cptj2 <= cptj)
+ fprintf(ficrescveij," %.4f", varhe[cptj][cptj2][(int)age]);
+ }
+ }
+ fprintf(ficrescveij,"\n");
+
+ }
+ free_matrix(gm,0,nhstepm,1,nlstate*nlstate);
+ free_matrix(gp,0,nhstepm,1,nlstate*nlstate);
+ free_ma3x(gradg,0,nhstepm,1,npar,1,nlstate*nlstate);
+ free_ma3x(trgradg,0,nhstepm,1,nlstate*nlstate,1,npar);
+ free_ma3x(p3matm,1,nlstate+ndeath,1, nlstate+ndeath, 0,nhstepm);
+ free_ma3x(p3matp,1,nlstate+ndeath,1, nlstate+ndeath, 0,nhstepm);
+ printf("\n");
+ fprintf(ficlog,"\n");
+
+ free_vector(xm,1,npar);
+ free_vector(xp,1,npar);
+ free_matrix(dnewm,1,nlstate*nlstate,1,npar);
+ free_matrix(doldm,1,nlstate*nlstate,1,nlstate*nlstate);
+ free_ma3x(varhe,1,nlstate*nlstate,1,nlstate*nlstate,(int) bage, (int)fage);
+}
- for (i=1;i<=n;i++) {
- ip=indx[i];
- sum=b[ip];
- b[ip]=b[i];
- if (ii)
- for (j=ii;j<=i-1;j++) sum -= a[i][j]*b[j];
- else if (sum) ii=i;
- b[i]=sum;
- }
- for (i=n;i>=1;i--) {
- sum=b[i];
- for (j=i+1;j<=n;j++) sum -= a[i][j]*b[j];
- b[i]=sum/a[i][i];
- }
-}
+/************ 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[], int nres)
+ {
+ /** Variance of health expectancies
+ * double **prevalim(double **prlim, int nlstate, double *xp, double age, double **oldm, double ** savm,double ftolpl);
+ * double **newm;
+ * int movingaverage(double ***probs, double bage,double fage, double ***mobaverage, int mobilav)
+ */
+
+ /* int movingaverage(); */
+ double **dnewm,**doldm;
+ double **dnewmp,**doldmp;
+ int i, j, nhstepm, hstepm, h, nstepm ;
+ int first=0;
+ int k;
+ double *xp;
+ double **gp, **gm; /**< for var eij */
+ double ***gradg, ***trgradg; /**< for var eij */
+ double **gradgp, **trgradgp; /**< for var p point j */
+ double *gpp, *gmp; /**< for var p point j */
+ double **varppt; /**< for var p point j nlstate to nlstate+ndeath */
+ double ***p3mat;
+ double age,agelim, hf;
+ /* double ***mobaverage; */
+ int theta;
+ char digit[4];
+ char digitp[25];
+
+ char fileresprobmorprev[FILENAMELENGTH];
+
+ if(popbased==1){
+ if(mobilav!=0)
+ strcpy(digitp,"-POPULBASED-MOBILAV_");
+ else strcpy(digitp,"-POPULBASED-NOMOBIL_");
+ }
+ else
+ strcpy(digitp,"-STABLBASED_");
-void pstamp(FILE *fichier)
+ /* if (mobilav!=0) { */
+ /* mobaverage= ma3x(1, AGESUP,1,NCOVMAX, 1,NCOVMAX); */
+ /* if (movingaverage(probs, bage, fage, mobaverage,mobilav)!=0){ */
+ /* fprintf(ficlog," Error in movingaverage mobilav=%d\n",mobilav); */
+ /* printf(" Error in movingaverage mobilav=%d\n",mobilav); */
+ /* } */
+ /* } */
+
+ strcpy(fileresprobmorprev,"PRMORPREV-");
+ sprintf(digit,"%-d",ij);
+ /*printf("DIGIT=%s, ij=%d ijr=%-d|\n",digit, ij,ij);*/
+ strcat(fileresprobmorprev,digit); /* Tvar to be done */
+ strcat(fileresprobmorprev,digitp); /* Popbased or not, mobilav or not */
+ strcat(fileresprobmorprev,fileresu);
+ if((ficresprobmorprev=fopen(fileresprobmorprev,"w"))==NULL) {
+ printf("Problem with resultfile: %s\n", fileresprobmorprev);
+ fprintf(ficlog,"Problem with resultfile: %s\n", fileresprobmorprev);
+ }
+ printf("Computing total mortality p.j=w1*p1j+w2*p2j+..: result on file '%s' \n",fileresprobmorprev);
+ fprintf(ficlog,"Computing total mortality p.j=w1*p1j+w2*p2j+..: result on file '%s' \n",fileresprobmorprev);
+ pstamp(ficresprobmorprev);
+ fprintf(ficresprobmorprev,"# probabilities of dying before estepm=%d months for people of exact age and weighted probabilities w1*p1j+w2*p2j+... stand dev in()\n",estepm);
+ fprintf(ficresprobmorprev,"# Selected quantitative variables and dummies");
+ for (j=1; j<= nsq; j++){ /* For each selected (single) quantitative value */
+ fprintf(ficresprobmorprev," V%d=%f ",Tvqresult[nres][j],Tqresult[nres][j]);
+ }
+ for(j=1;j<=cptcoveff;j++)
+ fprintf(ficresprobmorprev,"V%d=%d ",Tvaraff[j],nbcode[Tvaraff[j]][codtabm(ij,j)]);
+ fprintf(ficresprobmorprev,"\n");
+
+ fprintf(ficresprobmorprev,"# Age cov=%-d",ij);
+ for(j=nlstate+1; j<=(nlstate+ndeath);j++){
+ fprintf(ficresprobmorprev," p.%-d SE",j);
+ for(i=1; i<=nlstate;i++)
+ fprintf(ficresprobmorprev," w%1d p%-d%-d",i,i,j);
+ }
+ fprintf(ficresprobmorprev,"\n");
+
+ fprintf(ficgp,"\n# Routine varevsij");
+ fprintf(ficgp,"\nunset title \n");
+ /* fprintf(fichtm, "#Local time at start: %s", strstart);*/
+ fprintf(fichtm,"\n Computing probabilities of dying over estepm months as a weighted average (i.e global mortality independent of initial healh state)
\n");
+ fprintf(fichtm,"\n
%s
\n",digitp);
+
+ varppt = matrix(nlstate+1,nlstate+ndeath,nlstate+1,nlstate+ndeath);
+ pstamp(ficresvij);
+ fprintf(ficresvij,"# Variance and covariance of health expectancies e.j \n# (weighted average of eij where weights are ");
+ if(popbased==1)
+ fprintf(ficresvij,"the age specific prevalence observed (cross-sectionally) in the population i.e cross-sectionally\n in each health state (popbased=1) (mobilav=%d\n",mobilav);
+ else
+ fprintf(ficresvij,"the age specific period (stable) prevalences in each health state \n");
+ fprintf(ficresvij,"# Age");
+ for(i=1; i<=nlstate;i++)
+ for(j=1; j<=nlstate;j++)
+ fprintf(ficresvij," Cov(e.%1d, e.%1d)",i,j);
+ fprintf(ficresvij,"\n");
+
+ xp=vector(1,npar);
+ dnewm=matrix(1,nlstate,1,npar);
+ doldm=matrix(1,nlstate,1,nlstate);
+ dnewmp= matrix(nlstate+1,nlstate+ndeath,1,npar);
+ doldmp= matrix(nlstate+1,nlstate+ndeath,nlstate+1,nlstate+ndeath);
+
+ gradgp=matrix(1,npar,nlstate+1,nlstate+ndeath);
+ gpp=vector(nlstate+1,nlstate+ndeath);
+ gmp=vector(nlstate+1,nlstate+ndeath);
+ trgradgp =matrix(nlstate+1,nlstate+ndeath,1,npar); /* mu or p point j*/
+
+ if(estepm < stepm){
+ printf ("Problem %d lower than %d\n",estepm, stepm);
+ }
+ else hstepm=estepm;
+ /* For example we decided to compute the life expectancy with the smallest unit */
+ /* hstepm beeing the number of stepms, if hstepm=1 the length of hstepm is stepm.
+ nhstepm is the number of hstepm from age to agelim
+ nstepm is the number of stepm from age to agelim.
+ Look at function hpijx to understand why because of memory size limitations,
+ we decided (b) to get a life expectancy respecting the most precise curvature of the
+ survival function given by stepm (the optimization length). Unfortunately it
+ means that if the survival funtion is printed every two years of age and if
+ you sum them up and add 1 year (area under the trapezoids) you won't get the same
+ results. So we changed our mind and took the option of the best precision.
+ */
+ hstepm=hstepm/stepm; /* Typically in stepm units, if stepm=6 & estepm=24 , = 24/6 months = 4 */
+ agelim = AGESUP;
+ for (age=bage; age<=fage; age ++){ /* If stepm=6 months */
+ nstepm=(int) rint((agelim-age)*YEARM/stepm); /* Typically 20 years = 20*12/6=40 */
+ nhstepm = nstepm/hstepm;/* Expressed in hstepm, typically nhstepm=40/4=10 */
+ p3mat=ma3x(1,nlstate+ndeath,1, nlstate+ndeath, 0,nhstepm);
+ gradg=ma3x(0,nhstepm,1,npar,1,nlstate);
+ gp=matrix(0,nhstepm,1,nlstate);
+ gm=matrix(0,nhstepm,1,nlstate);
+
+
+ for(theta=1; theta <=npar; theta++){
+ for(i=1; i<=npar; i++){ /* Computes gradient x + delta*/
+ xp[i] = x[i] + (i==theta ?delti[theta]:0);
+ }
+ /**< Computes the prevalence limit with parameter theta shifted of delta up to ftolpl precision and
+ * returns into prlim .
+ */
+ prevalim(prlim,nlstate,xp,age,oldm,savm,ftolpl,ncvyearp,ij, nres);
+
+ /* If popbased = 1 we use crossection prevalences. Previous step is useless but prlim is created */
+ if (popbased==1) {
+ if(mobilav ==0){
+ for(i=1; i<=nlstate;i++)
+ prlim[i][i]=probs[(int)age][i][ij];
+ }else{ /* mobilav */
+ for(i=1; i<=nlstate;i++)
+ prlim[i][i]=mobaverage[(int)age][i][ij];
+ }
+ }
+ /**< Computes the shifted transition matrix \f$ {}{h}_p^{ij}x\f$ at horizon h.
+ */
+ hpxij(p3mat,nhstepm,age,hstepm,xp,nlstate,stepm,oldm,savm, ij,nres); /* Returns p3mat[i][j][h] for h=0 to nhstepm */
+ /**< And for each alive state j, sums over i \f$ w^i_x {}{h}_p^{ij}x\f$, which are the probability
+ * at horizon h in state j including mortality.
+ */
+ for(j=1; j<= nlstate; j++){
+ for(h=0; h<=nhstepm; h++){
+ for(i=1, gp[h][j]=0.;i<=nlstate;i++)
+ gp[h][j] += prlim[i][i]*p3mat[i][j][h];
+ }
+ }
+ /* Next for computing shifted+ probability of death (h=1 means
+ computed over hstepm matrices product = hstepm*stepm months)
+ as a weighted average of prlim(i) * p(i,j) p.3=w1*p13 + w2*p23 .
+ */
+ for(j=nlstate+1;j<=nlstate+ndeath;j++){
+ for(i=1,gpp[j]=0.; i<= nlstate; i++)
+ gpp[j] += prlim[i][i]*p3mat[i][j][1];
+ }
+
+ /* Again with minus shift */
+
+ 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, nres);
+
+ if (popbased==1) {
+ if(mobilav ==0){
+ for(i=1; i<=nlstate;i++)
+ prlim[i][i]=probs[(int)age][i][ij];
+ }else{ /* mobilav */
+ for(i=1; i<=nlstate;i++)
+ prlim[i][i]=mobaverage[(int)age][i][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++){
+ for(i=1, gm[h][j]=0.;i<=nlstate;i++)
+ gm[h][j] += prlim[i][i]*p3mat[i][j][h];
+ }
+ }
+ /* This for computing probability of death (h=1 means
+ computed over hstepm matrices product = hstepm*stepm months)
+ as a weighted average of prlim.
+ */
+ 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];
+ }
+ /* end shifting computations */
+
+ /**< Computing gradient matrix at horizon h
+ */
+ for(j=1; j<= nlstate; j++) /* vareij */
+ for(h=0; h<=nhstepm; h++){
+ gradg[h][theta][j]= (gp[h][j]-gm[h][j])/2./delti[theta];
+ }
+ /**< Gradient of overall mortality p.3 (or p.j)
+ */
+ for(j=nlstate+1; j<= nlstate+ndeath; j++){ /* var mu mortality from j */
+ gradgp[theta][j]= (gpp[j]-gmp[j])/2./delti[theta];
+ }
+
+ } /* End theta */
+
+ /* We got the gradient matrix for each theta and state j */
+ trgradg =ma3x(0,nhstepm,1,nlstate,1,npar); /* veij */
+
+ for(h=0; h<=nhstepm; h++) /* veij */
+ for(j=1; j<=nlstate;j++)
+ for(theta=1; theta <=npar; theta++)
+ trgradg[h][j][theta]=gradg[h][theta][j];
+
+ for(j=nlstate+1; j<=nlstate+ndeath;j++) /* mu */
+ for(theta=1; theta <=npar; theta++)
+ trgradgp[j][theta]=gradgp[theta][j];
+ /**< as well as its transposed matrix
+ */
+
+ hf=hstepm*stepm/YEARM; /* Duration of hstepm expressed in year unit. */
+ for(i=1;i<=nlstate;i++)
+ for(j=1;j<=nlstate;j++)
+ vareij[i][j][(int)age] =0.;
+
+ /* Computing trgradg by matcov by gradg at age and summing over h
+ * and k (nhstepm) formula 15 of article
+ * Lievre-Brouard-Heathcote
+ */
+
+ for(h=0;h<=nhstepm;h++){
+ for(k=0;k<=nhstepm;k++){
+ matprod2(dnewm,trgradg[h],1,nlstate,1,npar,1,npar,matcov);
+ matprod2(doldm,dnewm,1,nlstate,1,npar,1,nlstate,gradg[k]);
+ for(i=1;i<=nlstate;i++)
+ for(j=1;j<=nlstate;j++)
+ vareij[i][j][(int)age] += doldm[i][j]*hf*hf;
+ }
+ }
+
+ /* pptj is p.3 or p.j = trgradgp by cov by gradgp, variance of
+ * p.j overall mortality formula 49 but computed directly because
+ * we compute the grad (wix pijx) instead of grad (pijx),even if
+ * wix is independent of theta.
+ */
+ matprod2(dnewmp,trgradgp,nlstate+1,nlstate+ndeath,1,npar,1,npar,matcov);
+ matprod2(doldmp,dnewmp,nlstate+1,nlstate+ndeath,1,npar,nlstate+1,nlstate+ndeath,gradgp);
+ for(j=nlstate+1;j<=nlstate+ndeath;j++)
+ for(i=nlstate+1;i<=nlstate+ndeath;i++)
+ varppt[j][i]=doldmp[j][i];
+ /* end ppptj */
+ /* x centered again */
+
+ prevalim(prlim,nlstate,x,age,oldm,savm,ftolpl,ncvyearp,ij, nres);
+
+ if (popbased==1) {
+ if(mobilav ==0){
+ for(i=1; i<=nlstate;i++)
+ prlim[i][i]=probs[(int)age][i][ij];
+ }else{ /* mobilav */
+ for(i=1; i<=nlstate;i++)
+ prlim[i][i]=mobaverage[(int)age][i][ij];
+ }
+ }
+
+ /* This for computing probability of death (h=1 means
+ 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, 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];
+ }
+ /* end probability of death */
+
+ fprintf(ficresprobmorprev,"%3d %d ",(int) age, ij);
+ for(j=nlstate+1; j<=(nlstate+ndeath);j++){
+ fprintf(ficresprobmorprev," %11.3e %11.3e",gmp[j], sqrt(varppt[j][j]));
+ for(i=1; i<=nlstate;i++){
+ fprintf(ficresprobmorprev," %11.3e %11.3e ",prlim[i][i],p3mat[i][j][1]);
+ }
+ }
+ fprintf(ficresprobmorprev,"\n");
+
+ fprintf(ficresvij,"%.0f ",age );
+ for(i=1; i<=nlstate;i++)
+ for(j=1; j<=nlstate;j++){
+ fprintf(ficresvij," %.4f", vareij[i][j][(int)age]);
+ }
+ fprintf(ficresvij,"\n");
+ free_matrix(gp,0,nhstepm,1,nlstate);
+ free_matrix(gm,0,nhstepm,1,nlstate);
+ free_ma3x(gradg,0,nhstepm,1,npar,1,nlstate);
+ free_ma3x(trgradg,0,nhstepm,1,nlstate,1,npar);
+ free_ma3x(p3mat,1,nlstate+ndeath,1, nlstate+ndeath, 0,nhstepm);
+ } /* End age */
+ free_vector(gpp,nlstate+1,nlstate+ndeath);
+ free_vector(gmp,nlstate+1,nlstate+ndeath);
+ free_matrix(gradgp,1,npar,nlstate+1,nlstate+ndeath);
+ free_matrix(trgradgp,nlstate+1,nlstate+ndeath,1,npar); /* mu or p point j*/
+ /* fprintf(ficgp,"\nunset parametric;unset label; set ter png small size 320, 240"); */
+ fprintf(ficgp,"\nunset parametric;unset label; set ter svg size 640, 480");
+ /* for(j=nlstate+1; j<= nlstate+ndeath; j++){ *//* Only the first actually */
+ fprintf(ficgp,"\n set log y; unset log x;set xlabel \"Age\"; set ylabel \"Force of mortality (year-1)\";");
+ fprintf(ficgp,"\nset out \"%s%s.svg\";",subdirf3(optionfilefiname,"VARMUPTJGR-",digitp),digit);
+ /* fprintf(ficgp,"\n plot \"%s\" u 1:($3*%6.3f) not w l 1 ",fileresprobmorprev,YEARM/estepm); */
+ /* fprintf(ficgp,"\n replot \"%s\" u 1:(($3+1.96*$4)*%6.3f) t \"95\%% interval\" w l 2 ",fileresprobmorprev,YEARM/estepm); */
+ /* fprintf(ficgp,"\n replot \"%s\" u 1:(($3-1.96*$4)*%6.3f) not w l 2 ",fileresprobmorprev,YEARM/estepm); */
+ fprintf(ficgp,"\n plot \"%s\" u 1:($3) not w l lt 1 ",subdirf(fileresprobmorprev));
+ fprintf(ficgp,"\n replot \"%s\" u 1:(($3+1.96*$4)) t \"95%% interval\" w l lt 2 ",subdirf(fileresprobmorprev));
+ fprintf(ficgp,"\n replot \"%s\" u 1:(($3-1.96*$4)) not w l lt 2 ",subdirf(fileresprobmorprev));
+ fprintf(fichtm,"\n
File (multiple files are possible if covariates are present): %s\n",subdirf(fileresprobmorprev),subdirf(fileresprobmorprev));
+ fprintf(fichtm,"\n
Probability is computed over estepm=%d months.
\n", estepm,subdirf3(optionfilefiname,"VARMUPTJGR-",digitp),digit);
+ /* fprintf(fichtm,"\n
Probability is computed over estepm=%d months and then divided by estepm and multiplied by %.0f in order to have the probability to die over a year
\n", stepm,YEARM,digitp,digit);
+ */
+ /* fprintf(ficgp,"\nset out \"varmuptjgr%s%s%s.svg\";replot;",digitp,optionfilefiname,digit); */
+ fprintf(ficgp,"\nset out;\nset out \"%s%s.svg\";replot;set out;\n",subdirf3(optionfilefiname,"VARMUPTJGR-",digitp),digit);
+
+ free_vector(xp,1,npar);
+ free_matrix(doldm,1,nlstate,1,nlstate);
+ free_matrix(dnewm,1,nlstate,1,npar);
+ free_matrix(doldmp,nlstate+1,nlstate+ndeath,nlstate+1,nlstate+ndeath);
+ free_matrix(dnewmp,nlstate+1,nlstate+ndeath,1,npar);
+ free_matrix(varppt,nlstate+1,nlstate+ndeath,nlstate+1,nlstate+ndeath);
+ /* if (mobilav!=0) free_ma3x(mobaverage,1, AGESUP,1,NCOVMAX, 1,NCOVMAX); */
+ fclose(ficresprobmorprev);
+ fflush(ficgp);
+ fflush(fichtm);
+ } /* end varevsij */
+
+/************ Variance of prevlim ******************/
+ void varprevlim(char fileresvpl[], FILE *ficresvpl, 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)
{
- fprintf(fichier,"# %s.%s\n#%s\n#%s\n# %s", optionfilefiname,optionfilext,version,fullversion,strstart);
-}
+ /* 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);*/
-/************ 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[])
-{ /* Some frequencies */
-
- int i, m, jk, k1,i1, j1, bool, z1,z2,j;
- int first;
- double ***freq; /* Frequencies */
- double *pp, **prop;
- double pos,posprop, k2, dateintsum=0,k2cpt=0;
- char fileresp[FILENAMELENGTH];
-
- pp=vector(1,nlstate);
- prop=matrix(1,nlstate,iagemin,iagemax+3);
- strcpy(fileresp,"p");
- strcat(fileresp,fileres);
- 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);
- }
- freq= ma3x(-5,nlstate+ndeath,-5,nlstate+ndeath,iagemin,iagemax+3);
- j1=0;
+ double **dnewmpar,**doldm;
+ int i, j, nhstepm, hstepm;
+ double *xp;
+ double *gp, *gm;
+ double **gradg, **trgradg;
+ double **mgm, **mgp;
+ double age,agelim;
+ int theta;
- j=cptcoveff;
- if (cptcovn<1) {j=1;ncodemax[1]=1;}
-
- first=1;
+ pstamp(ficresvpl);
+ fprintf(ficresvpl,"# Standard deviation of period (forward stable) prevalences \n");
+ fprintf(ficresvpl,"# Age ");
+ if(nresult >=1)
+ fprintf(ficresvpl," Result# ");
+ for(i=1; i<=nlstate;i++)
+ fprintf(ficresvpl," %1d-%1d",i,i);
+ fprintf(ficresvpl,"\n");
- for(k1=1; k1<=j;k1++){
- for(i1=1; i1<=ncodemax[k1];i1++){
- j1++;
- /*printf("cptcoveff=%d Tvaraff=%d", cptcoveff,Tvaraff[1]);
- scanf("%d", i);*/
- for (i=-5; i<=nlstate+ndeath; i++)
- for (jk=-5; jk<=nlstate+ndeath; jk++)
- for(m=iagemin; m <= iagemax+3; m++)
- freq[i][jk][m]=0;
+ xp=vector(1,npar);
+ dnewmpar=matrix(1,nlstate,1,npar);
+ doldm=matrix(1,nlstate,1,nlstate);
+
+ hstepm=1*YEARM; /* Every year of age */
+ hstepm=hstepm/stepm; /* Typically in stepm units, if j= 2 years, = 2/6 months = 4 */
+ agelim = AGESUP;
+ for (age=bage; age<=fage; age ++){ /* If stepm=6 months */
+ nhstepm=(int) rint((agelim-age)*YEARM/stepm); /* Typically 20 years = 20*12/6=40 */
+ if (stepm >= YEARM) hstepm=1;
+ nhstepm = nhstepm/hstepm; /* Typically 40/4=10 */
+ gradg=matrix(1,npar,1,nlstate);
+ mgp=matrix(1,npar,1,nlstate);
+ mgm=matrix(1,npar,1,nlstate);
+ gp=vector(1,nlstate);
+ gm=vector(1,nlstate);
- for (i=1; i<=nlstate; i++)
- for(m=iagemin; m <= iagemax+3; m++)
- prop[i][m]=0;
-
- dateintsum=0;
- k2cpt=0;
- for (i=1; i<=imx; i++) {
- bool=1;
- if (cptcovn>0) {
- for (z1=1; z1<=cptcoveff; z1++)
- if (covar[Tvaraff[z1]][i]!= nbcode[Tvaraff[z1]][codtab[j1][z1]])
- bool=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];
- if (m1) && (agev[m][i]< (iagemax+3))) {
- dateintsum=dateintsum+k2;
- k2cpt++;
- }
- /*}*/
- }
- }
+ for(theta=1; theta <=npar; theta++){
+ for(i=1; i<=npar; i++){ /* Computes gradient */
+ xp[i] = x[i] + (i==theta ?delti[theta]:0);
}
-
- /* fprintf(ficresp, "#Count between %.lf/%.lf/%.lf and %.lf/%.lf/%.lf\n",jprev1, mprev1,anprev1,jprev2, mprev2,anprev2);*/
- 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]][codtab[j1][z1]]);
- fprintf(ficresp, "**********\n#");
+ /* if((int)age==79 ||(int)age== 80 ||(int)age== 81 ) */
+ /* prevalim(prlim,nlstate,xp,age,oldm,savm,ftolpl,ncvyearp,ij,nres); */
+ /* else */
+ 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];
}
- for(i=1; i<=nlstate;i++)
- fprintf(ficresp, " Age Prev(%d) N(%d) N",i,i);
- fprintf(ficresp, "\n");
-
- for(i=iagemin; i <= iagemax+3; i++){
- if(i==iagemax+3){
- fprintf(ficlog,"Total");
- }else{
- if(first==1){
- first=0;
- printf("See log file for details...\n");
- }
- fprintf(ficlog,"Age %d", i);
- }
- for(jk=1; jk <=nlstate ; jk++){
- for(m=-1, pp[jk]=0; m <=nlstate+ndeath ; m++)
- pp[jk] += freq[jk][m][i];
- }
- for(jk=1; jk <=nlstate ; jk++){
- for(m=-1, pos=0; m <=0 ; m++)
- pos += freq[jk][m][i];
- if(pp[jk]>=1.e-10){
- if(first==1){
- printf(" %d.=%.0f loss[%d]=%.1f%%",jk,pp[jk],jk,100*pos/pp[jk]);
- }
- fprintf(ficlog," %d.=%.0f loss[%d]=%.1f%%",jk,pp[jk],jk,100*pos/pp[jk]);
- }else{
- if(first==1)
- printf(" %d.=%.0f loss[%d]=NaNQ%%",jk,pp[jk],jk);
- fprintf(ficlog," %d.=%.0f loss[%d]=NaNQ%%",jk,pp[jk],jk);
- }
- }
-
- for(jk=1; jk <=nlstate ; jk++){
- for(m=0, pp[jk]=0; m <=nlstate+ndeath; m++)
- pp[jk] += freq[jk][m][i];
- }
- for(jk=1,pos=0,posprop=0; jk <=nlstate ; jk++){
- pos += pp[jk];
- posprop += prop[jk][i];
- }
- for(jk=1; jk <=nlstate ; jk++){
- if(pos>=1.e-5){
- if(first==1)
- printf(" %d.=%.0f prev[%d]=%.1f%%",jk,pp[jk],jk,100*pp[jk]/pos);
- fprintf(ficlog," %d.=%.0f prev[%d]=%.1f%%",jk,pp[jk],jk,100*pp[jk]/pos);
- }else{
- if(first==1)
- printf(" %d.=%.0f prev[%d]=NaNQ%%",jk,pp[jk],jk);
- fprintf(ficlog," %d.=%.0f prev[%d]=NaNQ%%",jk,pp[jk],jk);
- }
- if( i <= iagemax){
- if(pos>=1.e-5){
- fprintf(ficresp," %d %.5f %.0f %.0f",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
- fprintf(ficresp," %d NaNq %.0f %.0f",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]);
- fprintf(ficlog," %d%d=%.0f",jk,m,freq[jk][m][i]);
- }
- if(i <= iagemax)
- fprintf(ficresp,"\n");
- if(first==1)
- printf("Others in log...\n");
- fprintf(ficlog,"\n");
+ 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,nres); */
+ /* else */
+ 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];
}
+ for(i=1;i<=nlstate;i++)
+ gradg[theta][i]= (gp[i]-gm[i])/2./delti[theta];
+ /* gradg[theta][2]= -gradg[theta][1]; */ /* For testing if nlstate=2 */
+ } /* End theta */
+
+ trgradg =matrix(1,nlstate,1,npar);
+
+ for(j=1; j<=nlstate;j++)
+ for(theta=1; theta <=npar; theta++)
+ trgradg[j][theta]=gradg[theta][j];
+ /* if((int)age==79 ||(int)age== 80 ||(int)age== 81 ){ */
+ /* printf("\nmgm mgp %d ",(int)age); */
+ /* for(j=1; j<=nlstate;j++){ */
+ /* printf(" %d ",j); */
+ /* for(theta=1; theta <=npar; theta++) */
+ /* printf(" %d %lf %lf",theta,mgm[theta][j],mgp[theta][j]); */
+ /* printf("\n "); */
+ /* } */
+ /* } */
+ /* if((int)age==79 ||(int)age== 80 ||(int)age== 81 ){ */
+ /* printf("\n gradg %d ",(int)age); */
+ /* for(j=1; j<=nlstate;j++){ */
+ /* printf("%d ",j); */
+ /* for(theta=1; theta <=npar; theta++) */
+ /* printf("%d %lf ",theta,gradg[theta][j]); */
+ /* printf("\n "); */
+ /* } */
+ /* } */
+
+ for(i=1;i<=nlstate;i++)
+ varpl[i][(int)age] =0.;
+ if((int)age==79 ||(int)age== 80 ||(int)age== 81){
+ matprod2(dnewmpar,trgradg,1,nlstate,1,npar,1,npar,matcov);
+ matprod2(doldm,dnewmpar,1,nlstate,1,npar,1,nlstate,gradg);
+ }else{
+ matprod2(dnewmpar,trgradg,1,nlstate,1,npar,1,npar,matcov);
+ matprod2(doldm,dnewmpar,1,nlstate,1,npar,1,nlstate,gradg);
}
- }
- dateintmean=dateintsum/k2cpt;
-
- fclose(ficresp);
- 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);
- /* End of Freq */
+ for(i=1;i<=nlstate;i++)
+ varpl[i][(int)age] = doldm[i][i]; /* Covariances are useless */
+
+ fprintf(ficresvpl,"%.0f ",age );
+ if(nresult >=1)
+ fprintf(ficresvpl,"%d ",nres );
+ for(i=1; i<=nlstate;i++){
+ fprintf(ficresvpl," %.5f (%.5f)",prlim[i][i],sqrt(varpl[i][(int)age]));
+ /* for(j=1;j<=nlstate;j++) */
+ /* fprintf(ficresvpl," %d %.5f ",j,prlim[j][i]); */
+ }
+ fprintf(ficresvpl,"\n");
+ free_vector(gp,1,nlstate);
+ free_vector(gm,1,nlstate);
+ free_matrix(mgm,1,npar,1,nlstate);
+ free_matrix(mgp,1,npar,1,nlstate);
+ free_matrix(gradg,1,npar,1,nlstate);
+ free_matrix(trgradg,1,nlstate,1,npar);
+ } /* End age */
+
+ free_vector(xp,1,npar);
+ free_matrix(doldm,1,nlstate,1,npar);
+ free_matrix(dnewmpar,1,nlstate,1,nlstate);
+
}
-/************ Prevalence ********************/
-void prevalence(double ***probs, double agemin, double agemax, int **s, double **agev, int nlstate, int imx, int *Tvar, int **nbcode, int *ncodemax,double **mint,double **anint, double dateprev1,double dateprev2, int firstpass, int lastpass)
-{
- /* 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.
- */
-
- int i, m, jk, k1, i1, j1, bool, z1,z2,j;
- double ***freq; /* Frequencies */
- double *pp, **prop;
- double pos,posprop;
- double y2; /* in fractional years */
- int iagemin, iagemax;
- iagemin= (int) agemin;
- iagemax= (int) agemax;
- /*pp=vector(1,nlstate);*/
- prop=matrix(1,nlstate,iagemin,iagemax+3);
- /* freq=ma3x(-1,nlstate+ndeath,-1,nlstate+ndeath,iagemin,iagemax+3);*/
- j1=0;
+/************ Variance of backprevalence limit ******************/
+ void varbrevlim(char fileresvbl[], FILE *ficresvbl, double **varbpl, double **matcov, double x[], double delti[], int nlstate, int stepm, double bage, double fage, double **oldm, double **savm, double **bprlim, double ftolpl, int mobilavproj, int *ncvyearp, int ij, char strstart[], int nres)
+{
+ /* Variance of backward 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);*/
+
+ double **dnewmpar,**doldm;
+ int i, j, nhstepm, hstepm;
+ double *xp;
+ double *gp, *gm;
+ double **gradg, **trgradg;
+ double **mgm, **mgp;
+ double age,agelim;
+ int theta;
- j=cptcoveff;
- if (cptcovn<1) {j=1;ncodemax[1]=1;}
+ pstamp(ficresvbl);
+ fprintf(ficresvbl,"# Standard deviation of back (stable) prevalences \n");
+ fprintf(ficresvbl,"# Age ");
+ if(nresult >=1)
+ fprintf(ficresvbl," Result# ");
+ for(i=1; i<=nlstate;i++)
+ fprintf(ficresvbl," %1d-%1d",i,i);
+ fprintf(ficresvbl,"\n");
+
+ xp=vector(1,npar);
+ dnewmpar=matrix(1,nlstate,1,npar);
+ doldm=matrix(1,nlstate,1,nlstate);
- for(k1=1; k1<=j;k1++){
- 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]][codtab[j1][z1]])
- bool=0;
- }
- if (bool==1) {
- for(m=firstpass; m<=lastpass; m++){/* Other selection (we can limit to certain interviews*/
- 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(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];
- }
- }
- } /* end selection of waves */
- }
+ hstepm=1*YEARM; /* Every year of age */
+ hstepm=hstepm/stepm; /* Typically in stepm units, if j= 2 years, = 2/6 months = 4 */
+ agelim = AGEINF;
+ for (age=fage; age>=bage; age --){ /* If stepm=6 months */
+ nhstepm=(int) rint((age-agelim)*YEARM/stepm); /* Typically 20 years = 20*12/6=40 */
+ if (stepm >= YEARM) hstepm=1;
+ nhstepm = nhstepm/hstepm; /* Typically 40/4=10 */
+ gradg=matrix(1,npar,1,nlstate);
+ mgp=matrix(1,npar,1,nlstate);
+ mgm=matrix(1,npar,1,nlstate);
+ gp=vector(1,nlstate);
+ gm=vector(1,nlstate);
+
+ for(theta=1; theta <=npar; theta++){
+ for(i=1; i<=npar; i++){ /* Computes gradient */
+ xp[i] = x[i] + (i==theta ?delti[theta]:0);
}
- 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;
- }
- }
- }/* end jk */
- }/* end i */
- } /* end i1 */
- } /* end k1 */
-
- /* free_ma3x(freq,-1,nlstate+ndeath,-1,nlstate+ndeath, iagemin, iagemax+3);*/
- /*free_vector(pp,1,nlstate);*/
- free_matrix(prop,1,nlstate, iagemin,iagemax+3);
-} /* End of prevalence */
+ if(mobilavproj > 0 )
+ bprevalim(bprlim, mobaverage,nlstate,xp,age,ftolpl,ncvyearp,ij,nres);
+ else
+ bprevalim(bprlim, mobaverage,nlstate,xp,age,ftolpl,ncvyearp,ij,nres);
+ for(i=1;i<=nlstate;i++){
+ gp[i] = bprlim[i][i];
+ mgp[theta][i] = bprlim[i][i];
+ }
+ for(i=1; i<=npar; i++) /* Computes gradient */
+ xp[i] = x[i] - (i==theta ?delti[theta]:0);
+ if(mobilavproj > 0 )
+ bprevalim(bprlim, mobaverage,nlstate,xp,age,ftolpl,ncvyearp,ij,nres);
+ else
+ bprevalim(bprlim, mobaverage,nlstate,xp,age,ftolpl,ncvyearp,ij,nres);
+ for(i=1;i<=nlstate;i++){
+ gm[i] = bprlim[i][i];
+ mgm[theta][i] = bprlim[i][i];
+ }
+ for(i=1;i<=nlstate;i++)
+ gradg[theta][i]= (gp[i]-gm[i])/2./delti[theta];
+ /* gradg[theta][2]= -gradg[theta][1]; */ /* For testing if nlstate=2 */
+ } /* End theta */
-/************* Waves Concatenation ***************/
+ trgradg =matrix(1,nlstate,1,npar);
-void concatwav(int wav[], int **dh, int **bh, int **mw, int **s, double *agedc, double **agev, int firstpass, int lastpass, int imx, int nlstate, int stepm)
-{
- /* 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 mi (mi=1 to wav[i]) effective wave 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.
- */
+ for(j=1; j<=nlstate;j++)
+ for(theta=1; theta <=npar; theta++)
+ trgradg[j][theta]=gradg[theta][j];
+ /* if((int)age==79 ||(int)age== 80 ||(int)age== 81 ){ */
+ /* printf("\nmgm mgp %d ",(int)age); */
+ /* for(j=1; j<=nlstate;j++){ */
+ /* printf(" %d ",j); */
+ /* for(theta=1; theta <=npar; theta++) */
+ /* printf(" %d %lf %lf",theta,mgm[theta][j],mgp[theta][j]); */
+ /* printf("\n "); */
+ /* } */
+ /* } */
+ /* if((int)age==79 ||(int)age== 80 ||(int)age== 81 ){ */
+ /* printf("\n gradg %d ",(int)age); */
+ /* for(j=1; j<=nlstate;j++){ */
+ /* printf("%d ",j); */
+ /* for(theta=1; theta <=npar; theta++) */
+ /* printf("%d %lf ",theta,gradg[theta][j]); */
+ /* printf("\n "); */
+ /* } */
+ /* } */
- int i, mi, m;
- /* int j, k=0,jk, ju, jl,jmin=1e+5, jmax=-1;
- double sum=0., jmean=0.;*/
- int first;
- int j, k=0,jk, ju, jl;
- double sum=0.;
- first=0;
- jmin=1e+5;
- jmax=-1;
- jmean=0.;
- for(i=1; i<=imx; i++){
- 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)
- mw[++mi][i]=m;
- if(m >=lastpass)
- break;
- else
- m++;
- }/* end while */
- if (s[m][i] > nlstate){
- mi++; /* Death is another wave */
- /* if(mi==0) never been interviewed correctly before death */
- /* Only death is a correct wave */
- mw[mi][i]=m;
+ for(i=1;i<=nlstate;i++)
+ varbpl[i][(int)age] =0.;
+ if((int)age==79 ||(int)age== 80 ||(int)age== 81){
+ matprod2(dnewmpar,trgradg,1,nlstate,1,npar,1,npar,matcov);
+ matprod2(doldm,dnewmpar,1,nlstate,1,npar,1,nlstate,gradg);
+ }else{
+ matprod2(dnewmpar,trgradg,1,nlstate,1,npar,1,npar,matcov);
+ matprod2(doldm,dnewmpar,1,nlstate,1,npar,1,nlstate,gradg);
}
+ for(i=1;i<=nlstate;i++)
+ varbpl[i][(int)age] = doldm[i][i]; /* Covariances are useless */
- wav[i]=mi;
- if(mi==0){
- nbwarn++;
- if(first==0){
- printf("Warning! No valid information for individual %ld line=%d (skipped) and may be others, see log file\n",num[i],i);
- first=1;
- }
- if(first==1){
- fprintf(ficlog,"Warning! No valid information for individual %ld line=%d (skipped)\n",num[i],i);
- }
- } /* end mi==0 */
- } /* End individuals */
+ fprintf(ficresvbl,"%.0f ",age );
+ if(nresult >=1)
+ fprintf(ficresvbl,"%d ",nres );
+ for(i=1; i<=nlstate;i++)
+ fprintf(ficresvbl," %.5f (%.5f)",bprlim[i][i],sqrt(varbpl[i][(int)age]));
+ fprintf(ficresvbl,"\n");
+ free_vector(gp,1,nlstate);
+ free_vector(gm,1,nlstate);
+ free_matrix(mgm,1,npar,1,nlstate);
+ free_matrix(mgp,1,npar,1,nlstate);
+ free_matrix(gradg,1,npar,1,nlstate);
+ free_matrix(trgradg,1,nlstate,1,npar);
+ } /* End age */
- for(i=1; i<=imx; i++){
- for(mi=1; mi nlstate) { /* A death */
- if (agedc[i] < 2*AGESUP) {
- j= rint(agedc[i]*12-agev[mw[mi][i]][i]*12);
- if(j==0) j=1; /* Survives at least one month after exam */
- else if(j<0){
- nberr++;
- printf("Error! Negative delay (%d to death) between waves %d and %d of individual %ld at line %d who is aged %.1f with statuses from %d to %d\n ",j,mw[mi][i],mw[mi+1][i],num[i], i,agev[mw[mi][i]][i],s[mw[mi][i]][i] ,s[mw[mi+1][i]][i]);
- j=1; /* Temporary Dangerous patch */
- printf(" We assumed that the date of interview was correct (and not the date of death) and postponed the death %d month(s) (one stepm) after the interview. You MUST fix the contradiction between dates.\n",stepm);
- fprintf(ficlog,"Error! Negative delay (%d to death) between waves %d and %d of individual %ld at line %d who is aged %.1f with statuses from %d to %d\n ",j,mw[mi][i],mw[mi+1][i],num[i], i,agev[mw[mi][i]][i],s[mw[mi][i]][i] ,s[mw[mi+1][i]][i]);
- fprintf(ficlog," We assumed that the date of interview was correct (and not the date of death) and postponed the death %d month(s) (one stepm) after the interview. You MUST fix the contradiction between dates.\n",stepm);
- }
- k=k+1;
- if (j >= jmax){
- jmax=j;
- ijmax=i;
- }
- if (j <= jmin){
- jmin=j;
- ijmin=i;
- }
- sum=sum+j;
- /*if (j<0) printf("j=%d num=%d \n",j,i);*/
- /* printf("%d %d %d %d\n", s[mw[mi][i]][i] ,s[mw[mi+1][i]][i],j,i);*/
- }
- }
- else{
- j= rint( (agev[mw[mi+1][i]][i]*12 - agev[mw[mi][i]][i]*12));
-/* if (j<0) printf("%d %lf %lf %d %d %d\n", i,agev[mw[mi+1][i]][i], agev[mw[mi][i]][i],j,s[mw[mi][i]][i] ,s[mw[mi+1][i]][i]); */
+ free_vector(xp,1,npar);
+ free_matrix(doldm,1,nlstate,1,npar);
+ free_matrix(dnewmpar,1,nlstate,1,nlstate);
- k=k+1;
- if (j >= jmax) {
- jmax=j;
- ijmax=i;
- }
- else if (j <= jmin){
- jmin=j;
- ijmin=i;
- }
- /* if (j<10) printf("j=%d jmin=%d num=%d ",j,jmin,i); */
- /*printf("%d %lf %d %d %d\n", i,agev[mw[mi][i]][i],j,s[mw[mi][i]][i] ,s[mw[mi+1][i]][i]);*/
- if(j<0){
- nberr++;
- printf("Error! Negative delay (%d) between waves %d and %d of individual %ld at line %d who is aged %.1f with statuses from %d to %d\n ",j,mw[mi][i],mw[mi+1][i],num[i], i,agev[mw[mi][i]][i],s[mw[mi][i]][i] ,s[mw[mi+1][i]][i]);
- fprintf(ficlog,"Error! Negative delay (%d) between waves %d and %d of individual %ld at line %d who is aged %.1f with statuses from %d to %d\n ",j,mw[mi][i],mw[mi+1][i],num[i], i,agev[mw[mi][i]][i],s[mw[mi][i]][i] ,s[mw[mi+1][i]][i]);
- }
- sum=sum+j;
- }
- jk= j/stepm;
- jl= j -jk*stepm;
- ju= j -(jk+1)*stepm;
- if(mle <=1){ /* only if we use a the linear-interpoloation pseudo-likelihood */
- if(jl==0){
- dh[mi][i]=jk;
- bh[mi][i]=0;
- }else{ /* We want a negative bias in order to only have interpolation ie
- * at the price of an extra matrix product in likelihood */
- dh[mi][i]=jk+1;
- bh[mi][i]=ju;
- }
- }else{
- if(jl <= -ju){
- dh[mi][i]=jk;
- bh[mi][i]=jl; /* bias is positive if real duration
- * is higher than the multiple of stepm and negative otherwise.
- */
- }
- else{
- dh[mi][i]=jk+1;
- bh[mi][i]=ju;
- }
- if(dh[mi][i]==0){
- dh[mi][i]=1; /* At least one step */
- bh[mi][i]=ju; /* At least one step */
- /* printf(" bh=%d ju=%d jl=%d dh=%d jk=%d stepm=%d %d\n",bh[mi][i],ju,jl,dh[mi][i],jk,stepm,i);*/
- }
- } /* end if mle */
- }
- } /* end wave */
- }
- jmean=sum/k;
- printf("Delay (in months) between two waves Min=%d (for indiviudal %ld) Max=%d (%ld) Mean=%f\n\n ",jmin, num[ijmin], jmax, num[ijmax], jmean);
- fprintf(ficlog,"Delay (in months) between two waves Min=%d (for indiviudal %ld) Max=%d (%ld) Mean=%f\n\n ",jmin, ijmin, jmax, ijmax, jmean);
+}
+
+/************ Variance of one-step probabilities ******************/
+void varprob(char optionfilefiname[], double **matcov, double x[], double delti[], int nlstate, double bage, double fage, int ij, int *Tvar, int **nbcode, int *ncodemax, char strstart[])
+ {
+ int i, j=0, k1, l1, tj;
+ int k2, l2, j1, z1;
+ int k=0, l;
+ int first=1, first1, first2;
+ int nres=0; /* New */
+ double cv12, mu1, mu2, lc1, lc2, v12, v21, v11, v22,v1,v2, c12, tnalp;
+ double **dnewm,**doldm;
+ double *xp;
+ double *gp, *gm;
+ double **gradg, **trgradg;
+ double **mu;
+ double age, cov[NCOVMAX+1];
+ double std=2.0; /* Number of standard deviation wide of confidence ellipsoids */
+ int theta;
+ char fileresprob[FILENAMELENGTH];
+ char fileresprobcov[FILENAMELENGTH];
+ char fileresprobcor[FILENAMELENGTH];
+ double ***varpij;
+
+ strcpy(fileresprob,"PROB_");
+ strcat(fileresprob,fileres);
+ if((ficresprob=fopen(fileresprob,"w"))==NULL) {
+ printf("Problem with resultfile: %s\n", fileresprob);
+ fprintf(ficlog,"Problem with resultfile: %s\n", fileresprob);
+ }
+ strcpy(fileresprobcov,"PROBCOV_");
+ strcat(fileresprobcov,fileresu);
+ if((ficresprobcov=fopen(fileresprobcov,"w"))==NULL) {
+ printf("Problem with resultfile: %s\n", fileresprobcov);
+ fprintf(ficlog,"Problem with resultfile: %s\n", fileresprobcov);
+ }
+ strcpy(fileresprobcor,"PROBCOR_");
+ strcat(fileresprobcor,fileresu);
+ if((ficresprobcor=fopen(fileresprobcor,"w"))==NULL) {
+ printf("Problem with resultfile: %s\n", fileresprobcor);
+ fprintf(ficlog,"Problem with resultfile: %s\n", fileresprobcor);
+ }
+ printf("Computing standard deviation of one-step probabilities: result on file '%s' \n",fileresprob);
+ fprintf(ficlog,"Computing standard deviation of one-step probabilities: result on file '%s' \n",fileresprob);
+ printf("Computing matrix of variance covariance of one-step probabilities: result on file '%s' \n",fileresprobcov);
+ fprintf(ficlog,"Computing matrix of variance covariance of one-step probabilities: result on file '%s' \n",fileresprobcov);
+ printf("and correlation matrix of one-step probabilities: result on file '%s' \n",fileresprobcor);
+ fprintf(ficlog,"and correlation matrix of one-step probabilities: result on file '%s' \n",fileresprobcor);
+ pstamp(ficresprob);
+ fprintf(ficresprob,"#One-step probabilities and stand. devi in ()\n");
+ fprintf(ficresprob,"# Age");
+ pstamp(ficresprobcov);
+ fprintf(ficresprobcov,"#One-step probabilities and covariance matrix\n");
+ fprintf(ficresprobcov,"# Age");
+ pstamp(ficresprobcor);
+ fprintf(ficresprobcor,"#One-step probabilities and correlation matrix\n");
+ fprintf(ficresprobcor,"# Age");
+
+
+ for(i=1; i<=nlstate;i++)
+ for(j=1; j<=(nlstate+ndeath);j++){
+ fprintf(ficresprob," p%1d-%1d (SE)",i,j);
+ fprintf(ficresprobcov," p%1d-%1d ",i,j);
+ fprintf(ficresprobcor," p%1d-%1d ",i,j);
+ }
+ /* fprintf(ficresprob,"\n");
+ fprintf(ficresprobcov,"\n");
+ fprintf(ficresprobcor,"\n");
+ */
+ xp=vector(1,npar);
+ dnewm=matrix(1,(nlstate)*(nlstate+ndeath),1,npar);
+ doldm=matrix(1,(nlstate)*(nlstate+ndeath),1,(nlstate)*(nlstate+ndeath));
+ mu=matrix(1,(nlstate)*(nlstate+ndeath), (int) bage, (int)fage);
+ varpij=ma3x(1,nlstate*(nlstate+ndeath),1,nlstate*(nlstate+ndeath),(int) bage, (int) fage);
+ first=1;
+ fprintf(ficgp,"\n# Routine varprob");
+ fprintf(fichtm,"\n Computing and drawing one step probabilities with their confidence intervals
\n");
+ fprintf(fichtm,"\n");
+
+ fprintf(fichtm,"\n this page is important in order to visualize confidence intervals and especially correlation between disability and recovery, or more generally, way in and way back. File %s\n",optionfilehtmcov,optionfilehtmcov);
+ fprintf(fichtmcov,"Current page is file %s
\n\nMatrix of variance-covariance of pairs of step probabilities
\n",optionfilehtmcov, optionfilehtmcov);
+ fprintf(fichtmcov,"\nEllipsoids of confidence centered on point (pij, pkl) are estimated \
+and drawn. It helps understanding how is the covariance between two incidences.\
+ They are expressed in year-1 in order to be less dependent of stepm.
\n");
+ fprintf(fichtmcov,"\n
Contour plot corresponding to x'cov-1x = 4 (where x is the column vector (pij,pkl)) are drawn. \
+It can be understood this way: if pij and pkl where uncorrelated the (2x2) matrix of covariance \
+would have been (1/(var pij), 0 , 0, 1/(var pkl)), and the confidence interval would be 2 \
+standard deviations wide on each axis.
\
+ Now, if both incidences are correlated (usual case) we diagonalised the inverse of the covariance matrix\
+ and made the appropriate rotation to look at the uncorrelated principal directions.
\
+To be simple, these graphs help to understand the significativity of each parameter in relation to a second other one.
\n");
+
+ cov[1]=1;
+ /* tj=cptcoveff; */
+ tj = (int) pow(2,cptcoveff);
+ if (cptcovn<1) {tj=1;ncodemax[1]=1;}
+ j1=0;
+ for(j1=1; j1<=tj;j1++){ /* For each valid combination of covariates or only once*/
+ for(nres=1;nres <=1; nres++){ /* For each resultline */
+ /* for(nres=1;nres <=nresult; nres++){ /\* For each resultline *\/ */
+ if (cptcovn>0) {
+ fprintf(ficresprob, "\n#********** Variable ");
+ for (z1=1; z1<=cptcoveff; z1++) fprintf(ficresprob, "V%d=%d ",Tvaraff[z1],nbcode[Tvaraff[z1]][codtabm(j1,z1)]);
+ fprintf(ficresprob, "**********\n#\n");
+ fprintf(ficresprobcov, "\n#********** Variable ");
+ for (z1=1; z1<=cptcoveff; z1++) fprintf(ficresprobcov, "V%d=%d ",Tvaraff[z1],nbcode[Tvaraff[z1]][codtabm(j1,z1)]);
+ fprintf(ficresprobcov, "**********\n#\n");
+
+ fprintf(ficgp, "\n#********** Variable ");
+ for (z1=1; z1<=cptcoveff; z1++) fprintf(ficgp, " V%d=%d ",Tvaraff[z1],nbcode[Tvaraff[z1]][codtabm(j1,z1)]);
+ fprintf(ficgp, "**********\n#\n");
+
+
+ fprintf(fichtmcov, "\n
********** Variable ");
+ /* for (z1=1; z1<=cptcoveff; z1++) fprintf(fichtm, "V%d=%d ",Tvaraff[z1],nbcode[Tvaraff[z1]][codtabm(j1,z1)]); */
+ for (z1=1; z1<=cptcoveff; z1++) fprintf(fichtmcov, "V%d=%d ",Tvaraff[z1],nbcode[Tvaraff[z1]][codtabm(j1,z1)]);
+ fprintf(fichtmcov, "**********\n
");
+
+ fprintf(ficresprobcor, "\n#********** Variable ");
+ for (z1=1; z1<=cptcoveff; z1++) fprintf(ficresprobcor, "V%d=%d ",Tvaraff[z1],nbcode[Tvaraff[z1]][codtabm(j1,z1)]);
+ fprintf(ficresprobcor, "**********\n#");
+ if(invalidvarcomb[j1]){
+ fprintf(ficgp,"\n#Combination (%d) ignored because no cases \n",j1);
+ fprintf(fichtmcov,"\nCombination (%d) ignored because no cases
\n",j1);
+ continue;
+ }
+ }
+ gradg=matrix(1,npar,1,(nlstate)*(nlstate+ndeath));
+ trgradg=matrix(1,(nlstate)*(nlstate+ndeath),1,npar);
+ gp=vector(1,(nlstate)*(nlstate+ndeath));
+ gm=vector(1,(nlstate)*(nlstate+ndeath));
+ for (age=bage; age<=fage; age ++){
+ cov[2]=age;
+ if(nagesqr==1)
+ cov[3]= age*age;
+ /* for (k=1; k<=cptcovn;k++) { */
+ /* cov[2+nagesqr+k]=nbcode[Tvar[k]][codtabm(j1,k)]; */
+ for (k=1; k<=nsd;k++) { /* For single dummy covariates only */
+ /* Here comes the value of the covariate 'j1' after renumbering k with single dummy covariates */
+ cov[2+nagesqr+TvarsDind[k]]=nbcode[TvarsD[k]][codtabm(j1,k)];
+ /*cov[2+nagesqr+k]=nbcode[Tvar[k]][codtabm(j1,Tvar[k])];*//* j1 1 2 3 4
+ * 1 1 1 1 1
+ * 2 2 1 1 1
+ * 3 1 2 1 1
+ */
+ /* nbcode[1][1]=0 nbcode[1][2]=1;*/
+ }
+ /* V2+V1+V4+V3*age Tvar[4]=3 ; V1+V2*age Tvar[2]=2; V1+V1*age Tvar[2]=1, Tage[1]=2 */
+ /* ) p nbcode[Tvar[Tage[k]]][(1 & (ij-1) >> (k-1))+1] */
+ /*for (k=1; k<=cptcovage;k++) cov[2+Tage[k]]=cov[2+Tage[k]]*cov[2]; */
+ for (k=1; k<=cptcovage;k++){ /* For product with age */
+ if(Dummy[Tage[k]]==2){ /* dummy with age */
+ cov[2+nagesqr+Tage[k]]=nbcode[Tvar[Tage[k]]][codtabm(j1,k)]*cov[2];
+ /* cov[++k1]=nbcode[Tvar[Tage[k]]][codtabm(ij,k)]*cov[2]; */
+ } else if(Dummy[Tage[k]]==3){ /* quantitative with age */
+ printf("Internal IMaCh error, don't know which value for quantitative covariate with age, Tage[k]%d, k=%d, Tvar[Tage[k]]=V%d, age=%d\n",Tage[k],k ,Tvar[Tage[k]], (int)cov[2]);
+ exit(1);
+ /* cov[2+nagesqr+Tage[k]]=meanq[k]/idq[k]*cov[2];/\* Using the mean of quantitative variable Tvar[Tage[k]] /\* Tqresult[nres][k]; *\/ */
+ /* cov[++k1]=Tqresult[nres][k]; */
+ }
+ /* cov[2+Tage[k]+nagesqr]=nbcode[Tvar[Tage[k]]][codtabm(ij,k)]*cov[2]; */
+ }
+ for (k=1; k<=cptcovprod;k++){/* For product without age */
+ if(Dummy[Tvard[k][1]==0]){
+ if(Dummy[Tvard[k][2]==0]){
+ cov[2+nagesqr+Tprod[k]]=nbcode[Tvard[k][1]][codtabm(j1,k)] * nbcode[Tvard[k][2]][codtabm(j1,k)];
+ /* cov[++k1]=nbcode[Tvard[k][1]][codtabm(ij,k)] * nbcode[Tvard[k][2]][codtabm(ij,k)]; */
+ }else{ /* Should we use the mean of the quantitative variables? */
+ cov[2+nagesqr+Tprod[k]]=nbcode[Tvard[k][1]][codtabm(j1,k)] * Tqresult[nres][k];
+ /* cov[++k1]=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(j1,k)] * Tqinvresult[nres][Tvard[k][1]];
+ /* cov[++k1]=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]];
+ /* cov[++k1]=Tqinvresult[nres][Tvard[k][1]]* Tqinvresult[nres][Tvard[k][2]]; */
+ }
+ }
+ /* cov[2+nagesqr+Tprod[k]]=nbcode[Tvard[k][1]][codtabm(ij,k)]*nbcode[Tvard[k][2]][codtabm(ij,k)]; */
+ }
+/* For each age and combination of dummy covariates we slightly move the parameters of delti in order to get the gradient*/
+ for(theta=1; theta <=npar; theta++){
+ for(i=1; i<=npar; i++)
+ xp[i] = x[i] + (i==theta ?delti[theta]:(double)0);
+
+ pmij(pmmij,cov,ncovmodel,xp,nlstate);
+
+ k=0;
+ for(i=1; i<= (nlstate); i++){
+ for(j=1; j<=(nlstate+ndeath);j++){
+ k=k+1;
+ gp[k]=pmmij[i][j];
+ }
+ }
+
+ for(i=1; i<=npar; i++)
+ xp[i] = x[i] - (i==theta ?delti[theta]:(double)0);
+
+ pmij(pmmij,cov,ncovmodel,xp,nlstate);
+ k=0;
+ for(i=1; i<=(nlstate); i++){
+ for(j=1; j<=(nlstate+ndeath);j++){
+ k=k+1;
+ gm[k]=pmmij[i][j];
+ }
+ }
+
+ for(i=1; i<= (nlstate)*(nlstate+ndeath); i++)
+ gradg[theta][i]=(gp[i]-gm[i])/(double)2./delti[theta];
+ }
+
+ for(j=1; j<=(nlstate)*(nlstate+ndeath);j++)
+ for(theta=1; theta <=npar; theta++)
+ trgradg[j][theta]=gradg[theta][j];
+
+ matprod2(dnewm,trgradg,1,(nlstate)*(nlstate+ndeath),1,npar,1,npar,matcov);
+ matprod2(doldm,dnewm,1,(nlstate)*(nlstate+ndeath),1,npar,1,(nlstate)*(nlstate+ndeath),gradg);
+
+ pmij(pmmij,cov,ncovmodel,x,nlstate);
+
+ k=0;
+ for(i=1; i<=(nlstate); i++){
+ for(j=1; j<=(nlstate+ndeath);j++){
+ k=k+1;
+ mu[k][(int) age]=pmmij[i][j];
+ }
+ }
+ for(i=1;i<=(nlstate)*(nlstate+ndeath);i++)
+ for(j=1;j<=(nlstate)*(nlstate+ndeath);j++)
+ varpij[i][j][(int)age] = doldm[i][j];
+
+ /*printf("\n%d ",(int)age);
+ for (i=1; i<=(nlstate)*(nlstate+ndeath);i++){
+ printf("%e [%e ;%e] ",gm[i],gm[i]-2*sqrt(doldm[i][i]),gm[i]+2*sqrt(doldm[i][i]));
+ fprintf(ficlog,"%e [%e ;%e] ",gm[i],gm[i]-2*sqrt(doldm[i][i]),gm[i]+2*sqrt(doldm[i][i]));
+ }*/
+
+ fprintf(ficresprob,"\n%d ",(int)age);
+ fprintf(ficresprobcov,"\n%d ",(int)age);
+ fprintf(ficresprobcor,"\n%d ",(int)age);
+
+ for (i=1; i<=(nlstate)*(nlstate+ndeath);i++)
+ fprintf(ficresprob,"%11.3e (%11.3e) ",mu[i][(int) age],sqrt(varpij[i][i][(int)age]));
+ for (i=1; i<=(nlstate)*(nlstate+ndeath);i++){
+ fprintf(ficresprobcov,"%11.3e ",mu[i][(int) age]);
+ fprintf(ficresprobcor,"%11.3e ",mu[i][(int) age]);
+ }
+ i=0;
+ for (k=1; k<=(nlstate);k++){
+ for (l=1; l<=(nlstate+ndeath);l++){
+ i++;
+ fprintf(ficresprobcov,"\n%d %d-%d",(int)age,k,l);
+ fprintf(ficresprobcor,"\n%d %d-%d",(int)age,k,l);
+ for (j=1; j<=i;j++){
+ /* printf(" k=%d l=%d i=%d j=%d\n",k,l,i,j);fflush(stdout); */
+ fprintf(ficresprobcov," %11.3e",varpij[i][j][(int)age]);
+ fprintf(ficresprobcor," %11.3e",varpij[i][j][(int) age]/sqrt(varpij[i][i][(int) age])/sqrt(varpij[j][j][(int)age]));
+ }
+ }
+ }/* end of loop for state */
+ } /* end of loop for age */
+ free_vector(gp,1,(nlstate+ndeath)*(nlstate+ndeath));
+ free_vector(gm,1,(nlstate+ndeath)*(nlstate+ndeath));
+ free_matrix(trgradg,1,(nlstate+ndeath)*(nlstate+ndeath),1,npar);
+ free_matrix(gradg,1,(nlstate+ndeath)*(nlstate+ndeath),1,npar);
+
+ /* Confidence intervalle of pij */
+ /*
+ fprintf(ficgp,"\nunset parametric;unset label");
+ fprintf(ficgp,"\nset log y;unset log x; set xlabel \"Age\";set ylabel \"probability (year-1)\"");
+ fprintf(ficgp,"\nset ter png small\nset size 0.65,0.65");
+ fprintf(fichtm,"\n
Probability with confidence intervals expressed in year-1 :pijgr%s.png, ",optionfilefiname,optionfilefiname);
+ fprintf(fichtm,"\n
",optionfilefiname);
+ fprintf(ficgp,"\nset out \"pijgr%s.png\"",optionfilefiname);
+ fprintf(ficgp,"\nplot \"%s\" every :::%d::%d u 1:2 \"\%%lf",k1,k2,xfilevarprob);
+ */
+
+ /* Drawing ellipsoids of confidence of two variables p(k1-l1,k2-l2)*/
+ first1=1;first2=2;
+ for (k2=1; k2<=(nlstate);k2++){
+ for (l2=1; l2<=(nlstate+ndeath);l2++){
+ if(l2==k2) continue;
+ j=(k2-1)*(nlstate+ndeath)+l2;
+ for (k1=1; k1<=(nlstate);k1++){
+ for (l1=1; l1<=(nlstate+ndeath);l1++){
+ if(l1==k1) continue;
+ i=(k1-1)*(nlstate+ndeath)+l1;
+ if(i<=j) continue;
+ for (age=bage; age<=fage; age ++){
+ if ((int)age %5==0){
+ v1=varpij[i][i][(int)age]/stepm*YEARM/stepm*YEARM;
+ v2=varpij[j][j][(int)age]/stepm*YEARM/stepm*YEARM;
+ cv12=varpij[i][j][(int)age]/stepm*YEARM/stepm*YEARM;
+ mu1=mu[i][(int) age]/stepm*YEARM ;
+ mu2=mu[j][(int) age]/stepm*YEARM;
+ c12=cv12/sqrt(v1*v2);
+ /* Computing eigen value of matrix of covariance */
+ lc1=((v1+v2)+sqrt((v1+v2)*(v1+v2) - 4*(v1*v2-cv12*cv12)))/2.;
+ lc2=((v1+v2)-sqrt((v1+v2)*(v1+v2) - 4*(v1*v2-cv12*cv12)))/2.;
+ if ((lc2 <0) || (lc1 <0) ){
+ if(first2==1){
+ first1=0;
+ printf("Strange: j1=%d One eigen value of 2x2 matrix of covariance is negative, lc1=%11.3e, lc2=%11.3e, v1=%11.3e, v2=%11.3e, cv12=%11.3e.\n It means that the matrix was not well estimated (varpij), for i=%2d, j=%2d, age=%4d .\n See files %s and %s. Probably WRONG RESULTS. See log file for details...\n", j1, lc1, lc2, v1, v2, cv12, i, j, (int)age,fileresprobcov, fileresprobcor);
+ }
+ fprintf(ficlog,"Strange: j1=%d One eigen value of 2x2 matrix of covariance is negative, lc1=%11.3e, lc2=%11.3e, v1=%11.3e, v2=%11.3e, cv12=%11.3e.\n It means that the matrix was not well estimated (varpij), for i=%2d, j=%2d, age=%4d .\n See files %s and %s. Probably WRONG RESULTS.\n", j1, lc1, lc2, v1, v2, cv12, i, j, (int)age,fileresprobcov, fileresprobcor);fflush(ficlog);
+ /* lc1=fabs(lc1); */ /* If we want to have them positive */
+ /* lc2=fabs(lc2); */
+ }
+
+ /* Eigen vectors */
+ if(1+(v1-lc1)*(v1-lc1)/cv12/cv12 <1.e-5){
+ printf(" Error sqrt of a negative number: %lf\n",1+(v1-lc1)*(v1-lc1)/cv12/cv12);
+ fprintf(ficlog," Error sqrt of a negative number: %lf\n",1+(v1-lc1)*(v1-lc1)/cv12/cv12);
+ v11=(1./sqrt(fabs(1+(v1-lc1)*(v1-lc1)/cv12/cv12)));
+ }else
+ v11=(1./sqrt(1+(v1-lc1)*(v1-lc1)/cv12/cv12));
+ /*v21=sqrt(1.-v11*v11); *//* error */
+ v21=(lc1-v1)/cv12*v11;
+ v12=-v21;
+ v22=v11;
+ tnalp=v21/v11;
+ if(first1==1){
+ first1=0;
+ printf("%d %d%d-%d%d mu %.4e %.4e Var %.4e %.4e cor %.3f cov %.4e Eig %.3e %.3e 1stv %.3f %.3f tang %.3f\nOthers in log...\n",(int) age,k1,l1,k2,l2,mu1,mu2,v1,v2,c12,cv12,lc1,lc2,v11,v21,tnalp);
+ }
+ fprintf(ficlog,"%d %d%d-%d%d mu %.4e %.4e Var %.4e %.4e cor %.3f cov %.4e Eig %.3e %.3e 1stv %.3f %.3f tan %.3f\n",(int) age,k1,l1,k2,l2,mu1,mu2,v1,v2,c12,cv12,lc1,lc2,v11,v21,tnalp);
+ /*printf(fignu*/
+ /* mu1+ v11*lc1*cost + v12*lc2*sin(t) */
+ /* mu2+ v21*lc1*cost + v22*lc2*sin(t) */
+ if(first==1){
+ first=0;
+ fprintf(ficgp,"\n# Ellipsoids of confidence\n#\n");
+ fprintf(ficgp,"\nset parametric;unset label");
+ fprintf(ficgp,"\nset log y;set log x; set xlabel \"p%1d%1d (year-1)\";set ylabel \"p%1d%1d (year-1)\"",k1,l1,k2,l2);
+ fprintf(ficgp,"\nset ter svg size 640, 480");
+ fprintf(fichtmcov,"\n
Ellipsoids of confidence cov(p%1d%1d,p%1d%1d) expressed in year-1\
+ : \
+%s_%d%1d%1d-%1d%1d.svg, ",k1,l1,k2,l2,\
+ subdirf2(optionfilefiname,"VARPIJGR_"), j1,k1,l1,k2,l2, \
+ subdirf2(optionfilefiname,"VARPIJGR_"), j1,k1,l1,k2,l2);
+ fprintf(fichtmcov,"\n
",subdirf2(optionfilefiname,"VARPIJGR_"), j1,k1,l1,k2,l2);
+ fprintf(fichtmcov,"\n
Correlation at age %d (%.3f),",(int) age, c12);
+ fprintf(ficgp,"\nset out \"%s_%d%1d%1d-%1d%1d.svg\"",subdirf2(optionfilefiname,"VARPIJGR_"), j1,k1,l1,k2,l2);
+ fprintf(ficgp,"\nset label \"%d\" at %11.3e,%11.3e center",(int) age, mu1,mu2);
+ fprintf(ficgp,"\n# Age %d, p%1d%1d - p%1d%1d",(int) age, k1,l1,k2,l2);
+ fprintf(ficgp,"\nplot [-pi:pi] %11.3e+ %.3f*(%11.3e*%11.3e*cos(t)+%11.3e*%11.3e*sin(t)), %11.3e +%.3f*(%11.3e*%11.3e*cos(t)+%11.3e*%11.3e*sin(t)) not", \
+ mu1,std,v11,sqrt(fabs(lc1)),v12,sqrt(fabs(lc2)), \
+ mu2,std,v21,sqrt(fabs(lc1)),v22,sqrt(fabs(lc2))); /* For gnuplot only */
+ }else{
+ first=0;
+ fprintf(fichtmcov," %d (%.3f),",(int) age, c12);
+ fprintf(ficgp,"\n# Age %d, p%1d%1d - p%1d%1d",(int) age, k1,l1,k2,l2);
+ fprintf(ficgp,"\nset label \"%d\" at %11.3e,%11.3e center",(int) age, mu1,mu2);
+ fprintf(ficgp,"\nreplot %11.3e+ %.3f*(%11.3e*%11.3e*cos(t)+%11.3e*%11.3e*sin(t)), %11.3e +%.3f*(%11.3e*%11.3e*cos(t)+%11.3e*%11.3e*sin(t)) not", \
+ mu1,std,v11,sqrt(lc1),v12,sqrt(fabs(lc2)), \
+ mu2,std,v21,sqrt(lc1),v22,sqrt(fabs(lc2)));
+ }/* if first */
+ } /* age mod 5 */
+ } /* end loop age */
+ fprintf(ficgp,"\nset out;\nset out \"%s_%d%1d%1d-%1d%1d.svg\";replot;set out;",subdirf2(optionfilefiname,"VARPIJGR_"), j1,k1,l1,k2,l2);
+ first=1;
+ } /*l12 */
+ } /* k12 */
+ } /*l1 */
+ }/* k1 */
+ } /* loop on nres */
+ } /* loop on combination of covariates j1 */
+ free_ma3x(varpij,1,nlstate,1,nlstate+ndeath,(int) bage, (int)fage);
+ free_matrix(mu,1,(nlstate+ndeath)*(nlstate+ndeath),(int) bage, (int)fage);
+ free_matrix(doldm,1,(nlstate)*(nlstate+ndeath),1,(nlstate)*(nlstate+ndeath));
+ free_matrix(dnewm,1,(nlstate)*(nlstate+ndeath),1,npar);
+ free_vector(xp,1,npar);
+ fclose(ficresprob);
+ fclose(ficresprobcov);
+ fclose(ficresprobcor);
+ fflush(ficgp);
+ fflush(fichtmcov);
}
-/*********** Tricode ****************************/
-void tricode(int *Tvar, int **nbcode, int imx)
-{
-
- int Ndum[20],ij=1, k, j, i, maxncov=19;
- int cptcode=0;
- cptcoveff=0;
-
- for (k=0; k cptcode) cptcode=ij; /* getting the maximum of covariable
- Tvar[j]. If V=sex and male is 0 and
- female is 1, then cptcode=1.*/
- }
-
- for (i=0; i<=cptcode; i++) {
- if(Ndum[i]!=0) ncodemax[j]++; /* Nomber of modalities of the j th covariates. In fact ncodemax[j]=2 (dichotom. variables) but it can be more */
- }
-
- ij=1;
- for (i=1; i<=ncodemax[j]; i++) {
- for (k=0; k<= maxncov; k++) {
- if (Ndum[k] != 0) {
- nbcode[Tvar[j]][ij]=k;
- /* store the modality in an array. k is a modality. If we have model=V1+V1*sex then: nbcode[1][1]=0 ; nbcode[1][2]=1; nbcode[2][1]=0 ; nbcode[2][2]=1; */
-
- ij++;
- }
- if (ij > ncodemax[j]) break;
- }
- }
- }
+/******************* Printing html file ***********/
+void printinghtml(char fileresu[], char title[], char datafile[], int firstpass, \
+ int lastpass, int stepm, int weightopt, char model[],\
+ int imx,int jmin, int jmax, double jmeanint,char rfileres[],\
+ int popforecast, int mobilav, int prevfcast, int mobilavproj, int prevbcast, int estepm , \
+ double jprev1, double mprev1,double anprev1, double dateprev1, double dateprojd, double dateback1, \
+ double jprev2, double mprev2,double anprev2, double dateprev2, double dateprojf, double dateback2){
+ int jj1, k1, i1, cpt, k4, nres;
+ /* In fact some results are already printed in fichtm which is open */
+ fprintf(fichtm,"");
+/* fprintf(fichtm,"- model=1+age+%s\n \ */
+/*
", model); */
+ fprintf(fichtm,"- \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 (forward) prevalence in each health state: %s
\n",
+ subdirf2(fileresu,"PL_"),subdirf2(fileresu,"PL_"));
+ fprintf(fichtm,"\
+ - Backward 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_"));
+ if(prevfcast==1){
+ fprintf(fichtm,"\
+ - Prevalence projections by age and states: \
+ %s
\n ", subdirf2(fileresu,"F_"),subdirf2(fileresu,"F_"));
+ }
- for (k=0; k< maxncov; k++) Ndum[k]=0;
- for (i=1; i<=ncovmodel-2; i++) {
- /* Listing of all covariables in statement model to see if some covariates appear twice. For example, V1 appears twice in V1+V1*V2.*/
- ij=Tvar[i];
- Ndum[ij]++;
- }
+ m=pow(2,cptcoveff);
+ if (cptcovn < 1) {m=1;ncodemax[1]=1;}
- ij=1;
- for (i=1; i<= maxncov; i++) {
- if((Ndum[i]!=0) && (i<=ncovcol)){
- Tvaraff[ij]=i; /*For printing */
- ij++;
+ fprintf(fichtm," \n- Graphs (first order)
");
+
+ jj1=0;
+
+ fprintf(fichtm," \n
");
+ for(nres=1; nres <= nresult; nres++) /* For each resultline */
+ for(k1=1; k1<=m;k1++){ /* For each combination of covariate */
+ if(m != 1 && TKresult[nres]!= k1)
+ continue;
+ jj1++;
+ if (cptcovn > 0) {
+ fprintf(fichtm,"\n- ");
+
+ /* if(nqfveff+nqtveff 0) */ /* Test to be done */
+ fprintf(fichtm,"************ Results for covariates");
+ for (cpt=1; cpt<=cptcoveff;cpt++){
+ fprintf(fichtm," V%d=%d ",Tvresult[nres][cpt],(int)Tresult[nres][cpt]);
+ }
+ for (k4=1; k4<= nsq; k4++){ /* For each selected (single) quantitative value */
+ fprintf(fichtm," V%d=%f ",Tvqresult[nres][k4],Tqresult[nres][k4]);
+ }
+ if(invalidvarcomb[k1]){
+ fprintf(fichtm," Warning Combination (%d) ignored because no cases ",k1);
+ continue;
+ }
+ fprintf(fichtm,"
");
+ } /* cptcovn >0 */
}
- }
-
- cptcoveff=ij-1; /*Number of simple covariates*/
-}
+ fprintf(fichtm," \n
");
-/*********** Health Expectancies ****************/
+ jj1=0;
-void evsij(double ***eij, double x[], int nlstate, int stepm, int bage, int fage, double **oldm, double **savm, int cij, int estepm,char strstart[] )
+ for(nres=1; nres <= nresult; nres++) /* For each resultline */
+ for(k1=1; k1<=m;k1++){ /* For each combination of covariate */
+ if(m != 1 && TKresult[nres]!= k1)
+ continue;
-{
- /* Health expectancies, no variances */
- int i, j, nhstepm, hstepm, h, nstepm, k, cptj, cptj2, i2, j2;
- int nhstepma, nstepma; /* Decreasing with age */
- double age, agelim, hf;
- double ***p3mat;
- double eip;
+ /* for(i1=1; i1<=ncodemax[k1];i1++){ */
+ jj1++;
+ if (cptcovn > 0) {
+ fprintf(fichtm,"\n");
+
+ fprintf(fichtm,"
************ Results for covariates");
+ for (cpt=1; cpt<=cptcoveff;cpt++){
+ 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," (model=%s) ************\n
",model);
+ if(invalidvarcomb[k1]){
+ fprintf(fichtm,"\nCombination (%d) ignored because no cases
\n",k1);
+ printf("\nCombination (%d) ignored because no cases \n",k1);
+ continue;
+ }
+ }
+ /* aij, bij */
+ fprintf(fichtm,"
- Logit model (yours is: logit(pij)=log(pij/pii)= aij+ bij age+%s) as a function of age: %s_%d-1-%d.svg
\
+",model,subdirf2(optionfilefiname,"PE_"),k1,nres,subdirf2(optionfilefiname,"PE_"),k1,nres,subdirf2(optionfilefiname,"PE_"),k1,nres);
+ /* 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-%d.svg
\
+",stepm,subdirf2(optionfilefiname,"PE_"),k1,nres,subdirf2(optionfilefiname,"PE_"),k1,nres,subdirf2(optionfilefiname,"PE_"),k1,nres);
+ /* Quasi-incidences */
+ 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-%d.svg
\
+",stepm,subdirf2(optionfilefiname,"PE_"),k1,nres,subdirf2(optionfilefiname,"PE_"),k1,nres,subdirf2(optionfilefiname,"PE_"),k1,nres);
+ /* Survival functions (period) in state j */
+ for(cpt=1; cpt<=nlstate;cpt++){
+ fprintf(fichtm,"
\n- Survival functions in state %d. And probability to be observed in state %d being in state (1 to %d) at different ages. %s_%d-%d-%d.svg
\
+", cpt, cpt, nlstate, subdirf2(optionfilefiname,"LIJ_"),cpt,k1,nres,subdirf2(optionfilefiname,"LIJ_"),cpt,k1,nres,subdirf2(optionfilefiname,"LIJ_"),cpt,k1,nres);
+ }
+ /* State specific survival functions (period) */
+ for(cpt=1; cpt<=nlstate;cpt++){
+ fprintf(fichtm,"
\n- Survival functions in state %d and in any other live state (total).\
+ And probability to be observed in various states (up to %d) being in state %d at different ages. \
+ %s_%d-%d-%d.svg
", cpt, nlstate, cpt, subdirf2(optionfilefiname,"LIJT_"),cpt,k1,nres,subdirf2(optionfilefiname,"LIJT_"),cpt,k1,nres,subdirf2(optionfilefiname,"LIJT_"),cpt,k1,nres);
+ }
+ /* Period (forward stable) prevalence in each health state */
+ for(cpt=1; cpt<=nlstate;cpt++){
+ fprintf(fichtm,"
\n- Convergence to period (stable) prevalence in state %d. Or probability for a person being in state (1 to %d) at different ages, to be in state %d some years after. %s_%d-%d-%d.svg
\
+", cpt, nlstate, cpt, subdirf2(optionfilefiname,"P_"),cpt,k1,nres,subdirf2(optionfilefiname,"P_"),cpt,k1,nres,subdirf2(optionfilefiname,"P_"),cpt,k1,nres);
+ }
+ if(prevbcast==1){
+ /* Backward prevalence in each health state */
+ for(cpt=1; cpt<=nlstate;cpt++){
+ fprintf(fichtm,"
\n- Convergence to mixed (stable) back prevalence in state %d. Or probability for a person to be in state %d at a younger age, knowing that she/he was in state (1 to %d) at different older ages. %s_%d-%d-%d.svg
\
+", cpt, cpt, nlstate, subdirf2(optionfilefiname,"PB_"),cpt,k1,nres,subdirf2(optionfilefiname,"PB_"),cpt,k1,nres,subdirf2(optionfilefiname,"PB_"),cpt,k1,nres);
+ }
+ }
+ if(prevfcast==1){
+ /* Projection of prevalence up to period (forward 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 and mobil_average=%d), from year %.1f up to year %.1f tending to period (stable) forward prevalence in state %d. Or probability to be in state %d being in an observed weighted state (from 1 to %d). %s_%d-%d-%d.svg", dateprev1, dateprev2, mobilavproj, dateprojd, dateprojf, cpt, cpt, nlstate, subdirf2(optionfilefiname,"PROJ_"),cpt,k1,nres,subdirf2(optionfilefiname,"PROJ_"),cpt,k1,nres);
+ fprintf(fichtm," (data from text file %s.txt)\n
",subdirf2(optionfilefiname,"F_"),subdirf2(optionfilefiname,"F_"));
+ fprintf(fichtm,"",
+ subdirf2(optionfilefiname,"PROJ_"),cpt,k1,nres);
+ }
+ }
+ if(prevbcast==1){
+ /* Back projection of prevalence up to stable (mixed) back-prevalence in each health state */
+ for(cpt=1; cpt<=nlstate;cpt++){
+ fprintf(fichtm,"
\n- Back projection of cross-sectional prevalence (estimated with cases observed from %.1f to %.1f and mobil_average=%d), \
+ from year %.1f up to year %.1f (probably close to stable [mixed] back prevalence in state %d (randomness in cross-sectional prevalence is not taken into \
+ account but can visually be appreciated). Or probability to have been in an state %d, knowing that the person was in either state (1 or %d) \
+with weights corresponding to observed prevalence at different ages. %s_%d-%d-%d.svg", dateprev1, dateprev2, mobilavproj, dateback1, dateback2, cpt, cpt, nlstate, subdirf2(optionfilefiname,"PROJB_"),cpt,k1,nres,subdirf2(optionfilefiname,"PROJB_"),cpt,k1,nres);
+ fprintf(fichtm," (data from text file %s.txt)\n
",subdirf2(optionfilefiname,"FB_"),subdirf2(optionfilefiname,"FB_"));
+ fprintf(fichtm," ", subdirf2(optionfilefiname,"PROJB_"),cpt,k1,nres);
+ }
+ }
+
+ 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-%d.svg",cpt,nlstate,subdirf2(optionfilefiname,"EXP_"),cpt,k1,nres,subdirf2(optionfilefiname,"EXP_"),cpt,k1,nres);
+ fprintf(fichtm," (data from text file %s.txt)\n
",subdirf2(optionfilefiname,"E_"),subdirf2(optionfilefiname,"E_"));
+ fprintf(fichtm,"", subdirf2(optionfilefiname,"EXP_"),cpt,k1,nres );
+ }
+ /* } /\* end i1 *\/ */
+ }/* End k1 */
+ fprintf(fichtm,"
");
- pstamp(ficreseij);
- fprintf(ficreseij,"# (a) Life expectancies by health status at initial age and (b) health expectancies by health status at initial age\n");
- fprintf(ficreseij,"# Age");
- for(i=1; i<=nlstate;i++){
- for(j=1; j<=nlstate;j++){
- fprintf(ficreseij," e%1d%1d ",i,j);
- }
- fprintf(ficreseij," e%1d. ",i);
- }
- fprintf(ficreseij,"\n");
+ fprintf(fichtm,"\
+\n
- \n\
+ - Parameter file with estimated parameters and covariance matrix: %s
\
+ - 95%% confidence intervals and Wald tests of the estimated parameters are in the log file if optimization has been done (mle != 0).
\
+But because parameters are usually highly correlated (a higher incidence of disability \
+and a higher incidence of recovery can give very close observed transition) it might \
+be very useful to look not only at linear confidence intervals estimated from the \
+variances but at the covariance matrix. And instead of looking at the estimated coefficients \
+(parameters) of the logistic regression, it might be more meaningful to visualize the \
+covariance matrix of the one-step probabilities. \
+See page 'Matrix of variance-covariance of one-step probabilities' below. \n", rfileres,rfileres);
+
+ fprintf(fichtm," - Standard deviation of one-step probabilities: %s
\n",
+ subdirf2(fileresu,"PROB_"),subdirf2(fileresu,"PROB_"));
+ fprintf(fichtm,"\
+ - Variance-covariance of one-step probabilities: %s
\n",
+ subdirf2(fileresu,"PROBCOV_"),subdirf2(fileresu,"PROBCOV_"));
+
+ fprintf(fichtm,"\
+ - Correlation matrix of one-step probabilities: %s
\n",
+ subdirf2(fileresu,"PROBCOR_"),subdirf2(fileresu,"PROBCOR_"));
+ fprintf(fichtm,"\
+ - Variances and covariances of health expectancies by age and initial health status (cov(eij,ekl)(estepm=%2d months): \
+ %s
\n ",
+ estepm,subdirf2(fileresu,"CVE_"),subdirf2(fileresu,"CVE_"));
+ fprintf(fichtm,"\
+ - (a) Health expectancies by health status at initial age (eij) and standard errors (in parentheses) (b) life expectancies and standard errors (ei.=ei1+ei2+...)(estepm=%2d months): \
+ %s
\n",
+ estepm,subdirf2(fileresu,"STDE_"),subdirf2(fileresu,"STDE_"));
+ fprintf(fichtm,"\
+ - Variances and covariances of health expectancies by age. Status (i) based health expectancies (in state j), eij are weighted by the forward (period) prevalences in each state i (if popbased=1, an additional computation is done using the cross-sectional prevalences, i.e population based) (estepm=%d months): %s
\n",
+ estepm, subdirf2(fileresu,"V_"),subdirf2(fileresu,"V_"));
+ fprintf(fichtm,"\
+ - Total life expectancy and total health expectancies to be spent in each health state e.j with their standard errors (if popbased=1, an additional computation is done using the cross-sectional prevalences, i.e population based) (estepm=%d months): %s
\n",
+ estepm, subdirf2(fileresu,"T_"),subdirf2(fileresu,"T_"));
+ fprintf(fichtm,"\
+ - Standard deviation of forward (period) prevalences: %s
\n",\
+ subdirf2(fileresu,"VPL_"),subdirf2(fileresu,"VPL_"));
-
- if(estepm < stepm){
- printf ("Problem %d lower than %d\n",estepm, stepm);
- }
- else hstepm=estepm;
- /* We compute the life expectancy from trapezoids spaced every estepm months
- * This is mainly to measure the difference between two models: for example
- * if stepm=24 months pijx are given only every 2 years and by summing them
- * we are calculating an estimate of the Life Expectancy assuming a linear
- * progression in between and thus overestimating or underestimating according
- * to the curvature of the survival function. If, for the same date, we
- * estimate the model with stepm=1 month, we can keep estepm to 24 months
- * to compare the new estimate of Life expectancy with the same linear
- * hypothesis. A more precise result, taking into account a more precise
- * curvature will be obtained if estepm is as small as stepm. */
+/* if(popforecast==1) fprintf(fichtm,"\n */
+/* - Prevalences forecasting: f%s
\n */
+/* - Population forecasting (if popforecast=1): pop%s
\n */
+/*
",fileres,fileres,fileres,fileres); */
+/* else */
+/* fprintf(fichtm,"\n No population forecast: popforecast = %d (instead of 1) or stepm = %d (instead of 1) or model=%s (instead of .)
\n",popforecast, stepm, model); */
+ fflush(fichtm);
- /* For example we decided to compute the life expectancy with the smallest unit */
- /* hstepm beeing the number of stepms, if hstepm=1 the length of hstepm is stepm.
- nhstepm is the number of hstepm from age to agelim
- nstepm is the number of stepm from age to agelin.
- Look at hpijx to understand the reason of that which relies in memory size
- and note for a fixed period like estepm months */
- /* We decided (b) to get a life expectancy respecting the most precise curvature of the
- survival function given by stepm (the optimization length). Unfortunately it
- means that if the survival funtion is printed only each two years of age and if
- you sum them up and add 1 year (area under the trapezoids) you won't get the same
- results. So we changed our mind and took the option of the best precision.
- */
- hstepm=hstepm/stepm; /* Typically in stepm units, if stepm=6 & estepm=24 , = 24/6 months = 4 */
+ m=pow(2,cptcoveff);
+ if (cptcovn < 1) {m=1;ncodemax[1]=1;}
- agelim=AGESUP;
- /* If stepm=6 months */
- /* Computed by stepm unit matrices, product of hstepm matrices, stored
- in an array of nhstepm length: nhstepm=10, hstepm=4, stepm=6 months */
-
-/* nhstepm age range expressed in number of stepm */
- nstepm=(int) rint((agelim-bage)*YEARM/stepm); /* Biggest nstepm */
- /* Typically if 20 years nstepm = 20*12/6=40 stepm */
- /* if (stepm >= YEARM) hstepm=1;*/
- nhstepm = nstepm/hstepm;/* Expressed in hstepm, typically nhstepm=40/4=10 */
- p3mat=ma3x(1,nlstate+ndeath,1, nlstate+ndeath, 0,nhstepm);
+ fprintf(fichtm," - Graphs (second order)
");
- for (age=bage; age<=fage; age ++){
- nstepma=(int) rint((agelim-bage)*YEARM/stepm); /* Biggest nstepm */
- /* Typically if 20 years nstepm = 20*12/6=40 stepm */
- /* if (stepm >= YEARM) hstepm=1;*/
- nhstepma = nstepma/hstepm;/* Expressed in hstepm, typically nhstepma=40/4=10 */
+ jj1=0;
- /* If stepm=6 months */
- /* 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);
-
- hf=hstepm*stepm/YEARM; /* Duration of hstepm expressed in year unit. */
-
- printf("%d|",(int)age);fflush(stdout);
- fprintf(ficlog,"%d|",(int)age);fflush(ficlog);
-
- /* Computing expectancies */
- 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++){
- eij[i][j][(int)age] += (p3mat[i][j][h]+p3mat[i][j][h+1])/2.0*hf;
-
- /* if((int)age==70)printf("i=%2d,j=%2d,h=%2d,age=%3d,%9.4f,%9.4f,%9.4f\n",i,j,h,(int)age,p3mat[i][j][h],hf,eij[i][j][(int)age]);*/
+ fprintf(fichtm," \n
");
+ for(nres=1; nres <= nresult; nres++) /* For each resultline */
+ for(k1=1; k1<=m;k1++){ /* For each combination of covariate */
+ if(m != 1 && TKresult[nres]!= k1)
+ continue;
+ jj1++;
+ if (cptcovn > 0) {
+ fprintf(fichtm,"\n- ");
+
+ /* if(nqfveff+nqtveff 0) */ /* Test to be done */
+ fprintf(fichtm,"************ Results for covariates");
+ for (cpt=1; cpt<=cptcoveff;cpt++){
+ fprintf(fichtm," V%d=%d ",Tvresult[nres][cpt],(int)Tresult[nres][cpt]);
+ }
+ for (k4=1; k4<= nsq; k4++){ /* For each selected (single) quantitative value */
+ fprintf(fichtm," V%d=%f ",Tvqresult[nres][k4],Tqresult[nres][k4]);
+ }
+ if(invalidvarcomb[k1]){
+ fprintf(fichtm," Warning Combination (%d) ignored because no cases ",k1);
+ continue;
+ }
+ fprintf(fichtm,"
");
+ } /* cptcovn >0 */
+ }
+ fprintf(fichtm," \n
");
- }
+ jj1=0;
- fprintf(ficreseij,"%3.0f",age );
- for(i=1; i<=nlstate;i++){
- eip=0;
- for(j=1; j<=nlstate;j++){
- eip +=eij[i][j][(int)age];
- fprintf(ficreseij,"%9.4f", eij[i][j][(int)age] );
+ for(nres=1; nres <= nresult; nres++){ /* For each resultline */
+ for(k1=1; k1<=m;k1++){
+ if(m != 1 && TKresult[nres]!= k1)
+ continue;
+ /* for(i1=1; i1<=ncodemax[k1];i1++){ */
+ jj1++;
+ if (cptcovn > 0) {
+ fprintf(fichtm,"\n");
+
+ fprintf(fichtm,"
************ Results for covariates");
+ for (cpt=1; cpt<=cptcoveff;cpt++){ /**< cptcoveff number of variables */
+ fprintf(fichtm," V%d=%d ",Tvresult[nres][cpt],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)]); */
+ }
+ for (k4=1; k4<= nsq; k4++){ /* For each selected (single) quantitative value */
+ fprintf(fichtm," V%d=%f ",Tvqresult[nres][k4],Tqresult[nres][k4]);
}
- fprintf(ficreseij,"%9.4f", eip );
- }
- fprintf(ficreseij,"\n");
-
- }
- free_ma3x(p3mat,1,nlstate+ndeath,1, nlstate+ndeath, 0,nhstepm);
- printf("\n");
- fprintf(ficlog,"\n");
-
-}
-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[] )
+ fprintf(fichtm," (model=%s) ************\n
",model);
-{
- /* Covariances of health expectancies eij and of total life expectancies according
- to initial status i, ei. .
- */
- int i, j, nhstepm, hstepm, h, nstepm, k, cptj, cptj2, i2, j2, ij, ji;
- int nhstepma, nstepma; /* Decreasing with age */
- double age, agelim, hf;
- double ***p3matp, ***p3matm, ***varhe;
- double **dnewm,**doldm;
- double *xp, *xm;
- double **gp, **gm;
- double ***gradg, ***trgradg;
- int theta;
+ if(invalidvarcomb[k1]){
+ fprintf(fichtm,"\nCombination (%d) ignored because no cases
\n",k1);
+ continue;
+ }
+ }
+ for(cpt=1; cpt<=nlstate;cpt++) {
+ fprintf(fichtm,"\n
- Observed (cross-sectional with mov_average=%d) and period (incidence based) \
+prevalence (with 95%% confidence interval) in state (%d): %s_%d-%d-%d.svg",mobilav,cpt,subdirf2(optionfilefiname,"V_"),cpt,k1,nres,subdirf2(optionfilefiname,"V_"),cpt,k1,nres);
+ fprintf(fichtm," (data from text file %s)\n
",subdirf2(fileresu,"VPL_"),subdirf2(fileresu,"VPL_"));
+ fprintf(fichtm,"",subdirf2(optionfilefiname,"V_"), cpt,k1,nres);
+ }
+ fprintf(fichtm,"\n
- Total life expectancy by age and \
+health expectancies in each live states (1 to %d). If popbased=1 the smooth (due to the model) \
+true period expectancies (those weighted with period prevalences are also\
+ drawn in addition to the population based expectancies computed using\
+ observed and cahotic prevalences: %s_%d-%d.svg",nlstate, subdirf2(optionfilefiname,"E_"),k1,nres,subdirf2(optionfilefiname,"E_"),k1,nres);
+ fprintf(fichtm," (data from text file %s.txt) \n
",subdirf2(optionfilefiname,"T_"),subdirf2(optionfilefiname,"T_"));
+ fprintf(fichtm,"",subdirf2(optionfilefiname,"E_"),k1,nres);
+ /* } /\* end i1 *\/ */
+ }/* End k1 */
+ }/* End nres */
+ fprintf(fichtm,"
");
+ fflush(fichtm);
+}
- double eip, vip;
+/******************* Gnuplot file **************/
+void printinggnuplot(char fileresu[], char optionfilefiname[], double ageminpar, double agemaxpar, double bage, double fage , int prevfcast, int prevbcast, char pathc[], double p[], int offyear, int offbyear){
- varhe=ma3x(1,nlstate*nlstate,1,nlstate*nlstate,(int) bage, (int) fage);
- xp=vector(1,npar);
- xm=vector(1,npar);
- dnewm=matrix(1,nlstate*nlstate,1,npar);
- doldm=matrix(1,nlstate*nlstate,1,nlstate*nlstate);
-
- pstamp(ficresstdeij);
- fprintf(ficresstdeij,"# Health expectancies with standard errors\n");
- fprintf(ficresstdeij,"# Age");
- for(i=1; i<=nlstate;i++){
- for(j=1; j<=nlstate;j++)
- fprintf(ficresstdeij," e%1d%1d (SE)",i,j);
- fprintf(ficresstdeij," e%1d. ",i);
- }
- fprintf(ficresstdeij,"\n");
+ char dirfileres[132],optfileres[132];
+ char gplotcondition[132], gplotlabel[132];
+ 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 iyearc=1; /* variable column for year of projection */
+ int iagec=1; /* variable column for age of projection */
+ int nres=0; /* Index of resultline */
+ int istart=1; /* For starting graphs in projections */
- pstamp(ficrescveij);
- fprintf(ficrescveij,"# Subdiagonal matrix of covariances of health expectancies by age: cov(eij,ekl)\n");
- fprintf(ficrescveij,"# Age");
- for(i=1; i<=nlstate;i++)
- for(j=1; j<=nlstate;j++){
- cptj= (j-1)*nlstate+i;
- for(i2=1; i2<=nlstate;i2++)
- for(j2=1; j2<=nlstate;j2++){
- cptj2= (j2-1)*nlstate+i2;
- if(cptj2 <= cptj)
- fprintf(ficrescveij," %1d%1d,%1d%1d",i,j,i2,j2);
- }
- }
- fprintf(ficrescveij,"\n");
-
- if(estepm < stepm){
- printf ("Problem %d lower than %d\n",estepm, stepm);
- }
- else hstepm=estepm;
- /* We compute the life expectancy from trapezoids spaced every estepm months
- * This is mainly to measure the difference between two models: for example
- * if stepm=24 months pijx are given only every 2 years and by summing them
- * we are calculating an estimate of the Life Expectancy assuming a linear
- * progression in between and thus overestimating or underestimating according
- * to the curvature of the survival function. If, for the same date, we
- * estimate the model with stepm=1 month, we can keep estepm to 24 months
- * to compare the new estimate of Life expectancy with the same linear
- * hypothesis. A more precise result, taking into account a more precise
- * curvature will be obtained if estepm is as small as stepm. */
+/* if((ficgp=fopen(optionfilegnuplot,"a"))==NULL) { */
+/* printf("Problem with file %s",optionfilegnuplot); */
+/* fprintf(ficlog,"Problem with file %s",optionfilegnuplot); */
+/* } */
- /* For example we decided to compute the life expectancy with the smallest unit */
- /* hstepm beeing the number of stepms, if hstepm=1 the length of hstepm is stepm.
- nhstepm is the number of hstepm from age to agelim
- nstepm is the number of stepm from age to agelin.
- Look at hpijx to understand the reason of that which relies in memory size
- and note for a fixed period like estepm months */
- /* We decided (b) to get a life expectancy respecting the most precise curvature of the
- survival function given by stepm (the optimization length). Unfortunately it
- means that if the survival funtion is printed only each two years of age and if
- you sum them up and add 1 year (area under the trapezoids) you won't get the same
- results. So we changed our mind and took the option of the best precision.
- */
- hstepm=hstepm/stepm; /* Typically in stepm units, if stepm=6 & estepm=24 , = 24/6 months = 4 */
+ /*#ifdef windows */
+ fprintf(ficgp,"cd \"%s\" \n",pathc);
+ /*#endif */
+ m=pow(2,cptcoveff);
- /* If stepm=6 months */
- /* nhstepm age range expressed in number of stepm */
- agelim=AGESUP;
- nstepm=(int) rint((agelim-bage)*YEARM/stepm);
- /* Typically if 20 years nstepm = 20*12/6=40 stepm */
- /* if (stepm >= YEARM) hstepm=1;*/
- nhstepm = nstepm/hstepm;/* Expressed in hstepm, typically nhstepm=40/4=10 */
-
- p3matp=ma3x(1,nlstate+ndeath,1, nlstate+ndeath, 0,nhstepm);
- p3matm=ma3x(1,nlstate+ndeath,1, nlstate+ndeath, 0,nhstepm);
- gradg=ma3x(0,nhstepm,1,npar,1,nlstate*nlstate);
- trgradg =ma3x(0,nhstepm,1,nlstate*nlstate,1,npar);
- gp=matrix(0,nhstepm,1,nlstate*nlstate);
- gm=matrix(0,nhstepm,1,nlstate*nlstate);
+ /* diagram of the model */
+ fprintf(ficgp,"\n#Diagram of the model \n");
+ fprintf(ficgp,"\ndelta=0.03;delta2=0.07;unset arrow;\n");
+ fprintf(ficgp,"yoff=(%d > 2? 0:1);\n",nlstate);
+ fprintf(ficgp,"\n#Peripheral arrows\nset for [i=1:%d] for [j=1:%d] arrow i*10+j from cos(pi*((1-(%d/2)*2./%d)/2+(i-1)*2./%d))-(i!=j?(i-j)/abs(i-j)*delta:0), yoff +sin(pi*((1-(%d/2)*2./%d)/2+(i-1)*2./%d)) + (i!=j?(i-j)/abs(i-j)*delta:0) rto -0.95*(cos(pi*((1-(%d/2)*2./%d)/2+(i-1)*2./%d))+(i!=j?(i-j)/abs(i-j)*delta:0) - cos(pi*((1-(%d/2)*2./%d)/2+(j-1)*2./%d)) + (i!=j?(i-j)/abs(i-j)*delta2:0)), -0.95*(sin(pi*((1-(%d/2)*2./%d)/2+(i-1)*2./%d)) + (i!=j?(i-j)/abs(i-j)*delta:0) - sin(pi*((1-(%d/2)*2./%d)/2+(j-1)*2./%d))+( i!=j?(i-j)/abs(i-j)*delta2:0)) ls (i < j? 1:2)\n",nlstate,nlstate,nlstate,nlstate,nlstate,nlstate,nlstate,nlstate,nlstate,nlstate,nlstate,nlstate,nlstate,nlstate,nlstate,nlstate,nlstate,nlstate,nlstate,nlstate);
+
+ fprintf(ficgp,"\n#Centripete arrows (turning in other direction (1-i) instead of (i-1)) \nset for [i=1:%d] arrow (%d+1)*10+i from cos(pi*((1-(%d/2)*2./%d)/2+(1-i)*2./%d))-(i!=j?(i-j)/abs(i-j)*delta:0), yoff +sin(pi*((1-(%d/2)*2./%d)/2+(1-i)*2./%d)) + (i!=j?(i-j)/abs(i-j)*delta:0) rto -0.80*(cos(pi*((1-(%d/2)*2./%d)/2+(1-i)*2./%d))+(i!=j?(i-j)/abs(i-j)*delta:0) ), -0.80*(sin(pi*((1-(%d/2)*2./%d)/2+(1-i)*2./%d)) + (i!=j?(i-j)/abs(i-j)*delta:0) + yoff ) ls 4\n",nlstate,nlstate,nlstate,nlstate,nlstate,nlstate,nlstate,nlstate,nlstate,nlstate,nlstate,nlstate,nlstate,nlstate);
+ fprintf(ficgp,"\n#show arrow\nunset label\n");
+ fprintf(ficgp,"\n#States labels, starting from 2 (2-i) instead of (1-i), was (i-1)\nset for [i=1:%d] label i sprintf(\"State %%d\",i) center at cos(pi*((1-(%d/2)*2./%d)/2+(2-i)*2./%d)), yoff+sin(pi*((1-(%d/2)*2./%d)/2+(2-i)*2./%d)) font \"helvetica, 16\" tc rgbcolor \"blue\"\n",nlstate,nlstate,nlstate,nlstate,nlstate,nlstate,nlstate);
+ fprintf(ficgp,"\nset label %d+1 sprintf(\"State %%d\",%d+1) center at 0.,0. font \"helvetica, 16\" tc rgbcolor \"red\"\n",nlstate,nlstate);
+ fprintf(ficgp,"\n#show label\nunset border;unset xtics; unset ytics;\n");
+ fprintf(ficgp,"\n\nset ter svg size 640, 480;set out \"%s_.svg\" \n",subdirf2(optionfilefiname,"D_"));
+ fprintf(ficgp,"unset log y; plot [-1.2:1.2][yoff-1.2:1.2] 1/0 not; set out;reset;\n");
+
+ /* 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");
+ fprintf(ficgp,"\n set log y; unset log x;set xlabel \"Age\"; set ylabel \"Likelihood (-2Log(L))\";");
+ /* fprintf(ficgp,"\nset ter svg size 640, 480"); */ /* Too big for svg */
+ fprintf(ficgp,"\nset ter pngcairo size 640, 480");
+/* nice for mle=4 plot by number of matrix products.
+ replot "rrtest1/toto.txt" u 2:($4 == 1 && $5==2 ? $9 : 1/0):5 t "p12" with point lc 1 */
+/* 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:(-$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:(-$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:($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:($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");
+ }
+ /* unset log; plot "rrtest1_sorted_4/ILK_rrtest1_sorted_4.txt" u 2:($4 == 1 && $5==2 ? $9 : 1/0):5 t "p12" with points lc variable */
+ /* fprintf(ficgp,"\nset log y;plot \"%s\" u 2:(-$11):3 t \"All sample, all transitions\" with dots lc variable",subdirf(fileresilk)); */
+ /* fprintf(ficgp,"\nreplot \"%s\" u 2:($3 <= 3 ? -$11 : 1/0):3 t \"First 3 individuals\" with line lc variable", subdirf(fileresilk)); */
+ fprintf(ficgp,"\nset out;unset log\n");
+ /* fprintf(ficgp,"\nset out \"%s.svg\"; replot; set out; # bug gnuplot",subdirf2(optionfilefiname,"ILK_")); */
- for (age=bage; age<=fage; age ++){
- nstepma=(int) rint((agelim-bage)*YEARM/stepm); /* Biggest nstepm */
- /* Typically if 20 years nstepm = 20*12/6=40 stepm */
- /* if (stepm >= YEARM) hstepm=1;*/
- nhstepma = nstepma/hstepm;/* Expressed in hstepm, typically nhstepma=40/4=10 */
+ strcpy(dirfileres,optionfilefiname);
+ strcpy(optfileres,"vpl");
+ /* 1eme*/
+ for (cpt=1; cpt<= nlstate ; cpt ++){ /* For each live state */
+ 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(m != 1 && 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: Forward (stable period) prevalence with CI: 'VPL_' files and live state =%d ", cpt);
+ strcpy(gplotlabel,"(");
+ 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 */
+ /* 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[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);
+ sprintf(gplotlabel+strlen(gplotlabel)," 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]);
+ sprintf(gplotlabel+strlen(gplotlabel)," V%d=%f ",Tvqresult[nres][k4],Tqresult[nres][k4]);
+ }
+ strcpy(gplotlabel+strlen(gplotlabel),")");
+ /* printf("\n#\n"); */
+ fprintf(ficgp,"\n#\n");
+ if(invalidvarcomb[k1]){
+ /*k1=k1-1;*/ /* To be checked */
+ fprintf(ficgp,"#Combination (%d) ignored because no cases \n",k1);
+ continue;
+ }
+
+ fprintf(ficgp,"\nset out \"%s_%d-%d-%d.svg\" \n",subdirf2(optionfilefiname,"V_"),cpt,k1,nres);
+ fprintf(ficgp,"\n#set out \"V_%s_%d-%d-%d.svg\" \n",optionfilefiname,cpt,k1,nres);
+ /* fprintf(ficgp,"set label \"Alive state %d %s\" at graph 0.98,0.5 center rotate font \"Helvetica,12\"\n",cpt,gplotlabel); */
+ fprintf(ficgp,"set title \"Alive state %d %s model=%s\" font \"Helvetica,12\"\n",cpt,gplotlabel,model);
+ fprintf(ficgp,"set xlabel \"Age\" \nset ylabel \"Probability\" \nset ter svg size 640, 480\nplot [%.f:%.f] \"%s\" every :::%d::%d u 1:($2==%d ? $3:1/0) \"%%lf %%lf",ageminpar,fage,subdirf2(fileresu,"VPL_"),nres-1,nres-1,nres);
+ /* fprintf(ficgp,"set xlabel \"Age\" \nset ylabel \"Probability\" \nset ter svg size 640, 480\nplot [%.f:%.f] \"%s\" every :::%d::%d u 1:($2==%d ? $3:1/0) \"%%lf %%lf",ageminpar,fage,subdirf2(fileresu,"VPL_"),k1-1,k1-1,nres); */
+ /* k1-1 error should be nres-1*/
+ for (i=1; i<= nlstate ; i ++) {
+ if (i==cpt) fprintf(ficgp," %%lf (%%lf)");
+ else fprintf(ficgp," %%*lf (%%*lf)");
+ }
+ fprintf(ficgp,"\" t\"Forward prevalence\" w l lt 0,\"%s\" every :::%d::%d u 1:($2==%d ? $3+1.96*$4 : 1/0) \"%%lf %%lf",subdirf2(fileresu,"VPL_"),nres-1,nres-1,nres);
+ for (i=1; i<= nlstate ; i ++) {
+ if (i==cpt) fprintf(ficgp," %%lf (%%lf)");
+ else fprintf(ficgp," %%*lf (%%*lf)");
+ }
+ fprintf(ficgp,"\" t\"95%% CI\" w l lt 1,\"%s\" every :::%d::%d u 1:($2==%d ? $3-1.96*$4 : 1/0) \"%%lf %%lf",subdirf2(fileresu,"VPL_"),nres-1,nres-1,nres);
+ for (i=1; i<= nlstate ; i ++) {
+ if (i==cpt) fprintf(ficgp," %%lf (%%lf)");
+ else fprintf(ficgp," %%*lf (%%*lf)");
+ }
+ /* fprintf(ficgp,"\" t\"\" w l lt 1,\"%s\" every :::%d::%d u 1:($%d) t\"Observed prevalence\" w l lt 2",subdirf2(fileresu,"P_"),k1-1,k1-1,2+4*(cpt-1)); */
+
+ fprintf(ficgp,"\" t\"\" w l lt 1,\"%s\" u 1:((",subdirf2(fileresu,"P_"));
+ if(cptcoveff ==0){
+ fprintf(ficgp,"$%d)) t 'Observed prevalence in state %d' with line lt 3", 2+3*(cpt-1), cpt );
+ }else{
+ kl=0;
+ for (k=1; k<=cptcoveff; k++){ /* For each combination of 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[k]][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){
+ fprintf(ficgp,"$%d==%d && $%d==%d)? $%d : 1/0) t 'Observed prevalence in state %d' w l lt 2",kl+1, Tvaraff[k],kl+1+1,nbcode[Tvaraff[k]][lv], \
+ 2+cptcoveff*2+3*(cpt-1), cpt ); /* 4 or 6 ?*/
+ }else{
+ fprintf(ficgp,"$%d==%d && $%d==%d && ",kl+1, Tvaraff[k],kl+1+1,nbcode[Tvaraff[k]][lv]);
+ kl++;
+ }
+ } /* end covariate */
+ } /* end if no covariate */
- /* If stepm=6 months */
- /* Computed by stepm unit matrices, product of hstepma matrices, stored
- in an array of nhstepma length: nhstepma=10, hstepm=4, stepm=6 months */
-
- hf=hstepm*stepm/YEARM; /* Duration of hstepm expressed in year unit. */
+ if(prevbcast==1){ /* We need to get the corresponding values of the covariates involved in this combination k1 */
+ /* fprintf(ficgp,",\"%s\" every :::%d::%d u 1:($%d) t\"Backward stable prevalence\" w l lt 3",subdirf2(fileresu,"PLB_"),k1-1,k1-1,1+cpt); */
+ fprintf(ficgp,",\"%s\" u 1:((",subdirf2(fileresu,"PLB_")); /* Age is in 1, nres in 2 to be fixed */
+ if(cptcoveff ==0){
+ fprintf(ficgp,"$%d)) t 'Backward prevalence in state %d' with line lt 3", 2+(cpt-1), cpt );
+ }else{
+ kl=0;
+ for (k=1; k<=cptcoveff; k++){ /* For each combination of 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[k]][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){
+ fprintf(ficgp,"$%d==%d && $%d==%d)? $%d : 1/0) t 'Backward prevalence in state %d' w l lt 3",kl+1, Tvaraff[k],kl+1+1,nbcode[Tvaraff[k]][lv], \
+ 2+cptcoveff*2+(cpt-1), cpt ); /* 4 or 6 ?*/
+ }else{
+ fprintf(ficgp,"$%d==%d && $%d==%d && ",kl+1, Tvaraff[k],kl+1+1,nbcode[Tvaraff[k]][lv]);
+ kl++;
+ }
+ } /* end covariate */
+ } /* end if no covariate */
+ if(prevbcast == 1){
+ fprintf(ficgp,", \"%s\" every :::%d::%d u 1:($2==%d ? $3:1/0) \"%%lf %%lf",subdirf2(fileresu,"VBL_"),nres-1,nres-1,nres);
+ /* k1-1 error should be nres-1*/
+ for (i=1; i<= nlstate ; i ++) {
+ if (i==cpt) fprintf(ficgp," %%lf (%%lf)");
+ else fprintf(ficgp," %%*lf (%%*lf)");
+ }
+ fprintf(ficgp,"\" t\"Backward (stable) prevalence\" w l lt 6 dt 3,\"%s\" every :::%d::%d u 1:($2==%d ? $3+1.96*$4 : 1/0) \"%%lf %%lf",subdirf2(fileresu,"VBL_"),nres-1,nres-1,nres);
+ for (i=1; i<= nlstate ; i ++) {
+ if (i==cpt) fprintf(ficgp," %%lf (%%lf)");
+ else fprintf(ficgp," %%*lf (%%*lf)");
+ }
+ fprintf(ficgp,"\" t\"95%% CI\" w l lt 4,\"%s\" every :::%d::%d u 1:($2==%d ? $3-1.96*$4 : 1/0) \"%%lf %%lf",subdirf2(fileresu,"VBL_"),nres-1,nres-1,nres);
+ for (i=1; i<= nlstate ; i ++) {
+ if (i==cpt) fprintf(ficgp," %%lf (%%lf)");
+ else fprintf(ficgp," %%*lf (%%*lf)");
+ }
+ fprintf(ficgp,"\" t\"\" w l lt 4");
+ } /* end if backprojcast */
+ } /* end if prevbcast */
+ /* fprintf(ficgp,"\nset out ;unset label;\n"); */
+ fprintf(ficgp,"\nset out ;unset title;\n");
+ } /* nres */
+ } /* k1 */
+ } /* cpt */
- /* Computing Variances of health expectancies */
- /* Gradient is computed with plus gp and minus gm. Code is duplicated in order to
- decrease memory allocation */
- for(theta=1; theta <=npar; theta++){
- for(i=1; i<=npar; i++){
- 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);
- for(j=1; j<= nlstate; j++){
- for(i=1; i<=nlstate; i++){
- for(h=0; h<=nhstepm-1; h++){
- gp[h][(j-1)*nlstate + i] = (p3matp[i][j][h]+p3matp[i][j][h+1])/2.;
- gm[h][(j-1)*nlstate + i] = (p3matm[i][j][h]+p3matm[i][j][h+1])/2.;
+ /*2 eme*/
+ for (k1=1; k1<= m ; k1 ++){
+ for(nres=1; nres <= nresult; nres++){ /* For each resultline */
+ if(m != 1 && TKresult[nres]!= k1)
+ continue;
+ fprintf(ficgp,"\n# 2nd: Total life expectancy with CI: 't' files ");
+ strcpy(gplotlabel,"(");
+ 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[k]][lv];
+ fprintf(ficgp," V%d=%d ",Tvaraff[k],vlv);
+ sprintf(gplotlabel+strlen(gplotlabel)," V%d=%d ",Tvaraff[k],vlv);
+ }
+ /* for(k=1; k <= ncovds; k++){ */
+ 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]);
+ sprintf(gplotlabel+strlen(gplotlabel)," V%d=%f ",Tvqresult[nres][k4],Tqresult[nres][k4]);
+ }
+ strcpy(gplotlabel+strlen(gplotlabel),")");
+ 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,"E_"),k1,nres);
+ for(vpopbased=0; vpopbased <= popbased; vpopbased++){ /* Done for vpopbased=0 and vpopbased=1 if popbased==1*/
+ fprintf(ficgp,"\nset label \"popbased %d %s\" at graph 0.98,0.5 center rotate font \"Helvetica,12\"\n",vpopbased,gplotlabel);
+ if(vpopbased==0){
+ fprintf(ficgp,"set ylabel \"Years\" \nset ter svg size 640, 480\nplot [%.f:%.f] ",ageminpar,fage);
+ }else
+ fprintf(ficgp,"\nreplot ");
+ for (i=1; i<= nlstate+1 ; i ++) {
+ k=2*i;
+ fprintf(ficgp,"\"%s\" every :::%d::%d u 1:($2==%d && $4!=0 ?$4 : 1/0) \"%%lf %%lf %%lf",subdirf2(fileresu,"T_"),nres-1,nres-1, vpopbased);
+ for (j=1; j<= nlstate+1 ; j ++) {
+ if (j==i) fprintf(ficgp," %%lf (%%lf)");
+ else fprintf(ficgp," %%*lf (%%*lf)");
+ }
+ if (i== 1) fprintf(ficgp,"\" t\"TLE\" w l lt %d, \\\n",i);
+ else fprintf(ficgp,"\" t\"LE in state (%d)\" w l lt %d, \\\n",i-1,i+1);
+ fprintf(ficgp,"\"%s\" every :::%d::%d u 1:($2==%d && $4!=0 ? $4-$5*2 : 1/0) \"%%lf %%lf %%lf",subdirf2(fileresu,"T_"),nres-1,nres-1,vpopbased);
+ for (j=1; j<= nlstate+1 ; j ++) {
+ if (j==i) fprintf(ficgp," %%lf (%%lf)");
+ else fprintf(ficgp," %%*lf (%%*lf)");
+ }
+ fprintf(ficgp,"\" t\"\" w l lt 0,");
+ fprintf(ficgp,"\"%s\" every :::%d::%d u 1:($2==%d && $4!=0 ? $4+$5*2 : 1/0) \"%%lf %%lf %%lf",subdirf2(fileresu,"T_"),nres-1,nres-1,vpopbased);
+ for (j=1; j<= nlstate+1 ; j ++) {
+ if (j==i) fprintf(ficgp," %%lf (%%lf)");
+ else fprintf(ficgp," %%*lf (%%*lf)");
+ }
+ if (i== (nlstate+1)) fprintf(ficgp,"\" t\"\" w l lt 0");
+ else fprintf(ficgp,"\" t\"\" w l lt 0,\\\n");
+ } /* state */
+ } /* vpopbased */
+ fprintf(ficgp,"\nset out;set out \"%s_%d-%d.svg\"; replot; set out; unset label;\n",subdirf2(optionfilefiname,"E_"),k1,nres); /* Buggy gnuplot */
+ } /* end nres */
+ } /* k1 end 2 eme*/
+
+
+ /*3eme*/
+ for (k1=1; k1<= m ; k1 ++){
+ for(nres=1; nres <= nresult; nres++){ /* For each resultline */
+ if(m != 1 && TKresult[nres]!= k1)
+ continue;
+
+ for (cpt=1; cpt<= nlstate ; cpt ++) {
+ fprintf(ficgp,"\n\n# 3d: Life expectancy with EXP_ files: combination=%d state=%d",k1, cpt);
+ strcpy(gplotlabel,"(");
+ 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[k]][lv];
+ fprintf(ficgp," V%d=%d ",Tvaraff[k],vlv);
+ sprintf(gplotlabel+strlen(gplotlabel)," 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]);
+ sprintf(gplotlabel+strlen(gplotlabel)," V%d=%f ",Tvqresult[nres][k4],Tqresult[nres][k4]);
+ }
+ strcpy(gplotlabel+strlen(gplotlabel),")");
+ fprintf(ficgp,"\n#\n");
+ if(invalidvarcomb[k1]){
+ fprintf(ficgp,"#Combination (%d) ignored because no cases \n",k1);
+ continue;
+ }
+
+ /* k=2+nlstate*(2*cpt-2); */
+ k=2+(nlstate+1)*(cpt-1);
+ fprintf(ficgp,"\nset out \"%s_%d-%d-%d.svg\" \n",subdirf2(optionfilefiname,"EXP_"),cpt,k1,nres);
+ fprintf(ficgp,"set label \"%s\" at graph 0.98,0.5 center rotate font \"Helvetica,12\"\n",gplotlabel);
+ fprintf(ficgp,"set ter svg size 640, 480\n\
+plot [%.f:%.f] \"%s\" every :::%d::%d u 1:%d t \"e%d1\" w l",ageminpar,fage,subdirf2(fileresu,"E_"),nres-1,nres-1,k,cpt);
+ /*fprintf(ficgp,",\"e%s\" every :::%d::%d u 1:($%d-2*$%d) \"\%%lf ",fileres,k1-1,k1-1,k,k+1);
+ for (i=1; i<= nlstate*2 ; i ++) fprintf(ficgp,"\%%lf (\%%lf) ");
+ fprintf(ficgp,"\" t \"e%d1\" w l",cpt);
+ fprintf(ficgp,",\"e%s\" every :::%d::%d u 1:($%d+2*$%d) \"\%%lf ",fileres,k1-1,k1-1,k,k+1);
+ for (i=1; i<= nlstate*2 ; i ++) fprintf(ficgp,"\%%lf (\%%lf) ");
+ fprintf(ficgp,"\" t \"e%d1\" w l",cpt);
+
+ */
+ for (i=1; i< nlstate ; i ++) {
+ fprintf(ficgp," ,\"%s\" every :::%d::%d u 1:%d t \"e%d%d\" w l",subdirf2(fileresu,"E_"),nres-1,nres-1,k+i,cpt,i+1);
+ /* fprintf(ficgp," ,\"%s\" every :::%d::%d u 1:%d t \"e%d%d\" w l",subdirf2(fileres,"e"),k1-1,k1-1,k+2*i,cpt,i+1);*/
+
+ }
+ fprintf(ficgp," ,\"%s\" every :::%d::%d u 1:%d t \"e%d.\" w l",subdirf2(fileresu,"E_"),nres-1,nres-1,k+nlstate,cpt);
+ }
+ fprintf(ficgp,"\nunset label;\n");
+ } /* end nres */
+ } /* end kl 3eme */
+
+ /* 4eme */
+ /* Survival functions (period) from state i in state j by initial state i */
+ for (k1=1; k1<=m; k1++){ /* For each covariate and each value */
+ for(nres=1; nres <= nresult; nres++){ /* For each resultline */
+ if(m != 1 && TKresult[nres]!= k1)
+ continue;
+ for (cpt=1; cpt<=nlstate ; cpt ++) { /* For each life state cpt*/
+ strcpy(gplotlabel,"(");
+ 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[k]][lv];
+ fprintf(ficgp," V%d=%d ",Tvaraff[k],vlv);
+ sprintf(gplotlabel+strlen(gplotlabel)," 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]);
+ sprintf(gplotlabel+strlen(gplotlabel)," V%d=%f ",Tvqresult[nres][k4],Tqresult[nres][k4]);
+ }
+ strcpy(gplotlabel+strlen(gplotlabel),")");
+ 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-%d.svg\" \n",subdirf2(optionfilefiname,"LIJ_"),cpt,k1,nres);
+ fprintf(ficgp,"set label \"Alive state %d %s\" at graph 0.98,0.5 center rotate font \"Helvetica,12\"\n",cpt,gplotlabel);
+ fprintf(ficgp,"set xlabel \"Age\" \nset ylabel \"Probability to be alive\" \n\
+set ter svg size 640, 480\nunset log y\nplot [%.f:%.f] ", ageminpar, agemaxpar);
+ k=3;
+ 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);
+ for (j=2; j<= nlstate+ndeath ; j ++)
+ fprintf(ficgp,"+$%d",k+l+j-1);
+ fprintf(ficgp,")) t \"l(%d,%d)\" w l",i,cpt);
+ } /* nlstate */
+ fprintf(ficgp,"\nset out; unset label;\n");
+ } /* end cpt state*/
+ } /* end nres */
+ } /* end covariate k1 */
+
+/* 5eme */
+ /* Survival functions (period) from state i in state j by final state j */
+ for (k1=1; k1<= m ; k1++){ /* For each covariate combination if any */
+ for(nres=1; nres <= nresult; nres++){ /* For each resultline */
+ if(m != 1 && TKresult[nres]!= k1)
+ continue;
+ for (cpt=1; cpt<=nlstate ; cpt ++) { /* For each inital state */
+ strcpy(gplotlabel,"(");
+ 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[k]][lv];
+ fprintf(ficgp," V%d=%d ",Tvaraff[k],vlv);
+ sprintf(gplotlabel+strlen(gplotlabel)," 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]);
+ sprintf(gplotlabel+strlen(gplotlabel)," V%d=%f ",Tvqresult[nres][k4],Tqresult[nres][k4]);
+ }
+ strcpy(gplotlabel+strlen(gplotlabel),")");
+ 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-%d.svg\" \n",subdirf2(optionfilefiname,"LIJT_"),cpt,k1,nres);
+ fprintf(ficgp,"set label \"Alive state %d %s\" at graph 0.98,0.5 center rotate font \"Helvetica,12\"\n",cpt,gplotlabel);
+ fprintf(ficgp,"set xlabel \"Age\" \nset ylabel \"Probability to be alive\" \n\
+set ter svg size 640, 480\nunset log y\nplot [%.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_"));
+ else
+ fprintf(ficgp,", '' ");
+ l=(nlstate+ndeath)*(cpt-1) +j;
+ fprintf(ficgp," u (($1==%d && (floor($2)%%5 == 0)) ? ($3):1/0):($%d",k1,k+l);
+ /* for (i=2; i<= nlstate+ndeath ; i ++) */
+ /* fprintf(ficgp,"+$%d",k+l+i-1); */
+ fprintf(ficgp,") t \"l(%d,%d)\" w l",cpt,j);
+ } /* nlstate */
+ fprintf(ficgp,", '' ");
+ fprintf(ficgp," u (($1==%d && (floor($2)%%5 == 0)) ? ($3):1/0):(",k1);
+ for (j=1; j<= nlstate ; j ++){ /* Lived in state j */
+ l=(nlstate+ndeath)*(cpt-1) +j;
+ if(j < nlstate)
+ fprintf(ficgp,"$%d +",k+l);
+ else
+ fprintf(ficgp,"$%d) t\"l(%d,.)\" w l",k+l,cpt);
}
+ fprintf(ficgp,"\nset out; unset label;\n");
+ } /* end cpt state*/
+ } /* end covariate */
+ } /* end nres */
+
+/* 6eme */
+ /* CV preval stable (period) for each covariate */
+ for (k1=1; k1<= m ; k1 ++) /* For each covariate combination if any */
+ for(nres=1; nres <= nresult; nres++){ /* For each resultline */
+ if(m != 1 && TKresult[nres]!= k1)
+ continue;
+ for (cpt=1; cpt<=nlstate ; cpt ++) { /* For each life state of arrival */
+ strcpy(gplotlabel,"(");
+ fprintf(ficgp,"\n#\n#\n#CV preval stable (forward): '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[k]][lv];
+ fprintf(ficgp," V%d=%d ",Tvaraff[k],vlv);
+ sprintf(gplotlabel+strlen(gplotlabel)," 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]);
+ sprintf(gplotlabel+strlen(gplotlabel)," V%d=%f ",Tvqresult[nres][k4],Tqresult[nres][k4]);
+ }
+ strcpy(gplotlabel+strlen(gplotlabel),")");
+ fprintf(ficgp,"\n#\n");
+ if(invalidvarcomb[k1]){
+ fprintf(ficgp,"#Combination (%d) ignored because no cases \n",k1);
+ continue;
}
-
- for(ij=1; ij<= nlstate*nlstate; ij++)
- for(h=0; h<=nhstepm-1; h++){
- gradg[h][theta][ij]= (gp[h][ij]-gm[h][ij])/2./delti[theta];
+
+ fprintf(ficgp,"\nset out \"%s_%d-%d-%d.svg\" \n",subdirf2(optionfilefiname,"P_"),cpt,k1,nres);
+ fprintf(ficgp,"set label \"Alive state %d %s\" at graph 0.98,0.5 center rotate font \"Helvetica,12\"\n",cpt,gplotlabel);
+ fprintf(ficgp,"set xlabel \"Age\" \nset ylabel \"Probability\" \n\
+set ter svg size 640, 480\nunset log y\nplot [%.f:%.f] ", ageminpar, agemaxpar);
+ k=3; /* Offset */
+ for (i=1; i<= nlstate ; i ++){ /* State of origin */
+ if(i==1)
+ fprintf(ficgp,"\"%s\"",subdirf2(fileresu,"PIJ_"));
+ else
+ fprintf(ficgp,", '' ");
+ l=(nlstate+ndeath)*(i-1)+1; /* 1, 1+ nlstate+ndeath, 1+2*(nlstate+ndeath) */
+ 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; unset label;\n");
+ } /* end cpt state*/
+ } /* end covariate */
+
+
+/* 7eme */
+ if(prevbcast == 1){
+ /* CV backward prevalence for each covariate */
+ for (k1=1; k1<= m ; k1 ++) /* For each covariate combination if any */
+ for(nres=1; nres <= nresult; nres++){ /* For each resultline */
+ if(m != 1 && TKresult[nres]!= k1)
+ continue;
+ for (cpt=1; cpt<=nlstate ; cpt ++) { /* For each life origin state */
+ strcpy(gplotlabel,"(");
+ fprintf(ficgp,"\n#\n#\n#CV Backward stable prevalence: 'pijb' 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[k]][lv];
+ fprintf(ficgp," V%d=%d ",Tvaraff[k],vlv);
+ sprintf(gplotlabel+strlen(gplotlabel)," 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]);
+ sprintf(gplotlabel+strlen(gplotlabel)," V%d=%f ",Tvqresult[nres][k4],Tqresult[nres][k4]);
+ }
+ strcpy(gplotlabel+strlen(gplotlabel),")");
+ fprintf(ficgp,"\n#\n");
+ if(invalidvarcomb[k1]){
+ fprintf(ficgp,"#Combination (%d) ignored because no cases \n",k1);
+ continue;
}
- }/* End theta */
-
-
- for(h=0; h<=nhstepm-1; h++)
- for(j=1; j<=nlstate*nlstate;j++)
- for(theta=1; theta <=npar; theta++)
- trgradg[h][j][theta]=gradg[h][theta][j];
-
-
- for(ij=1;ij<=nlstate*nlstate;ij++)
- for(ji=1;ji<=nlstate*nlstate;ji++)
- varhe[ij][ji][(int)age] =0.;
-
- printf("%d|",(int)age);fflush(stdout);
- fprintf(ficlog,"%d|",(int)age);fflush(ficlog);
- for(h=0;h<=nhstepm-1;h++){
- for(k=0;k<=nhstepm-1;k++){
- matprod2(dnewm,trgradg[h],1,nlstate*nlstate,1,npar,1,npar,matcov);
- matprod2(doldm,dnewm,1,nlstate*nlstate,1,npar,1,nlstate*nlstate,gradg[k]);
- for(ij=1;ij<=nlstate*nlstate;ij++)
- for(ji=1;ji<=nlstate*nlstate;ji++)
- varhe[ij][ji][(int)age] += doldm[ij][ji]*hf*hf;
+
+ fprintf(ficgp,"\nset out \"%s_%d-%d-%d.svg\" \n",subdirf2(optionfilefiname,"PB_"),cpt,k1,nres);
+ fprintf(ficgp,"set label \"Origin alive state %d %s\" at graph 0.98,0.5 center rotate font \"Helvetica,12\"\n",cpt,gplotlabel);
+ fprintf(ficgp,"set xlabel \"Age\" \nset ylabel \"Probability\" \n\
+set ter svg size 640, 480\nunset log y\nplot [%.f:%.f] ", ageminpar, agemaxpar);
+ k=3; /* Offset */
+ for (i=1; i<= nlstate ; i ++){ /* State of arrival */
+ if(i==1)
+ fprintf(ficgp,"\"%s\"",subdirf2(fileresu,"PIJB_"));
+ else
+ fprintf(ficgp,", '' ");
+ /* l=(nlstate+ndeath)*(i-1)+1; */
+ l=(nlstate+ndeath)*(cpt-1)+1; /* fixed for i; cpt=1 1, cpt=2 1+ nlstate+ndeath, 1+2*(nlstate+ndeath) */
+ /* fprintf(ficgp," u ($1==%d ? ($3):1/0):($%d/($%d",k1,k+l+(cpt-1),k+l); /\* a veÌrifier *\/ */
+ /* fprintf(ficgp," u ($1==%d ? ($3):1/0):($%d/($%d",k1,k+l+(cpt-1),k+l+(cpt-1)+i-1); /\* a veÌrifier *\/ */
+ fprintf(ficgp," u ($1==%d ? ($3):1/0):($%d",k1,k+l+i-1); /* To be verified */
+ /* for (j=2; j<= nlstate ; j ++) */
+ /* fprintf(ficgp,"+$%d",k+l+j-1); */
+ /* /\* fprintf(ficgp,"+$%d",k+l+j-1); *\/ */
+ fprintf(ficgp,") t \"bprev(%d,%d)\" w l",cpt,i);
+ } /* nlstate */
+ fprintf(ficgp,"\nset out; unset label;\n");
+ } /* end cpt state*/
+ } /* end covariate */
+ } /* End if prevbcast */
+
+ /* 8eme */
+ if(prevfcast==1){
+ /* Projection from cross-sectional to forward stable (period) prevalence for each covariate */
+
+ for (k1=1; k1<= m ; k1 ++) /* For each covariate combination if any */
+ for(nres=1; nres <= nresult; nres++){ /* For each resultline */
+ if(m != 1 && TKresult[nres]!= k1)
+ continue;
+ for (cpt=1; cpt<=nlstate ; cpt ++) { /* For each life state */
+ strcpy(gplotlabel,"(");
+ fprintf(ficgp,"\n#\n#\n#Projection of prevalence to forward stable prevalence (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[k]][lv];
+ fprintf(ficgp," V%d=%d ",Tvaraff[k],vlv);
+ sprintf(gplotlabel+strlen(gplotlabel)," 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]);
+ sprintf(gplotlabel+strlen(gplotlabel)," V%d=%f ",Tvqresult[nres][k4],Tqresult[nres][k4]);
+ }
+ strcpy(gplotlabel+strlen(gplotlabel),")");
+ fprintf(ficgp,"\n#\n");
+ if(invalidvarcomb[k1]){
+ fprintf(ficgp,"#Combination (%d) ignored because no cases \n",k1);
+ continue;
+ }
+
+ fprintf(ficgp,"# hpijx=probability over h years, hp.jx is weighted by observed prev\n ");
+ fprintf(ficgp,"\nset out \"%s_%d-%d-%d.svg\" \n",subdirf2(optionfilefiname,"PROJ_"),cpt,k1,nres);
+ fprintf(ficgp,"set label \"Alive state %d %s\" at graph 0.98,0.5 center rotate font \"Helvetica,12\"\n",cpt,gplotlabel);
+ fprintf(ficgp,"set xlabel \"Age\" \nset ylabel \"Prevalence\" \n\
+set ter svg size 640, 480\nunset log y\nplot [%.f:%.f] ", ageminpar, agemaxpar);
+
+ /* for (i=1; i<= nlstate+1 ; i ++){ /\* nlstate +1 p11 p21 p.1 *\/ */
+ istart=nlstate+1; /* Could be one if by state, but nlstate+1 is w.i projection only */
+ /*istart=1;*/ /* Could be one if by state, but nlstate+1 is w.i projection only */
+ for (i=istart; 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==istart){
+ fprintf(ficgp,"\"%s\"",subdirf2(fileresu,"F_"));
+ }else{
+ fprintf(ficgp,",\\\n '' ");
+ }
+ if(cptcoveff ==0){ /* No covariate */
+ ioffset=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 */
+ /*# V1 = 1 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 */
+ fprintf(ficgp," u %d:(", ioffset);
+ if(i==nlstate+1){
+ fprintf(ficgp," $%d/(1.-$%d)):1 t 'pw.%d' with line lc variable ", \
+ ioffset+(cpt-1)*(nlstate+1)+1+(i-1), ioffset+1+(i-1)+(nlstate+1)*nlstate,cpt );
+ fprintf(ficgp,",\\\n '' ");
+ fprintf(ficgp," u %d:(",ioffset);
+ fprintf(ficgp," (($1-$2) == %d ) ? $%d/(1.-$%d) : 1/0):1 with labels center not ", \
+ offyear, \
+ ioffset+(cpt-1)*(nlstate+1)+1+(i-1), ioffset+1+(i-1)+(nlstate+1)*nlstate );
+ }else
+ fprintf(ficgp," $%d/(1.-$%d)) t 'p%d%d' with line ", \
+ ioffset+(cpt-1)*(nlstate+1)+1+(i-1), ioffset+1+(i-1)+(nlstate+1)*nlstate,i,cpt );
+ }else{ /* more than 2 covariates */
+ ioffset=2*cptcoveff+2; /* Age is in 4 or 6 or etc.*/
+ /*# 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 */
+ iyearc=ioffset-1;
+ iagec=ioffset;
+ fprintf(ficgp," u %d:(",ioffset);
+ kl=0;
+ strcpy(gplotcondition,"(");
+ for (k=1; k<=cptcoveff; k++){ /* For each covariate writing the chain of conditions */
+ lv= decodtabm(k1,k,cptcoveff); /* Should be the covariate value corresponding to combination k1 and covariate k */
+ /* 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[k]][lv]; /* Value of the modality of Tvaraff[k] */
+ kl++;
+ sprintf(gplotcondition+strlen(gplotcondition),"$%d==%d && $%d==%d " ,kl,Tvaraff[k], kl+1, nbcode[Tvaraff[k]][lv]);
+ kl++;
+ if(k 1)
+ sprintf(gplotcondition+strlen(gplotcondition)," && ");
+ }
+ strcpy(gplotcondition+strlen(gplotcondition),")");
+ /* 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(i==nlstate+1){
+ fprintf(ficgp,"%s ? $%d/(1.-$%d) : 1/0):%d t 'p.%d' with line lc variable", gplotcondition, \
+ ioffset+(cpt-1)*(nlstate+1)+1+(i-1), ioffset+1+(i-1)+(nlstate+1)*nlstate,iyearc, cpt );
+ fprintf(ficgp,",\\\n '' ");
+ fprintf(ficgp," u %d:(",iagec);
+ fprintf(ficgp,"%s && (($%d-$%d) == %d ) ? $%d/(1.-$%d) : 1/0):%d with labels center not ", gplotcondition, \
+ iyearc, iagec, offyear, \
+ ioffset+(cpt-1)*(nlstate+1)+1+(i-1), ioffset+1+(i-1)+(nlstate+1)*nlstate, iyearc );
+/* '' u 6:(($1==1 && $2==0 && $3==2 && $4==0) && (($5-$6) == 1947) ? $10/(1.-$22) : 1/0):5 with labels center boxed not*/
+ }else{
+ fprintf(ficgp,"%s ? $%d/(1.-$%d) : 1/0) t 'p%d%d' with line ", gplotcondition, \
+ ioffset+(cpt-1)*(nlstate+1)+1+(i-1), ioffset +1+(i-1)+(nlstate+1)*nlstate,i,cpt );
+ }
+ } /* end if covariate */
+ } /* nlstate */
+ fprintf(ficgp,"\nset out; unset label;\n");
+ } /* end cpt state*/
+ } /* end covariate */
+ } /* End if prevfcast */
+
+ if(prevbcast==1){
+ /* Back projection from cross-sectional to stable (mixed) for each covariate */
+
+ for (k1=1; k1<= m ; k1 ++) /* For each covariate combination if any */
+ for(nres=1; nres <= nresult; nres++){ /* For each resultline */
+ if(m != 1 && TKresult[nres]!= k1)
+ continue;
+ for (cpt=1; cpt<=nlstate ; cpt ++) { /* For each life state */
+ strcpy(gplotlabel,"(");
+ fprintf(ficgp,"\n#\n#\n#Back projection of prevalence to stable (mixed) back prevalence: 'BPROJ_' files, covariatecombination#=%d originstate=%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[k]][lv];
+ fprintf(ficgp," V%d=%d ",Tvaraff[k],vlv);
+ sprintf(gplotlabel+strlen(gplotlabel)," 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]);
+ sprintf(gplotlabel+strlen(gplotlabel)," V%d=%f ",Tvqresult[nres][k4],Tqresult[nres][k4]);
+ }
+ strcpy(gplotlabel+strlen(gplotlabel),")");
+ fprintf(ficgp,"\n#\n");
+ if(invalidvarcomb[k1]){
+ fprintf(ficgp,"#Combination (%d) ignored because no cases \n",k1);
+ continue;
+ }
+
+ fprintf(ficgp,"# hbijx=backprobability over h years, hb.jx is weighted by observed prev at destination state\n ");
+ fprintf(ficgp,"\nset out \"%s_%d-%d-%d.svg\" \n",subdirf2(optionfilefiname,"PROJB_"),cpt,k1,nres);
+ fprintf(ficgp,"set label \"Origin alive state %d %s\" at graph 0.98,0.5 center rotate font \"Helvetica,12\"\n",cpt,gplotlabel);
+ fprintf(ficgp,"set xlabel \"Age\" \nset ylabel \"Prevalence\" \n\
+set ter svg size 640, 480\nunset log y\nplot [%.f:%.f] ", ageminpar, agemaxpar);
+
+ /* for (i=1; i<= nlstate+1 ; i ++){ /\* nlstate +1 p11 p21 p.1 *\/ */
+ istart=nlstate+1; /* Could be one if by state, but nlstate+1 is w.i projection only */
+ /*istart=1;*/ /* Could be one if by state, but nlstate+1 is w.i projection only */
+ for (i=istart; 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==istart){
+ fprintf(ficgp,"\"%s\"",subdirf2(fileresu,"FB_"));
+ }else{
+ fprintf(ficgp,",\\\n '' ");
+ }
+ if(cptcoveff ==0){ /* No covariate */
+ ioffset=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 */
+ /*# V1 = 1 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 */
+ fprintf(ficgp," u %d:(", ioffset);
+ if(i==nlstate+1){
+ fprintf(ficgp," $%d/(1.-$%d)):1 t 'bw%d' with line lc variable ", \
+ ioffset+(cpt-1)*(nlstate+1)+1+(i-1), ioffset+1+(i-1)+(nlstate+1)*nlstate,cpt );
+ fprintf(ficgp,",\\\n '' ");
+ fprintf(ficgp," u %d:(",ioffset);
+ fprintf(ficgp," (($1-$2) == %d ) ? $%d : 1/0):1 with labels center not ", \
+ offbyear, \
+ ioffset+(cpt-1)*(nlstate+1)+1+(i-1) );
+ }else
+ fprintf(ficgp," $%d/(1.-$%d)) t 'b%d%d' with line ", \
+ ioffset+(cpt-1)*(nlstate+1)+1+(i-1), ioffset+1+(i-1)+(nlstate+1)*nlstate,cpt,i );
+ }else{ /* more than 2 covariates */
+ ioffset=2*cptcoveff+2; /* Age is in 4 or 6 or etc.*/
+ /*# 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 */
+ iyearc=ioffset-1;
+ iagec=ioffset;
+ fprintf(ficgp," u %d:(",ioffset);
+ kl=0;
+ strcpy(gplotcondition,"(");
+ for (k=1; k<=cptcoveff; k++){ /* For each covariate writing the chain of conditions */
+ lv= decodtabm(k1,k,cptcoveff); /* Should be the covariate value corresponding to combination k1 and covariate k */
+ /* 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[k]][lv]; /* Value of the modality of Tvaraff[k] */
+ kl++;
+ sprintf(gplotcondition+strlen(gplotcondition),"$%d==%d && $%d==%d " ,kl,Tvaraff[k], kl+1, nbcode[Tvaraff[k]][lv]);
+ kl++;
+ if(k 1)
+ sprintf(gplotcondition+strlen(gplotcondition)," && ");
+ }
+ strcpy(gplotcondition+strlen(gplotcondition),")");
+ /* 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(i==nlstate+1){
+ fprintf(ficgp,"%s ? $%d : 1/0):%d t 'bw%d' with line lc variable", gplotcondition, \
+ ioffset+(cpt-1)*(nlstate+1)+1+(i-1),iyearc,cpt );
+ fprintf(ficgp,",\\\n '' ");
+ fprintf(ficgp," u %d:(",iagec);
+ /* fprintf(ficgp,"%s && (($5-$6) == %d ) ? $%d/(1.-$%d) : 1/0):5 with labels center not ", gplotcondition, \ */
+ fprintf(ficgp,"%s && (($%d-$%d) == %d ) ? $%d : 1/0):%d with labels center not ", gplotcondition, \
+ iyearc,iagec,offbyear, \
+ ioffset+(cpt-1)*(nlstate+1)+1+(i-1), iyearc );
+/* '' u 6:(($1==1 && $2==0 && $3==2 && $4==0) && (($5-$6) == 1947) ? $10/(1.-$22) : 1/0):5 with labels center boxed not*/
+ }else{
+ /* fprintf(ficgp,"%s ? $%d/(1.-$%d) : 1/0) t 'p%d%d' with line ", gplotcondition, \ */
+ fprintf(ficgp,"%s ? $%d : 1/0) t 'b%d%d' with line ", gplotcondition, \
+ ioffset+(cpt-1)*(nlstate+1)+1+(i-1), cpt,i );
+ }
+ } /* end if covariate */
+ } /* nlstate */
+ fprintf(ficgp,"\nset out; unset label;\n");
+ } /* end cpt state*/
+ } /* end covariate */
+ } /* End if prevbcast */
+
+
+ /* 9eme writing MLE parameters */
+ fprintf(ficgp,"\n##############\n#9eme MLE estimated parameters\n#############\n");
+ for(i=1,jk=1; i <=nlstate; i++){
+ fprintf(ficgp,"# initial state %d\n",i);
+ for(k=1; k <=(nlstate+ndeath); k++){
+ if (k != i) {
+ fprintf(ficgp,"# current state %d\n",k);
+ for(j=1; j <=ncovmodel; j++){
+ fprintf(ficgp,"p%d=%f; ",jk,p[jk]);
+ jk++;
+ }
+ fprintf(ficgp,"\n");
}
}
-
- /* Computing expectancies */
- hpxij(p3matm,nhstepm,age,hstepm,x,nlstate,stepm,oldm, savm, cij);
- 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++){
- eij[i][j][(int)age] += (p3matm[i][j][h]+p3matm[i][j][h+1])/2.0*hf;
+ }
+ fprintf(ficgp,"##############\n#\n");
+
+ /*goto avoid;*/
+ /* 10eme Graphics of probabilities or incidences using written MLE parameters */
+ fprintf(ficgp,"\n##############\n#10eme Graphics of probabilities or incidences\n#############\n");
+ fprintf(ficgp,"# logi(p12/p11)=a12+b12*age+c12age*age+d12*V1+e12*V1*age\n");
+ fprintf(ficgp,"# logi(p12/p11)=p1 +p2*age +p3*age*age+ p4*V1+ p5*V1*age\n");
+ fprintf(ficgp,"# logi(p13/p11)=a13+b13*age+c13age*age+d13*V1+e13*V1*age\n");
+ fprintf(ficgp,"# logi(p13/p11)=p6 +p7*age +p8*age*age+ p9*V1+ p10*V1*age\n");
+ fprintf(ficgp,"# p12+p13+p14+p11=1=p11(1+exp(a12+b12*age+c12age*age+d12*V1+e12*V1*age)\n");
+ fprintf(ficgp,"# +exp(a13+b13*age+c13age*age+d13*V1+e13*V1*age)+...)\n");
+ fprintf(ficgp,"# p11=1/(1+exp(a12+b12*age+c12age*age+d12*V1+e12*V1*age)\n");
+ fprintf(ficgp,"# +exp(a13+b13*age+c13age*age+d13*V1+e13*V1*age)+...)\n");
+ fprintf(ficgp,"# p12=exp(a12+b12*age+c12age*age+d12*V1+e12*V1*age)/\n");
+ fprintf(ficgp,"# (1+exp(a12+b12*age+c12age*age+d12*V1+e12*V1*age)\n");
+ fprintf(ficgp,"# +exp(a13+b13*age+c13age*age+d13*V1+e13*V1*age))\n");
+ 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,"# Type of graphic ng=%d\n",ng);
+ fprintf(ficgp,"# k1=1 to 2^%d=%d\n",cptcoveff,m);/* to be checked */
+ for(k1=1; k1 <=m; k1++) /* For each combination of covariate */
+ for(nres=1; nres <= nresult; nres++){ /* For each resultline */
+ if(m != 1 && TKresult[nres]!= k1)
+ continue;
+ fprintf(ficgp,"\n\n# Combination of dummy k1=%d which is ",k1);
+ strcpy(gplotlabel,"(");
+ /*sprintf(gplotlabel+strlen(gplotlabel)," Dummy combination %d ",k1);*/
+ 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[k]][lv];
+ fprintf(ficgp," V%d=%d ",Tvaraff[k],vlv);
+ sprintf(gplotlabel+strlen(gplotlabel)," 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]);
+ sprintf(gplotlabel+strlen(gplotlabel)," V%d=%f ",Tvqresult[nres][k4],Tqresult[nres][k4]);
+ }
+ strcpy(gplotlabel+strlen(gplotlabel),")");
+ fprintf(ficgp,"\n#\n");
+ fprintf(ficgp,"\nset out \"%s_%d-%d-%d.svg\" ",subdirf2(optionfilefiname,"PE_"),k1,ng,nres);
+ fprintf(ficgp,"\nset key outside ");
+ /* fprintf(ficgp,"\nset label \"%s\" at graph 1.2,0.5 center rotate font \"Helvetica,12\"\n",gplotlabel); */
+ fprintf(ficgp,"\nset title \"%s\" font \"Helvetica,12\"\n",gplotlabel);
+ fprintf(ficgp,"\nset ter svg size 640, 480 ");
+ if (ng==1){
+ fprintf(ficgp,"\nset ylabel \"Value of the logit of the model\"\n"); /* exp(a12+b12*x) could be nice */
+ fprintf(ficgp,"\nunset log y");
+ }else if (ng==2){
+ fprintf(ficgp,"\nset ylabel \"Probability\"\n");
+ fprintf(ficgp,"\nset log y");
+ }else if (ng==3){
+ fprintf(ficgp,"\nset ylabel \"Quasi-incidence per year\"\n");
+ fprintf(ficgp,"\nset log y");
+ }else
+ fprintf(ficgp,"\nunset title ");
+ fprintf(ficgp,"\nplot [%.f:%.f] ",ageminpar,agemaxpar);
+ i=1;
+ for(k2=1; k2<=nlstate; k2++) {
+ k3=i;
+ for(k=1; k<=(nlstate+ndeath); k++) {
+ if (k != k2){
+ switch( ng) {
+ case 1:
+ if(nagesqr==0)
+ fprintf(ficgp," p%d+p%d*x",i,i+1);
+ else /* nagesqr =1 */
+ fprintf(ficgp," p%d+p%d*x+p%d*x*x",i,i+1,i+1+nagesqr);
+ break;
+ case 2: /* ng=2 */
+ if(nagesqr==0)
+ fprintf(ficgp," exp(p%d+p%d*x",i,i+1);
+ else /* nagesqr =1 */
+ fprintf(ficgp," exp(p%d+p%d*x+p%d*x*x",i,i+1,i+1+nagesqr);
+ break;
+ case 3:
+ if(nagesqr==0)
+ fprintf(ficgp," %f*exp(p%d+p%d*x",YEARM/stepm,i,i+1);
+ else /* nagesqr =1 */
+ fprintf(ficgp," %f*exp(p%d+p%d*x+p%d*x*x",YEARM/stepm,i,i+1,i+1+nagesqr);
+ break;
+ }
+ ij=1;/* To be checked else nbcode[0][0] wrong */
+ 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(cptcovage >0){ /* V5+V4+V3+V4*V3+V5*age+V2+V1*V2+V1*age+V1, 2 V5 and V1 */
+ if(j==Tage[ij]) { /* Product by age To be looked at!!*//* Bug valgrind */
+ if(ij <=cptcovage) { /* V5+V4+V3+V4*V3+V5*age+V2+V1*V2+V1*age+V1, 2 V5 and V1 */
+ if(DummyV[j]==0){/* Bug valgrind */
+ 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(k1,Tvar[j-2])]); */
+ }
+ ij++;
+ }
+ }
+ }else if(cptcovprod >0){
+ if(j==Tprod[ijp]) { /* */
+ /* printf("Tprod[%d]=%d, j=%d\n", ij, Tprod[ijp], j); */
+ if(ijp <=cptcovprod) { /* Product */
+ if(DummyV[Tvard[ijp][1]]==0){/* Vn is dummy */
+ if(DummyV[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(k1,j)],nbcode[Tvard[ijp][2]][codtabm(k1,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(k1,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(DummyV[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]]);
+ }
+ }
+ ijp++;
+ }
+ } /* end Tprod */
+ } else{ /* simple covariate */
+ /* fprintf(ficgp,"+p%d*%d",i+j+2+nagesqr-1,nbcode[Tvar[j]][codtabm(k1,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(k1,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 */
+ fprintf(ficgp," (1.");
+ }
- /* if((int)age==70)printf("i=%2d,j=%2d,h=%2d,age=%3d,%9.4f,%9.4f,%9.4f\n",i,j,h,(int)age,p3mat[i][j][h],hf,eij[i][j][(int)age]);*/
-
- }
+ if(ng != 1){
+ fprintf(ficgp,")/(1");
+
+ for(cpt=1; cpt <=nlstate; cpt++){
+ if(nagesqr==0)
+ fprintf(ficgp,"+exp(p%d+p%d*x",k3+(cpt-1)*ncovmodel,k3+(cpt-1)*ncovmodel+1);
+ else /* nagesqr =1 */
+ fprintf(ficgp,"+exp(p%d+p%d*x+p%d*x*x",k3+(cpt-1)*ncovmodel,k3+(cpt-1)*ncovmodel+1,k3+(cpt-1)*ncovmodel+1+nagesqr);
+
+ ij=1;
+ for(j=3; j <=ncovmodel-nagesqr; j++){
+ if(cptcovage >0){
+ if((j-2)==Tage[ij]) { /* Bug valgrind */
+ if(ij <=cptcovage) { /* Bug valgrind */
+ fprintf(ficgp,"+p%d*%d*x",k3+(cpt-1)*ncovmodel+1+j-2+nagesqr,nbcode[Tvar[j-2]][codtabm(k1,j-2)]);
+ /* fprintf(ficgp,"+p%d*%d*x",k3+(cpt-1)*ncovmodel+1+j-2+nagesqr,nbcode[Tvar[j-2]][codtabm(k1,Tvar[j-2])]); */
+ ij++;
+ }
+ }
+ }else
+ fprintf(ficgp,"+p%d*%d",k3+(cpt-1)*ncovmodel+1+j-2+nagesqr,nbcode[Tvar[j-2]][codtabm(k1,j-2)]);/* Valgrind bug nbcode */
+ }
+ fprintf(ficgp,")");
+ }
+ fprintf(ficgp,")");
+ if(ng ==2)
+ fprintf(ficgp," w l lw 2 lt (%d*%d+%d)%%%d+1 dt %d t \"p%d%d\" ", nlstate+ndeath, k2, k, nlstate+ndeath, k2, k2,k);
+ else /* ng= 3 */
+ fprintf(ficgp," w l lw 2 lt (%d*%d+%d)%%%d+1 dt %d t \"i%d%d\" ", nlstate+ndeath, k2, k, nlstate+ndeath, k2, k2,k);
+ }else{ /* end ng <> 1 */
+ if( k !=k2) /* logit p11 is hard to draw */
+ fprintf(ficgp," w l lw 2 lt (%d*%d+%d)%%%d+1 dt %d t \"logit(p%d%d)\" ", nlstate+ndeath, k2, k, nlstate+ndeath, k2, 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; unset label;set key default;\n"); */
+ fprintf(ficgp,"\n set out; unset title;set key default;\n");
+ } /* end k1 */
+ } /* end ng */
+ /* avoid: */
+ fflush(ficgp);
+} /* end gnuplot */
- fprintf(ficresstdeij,"%3.0f",age );
- for(i=1; i<=nlstate;i++){
- eip=0.;
- vip=0.;
- for(j=1; j<=nlstate;j++){
- eip += eij[i][j][(int)age];
- for(k=1; k<=nlstate;k++) /* Sum on j and k of cov(eij,eik) */
- vip += varhe[(j-1)*nlstate+i][(k-1)*nlstate+i][(int)age];
- fprintf(ficresstdeij," %9.4f (%.4f)", eij[i][j][(int)age], sqrt(varhe[(j-1)*nlstate+i][(j-1)*nlstate+i][(int)age]) );
- }
- fprintf(ficresstdeij," %9.4f (%.4f)", eip, sqrt(vip));
- }
- fprintf(ficresstdeij,"\n");
- fprintf(ficrescveij,"%3.0f",age );
- for(i=1; i<=nlstate;i++)
- for(j=1; j<=nlstate;j++){
- cptj= (j-1)*nlstate+i;
- for(i2=1; i2<=nlstate;i2++)
- for(j2=1; j2<=nlstate;j2++){
- cptj2= (j2-1)*nlstate+i2;
- if(cptj2 <= cptj)
- fprintf(ficrescveij," %.4f", varhe[cptj][cptj2][(int)age]);
- }
- }
- fprintf(ficrescveij,"\n");
+/*************** Moving average **************/
+/* int movingaverage(double ***probs, double bage, double fage, double ***mobaverage, int mobilav, double bageout, double fageout){ */
+ int movingaverage(double ***probs, double bage, double fage, double ***mobaverage, int mobilav){
- }
- free_matrix(gm,0,nhstepm,1,nlstate*nlstate);
- free_matrix(gp,0,nhstepm,1,nlstate*nlstate);
- free_ma3x(gradg,0,nhstepm,1,npar,1,nlstate*nlstate);
- free_ma3x(trgradg,0,nhstepm,1,nlstate*nlstate,1,npar);
- free_ma3x(p3matm,1,nlstate+ndeath,1, nlstate+ndeath, 0,nhstepm);
- free_ma3x(p3matp,1,nlstate+ndeath,1, nlstate+ndeath, 0,nhstepm);
- printf("\n");
- fprintf(ficlog,"\n");
+ int i, cpt, cptcod;
+ int modcovmax =1;
+ int mobilavrange, mob;
+ int iage=0;
+ int firstA1=0, firstA2=0;
+
+ double sum=0., sumr=0.;
+ double age;
+ double *sumnewp, *sumnewm, *sumnewmr;
+ double *agemingood, *agemaxgood;
+ double *agemingoodr, *agemaxgoodr;
+
+
+ /* modcovmax=2*cptcoveff; Max number of modalities. We suppose */
+ /* a covariate has 2 modalities, should be equal to ncovcombmax */
+
+ sumnewp = vector(1,ncovcombmax);
+ sumnewm = vector(1,ncovcombmax);
+ sumnewmr = vector(1,ncovcombmax);
+ agemingood = vector(1,ncovcombmax);
+ agemingoodr = vector(1,ncovcombmax);
+ agemaxgood = vector(1,ncovcombmax);
+ agemaxgoodr = vector(1,ncovcombmax);
+
+ for (cptcod=1;cptcod<=ncovcombmax;cptcod++){
+ sumnewm[cptcod]=0.; sumnewmr[cptcod]=0.;
+ sumnewp[cptcod]=0.;
+ agemingood[cptcod]=0, agemingoodr[cptcod]=0;
+ agemaxgood[cptcod]=0, agemaxgoodr[cptcod]=0;
+ }
+ if (cptcovn<1) ncovcombmax=1; /* At least 1 pass */
+
+ if(mobilav==-1 || mobilav==1||mobilav ==3 ||mobilav==5 ||mobilav== 7){
+ if(mobilav==1 || mobilav==-1) mobilavrange=5; /* default */
+ else mobilavrange=mobilav;
+ for (age=bage; age<=fage; age++)
+ for (i=1; i<=nlstate;i++)
+ for (cptcod=1;cptcod<=ncovcombmax;cptcod++)
+ mobaverage[(int)age][i][cptcod]=probs[(int)age][i][cptcod];
+ /* We keep the original values on the extreme ages bage, fage and for
+ fage+1 and bage-1 we use a 3 terms moving average; for fage+2 bage+2
+ we use a 5 terms etc. until the borders are no more concerned.
+ */
+ for (mob=3;mob <=mobilavrange;mob=mob+2){
+ for (age=bage+(mob-1)/2; age<=fage-(mob-1)/2; age++){
+ for (cptcod=1;cptcod<=ncovcombmax;cptcod++){
+ sumnewm[cptcod]=0.;
+ for (i=1; i<=nlstate;i++){
+ mobaverage[(int)age][i][cptcod] =probs[(int)age][i][cptcod];
+ for (cpt=1;cpt<=(mob-1)/2;cpt++){
+ mobaverage[(int)age][i][cptcod] +=probs[(int)age-cpt][i][cptcod];
+ mobaverage[(int)age][i][cptcod] +=probs[(int)age+cpt][i][cptcod];
+ }
+ mobaverage[(int)age][i][cptcod]=mobaverage[(int)age][i][cptcod]/mob;
+ sumnewm[cptcod]+=mobaverage[(int)age][i][cptcod];
+ } /* end i */
+ if(sumnewm[cptcod] >1.e-3) mobaverage[(int)age][i][cptcod]=mobaverage[(int)age][i][cptcod]/sumnewm[cptcod]; /* Rescaling to sum one */
+ } /* end cptcod */
+ }/* end age */
+ }/* end mob */
+ }else{
+ printf("Error internal in movingaverage, mobilav=%d.\n",mobilav);
+ return -1;
+ }
- free_vector(xm,1,npar);
- free_vector(xp,1,npar);
- free_matrix(dnewm,1,nlstate*nlstate,1,npar);
- free_matrix(doldm,1,nlstate*nlstate,1,nlstate*nlstate);
- free_ma3x(varhe,1,nlstate*nlstate,1,nlstate*nlstate,(int) bage, (int)fage);
-}
+ for (cptcod=1;cptcod<=ncovcombmax;cptcod++){ /* for each combination */
+ /* for (age=bage+(mob-1)/2; age<=fage-(mob-1)/2; age++){ */
+ if(invalidvarcomb[cptcod]){
+ printf("\nCombination (%d) ignored because no cases \n",cptcod);
+ continue;
+ }
-/************ 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 ij, int estepm, int cptcov, int cptcod, int popbased, int mobilav, char strstart[])
-{
- /* Variance of health expectancies */
- /* double **prevalim(double **prlim, int nlstate, double *xp, double age, double **oldm, double ** savm,double ftolpl);*/
- /* double **newm;*/
- double **dnewm,**doldm;
- double **dnewmp,**doldmp;
- int i, j, nhstepm, hstepm, h, nstepm ;
- int k, cptcode;
- double *xp;
- double **gp, **gm; /* for var eij */
- double ***gradg, ***trgradg; /*for var eij */
- double **gradgp, **trgradgp; /* for var p point j */
- double *gpp, *gmp; /* for var p point j */
- double **varppt; /* for var p point j nlstate to nlstate+ndeath */
- double ***p3mat;
- double age,agelim, hf;
- double ***mobaverage;
- int theta;
- char digit[4];
- char digitp[25];
+ for (age=fage-(mob-1)/2; age>=bage+(mob-1)/2; age--){ /*looking for the youngest and oldest good age */
+ sumnewm[cptcod]=0.;
+ sumnewmr[cptcod]=0.;
+ for (i=1; i<=nlstate;i++){
+ sumnewm[cptcod]+=mobaverage[(int)age][i][cptcod];
+ sumnewmr[cptcod]+=probs[(int)age][i][cptcod];
+ }
+ if(fabs(sumnewmr[cptcod] - 1.) <= 1.e-3) { /* good without smoothing */
+ agemingoodr[cptcod]=age;
+ }
+ if(fabs(sumnewm[cptcod] - 1.) <= 1.e-3) { /* good */
+ agemingood[cptcod]=age;
+ }
+ } /* age */
+ for (age=bage+(mob-1)/2; age<=fage-(mob-1)/2; age++){ /*looking for the youngest and oldest good age */
+ sumnewm[cptcod]=0.;
+ sumnewmr[cptcod]=0.;
+ for (i=1; i<=nlstate;i++){
+ sumnewm[cptcod]+=mobaverage[(int)age][i][cptcod];
+ sumnewmr[cptcod]+=probs[(int)age][i][cptcod];
+ }
+ if(fabs(sumnewmr[cptcod] - 1.) <= 1.e-3) { /* good without smoothing */
+ agemaxgoodr[cptcod]=age;
+ }
+ if(fabs(sumnewm[cptcod] - 1.) <= 1.e-3) { /* good */
+ agemaxgood[cptcod]=age;
+ }
+ } /* age */
+ /* Thus we have agemingood and agemaxgood as well as goodr for raw (preobs) */
+ /* but they will change */
+ firstA1=0;firstA2=0;
+ for (age=fage-(mob-1)/2; age>=bage; age--){/* From oldest to youngest, filling up to the youngest */
+ sumnewm[cptcod]=0.;
+ sumnewmr[cptcod]=0.;
+ for (i=1; i<=nlstate;i++){
+ sumnewm[cptcod]+=mobaverage[(int)age][i][cptcod];
+ sumnewmr[cptcod]+=probs[(int)age][i][cptcod];
+ }
+ if(mobilav==-1){ /* Forcing raw ages if good else agemingood */
+ if(fabs(sumnewmr[cptcod] - 1.) <= 1.e-3) { /* good without smoothing */
+ agemaxgoodr[cptcod]=age; /* age min */
+ for (i=1; i<=nlstate;i++)
+ mobaverage[(int)age][i][cptcod]=probs[(int)age][i][cptcod];
+ }else{ /* bad we change the value with the values of good ages */
+ for (i=1; i<=nlstate;i++){
+ mobaverage[(int)age][i][cptcod]=mobaverage[(int)agemaxgoodr[cptcod]][i][cptcod];
+ } /* i */
+ } /* end bad */
+ }else{
+ if(fabs(sumnewm[cptcod] - 1.) <= 1.e-3) { /* good */
+ agemaxgood[cptcod]=age;
+ }else{ /* bad we change the value with the values of good ages */
+ for (i=1; i<=nlstate;i++){
+ mobaverage[(int)age][i][cptcod]=mobaverage[(int)agemaxgood[cptcod]][i][cptcod];
+ } /* i */
+ } /* end bad */
+ }/* end else */
+ sum=0.;sumr=0.;
+ for (i=1; i<=nlstate;i++){
+ sum+=mobaverage[(int)age][i][cptcod];
+ sumr+=probs[(int)age][i][cptcod];
+ }
+ if(fabs(sum - 1.) > 1.e-3) { /* bad */
+ if(!firstA1){
+ firstA1=1;
+ printf("Moving average A1: For this combination of covariate cptcod=%d, we can't get a smoothed prevalence which sums to one (%f) at any descending age! age=%d, could you increase bage=%d. Others in log file...\n",cptcod,sumr, (int)age, (int)bage);
+ }
+ fprintf(ficlog,"Moving average A1: For this combination of covariate cptcod=%d, we can't get a smoothed prevalence which sums to one (%f) at any descending age! age=%d, could you increase bage=%d\n",cptcod,sumr, (int)age, (int)bage);
+ } /* end bad */
+ /* else{ /\* We found some ages summing to one, we will smooth the oldest *\/ */
+ if(fabs(sumr - 1.) > 1.e-3) { /* bad */
+ if(!firstA2){
+ firstA2=1;
+ printf("Moving average A2: For this combination of covariate cptcod=%d, the raw prevalence doesn't sums to one (%f) even with smoothed values at young ages! age=%d, could you increase bage=%d. Others in log file...\n",cptcod,sumr, (int)age, (int)bage);
+ }
+ fprintf(ficlog,"Moving average A2: For this combination of covariate cptcod=%d, the raw prevalence doesn't sums to one (%f) even with smoothed values at young ages! age=%d, could you increase bage=%d\n",cptcod,sumr, (int)age, (int)bage);
+ } /* end bad */
+ }/* age */
+
+ for (age=bage+(mob-1)/2; age<=fage; age++){/* From youngest, finding the oldest wrong */
+ sumnewm[cptcod]=0.;
+ sumnewmr[cptcod]=0.;
+ for (i=1; i<=nlstate;i++){
+ sumnewm[cptcod]+=mobaverage[(int)age][i][cptcod];
+ sumnewmr[cptcod]+=probs[(int)age][i][cptcod];
+ }
+ if(mobilav==-1){ /* Forcing raw ages if good else agemingood */
+ if(fabs(sumnewmr[cptcod] - 1.) <= 1.e-3) { /* good */
+ agemingoodr[cptcod]=age;
+ for (i=1; i<=nlstate;i++)
+ mobaverage[(int)age][i][cptcod]=probs[(int)age][i][cptcod];
+ }else{ /* bad we change the value with the values of good ages */
+ for (i=1; i<=nlstate;i++){
+ mobaverage[(int)age][i][cptcod]=mobaverage[(int)agemingoodr[cptcod]][i][cptcod];
+ } /* i */
+ } /* end bad */
+ }else{
+ if(fabs(sumnewm[cptcod] - 1.) <= 1.e-3) { /* good */
+ agemingood[cptcod]=age;
+ }else{ /* bad */
+ for (i=1; i<=nlstate;i++){
+ mobaverage[(int)age][i][cptcod]=mobaverage[(int)agemingood[cptcod]][i][cptcod];
+ } /* i */
+ } /* end bad */
+ }/* end else */
+ sum=0.;sumr=0.;
+ for (i=1; i<=nlstate;i++){
+ sum+=mobaverage[(int)age][i][cptcod];
+ sumr+=mobaverage[(int)age][i][cptcod];
+ }
+ if(fabs(sum - 1.) > 1.e-3) { /* bad */
+ printf("Moving average B1: For this combination of covariate cptcod=%d, we can't get a smoothed prevalence which sums to one (%f) at any descending age! age=%d, could you decrease fage=%d?\n",cptcod, sum, (int) age, (int)fage);
+ } /* end bad */
+ /* else{ /\* We found some ages summing to one, we will smooth the oldest *\/ */
+ if(fabs(sumr - 1.) > 1.e-3) { /* bad */
+ printf("Moving average B2: For this combination of covariate cptcod=%d, the raw prevalence doesn't sums to one (%f) even with smoothed values at young ages! age=%d, could you increase fage=%d\n",cptcod,sumr, (int)age, (int)fage);
+ } /* end bad */
+ }/* age */
+
+
+ for (age=bage; age<=fage; age++){
+ /* printf("%d %d ", cptcod, (int)age); */
+ sumnewp[cptcod]=0.;
+ sumnewm[cptcod]=0.;
+ for (i=1; i<=nlstate;i++){
+ sumnewp[cptcod]+=probs[(int)age][i][cptcod];
+ sumnewm[cptcod]+=mobaverage[(int)age][i][cptcod];
+ /* printf("%.4f %.4f ",probs[(int)age][i][cptcod], mobaverage[(int)age][i][cptcod]); */
+ }
+ /* printf("%.4f %.4f \n",sumnewp[cptcod], sumnewm[cptcod]); */
+ }
+ /* printf("\n"); */
+ /* } */
- char fileresprobmorprev[FILENAMELENGTH];
+ /* brutal averaging */
+ /* for (i=1; i<=nlstate;i++){ */
+ /* for (age=1; age<=bage; age++){ */
+ /* mobaverage[(int)age][i][cptcod]=mobaverage[(int)agemingood[cptcod]][i][cptcod]; */
+ /* /\* printf("age=%d i=%d cptcod=%d mobaverage=%.4f \n",(int)age,i, cptcod, mobaverage[(int)age][i][cptcod]); *\/ */
+ /* } */
+ /* for (age=fage; age<=AGESUP; age++){ */
+ /* mobaverage[(int)age][i][cptcod]=mobaverage[(int)agemaxgood[cptcod]][i][cptcod]; */
+ /* /\* printf("age=%d i=%d cptcod=%d mobaverage=%.4f \n",(int)age,i, cptcod, mobaverage[(int)age][i][cptcod]); *\/ */
+ /* } */
+ /* } /\* end i status *\/ */
+ /* for (i=nlstate+1; i<=nlstate+ndeath;i++){ */
+ /* for (age=1; age<=AGESUP; age++){ */
+ /* /\*printf("i=%d, age=%d, cptcod=%d\n",i, (int)age, cptcod);*\/ */
+ /* mobaverage[(int)age][i][cptcod]=0.; */
+ /* } */
+ /* } */
+ }/* end cptcod */
+ free_vector(agemaxgoodr,1, ncovcombmax);
+ free_vector(agemaxgood,1, ncovcombmax);
+ free_vector(agemingood,1, ncovcombmax);
+ free_vector(agemingoodr,1, ncovcombmax);
+ free_vector(sumnewmr,1, ncovcombmax);
+ free_vector(sumnewm,1, ncovcombmax);
+ free_vector(sumnewp,1, ncovcombmax);
+ return 0;
+ }/* End movingaverage */
+
- if(popbased==1){
- if(mobilav!=0)
- strcpy(digitp,"-populbased-mobilav-");
- else strcpy(digitp,"-populbased-nomobil-");
- }
- else
- strcpy(digitp,"-stablbased-");
-
- if (mobilav!=0) {
- mobaverage= ma3x(1, AGESUP,1,NCOVMAX, 1,NCOVMAX);
- if (movingaverage(probs, bage, fage, mobaverage,mobilav)!=0){
- fprintf(ficlog," Error in movingaverage mobilav=%d\n",mobilav);
- printf(" Error in movingaverage mobilav=%d\n",mobilav);
- }
- }
+
+/************** Forecasting ******************/
+/* void prevforecast(char fileres[], double dateintmean, double anprojd, double mprojd, double jprojd, double ageminpar, double agemax, double dateprev1, double dateprev2, int mobilav, double ***prev, double bage, double fage, int firstpass, int lastpass, double anprojf, double p[], int cptcoveff)*/
+void prevforecast(char fileres[], double dateintmean, double dateprojd, double dateprojf, double ageminpar, double agemax, double dateprev1, double dateprev2, int mobilav, double ***prev, double bage, double fage, int firstpass, int lastpass, double p[], int cptcoveff){
+ /* dateintemean, mean date of interviews
+ dateprojd, year, month, day of starting projection
+ dateprojf date of end of projection;year of end of projection (same day and month as proj1).
+ agemin, agemax range of age
+ dateprev1 dateprev2 range of dates during which prevalence is computed
+ */
+ /* double anprojd, mprojd, jprojd; */
+ /* double anprojf, mprojf, jprojf; */
+ int yearp, stepsize, hstepm, nhstepm, j, k, cptcod, i, h, i1, k4, nres=0;
+ double agec; /* generic age */
+ double agelim, ppij, yp,yp1,yp2;
+ double *popeffectif,*popcount;
+ double ***p3mat;
+ /* double ***mobaverage; */
+ char fileresf[FILENAMELENGTH];
- strcpy(fileresprobmorprev,"prmorprev");
- sprintf(digit,"%-d",ij);
- /*printf("DIGIT=%s, ij=%d ijr=%-d|\n",digit, ij,ij);*/
- strcat(fileresprobmorprev,digit); /* Tvar to be done */
- strcat(fileresprobmorprev,digitp); /* Popbased or not, mobilav or not */
- strcat(fileresprobmorprev,fileres);
- if((ficresprobmorprev=fopen(fileresprobmorprev,"w"))==NULL) {
- printf("Problem with resultfile: %s\n", fileresprobmorprev);
- fprintf(ficlog,"Problem with resultfile: %s\n", fileresprobmorprev);
- }
- printf("Computing total mortality p.j=w1*p1j+w2*p2j+..: result on file '%s' \n",fileresprobmorprev);
+ 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); */
- fprintf(ficlog,"Computing total mortality p.j=w1*p1j+w2*p2j+..: result on file '%s' \n",fileresprobmorprev);
- pstamp(ficresprobmorprev);
- fprintf(ficresprobmorprev,"# probabilities of dying before estepm=%d months for people of exact age and weighted probabilities w1*p1j+w2*p2j+... stand dev in()\n",estepm);
- fprintf(ficresprobmorprev,"# Age cov=%-d",ij);
- for(j=nlstate+1; j<=(nlstate+ndeath);j++){
- fprintf(ficresprobmorprev," p.%-d SE",j);
- for(i=1; i<=nlstate;i++)
- fprintf(ficresprobmorprev," w%1d p%-d%-d",i,i,j);
- }
- fprintf(ficresprobmorprev,"\n");
- fprintf(ficgp,"\n# Routine varevsij");
- /* fprintf(fichtm, "#Local time at start: %s", strstart);*/
- fprintf(fichtm,"\n Computing probabilities of dying over estepm months as a weighted average (i.e global mortality independent of initial healh state)
\n");
- fprintf(fichtm,"\n
%s
\n",digitp);
-/* } */
- varppt = matrix(nlstate+1,nlstate+ndeath,nlstate+1,nlstate+ndeath);
- pstamp(ficresvij);
- fprintf(ficresvij,"# Variance and covariance of health expectancies e.j \n# (weighted average of eij where weights are ");
- if(popbased==1)
- fprintf(ficresvij,"the age specific prevalence observed in the population i.e cross-sectionally\n in each health state (popbased=1)");
- else
- fprintf(ficresvij,"the age specific period (stable) prevalences in each health state \n");
- fprintf(ficresvij,"# Age");
- for(i=1; i<=nlstate;i++)
- for(j=1; j<=nlstate;j++)
- fprintf(ficresvij," Cov(e.%1d, e.%1d)",i,j);
- fprintf(ficresvij,"\n");
+ strcpy(fileresf,"F_");
+ strcat(fileresf,fileresu);
+ if((ficresf=fopen(fileresf,"w"))==NULL) {
+ printf("Problem with forecast resultfile: %s\n", fileresf);
+ fprintf(ficlog,"Problem with forecast resultfile: %s\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);
- xp=vector(1,npar);
- dnewm=matrix(1,nlstate,1,npar);
- doldm=matrix(1,nlstate,1,nlstate);
- dnewmp= matrix(nlstate+1,nlstate+ndeath,1,npar);
- doldmp= matrix(nlstate+1,nlstate+ndeath,nlstate+1,nlstate+ndeath);
+ if (cptcoveff==0) ncodemax[cptcoveff]=1;
- gradgp=matrix(1,npar,nlstate+1,nlstate+ndeath);
- gpp=vector(nlstate+1,nlstate+ndeath);
- gmp=vector(nlstate+1,nlstate+ndeath);
- trgradgp =matrix(nlstate+1,nlstate+ndeath,1,npar); /* mu or p point j*/
-
+
+ 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;
- /* For example we decided to compute the life expectancy with the smallest unit */
- /* hstepm beeing the number of stepms, if hstepm=1 the length of hstepm is stepm.
- nhstepm is the number of hstepm from age to agelim
- nstepm is the number of stepm from age to agelin.
- Look at hpijx to understand the reason of that which relies in memory size
- and note for a fixed period like k years */
- /* We decided (b) to get a life expectancy respecting the most precise curvature of the
- survival function given by stepm (the optimization length). Unfortunately it
- means that if the survival funtion is printed every two years of age and if
- you sum them up and add 1 year (area under the trapezoids) you won't get the same
- results. So we changed our mind and took the option of the best precision.
- */
- hstepm=hstepm/stepm; /* Typically in stepm units, if stepm=6 & estepm=24 , = 24/6 months = 4 */
- agelim = AGESUP;
- for (age=bage; age<=fage; age ++){ /* If stepm=6 months */
- nstepm=(int) rint((agelim-age)*YEARM/stepm); /* Typically 20 years = 20*12/6=40 */
- nhstepm = nstepm/hstepm;/* Expressed in hstepm, typically nhstepm=40/4=10 */
- p3mat=ma3x(1,nlstate+ndeath,1, nlstate+ndeath, 0,nhstepm);
- gradg=ma3x(0,nhstepm,1,npar,1,nlstate);
- gp=matrix(0,nhstepm,1,nlstate);
- gm=matrix(0,nhstepm,1,nlstate);
+ else{
+ hstepm=estepm;
+ }
+ if(estepm > stepm){ /* Yes every two year */
+ stepsize=2;
+ }
+ hstepm=hstepm/stepm;
+
+ /* yp1=modf(dateintmean,&yp);/\* extracts integral of datemean in yp and */
+ /* fractional in yp1 *\/ */
+ /* aintmean=yp; */
+ /* yp2=modf((yp1*12),&yp); */
+ /* mintmean=yp; */
+ /* yp1=modf((yp2*30.5),&yp); */
+ /* jintmean=yp; */
+ /* if(jintmean==0) jintmean=1; */
+ /* if(mintmean==0) mintmean=1; */
- for(theta=1; theta <=npar; theta++){
- for(i=1; i<=npar; i++){ /* Computes gradient x + delta*/
- xp[i] = x[i] + (i==theta ?delti[theta]:0);
- }
- hpxij(p3mat,nhstepm,age,hstepm,xp,nlstate,stepm,oldm,savm, ij);
- prevalim(prlim,nlstate,xp,age,oldm,savm,ftolpl,ij);
- if (popbased==1) {
- if(mobilav ==0){
- for(i=1; i<=nlstate;i++)
- prlim[i][i]=probs[(int)age][i][ij];
- }else{ /* mobilav */
- for(i=1; i<=nlstate;i++)
- prlim[i][i]=mobaverage[(int)age][i][ij];
- }
- }
+ /* date2dmy(dateintmean,&jintmean,&mintmean,&aintmean); */
+ /* date2dmy(dateprojd,&jprojd, &mprojd, &anprojd); */
+ /* date2dmy(dateprojf,&jprojf, &mprojf, &anprojf); */
+ i1=pow(2,cptcoveff);
+ if (cptcovn < 1){i1=1;}
- for(j=1; j<= nlstate; j++){
- for(h=0; h<=nhstepm; h++){
- for(i=1, gp[h][j]=0.;i<=nlstate;i++)
- gp[h][j] += prlim[i][i]*p3mat[i][j][h];
+ fprintf(ficresf,"# Mean day of interviews %.lf/%.lf/%.lf (%.2f) between %.2f and %.2f \n",jintmean,mintmean,aintmean,dateintmean,dateprev1,dateprev2);
+
+ fprintf(ficresf,"#****** Routine prevforecast **\n");
+
+/* if (h==(int)(YEARM*yearp)){ */
+ for(nres=1; nres <= nresult; nres++) /* For each resultline */
+ for(k=1; k<=i1;k++){
+ if(i1 != 1 && TKresult[nres]!= k)
+ continue;
+ if(invalidvarcomb[k]){
+ printf("\nCombination (%d) projection ignored because no cases \n",k);
+ continue;
+ }
+ 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",Tvaraff[j],nbcode[Tvaraff[j]][codtabm(k,j)]);
+ }
+ for (k4=1; k4<= nsq; k4++){ /* For each selected (single) quantitative value */
+ fprintf(ficresf," 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++)
+ fprintf(ficresf," p%d%d",i,j);
+ fprintf(ficresf," wp.%d",j);
+ }
+ for (yearp=0; yearp<=(anprojf-anprojd);yearp +=stepsize) {
+ fprintf(ficresf,"\n");
+ fprintf(ficresf,"\n# Forecasting at date %.lf/%.lf/%.lf ",jprojd,mprojd,anprojd+yearp);
+ /* for (agec=fage; agec>=(ageminpar-1); agec--){ */
+ for (agec=fage; agec>=(bage); 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;
+ /* We compute pii at age agec over nhstepm);*/
+ hpxij(p3mat,nhstepm,agec,hstepm,p,nlstate,stepm,oldm,savm, k,nres);
+ /* Then we print p3mat for h corresponding to the right agec+h*stepms=yearp */
+ for (h=0; h<=nhstepm; h++){
+ if (h*hstepm/YEARM*stepm ==yearp) {
+ break;
+ }
}
- }
- /* This for computing probability of death (h=1 means
- computed over hstepm matrices product = hstepm*stepm months)
- as a weighted average of prlim.
- */
- for(j=nlstate+1;j<=nlstate+ndeath;j++){
- for(i=1,gpp[j]=0.; i<= nlstate; i++)
- gpp[j] += prlim[i][i]*p3mat[i][j][1];
- }
- /* end probability of death */
+ fprintf(ficresf,"\n");
+ for(j=1;j<=cptcoveff;j++)
+ fprintf(ficresf,"%d %d ",Tvaraff[j],nbcode[Tvaraff[j]][codtabm(k,j)]);
+ fprintf(ficresf,"%.f %.f ",anprojd+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]*prev[(int)agec][i][k];
+ else { /* even if mobilav==-1 we use mobaverage, probs may not sums to 1 */
+ ppij=ppij+p3mat[i][j][h]*probs[(int)(agec)][i][k];
+ }
+ fprintf(ficresf," %.3f", p3mat[i][j][h]);
+ } /* end i */
+ fprintf(ficresf," %.3f", ppij);
+ }/* end j */
+ free_ma3x(p3mat,1,nlstate+ndeath,1, nlstate+ndeath, 0,nhstepm);
+ } /* end agec */
+ /* diffyear=(int) anproj1+yearp-ageminpar-1; */
+ /*printf("Prevforecast %d+%d-%d=diffyear=%d\n",(int) anproj1, (int)yearp,(int)ageminpar,(int) anproj1-(int)ageminpar);*/
+ } /* end yearp */
+ } /* end k */
+
+ fclose(ficresf);
+ printf("End of Computing forecasting \n");
+ fprintf(ficlog,"End of Computing forecasting\n");
+
+}
+
+/************** Back Forecasting ******************/
+ /* void prevbackforecast(char fileres[], double ***prevacurrent, 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){ */
+ void prevbackforecast(char fileres[], double ***prevacurrent, double dateintmean, double dateprojd, double dateprojf, double ageminpar, double agemax, double dateprev1, double dateprev2, int mobilav, double bage, double fage, int firstpass, int lastpass, double p[], int cptcoveff){
+ /* back1, year, month, day of starting backprojection
+ agemin, agemax range of age
+ dateprev1 dateprev2 range of dates during which prevalence is computed
+ anback2 year of end of backprojection (same day and month as back1).
+ prevacurrent and prev are prevalences.
+ */
+ int yearp, stepsize, hstepm, nhstepm, j, k, cptcod, i, h, i1, k4, nres=0;
+ double agec; /* generic age */
+ double agelim, ppij, ppi, yp,yp1,yp2; /* ,jintmean,mintmean,aintmean;*/
+ double *popeffectif,*popcount;
+ double ***p3mat;
+ /* double ***mobaverage; */
+ char fileresfb[FILENAMELENGTH];
+
+ agelim=AGEINF;
+ /* 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); */
+
+ /*Do we need to compute prevalence again?*/
+
+ /* 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("\nComputing back forecasting: result on file '%s', please wait... \n", fileresfb);
+ fprintf(ficlog,"\nComputing back forecasting: result on file '%s', please wait... \n", fileresfb);
+
+ if (cptcoveff==0) ncodemax[cptcoveff]=1;
+
+
+ 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;
+ }
+ if(estepm >= stepm){ /* Yes every two year */
+ stepsize=2;
+ }
+
+ hstepm=hstepm/stepm;
+ /* yp1=modf(dateintmean,&yp);/\* extracts integral of datemean in yp and */
+ /* fractional in yp1 *\/ */
+ /* aintmean=yp; */
+ /* yp2=modf((yp1*12),&yp); */
+ /* mintmean=yp; */
+ /* yp1=modf((yp2*30.5),&yp); */
+ /* jintmean=yp; */
+ /* if(jintmean==0) jintmean=1; */
+ /* if(mintmean==0) jintmean=1; */
+
+ i1=pow(2,cptcoveff);
+ if (cptcovn < 1){i1=1;}
+
+ fprintf(ficresfb,"# Mean day of interviews %.lf/%.lf/%.lf (%.2f) between %.2f and %.2f \n",jintmean,mintmean,aintmean,dateintmean,dateprev1,dateprev2);
+ printf("# Mean day of interviews %.lf/%.lf/%.lf (%.2f) between %.2f and %.2f \n",jintmean,mintmean,aintmean,dateintmean,dateprev1,dateprev2);
+
+ fprintf(ficresfb,"#****** Routine prevbackforecast **\n");
+
+ for(nres=1; nres <= nresult; nres++) /* For each resultline */
+ for(k=1; k<=i1;k++){
+ if(i1 != 1 && TKresult[nres]!= k)
+ continue;
+ if(invalidvarcomb[k]){
+ printf("\nCombination (%d) projection ignored because no cases \n",k);
+ continue;
+ }
+ fprintf(ficresfb,"\n#****** hbijx=probability over h years, hb.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)]);
+ }
+ for (k4=1; k4<= nsq; k4++){ /* For each selected (single) quantitative value */
+ fprintf(ficresf," V%d=%f ",Tvqresult[nres][k4],Tqresult[nres][k4]);
+ }
+ fprintf(ficresfb," yearbproj age");
+ for(j=1; j<=nlstate+ndeath;j++){
+ for(i=1; i<=nlstate;i++)
+ fprintf(ficresfb," b%d%d",i,j);
+ fprintf(ficresfb," b.%d",j);
+ }
+ for (yearp=0; yearp>=(anbackf-anbackd);yearp -=stepsize) {
+ /* for (yearp=0; yearp<=(anproj2-anproj1);yearp +=stepsize) { */
+ fprintf(ficresfb,"\n");
+ fprintf(ficresfb,"\n# Back Forecasting at date %.lf/%.lf/%.lf ",jbackd,mbackd,anbackd+yearp);
+ /* printf("\n# Back Forecasting at date %.lf/%.lf/%.lf ",jback1,mback1,anback1+yearp); */
+ /* for (agec=bage; agec<=agemax-1; agec++){ /\* testing *\/ */
+ for (agec=bage; agec<=fage; agec++){ /* testing */
+ /* We compute bij at age agec over nhstepm, nhstepm decreases when agec increases because of agemax;*/
+ nhstepm=(int) (agec-agelim) *YEARM/stepm;/* nhstepm=(int) rint((agec-agelim)*YEARM/stepm);*/
+ nhstepm = nhstepm/hstepm;
+ p3mat=ma3x(1,nlstate+ndeath,1, nlstate+ndeath, 0,nhstepm);
+ oldm=oldms;savm=savms;
+ /* computes hbxij at age agec over 1 to nhstepm */
+ /* printf("####prevbackforecast debug agec=%.2f nhstepm=%d\n",agec, nhstepm);fflush(stdout); */
+ hbxij(p3mat,nhstepm,agec,hstepm,p,prevacurrent,nlstate,stepm, k, nres);
+ /* hpxij(p3mat,nhstepm,agec,hstepm,p, nlstate,stepm,oldm,savm, k,nres); */
+ /* Then we print p3mat for h corresponding to the right agec+h*stepms=yearp */
+ /* printf(" agec=%.2f\n",agec);fflush(stdout); */
+ for (h=0; h<=nhstepm; h++){
+ if (h*hstepm/YEARM*stepm ==-yearp) {
+ break;
+ }
+ }
+ 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 ",anbackd+yearp,agec-h*hstepm/YEARM*stepm);
+ for(i=1; i<=nlstate+ndeath;i++) {
+ ppij=0.;ppi=0.;
+ for(j=1; j<=nlstate;j++) {
+ /* if (mobilav==1) */
+ ppij=ppij+p3mat[i][j][h]*prevacurrent[(int)agec][j][k];
+ ppi=ppi+prevacurrent[(int)agec][j][k];
+ /* ppij=ppij+p3mat[i][j][h]*mobaverage[(int)agec][j][k]; */
+ /* ppi=ppi+mobaverage[(int)agec][j][k]; */
+ /* else { */
+ /* ppij=ppij+p3mat[i][j][h]*probs[(int)(agec)][i][k]; */
+ /* } */
+ fprintf(ficresfb," %.3f", p3mat[i][j][h]);
+ } /* end j */
+ if(ppi <0.99){
+ printf("Error in prevbackforecast, prevalence doesn't sum to 1 for state %d: %3f\n",i, ppi);
+ fprintf(ficlog,"Error in prevbackforecast, prevalence doesn't sum to 1 for state %d: %3f\n",i, ppi);
+ }
+ fprintf(ficresfb," %.3f", ppij);
+ }/* end j */
+ free_ma3x(p3mat,1,nlstate+ndeath,1, nlstate+ndeath, 0,nhstepm);
+ } /* end agec */
+ } /* end yearp */
+ } /* end k */
+
+ /* 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");
+
+}
- for(i=1; i<=npar; i++) /* Computes gradient x - delta */
- xp[i] = x[i] - (i==theta ?delti[theta]:0);
- hpxij(p3mat,nhstepm,age,hstepm,xp,nlstate,stepm,oldm,savm, ij);
- prevalim(prlim,nlstate,xp,age,oldm,savm,ftolpl,ij);
+/* Variance of prevalence limit: varprlim */
+ void varprlim(char fileresu[], int nresult, double ***prevacurrent, int mobilavproj, double bage, double fage, double **prlim, int *ncvyearp, double ftolpl, double p[], double **matcov, double *delti, int stepm, int cptcoveff){
+ /*------- Variance of forward period (stable) prevalence------*/
- if (popbased==1) {
- if(mobilav ==0){
- for(i=1; i<=nlstate;i++)
- prlim[i][i]=probs[(int)age][i][ij];
- }else{ /* mobilav */
- for(i=1; i<=nlstate;i++)
- prlim[i][i]=mobaverage[(int)age][i][ij];
- }
- }
-
- for(j=1; j<= nlstate; j++){
- for(h=0; h<=nhstepm; h++){
- for(i=1, gm[h][j]=0.;i<=nlstate;i++)
- gm[h][j] += prlim[i][i]*p3mat[i][j][h];
- }
- }
- /* This for computing probability of death (h=1 means
- computed over hstepm matrices product = hstepm*stepm months)
- as a weighted average of prlim.
- */
- 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];
- }
- /* end probability of death */
-
- for(j=1; j<= nlstate; j++) /* vareij */
- for(h=0; h<=nhstepm; h++){
- gradg[h][theta][j]= (gp[h][j]-gm[h][j])/2./delti[theta];
- }
-
- for(j=nlstate+1; j<= nlstate+ndeath; j++){ /* var mu */
- gradgp[theta][j]= (gpp[j]-gmp[j])/2./delti[theta];
- }
+ char fileresvpl[FILENAMELENGTH];
+ FILE *ficresvpl;
+ double **oldm, **savm;
+ double **varpl; /* Variances of prevalence limits by age */
+ int i1, k, nres, j ;
+
+ strcpy(fileresvpl,"VPL_");
+ strcat(fileresvpl,fileresu);
+ if((ficresvpl=fopen(fileresvpl,"w"))==NULL) {
+ printf("Problem with variance of forward period (stable) prevalence resultfile: %s\n", fileresvpl);
+ exit(0);
+ }
+ printf("Computing Variance-covariance of forward period (stable) prevalence: file '%s' ...", fileresvpl);fflush(stdout);
+ fprintf(ficlog, "Computing Variance-covariance of forward period (stable) prevalence: file '%s' ...", fileresvpl);fflush(ficlog);
+
+ /*for(cptcov=1,k=0;cptcov<=i1;cptcov++){
+ for(cptcod=1;cptcod<=ncodemax[cptcov];cptcod++){*/
+
+ i1=pow(2,cptcoveff);
+ if (cptcovn < 1){i1=1;}
- } /* End theta */
+ for(nres=1; nres <= nresult; nres++) /* For each resultline */
+ for(k=1; k<=i1;k++){
+ if(i1 != 1 && TKresult[nres]!= k)
+ continue;
+ fprintf(ficresvpl,"\n#****** ");
+ printf("\n#****** ");
+ fprintf(ficlog,"\n#****** ");
+ for(j=1;j<=cptcoveff;j++) {
+ fprintf(ficresvpl,"V%d=%d ",Tvaraff[j],nbcode[Tvaraff[j]][codtabm(k,j)]);
+ 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(fileresvpl, ficresvpl, varpl, matcov, p, delti, nlstate, stepm, (int) bage, (int) fage, oldm, savm, prlim, ftolpl, ncvyearp, k, strstart, nres);
+ free_matrix(varpl,1,nlstate,(int) bage, (int)fage);
+ /*}*/
+ }
+
+ fclose(ficresvpl);
+ printf("done variance-covariance of forward period prevalence\n");fflush(stdout);
+ fprintf(ficlog,"done variance-covariance of forward period prevalence\n");fflush(ficlog);
- trgradg =ma3x(0,nhstepm,1,nlstate,1,npar); /* veij */
+ }
+/* Variance of back prevalence: varbprlim */
+ void varbprlim(char fileresu[], int nresult, double ***prevacurrent, int mobilavproj, double bage, double fage, double **bprlim, int *ncvyearp, double ftolpl, double p[], double **matcov, double *delti, int stepm, int cptcoveff){
+ /*------- Variance of back (stable) prevalence------*/
+
+ char fileresvbl[FILENAMELENGTH];
+ FILE *ficresvbl;
+
+ double **oldm, **savm;
+ double **varbpl; /* Variances of back prevalence limits by age */
+ int i1, k, nres, j ;
+
+ strcpy(fileresvbl,"VBL_");
+ strcat(fileresvbl,fileresu);
+ if((ficresvbl=fopen(fileresvbl,"w"))==NULL) {
+ printf("Problem with variance of back (stable) prevalence resultfile: %s\n", fileresvbl);
+ exit(0);
+ }
+ printf("Computing Variance-covariance of back (stable) prevalence: file '%s' ...", fileresvbl);fflush(stdout);
+ fprintf(ficlog, "Computing Variance-covariance of back (stable) prevalence: file '%s' ...", fileresvbl);fflush(ficlog);
+
+
+ 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(i1 != 1 && TKresult[nres]!= k)
+ continue;
+ fprintf(ficresvbl,"\n#****** ");
+ printf("\n#****** ");
+ fprintf(ficlog,"\n#****** ");
+ for(j=1;j<=cptcoveff;j++) {
+ fprintf(ficresvbl,"V%d=%d ",Tvaraff[j],nbcode[Tvaraff[j]][codtabm(k,j)]);
+ 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(ficresvbl," V%d=%f ",Tvqresult[nres][j],Tqresult[nres][j]);
+ fprintf(ficlog," V%d=%f ",Tvqresult[nres][j],Tqresult[nres][j]);
+ }
+ fprintf(ficresvbl,"******\n");
+ printf("******\n");
+ fprintf(ficlog,"******\n");
+
+ varbpl=matrix(1,nlstate,(int) bage, (int) fage);
+ oldm=oldms;savm=savms;
+
+ varbrevlim(fileresvbl, ficresvbl, varbpl, matcov, p, delti, nlstate, stepm, (int) bage, (int) fage, oldm, savm, bprlim, ftolpl, mobilavproj, ncvyearp, k, strstart, nres);
+ free_matrix(varbpl,1,nlstate,(int) bage, (int)fage);
+ /*}*/
+ }
+
+ fclose(ficresvbl);
+ printf("done variance-covariance of back prevalence\n");fflush(stdout);
+ fprintf(ficlog,"done variance-covariance of back prevalence\n");fflush(ficlog);
- for(h=0; h<=nhstepm; h++) /* veij */
- for(j=1; j<=nlstate;j++)
- for(theta=1; theta <=npar; theta++)
- trgradg[h][j][theta]=gradg[h][theta][j];
+ } /* End of varbprlim */
- for(j=nlstate+1; j<=nlstate+ndeath;j++) /* mu */
- for(theta=1; theta <=npar; theta++)
- trgradgp[j][theta]=gradgp[theta][j];
+/************** Forecasting *****not tested NB*************/
+/* void populforecast(char fileres[], double anpyram,double mpyram,double jpyram,double ageminpar, double agemax,double dateprev1, double dateprev2s, int mobilav, double agedeb, double fage, int popforecast, char popfile[], double anpyram1,double p[], int i2){ */
+/* int cpt, stepsize, hstepm, nhstepm, j,k,c, cptcod, i,h; */
+/* int *popage; */
+/* double calagedatem, agelim, kk1, kk2; */
+/* double *popeffectif,*popcount; */
+/* double ***p3mat,***tabpop,***tabpopprev; */
+/* /\* double ***mobaverage; *\/ */
+/* char filerespop[FILENAMELENGTH]; */
+
+/* tabpop= ma3x(1, AGESUP,1,NCOVMAX, 1,NCOVMAX); */
+/* tabpopprev= ma3x(1, AGESUP,1,NCOVMAX, 1,NCOVMAX); */
+/* agelim=AGESUP; */
+/* calagedatem=(anpyram+mpyram/12.+jpyram/365.-dateintmean)*YEARM; */
+
+/* prevalence(probs, ageminpar, agemax, s, agev, nlstate, imx, Tvar, nbcode, ncodemax, mint, anint, dateprev1, dateprev2, firstpass, lastpass); */
+
+
+/* strcpy(filerespop,"POP_"); */
+/* strcat(filerespop,fileresu); */
+/* if((ficrespop=fopen(filerespop,"w"))==NULL) { */
+/* printf("Problem with forecast resultfile: %s\n", filerespop); */
+/* fprintf(ficlog,"Problem with forecast resultfile: %s\n", filerespop); */
+/* } */
+/* printf("Computing forecasting: result on file '%s' \n", filerespop); */
+/* fprintf(ficlog,"Computing forecasting: result on file '%s' \n", filerespop); */
- hf=hstepm*stepm/YEARM; /* Duration of hstepm expressed in year unit. */
- for(i=1;i<=nlstate;i++)
- for(j=1;j<=nlstate;j++)
- vareij[i][j][(int)age] =0.;
+/* if (cptcoveff==0) ncodemax[cptcoveff]=1; */
- for(h=0;h<=nhstepm;h++){
- for(k=0;k<=nhstepm;k++){
- matprod2(dnewm,trgradg[h],1,nlstate,1,npar,1,npar,matcov);
- matprod2(doldm,dnewm,1,nlstate,1,npar,1,nlstate,gradg[k]);
- for(i=1;i<=nlstate;i++)
- for(j=1;j<=nlstate;j++)
- vareij[i][j][(int)age] += doldm[i][j]*hf*hf;
- }
- }
+/* /\* 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; */
+
+/* agelim=AGESUP; */
+
+/* hstepm=1; */
+/* hstepm=hstepm/stepm; */
+
+/* if (popforecast==1) { */
+/* if((ficpop=fopen(popfile,"r"))==NULL) { */
+/* printf("Problem with population file : %s\n",popfile);exit(0); */
+/* fprintf(ficlog,"Problem with population file : %s\n",popfile);exit(0); */
+/* } */
+/* popage=ivector(0,AGESUP); */
+/* popeffectif=vector(0,AGESUP); */
+/* popcount=vector(0,AGESUP); */
+
+/* i=1; */
+/* while ((c=fscanf(ficpop,"%d %lf\n",&popage[i],&popcount[i])) != EOF) i=i+1; */
+
+/* imx=i; */
+/* for (i=1; i=(ageminpar-((int)calagedatem %12)/12.); agedeb--){ */
+/* nhstepm=(int) rint((agelim-agedeb)*YEARM/stepm); */
+/* nhstepm = nhstepm/hstepm; */
+
+/* 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); */
+
+/* for (h=0; h<=nhstepm; h++){ */
+/* if (h==(int) (calagedatem+YEARM*cpt)) { */
+/* fprintf(ficrespop,"\n %3.f ",agedeb+h*hstepm/YEARM*stepm); */
+/* } */
+/* for(j=1; j<=nlstate+ndeath;j++) { */
+/* kk1=0.;kk2=0; */
+/* for(i=1; i<=nlstate;i++) { */
+/* if (mobilav==1) */
+/* kk1=kk1+p3mat[i][j][h]*mobaverage[(int)agedeb+1][i][cptcod]; */
+/* else { */
+/* kk1=kk1+p3mat[i][j][h]*probs[(int)(agedeb+1)][i][cptcod]; */
+/* } */
+/* } */
+/* if (h==(int)(calagedatem+12*cpt)){ */
+/* tabpop[(int)(agedeb)][j][cptcod]=kk1; */
+/* /\*fprintf(ficrespop," %.3f", kk1); */
+/* if (popforecast==1) fprintf(ficrespop," [%.f]", kk1*popeffectif[(int)agedeb+1]);*\/ */
+/* } */
+/* } */
+/* for(i=1; i<=nlstate;i++){ */
+/* kk1=0.; */
+/* for(j=1; j<=nlstate;j++){ */
+/* kk1= kk1+tabpop[(int)(agedeb)][j][cptcod]; */
+/* } */
+/* tabpopprev[(int)(agedeb)][i][cptcod]=tabpop[(int)(agedeb)][i][cptcod]/kk1*popeffectif[(int)(agedeb+(calagedatem+12*cpt)*hstepm/YEARM*stepm-1)]; */
+/* } */
+
+/* if (h==(int)(calagedatem+12*cpt)) */
+/* for(j=1; j<=nlstate;j++) */
+/* fprintf(ficrespop," %15.2f",tabpopprev[(int)(agedeb+1)][j][cptcod]); */
+/* } */
+/* free_ma3x(p3mat,1,nlstate+ndeath,1, nlstate+ndeath, 0,nhstepm); */
+/* } */
+/* } */
+
+/* /\******\/ */
+
+/* for (cpt=1; cpt<=(anpyram1-anpyram);cpt++) { */
+/* fprintf(ficrespop,"\n\n# Forecasting at date %.lf/%.lf/%.lf ",jpyram,mpyram,anpyram+cpt); */
+/* for (agedeb=(fage-((int)calagedatem %12/12.)); agedeb>=(ageminpar-((int)calagedatem %12)/12.); agedeb--){ */
+/* nhstepm=(int) rint((agelim-agedeb)*YEARM/stepm); */
+/* nhstepm = nhstepm/hstepm; */
+
+/* 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); */
+/* for (h=0; h<=nhstepm; h++){ */
+/* if (h==(int) (calagedatem+YEARM*cpt)) { */
+/* fprintf(ficresf,"\n %3.f ",agedeb+h*hstepm/YEARM*stepm); */
+/* } */
+/* for(j=1; j<=nlstate+ndeath;j++) { */
+/* kk1=0.;kk2=0; */
+/* for(i=1; i<=nlstate;i++) { */
+/* kk1=kk1+p3mat[i][j][h]*tabpopprev[(int)agedeb+1][i][cptcod]; */
+/* } */
+/* if (h==(int)(calagedatem+12*cpt)) fprintf(ficresf," %15.2f", kk1); */
+/* } */
+/* } */
+/* free_ma3x(p3mat,1,nlstate+ndeath,1, nlstate+ndeath, 0,nhstepm); */
+/* } */
+/* } */
+/* } */
+/* } */
- /* pptj */
- matprod2(dnewmp,trgradgp,nlstate+1,nlstate+ndeath,1,npar,1,npar,matcov);
- matprod2(doldmp,dnewmp,nlstate+1,nlstate+ndeath,1,npar,nlstate+1,nlstate+ndeath,gradgp);
- for(j=nlstate+1;j<=nlstate+ndeath;j++)
- for(i=nlstate+1;i<=nlstate+ndeath;i++)
- varppt[j][i]=doldmp[j][i];
- /* end ppptj */
- /* x centered again */
- hpxij(p3mat,nhstepm,age,hstepm,x,nlstate,stepm,oldm,savm, ij);
- prevalim(prlim,nlstate,x,age,oldm,savm,ftolpl,ij);
+/* /\* if (mobilav!=0) free_ma3x(mobaverage,1, AGESUP,1,NCOVMAX, 1,NCOVMAX); *\/ */
+
+/* if (popforecast==1) { */
+/* free_ivector(popage,0,AGESUP); */
+/* free_vector(popeffectif,0,AGESUP); */
+/* free_vector(popcount,0,AGESUP); */
+/* } */
+/* free_ma3x(tabpop,1, AGESUP,1,NCOVMAX, 1,NCOVMAX); */
+/* free_ma3x(tabpopprev,1, AGESUP,1,NCOVMAX, 1,NCOVMAX); */
+/* fclose(ficrespop); */
+/* } /\* End of popforecast *\/ */
- if (popbased==1) {
- if(mobilav ==0){
- for(i=1; i<=nlstate;i++)
- prlim[i][i]=probs[(int)age][i][ij];
- }else{ /* mobilav */
- for(i=1; i<=nlstate;i++)
- prlim[i][i]=mobaverage[(int)age][i][ij];
- }
- }
-
- /* This for computing probability of death (h=1 means
- computed over hstepm (estepm) matrices product = hstepm*stepm months)
- as a weighted average of prlim.
- */
- 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];
- }
- /* end probability of death */
-
- fprintf(ficresprobmorprev,"%3d %d ",(int) age, ij);
- for(j=nlstate+1; j<=(nlstate+ndeath);j++){
- fprintf(ficresprobmorprev," %11.3e %11.3e",gmp[j], sqrt(varppt[j][j]));
- for(i=1; i<=nlstate;i++){
- fprintf(ficresprobmorprev," %11.3e %11.3e ",prlim[i][i],p3mat[i][j][1]);
- }
- }
- fprintf(ficresprobmorprev,"\n");
-
- fprintf(ficresvij,"%.0f ",age );
- for(i=1; i<=nlstate;i++)
- for(j=1; j<=nlstate;j++){
- fprintf(ficresvij," %.4f", vareij[i][j][(int)age]);
- }
- fprintf(ficresvij,"\n");
- free_matrix(gp,0,nhstepm,1,nlstate);
- free_matrix(gm,0,nhstepm,1,nlstate);
- free_ma3x(gradg,0,nhstepm,1,npar,1,nlstate);
- free_ma3x(trgradg,0,nhstepm,1,nlstate,1,npar);
- free_ma3x(p3mat,1,nlstate+ndeath,1, nlstate+ndeath, 0,nhstepm);
- } /* End age */
- free_vector(gpp,nlstate+1,nlstate+ndeath);
- free_vector(gmp,nlstate+1,nlstate+ndeath);
- free_matrix(gradgp,1,npar,nlstate+1,nlstate+ndeath);
- free_matrix(trgradgp,nlstate+1,nlstate+ndeath,1,npar); /* mu or p point j*/
- fprintf(ficgp,"\nset noparametric;set nolabel; set ter png small;set size 0.65, 0.65");
- /* for(j=nlstate+1; j<= nlstate+ndeath; j++){ *//* Only the first actually */
- fprintf(ficgp,"\n set log y; set nolog x;set xlabel \"Age\"; set ylabel \"Force of mortality (year-1)\";");
-/* fprintf(ficgp,"\n plot \"%s\" u 1:($3*%6.3f) not w l 1 ",fileresprobmorprev,YEARM/estepm); */
-/* fprintf(ficgp,"\n replot \"%s\" u 1:(($3+1.96*$4)*%6.3f) t \"95\%% interval\" w l 2 ",fileresprobmorprev,YEARM/estepm); */
-/* fprintf(ficgp,"\n replot \"%s\" u 1:(($3-1.96*$4)*%6.3f) not w l 2 ",fileresprobmorprev,YEARM/estepm); */
- fprintf(ficgp,"\n plot \"%s\" u 1:($3) not w l 1 ",subdirf(fileresprobmorprev));
- fprintf(ficgp,"\n replot \"%s\" u 1:(($3+1.96*$4)) t \"95\%% interval\" w l 2 ",subdirf(fileresprobmorprev));
- fprintf(ficgp,"\n replot \"%s\" u 1:(($3-1.96*$4)) not w l 2 ",subdirf(fileresprobmorprev));
- fprintf(fichtm,"\n
File (multiple files are possible if covariates are present): %s\n",subdirf(fileresprobmorprev),subdirf(fileresprobmorprev));
- fprintf(fichtm,"\n
Probability is computed over estepm=%d months.
\n", estepm,subdirf3(optionfilefiname,"varmuptjgr",digitp),digit);
- /* fprintf(fichtm,"\n
Probability is computed over estepm=%d months and then divided by estepm and multiplied by %.0f in order to have the probability to die over a year
\n", stepm,YEARM,digitp,digit);
-*/
-/* fprintf(ficgp,"\nset out \"varmuptjgr%s%s%s.png\";replot;",digitp,optionfilefiname,digit); */
- fprintf(ficgp,"\nset out \"%s%s.png\";replot;\n",subdirf3(optionfilefiname,"varmuptjgr",digitp),digit);
-
- free_vector(xp,1,npar);
- free_matrix(doldm,1,nlstate,1,nlstate);
- free_matrix(dnewm,1,nlstate,1,npar);
- free_matrix(doldmp,nlstate+1,nlstate+ndeath,nlstate+1,nlstate+ndeath);
- free_matrix(dnewmp,nlstate+1,nlstate+ndeath,1,npar);
- free_matrix(varppt,nlstate+1,nlstate+ndeath,nlstate+1,nlstate+ndeath);
- if (mobilav!=0) free_ma3x(mobaverage,1, AGESUP,1,NCOVMAX, 1,NCOVMAX);
- fclose(ficresprobmorprev);
- fflush(ficgp);
- fflush(fichtm);
-} /* end varevsij */
-
-/************ Variance of prevlim ******************/
-void varprevlim(char fileres[], double **varpl, double **matcov, double x[], double delti[], int nlstate, int stepm, double bage, double fage, double **oldm, double **savm, double **prlim, double ftolpl, int ij, char strstart[])
+int fileappend(FILE *fichier, char *optionfich)
{
- /* Variance of prevalence limit */
- /* double **prevalim(double **prlim, int nlstate, double *xp, double age, double **oldm, double **savm,double ftolpl);*/
- double **newm;
- double **dnewm,**doldm;
- int i, j, nhstepm, hstepm;
- int k, cptcode;
- double *xp;
- double *gp, *gm;
- double **gradg, **trgradg;
- double age,agelim;
- int theta;
-
- pstamp(ficresvpl);
- fprintf(ficresvpl,"# Standard deviation of period (stable) prevalences \n");
- fprintf(ficresvpl,"# Age");
- for(i=1; i<=nlstate;i++)
- fprintf(ficresvpl," %1d-%1d",i,i);
- fprintf(ficresvpl,"\n");
+ if((fichier=fopen(optionfich,"a"))==NULL) {
+ printf("Problem with file: %s\n", optionfich);
+ fprintf(ficlog,"Problem with file: %s\n", optionfich);
+ return (0);
+ }
+ fflush(fichier);
+ return (1);
+}
- xp=vector(1,npar);
- dnewm=matrix(1,nlstate,1,npar);
- doldm=matrix(1,nlstate,1,nlstate);
-
- hstepm=1*YEARM; /* Every year of age */
- hstepm=hstepm/stepm; /* Typically in stepm units, if j= 2 years, = 2/6 months = 4 */
- agelim = AGESUP;
- for (age=bage; age<=fage; age ++){ /* If stepm=6 months */
- nhstepm=(int) rint((agelim-age)*YEARM/stepm); /* Typically 20 years = 20*12/6=40 */
- if (stepm >= YEARM) hstepm=1;
- nhstepm = nhstepm/hstepm; /* Typically 40/4=10 */
- gradg=matrix(1,npar,1,nlstate);
- gp=vector(1,nlstate);
- gm=vector(1,nlstate);
- for(theta=1; theta <=npar; theta++){
- for(i=1; i<=npar; i++){ /* Computes gradient */
- xp[i] = x[i] + (i==theta ?delti[theta]:0);
- }
- prevalim(prlim,nlstate,xp,age,oldm,savm,ftolpl,ij);
- for(i=1;i<=nlstate;i++)
- gp[i] = prlim[i][i];
-
- for(i=1; i<=npar; i++) /* Computes gradient */
- xp[i] = x[i] - (i==theta ?delti[theta]:0);
- prevalim(prlim,nlstate,xp,age,oldm,savm,ftolpl,ij);
- for(i=1;i<=nlstate;i++)
- gm[i] = prlim[i][i];
+/**************** function prwizard **********************/
+void prwizard(int ncovmodel, int nlstate, int ndeath, char model[], FILE *ficparo)
+{
- for(i=1;i<=nlstate;i++)
- gradg[theta][i]= (gp[i]-gm[i])/2./delti[theta];
- } /* End theta */
+ /* Wizard to print covariance matrix template */
- trgradg =matrix(1,nlstate,1,npar);
+ char ca[32], cb[32];
+ int i,j, k, li, lj, lk, ll, jj, npar, itimes;
+ int numlinepar;
- for(j=1; j<=nlstate;j++)
- for(theta=1; theta <=npar; theta++)
- trgradg[j][theta]=gradg[theta][j];
+ printf("# Parameters nlstate*nlstate*ncov a12*1 + b12 * age + ...\n");
+ fprintf(ficparo,"# Parameters nlstate*nlstate*ncov a12*1 + b12 * age + ...\n");
+ for(i=1; i <=nlstate; i++){
+ jj=0;
+ for(j=1; j <=nlstate+ndeath; j++){
+ if(j==i) continue;
+ jj++;
+ /*ca[0]= k+'a'-1;ca[1]='\0';*/
+ printf("%1d%1d",i,j);
+ fprintf(ficparo,"%1d%1d",i,j);
+ for(k=1; k<=ncovmodel;k++){
+ /* printf(" %lf",param[i][j][k]); */
+ /* fprintf(ficparo," %lf",param[i][j][k]); */
+ printf(" 0.");
+ fprintf(ficparo," 0.");
+ }
+ printf("\n");
+ fprintf(ficparo,"\n");
+ }
+ }
+ printf("# Scales (for hessian or gradient estimation)\n");
+ fprintf(ficparo,"# Scales (for hessian or gradient estimation)\n");
+ npar= (nlstate+ndeath-1)*nlstate*ncovmodel; /* Number of parameters*/
+ for(i=1; i <=nlstate; i++){
+ jj=0;
+ for(j=1; j <=nlstate+ndeath; j++){
+ if(j==i) continue;
+ jj++;
+ fprintf(ficparo,"%1d%1d",i,j);
+ printf("%1d%1d",i,j);
+ fflush(stdout);
+ for(k=1; k<=ncovmodel;k++){
+ /* printf(" %le",delti3[i][j][k]); */
+ /* fprintf(ficparo," %le",delti3[i][j][k]); */
+ printf(" 0.");
+ fprintf(ficparo," 0.");
+ }
+ numlinepar++;
+ printf("\n");
+ fprintf(ficparo,"\n");
+ }
+ }
+ printf("# Covariance matrix\n");
+/* # 121 Var(a12)\n\ */
+/* # 122 Cov(b12,a12) Var(b12)\n\ */
+/* # 131 Cov(a13,a12) Cov(a13,b12, Var(a13)\n\ */
+/* # 132 Cov(b13,a12) Cov(b13,b12, Cov(b13,a13) Var(b13)\n\ */
+/* # 212 Cov(a21,a12) Cov(a21,b12, Cov(a21,a13) Cov(a21,b13) Var(a21)\n\ */
+/* # 212 Cov(b21,a12) Cov(b21,b12, Cov(b21,a13) Cov(b21,b13) Cov(b21,a21) Var(b21)\n\ */
+/* # 232 Cov(a23,a12) Cov(a23,b12, Cov(a23,a13) Cov(a23,b13) Cov(a23,a21) Cov(a23,b21) Var(a23)\n\ */
+/* # 232 Cov(b23,a12) Cov(b23,b12) ... Var (b23)\n" */
+ fflush(stdout);
+ fprintf(ficparo,"# Covariance matrix\n");
+ /* # 121 Var(a12)\n\ */
+ /* # 122 Cov(b12,a12) Var(b12)\n\ */
+ /* # ...\n\ */
+ /* # 232 Cov(b23,a12) Cov(b23,b12) ... Var (b23)\n" */
+
+ for(itimes=1;itimes<=2;itimes++){
+ jj=0;
+ for(i=1; i <=nlstate; i++){
+ for(j=1; j <=nlstate+ndeath; j++){
+ if(j==i) continue;
+ for(k=1; k<=ncovmodel;k++){
+ jj++;
+ ca[0]= k+'a'-1;ca[1]='\0';
+ if(itimes==1){
+ printf("#%1d%1d%d",i,j,k);
+ fprintf(ficparo,"#%1d%1d%d",i,j,k);
+ }else{
+ printf("%1d%1d%d",i,j,k);
+ fprintf(ficparo,"%1d%1d%d",i,j,k);
+ /* printf(" %.5le",matcov[i][j]); */
+ }
+ ll=0;
+ for(li=1;li <=nlstate; li++){
+ for(lj=1;lj <=nlstate+ndeath; lj++){
+ if(lj==li) continue;
+ for(lk=1;lk<=ncovmodel;lk++){
+ ll++;
+ if(ll<=jj){
+ cb[0]= lk +'a'-1;cb[1]='\0';
+ if(ll0) printf("i=%d ageex=%lf agecens=%lf agedc=%lf cens=%d %d\n" ,i,ageexmed[i],agecens[i],agedc[i],cens[i],wav[i]);*/
- free_vector(xp,1,npar);
- free_matrix(doldm,1,nlstate,1,npar);
- free_matrix(dnewm,1,nlstate,1,nlstate);
+ for (i=1;i<=imx ; i++) {
+ /* mu(a)=mu(agecomp)*exp(teta*(age-agegomp))
+ mu(a)=x[1]*exp(x[2]*(age-agegomp)); x[1] and x[2] are per year.
+ * L= Product mu(agedeces)exp(-\int_ageexam^agedc mu(u) du ) for a death between agedc (in month)
+ * and agedc +1 month, cens[i]=0: log(x[1]/YEARM)
+ * +
+ * exp(-\int_ageexam^agecens mu(u) du ) when censored, cens[i]=1
+ */
+ if (wav[i] > 1 || agedc[i] < AGESUP) {
+ if (cens[i] == 1){
+ A=-x[1]/(x[2])*(exp(x[2]*(agecens[i]-agegomp))-exp(x[2]*(ageexmed[i]-agegomp)));
+ } else if (cens[i] == 0){
+ A=-x[1]/(x[2])*(exp(x[2]*(agedc[i]-agegomp))-exp(x[2]*(ageexmed[i]-agegomp)))
+ +log(x[1]/YEARM) +x[2]*(agedc[i]-agegomp)+log(YEARM);
+ } else
+ printf("Gompertz cens[%d] neither 1 nor 0\n",i);
+ /*if (wav[i] > 1 && agecens[i] > 15) {*/ /* ??? */
+ L=L+A*weight[i];
+ /* printf("\ni=%d A=%f L=%lf x[1]=%lf x[2]=%lf ageex=%lf agecens=%lf cens=%d agedc=%lf weight=%lf\n",i,A,L,x[1],x[2],ageexmed[i]*12,agecens[i]*12,cens[i],agedc[i]*12,weight[i]);*/
+ }
+ }
+ /*printf("x1=%2.9f x2=%2.9f x3=%2.9f L=%f\n",x[1],x[2],x[3],L);*/
+
+ return -2*L*num/sump;
}
-/************ Variance of one-step probabilities ******************/
-void varprob(char optionfilefiname[], double **matcov, double x[], double delti[], int nlstate, double bage, double fage, int ij, int *Tvar, int **nbcode, int *ncodemax, char strstart[])
-{
- int i, j=0, i1, k1, l1, t, tj;
- int k2, l2, j1, z1;
- int k=0,l, cptcode;
- int first=1, first1;
- double cv12, mu1, mu2, lc1, lc2, v12, v21, v11, v22,v1,v2, c12, tnalp;
- double **dnewm,**doldm;
- double *xp;
- double *gp, *gm;
- double **gradg, **trgradg;
- double **mu;
- double age,agelim, cov[NCOVMAX];
- double std=2.0; /* Number of standard deviation wide of confidence ellipsoids */
- int theta;
- char fileresprob[FILENAMELENGTH];
- char fileresprobcov[FILENAMELENGTH];
- char fileresprobcor[FILENAMELENGTH];
-
- double ***varpij;
-
- strcpy(fileresprob,"prob");
- strcat(fileresprob,fileres);
- if((ficresprob=fopen(fileresprob,"w"))==NULL) {
- printf("Problem with resultfile: %s\n", fileresprob);
- fprintf(ficlog,"Problem with resultfile: %s\n", fileresprob);
- }
- strcpy(fileresprobcov,"probcov");
- strcat(fileresprobcov,fileres);
- if((ficresprobcov=fopen(fileresprobcov,"w"))==NULL) {
- printf("Problem with resultfile: %s\n", fileresprobcov);
- fprintf(ficlog,"Problem with resultfile: %s\n", fileresprobcov);
- }
- strcpy(fileresprobcor,"probcor");
- strcat(fileresprobcor,fileres);
- if((ficresprobcor=fopen(fileresprobcor,"w"))==NULL) {
- printf("Problem with resultfile: %s\n", fileresprobcor);
- fprintf(ficlog,"Problem with resultfile: %s\n", fileresprobcor);
- }
- printf("Computing standard deviation of one-step probabilities: result on file '%s' \n",fileresprob);
- fprintf(ficlog,"Computing standard deviation of one-step probabilities: result on file '%s' \n",fileresprob);
- printf("Computing matrix of variance covariance of one-step probabilities: result on file '%s' \n",fileresprobcov);
- fprintf(ficlog,"Computing matrix of variance covariance of one-step probabilities: result on file '%s' \n",fileresprobcov);
- printf("and correlation matrix of one-step probabilities: result on file '%s' \n",fileresprobcor);
- fprintf(ficlog,"and correlation matrix of one-step probabilities: result on file '%s' \n",fileresprobcor);
- pstamp(ficresprob);
- fprintf(ficresprob,"#One-step probabilities and stand. devi in ()\n");
- fprintf(ficresprob,"# Age");
- pstamp(ficresprobcov);
- fprintf(ficresprobcov,"#One-step probabilities and covariance matrix\n");
- fprintf(ficresprobcov,"# Age");
- pstamp(ficresprobcor);
- fprintf(ficresprobcor,"#One-step probabilities and correlation matrix\n");
- fprintf(ficresprobcor,"# Age");
-
-
- for(i=1; i<=nlstate;i++)
- for(j=1; j<=(nlstate+ndeath);j++){
- fprintf(ficresprob," p%1d-%1d (SE)",i,j);
- fprintf(ficresprobcov," p%1d-%1d ",i,j);
- fprintf(ficresprobcor," p%1d-%1d ",i,j);
- }
- /* fprintf(ficresprob,"\n");
- fprintf(ficresprobcov,"\n");
- fprintf(ficresprobcor,"\n");
- */
- xp=vector(1,npar);
- dnewm=matrix(1,(nlstate)*(nlstate+ndeath),1,npar);
- doldm=matrix(1,(nlstate)*(nlstate+ndeath),1,(nlstate)*(nlstate+ndeath));
- mu=matrix(1,(nlstate)*(nlstate+ndeath), (int) bage, (int)fage);
- varpij=ma3x(1,nlstate*(nlstate+ndeath),1,nlstate*(nlstate+ndeath),(int) bage, (int) fage);
- first=1;
- fprintf(ficgp,"\n# Routine varprob");
- fprintf(fichtm,"\n Computing and drawing one step probabilities with their confidence intervals
\n");
- fprintf(fichtm,"\n");
-
- fprintf(fichtm,"\n\n",optionfilehtmcov);
- fprintf(fichtmcov,"\nMatrix of variance-covariance of pairs of step probabilities
\n\
- file %s
\n",optionfilehtmcov);
- fprintf(fichtmcov,"\nEllipsoids of confidence centered on point (pij, pkl) are estimated\
-and drawn. It helps understanding how is the covariance between two incidences.\
- They are expressed in year-1 in order to be less dependent of stepm.
\n");
- fprintf(fichtmcov,"\n
Contour plot corresponding to x'cov-1x = 4 (where x is the column vector (pij,pkl)) are drawn. \
-It can be understood this way: if pij and pkl where uncorrelated the (2x2) matrix of covariance \
-would have been (1/(var pij), 0 , 0, 1/(var pkl)), and the confidence interval would be 2 \
-standard deviations wide on each axis.
\
- Now, if both incidences are correlated (usual case) we diagonalised the inverse of the covariance matrix\
- and made the appropriate rotation to look at the uncorrelated principal directions.
\
-To be simple, these graphs help to understand the significativity of each parameter in relation to a second other one.
\n");
+#ifdef GSL
+/******************* Gompertz_f Likelihood ******************************/
+double gompertz_f(const gsl_vector *v, void *params)
+{
+ double A=0.,B=0.,LL=0.0,sump=0.,num=0.;
+ double *x= (double *) v->data;
+ int i,n=0; /* n is the size of the sample */
- cov[1]=1;
- tj=cptcoveff;
- if (cptcovn<1) {tj=1;ncodemax[1]=1;}
- j1=0;
- for(t=1; t<=tj;t++){
- for(i1=1; i1<=ncodemax[t];i1++){
- j1++;
- if (cptcovn>0) {
- fprintf(ficresprob, "\n#********** Variable ");
- for (z1=1; z1<=cptcoveff; z1++) fprintf(ficresprob, "V%d=%d ",Tvaraff[z1],nbcode[Tvaraff[z1]][codtab[j1][z1]]);
- fprintf(ficresprob, "**********\n#\n");
- fprintf(ficresprobcov, "\n#********** Variable ");
- for (z1=1; z1<=cptcoveff; z1++) fprintf(ficresprobcov, "V%d=%d ",Tvaraff[z1],nbcode[Tvaraff[z1]][codtab[j1][z1]]);
- fprintf(ficresprobcov, "**********\n#\n");
-
- fprintf(ficgp, "\n#********** Variable ");
- for (z1=1; z1<=cptcoveff; z1++) fprintf(ficgp, " V%d=%d ",Tvaraff[z1],nbcode[Tvaraff[z1]][codtab[j1][z1]]);
- fprintf(ficgp, "**********\n#\n");
-
-
- fprintf(fichtmcov, "\n
********** Variable ");
- for (z1=1; z1<=cptcoveff; z1++) fprintf(fichtm, "V%d=%d ",Tvaraff[z1],nbcode[Tvaraff[z1]][codtab[j1][z1]]);
- fprintf(fichtmcov, "**********\n
");
-
- fprintf(ficresprobcor, "\n#********** Variable ");
- for (z1=1; z1<=cptcoveff; z1++) fprintf(ficresprobcor, "V%d=%d ",Tvaraff[z1],nbcode[Tvaraff[z1]][codtab[j1][z1]]);
- fprintf(ficresprobcor, "**********\n#");
- }
+ for (i=0;i<=imx-1 ; i++) {
+ sump=sump+weight[i];
+ /* sump=sump+1;*/
+ num=num+1;
+ }
+
+
+ /* for (i=0; i<=imx; i++)
+ if (wav[i]>0) printf("i=%d ageex=%lf agecens=%lf agedc=%lf cens=%d %d\n" ,i,ageexmed[i],agecens[i],agedc[i],cens[i],wav[i]);*/
+ printf("x[0]=%lf x[1]=%lf\n",x[0],x[1]);
+ for (i=1;i<=imx ; i++)
+ {
+ if (cens[i] == 1 && wav[i]>1)
+ A=-x[0]/(x[1])*(exp(x[1]*(agecens[i]-agegomp))-exp(x[1]*(ageexmed[i]-agegomp)));
- for (age=bage; age<=fage; age ++){
- cov[2]=age;
- for (k=1; k<=cptcovn;k++) {
- cov[2+k]=nbcode[Tvar[k]][codtab[j1][Tvar[k]]];
- }
- for (k=1; k<=cptcovage;k++) cov[2+Tage[k]]=cov[2+Tage[k]]*cov[2];
- for (k=1; k<=cptcovprod;k++)
- cov[2+Tprod[k]]=nbcode[Tvard[k][1]][codtab[ij][Tvard[k][1]]]*nbcode[Tvard[k][2]][codtab[ij][Tvard[k][2]]];
-
- gradg=matrix(1,npar,1,(nlstate)*(nlstate+ndeath));
- trgradg=matrix(1,(nlstate)*(nlstate+ndeath),1,npar);
- gp=vector(1,(nlstate)*(nlstate+ndeath));
- gm=vector(1,(nlstate)*(nlstate+ndeath));
-
- for(theta=1; theta <=npar; theta++){
- for(i=1; i<=npar; i++)
- xp[i] = x[i] + (i==theta ?delti[theta]:(double)0);
-
- pmij(pmmij,cov,ncovmodel,xp,nlstate);
-
- k=0;
- for(i=1; i<= (nlstate); i++){
- for(j=1; j<=(nlstate+ndeath);j++){
- k=k+1;
- gp[k]=pmmij[i][j];
- }
- }
-
- for(i=1; i<=npar; i++)
- xp[i] = x[i] - (i==theta ?delti[theta]:(double)0);
-
- pmij(pmmij,cov,ncovmodel,xp,nlstate);
- k=0;
- for(i=1; i<=(nlstate); i++){
- for(j=1; j<=(nlstate+ndeath);j++){
- k=k+1;
- gm[k]=pmmij[i][j];
- }
- }
-
- for(i=1; i<= (nlstate)*(nlstate+ndeath); i++)
- gradg[theta][i]=(gp[i]-gm[i])/(double)2./delti[theta];
- }
-
- for(j=1; j<=(nlstate)*(nlstate+ndeath);j++)
- for(theta=1; theta <=npar; theta++)
- trgradg[j][theta]=gradg[theta][j];
-
- matprod2(dnewm,trgradg,1,(nlstate)*(nlstate+ndeath),1,npar,1,npar,matcov);
- matprod2(doldm,dnewm,1,(nlstate)*(nlstate+ndeath),1,npar,1,(nlstate)*(nlstate+ndeath),gradg);
- free_vector(gp,1,(nlstate+ndeath)*(nlstate+ndeath));
- free_vector(gm,1,(nlstate+ndeath)*(nlstate+ndeath));
- free_matrix(trgradg,1,(nlstate+ndeath)*(nlstate+ndeath),1,npar);
- free_matrix(gradg,1,(nlstate+ndeath)*(nlstate+ndeath),1,npar);
-
- pmij(pmmij,cov,ncovmodel,x,nlstate);
-
- k=0;
- for(i=1; i<=(nlstate); i++){
- for(j=1; j<=(nlstate+ndeath);j++){
- k=k+1;
- mu[k][(int) age]=pmmij[i][j];
- }
- }
- for(i=1;i<=(nlstate)*(nlstate+ndeath);i++)
- for(j=1;j<=(nlstate)*(nlstate+ndeath);j++)
- varpij[i][j][(int)age] = doldm[i][j];
-
- /*printf("\n%d ",(int)age);
- for (i=1; i<=(nlstate)*(nlstate+ndeath);i++){
- printf("%e [%e ;%e] ",gm[i],gm[i]-2*sqrt(doldm[i][i]),gm[i]+2*sqrt(doldm[i][i]));
- fprintf(ficlog,"%e [%e ;%e] ",gm[i],gm[i]-2*sqrt(doldm[i][i]),gm[i]+2*sqrt(doldm[i][i]));
- }*/
-
- fprintf(ficresprob,"\n%d ",(int)age);
- fprintf(ficresprobcov,"\n%d ",(int)age);
- fprintf(ficresprobcor,"\n%d ",(int)age);
-
- for (i=1; i<=(nlstate)*(nlstate+ndeath);i++)
- fprintf(ficresprob,"%11.3e (%11.3e) ",mu[i][(int) age],sqrt(varpij[i][i][(int)age]));
- for (i=1; i<=(nlstate)*(nlstate+ndeath);i++){
- fprintf(ficresprobcov,"%11.3e ",mu[i][(int) age]);
- fprintf(ficresprobcor,"%11.3e ",mu[i][(int) age]);
- }
- i=0;
- for (k=1; k<=(nlstate);k++){
- for (l=1; l<=(nlstate+ndeath);l++){
- i=i++;
- fprintf(ficresprobcov,"\n%d %d-%d",(int)age,k,l);
- fprintf(ficresprobcor,"\n%d %d-%d",(int)age,k,l);
- for (j=1; j<=i;j++){
- fprintf(ficresprobcov," %11.3e",varpij[i][j][(int)age]);
- fprintf(ficresprobcor," %11.3e",varpij[i][j][(int) age]/sqrt(varpij[i][i][(int) age])/sqrt(varpij[j][j][(int)age]));
- }
- }
- }/* end of loop for state */
- } /* end of loop for age */
-
- /* Confidence intervalle of pij */
- /*
- fprintf(ficgp,"\nset noparametric;unset label");
- fprintf(ficgp,"\nset log y;unset log x; set xlabel \"Age\";set ylabel \"probability (year-1)\"");
- fprintf(ficgp,"\nset ter png small\nset size 0.65,0.65");
- fprintf(fichtm,"\n
Probability with confidence intervals expressed in year-1 :pijgr%s.png, ",optionfilefiname,optionfilefiname);
- fprintf(fichtm,"\n
",optionfilefiname);
- fprintf(ficgp,"\nset out \"pijgr%s.png\"",optionfilefiname);
- fprintf(ficgp,"\nplot \"%s\" every :::%d::%d u 1:2 \"\%%lf",k1,k2,xfilevarprob);
- */
+ if (cens[i] == 0 && wav[i]>1)
+ A=-x[0]/(x[1])*(exp(x[1]*(agedc[i]-agegomp))-exp(x[1]*(ageexmed[i]-agegomp)))
+ +log(x[0]/YEARM)+x[1]*(agedc[i]-agegomp)+log(YEARM);
+
+ /*if (wav[i] > 1 && agecens[i] > 15) {*/ /* ??? */
+ if (wav[i] > 1 ) { /* ??? */
+ LL=LL+A*weight[i];
+ /* printf("\ni=%d A=%f L=%lf x[1]=%lf x[2]=%lf ageex=%lf agecens=%lf cens=%d agedc=%lf weight=%lf\n",i,A,L,x[1],x[2],ageexmed[i]*12,agecens[i]*12,cens[i],agedc[i]*12,weight[i]);*/
+ }
+ }
- /* Drawing ellipsoids of confidence of two variables p(k1-l1,k2-l2)*/
- first1=1;
- for (k2=1; k2<=(nlstate);k2++){
- for (l2=1; l2<=(nlstate+ndeath);l2++){
- if(l2==k2) continue;
- j=(k2-1)*(nlstate+ndeath)+l2;
- for (k1=1; k1<=(nlstate);k1++){
- for (l1=1; l1<=(nlstate+ndeath);l1++){
- if(l1==k1) continue;
- i=(k1-1)*(nlstate+ndeath)+l1;
- if(i<=j) continue;
- for (age=bage; age<=fage; age ++){
- if ((int)age %5==0){
- v1=varpij[i][i][(int)age]/stepm*YEARM/stepm*YEARM;
- v2=varpij[j][j][(int)age]/stepm*YEARM/stepm*YEARM;
- cv12=varpij[i][j][(int)age]/stepm*YEARM/stepm*YEARM;
- mu1=mu[i][(int) age]/stepm*YEARM ;
- mu2=mu[j][(int) age]/stepm*YEARM;
- c12=cv12/sqrt(v1*v2);
- /* Computing eigen value of matrix of covariance */
- lc1=((v1+v2)+sqrt((v1+v2)*(v1+v2) - 4*(v1*v2-cv12*cv12)))/2.;
- lc2=((v1+v2)-sqrt((v1+v2)*(v1+v2) - 4*(v1*v2-cv12*cv12)))/2.;
- /* Eigen vectors */
- v11=(1./sqrt(1+(v1-lc1)*(v1-lc1)/cv12/cv12));
- /*v21=sqrt(1.-v11*v11); *//* error */
- v21=(lc1-v1)/cv12*v11;
- v12=-v21;
- v22=v11;
- tnalp=v21/v11;
- if(first1==1){
- first1=0;
- printf("%d %d%d-%d%d mu %.4e %.4e Var %.4e %.4e cor %.3f cov %.4e Eig %.3e %.3e 1stv %.3f %.3f tang %.3f\nOthers in log...\n",(int) age,k1,l1,k2,l2,mu1,mu2,v1,v2,c12,cv12,lc1,lc2,v11,v21,tnalp);
- }
- fprintf(ficlog,"%d %d%d-%d%d mu %.4e %.4e Var %.4e %.4e cor %.3f cov %.4e Eig %.3e %.3e 1stv %.3f %.3f tan %.3f\n",(int) age,k1,l1,k2,l2,mu1,mu2,v1,v2,c12,cv12,lc1,lc2,v11,v21,tnalp);
- /*printf(fignu*/
- /* mu1+ v11*lc1*cost + v12*lc2*sin(t) */
- /* mu2+ v21*lc1*cost + v22*lc2*sin(t) */
- if(first==1){
- first=0;
- fprintf(ficgp,"\nset parametric;unset label");
- fprintf(ficgp,"\nset log y;set log x; set xlabel \"p%1d%1d (year-1)\";set ylabel \"p%1d%1d (year-1)\"",k1,l1,k2,l2);
- fprintf(ficgp,"\nset ter png small\nset size 0.65,0.65");
- fprintf(fichtmcov,"\n
Ellipsoids of confidence cov(p%1d%1d,p%1d%1d) expressed in year-1\
- :\
-%s%d%1d%1d-%1d%1d.png, ",k1,l1,k2,l2,\
- subdirf2(optionfilefiname,"varpijgr"), j1,k1,l1,k2,l2,\
- subdirf2(optionfilefiname,"varpijgr"), j1,k1,l1,k2,l2);
- fprintf(fichtmcov,"\n
",subdirf2(optionfilefiname,"varpijgr"), j1,k1,l1,k2,l2);
- fprintf(fichtmcov,"\n
Correlation at age %d (%.3f),",(int) age, c12);
- fprintf(ficgp,"\nset out \"%s%d%1d%1d-%1d%1d.png\"",subdirf2(optionfilefiname,"varpijgr"), j1,k1,l1,k2,l2);
- fprintf(ficgp,"\nset label \"%d\" at %11.3e,%11.3e center",(int) age, mu1,mu2);
- fprintf(ficgp,"\n# Age %d, p%1d%1d - p%1d%1d",(int) age, k1,l1,k2,l2);
- fprintf(ficgp,"\nplot [-pi:pi] %11.3e+ %.3f*(%11.3e*%11.3e*cos(t)+%11.3e*%11.3e*sin(t)), %11.3e +%.3f*(%11.3e*%11.3e*cos(t)+%11.3e*%11.3e*sin(t)) not",\
- mu1,std,v11,sqrt(lc1),v12,sqrt(lc2),\
- mu2,std,v21,sqrt(lc1),v22,sqrt(lc2));
- }else{
- first=0;
- fprintf(fichtmcov," %d (%.3f),",(int) age, c12);
- fprintf(ficgp,"\n# Age %d, p%1d%1d - p%1d%1d",(int) age, k1,l1,k2,l2);
- fprintf(ficgp,"\nset label \"%d\" at %11.3e,%11.3e center",(int) age, mu1,mu2);
- fprintf(ficgp,"\nreplot %11.3e+ %.3f*(%11.3e*%11.3e*cos(t)+%11.3e*%11.3e*sin(t)), %11.3e +%.3f*(%11.3e*%11.3e*cos(t)+%11.3e*%11.3e*sin(t)) not",\
- mu1,std,v11,sqrt(lc1),v12,sqrt(lc2),\
- mu2,std,v21,sqrt(lc1),v22,sqrt(lc2));
- }/* if first */
- } /* age mod 5 */
- } /* end loop age */
- fprintf(ficgp,"\nset out \"%s%d%1d%1d-%1d%1d.png\";replot;",subdirf2(optionfilefiname,"varpijgr"), j1,k1,l1,k2,l2);
- first=1;
- } /*l12 */
- } /* k12 */
- } /*l1 */
- }/* k1 */
- } /* loop covariates */
- }
- free_ma3x(varpij,1,nlstate,1,nlstate+ndeath,(int) bage, (int)fage);
- free_matrix(mu,1,(nlstate+ndeath)*(nlstate+ndeath),(int) bage, (int)fage);
- free_matrix(doldm,1,(nlstate)*(nlstate+ndeath),1,(nlstate)*(nlstate+ndeath));
- free_matrix(dnewm,1,(nlstate)*(nlstate+ndeath),1,npar);
- free_vector(xp,1,npar);
- fclose(ficresprob);
- fclose(ficresprobcov);
- fclose(ficresprobcor);
- fflush(ficgp);
- fflush(fichtmcov);
+ /*printf("x1=%2.9f x2=%2.9f x3=%2.9f L=%f\n",x[1],x[2],x[3],L);*/
+ printf("x[0]=%lf x[1]=%lf -2*LL*num/sump=%lf\n",x[0],x[1],-2*LL*num/sump);
+
+ return -2*LL*num/sump;
}
-
+#endif
/******************* Printing html file ***********/
-void printinghtml(char fileres[], char title[], char datafile[], int firstpass, \
+void printinghtmlmort(char fileresu[], char title[], char datafile[], int firstpass, \
int lastpass, int stepm, int weightopt, char model[],\
- int imx,int jmin, int jmax, double jmeanint,char rfileres[],\
- int popforecast, int estepm ,\
- double jprev1, double mprev1,double anprev1, \
- double jprev2, double mprev2,double anprev2){
- int jj1, k1, i1, cpt;
-
- fprintf(fichtm,"");
- fprintf(fichtm,"