]> henry.ined.fr Git - .git/commitdiff
*** empty log message ***
authorN. Brouard <brouard@ined.fr>
Wed, 31 Aug 2022 09:52:36 +0000 (09:52 +0000)
committerN. Brouard <brouard@ined.fr>
Wed, 31 Aug 2022 09:52:36 +0000 (09:52 +0000)
src/ChangeLog
src/imach.c
src/version.h

index d8d15d80f83b5e4fae93866cd93f761e87245192..80df3883d5723f264eabc5c626fc0202f4e195a6 100644 (file)
@@ -1,3 +1,7 @@
+2022-08-31  Nicolas Brouard   <brouard@ined.fr>
+
+       * imach.c (Module): Some improvments in fichtm and many verifications 0.99r34
+
 2022-08-21  Nicolas Brouard   <brouard@ined.fr>
 
        * imach.c (Module): Version 0.99r33 A lot of changes in
index d4e416cb9f36f11f8ae77f885296b86ff67724c6..9dc181674318ccc3a8089fae8bd5554484dd851f 100644 (file)
@@ -1,6 +1,9 @@
 /* $Id$
   $State$
   $Log$
+  Revision 1.335  2022/08/31 08:23:16  brouard
+  Summary: improvements...
+
   Revision 1.334  2022/08/25 09:08:41  brouard
   Summary: In progress for quantitative
 
@@ -3505,7 +3508,8 @@ double **matprod2(double **out, double **in,int nrl, int nrh, int ncl, int nch,
 
 double ***hpxij(double ***po, int nhstepm, double age, int hstepm, double *x, int nlstate, int stepm, double **oldm, double **savm, int ij, int nres )
 {
-  /* Computes the transition matrix starting at age 'age' and dummies values in each resultline (loop on ij to find the corresponding combination) to over 
+  /* Already optimized with precov.
+     Computes the transition matrix starting at age 'age' and dummies values in each resultline (loop on ij to find the corresponding combination) to over 
      'nhstepm*hstepm*stepm' months (i.e. until
      age (in years)  age+nhstepm*hstepm*stepm/12) by multiplying 
      nhstepm*hstepm matrices. 
@@ -3836,16 +3840,17 @@ double ***hbxij(double ***po, int nhstepm, double age, int hstepm, double *x, do
 /*************** log-likelihood *************/
 double func( double *x)
 {
-  int i, ii, j, k, mi, d, kk;
+  int i, ii, j, k, mi, d, kk, kf=0;
   int ioffset=0;
   double l, ll[NLSTATEMAX+1], cov[NCOVMAX+1];
   double **out;
   double lli; /* Individual log likelihood */
   int s1, s2;
   int iv=0, iqv=0, itv=0, iqtv=0 ; /* Index of varying covariate, fixed quantitative cov, time varying covariate, quantitative time varying covariate */
+
   double bbh, survp;
-  long ipmx;
   double agexact;
+  double agebegin, ageend;
   /*extern weight */
   /* We are differentiating ll according to initial status */
   /*  for (i=1;i<=npar;i++) printf("%f ", x[i]);*/
@@ -3868,12 +3873,12 @@ double func( double *x)
       */
       ioffset=2+nagesqr ;
    /* Fixed */
-      for (k=1; k<=ncovf;k++){ /* For each fixed covariate dummu or quant or prod */
+      for (kf=1; kf<=ncovf;kf++){ /* For each fixed covariate dummu or quant or prod */
        /* # 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 */
        /*  TvarF[1]=Tvar[6]=2,  TvarF[2]=Tvar[7]=7, TvarF[3]=Tvar[9]=1  ID of fixed covariates or product V2, V1*V2, V1 */
         /* TvarFind;  TvarFind[1]=6,  TvarFind[2]=7, TvarFind[3]=9 *//* Inverse V2(6) is first fixed (single or prod)  */
-       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 (TvarFind[1]=6)*/
+       cov[ioffset+TvarFind[kf]]=covar[Tvar[TvarFind[kf]]][i];/* V5+V4+V3+V4*V3+V5*age+V2+V1*V2+V1*age+V1, only V1 is fixed (TvarFind[1]=6)*/
        /* V1*V2 (7)  TvarFind[2]=7, TvarFind[3]=9 */
       }
       /* In model V2+V1*V4+age*V3+V3*V2 Tvar[1] is V2, Tvar[2=V1*V4] 
@@ -3888,7 +3893,8 @@ double func( double *x)
         But if the variable is not in the model TTvar[iv] is the real variable effective in the model:
         meaning that decodemodel should be used cotvar[mw[mi+1][i]][TTvar[iv]][i]
       */
-      for(mi=1; mi<= wav[i]-1; mi++){
+      for(mi=1; mi<= wav[i]-1; mi++){  /* Varying with waves */
+      /* Wave varying (but not age varying) */
        for(k=1; k <= ncovv ; k++){ /* Varying  covariates in the model (single and product but no age )"V5+V4+V3+V4*V3+V5*age+V1*age+V1" +TvarVind 1,2,3,4(V4*V3)  Tvar[1]@7{5, 4, 3, 6, 5, 1, 1 ; 6 because the created covar is after V5 and is 6, minus 1+1, 3,2,1,4 positions in cotvar*/
          /* cov[ioffset+TvarVind[k]]=cotvar[mw[mi][i]][Tvar[TvarVind[k]]][i]; but where is the crossproduct? */
          cov[ioffset+TvarVind[k]]=cotvar[mw[mi][i]][Tvar[TvarVind[k]]-ncovcol-nqv][i];
@@ -3898,6 +3904,9 @@ double func( double *x)
            oldm[ii][j]=(ii==j ? 1.0 : 0.0);
            savm[ii][j]=(ii==j ? 1.0 : 0.0);
          }
+
+       agebegin=agev[mw[mi][i]][i]; /* Age at beginning of effective wave */
+       ageend=agev[mw[mi][i]][i] + (dh[mi][i])*stepm/YEARM; /* Age at end of effective wave and at the end of transition */
        for(d=0; d<dh[mi][i]; d++){
          newm=savm;
          agexact=agev[mw[mi][i]][i]+d*stepm/YEARM;
@@ -3988,16 +3997,16 @@ double func( double *x)
          /*survp += out[s1][j]; */
          lli= log(survp);
        }
-       else if  (s2==-4) { 
-         for (j=3,survp=0. ; j<=nlstate; j++)  
-           survp += (1.+bbh)*out[s1][j]- bbh*savm[s1][j];
-         lli= log(survp); 
-       } 
-       else if  (s2==-5) { 
-         for (j=1,survp=0. ; j<=2; j++)  
-           survp += (1.+bbh)*out[s1][j]- bbh*savm[s1][j];
-         lli= log(survp); 
-       } 
+       /* else if  (s2==-4) {  */
+       /*   for (j=3,survp=0. ; j<=nlstate; j++)   */
+       /*     survp += (1.+bbh)*out[s1][j]- bbh*savm[s1][j]; */
+       /*   lli= log(survp);  */
+       /* }  */
+       /* else if  (s2==-5) {  */
+       /*   for (j=1,survp=0. ; j<=2; j++)   */
+       /*     survp += (1.+bbh)*out[s1][j]- bbh*savm[s1][j]; */
+       /*   lli= log(survp);  */
+       /* }  */
        else{
          lli= log((1.+bbh)*out[s1][s2]- bbh*savm[s1][s2]); /* linear interpolation */
          /*  lli= (savm[s1][s2]>(double)1.e-8 ?log((1.+bbh)*out[s1][s2]- bbh*(savm[s1][s2])):log((1.+bbh)*out[s1][s2]));*/ /* linear interpolation */
@@ -4195,6 +4204,11 @@ double funcone( double *x)
   for(k=1; k<=nlstate; k++) ll[k]=0.;
   ioffset=0;
   for (i=1,ipmx=0, sw=0.; i<=imx; i++){
+    /* Computes the values of the ncovmodel covariates of the model
+       depending if the covariates are fixed or varying (age dependent) and stores them in cov[]
+       Then computes with function pmij which return a matrix p[i][j] giving the elementary probability
+       to be observed in j being in i according to the model.
+    */
     /* ioffset=2+nagesqr+cptcovage; */
     ioffset=2+nagesqr;
     /* Fixed */
@@ -4212,6 +4226,19 @@ double funcone( double *x)
 /*    cov[2+9]=covar[Tvar[9]][i];  */
 /*    cov[2+9]=covar[1][i]; V1  */
     }
+      /* In model V2+V1*V4+age*V3+V3*V2 Tvar[1] is V2, Tvar[2=V1*V4] 
+        is 5, Tvar[3=age*V3] should not be computed because of age Tvar[4=V3*V2]=6 
+        has been calculated etc */
+      /* For an individual i, wav[i] gives the number of effective waves */
+      /* We compute the contribution to Likelihood of each effective transition
+        mw[mi][i] is real wave of the mi th effectve wave */
+      /* Then statuses are computed at each begin and end of an effective wave s1=s[ mw[mi][i] ][i];
+        s2=s[mw[mi+1][i]][i];
+        And the iv th varying covariate is the cotvar[mw[mi+1][i]][iv][i]
+        But if the variable is not in the model TTvar[iv] is the real variable effective in the model:
+        meaning that decodemodel should be used cotvar[mw[mi+1][i]][TTvar[iv]][i]
+      */
+    /* This part may be useless now because everythin should be in covar */
     /* for (k=1; k<=nqfveff;k++){ /\* Simple and product fixed Quantitative covariates without age* products *\/ */
     /*   cov[++ioffset]=coqvar[TvarFQ[k]][i];/\* V5+V4+V3+V4*V3+V5*age+V2+V1*V2+V1*age+V1, only V2 and V1*V2 is fixed (k=6 and 7?)*\/ */
     /* } */
@@ -4269,7 +4296,19 @@ double funcone( double *x)
        savm=oldm;
        oldm=newm;
       } /* end mult */
-      
+       /*lli=log(out[s[mw[mi][i]][i]][s[mw[mi+1][i]][i]]);*/ /* Original formula */
+       /* But now since version 0.9 we anticipate for bias at large stepm.
+        * If stepm is larger than one month (smallest stepm) and if the exact delay 
+        * (in months) between two waves is not a multiple of stepm, we rounded to 
+        * the nearest (and in case of equal distance, to the lowest) interval but now
+        * we keep into memory the bias bh[mi][i] and also the previous matrix product
+        * (i.e to dh[mi][i]-1) saved in 'savm'. Then we inter(extra)polate the
+        * probability in order to take into account the bias as a fraction of the way
+                                * from savm to out if bh is negative or even beyond if bh is positive. bh varies
+                                * -stepm/2 to stepm/2 .
+                                * For stepm=1 the results are the same as for previous versions of Imach.
+                                * For stepm > 1 the results are less biased than in previous versions. 
+                                */
       s1=s[mw[mi][i]][i];
       s2=s[mw[mi+1][i]][i];
       /* if(s2==-1){ */
@@ -6231,6 +6270,7 @@ void  concatwav(int wav[], int **dh, int **bh,  int **mw, int **s, double *agedc
   /* Covariances of health expectancies eij and of total life expectancies according
      to initial status i, ei. .
   */
+  /* Very time consuming function, but already optimized with precov */
   int i, j, nhstepm, hstepm, h, nstepm, k, cptj, cptj2, i2, j2, ij, ji;
   int nhstepma, nstepma; /* Decreasing with age */
   double age, agelim, hf;
@@ -11605,7 +11645,7 @@ int back_prevalence_limit(double *p, double **bprlim, double ageminpar, double a
  
 int hPijx(double *p, int bage, int fage){
     /*------------- h Pij x at various ages ------------*/
-
+  /* to be optimized with precov */
   int stepsize;
   int agelim;
   int hstepm;
@@ -11682,7 +11722,7 @@ int hPijx(double *p, int bage, int fage){
  
  int hBijx(double *p, int bage, int fage, double ***prevacurrent){
     /*------------- h Bij x at various ages ------------*/
-
+    /* To be optimized with precov */
   int stepsize;
   /* int agelim; */
        int ageminl;
@@ -12444,7 +12484,7 @@ Please run with mle=-1 to get a correct covariance matrix.\n",optionfile,numline
   mint=matrix(1,maxwav,firstobs,lastobs);
   anint=matrix(1,maxwav,firstobs,lastobs);
   s=imatrix(1,maxwav+1,firstobs,lastobs); /* s[i][j] health state for wave i and individual j */
-  printf("BUG ncovmodel=%d NCOVMAX=%d 2**ncovmodel=%f BUG\n",ncovmodel,NCOVMAX,pow(2,ncovmodel));
+  /* printf("BUG ncovmodel=%d NCOVMAX=%d 2**ncovmodel=%f BUG\n",ncovmodel,NCOVMAX,pow(2,ncovmodel)); */
   tab=ivector(1,NCOVMAX);
   ncodemax=ivector(1,NCOVMAX); /* Number of code per covariate; if O and 1 only, 2**ncov; V1+V2+V3+V4=>16 */
   ncodemaxwundef=ivector(1,NCOVMAX); /* Number of code per covariate; if - 1 O and 1 only, 2**ncov; V1+V2+V3+V4=>16 */
@@ -13758,7 +13798,7 @@ Please run with mle=-1 to get a correct covariance matrix.\n",ageminpar,agemaxpa
 
                
     /*---------- State-specific expectancies and variances ------------*/
-               
+    /* Should be moved in a function */                
     strcpy(filerest,"T_");
     strcat(filerest,fileresu);
     if((ficrest=fopen(filerest,"w"))==NULL) {
index a5866bfcec4240154819608db6d9f379e3f41439..8350ff78991b8958b0af90e60c99db74b6c721cd 100644 (file)
@@ -3,3 +3,4 @@
 #define __IMACH_VERSION_PATCH__ 0\r
 \r
 #define __IMACH_VERSION__ "0.99r34"\r
+