--- imach/src/imach.c 2005/09/30 16:11:43 1.104
+++ imach/src/imach.c 2006/01/05 20:23:19 1.105
@@ -1,6 +1,9 @@
-/* $Id: imach.c,v 1.104 2005/09/30 16:11:43 lievre Exp $
+/* $Id: imach.c,v 1.105 2006/01/05 20:23:19 lievre Exp $
$State: Exp $
$Log: imach.c,v $
+ 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
@@ -256,11 +259,11 @@
#define ODIRSEPARATOR '/'
#endif
-/* $Id: imach.c,v 1.104 2005/09/30 16:11:43 lievre Exp $ */
+/* $Id: imach.c,v 1.105 2006/01/05 20:23:19 lievre Exp $ */
/* $State: Exp $ */
char version[]="Imach version 0.98, September 2005, INED-EUROREVES ";
-char fullversion[]="$Revision: 1.104 $ $Date: 2005/09/30 16:11:43 $";
+char fullversion[]="$Revision: 1.105 $ $Date: 2006/01/05 20:23:19 $";
int erreur, nberr=0, nbwarn=0; /* Error number, number of errors number of warnings */
int nvar;
int cptcovn=0, cptcovage=0, cptcoveff=0,cptcov;
@@ -373,6 +376,7 @@ 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 */
@@ -1304,6 +1308,18 @@ double func( double *x)
survp += out[s1][j];
lli= survp;
}
+
+ else if (s2==-4) {
+ for (j=3,survp=0. ; j<=nlstate; j++)
+ survp += out[s1][j];
+ lli= survp;
+ }
+
+ else if (s2==-5) {
+ for (j=1,survp=0. ; j<=2; j++)
+ survp += out[s1][j];
+ lli= survp;
+ }
else{
@@ -1870,7 +1886,7 @@ void lubksb(double **a, int n, int *indx
}
/************ 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;
@@ -1890,7 +1906,7 @@ void freqsummary(char fileres[], int ia
fprintf(ficlog,"Problem with prevalence resultfile: %s\n", fileresp);
exit(0);
}
- freq= ma3x(-2,nlstate+ndeath,-2,nlstate+ndeath,iagemin,iagemax+3);
+ freq= ma3x(-5,nlstate+ndeath,-5,nlstate+ndeath,iagemin,iagemax+3);
j1=0;
j=cptcoveff;
@@ -1903,8 +1919,8 @@ void freqsummary(char fileres[], int ia
j1++;
/*printf("cptcoveff=%d Tvaraff=%d", cptcoveff,Tvaraff[1]);
scanf("%d", i);*/
- for (i=-2; i<=nlstate+ndeath; i++)
- for (jk=-2; 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;
@@ -1943,7 +1959,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);*/
-
+fprintf(ficresp, "#Local time at start: %s", strstart);
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]]);
@@ -2029,7 +2045,7 @@ void freqsummary(char fileres[], int ia
dateintmean=dateintsum/k2cpt;
fclose(ficresp);
- free_ma3x(freq,-2,nlstate+ndeath,-2,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 */
@@ -2138,7 +2154,7 @@ void concatwav(int wav[], int **dh, int
mi=0;
m=firstpass;
while(s[m][i] <= nlstate){
- if(s[m][i]>=1 || s[m][i]==-2)
+ 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;
@@ -2178,9 +2194,9 @@ 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;
@@ -2304,7 +2320,7 @@ 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 ij, int estepm,double delti[],double **matcov,char strstart[] )
{
/* Health expectancies */
@@ -2322,6 +2338,7 @@ void evsij(char fileres[], double ***eij
dnewm=matrix(1,nlstate*nlstate,1,npar);
doldm=matrix(1,nlstate*nlstate,1,nlstate*nlstate);
+ fprintf(ficreseij,"# Local time at start: %s", strstart);
fprintf(ficreseij,"# Health expectancies\n");
fprintf(ficreseij,"# Age");
for(i=1; i<=nlstate;i++)
@@ -2476,7 +2493,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);*/
@@ -2527,7 +2544,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);
+ fprintf(ficresprobmorprev, "#Local time at start: %s", strstart);
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++){
@@ -2537,11 +2556,12 @@ 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, "#Local time at start: %s", strstart);
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");
fprintf(ficresvij,"# Age");
for(i=1; i<=nlstate;i++)
@@ -2774,7 +2794,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);*/
@@ -2787,7 +2807,7 @@ void varprevlim(char fileres[], double *
double **gradg, **trgradg;
double age,agelim;
int theta;
-
+ fprintf(ficresvpl, "#Local time at start: %s", strstart);
fprintf(ficresvpl,"# Standard deviation of stable prevalences \n");
fprintf(ficresvpl,"# Age");
for(i=1; i<=nlstate;i++)
@@ -2857,7 +2877,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;
@@ -2902,11 +2922,13 @@ 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);
-
+ fprintf(ficresprob, "#Local time at start: %s", strstart);
fprintf(ficresprob,"#One-step probabilities and stand. devi in ()\n");
fprintf(ficresprob,"# Age");
+ fprintf(ficresprobcov, "#Local time at start: %s", strstart);
fprintf(ficresprobcov,"#One-step probabilities and covariance matrix\n");
fprintf(ficresprobcov,"# Age");
+ fprintf(ficresprobcor, "#Local time at start: %s", strstart);
fprintf(ficresprobcor,"#One-step probabilities and correlation matrix\n");
fprintf(ficresprobcov,"# Age");
@@ -3975,8 +3997,8 @@ double gompertz(double x[])
/******************* Printing html file ***********/
void printinghtmlmort(char fileres[], char title[], char datafile[], int firstpass, \
int lastpass, int stepm, int weightopt, char model[],\
- int imx, double p[],double **matcov){
- int i;
+ int imx, double p[],double **matcov,double agemortsup){
+ int i,k;
fprintf(fichtm,"Result files
\n Force of mortality. Parameters of the Gompertz fit (with confidence interval in brackets):
");
fprintf(fichtm," mu(age) =%lf*exp(%lf*(age-%d)) per year
",p[1],p[2],agegomp);
@@ -3984,6 +4006,15 @@ void printinghtmlmort(char fileres[], ch
fprintf(fichtm," p[%d] = %lf [%f ; %f]
\n",i,p[i],p[i]-2*sqrt(matcov[i][i]),p[i]+2*sqrt(matcov[i][i]));
fprintf(fichtm,"
");
fprintf(fichtm,"
");
+
+fprintf(fichtm,"Life table
\n
");
+
+ fprintf(fichtm,"\nAge lx qx dx Lx Tx e(x)
");
+
+ for (k=agegomp;k<(agemortsup-2);k++)
+ fprintf(fichtm,"%d %.0lf %lf %.0lf %.0lf %.0lf %lf
\n",k,lsurv[k],p[1]*exp(p[2]*(k-agegomp)),(p[1]*exp(p[2]*(k-agegomp)))*lsurv[k],lpop[k],tpop[k],tpop[k]/lsurv[k]);
+
+
fflush(fichtm);
}
@@ -4051,6 +4082,8 @@ int main(int argc, char *argv[])
int mobilavproj=0 , prevfcast=0 ; /* moving average of prev, If prevfcast=1 prevalence projection */
int mobilav=0,popforecast=0;
int hstepm, nhstepm;
+ int agemortsup;
+ float sumlpop=0.;
double jprev1=1, mprev1=1,anprev1=2000,jprev2=1, mprev2=1,anprev2=2000;
double jpyram=1, mpyram=1,anpyram=2000,jpyram1=1, mpyram1=1,anpyram1=2000;
@@ -4589,7 +4622,7 @@ int main(int argc, char *argv[])
for (i=1; i<=imx; i++) {
agedc[i]=(moisdc[i]/12.+andc[i])-(moisnais[i]/12.+annais[i]);
for(m=firstpass; (m<= lastpass); m++){
- if(s[m][i] >0 || s[m][i]==-2){
+ if(s[m][i] >0 || s[m][i]==-2 || s[m][i]==-4 || s[m][i]==-5){
if (s[m][i] >= nlstate+1) {
if(agedc[i]>0)
if((int)moisdc[i]!=99 && (int)andc[i]!=9999)
@@ -4763,7 +4796,7 @@ Title=%s
Datafile=%s Firstpass=%d La
/* Calculates basic frequencies. Computes observed prevalence at single age
and prints on file fileres'p'. */
- freqsummary(fileres, agemin, agemax, s, agev, nlstate, imx,Tvaraff,nbcode, ncodemax,mint,anint);
+ freqsummary(fileres, agemin, agemax, s, agev, nlstate, imx,Tvaraff,nbcode, ncodemax,mint,anint,strstart);
fprintf(fichtm,"\n");
fprintf(fichtm,"
Total number of observations=%d
\n\
@@ -4855,12 +4888,47 @@ Interval (in months) between two waves:
printf("iter=%d MLE=%f Eq=%lf*exp(%lf*(age-%d))\n",iter,-gompertz(p),p[1],p[2],agegomp);
for (i=1;i<=NDIM;i++)
printf("%f [%f ; %f]\n",p[i],p[i]-2*sqrt(matcov[i][i]),p[i]+2*sqrt(matcov[i][i]));
+
+lsurv=vector(1,AGESUP);
+ lpop=vector(1,AGESUP);
+ tpop=vector(1,AGESUP);
+ lsurv[agegomp]=100000;
+
+ for (k=agegomp;k<=AGESUP;k++) {
+ agemortsup=k;
+ if (p[1]*exp(p[2]*(k-agegomp))>1) break;
+ }
+
+ for (k=agegomp;k=1 */
@@ -5120,6 +5188,7 @@ Interval (in months) between two waves:
}
printf("Computing stable prevalence: result on file '%s' \n", filerespl);
fprintf(ficlog,"Computing stable prevalence: result on file '%s' \n", filerespl);
+ fprintf(ficrespl, "#Local time at start: %s", strstart);
fprintf(ficrespl,"#Stable prevalence \n");
fprintf(ficrespl,"#Age ");
for(i=1; i<=nlstate;i++) fprintf(ficrespl,"%d-%d ",i,i);
@@ -5180,7 +5249,7 @@ Interval (in months) between two waves:
hstepm=hstepm/stepm; /* Typically 2 years, = 2/6 months = 4 */
/* hstepm=1; aff par mois*/
-
+ fprintf(ficrespij, "#Local time at start: %s", strstart);
fprintf(ficrespij,"#****** h Pij x Probability to be in state j at age x+h being in i at x ");
for(cptcov=1,k=0;cptcov<=i1;cptcov++){
for(cptcod=1;cptcod<=ncodemax[cptcov];cptcod++){
@@ -5217,7 +5286,7 @@ Interval (in months) between two waves:
}
}
- varprob(optionfilefiname, matcov, p, delti, nlstate, bage, fage,k,Tvar,nbcode, ncodemax);
+ varprob(optionfilefiname, matcov, p, delti, nlstate, bage, fage,k,Tvar,nbcode, ncodemax,strstart);
fclose(ficrespij);
@@ -5306,16 +5375,16 @@ Interval (in months) between two waves:
eij=ma3x(1,nlstate,1,nlstate,(int) bage, (int) fage);
oldm=oldms;savm=savms;
- evsij(fileres, eij, p, nlstate, stepm, (int) bage, (int)fage, oldm, savm, k, estepm, delti, matcov);
+ evsij(fileres, eij, p, nlstate, stepm, (int) bage, (int)fage, oldm, savm, k, estepm, delti, matcov, strstart);
vareij=ma3x(1,nlstate,1,nlstate,(int) bage, (int) fage);
oldm=oldms;savm=savms;
- varevsij(optionfilefiname, vareij, matcov, p, delti, nlstate, stepm, (int) bage, (int) fage, oldm, savm, prlim, ftolpl,k, estepm, cptcov,cptcod,0, mobilav);
+ varevsij(optionfilefiname, vareij, matcov, p, delti, nlstate, stepm, (int) bage, (int) fage, oldm, savm, prlim, ftolpl,k, estepm, cptcov,cptcod,0, mobilav, strstart);
if(popbased==1){
- varevsij(optionfilefiname, vareij, matcov, p, delti, nlstate, stepm, (int) bage, (int) fage, oldm, savm, prlim, ftolpl,k, estepm, cptcov,cptcod,popbased,mobilav);
+ varevsij(optionfilefiname, vareij, matcov, p, delti, nlstate, stepm, (int) bage, (int) fage, oldm, savm, prlim, ftolpl,k, estepm, cptcov,cptcod,popbased,mobilav, strstart);
}
-
+ fprintf(ficrest, "#Local time at start: %s", strstart);
fprintf(ficrest,"#Total LEs with variances: e.. (std) ");
for (i=1;i<=nlstate;i++) fprintf(ficrest,"e.%d (std) ",i);
fprintf(ficrest,"\n");
@@ -5388,7 +5457,7 @@ Interval (in months) between two waves:
varpl=matrix(1,nlstate,(int) bage, (int) fage);
oldm=oldms;savm=savms;
- varprevlim(fileres, varpl, matcov, p, delti, nlstate, stepm, (int) bage, (int) fage, oldm, savm, prlim, ftolpl,k);
+ varprevlim(fileres, varpl, matcov, p, delti, nlstate, stepm, (int) bage, (int) fage, oldm, savm, prlim, ftolpl,k,strstart);
free_matrix(varpl,1,nlstate,(int) bage, (int)fage);
}
}
@@ -5437,7 +5506,7 @@ Interval (in months) between two waves:
tm = *localtime(&end_time.tv_sec);
tmg = *gmtime(&end_time.tv_sec);
strcpy(strtend,asctime(&tm));
- printf("Local time at start %s\nLocaltime at end %s",strstart, strtend);
+ printf("Local time at start %s\nLocal time at end %s",strstart, strtend);
fprintf(ficlog,"Local time at start %s\nLocal time at end %s\n",strstart, strtend);
printf("Total time used %s\n", asc_diff_time(end_time.tv_sec -start_time.tv_sec,tmpout));