|
|
| version 1.131, 2009/06/20 16:22:47 | version 1.135, 2009/10/29 15:33:14 |
|---|---|
| Line 1 | Line 1 |
| /* $Id$ | /* $Id$ |
| $State$ | $State$ |
| $Log$ | $Log$ |
| 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 | Revision 1.131 2009/06/20 16:22:47 brouard |
| Some dimensions resccaled | Some dimensions resccaled |
| Line 168 | Line 180 |
| The same imach parameter file can be used but the option for mle should be -3. | 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 | 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. | 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 output is very simple: only an estimate of the intercept and of |
| Line 301 | Line 313 |
| Also this programme outputs the covariance matrix of the parameters but also | Also this programme outputs the covariance matrix of the parameters but also |
| of the life expectancies. It also computes the period (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). | Authors: Nicolas Brouard (brouard@ined.fr) and Agnès Lièvre (lievre@ined.fr). |
| Institut national d'études démographiques, Paris. | Institut national d'études démographiques, Paris. |
| This software have been partly granted by Euro-REVES, a concerted action | This software have been partly granted by Euro-REVES, a concerted action |
| from the European Union. | from the European Union. |
| It is copyrighted identically to a GNU software product, ie programme and | It is copyrighted identically to a GNU software product, ie programme and |
| Line 400 extern int errno; | Line 412 extern int errno; |
| /* $Id$ */ | /* $Id$ */ |
| /* $State$ */ | /* $State$ */ |
| char version[]="Imach version 0.98k, June 2006, INED-EUROREVES-Institut de longevite "; | char version[]="Imach version 0.98l, October 2009, INED-EUROREVES-Institut de longevite "; |
| char fullversion[]="$Revision$ $Date$"; | char fullversion[]="$Revision$ $Date$"; |
| char strstart[80]; | char strstart[80]; |
| char optionfilext[10], optionfilefiname[FILENAMELENGTH]; | char optionfilext[10], optionfilefiname[FILENAMELENGTH]; |
| int erreur=0, nberr=0, nbwarn=0; /* Error number, number of errors number of warnings */ | int erreur=0, nberr=0, nbwarn=0; /* Error number, number of errors number of warnings */ |
| int nvar=0; | int nvar=0, nforce=0; /* Number of variables, number of forces */ |
| int cptcovn=0, cptcovage=0, cptcoveff=0,cptcov=0; /* Number of covariates, of covariates with '*age' */ | int cptcovn=0, cptcovage=0, cptcoveff=0,cptcov=0; /* Number of covariates, of covariates with '*age' */ |
| int npar=NPARMAX; | int npar=NPARMAX; |
| int nlstate=2; /* Number of live states */ | int nlstate=2; /* Number of live states */ |
| Line 597 void replace_back_to_slash(char *s, char | Line 609 void replace_back_to_slash(char *s, char |
| } | } |
| } | } |
| char *trimbb(char *out, char *in) | |
| { /* Trim multiple blanks in line */ | |
| char *s; | |
| s=out; | |
| while (*in != '\0'){ | |
| while( *in == ' ' && *(in+1) == ' ' && *(in+1) != '\0'){ | |
| in++; | |
| } | |
| *out++ = *in++; | |
| } | |
| *out='\0'; | |
| return s; | |
| } | |
| int nbocc(char *s, char occ) | int nbocc(char *s, char occ) |
| { | { |
| int i,j=0; | int i,j=0; |
| Line 1692 double funcone( double *x) | Line 1718 double funcone( double *x) |
| ipmx +=1; | ipmx +=1; |
| sw += weight[i]; | sw += weight[i]; |
| ll[s[mw[mi][i]][i]] += 2*weight[i]*lli; | 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]); | /*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){ | if(globpr){ |
| fprintf(ficresilk,"%9d %6d %2d %2d %1d %1d %3d %11.6f %8.4f\ | fprintf(ficresilk,"%9d %6d %2d %2d %1d %1d %3d %11.6f %8.4f\ |
| %11.6f %11.6f %11.6f ", \ | %11.6f %11.6f %11.6f ", \ |
| Line 1897 double hessii(double x[], double delta, | Line 1923 double hessii(double x[], double delta, |
| int i; | int i; |
| int l=1, lmax=20; | int l=1, lmax=20; |
| double k1,k2; | double k1,k2; |
| double p2[NPARMAX+1]; | double p2[MAXPARM+1]; /* identical to x */ |
| double res; | double res; |
| double delt=0.0001, delts, nkhi=10.,nkhif=1., khi=1.e-4; | double delt=0.0001, delts, nkhi=10.,nkhif=1., khi=1.e-4; |
| double fx; | double fx; |
| Line 1918 double hessii(double x[], double delta, | Line 1944 double hessii(double x[], double delta, |
| /*res= (k1-2.0*fx+k2)/delt/delt; */ | /*res= (k1-2.0*fx+k2)/delt/delt; */ |
| res= (k1+k2)/delt/delt/2.; /* Divided by because L and not 2*L */ | res= (k1+k2)/delt/delt/2.; /* Divided by because L and not 2*L */ |
| #ifdef DEBUG | #ifdef DEBUGHESS |
| printf("%d %d k1=%.12e k2=%.12e xk1=%.12e xk2=%.12e delt=%.12e res=%.12e l=%d k=%d,fx=%.12e\n",theta,theta,k1,k2,x[theta]+delt,x[theta]-delt,delt,res, l, k,fx); | printf("%d %d k1=%.12e k2=%.12e xk1=%.12e xk2=%.12e delt=%.12e res=%.12e l=%d k=%d,fx=%.12e\n",theta,theta,k1,k2,x[theta]+delt,x[theta]-delt,delt,res, l, k,fx); |
| fprintf(ficlog,"%d %d k1=%.12e k2=%.12e xk1=%.12e xk2=%.12e delt=%.12e res=%.12e l=%d k=%d,fx=%.12e\n",theta,theta,k1,k2,x[theta]+delt,x[theta]-delt,delt,res, l, k,fx); | fprintf(ficlog,"%d %d k1=%.12e k2=%.12e xk1=%.12e xk2=%.12e delt=%.12e res=%.12e l=%d k=%d,fx=%.12e\n",theta,theta,k1,k2,x[theta]+delt,x[theta]-delt,delt,res, l, k,fx); |
| #endif | #endif |
| Line 1944 double hessij( double x[], double delti[ | Line 1970 double hessij( double x[], double delti[ |
| int i; | int i; |
| int l=1, l1, lmax=20; | int l=1, l1, lmax=20; |
| double k1,k2,k3,k4,res,fx; | double k1,k2,k3,k4,res,fx; |
| double p2[NPARMAX+1]; | double p2[MAXPARM+1]; |
| int k; | int k; |
| fx=func(x); | fx=func(x); |
| Line 2155 void freqsummary(char fileres[], int ia | Line 2181 void freqsummary(char fileres[], int ia |
| pos += freq[jk][m][i]; | pos += freq[jk][m][i]; |
| if(pp[jk]>=1.e-10){ | if(pp[jk]>=1.e-10){ |
| if(first==1){ | if(first==1){ |
| printf(" %d.=%.0f loss[%d]=%.1f%%",jk,pp[jk],jk,100*pos/pp[jk]); | 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]); | fprintf(ficlog," %d.=%.0f loss[%d]=%.1f%%",jk,pp[jk],jk,100*pos/pp[jk]); |
| }else{ | }else{ |
| Line 2464 void tricode(int *Tvar, int **nbcode, in | Line 2490 void tricode(int *Tvar, int **nbcode, in |
| } | } |
| for (i=0; i<=cptcode; i++) { /* i=-1 ?*/ | for (i=0; i<=cptcode; i++) { /* i=-1 ?*/ |
| if(Ndum[i]!=0) ncodemax[j]++; /* Nomber of modalities of the j th covariate. In fact ncodemax[j]=2 (dichotom. variables only) but it can be more */ | if(Ndum[i]!=0) ncodemax[j]++; /* Nomber of modalities of the j |
| th covariate. In fact | |
| ncodemax[j]=2 | |
| (dichotom. variables only) but | |
| it can be more */ | |
| } /* Ndum[-1] number of undefined modalities */ | } /* Ndum[-1] number of undefined modalities */ |
| ij=1; | ij=1; |
| Line 3458 To be simple, these graphs help to under | Line 3488 To be simple, these graphs help to under |
| /* Computing eigen value of matrix of covariance */ | /* Computing eigen value of matrix of covariance */ |
| lc1=((v1+v2)+sqrt((v1+v2)*(v1+v2) - 4*(v1*v2-cv12*cv12)))/2.; | 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.; | lc2=((v1+v2)-sqrt((v1+v2)*(v1+v2) - 4*(v1*v2-cv12*cv12)))/2.; |
| if ((lc2 <0) || (lc1 <0) ){ | |
| printf("Error: 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. Continuing by making them positive: WRONG RESULTS.\n", lc1, lc2, v1, v2, cv12, i, j, (int)age,fileresprobcov, fileresprobcor); | |
| fprintf(ficlog,"Error: 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", lc1, lc2, v1, v2, cv12);fflush(ficlog); | |
| lc1=fabs(lc1); | |
| lc2=fabs(lc2); | |
| } | |
| /* Eigen vectors */ | /* Eigen vectors */ |
| v11=(1./sqrt(1+(v1-lc1)*(v1-lc1)/cv12/cv12)); | v11=(1./sqrt(1+(v1-lc1)*(v1-lc1)/cv12/cv12)); |
| /*v21=sqrt(1.-v11*v11); *//* error */ | /*v21=sqrt(1.-v11*v11); *//* error */ |
| Line 4431 int main(int argc, char *argv[]) | Line 4468 int main(int argc, char *argv[]) |
| double ***mobaverage; | double ***mobaverage; |
| int *indx; | int *indx; |
| char line[MAXLINE], linepar[MAXLINE]; | char line[MAXLINE], linepar[MAXLINE]; |
| char path[MAXLINE],pathc[MAXLINE],pathcd[MAXLINE],pathtot[MAXLINE],model[MAXLINE]; | char linetmp[MAXLINE]; |
| char path[MAXLINE],pathc[MAXLINE],pathcd[MAXLINE],pathtot[MAXLINE],model[MAXLINE]; | |
| char pathr[MAXLINE], pathimach[MAXLINE]; | char pathr[MAXLINE], pathimach[MAXLINE]; |
| char **bp, *tok, *val; /* pathtot */ | char **bp, *tok, *val; /* pathtot */ |
| int firstobs=1, lastobs=10; | int firstobs=1, lastobs=10; |
| Line 4635 int main(int argc, char *argv[]) | Line 4673 int main(int argc, char *argv[]) |
| covar=matrix(0,NCOVMAX,1,n); | covar=matrix(0,NCOVMAX,1,n); |
| cptcovn=0; /*Number of covariates, i.e. number of '+' in model statement*/ | cptcovn=0; /*Number of covariates, i.e. number of '+' in model statement*/ |
| if (strlen(model)>1) cptcovn=nbocc(model,'+')+1; | if (strlen(model)>1) cptcovn=nbocc(model,'+')+1; |
| /* where is ncovprod ?*/ | |
| ncovmodel=2+cptcovn; /*Number of variables = cptcovn + intercept + age */ | ncovmodel=2+cptcovn; /*Number of variables = cptcovn + intercept + age : v1+v2+v3+v2*v4+v5*age makes 5+2=7*/ |
| nvar=ncovmodel-1; /* Suppressing age as a basic covariate */ | nvar=ncovmodel-1; /* Suppressing age as a basic covariate */ |
| npar= (nlstate+ndeath-1)*nlstate*ncovmodel; /* Number of parameters*/ | nforce= (nlstate+ndeath-1)*nlstate; /* Number of forces ij from state i to j */ |
| npar= nforce*ncovmodel; /* Number of parameters like aij*/ | |
| if(npar >MAXPARM || nlstate >NLSTATEMAX || ndeath >NDEATHMAX || ncovmodel>NCOVMAX){ | if(npar >MAXPARM || nlstate >NLSTATEMAX || ndeath >NDEATHMAX || ncovmodel>NCOVMAX){ |
| printf("Too complex model for current IMaCh: npar=(nlstate+ndeath-1)*nlstate*ncovmodel=%d >= %d(MAXPARM) or nlstate=%d >= %d(NLSTATEMAX) or ndeath=%d >= %d(NDEATHMAX) or ncovmodel=(k+age+#of+signs)=%d(NCOVMAX) >= %d\n",npar, MAXPARM, nlstate, NLSTATEMAX, ndeath, NDEATHMAX, ncovmodel, NCOVMAX); | printf("Too complex model for current IMaCh: npar=(nlstate+ndeath-1)*nlstate*ncovmodel=%d >= %d(MAXPARM) or nlstate=%d >= %d(NLSTATEMAX) or ndeath=%d >= %d(NDEATHMAX) or ncovmodel=(k+age+#of+signs)=%d(NCOVMAX) >= %d\n",npar, MAXPARM, nlstate, NLSTATEMAX, ndeath, NDEATHMAX, ncovmodel, NCOVMAX); |
| fprintf(ficlog,"Too complex model for current IMaCh: %d >=%d(MAXPARM) or %d >=%d(NLSTATEMAX) or %d >=%d(NDEATHMAX) or %d(NCOVMAX) >=%d\n",npar, MAXPARM, nlstate, NLSTATEMAX, ndeath, NDEATHMAX, ncovmodel, NCOVMAX); | fprintf(ficlog,"Too complex model for current IMaCh: %d >=%d(MAXPARM) or %d >=%d(NLSTATEMAX) or %d >=%d(NDEATHMAX) or %d(NCOVMAX) >=%d\n",npar, MAXPARM, nlstate, NLSTATEMAX, ndeath, NDEATHMAX, ncovmodel, NCOVMAX); |
| Line 4858 run imach with mle=-1 to get a correct t | Line 4897 run imach with mle=-1 to get a correct t |
| printf("Comment line\n%s\n",line); | printf("Comment line\n%s\n",line); |
| continue; | continue; |
| } | } |
| trimbb(linetmp,line); /* Trims multiple blanks in line */ | |
| for (j=0; line[j]!='\0';j++){ | |
| line[j]=linetmp[j]; | |
| } | |
| for (j=maxwav;j>=1;j--){ | for (j=maxwav;j>=1;j--){ |
| cutv(stra, strb,line,' '); | cutv(stra, strb,line,' '); |
| Line 4914 run imach with mle=-1 to get a correct t | Line 4958 run imach with mle=-1 to get a correct t |
| month=99; | month=99; |
| year=9999; | year=9999; |
| }else{ | }else{ |
| printf("Error reading data around '%s' at line number %ld %s for individual %d, '%s'\nShould be a date of birth (mm/yyyy or .). Exiting.\n",strb, linei,i,line,j); | printf("Error reading data around '%s' at line number %ld for individual %d, '%s'\nShould be a date of birth (mm/yyyy or .). Exiting.\n",strb, linei,i,line); |
| fprintf(ficlog,"Error reading data around '%s' at line number %ld %s for individual %d, '%s'\nShould be a date of birth (mm/yyyy or .). Exiting.\n",strb, linei,i,line,j);fflush(ficlog); | fprintf(ficlog,"Error reading data around '%s' at line number %ld for individual %d, '%s'\nShould be a date of birth (mm/yyyy or .). Exiting.\n",strb, linei,i,line);fflush(ficlog); |
| goto end; | |
| } | |
| if (year==9999) { | |
| printf("Error reading data around '%s' at line number %ld for individual %d, '%s'\nShould be a date of birth (mm/yyyy) but at least the year of birth should be given. Exiting.\n",strb, linei,i,line); | |
| fprintf(ficlog,"Error reading data around '%s' at line number %ld for individual %d, '%s'\nShould be a date of birth (mm/yyyy) but at least the year of birth should be given. Exiting.\n",strb, linei,i,line);fflush(ficlog); | |
| goto end; | goto end; |
| } | } |
| annais[i]=(double)(year); | annais[i]=(double)(year); |
| moisnais[i]=(double)(month); | moisnais[i]=(double)(month); |
| Line 5040 run imach with mle=-1 to get a correct t | Line 5090 run imach with mle=-1 to get a correct t |
| cptcovprod--; | cptcovprod--; |
| cutv(strb,stre,strd,'V'); | cutv(strb,stre,strd,'V'); |
| Tvar[i]=atoi(stre); /* V1+V3*age+V2 Tvar[2]=3 */ | Tvar[i]=atoi(stre); /* V1+V3*age+V2 Tvar[2]=3 */ |
| cptcovage++; /* Sum the number of covariates including ages as a product */ | cptcovage++; /* Sums the number of covariates including age as a product */ |
| Tage[cptcovage]=i; /* Tage[1] =2 */ | Tage[cptcovage]=i; /* Tage[1] =2 */ |
| /*printf("stre=%s ", stre);*/ | /*printf("stre=%s ", stre);*/ |
| } | } |
| Line 5141 run imach with mle=-1 to get a correct t | Line 5191 run imach with mle=-1 to get a correct t |
| agev[m][i]=1; | agev[m][i]=1; |
| else if(agev[m][i] <agemin){ | else if(agev[m][i] <agemin){ |
| agemin=agev[m][i]; | agemin=agev[m][i]; |
| /*printf(" Min anint[%d][%d]=%.2f annais[%d]=%.2f, agemin=%.2f\n",m,i,anint[m][i], i,annais[i], agemin);*/ | printf(" Min anint[%d][%d]=%.2f annais[%d]=%.2f, agemin=%.2f\n",m,i,anint[m][i], i,annais[i], agemin); |
| } | } |
| else if(agev[m][i] >agemax){ | else if(agev[m][i] >agemax){ |
| agemax=agev[m][i]; | agemax=agev[m][i]; |
| Line 5436 Interval (in months) between two waves: | Line 5486 Interval (in months) between two waves: |
| } /* Endof if mle==-3 */ | } /* Endof if mle==-3 */ |
| else{ /* For mle >=1 */ | else{ /* For mle >=1 */ |
| globpr=1;/* debug */ | globpr=0;/* debug */ |
| /* likelione(ficres, p, npar, nlstate, &globpr, &ipmx, &sw, &fretone, funcone);*/ /* Prints the contributions to the likelihood */ | likelione(ficres, p, npar, nlstate, &globpr, &ipmx, &sw, &fretone, funcone); /* Prints the contributions to the likelihood */ |
| printf("First Likeli=%12.6f ipmx=%ld sw=%12.6f",fretone,ipmx,sw); | printf("First Likeli=%12.6f ipmx=%ld sw=%12.6f",fretone,ipmx,sw); |
| for (k=1; k<=npar;k++) | for (k=1; k<=npar;k++) |
| printf(" %d %8.5f",k,p[k]); | printf(" %d %8.5f",k,p[k]); |