|
|
| version 1.297, 2019/05/22 17:56:10 | version 1.318, 2022/05/24 08:10:59 |
|---|---|
| Line 1 | Line 1 |
| /* $Id$ | /* $Id$ |
| $State$ | $State$ |
| $Log$ | $Log$ |
| Revision 1.318 2022/05/24 08:10:59 brouard | |
| * imach.c (Module): Some attempts to find a bug of wrong estimates | |
| of confidencce intervals with product in the equation modelC | |
| Revision 1.317 2022/05/15 15:06:23 brouard | |
| * imach.c (Module): Some minor improvements | |
| Revision 1.316 2022/05/11 15:11:31 brouard | |
| Summary: r27 | |
| Revision 1.315 2022/05/11 15:06:32 brouard | |
| *** empty log message *** | |
| Revision 1.314 2022/04/13 17:43:09 brouard | |
| * imach.c (Module): Adding link to text data files | |
| Revision 1.313 2022/04/11 15:57:42 brouard | |
| * imach.c (Module): Error in rewriting the 'r' file with yearsfproj or yearsbproj fixed | |
| Revision 1.312 2022/04/05 21:24:39 brouard | |
| *** empty log message *** | |
| Revision 1.311 2022/04/05 21:03:51 brouard | |
| Summary: Fixed quantitative covariates | |
| Fixed covariates (dummy or quantitative) | |
| with missing values have never been allowed but are ERRORS and | |
| program quits. Standard deviations of fixed covariates were | |
| wrongly computed. Mean and standard deviations of time varying | |
| covariates are still not computed. | |
| Revision 1.310 2022/03/17 08:45:53 brouard | |
| Summary: 99r25 | |
| Improving detection of errors: result lines should be compatible with | |
| the model. | |
| Revision 1.309 2021/05/20 12:39:14 brouard | |
| Summary: Version 0.99r24 | |
| Revision 1.308 2021/03/31 13:11:57 brouard | |
| Summary: Version 0.99r23 | |
| * imach.c (Module): Still bugs in the result loop. Thank to Holly Benett | |
| Revision 1.307 2021/03/08 18:11:32 brouard | |
| Summary: 0.99r22 fixed bug on result: | |
| Revision 1.306 2021/02/20 15:44:02 brouard | |
| Summary: Version 0.99r21 | |
| * imach.c (Module): Fix bug on quitting after result lines! | |
| (Module): Version 0.99r21 | |
| Revision 1.305 2021/02/20 15:28:30 brouard | |
| * imach.c (Module): Fix bug on quitting after result lines! | |
| Revision 1.304 2021/02/12 11:34:20 brouard | |
| * imach.c (Module): The use of a Windows BOM (huge) file is now an error | |
| Revision 1.303 2021/02/11 19:50:15 brouard | |
| * (Module): imach.c Someone entered 'results:' instead of 'result:'. Now it is an error which is printed. | |
| Revision 1.302 2020/02/22 21:00:05 brouard | |
| * (Module): imach.c Update mle=-3 (for computing Life expectancy | |
| and life table from the data without any state) | |
| Revision 1.301 2019/06/04 13:51:20 brouard | |
| Summary: Error in 'r'parameter file backcast yearsbproj instead of yearsfproj | |
| Revision 1.300 2019/05/22 19:09:45 brouard | |
| Summary: version 0.99r19 of May 2019 | |
| Revision 1.299 2019/05/22 18:37:08 brouard | |
| Summary: Cleaned 0.99r19 | |
| Revision 1.298 2019/05/22 18:19:56 brouard | |
| *** empty log message *** | |
| Revision 1.297 2019/05/22 17:56:10 brouard | Revision 1.297 2019/05/22 17:56:10 brouard |
| Summary: Fix bug by moving date2dmy and nhstepm which gaefin=-1 | Summary: Fix bug by moving date2dmy and nhstepm which gaefin=-1 |
| Line 1086 typedef struct { | Line 1166 typedef struct { |
| #define NINTERVMAX 8 | #define NINTERVMAX 8 |
| #define NLSTATEMAX 8 /**< Maximum number of live states (for func) */ | #define NLSTATEMAX 8 /**< Maximum number of live states (for func) */ |
| #define NDEATHMAX 8 /**< Maximum number of dead states (for func) */ | #define NDEATHMAX 8 /**< Maximum number of dead states (for func) */ |
| #define NCOVMAX 20 /**< Maximum number of covariates, including generated covariates V1*V2 */ | #define NCOVMAX 30 /**< Maximum number of covariates, including generated covariates V1*V2 */ |
| #define codtabm(h,k) (1 & (h-1) >> (k-1))+1 | #define codtabm(h,k) (1 & (h-1) >> (k-1))+1 |
| /*#define decodtabm(h,k,cptcoveff)= (h <= (1<<cptcoveff)?(((h-1) >> (k-1)) & 1) +1 : -1)*/ | /*#define decodtabm(h,k,cptcoveff)= (h <= (1<<cptcoveff)?(((h-1) >> (k-1)) & 1) +1 : -1)*/ |
| #define decodtabm(h,k,cptcoveff) (((h-1) >> (k-1)) & 1) +1 | #define decodtabm(h,k,cptcoveff) (((h-1) >> (k-1)) & 1) +1 |
| Line 1114 typedef struct { | Line 1194 typedef struct { |
| /* $State$ */ | /* $State$ */ |
| #include "version.h" | #include "version.h" |
| char version[]=__IMACH_VERSION__; | char version[]=__IMACH_VERSION__; |
| char copyright[]="April 2018,INED-EUROREVES-Institut de longevite-Japan Society for the Promotion of Science (Grant-in-Aid for Scientific Research 25293121), Intel Software 2015-2018"; | char copyright[]="May 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$ $Date$"; | char fullversion[]="$Revision$ $Date$"; |
| char strstart[80]; | char strstart[80]; |
| char optionfilext[10], optionfilefiname[FILENAMELENGTH]; | char optionfilext[10], optionfilefiname[FILENAMELENGTH]; |
| Line 1140 int nqtveff=0; /**< ntqveff number of ef | Line 1220 int nqtveff=0; /**< ntqveff number of ef |
| int cptcov=0; /* Working variable */ | int cptcov=0; /* Working variable */ |
| int nobs=10; /* Number of observations in the data lastobs-firstobs */ | int nobs=10; /* Number of observations in the data lastobs-firstobs */ |
| int ncovcombmax=NCOVMAX; /* Maximum calculated number of covariate combination = pow(2, cptcoveff) */ | int ncovcombmax=NCOVMAX; /* Maximum calculated number of covariate combination = pow(2, cptcoveff) */ |
| int npar=NPARMAX; | int npar=NPARMAX; /* Number of parameters (nlstate+ndeath-1)*nlstate*ncovmodel; */ |
| int nlstate=2; /* Number of live states */ | int nlstate=2; /* Number of live states */ |
| int ndeath=1; /* Number of dead 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 ncovmodel=0, ncovcol=0; /* Total number of covariables including constant a12*1 +b12*x ncovmodel=2 */ |
| Line 1296 double ***cotvar; /* Time varying covari | Line 1376 double ***cotvar; /* Time varying covari |
| double ***cotqvar; /* Time varying quantitative covariate itqv */ | double ***cotqvar; /* Time varying quantitative covariate itqv */ |
| double idx; | double idx; |
| int **nbcode, *Tvar; /**< model=V2 => Tvar[1]= 2 */ | int **nbcode, *Tvar; /**< model=V2 => Tvar[1]= 2 */ |
| /* 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 */ | /* V5+V4+V3+V4*V3+V5*age+V2+V1*V2+V1*age+V1 */ |
| /*k 1 2 3 4 5 6 7 8 9 */ | /*k 1 2 3 4 5 6 7 8 9 */ |
| /*Tvar[k]= 5 4 3 6 5 2 7 1 1 */ | /*Tvar[k]= 5 4 3 6 5 2 7 1 1 */ |
| Line 1319 int *TvarsDind; | Line 1403 int *TvarsDind; |
| int *TvarsQ; | int *TvarsQ; |
| int *TvarsQind; | int *TvarsQind; |
| #define MAXRESULTLINES 10 | #define MAXRESULTLINESPONE 10+1 |
| int nresult=0; | int nresult=0; |
| int parameterline=0; /* # of the parameter (type) line */ | int parameterline=0; /* # of the parameter (type) line */ |
| int TKresult[MAXRESULTLINES]; | int TKresult[MAXRESULTLINESPONE]; |
| int Tresult[MAXRESULTLINES][NCOVMAX];/* For dummy variable , value (output) */ | int Tresult[MAXRESULTLINESPONE][NCOVMAX];/* For dummy variable , value (output) */ |
| int Tinvresult[MAXRESULTLINES][NCOVMAX];/* For dummy variable , value (output) */ | int Tinvresult[MAXRESULTLINESPONE][NCOVMAX];/* For dummy variable , value (output) */ |
| int Tvresult[MAXRESULTLINES][NCOVMAX]; /* For dummy variable , variable # (output) */ | int Tvresult[MAXRESULTLINESPONE][NCOVMAX]; /* For dummy variable , variable # (output) */ |
| double Tqresult[MAXRESULTLINES][NCOVMAX]; /* For quantitative variable , value (output) */ | double Tqresult[MAXRESULTLINESPONE][NCOVMAX]; /* For quantitative variable , value (output) */ |
| double Tqinvresult[MAXRESULTLINES][NCOVMAX]; /* For quantitative variable , value (output) */ | double Tqinvresult[MAXRESULTLINESPONE][NCOVMAX]; /* For quantitative variable , value (output) */ |
| int Tvqresult[MAXRESULTLINES][NCOVMAX]; /* For quantitative variable , variable # (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 *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 *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 *TvarFind; /**< TvarFind[1]=6, TvarFind[2]=7, Tvarind[3]=9 in V5+V4+V3+V4*V3+V5*age+V2+V1*V2+V1*age+V1 */ |
| Line 1531 char *cutl(char *blocc, char *alocc, cha | Line 1619 char *cutl(char *blocc, char *alocc, cha |
| { | { |
| /* cuts string in into blocc and alocc where blocc ends before FIRST occurence of 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') | and alocc starts after first occurence of char 'occ' : ex cutv(blocc,alocc,"abcdef2ghi2j",'2') |
| gives blocc="abcdef" and alocc="ghi2j". | gives alocc="abcdef" and blocc="ghi2j". |
| If occ is not found blocc is null and alocc is equal to in. Returns blocc | If occ is not found blocc is null and alocc is equal to in. Returns blocc |
| */ | */ |
| char *s, *t; | char *s, *t; |
| Line 1813 char *subdirf(char fileres[]) | Line 1901 char *subdirf(char fileres[]) |
| /*************** function subdirf2 ***********/ | /*************** function subdirf2 ***********/ |
| char *subdirf2(char fileres[], char *preop) | 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 */ | /* Caution optionfilefiname is hidden */ |
| strcpy(tmpout,optionfilefiname); | strcpy(tmpout,optionfilefiname); |
| strcat(tmpout,"/"); | strcat(tmpout,"/"); |
| Line 2184 void linmin(double p[], double xi[], int | Line 2274 void linmin(double p[], double xi[], int |
| #endif | #endif |
| #ifdef LINMINORIGINAL | #ifdef LINMINORIGINAL |
| #else | #else |
| if(fb == fx){ /* Flat function in the direction */ | if(fb == fx){ /* Flat function in the direction */ |
| xmin=xx; | xmin=xx; |
| *flat=1; | *flat=1; |
| }else{ | }else{ |
| *flat=0; | *flat=0; |
| #endif | #endif |
| /*Flat mnbrak2 shift (*ax=0.000000000000, *fa=51626.272983130431), (*bx=-1.618034000000, *fb=51590.149499362531), (*cx=-4.236068025156, *fc=51590.149499362531) */ | /*Flat mnbrak2 shift (*ax=0.000000000000, *fa=51626.272983130431), (*bx=-1.618034000000, *fb=51590.149499362531), (*cx=-4.236068025156, *fc=51590.149499362531) */ |
| Line 2245 void linmin(double p[], double xi[], int | Line 2335 void linmin(double p[], double xi[], int |
| /*************** powell ************************/ | /*************** powell ************************/ |
| /* | /* |
| Minimization of a function func of n variables. Input consists of an initial starting point | 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- | 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 | 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 on one iteration signals doneness. On | 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 | 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. | function value at p , and iter is the number of iterations taken. The routine linmin is used. |
| */ | */ |
| Line 2403 void powell(double p[], double **xi, int | Line 2493 void powell(double p[], double **xi, int |
| /* But p and xit have been updated at the end of linmin, *fret corresponds to new p, xit */ | /* 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) */ | /* New value of last point Pn is not computed, P(n-1) */ |
| for(j=1;j<=n;j++) { | for(j=1;j<=n;j++) { |
| if(flatdir[j] >0){ | if(flatdir[j] >0){ |
| printf(" p(%d)=%lf flat=%d ",j,p[j],flatdir[j]); | printf(" p(%d)=%lf flat=%d ",j,p[j],flatdir[j]); |
| fprintf(ficlog," p(%d)=%lf flat=%d ",j,p[j],flatdir[j]); | fprintf(ficlog," p(%d)=%lf flat=%d ",j,p[j],flatdir[j]); |
| } | } |
| /* printf("\n"); */ | /* printf("\n"); */ |
| /* fprintf(ficlog,"\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*(fabs(fp)+fabs(*fret))) { /\* Did we reach enough precision? *\/ */ |
| if (2.0*fabs(fp-(*fret)) <= ftol) { /* 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 */ | /* We could compare with a chi^2. chisquare(0.95,ddl=1)=3.84 */ |
| Line 2729 void powell(double p[], double **xi, int | Line 2819 void powell(double p[], double **xi, int |
| if(!first){ | if(!first){ |
| first=1; | 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); | 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++; | |
| } | } |
| 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); | |
| /* 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); */ | /* 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(min,1,nlstate); |
| Line 2899 void powell(double p[], double **xi, int | Line 2997 void powell(double p[], double **xi, int |
| maxmax=0.; | maxmax=0.; |
| for(i=1; i<=nlstate; i++){ | for(i=1; i<=nlstate; i++){ |
| meandiff[i]=(max[i]-min[i])/(max[i]+min[i])*2.; /* mean difference for each column */ | meandiff[i]=(max[i]-min[i])/(max[i]+min[i])*2.; /* mean difference for each column, could be nan! */ |
| maxmax=FMAX(maxmax,meandiff[i]); | maxmax=FMAX(maxmax,meandiff[i]); |
| /* printf("Back age= %d meandiff[%d]=%f, agefin=%d max[%d]=%f min[%d]=%f maxmax=%f\n", (int)age, i, meandiff[i],(int)agefin, i, max[i], i, min[i],maxmax); */ | /* printf("Back age= %d meandiff[%d]=%f, agefin=%d max[%d]=%f min[%d]=%f maxmax=%f\n", (int)age, i, meandiff[i],(int)agefin, i, max[i], i, min[i],maxmax); */ |
| } /* i loop */ | } /* i loop */ |
| Line 3018 double **pmij(double **ps, double *cov, | Line 3116 double **pmij(double **ps, double *cov, |
| /* double **bmij(double **ps, double *cov, int ncovmodel, double *x, int nlstate, double ***prevacurrent, double ***dnewm, double **doldm, double **dsavm, int ij ) */ | /* double **bmij(double **ps, double *cov, int ncovmodel, double *x, int nlstate, double ***prevacurrent, double ***dnewm, double **doldm, double **dsavm, int ij ) */ |
| double **bmij(double **ps, double *cov, int ncovmodel, double *x, int nlstate, double ***prevacurrent, int ij ) | double **bmij(double **ps, double *cov, int ncovmodel, double *x, int nlstate, double ***prevacurrent, int ij ) |
| { | { |
| /* Computes the backward probability at age agefin and covariate combination ij. In fact cov is already filled and x too. | /* Computes the backward probability at age agefin, cov[2], and covariate combination 'ij'. In fact cov is already filled and x too. |
| * Call to pmij(cov and x), call to cross prevalence, sums and inverses, left multiply, and returns in **ps as well as **bmij. | * Call to pmij(cov and x), call to cross prevalence, sums and inverses, left multiply, and returns in **ps as well as **bmij. |
| */ | */ |
| int i, ii, j,k; | int i, ii, j,k; |
| Line 3033 double **pmij(double **ps, double *cov, | Line 3131 double **pmij(double **ps, double *cov, |
| doldm=ddoldms; /* global pointers */ | doldm=ddoldms; /* global pointers */ |
| dnewm=ddnewms; | dnewm=ddnewms; |
| dsavm=ddsavms; | dsavm=ddsavms; |
| /* Debug */ | |
| /* printf("Bmij ij=%d, cov[2}=%f\n", ij, cov[2]); */ | |
| agefin=cov[2]; | agefin=cov[2]; |
| /* Bx = Diag(w_x) P_x Diag(Sum_i w^i_x p^ij_x */ | /* Bx = Diag(w_x) P_x Diag(Sum_i w^i_x p^ij_x */ |
| /* bmij *//* age is cov[2], ij is included in cov, but we need for | /* bmij *//* age is cov[2], ij is included in cov, but we need for |
| Line 3357 double ***hbxij(double ***po, int nhstep | Line 3457 double ***hbxij(double ***po, int nhstep |
| cov[1]=1.; | 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) )*stepm/YEARM; /* age just before transition, d or d-1? */ |
| /* agexact=age+((h-1)*hstepm + (d-1))*stepm/YEARM; /\* age just before transition *\/ */ | /* 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; | cov[2]=agexact; |
| if(nagesqr==1) | if(nagesqr==1) |
| cov[3]= agexact*agexact; | cov[3]= agexact*agexact; |
| Line 3508 double func( double *x) | Line 3610 double func( double *x) |
| if(nagesqr==1) | if(nagesqr==1) |
| cov[3]= agexact*agexact; /* Should be changed here */ | cov[3]= agexact*agexact; /* Should be changed here */ |
| for (kk=1; kk<=cptcovage;kk++) { | for (kk=1; kk<=cptcovage;kk++) { |
| if(!FixedV[Tvar[Tage[kk]]]) | if(!FixedV[Tvar[Tage[kk]]]) |
| cov[Tage[kk]+2+nagesqr]=covar[Tvar[Tage[kk]]][i]*agexact; /* Tage[kk] gives the data-covariate associated with age */ | cov[Tage[kk]+2+nagesqr]=covar[Tvar[Tage[kk]]][i]*agexact; /* Tage[kk] gives the data-covariate associated with age */ |
| else | else |
| cov[Tage[kk]+2+nagesqr]=cotvar[mw[mi][i]][Tvar[Tage[kk]]-ncovcol-nqv][i]*agexact; | cov[Tage[kk]+2+nagesqr]=cotvar[mw[mi][i]][Tvar[Tage[kk]]-ncovcol-nqv][i]*agexact; |
| } | } |
| out=matprod2(newm,oldm,1,nlstate+ndeath,1,nlstate+ndeath, | out=matprod2(newm,oldm,1,nlstate+ndeath,1,nlstate+ndeath, |
| 1,nlstate+ndeath,pmij(pmmij,cov,ncovmodel,x,nlstate)); | 1,nlstate+ndeath,pmij(pmmij,cov,ncovmodel,x,nlstate)); |
| Line 3798 double funcone( double *x) | Line 3900 double funcone( double *x) |
| /* Fixed */ | /* Fixed */ |
| /* for (k=1; k<=cptcovn;k++) cov[2+nagesqr+k]=covar[Tvar[k]][i]; */ | /* for (k=1; k<=cptcovn;k++) cov[2+nagesqr+k]=covar[Tvar[k]][i]; */ |
| /* for (k=1; k<=ncoveff;k++){ /\* Simple and product fixed Dummy covariates without age* products *\/ */ | /* for (k=1; k<=ncoveff;k++){ /\* Simple and product fixed Dummy covariates without age* products *\/ */ |
| for (k=1; k<=ncovf;k++){ /* Simple and product fixed covariates without age* products */ | for (k=1; k<=ncovf;k++){ /* Simple and product fixed covariates without age* products *//* Missing values are set to -1 but should be dropped */ |
| cov[ioffset+TvarFind[k]]=covar[Tvar[TvarFind[k]]][i];/* V5+V4+V3+V4*V3+V5*age+V2+V1*V2+V1*age+V1, only V1 is fixed (k=6)*/ | cov[ioffset+TvarFind[k]]=covar[Tvar[TvarFind[k]]][i];/* V5+V4+V3+V4*V3+V5*age+V2+V1*V2+V1*age+V1, only V1 is fixed (k=6)*/ |
| /* cov[ioffset+TvarFind[1]]=covar[Tvar[TvarFind[1]]][i]; */ | /* cov[ioffset+TvarFind[1]]=covar[Tvar[TvarFind[1]]][i]; */ |
| /* cov[2+6]=covar[Tvar[6]][i]; */ | /* cov[2+6]=covar[Tvar[6]][i]; */ |
| Line 4653 Title=%s <br>Datafile=%s Firstpass=%d La | Line 4755 Title=%s <br>Datafile=%s Firstpass=%d La |
| if(s[m][iind]==-1) | if(s[m][iind]==-1) |
| printf(" num=%ld m=%d, iind=%d s1=%d s2=%d agev at m=%d agebegin=%.2f ageend=%.2f, agemed=%d\n", num[iind], m, iind,s[m][iind],s[m+1][iind], (int)agev[m][iind],agebegin, ageend, (int)((agebegin+ageend)/2.)); | printf(" num=%ld m=%d, iind=%d s1=%d s2=%d agev at m=%d agebegin=%.2f ageend=%.2f, agemed=%d\n", num[iind], m, iind,s[m][iind],s[m+1][iind], (int)agev[m][iind],agebegin, ageend, (int)((agebegin+ageend)/2.)); |
| freq[s[m][iind]][s[m+1][iind]][(int)agev[m][iind]] += weight[iind]; /* At age of beginning of transition, where status is known */ | freq[s[m][iind]][s[m+1][iind]][(int)agev[m][iind]] += weight[iind]; /* At age of beginning of transition, where status is known */ |
| for (z1=1; z1<= nqfveff; z1++) { /* Quantitative variables, calculating mean */ | for (z1=1; z1<= nqfveff; z1++) { /* Quantitative variables, calculating mean on known values only */ |
| idq[z1]=idq[z1]+weight[iind]; | if(!isnan(covar[ncovcol+z1][iind])){ |
| meanq[z1]+=covar[ncovcol+z1][iind]*weight[iind]; /* Computes mean of quantitative with selected filter */ | idq[z1]=idq[z1]+weight[iind]; |
| stdq[z1]+=covar[ncovcol+z1][iind]*covar[ncovcol+z1][iind]*weight[iind]*weight[iind]; /* *weight[iind];*/ /* Computes mean of quantitative with selected filter */ | 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]; *//*error*/ | |
| stdq[z1]+=covar[ncovcol+z1][iind]*covar[ncovcol+z1][iind]*weight[iind]; /* *weight[iind];*/ /* Computes mean of quantitative with selected filter */ | |
| } | |
| } | } |
| /* if((int)agev[m][iind] == 55) */ | /* if((int)agev[m][iind] == 55) */ |
| /* printf("j=%d, j1=%d Age %d, iind=%d, num=%09ld m=%d\n",j,j1,(int)agev[m][iind],iind, num[iind],m); */ | /* printf("j=%d, j1=%d Age %d, iind=%d, num=%09ld m=%d\n",j,j1,(int)agev[m][iind],iind, num[iind],m); */ |
| Line 4719 Title=%s <br>Datafile=%s Firstpass=%d La | Line 4824 Title=%s <br>Datafile=%s Firstpass=%d La |
| Printing means of quantitative variables if any | Printing means of quantitative variables if any |
| */ | */ |
| for (z1=1; z1<= nqfveff; z1++) { | for (z1=1; z1<= nqfveff; z1++) { |
| fprintf(ficlog,"Mean of fixed quantitative variable V%d on %.0f individuals sum=%f", ncovcol+z1, idq[z1], meanq[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]); | fprintf(ficlog,", mean=%.3g\n",meanq[z1]/idq[z1]); |
| if(weightopt==1){ | if(weightopt==1){ |
| printf(" Weighted mean and standard deviation of"); | printf(" Weighted mean and standard deviation of"); |
| fprintf(ficlog," Weighted mean and standard deviation of"); | fprintf(ficlog," Weighted mean and standard deviation of"); |
| fprintf(ficresphtmfr," Weighted mean and standard deviation of"); | fprintf(ficresphtmfr," Weighted mean and standard deviation of"); |
| } | } |
| printf(" fixed quantitative variable V%d on %.0f representatives of the population : %6.3g (%6.3g)\n", ncovcol+z1, idq[z1],meanq[z1]/idq[z1], sqrt((stdq[z1]-meanq[z1]*meanq[z1]/idq[z1])/idq[z1])); | /* mu = \frac{w x}{\sum w} |
| fprintf(ficlog," fixed quantitative variable V%d on %.0f representatives of the population : %6.3g (%6.3g)\n", ncovcol+z1, idq[z1],meanq[z1]/idq[z1], sqrt((stdq[z1]-meanq[z1]*meanq[z1]/idq[z1])/idq[z1])); | var = \frac{\sum w (x-mu)^2}{\sum w} = \frac{w x^2}{\sum w} - mu^2 |
| fprintf(ficresphtmfr," fixed quantitative variable V%d on %.0f representatives of the population : %6.3g (%6.3g)<p>\n", ncovcol+z1, idq[z1],meanq[z1]/idq[z1], sqrt((stdq[z1]-meanq[z1]*meanq[z1]/idq[z1])/idq[z1])); | */ |
| 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)<p>\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 (z1=1; z1<= nqtveff; z1++) { */ |
| /* for(m=1;m<=lastpass;m++){ */ | /* for(m=1;m<=lastpass;m++){ */ |
| Line 5206 void prevalence(double ***probs, double | Line 5314 void prevalence(double ***probs, double |
| 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) | 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. | /* 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). | 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 | 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] | 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. | 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 i=0, mi=0, m=0, mli=0; |
| Line 5231 void concatwav(int wav[], int **dh, int | Line 5339 void concatwav(int wav[], int **dh, int |
| for(i=1; i<=imx; i++){ /* For simple cases and if state is death */ | for(i=1; i<=imx; i++){ /* For simple cases and if state is death */ |
| mi=0; /* First valid wave */ | mi=0; /* First valid wave */ |
| mli=0; /* Last valid wave */ | mli=0; /* Last valid wave */ |
| m=firstpass; | m=firstpass; /* Loop on waves */ |
| while(s[m][i] <= nlstate){ /* a live state */ | 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 */ | 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; */ | 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 */ | }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; | mw[++mi][i]=m; /* Valid wave: incrementing mi and updating mi; mw[mi] is the wave number of mi_th valid transition */ |
| mli=m; | mli=m; |
| } /* else might be a useless wave -1 and mi is not incremented and mw[mi] not updated */ | } /* else might be a useless wave -1 and mi is not incremented and mw[mi] not updated */ |
| if(m < lastpass){ /* m < lastpass, standard case */ | 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 */ | 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 */ | else{ /* m = lastpass, eventual special issue with warning */ |
| #ifdef UNKNOWNSTATUSNOTCONTRIBUTING | #ifdef UNKNOWNSTATUSNOTCONTRIBUTING |
| break; | break; |
| #else | #else |
| if(s[m][i]==-1 && (int) andc[i] == 9999 && (int)anint[m][i] != 9999){ | 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){ | 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); | 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; | 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++; | |
| } | } |
| 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); | mw[++mi][i]=m; /* Valid transition with unknown status */ |
| mw[++mi][i]=m; | |
| mli=m; | mli=m; |
| } | } |
| if(s[m][i]==-2){ /* Vital status is really unknown */ | if(s[m][i]==-2){ /* Vital status is really unknown */ |
| nbwarn++; | nbwarn++; |
| if((int)anint[m][i] == 9999){ /* Has the vital status really been verified? */ | 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); | 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); | 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); |
| } | } |
| Line 5282 void concatwav(int wav[], int **dh, int | Line 5398 void concatwav(int wav[], int **dh, int |
| #ifndef DISPATCHINGKNOWNDEATHAFTERLASTWAVE | #ifndef DISPATCHINGKNOWNDEATHAFTERLASTWAVE |
| else if ((int) andc[i] != 9999) { /* Date of death is known */ | else if ((int) andc[i] != 9999) { /* Date of death is known */ |
| if ((int)anint[m][i]!= 9999) { /* date of last interview 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.)){ /* death occured before last wave and status should have been death instead of -1 */ | 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++; | nbwarn++; |
| if(firstfiv==0){ | if(firstfiv==0){ |
| printf("Warning! Death for individual %ld line=%d occurred at %d/%d before last wave %d interviewed at %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 ); | 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; | firstfiv=1; |
| }else{ | }else{ |
| fprintf(ficlog,"Warning! Death for individual %ld line=%d occurred at %d/%d before last wave %d interviewed at %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 ); | 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 ); |
| } | } |
| }else{ /* Death occured afer last wave potential bias */ | 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++; | nberr++; |
| if(firstwo==0){ | if(firstwo==0){ |
| printf("Error! Death for individual %ld line=%d occurred at %d/%d after last wave %d interviewed at %d/%d. Potential bias if other individuals are still alive at this date but ignored. This case (%d)/wave (%d) is skipped, no contribution to likelihood. Please add a new fictive wave at the date of last vital status scan, with a dead status or alive but unknown state status (-1). 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], i,m ); | 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; | firstwo=1; |
| } | } |
| fprintf(ficlog,"Error! Death for individual %ld line=%d occurred at %d/%d after last wave %d interviewed at %d/%d. Potential bias if other individuals are still alive at this date but ignored. This case (%d)/wave (%d) is skipped, no contribution to likelihood. Please add a new fictive wave at the date of last vital status scan, with a dead status or alive but unknown state status (-1). See documentation\n\n",num[i],i,(int) moisdc[i], (int) andc[i], lastpass,(int)mint[m][i],(int)anint[m][i], i,m ); | fprintf(ficlog,"Error! Death for individual %ld line=%d occurred 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 */ | }else{ /* if date of interview is unknown */ |
| /* death is known but not confirmed by death status at any wave */ | /* death is known but not confirmed by death status at any wave */ |
| if(firstfour==0){ | 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. Potential bias if other individuals are still alive at this date but ignored. This case (%d)/wave (%d) is skipped, no contribution to likelihood.\nOthers in log file only\n",num[i],i,(int) moisdc[i], (int) andc[i], lastpass,(int)mint[m][i],(int)anint[m][i], i,m ); | 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; | 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. 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], i,m ); | 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 */ | } /* end if date of death is known */ |
| #endif | #endif |
| wav[i]=mi; /* mi should be the last effective wave (or mli) */ | wav[i]=mi; /* mi should be the last effective wave (or mli), */ |
| /* wav[i]=mw[mi][i]; */ | /* wav[i]=mw[mi][i]; */ |
| if(mi==0){ | if(mi==0){ |
| nbwarn++; | nbwarn++; |
| if(first==0){ | if(first==0){ |
| Line 5323 void concatwav(int wav[], int **dh, int | Line 5440 void concatwav(int wav[], int **dh, int |
| } /* End individuals */ | } /* End individuals */ |
| /* wav and mw are no more changed */ | /* 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(i=1; i<=imx; i++){ |
| for(mi=1; mi<wav[i];mi++){ | for(mi=1; mi<wav[i];mi++){ |
| if (stepm <=0) | if (stepm <=0) |
| Line 5444 void concatwav(int wav[], int **dh, int | Line 5564 void concatwav(int wav[], int **dh, int |
| if(Dummy[k]==0 && Typevar[k] !=1){ /* Dummy covariate and not age product */ | if(Dummy[k]==0 && Typevar[k] !=1){ /* Dummy covariate and not age product */ |
| switch(Fixed[k]) { | switch(Fixed[k]) { |
| case 0: /* Testing on fixed dummy covariate, simple or product of fixed */ | 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*/ | 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=(int)(covar[Tvar[k]][i]); |
| /* ij=0 or 1 or -1. Value of the covariate Tvar[j] for individual i | /* ij=0 or 1 or -1. Value of the covariate Tvar[j] for individual i |
| Line 5457 void concatwav(int wav[], int **dh, int | Line 5579 void concatwav(int wav[], int **dh, int |
| else if (ij < modmincovj) | else if (ij < modmincovj) |
| modmincovj=ij; | modmincovj=ij; |
| if (ij <0 || ij >1 ){ | if (ij <0 || ij >1 ){ |
| printf("Information, IMaCh doesn't treat covariate with missing values (-1), individual %d will be skipped.\n",i); | printf("ERROR, IMaCh doesn't treat covariate with missing values V%d=-1, individual %d will be skipped.\n",Tvar[k],i); |
| fprintf(ficlog,"Information, currently IMaCh doesn't treat covariate with missing values (-1), individual %d will be skipped.\n",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)){ | if ((ij < -1) || (ij > NCOVMAX)){ |
| printf( "Error: minimal is less than -1 or maximal is bigger than %d. Exiting. \n", NCOVMAX ); | printf( "Error: minimal is less than -1 or maximal is bigger than %d. Exiting. \n", NCOVMAX ); |
| Line 5533 void concatwav(int wav[], int **dh, int | Line 5657 void concatwav(int wav[], int **dh, int |
| break; | break; |
| } /* end switch */ | } /* end switch */ |
| } /* end dummy test */ | } /* 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*/ | } /* 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; | for (k=-1; k< maxncov; k++) Ndum[k]=0; |
| Line 6641 To be simple, these graphs help to under | Line 6775 To be simple, these graphs help to under |
| /* nbcode[1][1]=0 nbcode[1][2]=1;*/ | /* nbcode[1][1]=0 nbcode[1][2]=1;*/ |
| } | } |
| /* for (k=1; k<=cptcovage;k++) cov[2+Tage[k]]=cov[2+Tage[k]]*cov[2]; */ | /* for (k=1; k<=cptcovage;k++) cov[2+Tage[k]]=cov[2+Tage[k]]*cov[2]; */ |
| for (k=1; k<=cptcovage;k++) cov[2+Tage[k]]=nbcode[Tvar[Tage[k]]][codtabm(ij,k)]*cov[2]; | for (k=1; k<=cptcovage;k++) cov[2+Tage[k]+nagesqr]=nbcode[Tvar[Tage[k]]][codtabm(ij,k)]*cov[2]; |
| for (k=1; k<=cptcovprod;k++) | for (k=1; k<=cptcovprod;k++) |
| cov[2+nagesqr+Tprod[k]]=nbcode[Tvard[k][1]][codtabm(ij,k)]*nbcode[Tvard[k][2]][codtabm(ij,k)]; | cov[2+nagesqr+Tprod[k]]=nbcode[Tvard[k][1]][codtabm(ij,k)]*nbcode[Tvard[k][2]][codtabm(ij,k)]; |
| Line 6890 void printinghtml(char fileresu[], char | Line 7024 void printinghtml(char fileresu[], char |
| m=pow(2,cptcoveff); | m=pow(2,cptcoveff); |
| if (cptcovn < 1) {m=1;ncodemax[1]=1;} | if (cptcovn < 1) {m=1;ncodemax[1]=1;} |
| fprintf(fichtm," \n<ul><li><b>Graphs</b></li><p>"); | fprintf(fichtm," \n<ul><li><b>Graphs (first order)</b></li><p>"); |
| jj1=0; | jj1=0; |
| Line 6925 void printinghtml(char fileresu[], char | Line 7059 void printinghtml(char fileresu[], char |
| fprintf(fichtm,"</a></li>"); | fprintf(fichtm,"</a></li>"); |
| } /* cptcovn >0 */ | } /* cptcovn >0 */ |
| } | } |
| fprintf(fichtm," \n</ul>"); | fprintf(fichtm," \n</ul>"); |
| jj1=0; | jj1=0; |
| Line 7004 divided by h: <sub>h</sub>P<sub>ij</sub> | Line 7138 divided by h: <sub>h</sub>P<sub>ij</sub> |
| if(prevfcast==1){ | if(prevfcast==1){ |
| /* Projection of prevalence up to period (forward stable) prevalence in each health state */ | /* Projection of prevalence up to period (forward stable) prevalence in each health state */ |
| for(cpt=1; cpt<=nlstate;cpt++){ | for(cpt=1; cpt<=nlstate;cpt++){ |
| fprintf(fichtm,"<br>\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). <a href=\"%s_%d-%d-%d.svg\">%s_%d-%d-%d.svg</a><br> \ | fprintf(fichtm,"<br>\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). <a href=\"%s_%d-%d-%d.svg\">%s_%d-%d-%d.svg</a>", dateprev1, dateprev2, mobilavproj, dateprojd, dateprojf, cpt, cpt, nlstate, subdirf2(optionfilefiname,"PROJ_"),cpt,k1,nres,subdirf2(optionfilefiname,"PROJ_"),cpt,k1,nres); |
| <img src=\"%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,subdirf2(optionfilefiname,"PROJ_"),cpt,k1,nres); | fprintf(fichtm," (data from text file <a href=\"%s.txt\">%s.txt</a>)\n<br>",subdirf2(optionfilefiname,"F_"),subdirf2(optionfilefiname,"F_")); |
| fprintf(fichtm,"<img src=\"%s_%d-%d-%d.svg\">", | |
| subdirf2(optionfilefiname,"PROJ_"),cpt,k1,nres); | |
| } | } |
| } | } |
| if(prevbcast==1){ | if(prevbcast==1){ |
| Line 7014 divided by h: <sub>h</sub>P<sub>ij</sub> | Line 7150 divided by h: <sub>h</sub>P<sub>ij</sub> |
| fprintf(fichtm,"<br>\n- Back projection of cross-sectional prevalence (estimated with cases observed from %.1f to %.1f and mobil_average=%d), \ | fprintf(fichtm,"<br>\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 \ | 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) \ | 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. <a href=\"%s_%d-%d-%d.svg\">%s_%d-%d-%d.svg</a><br> \ | with weights corresponding to observed prevalence at different ages. <a href=\"%s_%d-%d-%d.svg\">%s_%d-%d-%d.svg</a>", dateprev1, dateprev2, mobilavproj, dateback1, dateback2, cpt, cpt, nlstate, subdirf2(optionfilefiname,"PROJB_"),cpt,k1,nres,subdirf2(optionfilefiname,"PROJB_"),cpt,k1,nres); |
| <img src=\"%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,subdirf2(optionfilefiname,"PROJB_"),cpt,k1,nres); | fprintf(fichtm," (data from text file <a href=\"%s.txt\">%s.txt</a>)\n<br>",subdirf2(optionfilefiname,"FB_"),subdirf2(optionfilefiname,"FB_")); |
| fprintf(fichtm," <img src=\"%s_%d-%d-%d.svg\">", subdirf2(optionfilefiname,"PROJB_"),cpt,k1,nres); | |
| } | } |
| } | } |
| for(cpt=1; cpt<=nlstate;cpt++) { | for(cpt=1; cpt<=nlstate;cpt++) { |
| fprintf(fichtm,"\n<br>- 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): <a href=\"%s_%d-%d-%d.svg\">%s_%d-%d-%d.svg</a> <br> \ | fprintf(fichtm,"\n<br>- 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): <a href=\"%s_%d-%d-%d.svg\">%s_%d-%d-%d.svg</a>",cpt,nlstate,subdirf2(optionfilefiname,"EXP_"),cpt,k1,nres,subdirf2(optionfilefiname,"EXP_"),cpt,k1,nres); |
| <img src=\"%s_%d-%d-%d.svg\">",cpt,nlstate,subdirf2(optionfilefiname,"EXP_"),cpt,k1,nres,subdirf2(optionfilefiname,"EXP_"),cpt,k1,nres,subdirf2(optionfilefiname,"EXP_"),cpt,k1,nres); | fprintf(fichtm," (data from text file <a href=\"%s.txt\"> %s.txt</a>)\n<br>",subdirf2(optionfilefiname,"E_"),subdirf2(optionfilefiname,"E_")); |
| fprintf(fichtm,"<img src=\"%s_%d-%d-%d.svg\">", subdirf2(optionfilefiname,"EXP_"),cpt,k1,nres ); | |
| } | } |
| /* } /\* end i1 *\/ */ | /* } /\* end i1 *\/ */ |
| }/* End k1 */ | }/* End k1 */ |
| Line 7073 See page 'Matrix of variance-covariance | Line 7211 See page 'Matrix of variance-covariance |
| /* else */ | /* else */ |
| /* fprintf(fichtm,"\n No population forecast: popforecast = %d (instead of 1) or stepm = %d (instead of 1) or model=%s (instead of .)<br><br></li>\n",popforecast, stepm, model); */ | /* fprintf(fichtm,"\n No population forecast: popforecast = %d (instead of 1) or stepm = %d (instead of 1) or model=%s (instead of .)<br><br></li>\n",popforecast, stepm, model); */ |
| fflush(fichtm); | fflush(fichtm); |
| fprintf(fichtm," <ul><li><b>Graphs</b></li><p>"); | |
| m=pow(2,cptcoveff); | m=pow(2,cptcoveff); |
| if (cptcovn < 1) {m=1;ncodemax[1]=1;} | if (cptcovn < 1) {m=1;ncodemax[1]=1;} |
| fprintf(fichtm," <ul><li><b>Graphs (second order)</b></li><p>"); | |
| jj1=0; | |
| fprintf(fichtm," \n<ul>"); | |
| 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<li><a size=\"1\" color=\"#EC5E5E\" href=\"#rescovsecond"); | |
| 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]); | |
| } | |
| fprintf(fichtm,"\">"); | |
| /* 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,"</a></li>"); | |
| } /* cptcovn >0 */ | |
| } | |
| fprintf(fichtm," \n</ul>"); | |
| jj1=0; | jj1=0; |
| for(nres=1; nres <= nresult; nres++){ /* For each resultline */ | for(nres=1; nres <= nresult; nres++){ /* For each resultline */ |
| Line 7087 See page 'Matrix of variance-covariance | Line 7261 See page 'Matrix of variance-covariance |
| /* for(i1=1; i1<=ncodemax[k1];i1++){ */ | /* for(i1=1; i1<=ncodemax[k1];i1++){ */ |
| jj1++; | jj1++; |
| if (cptcovn > 0) { | if (cptcovn > 0) { |
| fprintf(fichtm,"\n<p><a name=\"rescovsecond"); | |
| 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]); | |
| } | |
| fprintf(fichtm,"\"</a>"); | |
| fprintf(fichtm,"<hr size=\"2\" color=\"#EC5E5E\">************ Results for covariates"); | fprintf(fichtm,"<hr size=\"2\" color=\"#EC5E5E\">************ Results for covariates"); |
| for (cpt=1; cpt<=cptcoveff;cpt++) /**< cptcoveff number of variables */ | for (cpt=1; cpt<=cptcoveff;cpt++){ /**< cptcoveff number of variables */ |
| fprintf(fichtm," V%d=%d ",Tvresult[nres][cpt],Tresult[nres][cpt]); | 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)]); */ | /* 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 */ | for (k4=1; k4<= nsq; k4++){ /* For each selected (single) quantitative value */ |
| fprintf(fichtm," V%d=%f ",Tvqresult[nres][k4],Tqresult[nres][k4]); | fprintf(fichtm," V%d=%f ",Tvqresult[nres][k4],Tqresult[nres][k4]); |
| } | } |
| Line 7104 See page 'Matrix of variance-covariance | Line 7289 See page 'Matrix of variance-covariance |
| } | } |
| for(cpt=1; cpt<=nlstate;cpt++) { | for(cpt=1; cpt<=nlstate;cpt++) { |
| fprintf(fichtm,"\n<br>- Observed (cross-sectional with mov_average=%d) and period (incidence based) \ | fprintf(fichtm,"\n<br>- Observed (cross-sectional with mov_average=%d) and period (incidence based) \ |
| prevalence (with 95%% confidence interval) in state (%d): <a href=\"%s_%d-%d-%d.svg\"> %s_%d-%d-%d.svg</a>\n <br>\ | prevalence (with 95%% confidence interval) in state (%d): <a href=\"%s_%d-%d-%d.svg\"> %s_%d-%d-%d.svg</a>",mobilav,cpt,subdirf2(optionfilefiname,"V_"),cpt,k1,nres,subdirf2(optionfilefiname,"V_"),cpt,k1,nres); |
| <img src=\"%s_%d-%d-%d.svg\">",mobilav,cpt,subdirf2(optionfilefiname,"V_"),cpt,k1,nres,subdirf2(optionfilefiname,"V_"),cpt,k1,nres,subdirf2(optionfilefiname,"V_"),cpt,k1,nres); | fprintf(fichtm," (data from text file <a href=\"%s\">%s</a>)\n <br>",subdirf2(fileresu,"VPL_"),subdirf2(fileresu,"VPL_")); |
| fprintf(fichtm,"<img src=\"%s_%d-%d-%d.svg\">",subdirf2(optionfilefiname,"V_"), cpt,k1,nres); | |
| } | } |
| fprintf(fichtm,"\n<br>- Total life expectancy by age and \ | fprintf(fichtm,"\n<br>- Total life expectancy by age and \ |
| health expectancies in states (1) and (2). If popbased=1 the smooth (due to the model) \ | 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\ | true period expectancies (those weighted with period prevalences are also\ |
| drawn in addition to the population based expectancies computed using\ | drawn in addition to the population based expectancies computed using\ |
| observed and cahotic prevalences: <a href=\"%s_%d-%d.svg\">%s_%d-%d.svg</a>\n<br>\ | observed and cahotic prevalences: <a href=\"%s_%d-%d.svg\">%s_%d-%d.svg</a>",nlstate, subdirf2(optionfilefiname,"E_"),k1,nres,subdirf2(optionfilefiname,"E_"),k1,nres); |
| <img src=\"%s_%d-%d.svg\">",subdirf2(optionfilefiname,"E_"),k1,nres,subdirf2(optionfilefiname,"E_"),k1,nres,subdirf2(optionfilefiname,"E_"),k1,nres); | fprintf(fichtm," (data from text file <a href=\"%s.txt\">%s.txt</a>) \n<br>",subdirf2(optionfilefiname,"T_"),subdirf2(optionfilefiname,"T_")); |
| fprintf(fichtm,"<img src=\"%s_%d-%d.svg\">",subdirf2(optionfilefiname,"E_"),k1,nres); | |
| /* } /\* end i1 *\/ */ | /* } /\* end i1 *\/ */ |
| }/* End k1 */ | }/* End k1 */ |
| }/* End nres */ | }/* End nres */ |
| Line 8493 void prevforecast(char fileres[], double | Line 8680 void prevforecast(char fileres[], double |
| */ | */ |
| int yearp, stepsize, hstepm, nhstepm, j, k, cptcod, i, h, i1, k4, nres=0; | int yearp, stepsize, hstepm, nhstepm, j, k, cptcod, i, h, i1, k4, nres=0; |
| double agec; /* generic age */ | double agec; /* generic age */ |
| double agelim, ppij, ppi, yp,yp1,yp2,jintmean,mintmean,aintmean; | double agelim, ppij, ppi, yp,yp1,yp2; /* ,jintmean,mintmean,aintmean;*/ |
| double *popeffectif,*popcount; | double *popeffectif,*popcount; |
| double ***p3mat; | double ***p3mat; |
| /* double ***mobaverage; */ | /* double ***mobaverage; */ |
| Line 9049 void prwizard(int ncovmodel, int nlstate | Line 9236 void prwizard(int ncovmodel, int nlstate |
| /******************* Gompertz Likelihood ******************************/ | /******************* Gompertz Likelihood ******************************/ |
| double gompertz(double x[]) | double gompertz(double x[]) |
| { | { |
| double A,B,L=0.0,sump=0.,num=0.; | double A=0.0,B=0.,L=0.0,sump=0.,num=0.; |
| int i,n=0; /* n is the size of the sample */ | int i,n=0; /* n is the size of the sample */ |
| for (i=1;i<=imx ; i++) { | for (i=1;i<=imx ; i++) { |
| Line 9057 double gompertz(double x[]) | Line 9244 double gompertz(double x[]) |
| /* sump=sump+1;*/ | /* sump=sump+1;*/ |
| num=num+1; | num=num+1; |
| } | } |
| L=0.0; | |
| /* agegomp=AGEGOMP; */ | |
| /* for (i=0; i<=imx; i++) | /* 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]);*/ | 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]);*/ |
| for (i=1;i<=imx ; i++) | for (i=1;i<=imx ; i++) { |
| { | /* mu(a)=mu(agecomp)*exp(teta*(age-agegomp)) |
| if (cens[i] == 1 && wav[i]>1) | mu(a)=x[1]*exp(x[2]*(age-agegomp)); x[1] and x[2] are per year. |
| A=-x[1]/(x[2])*(exp(x[2]*(agecens[i]-agegomp))-exp(x[2]*(ageexmed[i]-agegomp))); | * 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) | |
| if (cens[i] == 0 && wav[i]>1) | * + |
| * 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))) | 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); | +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) {*/ /* ??? */ | /*if (wav[i] > 1 && agecens[i] > 15) {*/ /* ??? */ |
| if (wav[i] > 1 ) { /* ??? */ | L=L+A*weight[i]; |
| 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("\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);*/ | /*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; | return -2*L*num/sump; |
| } | } |
| Line 9087 double gompertz(double x[]) | Line 9280 double gompertz(double x[]) |
| /******************* Gompertz_f Likelihood ******************************/ | /******************* Gompertz_f Likelihood ******************************/ |
| double gompertz_f(const gsl_vector *v, void *params) | double gompertz_f(const gsl_vector *v, void *params) |
| { | { |
| double A,B,LL=0.0,sump=0.,num=0.; | double A=0.,B=0.,LL=0.0,sump=0.,num=0.; |
| double *x= (double *) v->data; | double *x= (double *) v->data; |
| int i,n=0; /* n is the size of the sample */ | int i,n=0; /* n is the size of the sample */ |
| Line 9180 int readdata(char datafile[], int firsto | Line 9373 int readdata(char datafile[], int firsto |
| int i=0, j=0, n=0, iv=0, v; | int i=0, j=0, n=0, iv=0, v; |
| int lstra; | int lstra; |
| int linei, month, year,iout; | int linei, month, year,iout; |
| int noffset=0; /* This is the offset if BOM data file */ | |
| char line[MAXLINE], linetmp[MAXLINE]; | char line[MAXLINE], linetmp[MAXLINE]; |
| char stra[MAXLINE], strb[MAXLINE]; | char stra[MAXLINE], strb[MAXLINE]; |
| char *stratrunc; | char *stratrunc; |
| Line 9213 int readdata(char datafile[], int firsto | Line 9407 int readdata(char datafile[], int firsto |
| fprintf(ficlog,"Problem while opening datafile: %s with errno='%s'\n", datafile,strerror(errno));fflush(ficlog);return 1; | fprintf(ficlog,"Problem while opening datafile: %s with errno='%s'\n", datafile,strerror(errno));fflush(ficlog);return 1; |
| } | } |
| i=1; | /* Is it a BOM UTF-8 Windows file? */ |
| /* First data line */ | |
| linei=0; | linei=0; |
| while(fgets(line, MAXLINE, fic)) { | |
| noffset=0; | |
| if( line[0] == (char)0xEF && line[1] == (char)0xBB) /* EF BB BF */ | |
| { | |
| noffset=noffset+3; | |
| printf("# Data file '%s' is an UTF8 BOM file, please convert to UTF8 or ascii file and rerun.\n",datafile);fflush(stdout); | |
| fprintf(ficlog,"# Data file '%s' is an UTF8 BOM file, please convert to UTF8 or ascii file and rerun.\n",datafile); | |
| fflush(ficlog); return 1; | |
| } | |
| /* else if( line[0] == (char)0xFE && line[1] == (char)0xFF)*/ | |
| else if( line[0] == (char)0xFF && line[1] == (char)0xFE) | |
| { | |
| noffset=noffset+2; | |
| printf("# Error Data file '%s' is a huge UTF16BE BOM file, please convert to UTF8 or ascii file (for example with dos2unix) and rerun.\n",datafile);fflush(stdout); | |
| fprintf(ficlog,"# Error Data file '%s' is a huge UTF16BE BOM file, please convert to UTF8 or ascii file (for example with dos2unix) and rerun.\n",datafile); | |
| fflush(ficlog); return 1; | |
| } | |
| else if( line[0] == 0 && line[1] == 0) | |
| { | |
| if( line[2] == (char)0xFE && line[3] == (char)0xFF){ | |
| noffset=noffset+4; | |
| printf("# Error Data file '%s' is a huge UTF16BE BOM file, please convert to UTF8 or ascii file (for example with dos2unix) and rerun.\n",datafile);fflush(stdout); | |
| fprintf(ficlog,"# Error Data file '%s' is a huge UTF16BE BOM file, please convert to UTF8 or ascii file (for example with dos2unix) and rerun.\n",datafile); | |
| fflush(ficlog); return 1; | |
| } | |
| } else{ | |
| ;/*printf(" Not a BOM file\n");*/ | |
| } | |
| /* If line starts with a # it is a comment */ | |
| if (line[noffset] == '#') { | |
| linei=linei+1; | |
| break; | |
| }else{ | |
| break; | |
| } | |
| } | |
| fclose(fic); | |
| if((fic=fopen(datafile,"r"))==NULL) { | |
| printf("Problem while opening datafile: %s with errno='%s'\n", datafile,strerror(errno));fflush(stdout); | |
| fprintf(ficlog,"Problem while opening datafile: %s with errno='%s'\n", datafile,strerror(errno));fflush(ficlog);return 1; | |
| } | |
| /* Not a Bom file */ | |
| i=1; | |
| while ((fgets(line, MAXLINE, fic) != NULL) &&((i >= firstobs) && (i <=lastobs))) { | while ((fgets(line, MAXLINE, fic) != NULL) &&((i >= firstobs) && (i <=lastobs))) { |
| linei=linei+1; | linei=linei+1; |
| for(j=strlen(line); j>=0;j--){ /* Untabifies line */ | for(j=strlen(line); j>=0;j--){ /* Untabifies line */ |
| Line 9335 int readdata(char datafile[], int firsto | Line 9574 int readdata(char datafile[], int firsto |
| return 1; | return 1; |
| } | } |
| anint[j][i]= (double) year; | anint[j][i]= (double) year; |
| mint[j][i]= (double)month; | mint[j][i]= (double)month; |
| /* if( (int)anint[j][i]+ (int)(mint[j][i])/12. < (int) (moisnais[i]/12.+annais[i])){ */ | |
| /* printf("Warning reading data around '%s' at line number %d for individual %d, '%s'\nThe date of interview (%2d/%4d) at wave %d occurred before the date of birth (%2d/%4d).\n",strb, linei,i, line, mint[j][i],anint[j][i], moisnais[i],annais[i]); */ | |
| /* fprintf(ficlog,"Warning reading data around '%s' at line number %d for individual %d, '%s'\nThe date of interview (%2d/%4d) at wave %d occurred before the date of birth (%2d/%4d).\n",strb, linei,i, line, mint[j][i],anint[j][i], moisnais[i],annais[i]); */ | |
| /* } */ | |
| strcpy(line,stra); | strcpy(line,stra); |
| } /* End loop on waves */ | } /* End loop on waves */ |
| Line 9374 int readdata(char datafile[], int firsto | Line 9617 int readdata(char datafile[], int firsto |
| } | } |
| annais[i]=(double)(year); | annais[i]=(double)(year); |
| moisnais[i]=(double)(month); | moisnais[i]=(double)(month); |
| for (j=1;j<=maxwav;j++){ | |
| if( (int)anint[j][i]+ (int)(mint[j][i])/12. < (int) (moisnais[i]/12.+annais[i])){ | |
| printf("Warning reading data around '%s' at line number %d for individual %d, '%s'\nThe date of interview (%2d/%4d) at wave %d occurred before the date of birth (%2d/%4d).\n",strb, linei,i, line, (int)mint[j][i],(int)anint[j][i], j,(int)moisnais[i],(int)annais[i]); | |
| fprintf(ficlog,"Warning reading data around '%s' at line number %d for individual %d, '%s'\nThe date of interview (%2d/%4d) at wave %d occurred before the date of birth (%2d/%4d).\n",strb, linei,i, line, (int)mint[j][i],(int)anint[j][i], j, (int)moisnais[i],(int)annais[i]); | |
| } | |
| } | |
| strcpy(line,stra); | strcpy(line,stra); |
| /* Sample weight */ | /* Sample weight */ |
| Line 9394 int readdata(char datafile[], int firsto | Line 9644 int readdata(char datafile[], int firsto |
| cutv(stra, strb, line, ' '); | cutv(stra, strb, line, ' '); |
| if(strb[0]=='.') { /* Missing value */ | if(strb[0]=='.') { /* Missing value */ |
| lval=-1; | lval=-1; |
| coqvar[iv][i]=NAN; | |
| covar[ncovcol+iv][i]=NAN; /* including qvar in standard covar for performance reasons */ | |
| }else{ | }else{ |
| errno=0; | errno=0; |
| /* what_kind_of_number(strb); */ | /* what_kind_of_number(strb); */ |
| Line 9497 int decoderesult ( char resultline[], in | Line 9749 int decoderesult ( char resultline[], in |
| char stra[80], strb[80], strc[80], strd[80],stre[80]; | char stra[80], strb[80], strc[80], strd[80],stre[80]; |
| removefirstspace(&resultline); | removefirstspace(&resultline); |
| printf("decoderesult:%s\n",resultline); | |
| if (strstr(resultline,"v") !=0){ | if (strstr(resultline,"v") !=0){ |
| printf("Error. 'v' must be in upper case 'V' result: %s ",resultline); | printf("Error. 'v' must be in upper case 'V' result: %s ",resultline); |
| Line 9512 int decoderesult ( char resultline[], in | Line 9763 int decoderesult ( char resultline[], in |
| TKresult[nres]=0; /* Combination for the nresult and the model */ | TKresult[nres]=0; /* Combination for the nresult and the model */ |
| return (0); | return (0); |
| } | } |
| if( j != cptcovs ){ /* Be careful if a variable is in a product but not single */ | if( j != cptcovs ){ /* Be careful if a variable is in a product but not single */ |
| printf("ERROR: the number of variable in the resultline, %d, differs from the number of variable used in the model line, %d.\n",j, cptcovs); | printf("ERROR: the number of variables in this result line, %d, differs from the number of variables used in the model line, %d.\n",j, cptcovs); |
| fprintf(ficlog,"ERROR: the number of variable in the resultline, %d, differs from the number of variable used in the model line, %d.\n",j, cptcovs); | fprintf(ficlog,"ERROR: the number of variables in the resultline, %d, differs from the number of variables used in the model line, %d.\n",j, cptcovs); |
| } | } |
| for(k=1; k<=j;k++){ /* Loop on any covariate of the result line */ | for(k=1; k<=j;k++){ /* Loop on any covariate of the result line */ |
| if(nbocc(resultsav,'=') >1){ | if(nbocc(resultsav,'=') >1){ |
| cutl(stra,strb,resultsav,' '); /* keeps in strb after the first ' ' | cutl(stra,strb,resultsav,' '); /* keeps in strb after the first ' ' (stra is the rest of the resultline to be analyzed in the next loop *//* resultsav= "V4=1 V5=25.1 V3=0" stra= "V5=25.1 V3=0" strb= "V4=1" */ |
| resultsav= V4=1 V5=25.1 V3=0 strb=V3=0 stra= V4=1 V5=25.1 */ | cutl(strc,strd,strb,'='); /* strb:"V4=1" strc="1" strd="V4" */ |
| cutl(strc,strd,strb,'='); /* strb:V4=1 strc=1 strd=V4 */ | |
| }else | }else |
| cutl(strc,strd,resultsav,'='); | cutl(strc,strd,resultsav,'='); |
| Tvalsel[k]=atof(strc); /* 1 */ | Tvalsel[k]=atof(strc); /* 1 */ /* Tvalsel of k is the float value of the kth covariate appearing in this result line */ |
| cutl(strc,stre,strd,'V'); /* strd='V4' strc=4 stre='V' */; | cutl(strc,stre,strd,'V'); /* strd='V4' strc=4 stre='V' */; |
| Tvarsel[k]=atoi(strc); | Tvarsel[k]=atoi(strc); /* 4 */ /* Tvarsel is the id of the kth covariate in the result line Tvarsel[1] in "V4=1.." is 4.*/ |
| /* Typevarsel[k]=1; /\* 1 for age product *\/ */ | /* Typevarsel[k]=1; /\* 1 for age product *\/ */ |
| /* cptcovsel++; */ | /* cptcovsel++; */ |
| if (nbocc(stra,'=') >0) | if (nbocc(stra,'=') >0) |
| strcpy(resultsav,stra); /* and analyzes it */ | strcpy(resultsav,stra); /* and analyzes it */ |
| } | } |
| /* Checking for missing or useless values in comparison of current model needs */ | /* Checking for missing or useless values in comparison of current model needs */ |
| for(k1=1; k1<= cptcovt ;k1++){ /* model line V5+V4+V3+V4*V3+V5*age+V2+V1*V2+V1*age+V1 */ | for(k1=1; k1<= cptcovt ;k1++){ /* Loop on model. model line V5+V4+V3+V4*V3+V5*age+V2+V1*V2+V1*age+V1 */ |
| if(Typevar[k1]==0){ /* Single covariate in model */ | if(Typevar[k1]==0){ /* Single covariate in model *//*0 for simple covariate (dummy, quantitative, fixed or varying), 1 for age product, 2 for product */ |
| match=0; | match=0; |
| for(k2=1; k2 <=j;k2++){/* result line V4=1 V5=24.1 V3=1 V2=8 V1=0 */ | for(k2=1; k2 <=j;k2++){/* Loop on resultline. In result line V4=1 V5=24.1 V3=1 V2=8 V1=0 */ |
| if(Tvar[k1]==Tvarsel[k2]) {/* Tvar[1]=5 == Tvarsel[2]=5 */ | if(Tvar[k1]==Tvarsel[k2]) {/* Tvar is coming from the model, Tvarsel from the result. Tvar[1]=5 == Tvarsel[2]=5 */ |
| modelresult[k2]=k1;/* modelresult[2]=1 modelresult[1]=2 modelresult[3]=3 modelresult[6]=4 modelresult[9]=5 */ | modelresult[k2]=k1;/* modelresult[2]=1 modelresult[1]=2 modelresult[3]=3 modelresult[6]=4 modelresult[9]=5 */ |
| match=1; | match=1; /* modelresult of k2 variable of resultline is identical to k1 variable of the model good */ |
| break; | break; |
| } | } |
| } | } |
| if(match == 0){ | if(match == 0){ |
| printf("Error in result line: %d value missing; result: %s, model=%s\n",k1, resultline, model); | printf("Error in result line: V%d is missing in result: %s according to model=%s\n",k1, resultline, model); |
| fprintf(ficlog,"Error in result line: V%d is missing in result: %s according to model=%s\n",k1, resultline, model); | |
| return 1; | |
| } | } |
| } | } |
| } | } |
| /* Checking for missing or useless values in comparison of current model needs */ | /* Checking for missing or useless values in comparison of current model needs */ |
| for(k2=1; k2 <=j;k2++){ /* result line V4=1 V5=24.1 V3=1 V2=8 V1=0 */ | for(k2=1; k2 <=j;k2++){ /* Loop on resultline variables: result line V4=1 V5=24.1 V3=1 V2=8 V1=0 */ |
| match=0; | match=0; |
| for(k1=1; k1<= cptcovt ;k1++){ /* model line V5+V4+V3+V4*V3+V5*age+V2+V1*V2+V1*age+V1 */ | for(k1=1; k1<= cptcovt ;k1++){ /* loop on model: model line V5+V4+V3+V4*V3+V5*age+V2+V1*V2+V1*age+V1 */ |
| if(Typevar[k1]==0){ /* Single */ | if(Typevar[k1]==0){ /* Single */ |
| if(Tvar[k1]==Tvarsel[k2]) { /* Tvar[2]=4 == Tvarsel[1]=4 */ | if(Tvar[k1]==Tvarsel[k2]) { /* Tvar[2]=4 == Tvarsel[1]=4 */ |
| resultmodel[k1]=k2; /* resultmodel[2]=1 resultmodel[1]=2 resultmodel[3]=3 resultmodel[6]=4 resultmodel[9]=5 */ | resultmodel[k1]=k2; /* k2th variable of the model corresponds to k1 variable of the model. resultmodel[2]=1 resultmodel[1]=2 resultmodel[3]=3 resultmodel[6]=4 resultmodel[9]=5 */ |
| ++match; | ++match; |
| } | } |
| } | } |
| } | } |
| if(match == 0){ | if(match == 0){ |
| printf("Error in result line: %d value missing; result: %s, model=%s\n",k1, resultline, model); | printf("Error in result line: %d value missing; result: %s, model=%s\n",k1, resultline, model); |
| fprintf(ficlog,"Error in result line: %d value missing; result: %s, model=%s\n",k1, resultline, model); | |
| return 1; | |
| }else if(match > 1){ | }else if(match > 1){ |
| printf("Error in result line: %d doubled; result: %s, model=%s\n",k2, resultline, model); | printf("Error in result line: %d doubled; result: %s, model=%s\n",k2, resultline, model); |
| fprintf(ficlog,"Error in result line: %d doubled; result: %s, model=%s\n",k2, resultline, model); | |
| return 1; | |
| } | } |
| } | } |
| Line 9585 int decoderesult ( char resultline[], in | Line 9840 int decoderesult ( char resultline[], in |
| /* V(Tvqresult)=Tqresult V5=25.1 V2=8 Tqresult[nres=1][1]=25.1 */ | /* V(Tvqresult)=Tqresult V5=25.1 V2=8 Tqresult[nres=1][1]=25.1 */ |
| /* V5*age V5 known which value for nres? */ | /* V5*age V5 known which value for nres? */ |
| /* Tqinvresult[2]=8 Tqinvresult[1]=25.1 */ | /* Tqinvresult[2]=8 Tqinvresult[1]=25.1 */ |
| for(k1=1, k=0, k4=0, k4q=0; k1 <=cptcovt;k1++){ /* model line */ | for(k1=1, k=0, k4=0, k4q=0; k1 <=cptcovt;k1++){ /* loop on model line */ |
| if( Dummy[k1]==0 && Typevar[k1]==0 ){ /* Single dummy */ | if( Dummy[k1]==0 && Typevar[k1]==0 ){ /* Single dummy */ |
| k3= resultmodel[k1]; /* resultmodel[2(V4)] = 1=k3 */ | k3= resultmodel[k1]; /* resultmodel[2(V4)] = 1=k3 */ |
| k2=(int)Tvarsel[k3]; /* Tvarsel[resultmodel[2]]= Tvarsel[1] = 4=k2 */ | k2=(int)Tvarsel[k3]; /* Tvarsel[resultmodel[2]]= Tvarsel[1] = 4=k2 */ |
| Line 9596 int decoderesult ( char resultline[], in | Line 9851 int decoderesult ( char resultline[], in |
| printf("Decoderesult Dummy k=%d, V(k2=V%d)= Tvalsel[%d]=%d, 2**(%d)\n",k, k2, k3, (int)Tvalsel[k3], k4); | printf("Decoderesult Dummy k=%d, V(k2=V%d)= Tvalsel[%d]=%d, 2**(%d)\n",k, k2, k3, (int)Tvalsel[k3], k4); |
| k4++;; | k4++;; |
| } else if( Dummy[k1]==1 && Typevar[k1]==0 ){ /* Single quantitative */ | } else if( Dummy[k1]==1 && Typevar[k1]==0 ){ /* Single quantitative */ |
| k3q= resultmodel[k1]; /* resultmodel[2] = 1=k3 */ | k3q= resultmodel[k1]; /* resultmodel[1(V5)] = 25.1=k3q */ |
| k2q=(int)Tvarsel[k3q]; /* Tvarsel[resultmodel[2]]= Tvarsel[1] = 4=k2 */ | k2q=(int)Tvarsel[k3q]; /* Tvarsel[resultmodel[1]]= Tvarsel[1] = 4=k2 */ |
| Tqresult[nres][k4q+1]=Tvalsel[k3q]; /* Tqresult[nres][1]=25.1 */ | Tqresult[nres][k4q+1]=Tvalsel[k3q]; /* Tqresult[nres][1]=25.1 */ |
| Tvqresult[nres][k4q+1]=(int)Tvarsel[k3q]; /* Tvqresult[nres][1]=5 */ | Tvqresult[nres][k4q+1]=(int)Tvarsel[k3q]; /* Tvqresult[nres][1]=5 */ |
| Tqinvresult[nres][(int)Tvarsel[k3q]]=Tvalsel[k3q]; /* Tqinvresult[nres][5]=25.1 */ | Tqinvresult[nres][(int)Tvarsel[k3q]]=Tvalsel[k3q]; /* Tqinvresult[nres][5]=25.1 */ |
| Line 9824 int decodemodel( char model[], int lasto | Line 10079 int decodemodel( char model[], int lasto |
| /* If Tvar[k] >ncovcol it is a product */ | /* If Tvar[k] >ncovcol it is a product */ |
| /* Tvar[k] is the value n of Vn with n varying for 1 to nvcol, or p Vp=Vn*Vm for product */ | /* Tvar[k] is the value n of Vn with n varying for 1 to nvcol, or p Vp=Vn*Vm for product */ |
| /* Computing effective variables, ie used by the model, that is from the cptcovt variables */ | /* Computing effective variables, ie used by the model, that is from the cptcovt variables */ |
| printf("Model=%s\n\ | printf("Model=1+age+%s\n\ |
| Typevar: 0 for simple covariate (dummy, quantitative, fixed or varying), 1 for age product, 2 for product \n\ | Typevar: 0 for simple covariate (dummy, quantitative, fixed or varying), 1 for age product, 2 for product \n\ |
| Fixed[k] 0=fixed (product or simple), 1 varying, 2 fixed with age product, 3 varying with age product \n\ | Fixed[k] 0=fixed (product or simple), 1 varying, 2 fixed with age product, 3 varying with age product \n\ |
| Dummy[k] 0=dummy (0 1), 1 quantitative (single or product without age), 2 dummy with age product, 3 quant with age product\n",model); | Dummy[k] 0=dummy (0 1), 1 quantitative (single or product without age), 2 dummy with age product, 3 quant with age product\n",model); |
| fprintf(ficlog,"Model=%s\n\ | fprintf(ficlog,"Model=1+age+%s\n\ |
| Typevar: 0 for simple covariate (dummy, quantitative, fixed or varying), 1 for age product, 2 for product \n\ | Typevar: 0 for simple covariate (dummy, quantitative, fixed or varying), 1 for age product, 2 for product \n\ |
| Fixed[k] 0=fixed (product or simple), 1 varying, 2 fixed with age product, 3 varying with age product \n\ | Fixed[k] 0=fixed (product or simple), 1 varying, 2 fixed with age product, 3 varying with age product \n\ |
| Dummy[k] 0=dummy (0 1), 1 quantitative (single or product without age), 2 dummy with age product, 3 quant with age product\n",model); | Dummy[k] 0=dummy (0 1), 1 quantitative (single or product without age), 2 dummy with age product, 3 quant with age product\n",model); |
| Line 10863 int main(int argc, char *argv[]) | Line 11118 int main(int argc, char *argv[]) |
| double ftolpl=FTOL; | double ftolpl=FTOL; |
| double **prlim; | double **prlim; |
| double **bprlim; | double **bprlim; |
| double ***param; /* Matrix of parameters */ | double ***param; /* Matrix of parameters, param[i][j][k] param=ma3x(1,nlstate,1,nlstate+ndeath-1,1,ncovmodel) |
| state of origin, state of destination including death, for each covariate: constante, age, and V1 V2 etc. */ | |
| double ***paramstart; /* Matrix of starting parameter values */ | double ***paramstart; /* Matrix of starting parameter values */ |
| double *p, *pstart; /* p=param[1][1] pstart is for starting values guessed by freqsummary */ | double *p, *pstart; /* p=param[1][1] pstart is for starting values guessed by freqsummary */ |
| double **matcov; /* Matrix of covariance */ | double **matcov; /* Matrix of covariance */ |
| Line 11073 int main(int argc, char *argv[]) | Line 11329 int main(int argc, char *argv[]) |
| noffset=noffset+3; | noffset=noffset+3; |
| printf("# File is an UTF8 Bom.\n"); // 0xBF | printf("# File is an UTF8 Bom.\n"); // 0xBF |
| } | } |
| else if( line[0] == (char)0xFE && line[1] == (char)0xFF) | /* else if( line[0] == (char)0xFE && line[1] == (char)0xFF)*/ |
| else if( line[0] == (char)0xFF && line[1] == (char)0xFE) | |
| { | { |
| noffset=noffset+2; | noffset=noffset+2; |
| printf("# File is an UTF16BE BOM file\n"); | printf("# File is an UTF16BE BOM file\n"); |
| Line 11161 int main(int argc, char *argv[]) | Line 11418 int main(int argc, char *argv[]) |
| } | } |
| if((num_filled=sscanf(line,"model=1+age%[^.\n]", model)) !=EOF){ | if((num_filled=sscanf(line,"model=1+age%[^.\n]", model)) !=EOF){ |
| if (num_filled != 1){ | if (num_filled != 1){ |
| printf("ERROR %d: Model should be at minimum 'model=1+age' %s\n",num_filled, line); | printf("ERROR %d: Model should be at minimum 'model=1+age+' instead of '%s'\n",num_filled, line); |
| fprintf(ficlog,"ERROR %d: Model should be at minimum 'model=1+age' %s\n",num_filled, line); | fprintf(ficlog,"ERROR %d: Model should be at minimum 'model=1+age+' instead of '%s'\n",num_filled, line); |
| model[0]='\0'; | model[0]='\0'; |
| goto end; | goto end; |
| } | } |
| Line 11789 Title=%s <br>Datafile=%s Firstpass=%d La | Line 12046 Title=%s <br>Datafile=%s Firstpass=%d La |
| <img src=\"%s_.svg\">", subdirf2(optionfilefiname,"D_"),subdirf2(optionfilefiname,"D_"),subdirf2(optionfilefiname,"D_")); | <img src=\"%s_.svg\">", subdirf2(optionfilefiname,"D_"),subdirf2(optionfilefiname,"D_"),subdirf2(optionfilefiname,"D_")); |
| fprintf(fichtm,"\n<h4>Some descriptive statistics </h4>\n<br>Total number of observations=%d <br>\n\ | fprintf(fichtm,"\n<h4>Some descriptive statistics </h4>\n<br>Number of (used) observations=%d <br>\n\ |
| Youngest age at first (selected) pass %.2f, oldest age %.2f<br>\n\ | Youngest age at first (selected) pass %.2f, oldest age %.2f<br>\n\ |
| Interval (in months) between two waves: Min=%d Max=%d Mean=%.2lf<br>\n",\ | Interval (in months) between two waves: Min=%d Max=%d Mean=%.2lf<br>\n",\ |
| imx,agemin,agemax,jmin,jmax,jmean); | imx,agemin,agemax,jmin,jmax,jmean); |
| Line 11848 Interval (in months) between two waves: | Line 12105 Interval (in months) between two waves: |
| ximort[i][j]=(i == j ? 1.0 : 0.0); | ximort[i][j]=(i == j ? 1.0 : 0.0); |
| } | } |
| /*p[1]=0.0268; p[NDIM]=0.083;*/ | p[1]=0.0268; p[NDIM]=0.083; |
| /*printf("%lf %lf", p[1], p[2]);*/ | /* printf("%lf %lf", p[1], p[2]); */ |
| #ifdef GSL | #ifdef GSL |
| Line 11975 Interval (in months) between two waves: | Line 12232 Interval (in months) between two waves: |
| printf("%f [%f ; %f]\n",p[i],p[i]-2*sqrt(matcov[i][i]),p[i]+2*sqrt(matcov[i][i])); | printf("%f [%f ; %f]\n",p[i],p[i]-2*sqrt(matcov[i][i]),p[i]+2*sqrt(matcov[i][i])); |
| fprintf(ficlog,"%f [%f ; %f]\n",p[i],p[i]-2*sqrt(matcov[i][i]),p[i]+2*sqrt(matcov[i][i])); | fprintf(ficlog,"%f [%f ; %f]\n",p[i],p[i]-2*sqrt(matcov[i][i]),p[i]+2*sqrt(matcov[i][i])); |
| } | } |
| lsurv=vector(1,AGESUP); | lsurv=vector(agegomp,AGESUP); |
| lpop=vector(1,AGESUP); | lpop=vector(agegomp,AGESUP); |
| tpop=vector(1,AGESUP); | tpop=vector(agegomp,AGESUP); |
| lsurv[agegomp]=100000; | lsurv[agegomp]=100000; |
| for (k=agegomp;k<=AGESUP;k++) { | for (k=agegomp;k<=AGESUP;k++) { |
| Line 12024 Please run with mle=-1 to get a correct | Line 12281 Please run with mle=-1 to get a correct |
| stepm, weightopt,\ | stepm, weightopt,\ |
| model,imx,p,matcov,agemortsup); | model,imx,p,matcov,agemortsup); |
| free_vector(lsurv,1,AGESUP); | free_vector(lsurv,agegomp,AGESUP); |
| free_vector(lpop,1,AGESUP); | free_vector(lpop,agegomp,AGESUP); |
| free_vector(tpop,1,AGESUP); | free_vector(tpop,agegomp,AGESUP); |
| free_matrix(ximort,1,NDIM,1,NDIM); | free_matrix(ximort,1,NDIM,1,NDIM); |
| free_ivector(dcwave,firstobs,lastobs); | free_ivector(dcwave,firstobs,lastobs); |
| free_vector(agecens,firstobs,lastobs); | free_vector(agecens,firstobs,lastobs); |
| Line 12227 Please run with mle=-1 to get a correct | Line 12484 Please run with mle=-1 to get a correct |
| fputs(line,stdout); | fputs(line,stdout); |
| fputs(line,ficparo); | fputs(line,ficparo); |
| fputs(line,ficlog); | fputs(line,ficlog); |
| fputs(line,ficres); | |
| continue; | continue; |
| }else | }else |
| break; | break; |
| Line 12272 Please run with mle=-1 to get a correct | Line 12530 Please run with mle=-1 to get a correct |
| fputs(line,stdout); | fputs(line,stdout); |
| fputs(line,ficparo); | fputs(line,ficparo); |
| fputs(line,ficlog); | fputs(line,ficlog); |
| fputs(line,ficres); | |
| continue; | continue; |
| }else | }else |
| break; | break; |
| Line 12297 Please run with mle=-1 to get a correct | Line 12556 Please run with mle=-1 to get a correct |
| fputs(line,stdout); | fputs(line,stdout); |
| fputs(line,ficparo); | fputs(line,ficparo); |
| fputs(line,ficlog); | fputs(line,ficlog); |
| fputs(line,ficres); | |
| continue; | continue; |
| }else | }else |
| break; | break; |
| Line 12319 Please run with mle=-1 to get a correct | Line 12579 Please run with mle=-1 to get a correct |
| } | } |
| /* Results */ | /* Results */ |
| endishere=0; | |
| nresult=0; | nresult=0; |
| parameterline=0; | |
| do{ | do{ |
| if(!fgets(line, MAXLINE, ficpar)){ | if(!fgets(line, MAXLINE, ficpar)){ |
| endishere=1; | endishere=1; |
| parameterline=14; | parameterline=15; |
| }else if (line[0] == '#') { | }else if (line[0] == '#') { |
| /* If line starts with a # it is a comment */ | /* If line starts with a # it is a comment */ |
| numlinepar++; | numlinepar++; |
| fputs(line,stdout); | fputs(line,stdout); |
| fputs(line,ficparo); | fputs(line,ficparo); |
| fputs(line,ficlog); | fputs(line,ficlog); |
| fputs(line,ficres); | |
| continue; | continue; |
| }else if(sscanf(line,"prevforecast=%[^\n]\n",modeltemp)) | }else if(sscanf(line,"prevforecast=%[^\n]\n",modeltemp)) |
| parameterline=11; | parameterline=11; |
| else if(sscanf(line,"prevbackcast=%[^\n]\n",modeltemp)) | else if(sscanf(line,"prevbackcast=%[^\n]\n",modeltemp)) |
| parameterline=12; | parameterline=12; |
| else if(sscanf(line,"result:%[^\n]\n",modeltemp)) | else if(sscanf(line,"result:%[^\n]\n",modeltemp)){ |
| parameterline=13; | parameterline=13; |
| } | |
| else{ | else{ |
| parameterline=14; | parameterline=14; |
| } | } |
| switch (parameterline){ | switch (parameterline){ /* =0 only if only comments */ |
| case 11: | case 11: |
| if((num_filled=sscanf(line,"prevforecast=%d starting-proj-date=%lf/%lf/%lf final-proj-date=%lf/%lf/%lf mobil_average=%d\n",&prevfcast,&jproj1,&mproj1,&anproj1,&jproj2,&mproj2,&anproj2,&mobilavproj)) !=EOF && (num_filled == 8)){ | if((num_filled=sscanf(line,"prevforecast=%d starting-proj-date=%lf/%lf/%lf final-proj-date=%lf/%lf/%lf mobil_average=%d\n",&prevfcast,&jproj1,&mproj1,&anproj1,&jproj2,&mproj2,&anproj2,&mobilavproj)) !=EOF && (num_filled == 8)){ |
| fprintf(ficparo,"prevforecast=%d starting-proj-date=%.lf/%.lf/%.lf final-proj-date=%.lf/%.lf/%.lf mobil_average=%d\n",prevfcast,jproj1,mproj1,anproj1,jproj2,mproj2,anproj2,mobilavproj); | fprintf(ficparo,"prevforecast=%d starting-proj-date=%.lf/%.lf/%.lf final-proj-date=%.lf/%.lf/%.lf mobil_average=%d\n",prevfcast,jproj1,mproj1,anproj1,jproj2,mproj2,anproj2,mobilavproj); |
| Line 12353 Please run with mle=-1 to get a correct | Line 12617 Please run with mle=-1 to get a correct |
| prvforecast = 1; | prvforecast = 1; |
| } | } |
| else if((num_filled=sscanf(line,"prevforecast=%d yearsfproj=%lf mobil_average=%d\n",&prevfcast,&yrfproj,&mobilavproj)) !=EOF){/* && (num_filled == 3))*/ | else if((num_filled=sscanf(line,"prevforecast=%d yearsfproj=%lf mobil_average=%d\n",&prevfcast,&yrfproj,&mobilavproj)) !=EOF){/* && (num_filled == 3))*/ |
| printf(" Num_filled=%d, yearsfproj=%lf, mobil_average=%d\n",prevfcast,yrfproj,mobilavproj); | printf("prevforecast=%d yearsfproj=%.2lf mobil_average=%d\n",prevfcast,yrfproj,mobilavproj); |
| fprintf(ficlog,"prevforecast=%d yearsfproj=%.2lf mobil_average=%d\n",prevfcast,yrfproj,mobilavproj); | |
| fprintf(ficres,"prevforecast=%d yearsfproj=%.2lf mobil_average=%d\n",prevfcast,yrfproj,mobilavproj); | |
| prvforecast = 2; | prvforecast = 2; |
| } | } |
| else { | else { |
| Line 12374 Please run with mle=-1 to get a correct | Line 12640 Please run with mle=-1 to get a correct |
| prvbackcast = 1; | prvbackcast = 1; |
| } | } |
| else if((num_filled=sscanf(line,"prevbackcast=%d yearsbproj=%lf mobil_average=%d\n",&prevbcast,&yrbproj,&mobilavproj)) ==3){/* && (num_filled == 3))*/ | else if((num_filled=sscanf(line,"prevbackcast=%d yearsbproj=%lf mobil_average=%d\n",&prevbcast,&yrbproj,&mobilavproj)) ==3){/* && (num_filled == 3))*/ |
| printf(" Num_filled=%d, yearsbproj=%lf, mobil_average=%d\n",prevbcast,yrbproj,mobilavproj); | printf("prevbackcast=%d yearsbproj=%.2lf mobil_average=%d\n",prevbcast,yrbproj,mobilavproj); |
| fprintf(ficlog,"prevbackcast=%d yearsbproj=%.2lf mobil_average=%d\n",prevbcast,yrbproj,mobilavproj); | |
| fprintf(ficres,"prevbackcast=%d yearsbproj=%.2lf mobil_average=%d\n",prevbcast,yrbproj,mobilavproj); | |
| prvbackcast = 2; | prvbackcast = 2; |
| } | } |
| else { | else { |
| Line 12383 Please run with mle=-1 to get a correct | Line 12651 Please run with mle=-1 to get a correct |
| goto end; | goto end; |
| } | } |
| break; | break; |
| /* /\*fscanf(ficpar,"backcast=%d starting-back-date=%lf/%lf/%lf final-back-date=%lf/%lf/%lf mobil_average=%d\n",&backcast,&jback1,&mback1,&anback1,&jback2,&mback2,&anback2,&mobilavproj);*\/ */ | |
| /* if((num_filled=sscanf(line,"backcast=%d starting-back-date=%lf/%lf/%lf final-back-date=%lf/%lf/%lf mobil_average=%d\n",&backcast,&jback1,&mback1,&anback1,&jback2,&mback2,&anback2,&mobilavproj)) !=EOF){ */ | |
| /* if (num_filled != 8) { */ | |
| /* printf("Error: Not 8 (data)parameters in line but %d, for example:backcast=1 starting-back-date=1/1/1990 final-back-date=1/1/1970 mobil_average=1\n, your line=%s . Probably you are running an older format.\n",num_filled,line); */ | |
| /* fprintf(ficlog,"Error: Not 8 (data)parameters in line but %d, for example:backcast=1 starting-back-date=1/1/1990 final-back-date=1/1/1970 mobil_average=1\n, your line=%s . Probably you are running an older format.\n",num_filled,line); */ | |
| /* goto end; */ | |
| /* } */ | |
| /* printf("backcast=%d starting-back-date=%.lf/%.lf/%.lf final-back-date=%.lf/%.lf/%.lf mobil_average=%d\n",backcast,jback1,mback1,anback1,jback2,mback2,anback2,mobilavproj); */ | |
| /* fprintf(ficparo,"backcast=%d starting-back-date=%.lf/%.lf/%.lf final-back-date=%.lf/%.lf/%.lf mobil_average=%d\n",backcast,jback1,mback1,anback1,jback2,mback2,anback2,mobilavproj); */ | |
| /* fprintf(ficlog,"backcast=%d starting-back-date=%.lf/%.lf/%.lf final-back-date=%.lf/%.lf/%.lf mobil_average=%d\n",backcast,jback1,mback1,anback1,jback2,mback2,anback2,mobilavproj); */ | |
| /* fprintf(ficres,"backcast=%d starting-back-date=%.lf/%.lf/%.lf final-back-date=%.lf/%.lf/%.lf mobil_average=%d\n",backcast,jback1,mback1,anback1,jback2,mback2,anback2,mobilavproj); */ | |
| /* /\* day and month of proj2 are not used but only year anproj2.*\/ */ | |
| /* dateback1=anback1+(mback1-1)/12.+(jback1-1)/365.; */ | |
| /* dateback2=anback2+(mback2-1)/12.+(jback2-1)/365.; */ | |
| /* } */ | |
| /* break; */ | |
| case 13: | case 13: |
| if((num_filled=sscanf(line,"result:%[^\n]\n",resultline)) !=EOF){ | num_filled=sscanf(line,"result:%[^\n]\n",resultline); |
| if (num_filled == 0){ | nresult++; /* Sum of resultlines */ |
| resultline[0]='\0'; | printf("Result %d: result:%s\n",nresult, resultline); |
| printf("Warning %d: no result line! It should be at minimum 'result: V2=0 V1=1 or result:.\n%s\n", num_filled, line); | if(nresult > MAXRESULTLINESPONE-1){ |
| fprintf(ficlog,"Warning %d: no result line! It should be at minimum 'result: V2=0 V1=1 or result:.\n%s\n", num_filled, line); | printf("ERROR: Current version of IMaCh limits the number of resultlines to %d, you used %d\nYou can use the 'r' parameter file '%s' which uses option mle=0 to get other results. ",MAXRESULTLINESPONE-1,nresult,rfileres); |
| break; | fprintf(ficlog,"ERROR: Current version of IMaCh limits the number of resultlines to %d, you used %d\nYou can use the 'r' parameter file '%s' which uses option mle=0 to get other results. ",MAXRESULTLINESPONE-1,nresult,rfileres); |
| } else if (num_filled != 1){ | goto end; |
| printf("ERROR %d: result line! It should be at minimum 'result: V2=0 V1=1 or result:.' %s\n",num_filled, line); | } |
| fprintf(ficlog,"ERROR %d: result line! It should be at minimum 'result: V2=0 V1=1 or result:.' %s\n",num_filled, line); | if(!decoderesult(resultline, nresult)){ /* Fills TKresult[nresult] combination and Tresult[nresult][k4+1] combination values */ |
| } | |
| nresult++; /* Sum of resultlines */ | |
| printf("Result %d: result=%s\n",nresult, resultline); | |
| if(nresult > MAXRESULTLINES){ | |
| printf("ERROR: Current version of IMaCh limits the number of resultlines to %d, you used %d\n",MAXRESULTLINES,nresult); | |
| fprintf(ficlog,"ERROR: Current version of IMaCh limits the number of resultlines to %d, you used %d\n",MAXRESULTLINES,nresult); | |
| goto end; | |
| } | |
| decoderesult(resultline, nresult); /* Fills TKresult[nresult] combination and Tresult[nresult][k4+1] combination values */ | |
| fprintf(ficparo,"result: %s\n",resultline); | fprintf(ficparo,"result: %s\n",resultline); |
| fprintf(ficres,"result: %s\n",resultline); | fprintf(ficres,"result: %s\n",resultline); |
| fprintf(ficlog,"result: %s\n",resultline); | fprintf(ficlog,"result: %s\n",resultline); |
| break; | } else |
| case 14: | goto end; |
| if(ncovmodel >2 && nresult==0 ){ | break; |
| printf("ERROR: no result lines! It should be at minimum 'result: V2=0 V1=1 or result:.' %s\n",line); | case 14: |
| goto end; | printf("Error: Unknown command '%s'\n",line); |
| } | fprintf(ficlog,"Error: Unknown command '%s'\n",line); |
| break; | if(line[0] == ' ' || line[0] == '\n'){ |
| default: | printf("It should not be an empty line '%s'\n",line); |
| nresult=1; | fprintf(ficlog,"It should not be an empty line '%s'\n",line); |
| decoderesult(".",nresult ); /* No covariate */ | } |
| if(ncovmodel >=2 && nresult==0 ){ | |
| printf("ERROR: no result lines! It should be at minimum 'result: V2=0 V1=1 or result:.' %s\n",line); | |
| fprintf(ficlog,"ERROR: no result lines! It should be at minimum 'result: V2=0 V1=1 or result:.' %s\n",line); | |
| } | } |
| /* goto end; */ | |
| break; | |
| case 15: | |
| printf("End of resultlines.\n"); | |
| fprintf(ficlog,"End of resultlines.\n"); | |
| break; | |
| default: /* parameterline =0 */ | |
| nresult=1; | |
| decoderesult(".",nresult ); /* No covariate */ | |
| } /* End switch parameterline */ | } /* End switch parameterline */ |
| }while(endishere==0); /* End do */ | }while(endishere==0); /* End do */ |