--- imach/src/imach.c 2004/02/20 13:25:42 1.97
+++ imach/src/imach.c 2006/04/28 17:23:28 1.126
@@ -1,6 +1,158 @@
-/* $Id: imach.c,v 1.97 2004/02/20 13:25:42 lievre Exp $
+/* $Id: imach.c,v 1.126 2006/04/28 17:23:28 brouard Exp $
$State: Exp $
$Log: imach.c,v $
+ 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.
@@ -121,7 +273,7 @@
hPijx.
Also this programme outputs the covariance matrix of the parameters but also
- of the life expectancies. It also computes the stable prevalence.
+ of the life expectancies. It also computes the period (stable) prevalence.
Authors: Nicolas Brouard (brouard@ined.fr) and Agnès Lièvre (lievre@ined.fr).
Institut national d'études démographiques, Paris.
@@ -150,7 +302,7 @@
begin-prev-date,...
open gnuplot file
open html file
- stable prevalence
+ period (stable) prevalence
for age prevalim()
h Pij x
variance of p varprob
@@ -162,7 +314,7 @@
varevsij()
if popbased==1 varevsij(,popbased)
total life expectancies
- Variance of stable prevalence
+ Variance of period (stable) prevalence
end
*/
@@ -172,9 +324,16 @@
#include
#include
#include
+#include
#include
-#include
+#include
+#include
+#include
+#include
+extern int errno;
+
+/* #include */
#include
#include "timeval.h"
@@ -182,11 +341,11 @@
/* #define _(String) gettext (String) */
#define MAXLINE 256
+
#define GNUPLOTPROGRAM "gnuplot"
/*#define GNUPLOTPROGRAM "..\\gp37mgw\\wgnuplot"*/
#define FILENAMELENGTH 132
-/*#define DEBUG*/
-/*#define windows*/
+
#define GLOCK_ERROR_NOPATH -1 /* empty path */
#define GLOCK_ERROR_GETCWD -2 /* cannot get cwd */
@@ -201,19 +360,24 @@
#define YEARM 12. /* Number of months per year */
#define AGESUP 130
#define AGEBASE 40
-#ifdef unix
+#define AGEGOMP 10. /* Minimal age for Gompertz adjustment */
+#ifdef UNIX
#define DIRSEPARATOR '/'
+#define CHARSEPARATOR "/"
#define ODIRSEPARATOR '\\'
#else
#define DIRSEPARATOR '\\'
+#define CHARSEPARATOR "\\"
#define ODIRSEPARATOR '/'
#endif
-/* $Id: imach.c,v 1.97 2004/02/20 13:25:42 lievre Exp $ */
+/* $Id: imach.c,v 1.126 2006/04/28 17:23:28 brouard Exp $ */
/* $State: Exp $ */
-char version[]="Imach version 0.96d, February 2004, INED-EUROREVES ";
-char fullversion[]="$Revision: 1.97 $ $Date: 2004/02/20 13:25:42 $";
+char version[]="Imach version 0.98h, April 2006, INED-EUROREVES-Institut de longevite ";
+char fullversion[]="$Revision: 1.126 $ $Date: 2006/04/28 17:23:28 $";
+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;
@@ -226,6 +390,7 @@ int popbased=0;
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;
@@ -236,12 +401,13 @@ int **bh; /* bh[mi][i] is the bias (+ or
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, *ficrespl, *ficrespij, *ficrest,*ficresf,*ficrespop;
+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;
@@ -249,13 +415,17 @@ 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 optionfilext[10], optionfilefiname[FILENAMELENGTH], plotcmd[FILENAMELENGTH];
+char plotcmd[FILENAMELENGTH], pplotcmd[FILENAMELENGTH];
char tmpout[FILENAMELENGTH], tmpout2[FILENAMELENGTH];
char command[FILENAMELENGTH];
int outcmd=0;
@@ -277,6 +447,10 @@ long time_value;
extern long time();
char strcurr[80], strfor[80];
+char *endptr;
+long lval;
+double dval;
+
#define NR_END 1
#define FREE_ARG char*
#define FTOL 1.0e-10
@@ -304,9 +478,10 @@ static double maxarg1,maxarg2;
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;
int imx;
-int stepm;
+int stepm=1;
/* Stepm, step in month: minimum step interpolation*/
int estepm;
@@ -314,15 +489,17 @@ int estepm;
int m,nb;
long *num;
-int firstpass=0, lastpass=4,*cod, *ncodemax, *Tage;
+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;
double *weight;
int **s; /* Status */
double *agedc, **covar, idx;
int **nbcode, *Tcode, *Tvar, **codtab, **Tvard, *Tprod, cptcovprod, *Tvaraff;
+double *lsurv, *lpop, *tpop;
double ftol=FTOL; /* Tolerance for computing Max Likelihood */
double ftolhess; /* Tolerance for computing hessian */
@@ -330,13 +507,17 @@ double ftolhess; /* Tolerance for comput
/**************** 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 */
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 use current */
+ 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 */
@@ -344,7 +525,8 @@ static int split( char *path, char *dirc
if ( getcwd( dirc, FILENAME_MAX ) == NULL ) {
return( GLOCK_ERROR_GETCWD );
}
- strcpy( name, path ); /* we've got it */
+ /* 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 */
@@ -352,21 +534,25 @@ static int split( char *path, char *dirc
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 */
- /*#ifdef windows
- if ( dirc[l1-1] != '\\' ) { dirc[l1] = '\\'; dirc[l1+1] = 0; }
-#else
- if ( dirc[l1-1] != '/' ) { dirc[l1] = '/'; dirc[l1+1] = 0; }
-#endif
- */
+ if( dirc[l1-1] != DIRSEPARATOR ){
+ dirc[l1] = DIRSEPARATOR;
+ dirc[l1+1] = 0;
+ printf(" DIRC3 = %s \n",dirc);
+ }
ss = strrchr( name, '.' ); /* find last / */
- ss++;
- strcpy(ext,ss); /* save extension */
- l1= strlen( name);
- l2= strlen(ss)+1;
- strncpy( finame, name, l1-l2);
- finame[l1-l2]= 0;
+ 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 */
}
@@ -399,8 +585,8 @@ int nbocc(char *s, char occ)
void cutv(char *u,char *v, char*t, char occ)
{
- /* cuts string t into u and v where u is ended by char occ excluding it
- and v is after occ excluding it too : ex cutv(u,v,"abcdef2ghi2j",2)
+ /* 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;
@@ -829,9 +1015,9 @@ void powell(double p[], double **xi, int
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);
- fprintf(ficrespow,"%d %.12f %ld",*iter,*fret,curr_time.tv_sec-start_time.tv_sec);
- for (i=1;i<=n;i++) {
+ 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]);
@@ -841,11 +1027,11 @@ void powell(double p[], double **xi, int
fprintf(ficrespow,"\n");fflush(ficrespow);
if(*iter <=3){
tm = *localtime(&curr_time.tv_sec);
- strcpy(strcurr,asctime(&tmf));
+ strcpy(strcurr,asctime(&tm));
/* asctime_r(&tm,strcurr); */
- forecast_time=curr_time;
+ forecast_time=curr_time;
itmp = strlen(strcurr);
- if(strcurr[itmp-1]=='\n')
+ 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);
@@ -857,8 +1043,8 @@ void powell(double p[], double **xi, int
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 or\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 or\n on %s (current time is %s);\n",niterf, asc_diff_time(forecast_time.tv_sec-curr_time.tv_sec,tmpout),strfor,strcurr);
+ 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++) {
@@ -952,7 +1138,7 @@ void powell(double p[], double **xi, int
}
}
-/**** Prevalence limit (stable prevalence) ****************/
+/**** Prevalence limit (stable or period prevalence) ****************/
double **prevalim(double **prlim, int nlstate, double x[], double age, double **oldm, double **savm, double ftolpl, int ij)
{
@@ -1023,57 +1209,57 @@ double **pmij(double **ps, double *cov,
int i,j,j1, nc, ii, jj;
for(i=1; i<= nlstate; i++){
- for(j=1; ji s1=%.17e, s2=%.17e %lx %lx\n",s1,s2,s1,s2);*/
+ for(j=1; ji s1=%.17e, s2=%.17e %lx %lx\n",s1,s2,s1,s2); */
+ }
+ ps[i][j]=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.
@@ -1212,15 +1398,16 @@ double func( double *x)
s1=s[mw[mi][i]][i];
s2=s[mw[mi+1][i]][i];
bbh=(double)bh[mi][i]/(double)stepm;
- /* bias is positive if real duration
+ /* 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 the differences between probability to die before dh
- and probability to die before dh-stepm .
+ /* 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
@@ -1240,7 +1427,28 @@ double func( double *x)
lower mortality.
*/
lli=log(out[s1][s2] - savm[s1][s2]);
- }else{
+
+
+ } 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);
+ }
+
+ 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 */
}
@@ -1434,7 +1642,11 @@ double funcone( double *x)
*/
if( s2 > nlstate && (mle <5) ){ /* Jackson */
lli=log(out[s1][s2] - savm[s1][s2]);
- } else if (mle==1){
+ } 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 */
@@ -1450,8 +1662,8 @@ double funcone( double *x)
ll[s[mw[mi][i]][i]] += 2*weight[i]*lli;
/* printf("i=%6d s1=%1d s2=%1d mi=%1d mw=%1d dh=%3d prob=%10.6f w=%6.4f out=%10.6f sav=%10.6f\n",i,s1,s2,mi,mw[mi][i],dh[mi][i],exp(lli),weight[i],out[s1][s2],savm[s1][s2]); */
if(globpr){
- fprintf(ficresilk,"%9d %6d %1d %1d %1d %1d %3d %10.6f %6.4f\
- %10.6f %10.6f %10.6f ", \
+ 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++){
@@ -1516,7 +1728,7 @@ void mlikeli(FILE *ficres,double p[], in
double **xi;
double fret;
double fretone; /* Only one call to likelihood */
- char filerespow[FILENAMELENGTH];
+ /* char filerespow[FILENAMELENGTH];*/
xi=matrix(1,npar,1,npar);
for (i=1;i<=npar;i++)
for (j=1;j<=npar;j++)
@@ -1536,6 +1748,7 @@ void mlikeli(FILE *ficres,double p[], in
powell(p,xi,npar,ftol,&iter,&fret,func);
+ 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));
@@ -1551,11 +1764,11 @@ void hesscov(double **matcov, double p[]
int i, j,jk;
int *indx;
- double hessii(double p[], double delta, int theta, double delti[]);
- double hessij(double p[], double delti[], int i, int j);
+ 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);
printf("\nCalculation of the hessian matrix. Wait...\n");
@@ -1563,9 +1776,11 @@ void hesscov(double **matcov, double p[]
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);
- /*printf(" %f ",p[i]);*/
- /*printf(" %lf ",hess[i][i]);*/
+
+ 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++) {
@@ -1573,7 +1788,8 @@ void hesscov(double **matcov, double p[]
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);
+ hess[i][j]=hessij(p,delti,i,j,func,npar);
+
hess[j][i]=hess[i][j];
/*printf(" %lf ",hess[i][j]);*/
}
@@ -1644,14 +1860,14 @@ void hesscov(double **matcov, double p[]
}
/*************** hessian matrix ****************/
-double hessii( double x[], double delta, int theta, double delti[])
+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, delts, nkhi=10.,nkhif=1., khi=1.e-4;
+ double delt=0.0001, delts, nkhi=10.,nkhif=1., khi=1.e-4;
double fx;
int k=0,kmax=10;
double l1;
@@ -1691,7 +1907,7 @@ double hessii( double x[], double delta,
}
-double hessij( double x[], double delti[], int thetai,int thetaj)
+double hessij( double x[], double delti[], int thetai,int thetaj,double (*func)(double []),int npar)
{
int i;
int l=1, l1, lmax=20;
@@ -1800,8 +2016,13 @@ void lubksb(double **a, int n, int *indx
}
}
+void pstamp(FILE *fichier)
+{
+ fprintf(fichier,"# %s.%s\n#%s\n#%s\n# %s", optionfilefiname,optionfilext,version,fullversion,strstart);
+}
+
/************ 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)
+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;
@@ -1809,7 +2030,6 @@ void freqsummary(char fileres[], int ia
double ***freq; /* Frequencies */
double *pp, **prop;
double pos,posprop, k2, dateintsum=0,k2cpt=0;
- FILE *ficresp;
char fileresp[FILENAMELENGTH];
pp=vector(1,nlstate);
@@ -1821,7 +2041,7 @@ void freqsummary(char fileres[], int ia
fprintf(ficlog,"Problem with prevalence resultfile: %s\n", fileresp);
exit(0);
}
- freq= ma3x(-1,nlstate+ndeath,-1,nlstate+ndeath,iagemin,iagemax+3);
+ freq= ma3x(-5,nlstate+ndeath,-5,nlstate+ndeath,iagemin,iagemax+3);
j1=0;
j=cptcoveff;
@@ -1834,8 +2054,8 @@ void freqsummary(char fileres[], int ia
j1++;
/*printf("cptcoveff=%d Tvaraff=%d", cptcoveff,Tvaraff[1]);
scanf("%d", i);*/
- for (i=-1; i<=nlstate+ndeath; i++)
- for (jk=-1; jk<=nlstate+ndeath; jk++)
+ 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;
@@ -1874,7 +2094,7 @@ void freqsummary(char fileres[], int ia
}
/* 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]]);
@@ -1960,7 +2180,7 @@ void freqsummary(char fileres[], int ia
dateintmean=dateintsum/k2cpt;
fclose(ficresp);
- free_ma3x(freq,-1,nlstate+ndeath,-1,nlstate+ndeath, iagemin, iagemax+3);
+ 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 */
@@ -2069,7 +2289,7 @@ void concatwav(int wav[], int **dh, int
mi=0;
m=firstpass;
while(s[m][i] <= nlstate){
- if(s[m][i]>=1)
+ 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;
@@ -2087,11 +2307,11 @@ void concatwav(int wav[], int **dh, int
if(mi==0){
nbwarn++;
if(first==0){
- printf("Warning! None valid information for:%ld line=%d (skipped) and may be others, see log file\n",num[i],i);
+ 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! None valid information for:%ld line=%d (skipped)\n",num[i],i);
+ fprintf(ficlog,"Warning! No valid information for individual %ld line=%d (skipped)\n",num[i],i);
}
} /* end mi==0 */
} /* End individuals */
@@ -2109,13 +2329,19 @@ void concatwav(int wav[], int **dh, int
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.\n You MUST fix the contradiction between dates.\n",stepm);
+ 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.\n You MUST fix the contradiction between dates.\n",stepm);
+ 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;
- if (j <= jmin) jmin=j;
+ 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);*/
@@ -2123,10 +2349,17 @@ void concatwav(int wav[], int **dh, int
}
else{
j= rint( (agev[mw[mi+1][i]][i]*12 - agev[mw[mi][i]][i]*12));
- /* printf("%d %d %d %d\n", s[mw[mi][i]][i] ,s[mw[mi+1][i]][i],j,i);*/
+/* 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;
- else if (j <= jmin)jmin=j;
+ 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){
@@ -2169,8 +2402,8 @@ void concatwav(int wav[], int **dh, int
} /* end wave */
}
jmean=sum/k;
- printf("Delay (in months) between two waves Min=%d Max=%d Mean=%f\n\n ",jmin, jmax,jmean);
- fprintf(ficlog,"Delay (in months) between two waves Min=%d Max=%d Mean=%f\n\n ",jmin, jmax,jmean);
+ 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);
}
/*********** Tricode ****************************/
@@ -2216,7 +2449,7 @@ void tricode(int *Tvar, int **nbcode, in
for (k=0; k< maxncov; k++) Ndum[k]=0;
for (i=1; i<=ncovmodel-2; i++) {
- /* Listing of all covariables in staement model to see if some covariates appear twice. For example, V1 appears twice in V1+V1*V2.*/
+ /* 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]++;
}
@@ -2234,31 +2467,163 @@ void tricode(int *Tvar, int **nbcode, in
/*********** Health Expectancies ****************/
-void evsij(char fileres[], double ***eij, double x[], int nlstate, int stepm, int bage, int fage, double **oldm, double **savm, int ij, int estepm,double delti[],double **matcov )
+void evsij(char fileres[], double ***eij, double x[], int nlstate, int stepm, int bage, int fage, double **oldm, double **savm, int cij, int estepm,char strstart[] )
+
+{
+ /* 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;
+
+ 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 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 */
+
+ 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);
+
+ 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(char fileres[], 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[] )
{
- /* Health expectancies */
- int i, j, nhstepm, hstepm, h, nstepm, k, cptj;
+ /* 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 ***p3mat,***varhe;
+ double ***p3matp, ***p3matm, ***varhe;
double **dnewm,**doldm;
- double *xp;
+ 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);
- fprintf(ficreseij,"# Health expectancies\n");
- fprintf(ficreseij,"# Age");
- for(i=1; i<=nlstate;i++)
+ 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(ficreseij," %1d-%1d (SE)",i,j);
- fprintf(ficreseij,"\n");
+ 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);
}
@@ -2288,77 +2653,69 @@ void evsij(char fileres[], double ***eij
*/
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;
- for (age=bage; age<=fage; age ++){ /* If stepm=6 months */
- /* nhstepm age range expressed in number of stepm */
- nstepm=(int) rint((agelim-age)*YEARM/stepm);
+ 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;*/
- 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*nlstate);
- gp=matrix(0,nhstepm,1,nlstate*nlstate);
- gm=matrix(0,nhstepm,1,nlstate*nlstate);
-
- /* Computed by stepm unit matrices, product of hstepm matrices, stored
- in an array of nhstepm length: nhstepm=10, hstepm=4, stepm=6 months */
- hpxij(p3mat,nhstepm,age,hstepm,x,nlstate,stepm,oldm, savm, ij);
-
+ 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 */
-
- for(theta=1; theta <=npar; theta++){
+ /* 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(p3mat,nhstepm,age,hstepm,xp,nlstate,stepm,oldm,savm, ij);
+ hpxij(p3matp,nhstepm,age,hstepm,xp,nlstate,stepm,oldm,savm, cij);
+ hpxij(p3matm,nhstepm,age,hstepm,xm,nlstate,stepm,oldm,savm, cij);
- cptj=0;
for(j=1; j<= nlstate; j++){
for(i=1; i<=nlstate; i++){
- cptj=cptj+1;
- for(h=0, gp[h][cptj]=0.; h<=nhstepm-1; h++){
- gp[h][cptj] = (p3mat[i][j][h]+p3mat[i][j][h+1])/2.;
+ 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(i=1; i<=npar; i++)
- xp[i] = x[i] - (i==theta ?delti[theta]:0);
- hpxij(p3mat,nhstepm,age,hstepm,xp,nlstate,stepm,oldm,savm, ij);
-
- cptj=0;
- for(j=1; j<= nlstate; j++){
- for(i=1;i<=nlstate;i++){
- cptj=cptj+1;
- for(h=0, gm[h][cptj]=0.; h<=nhstepm-1; h++){
-
- gm[h][cptj] = (p3mat[i][j][h]+p3mat[i][j][h+1])/2.;
- }
- }
- }
- for(j=1; j<= nlstate*nlstate; j++)
+ for(ij=1; ij<= nlstate*nlstate; ij++)
for(h=0; h<=nhstepm-1; h++){
- gradg[h][theta][j]= (gp[h][j]-gm[h][j])/2./delti[theta];
+ gradg[h][theta][ij]= (gp[h][ij]-gm[h][ij])/2./delti[theta];
}
- }
-
-/* End theta */
-
- trgradg =ma3x(0,nhstepm,1,nlstate*nlstate,1,npar);
-
- for(h=0; h<=nhstepm-1; h++)
+ }/* 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(i=1;i<=nlstate*nlstate;i++)
- for(j=1;j<=nlstate*nlstate;j++)
- varhe[i][j][(int)age] =0.;
+ 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);
@@ -2366,39 +2723,61 @@ void evsij(char fileres[], double ***eij
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(i=1;i<=nlstate*nlstate;i++)
- for(j=1;j<=nlstate*nlstate;j++)
- varhe[i][j][(int)age] += doldm[i][j]*hf*hf;
+ for(ij=1;ij<=nlstate*nlstate;ij++)
+ for(ji=1;ji<=nlstate*nlstate;ji++)
+ varhe[ij][ji][(int)age] += doldm[ij][ji]*hf*hf;
}
}
+
/* 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] += (p3mat[i][j][h]+p3mat[i][j][h+1])/2.0*hf;
+ 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]);*/
+ /* 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 );
- cptj=0;
+ 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++;
- fprintf(ficreseij," %9.4f (%.4f)", eij[i][j][(int)age], sqrt(varhe[cptj][cptj][(int)age]) );
+ 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(ficreseij,"\n");
+ 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(p3mat,1,nlstate+ndeath,1, nlstate+ndeath, 0,nhstepm);
}
+ 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);
@@ -2406,7 +2785,7 @@ void evsij(char fileres[], double ***eij
}
/************ 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)
+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);*/
@@ -2457,7 +2836,9 @@ void varevsij(char optionfilefiname[], d
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,"# Age cov=%-d",ij);
for(j=nlstate+1; j<=(nlstate+ndeath);j++){
@@ -2467,16 +2848,21 @@ void varevsij(char optionfilefiname[], d
}
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);
-
- fprintf(ficresvij,"# Variance and covariance of health expectancies e.j \n# (weighted average of eij where weights are the stable prevalence in health states i\n");
+ 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," Cov(e.%1d, e.%1d)",i,j);
fprintf(ficresvij,"\n");
xp=vector(1,npar);
@@ -2704,7 +3090,7 @@ void varevsij(char optionfilefiname[], d
} /* 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)
+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[])
{
/* Variance of prevalence limit */
/* double **prevalim(double **prlim, int nlstate, double *xp, double age, double **oldm, double **savm,double ftolpl);*/
@@ -2717,8 +3103,9 @@ void varprevlim(char fileres[], double *
double **gradg, **trgradg;
double age,agelim;
int theta;
-
- fprintf(ficresvpl,"# Standard deviation of stable prevalences \n");
+
+ 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);
@@ -2787,7 +3174,7 @@ void varprevlim(char fileres[], double *
}
/************ 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)
+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;
@@ -2832,13 +3219,15 @@ void varprob(char optionfilefiname[], do
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(ficresprobcov,"# Age");
+ fprintf(ficresprobcor,"# Age");
for(i=1; i<=nlstate;i++)
@@ -3089,6 +3478,8 @@ To be simple, these graphs help to under
}
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);
@@ -3107,19 +3498,25 @@ void printinghtml(char fileres[], char t
double jprev2, double mprev2,double anprev2){
int jj1, k1, i1, cpt;
- fprintf(fichtm,"