]> henry.ined.fr Git - .git/commitdiff
Summary: version 0.99r37
authorN. Brouard <brouard@ined.fr>
Fri, 9 Sep 2022 17:55:22 +0000 (17:55 +0000)
committerN. Brouard <brouard@ined.fr>
Fri, 9 Sep 2022 17:55:22 +0000 (17:55 +0000)
* imach.c (Module): Many improvements for fixing products of fixed
timevarying as well as fixed * fixed, and test with quantitative
covariate.

src/imach.c

index 1f5b195391c2c16743488b558a2a8ec226ab6ba3..512d3ebb61efffd5f4b93a3034e7fa1c34aed48c 100644 (file)
@@ -1,6 +1,13 @@
 /* $Id$
   $State$
   $Log$
+  Revision 1.338  2022/09/04 17:40:33  brouard
+  Summary: 0.99r36
+
+  * imach.c (Module): Now the easy runs i.e. without result or
+  model=1+age only did not work. The defautl combination should be 1
+  and not 0 because everything hasn't been tranformed yet.
+
   Revision 1.337  2022/09/02 14:26:02  brouard
   Summary: version 0.99r35
 
@@ -1315,6 +1322,7 @@ int cptcovprodnoage=0; /**< Number of covariate products without age */
 int cptcoveff=0; /* Total number of single dummy covariates (fixed or time varying) to vary for printing results (2**cptcoveff combinations of dummies)(computed in tricode as cptcov) */
 int ncovf=0; /* Total number of effective fixed covariates (dummy or quantitative) in the model */
 int ncovv=0; /* Total number of effective (wave) varying covariates (dummy or quantitative) in the model */
+int ncovvt=0; /* Total number of effective (wave) varying covariates (dummy or quantitative or products [without age]) in the model */
 int ncova=0; /* Total number of effective (wave and stepm) varying with age covariates (dummy of quantitative) in the model */
 int nsd=0; /**< Total number of single dummy variables (output) */
 int nsq=0; /**< Total number of single quantitative variables (output) */
@@ -1330,7 +1338,8 @@ int npar=NPARMAX; /* Number of parameters (nlstate+ndeath-1)*nlstate*ncovmodel;
 int nlstate=2; /* Number of live 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  nqv=0, ntv=0, nqtv=0;    /* Total number of quantitative variables, time variable (dummy), quantitative and time variable */ 
+int nqv=0, ntv=0, nqtv=0;    /* Total number of quantitative variables, time variable (dummy), quantitative and time variable*/
+int ncovcolt=0; /* ncovcolt=ncovcol+nqv+ntv+nqtv; total of covariates in the data, not in the model equation*/ 
 int popbased=0;
 
 int *wav; /* Number of waves for this individuual 0 is possible */
@@ -1572,7 +1581,13 @@ int *TvarVD; /* TvarVD[1]=V5 in V5+V4+V3+V4*V3+V5*age+V2+V1*V2+V1*age+V1 */ /* O
 int *TvarVDind; /* TvarVDind[1]=1 in V5+V4+V3+V4*V3+V5*age+V2+V1*V2+V1*age+V1 */ /* Only simple fixed quantitative variable */
 int *TvarVQ; /* TvarVQ[1]=V5 in V5+V4+V3+V4*V3+V5*age+V2+V1*V2+V1*age+V1 */ /* Only simple time varying quantitative variable */
 int *TvarVQind; /* TvarVQind[1]=1 in V5+V4+V3+V4*V3+V5*age+V2+V1*V2+V1*age+V1 */ /* Only simple time varying quantitative variable */
-
+int *TvarVV; /* We count ncovvt time varying covariates (single or products without age) and put their name into TvarVV */
+int *TvarVVind; /* We count ncovvt time varying covariates (single or products without age) and put their name into TvarVV */
+      /*#  ID           V1     V2          weight               birth   death   1st    s1      V3      V4      V5       2nd  s2 */
+      /* model V1+V3+age*V1+age*V3+V1*V3 */
+      /*  Tvar={1, 3, 1, 3, 6}, the 6 comes from the fact that there are already V1, V2, V3, V4, V5 native covariates */
+      /* TvarVV={3,1,3}, for V3 and then the product V1*V3 is decomposed into V1 and V3 */            
+      /* TvarVVind={2,5,5}, for V3 and then the product V1*V3 is decomposed into V1 and V3 */         
 int *Tvarsel; /**< Selected covariates for output */
 double *Tvalsel; /**< Selected modality value of covariate for output */
 int *Typevar; /**< 0 for simple covariate (dummy, quantitative, fixed or varying), 1 for age product, 2 for  product */
@@ -3273,12 +3288,12 @@ double **pmij(double **ps, double *cov, int ncovmodel, double *x, int nlstate )
   for(i=1; i<= nlstate; i++){
     s1=0;
     for(j=1; j<i; j++){
+      /* printf("debug1 %d %d ps=%lf exp(ps)=%lf \n",i,j,ps[i][j],exp(ps[i][j])); */
       s1+=exp(ps[i][j]); /* In fact sums pij/pii */
-      /* printf("debug1 %d %d ps=%lf exp(ps)=%lf s1+=%lf\n",i,j,ps[i][j],exp(ps[i][j]),s1); */
     }
     for(j=i+1; j<=nlstate+ndeath; j++){
+      /* printf("debug2 %d %d ps=%lf exp(ps)=%lf \n",i,j,ps[i][j],exp(ps[i][j])); */
       s1+=exp(ps[i][j]); /* In fact sums pij/pii */
-      /* printf("debug2 %d %d ps=%lf exp(ps)=%lf s1+=%lf\n",i,j,ps[i][j],exp(ps[i][j]),s1); */
     }
     /* s1= sum_{j<>i} pij/pii=(1-pii)/pii and thus pii is known from s1 */
     ps[i][i]=1./(s1+1.);
@@ -3856,6 +3871,8 @@ double func( double *x)
 {
   int i, ii, j, k, mi, d, kk, kf=0;
   int ioffset=0;
+  int ipos=0,iposold=0,ncovv=0;
+
   double l, ll[NLSTATEMAX+1], cov[NCOVMAX+1];
   double **out;
   double lli; /* Individual log likelihood */
@@ -3909,10 +3926,43 @@ double func( double *x)
       */
       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];
+       /* 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]; */
+       /* } */
+       for(ncovv=1, ipos=0; ncovv <= ncovvt ; ncovv++){ /* Varying  covariates (single and product but no age )*/
+         itv=TvarVV[ncovv]; /*  TvarVV={3, 1, 3}  */
+         ipos=TvarVVind[ncovv]; /* TvarVVind={2, 5, 5] */
+         if(ipos!=iposold){ /* Not a product or first of a product */
+           /* TvarFind={1,0,0,0}  */
+           if(TvarFind[itv]==0){
+           cov[ioffset+ipos]= cotvar[mw[mi][i]][ncovv][i];  /* Should be covar if fixed covar[Tvar[TvarFind[itv]]][i]*/
+           }else{
+             cov[ioffset+ipos]=covar[Tvar[TvarFind[itv]]][i];
+           }
+         }else{
+           if(TvarFind[itv]==0){
+             cov[ioffset+ipos]*= cotvar[mw[mi][i]][ncovv][i];  /* Should be covar if fixed covar[Tvar[TvarFind[itv]]][i]*/
+           }else{
+             cov[ioffset+ipos]*=covar[Tvar[TvarFind[itv]]][i];
+           }
+         }
+         iposold=ipos;
+         /* For products */
        }
+       /* for(itv=1; itv <= ntveff; itv++){ /\* Varying dummy covariates (single??)*\/ */
+       /*   iv= Tvar[Tmodelind[ioffset-2-nagesqr-cptcovage+itv]]-ncovcol-nqv; /\* Counting the # varying covariate from 1 to ntveff *\/ */
+       /*   cov[ioffset+iv]=cotvar[mw[mi][i]][iv][i]; */
+       /*   k=ioffset-2-nagesqr-cptcovage+itv; /\* position in simple model *\/ */
+       /*   cov[ioffset+itv]=cotvar[mw[mi][i]][TmodelInvind[itv]][i]; */
+       /*   printf(" i=%d,mi=%d,itv=%d,TmodelInvind[itv]=%d,cotvar[mw[mi][i]][TmodelInvind[itv]][i]=%f\n", i, mi, itv, TmodelInvind[itv],cotvar[mw[mi][i]][TmodelInvind[itv]][i]); */
+       /* } */
+       /* for(iqtv=1; iqtv <= nqtveff; iqtv++){ /\* Varying quantitatives covariates *\/ */
+       /*   iv=TmodelInvQind[iqtv]; /\* Counting the # varying covariate from 1 to ntveff *\/ */
+       /*   /\* printf(" i=%d,mi=%d,iqtv=%d,TmodelInvQind[iqtv]=%d,cotqvar[mw[mi][i]][TmodelInvQind[iqtv]][i]=%f\n", i, mi, iqtv, TmodelInvQind[iqtv],cotqvar[mw[mi][i]][TmodelInvQind[iqtv]][i]); *\/ */
+       /*   cov[ioffset+ntveff+iqtv]=cotqvar[mw[mi][i]][TmodelInvQind[iqtv]][i]; */
+       /* } */
+       /* for products of time varying to be done */
        for (ii=1;ii<=nlstate+ndeath;ii++)
          for (j=1;j<=nlstate+ndeath;j++){
            oldm[ii][j]=(ii==j ? 1.0 : 0.0);
@@ -3931,7 +3981,7 @@ double func( double *x)
            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 */
            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]]][i]*agexact;
          }
          out=matprod2(newm,oldm,1,nlstate+ndeath,1,nlstate+ndeath,
                       1,nlstate+ndeath,pmij(pmmij,cov,ncovmodel,x,nlstate));
@@ -4197,6 +4247,8 @@ double funcone( double *x)
   /* Same as func but slower because of a lot of printf and if */
   int i, ii, j, k, mi, d, kk, kf=0;
   int ioffset=0;
+  int ipos=0,iposold=0,ncovv=0;
+
   double l, ll[NLSTATEMAX+1], cov[NCOVMAX+1];
   double **out;
   double lli; /* Individual log likelihood */
@@ -4229,6 +4281,9 @@ double funcone( double *x)
     /* 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 (kf=1; kf<=ncovf;kf++){ /* Simple and product fixed covariates without age* products *//* Missing values are set to -1 but should be dropped */
+      /* printf("Debug3 TvarFind[%d]=%d",kf, TvarFind[kf]); */
+      /* printf(" Tvar[TvarFind[kf]]=%d", Tvar[TvarFind[kf]]); */
+      /* printf(" i=%d covar[Tvar[TvarFind[kf]]][i]=%f\n",i,covar[Tvar[TvarFind[kf]]][i]); */
       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 (k=6)*/
 /*    cov[ioffset+TvarFind[1]]=covar[Tvar[TvarFind[1]]][i];  */
 /*    cov[2+6]=covar[Tvar[6]][i];  */
@@ -4262,17 +4317,53 @@ double funcone( double *x)
     
 
     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 (single and product but no age )*/
-       /* cov[ioffset+TvarVind[k]]=cotvar[mw[mi][i]][Tvar[TvarVind[k]]][i]; */
-       cov[ioffset+TvarVind[k]]=cotvar[mw[mi][i]][Tvar[TvarVind[k]]-ncovcol-nqv][i];
+      /* Wave varying (but not age varying) *//* V1+V3+age*V1+age*V3+V1*V3 with V4 tv and V5 tvq k= 1 to 5 and extra at V(5+1)=6 for V1*V3 */
+      /* for(k=1; k <= ncovv ; k++){ /\* Varying  covariates (single and product but no age )*\/ */
+      /*       /\* cov[ioffset+TvarVind[k]]=cotvar[mw[mi][i]][Tvar[TvarVind[k]]][i]; *\/ */
+      /*       cov[ioffset+TvarVind[k]]=cotvar[mw[mi][i]][Tvar[TvarVind[k]]-ncovcol-nqv][i]; */
+      /* } */
+      
+      /*#  ID           V1     V2          weight               birth   death   1st    s1      V3      V4      V5       2nd  s2 */
+      /* model V1+V3+age*V1+age*V3+V1*V3 */
+      /*  Tvar={1, 3, 1, 3, 6}, the 6 comes from the fact that there are already V1, V2, V3, V4, V5 native covariates */
+      /*  TvarVV[1]=V3 (first time varying in the model equation, TvarVV[2]=V1 (in V1*V3) TvarVV[3]=3(V3)  */
+      /* We need the position of the time varying or product in the model */
+      /* TvarVVind={2,5,5}, for V3 at position 2 and then the product V1*V3 is decomposed into V1 and V3 but at same position 5 */            
+      /* TvarVV gives the variable name */
+      for(ncovv=1, ipos=0; ncovv <= ncovvt ; ncovv++){ /* Varying  covariates (single and product but no age )*/
+       itv=TvarVV[ncovv]; /*  TvarVV={3, 1, 3}  */
+       ipos=TvarVVind[ncovv]; /* TvarVVind={2, 5, 5] */
+       if(ipos!=iposold){ /* Not a product or first of a product */
+         /* TvarFind={1,0,0,0}  */
+         if(TvarFind[itv]==0){
+           cov[ioffset+ipos]= cotvar[mw[mi][i]][ncovv][i];  /* Should be covar if fixed covar[Tvar[TvarFind[itv]]][i]*/
+         }else{
+           cov[ioffset+ipos]=covar[Tvar[TvarFind[itv]]][i];
+         }
+       }else{
+         if(TvarFind[itv]==0){
+           cov[ioffset+ipos]*= cotvar[mw[mi][i]][ncovv][i];  /* Should be covar if fixed covar[Tvar[TvarFind[itv]]][i]*/
+         }else{
+           cov[ioffset+ipos]*=covar[Tvar[TvarFind[itv]]][i];
+         }
+       }
+       iposold=ipos;
+       /* For products */
       }
-      /* for(itv=1; itv <= ntveff; itv++){ /\* Varying dummy covariates (single??)*\/ */
-      /* iv= Tvar[Tmodelind[ioffset-2-nagesqr-cptcovage+itv]]-ncovcol-nqv; /\* Counting the # varying covariate from 1 to ntveff *\/ */
-      /* cov[ioffset+iv]=cotvar[mw[mi][i]][iv][i]; */
-      /* k=ioffset-2-nagesqr-cptcovage+itv; /\* position in simple model *\/ */
-      /* cov[ioffset+itv]=cotvar[mw[mi][i]][TmodelInvind[itv]][i]; */
-      /* printf(" i=%d,mi=%d,itv=%d,TmodelInvind[itv]=%d,cotvar[mw[mi][i]][TmodelInvind[itv]][i]=%f\n", i, mi, itv, TmodelInvind[itv],cotvar[mw[mi][i]][TmodelInvind[itv]][i]); */
+      /* for(itv=1; itv <= ntveff; itv++){ /\* Varying dummy covariates single *\/ */
+      /*       iv=TvarVDind[itv]; /\* iv, position in the model equation of time varying covariate itv *\/ */
+      /*       /\*         "V1+V3+age*V1+age*V3+V1*V3" with V3 time varying *\/ */
+      /*       /\*           1  2   3      4      5                         *\/ */
+      /*       /\*itv           1                                           *\/ */
+      /*       /\* TvarVInd[1]= 2                                           *\/ */
+      /*       /\* iv= Tvar[Tmodelind[itv]]-ncovcol-nqv;  /\\* Counting the # varying covariate from 1 to ntveff *\\/ *\/ */
+      /*       /\* iv= Tvar[Tmodelind[ioffset-2-nagesqr-cptcovage+itv]]-ncovcol-nqv; *\/ */
+      /*       /\* cov[ioffset+iv]=cotvar[mw[mi][i]][iv][i]; *\/ */
+      /*       /\* k=ioffset-2-nagesqr-cptcovage+itv; /\\* position in simple model *\\/ *\/ */
+      /*       /\* cov[ioffset+iv]=cotvar[mw[mi][i]][TmodelInvind[itv]][i]; *\/ */
+      /*       cov[ioffset+iv]=cotvar[mw[mi][i]][itv][i]; */
+      /*       /\* printf(" i=%d,mi=%d,itv=%d,TmodelInvind[itv]=%d,cotvar[mw[mi][i]][itv][i]=%f\n", i, mi, itv, TvarVDind[itv],cotvar[mw[mi][i]][itv][i]); *\/ */
+      /* } */
       /* for(iqtv=1; iqtv <= nqtveff; iqtv++){ /\* Varying quantitatives covariates *\/ */
       /*       iv=TmodelInvQind[iqtv]; /\* Counting the # varying covariate from 1 to ntveff *\/ */
       /*       /\* printf(" i=%d,mi=%d,iqtv=%d,TmodelInvQind[iqtv]=%d,cotqvar[mw[mi][i]][TmodelInvQind[iqtv]][i]=%f\n", i, mi, iqtv, TmodelInvQind[iqtv],cotqvar[mw[mi][i]][TmodelInvQind[iqtv]][i]); *\/ */
@@ -4299,7 +4390,7 @@ double funcone( double *x)
          if(!FixedV[Tvar[Tage[kk]]])
            cov[Tage[kk]+2+nagesqr]=covar[Tvar[Tage[kk]]][i]*agexact;
          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]]][i]*agexact;
        }
        /* printf("i=%d,mi=%d,d=%d,mw[mi][i]=%d\n",i, mi,d,mw[mi][i]); */
        /* savm=pmij(pmmij,cov,ncovmodel,x,nlstate); */
@@ -5997,12 +6088,14 @@ void  concatwav(int wav[], int **dh, int **bh,  int **mw, int **s, double *agedc
    /* Loop on covariates without age and products and no quantitative variable */
    for (k=1; k<=cptcovt; k++) { /* cptcovt: total number of covariates of the model (2) nbocc(+)+1 = 8 excepting constant and age and age*age */
      for (j=-1; (j < maxncov); j++) Ndum[j]=0;
-     if(Dummy[k]==0 && Typevar[k] !=1){ /* Dummy covariate and not age product */ 
+     printf("Testing k=%d, cptcovt=%d\n",k, cptcovt);
+     if(Dummy[k]==0 && Typevar[k] !=1 && Typevar[k] != 2){ /* Dummy covariate and not age product nor fixed product */ 
        switch(Fixed[k]) {
        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*/
+          /* printf("Waiting for error tricode Tvar[%d]=%d i=%d (int)(covar[Tvar[k]][i]=%d\n",k,Tvar[k], i, (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
            * If product of Vn*Vm, still boolean *:
@@ -10137,7 +10230,9 @@ int readdata(char datafile[], int firstobs, int lastobs, int *imax)
     printf("Covariate type in the data: V%d, DummyV(V%d)=%d, FixedV(V%d)=%d\n",v,v,DummyV[v],v,FixedV[v]);
     fprintf(ficlog,"Covariate type in the data: V%d, DummyV(V%d)=%d, FixedV(V%d)=%d\n",v,v,DummyV[v],v,FixedV[v]);
   }
-
+  
+  ncovcolt=ncovcol+nqv+ntv+nqtv; /* total of covariates in the data, not in the model equation */
+  
   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;
@@ -10718,8 +10813,9 @@ int decodemodel( char model[], int lastobs)
        * - cptcovn or number of covariates k of the models excluding age*products =6 and age*age
        * - cptcovage number of covariates with age*products =2
        * - cptcovs number of simple covariates
+       * ncovcolt=ncovcol+nqv+ntv+nqtv total of covariates in the data, not in the model equation
        * - Tvar[k] is the id of the kth covariate Tvar[1]@12 {1, 2, 3, 8, 10, 11, 8, 3, 7, 8, 5, 6}, thus Tvar[5=V7*V8]=10
-       *     which is a new column after the 9 (ncovcol) variables. 
+       *     which is a new column after the 9 (ncovcol+nqv+ntv+nqtv) variables. 
        * - if k is a product Vn*Vm, covar[k][i] is filled with correct values for each individual
        * - Tprod[l] gives the kth covariates of the product Vn*Vm l=1 to cptcovprod-cptcovage
        *    Tprod[1]@2 {5, 6}: position of first product V7*V8 is 5, and second V5*V6 is 6.
@@ -10863,12 +10959,12 @@ int decodemodel( char model[], int lastobs)
            cptcovn++;
            cptcovprodnoage++;k1++;
            cutl(stre,strb,strc,'V'); /* strc= Vn, stre is n; strb=V3*V2 stre=3 strc=*/
-           Tvar[k]=ncovcol+nqv+ntv+nqtv+k1; /* For model-covariate k tells which data-covariate to use but
+           Tvar[k]=ncovcol+nqv+ntv+nqtv+k1; /* ncovcolt+k1; For model-covariate k tells which data-covariate to use but
                                                because this model-covariate is a construction we invent a new column
                                                which is after existing variables ncovcol+nqv+ntv+nqtv + k1
                                                If already ncovcol=4 and model= V2 + V1 + V1*V4 + age*V3 + V3*V2
                                                thus after V4 we invent V5 and V6 because age*V3 will be computed in 4
-                                               Tvar[3=V1*V4]=4+1=5 Tvar[5=V3*V2]=4 + 2= 6, Tvar[4=age*V3]=4 etc */
+                                               Tvar[3=V1*V4]=4+1=5 Tvar[5=V3*V2]=4 + 2= 6, Tvar[4=age*V3]=3 etc */
            /* Please remark that the new variables are model dependent */
            /* If we have 4 variable but the model uses only 3, like in
             * model= V1 + age*V1 + V2 + V3 + age*V2 + age*V3 + V1*V2 + V1*V3
@@ -10877,7 +10973,7 @@ int decodemodel( char model[], int lastobs)
             * Tage[kk]    [1]= 2           [2]=5      [3]=6                  kk=1 to cptcovage=3
             * Tvar[Tage[kk]][1]=2          [2]=2      [3]=3
             */
-           Typevar[k]=2;  /* 2 for double fixed dummy covariates */
+           Typevar[k]=2;  /* 2 for product */
            cutl(strc,strb,strd,'V'); /* strd was Vm, strc is m */
            Tprod[k1]=k;  /* Tprod[1]=3(=V1*V4) for V2+V1+V1*V4+age*V3+V3*V2  */
            Tposprod[k]=k1; /* Tposprod[3]=1, Tposprod[2]=5 */
@@ -10890,11 +10986,13 @@ int decodemodel( char model[], int lastobs)
            /* Tvar[cptcovt+k2+1]=Tvard[k1][2];  /\* Tvar[(cptcovt=4+(k2=1)+1)=6]= 4 (V4) *\/ */
             /*ncovcol=4 and model=V2+V1+V1*V4+age*V3+V3*V2, Tvar[3]=5, Tvar[4]=6, cptcovt=5 */
            /*                     1  2   3      4     5 | Tvar[5+1)=1, Tvar[7]=2   */
-           for (i=1; i<=lastobs;i++){
+           if( FixedV[Tvardk[k][1]] == 0 && FixedV[Tvardk[k][2]] == 0){ /* If the product is a fixed covariate then we feed the new column with Vn*Vm */
+             for (i=1; i<=lastobs;i++){/* For fixed product */
              /* Computes the new covariate which is a product of
                 covar[n][i]* covar[m][i] and stores it at ncovol+k1 May not be defined */
-             covar[ncovcol+k1][i]=covar[atoi(stre)][i]*covar[atoi(strc)][i];
-           }
+             covar[ncovcolt+k1][i]=covar[atoi(stre)][i]*covar[atoi(strc)][i];
+             }
+           } /*End of FixedV */
          } /* End age is not in the model */
        } /* End if model includes a product */
        else { /* not a product */
@@ -10946,7 +11044,7 @@ Typevar: 0 for simple covariate (dummy, quantitative, fixed or varying), 1 for a
 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);
   for(k=-1;k<=cptcovt; k++){ Fixed[k]=0; Dummy[k]=0;}
-  for(k=1, ncovf=0, nsd=0, nsq=0, ncovv=0, ncova=0, ncoveff=0, nqfveff=0, ntveff=0, nqtveff=0;k<=cptcovt; k++){ /* or cptocvt */
+  for(k=1, ncovf=0, nsd=0, nsq=0, ncovv=0, ncova=0, ncoveff=0, nqfveff=0, ntveff=0, nqtveff=0, ncovvt=0;k<=cptcovt; k++){ /* or cptocvt */
     if (Tvar[k] <=ncovcol && Typevar[k]==0 ){ /* Simple fixed dummy (<=ncovcol) covariates */
       Fixed[k]= 0;
       Dummy[k]= 0;
@@ -10961,7 +11059,8 @@ Dummy[k] 0=dummy (0 1), 1 quantitative (single or product without age), 2 dummy
       TvarFind[ncovf]=k;
       TvarFD[ncoveff]=Tvar[k]; /* TvarFD[1]=V1 in V5+V4+V3+V4*V3+V5*age+V2+V1*V2+V1*age+V1 */
       TvarFDind[ncoveff]=k; /* TvarFDind[1]=9 in V5+V4+V3+V4*V3+V5*age+V2+V1*V2+V1*age+V1 */
-    }else if( Tvar[k] <=ncovcol &&  Typevar[k]==2){ /* Product of fixed dummy (<=ncovcol) covariates */
+    /* }else if( Tvar[k] <=ncovcol &&  Typevar[k]==2){ /\* Product of fixed dummy (<=ncovcol) covariates For a fixed product k is higher than ncovcol *\/ */
+    }else if( Tposprod[k]>0  &&  Typevar[k]==2 && FixedV[Tvardk[k][1]] == 0 && FixedV[Tvardk[k][2]] == 0){ /* Needs a fixed product Product of fixed dummy (<=ncovcol) covariates For a fixed product k is higher than ncovcol */
       Fixed[k]= 0;
       Dummy[k]= 0;
       ncoveff++;
@@ -10987,6 +11086,13 @@ Dummy[k] 0=dummy (0 1), 1 quantitative (single or product without age), 2 dummy
       TvarFQ[nqfveff]=Tvar[k]-ncovcol; /* TvarFQ[1]=V2-1=1st in V5+V4+V3+V4*V3+V5*age+V2+V1*V2+V1*age+V1 */ /* Only simple fixed quantitative variable */
       TvarFQind[nqfveff]=k; /* TvarFQind[1]=6 in V5+V4+V3+V4*V3+V5*age+V2+V1*V2+V1*age+V1 */ /* Only simple fixed quantitative variable */
     }else if( Tvar[k] <=ncovcol+nqv+ntv && Typevar[k]==0){/* Only simple time varying dummy variables */
+      /*#  ID           V1     V2          weight               birth   death   1st    s1      V3      V4      V5       2nd  s2 */
+      /* model V1+V3+age*V1+age*V3+V1*V3 */
+      /*  Tvar={1, 3, 1, 3, 6}, the 6 comes from the fact that there are already V1, V2, V3, V4, V5 native covariates */
+      ncovvt++;
+      TvarVV[ncovvt]=Tvar[k];  /*  TvarVV[1]=V3 (first time varying in the model equation  */
+      TvarVVind[ncovvt]=k;    /*  TvarVVind[1]=2 (second position in the model equation  */
+
       Fixed[k]= 1;
       Dummy[k]= 0;
       ntveff++; /* Only simple time varying dummy variable */
@@ -11004,6 +11110,13 @@ Dummy[k] 0=dummy (0 1), 1 quantitative (single or product without age), 2 dummy
       printf("Quasi Tmodelind[%d]=%d,Tvar[Tmodelind[%d]]=V%d, ncovcol=%d, nqv=%d,Tvar[k]- ncovcol-nqv=%d\n",ntveff,k,ntveff,Tvar[k], ncovcol, nqv,Tvar[k]- ncovcol-nqv);
       printf("Quasi TmodelInvind[%d]=%d\n",k,Tvar[k]- ncovcol-nqv);
     }else if( Tvar[k] <=ncovcol+nqv+ntv+nqtv  && Typevar[k]==0){ /* Only simple time varying quantitative variable V5*/
+      /*#  ID           V1     V2          weight               birth   death   1st    s1      V3      V4      V5       2nd  s2 */
+      /* model V1+V3+age*V1+age*V3+V1*V3 */
+      /*  Tvar={1, 3, 1, 3, 6}, the 6 comes from the fact that there are already V1, V2, V3, V4, V5 native covariates */
+      ncovvt++;
+      TvarVV[ncovvt]=Tvar[k];  /*  TvarVV[1]=V3 (first time varying in the model equation  */
+      TvarVVind[ncovvt]=k;  /*  TvarVV[1]=V3 (first time varying in the model equation  */
+      
       Fixed[k]= 1;
       Dummy[k]= 1;
       nqtveff++;
@@ -11050,10 +11163,21 @@ Dummy[k] 0=dummy (0 1), 1 quantitative (single or product without age), 2 dummy
        modell[k].subtype= APVQ;                /*      Product age * varying quantitative */
        /* nqtveff++;/\* Only simple time varying quantitative variable *\/ */
       }
-    }else if (Typevar[k] == 2) {  /* product without age */
-      k1=Tposprod[k];
-      if(Tvard[k1][1] <=ncovcol){
-       if(Tvard[k1][2] <=ncovcol){
+    }else if (Typevar[k] == 2) {  /* product Vn * Vm without age, V1+V3+age*V1+age*V3+V1*V3 looking at V1*V3, Typevar={0, 0, 1, 1, 2}, k=5, V1 is fixed, V3 is timevary, V5 is a product  */
+      /*#  ID           V1     V2          weight               birth   death   1st    s1      V3      V4      V5       2nd  s2 */
+      /* model V1+V3+age*V1+age*V3+V1*V3 */
+      /*  Tvar={1, 3, 1, 3, 6}, the 6 comes from the fact that there are already V1, V2, V3, V4, V5 native covariates */
+      k1=Tposprod[k];  /* Position in the products of product k, Tposprod={0, 0, 0, 0, 1} k1=1 first product but second time varying because of V3 */
+      ncovvt++;
+      TvarVV[ncovvt]=Tvard[k1][1];  /*  TvarVV[2]=V1 (because TvarVV[1] was V3, first time varying covariates */
+      TvarVVind[ncovvt]=k;  /*  TvarVVind[2]=5 (because TvarVVind[2] was V1*V3 at position 5 */
+      ncovvt++;
+      TvarVV[ncovvt]=Tvard[k1][2];  /*  TvarVV[3]=V3 */
+      TvarVVind[ncovvt]=k;  /*  TvarVVind[2]=5 (because TvarVVind[2] was V1*V3 at position 5 */
+
+
+      if(Tvard[k1][1] <=ncovcol){ /* Vn is dummy fixed, (Tvard[1][1]=V1), (Tvard[1][1]=V3 time varying) */
+       if(Tvard[k1][2] <=ncovcol){ /* Vm is dummy fixed */
          Fixed[k]= 1;
          Dummy[k]= 0;
          modell[k].maintype= FTYPE;
@@ -11061,23 +11185,23 @@ Dummy[k] 0=dummy (0 1), 1 quantitative (single or product without age), 2 dummy
          ncovf++; /* Fixed variables without age */
          TvarF[ncovf]=Tvar[k];
          TvarFind[ncovf]=k;
-       }else if(Tvard[k1][2] <=ncovcol+nqv){
-         Fixed[k]= 0;  /* or 2 ?*/
+       }else if(Tvard[k1][2] <=ncovcol+nqv){ /* Vm is quanti fixed */
+         Fixed[k]= 0;  /* Fixed product */
          Dummy[k]= 1;
          modell[k].maintype= FTYPE;
          modell[k].subtype= FPDQ;              /*      Product fixed dummy * fixed quantitative */
          ncovf++; /* Varying variables without age */
          TvarF[ncovf]=Tvar[k];
          TvarFind[ncovf]=k;
-       }else if(Tvard[k1][2] <=ncovcol+nqv+ntv){
+       }else if(Tvard[k1][2] <=ncovcol+nqv+ntv){ /* Vm is a time varying dummy covariate */
          Fixed[k]= 1;
          Dummy[k]= 0;
          modell[k].maintype= VTYPE;
          modell[k].subtype= VPDD;              /*      Product fixed dummy * varying dummy */
          ncovv++; /* Varying variables without age */
-         TvarV[ncovv]=Tvar[k];
-         TvarVind[ncovv]=k;
-       }else if(Tvard[k1][2] <=ncovcol+nqv+ntv+nqtv){
+         TvarV[ncovv]=Tvar[k];  /* TvarV[1]=Tvar[5]=5 because there is a V4 */
+         TvarVind[ncovv]=k;/* TvarVind[1]=5 */ 
+       }else if(Tvard[k1][2] <=ncovcol+nqv+ntv+nqtv){ /* Vm is a time varying quantitative covariate */
          Fixed[k]= 1;
          Dummy[k]= 1;
          modell[k].maintype= VTYPE;
@@ -11086,16 +11210,16 @@ Dummy[k] 0=dummy (0 1), 1 quantitative (single or product without age), 2 dummy
          TvarV[ncovv]=Tvar[k];
          TvarVind[ncovv]=k;
        }
-      }else if(Tvard[k1][1] <=ncovcol+nqv){
-       if(Tvard[k1][2] <=ncovcol){
-         Fixed[k]= 0;  /* or 2 ?*/
+      }else if(Tvard[k1][1] <=ncovcol+nqv){ /* Vn is fixed quanti  */
+       if(Tvard[k1][2] <=ncovcol){ /* Vm is fixed dummy */
+         Fixed[k]= 0;  /*  Fixed product */
          Dummy[k]= 1;
          modell[k].maintype= FTYPE;
          modell[k].subtype= FPDQ;              /*      Product fixed quantitative * fixed dummy */
          ncovf++; /* Fixed variables without age */
          TvarF[ncovf]=Tvar[k];
          TvarFind[ncovf]=k;
-       }else if(Tvard[k1][2] <=ncovcol+nqv+ntv){
+       }else if(Tvard[k1][2] <=ncovcol+nqv+ntv){ /* Vm is time varying */
          Fixed[k]= 1;
          Dummy[k]= 1;
          modell[k].maintype= VTYPE;
@@ -11103,7 +11227,7 @@ Dummy[k] 0=dummy (0 1), 1 quantitative (single or product without age), 2 dummy
          ncovv++; /* Varying variables without age */
          TvarV[ncovv]=Tvar[k];
          TvarVind[ncovv]=k;
-       }else if(Tvard[k1][2] <=ncovcol+nqv+ntv+nqtv){
+       }else if(Tvard[k1][2] <=ncovcol+nqv+ntv+nqtv){ /* Vm is time varying quanti */
          Fixed[k]= 1;
          Dummy[k]= 1;
          modell[k].maintype= VTYPE;
@@ -11115,7 +11239,7 @@ Dummy[k] 0=dummy (0 1), 1 quantitative (single or product without age), 2 dummy
          TvarV[ncovv]=Tvar[k];
          TvarVind[ncovv]=k;
        }
-      }else if(Tvard[k1][1] <=ncovcol+nqv+ntv){
+      }else if(Tvard[k1][1] <=ncovcol+nqv+ntv){ /* Vn is time varying dummy */
        if(Tvard[k1][2] <=ncovcol){
          Fixed[k]= 1;
          Dummy[k]= 1;
@@ -11149,7 +11273,7 @@ Dummy[k] 0=dummy (0 1), 1 quantitative (single or product without age), 2 dummy
          TvarV[ncovv]=Tvar[k];
          TvarVind[ncovv]=k;
        }
-      }else if(Tvard[k1][1] <=ncovcol+nqv+ntv+nqtv){
+      }else if(Tvard[k1][1] <=ncovcol+nqv+ntv+nqtv){ /* Vn is time varying quanti */
        if(Tvard[k1][2] <=ncovcol){
          Fixed[k]= 1;
          Dummy[k]= 1;
@@ -12640,6 +12764,8 @@ Please run with mle=-1 to get a correct covariance matrix.\n",optionfile,numline
   TvarVDind=ivector(1,NCOVMAX); /*  */
   TvarVQ=ivector(1,NCOVMAX); /*  */
   TvarVQind=ivector(1,NCOVMAX); /*  */
+  TvarVV=ivector(1,NCOVMAX); /*  */
+  TvarVVind=ivector(1,NCOVMAX); /*  */
 
   Tvalsel=vector(1,NCOVMAX); /*  */
   Tvarsel=ivector(1,NCOVMAX); /*  */
@@ -14200,6 +14326,9 @@ Please run with mle=-1 to get a correct covariance matrix.\n",ageminpar,agemaxpa
   free_ivector(TvarVDind,1,NCOVMAX);
   free_ivector(TvarVQ,1,NCOVMAX);
   free_ivector(TvarVQind,1,NCOVMAX);
+  free_ivector(TvarVV,1,NCOVMAX);
+  free_ivector(TvarVVind,1,NCOVMAX);
+  
   free_ivector(Tvarsel,1,NCOVMAX);
   free_vector(Tvalsel,1,NCOVMAX);
   free_ivector(Tposprod,1,NCOVMAX);