From e7c2b2bb2e3ef21384de0d626dae3a7038c3817e Mon Sep 17 00:00:00 2001 From: "N. Brouard" Date: Tue, 31 Jan 2023 09:19:37 +0000 Subject: [PATCH] Summary: Improvements in models with age*Vn*Vm --- src/imach.c | 1204 ++++++++++++++++++++++++++++++++++++++------------- 1 file changed, 895 insertions(+), 309 deletions(-) diff --git a/src/imach.c b/src/imach.c index b11af2b..91c768c 100644 --- a/src/imach.c +++ b/src/imach.c @@ -1314,7 +1314,7 @@ typedef struct { /* #include */ /* #define _(String) gettext (String) */ -#define MAXLINE 2048 /* Was 256 and 1024. Overflow with 312 with 2 states and 4 covariates. Should be ok */ +#define MAXLINE 16384 /* Was 256 and 1024 and 2048. Overflow with 312 with 2 states and 4 covariates. Should be ok */ #define GNUPLOTPROGRAM "gnuplot" #define GNUPLOTVERSION 5.1 @@ -1325,7 +1325,7 @@ double gnuplotversion=GNUPLOTVERSION; #define GLOCK_ERROR_NOPATH -1 /* empty path */ #define GLOCK_ERROR_GETCWD -2 /* cannot get cwd */ -#define MAXPARM 128 /**< Maximum number of parameters for the optimization */ +#define MAXPARM 216 /**< Maximum number of parameters for the optimization was 128 */ #define NPARMAX 64 /**< (nlstate+ndeath-1)*nlstate*ncovmodel */ #define NINTERVMAX 8 @@ -1359,7 +1359,7 @@ double gnuplotversion=GNUPLOTVERSION; /* $State$ */ #include "version.h" char version[]=__IMACH_VERSION__; -char copyright[]="September 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 copyright[]="January 2023,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 strstart[80]; char optionfilext[10], optionfilefiname[FILENAMELENGTH]; @@ -1373,12 +1373,18 @@ int cptcovt=0; /**< cptcovt: total number of covariates of the model (2) nbocc(+ int cptcovs=0; /**< cptcovs number of SIMPLE covariates in the model V2+V1 =2 (dummy or quantit or time varying) */ int cptcovsnq=0; /**< cptcovsnq number of SIMPLE covariates in the model but non quantitative V2+V1 =2 */ int cptcovage=0; /**< Number of covariates with age: V3*age only =1 */ +int cptcovprodage=0; /**< Number of fixed covariates with age: V3*age or V2*V3*age 1 */ +int cptcovprodvage=0; /**< Number of varying covariates with age: V7*age or V7*V6*age */ +int cptcovdageprod=0; /**< Number of doubleproducts with age, since 0.99r44 only: age*Vn*Vm for gnuplot printing*/ 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 ncovvta=0; /* +age*V6 + age*V7+ age*V6*V3 +age*V7*V3 + age*V6*V4 +age*V7*V4 Total number of expandend products [with age]) in the model */ +int ncovta=0; /*age*V3*V2 +age*V2+agev3+ageV4 +age*V6 + age*V7+ age*V6*V3 +age*V7*V3 + age*V6*V4 +age*V7*V4 Total number of expandend products [with age]) in the model */ +int ncova=0; /* Total number of effective (wave and stepm) varying with age covariates (single or product, dummy or quantitative) in the model */ +int ncovva=0; /* +age*V6 + age*V7+ge*V6*V3 +age*V7*V3 + age*V6*V4 +age*V7*V4 Total number of effective (wave and stepm) varying with age covariates (single or product, dummy or quantitative) in the model */ int nsd=0; /**< Total number of single dummy variables (output) */ int nsq=0; /**< Total number of single quantitative variables (output) */ int ncoveff=0; /* Total number of effective fixed dummy covariates in the model */ @@ -1465,6 +1471,7 @@ extern time_t time(); struct tm start_time, end_time, curr_time, last_time, forecast_time; time_t rstart_time, rend_time, rcurr_time, rlast_time, rforecast_time; /* raw time */ +time_t rlast_btime; /* raw time */ struct tm tm; char strcurr[80], strfor[80]; @@ -1568,27 +1575,27 @@ int **nbcode, *Tvar; /**< model=V2 => Tvar[1]= 2 */ # 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 */ -/* kmodel 1 2 3 4 5 6 7 8 9 */ -/*Typevar[k]= 0 0 0 2 1 0 2 1 0 *//*0 for simple covariate (dummy, quantitative,*/ - /* fixed or varying), 1 for age product, 2 for*/ - /* product */ -/*Dummy[k]= 1 0 0 1 3 1 1 2 0 *//*Dummy[k] 0=dummy (0 1), 1 quantitative */ - /*(single or product without age), 2 dummy*/ - /* with age product, 3 quant with age product*/ -/*Tvar[k]= 5 4 3 6 5 2 7 1 1 */ -/* nsd 1 2 3 */ /* Counting single dummies covar fixed or tv */ -/*TnsdVar[Tvar] 1 2 3 */ -/*Tvaraff[nsd] 4 3 1 */ /* ID of single dummy cova fixed or timevary*/ -/*TvarsD[nsd] 4 3 1 */ /* ID of single dummy cova fixed or timevary*/ -/*TvarsDind[nsd] 2 3 9 */ /* position K of single dummy cova */ -/* nsq 1 2 */ /* Counting single quantit tv */ -/* TvarsQ[k] 5 2 */ /* Number of single quantitative cova */ -/* TvarsQind 1 6 */ /* position K of single quantitative cova */ -/* Tprod[i]=k 1 2 */ /* Position in model of the ith prod without age */ -/* cptcovage 1 2 */ /* Counting cov*age in the model equation */ -/* Tage[cptcovage]=k 5 8 */ /* Position in the model of ith cov*age */ -/* Tvard[1][1]@4={4,3,1,2} V4*V3 V1*V2 */ /* Position in model of the ith prod without age */ +/* V5+V4+ V3+V4*V3 +V5*age+V2 +V1*V2+V1*age+V1+V4*V3*age */ +/* kmodel 1 2 3 4 5 6 7 8 9 10 */ +/*Typevar[k]= 0 0 0 2 1 0 2 1 0 3 *//*0 for simple covariate (dummy, quantitative,*/ + /* fixed or varying), 1 for age product, 2 for*/ + /* product without age, 3 for age and double product */ +/*Dummy[k]= 1 0 0 1 3 1 1 2 0 3 *//*Dummy[k] 0=dummy (0 1), 1 quantitative */ + /*(single or product without age), 2 dummy*/ + /* with age product, 3 quant with age product*/ +/*Tvar[k]= 5 4 3 6 5 2 7 1 1 6 */ +/* nsd 1 2 3 */ /* Counting single dummies covar fixed or tv */ +/*TnsdVar[Tvar] 1 2 3 */ +/*Tvaraff[nsd] 4 3 1 */ /* ID of single dummy cova fixed or timevary*/ +/*TvarsD[nsd] 4 3 1 */ /* ID of single dummy cova fixed or timevary*/ +/*TvarsDind[nsd] 2 3 9 */ /* position K of single dummy cova */ +/* nsq 1 2 */ /* Counting single quantit tv */ +/* TvarsQ[k] 5 2 */ /* Number of single quantitative cova */ +/* TvarsQind 1 6 */ /* position K of single quantitative cova */ +/* Tprod[i]=k 1 2 */ /* Position in model of the ith prod without age */ +/* cptcovage 1 2 3 */ /* Counting cov*age in the model equation */ +/* Tage[cptcovage]=k 5 8 10 */ /* Position in the model of ith cov*age */ +/* Tvard[1][1]@4={4,3,1,2} V4*V3 V1*V2 */ /* Position in model of the ith prod without age */ /* Tvardk[4][1]=4;Tvardk[4][2]=3;Tvardk[7][1]=1;Tvardk[7][2]=2 */ /* Variables of a prod at position in the model equation*/ /* TvarF 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) */ @@ -1638,14 +1645,18 @@ int *TvarVQ; /* TvarVQ[1]=V5 in V5+V4+V3+V4*V3+V5*age+V2+V1*V2+V1*age+V1 */ /* O 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 */ +int *TvarVVA; /* We count ncovvt time varying covariates (single or products with age) and put their name into TvarVVA */ +int *TvarVVAind; /* We count ncovvt time varying covariates (single or products without age) and put their name into TvarVV */ +int *TvarAVVA; /* We count ALL ncovta time varying covariates (single or products with age) and put their name into TvarVVA */ +int *TvarAVVAind; /* We count ALL ncovta 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 */ + /* model V1+V3+age*V1+age*V3+V1*V3 + V1*V3*age */ + /* Tvar={1, 3, 1, 3, 6, 6}, the 6 comes from the fact that there are already V1, V2, V3, V4, V5 native covariates */ + /* TvarVV={3,1,3,1,3}, for V3 and then the product V1*V3 is decomposed into V1 and V3 */ + /* TvarVVind={2,5,5,6,6}, for V3 and then the product V1*V3 is decomposed into V1 and V3 and V1*V3*age into 6,6 */ 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 */ +int *Typevar; /**< 0 for simple covariate (dummy, quantitative, fixed or varying), 1 for age product, 2 for product, 3 age*Vn*Vm */ int *Fixed; /** Fixed[k] 0=fixed, 1 varying, 2 fixed with age product, 3 varying with age product */ int *Dummy; /** Dummy[k] 0=dummy (0 1), 1 quantitative (single or product without age), 2 dummy with age product, 3 quant with age product */ int *DummyV; /** Dummy[v] 0=dummy (0 1), 1 quantitative */ @@ -1808,19 +1819,19 @@ char *trimbb(char *out, char *in) char *substrchaine(char *out, char *in, char *chain) { /* Substract chain 'chain' from 'in', return and output 'out' */ - /* in="V1+V1*age+age*age+V2", chain="age*age" */ + /* in="V1+V1*age+age*age+V2", chain="+age*age" out="V1+V1*age+V2" */ char *strloc; - strcpy (out, in); - strloc = strstr(out, chain); /* strloc points to out at age*age+V2 */ - printf("Bef strloc=%s chain=%s out=%s \n", strloc, chain, out); + strcpy (out, in); /* out="V1+V1*age+age*age+V2" */ + strloc = strstr(out, chain); /* strloc points to out at "+age*age+V2" */ + printf("Bef strloc=%s chain=%s out=%s \n", strloc, chain, out); /* strloc=+age*age+V2 chain="+age*age", out="V1+V1*age+age*age+V2" */ if(strloc != NULL){ - /* will affect out */ /* strloc+strlenc(chain)=+V2 */ /* Will also work in Unicode */ - memmove(strloc,strloc+strlen(chain), strlen(strloc+strlen(chain))+1); - /* strcpy (strloc, strloc +strlen(chain));*/ + /* will affect out */ /* strloc+strlen(chain)=|+V2 = "V1+V1*age+age*age|+V2" */ /* Will also work in Unicodek */ + memmove(strloc,strloc+strlen(chain), strlen(strloc+strlen(chain))+1); /* move number of bytes corresponding to the length of "+V2" which is 3, plus one is 4 (including the null)*/ + /* equivalent to strcpy (strloc, strloc +strlen(chain)) if no overlap; Copies from "+V2" to V1+V1*age+ */ } - printf("Aft strloc=%s chain=%s in=%s out=%s \n", strloc, chain, in, out); + printf("Aft strloc=%s chain=%s in=%s out=%s \n", strloc, chain, in, out); /* strloc=+V2 chain="+age*age", in="V1+V1*age+age*age+V2", out="V1+V1*age+V2" */ return out; } @@ -1828,7 +1839,7 @@ char *substrchaine(char *out, char *in, char *chain) char *cutl(char *blocc, char *alocc, char *in, 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 cutl(blocc,alocc,"abcdef2ghi2j",'2') gives alocc="abcdef" and blocc="ghi2j". If occ is not found blocc is null and alocc is equal to in. Returns blocc */ @@ -1894,6 +1905,28 @@ int nbocc(char *s, char occ) return j; } +int nboccstr(char *textin, char *chain) +{ + /* Counts the number of occurence of "chain" in string textin */ + /* in="+V7*V4+age*V2+age*V3+age*V4" chain="age" */ + char *strloc; + + int i,j=0; + + i=0; + + strloc=textin; /* strloc points to "^+V7*V4+age+..." in textin */ + for(;;) { + strloc= strstr(strloc,chain); /* strloc points to first character of chain in textin if found. Example strloc points^ to "+V7*V4+^age" in textin */ + if(strloc != NULL){ + strloc = strloc+strlen(chain); /* strloc points to "+V7*V4+age^" in textin */ + j++; + }else + break; + } + return j; + +} /* void cutv(char *u,char *v, char*t, char occ) */ /* { */ /* /\* cuts string t into u and v where u ends before last occurence of char 'occ' */ @@ -2573,7 +2606,8 @@ void powell(double p[], double **xi, int n, double ftol, int *iter, double *fret double fp,fptt; double *xits; int niterf, itmp; - + int Bigter=0, nBigterf=1; + pt=vector(1,n); ptt=vector(1,n); xit=vector(1,n); @@ -2586,14 +2620,16 @@ void powell(double p[], double **xi, int n, double ftol, int *iter, double *fret ibig=0; del=0.0; rlast_time=rcurr_time; + rlast_btime=rcurr_time; /* (void) gettimeofday(&curr_time,&tzp); */ rcurr_time = time(NULL); curr_time = *localtime(&rcurr_time); /* printf("\nPowell iter=%d -2*LL=%.12f gain=%.12f=%.3g %ld sec. %ld sec.",*iter,*fret, fp-*fret,fp-*fret, rcurr_time-rlast_time, rcurr_time-rstart_time);fflush(stdout); */ /* fprintf(ficlog,"\nPowell iter=%d -2*LL=%.12f gain=%.12f=%.3g %ld sec. %ld sec.",*iter,*fret, fp-*fret,fp-*fret,rcurr_time-rlast_time, rcurr_time-rstart_time); fflush(ficlog); */ - printf("\nPowell iter=%d -2*LL=%.12f gain=%.3lg %ld sec. %ld sec.",*iter,*fret,fp-*fret, rcurr_time-rlast_time, rcurr_time-rstart_time);fflush(stdout); - fprintf(ficlog,"\nPowell iter=%d -2*LL=%.12f gain=%.3lg %ld sec. %ld sec.",*iter,*fret,fp-*fret,rcurr_time-rlast_time, rcurr_time-rstart_time); fflush(ficlog); -/* fprintf(ficrespow,"%d %.12f %ld",*iter,*fret,curr_time.tm_sec-start_time.tm_sec); */ + Bigter=(*iter - *iter % ncovmodel)/ncovmodel +1; /* Big iteration, i.e on ncovmodel cycle */ + printf("\nPowell iter=%d Big Iter=%d -2*LL=%.12f gain=%.3lg %ld sec. %ld sec.",*iter,Bigter,*fret,fp-*fret, rcurr_time-rlast_time, rcurr_time-rstart_time);fflush(stdout); + fprintf(ficlog,"\nPowell iter=%d Big Iter=%d -2*LL=%.12f gain=%.3lg %ld sec. %ld sec.",*iter,Bigter,*fret,fp-*fret,rcurr_time-rlast_time, rcurr_time-rstart_time); fflush(ficlog); + fprintf(ficrespow,"%d %d %.12f %d",*iter,Bigter, *fret,curr_time.tm_sec-start_time.tm_sec); fp=(*fret); /* From former iteration or initial value */ for (i=1;i<=n;i++) { fprintf(ficrespow," %.12lf", p[i]); @@ -2615,6 +2651,9 @@ void powell(double p[], double **xi, int n, double ftol, int *iter, double *fret }else if(Typevar[j]==2) { printf(" + V%d*V%d ",Tvard[Tposprod[j]][1],Tvard[Tposprod[j]][2]); fprintf(ficlog," + V%d*V%d ",Tvard[Tposprod[j]][1],Tvard[Tposprod[j]][2]); + }else if(Typevar[j]==3) { + printf(" + V%d*V%d*age ",Tvard[Tposprod[j]][1],Tvard[Tposprod[j]][2]); + fprintf(ficlog," + V%d*V%d*age ",Tvard[Tposprod[j]][1],Tvard[Tposprod[j]][2]); } } printf("\n"); @@ -2645,15 +2684,17 @@ void powell(double p[], double **xi, int n, double ftol, int *iter, double *fret strcurr[itmp-1]='\0'; printf("\nConsidering the time needed for the last iteration #%d: %ld seconds,\n",*iter,rcurr_time-rlast_time); fprintf(ficlog,"\nConsidering the time needed for this last iteration #%d: %ld seconds,\n",*iter,rcurr_time-rlast_time); - for(niterf=10;niterf<=30;niterf+=10){ + for(nBigterf=1;nBigterf<=31;nBigterf+=10){ + niterf=nBigterf*ncovmodel; + /* rforecast_time=rcurr_time+(niterf-*iter)*(rcurr_time-rlast_time); */ rforecast_time=rcurr_time+(niterf-*iter)*(rcurr_time-rlast_time); forecast_time = *localtime(&rforecast_time); strcpy(strfor,asctime(&forecast_time)); itmp = strlen(strfor); if(strfor[itmp-1]=='\n') strfor[itmp-1]='\0'; - printf(" - if your program needs %d iterations to converge, convergence will be \n reached in %s i.e.\n on %s (current time is %s);\n",niterf, asc_diff_time(rforecast_time-rcurr_time,tmpout),strfor,strcurr); - fprintf(ficlog," - if your program needs %d iterations to converge, convergence will be \n reached in %s i.e.\n on %s (current time is %s);\n",niterf, asc_diff_time(rforecast_time-rcurr_time,tmpout),strfor,strcurr); + printf(" - if your program needs %d BIG iterations (%d iterations) to converge, convergence will be \n reached in %s i.e.\n on %s (current time is %s);\n",nBigterf, niterf, asc_diff_time(rforecast_time-rcurr_time,tmpout),strfor,strcurr); + fprintf(ficlog," - if your program needs %d BIG iterations (%d iterations) to converge, convergence will be \n reached in %s i.e.\n on %s (current time is %s);\n",nBigterf, niterf, asc_diff_time(rforecast_time-rcurr_time,tmpout),strfor,strcurr); } } for (i=1;i<=n;i++) { /* For each direction i */ @@ -2954,7 +2995,7 @@ void powell(double p[], double **xi, int n, double ftol, int *iter, double *fret /* Model(2) V1 + V2 + V3 + V8 + V7*V8 + V5*V6 + V8*age + V3*age + age*age */ /* total number of covariates of the model nbocc(+)+1 = 8 excepting constant and age and age*age */ for(k1=1;k1<=cptcovt;k1++){ /* loop on model equation (including products) */ - if(Typevar[k1]==1){ /* A product with age */ + if(Typevar[k1]==1 || Typevar[k1]==3){ /* A product with age */ cov[2+nagesqr+k1]=precov[nres][k1]*cov[2]; }else{ cov[2+nagesqr+k1]=precov[nres][k1]; @@ -3164,7 +3205,7 @@ void powell(double p[], double **xi, int n, double ftol, int *iter, double *fret cov[3]= agefin*agefin;; } for(k1=1;k1<=cptcovt;k1++){ /* loop on model equation (including products) */ - if(Typevar[k1]==1){ /* A product with age */ + if(Typevar[k1]==1 || Typevar[k1]==3){ /* A product with age */ cov[2+nagesqr+k1]=precov[nres][k1]*cov[2]; }else{ cov[2+nagesqr+k1]=precov[nres][k1]; @@ -3631,7 +3672,7 @@ double ***hpxij(double ***po, int nhstepm, double age, int hstepm, double *x, in /* Model(2) V1 + V2 + V3 + V8 + V7*V8 + V5*V6 + V8*age + V3*age + age*age */ /* total number of covariates of the model nbocc(+)+1 = 8 excepting constant and age and age*age */ for(k1=1;k1<=cptcovt;k1++){ /* loop on model equation (including products) */ - if(Typevar[k1]==1){ /* A product with age */ + if(Typevar[k1]==1 || Typevar[k1]==3){ /* A product with age */ cov[2+nagesqr+k1]=precov[nres][k1]*cov[2]; }else{ cov[2+nagesqr+k1]=precov[nres][k1]; @@ -3817,7 +3858,7 @@ double ***hbxij(double ***po, int nhstepm, double age, int hstepm, double *x, do } /** New code */ for(k1=1;k1<=cptcovt;k1++){ /* loop on model equation (including products) */ - if(Typevar[k1]==1){ /* A product with age */ + if(Typevar[k1]==1 || Typevar[k1]==3){ /* A product with age */ cov[2+nagesqr+k1]=precov[nres][k1]*cov[2]; }else{ cov[2+nagesqr+k1]=precov[nres][k1]; @@ -4002,18 +4043,6 @@ double func( double *x) iposold=ipos; cov[ioffset+ipos]=cotvarv; } - /* 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++){ @@ -4029,12 +4058,30 @@ double func( double *x) cov[2]=agexact; if(nagesqr==1) cov[3]= agexact*agexact; /* Should be changed here */ - for (kk=1; kk<=cptcovage;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 */ - else - cov[Tage[kk]+2+nagesqr]=cotvar[mw[mi][i]][Tvar[Tage[kk]]][i]*agexact; /* because cotvar starts now at first ncovcol+nqv+ (1 to nqtv) */ + /* for (kk=1; kk<=cptcovage;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 *\/ */ + /* else */ + /* cov[Tage[kk]+2+nagesqr]=cotvar[mw[mi][i]][Tvar[Tage[kk]]][i]*agexact; /\* because cotvar starts now at first ncovcol+nqv+ (1 to nqtv) *\/ */ + /* } */ + for(ncovva=1, iposold=0; ncovva <= ncovta ; ncovva++){ /* Time varying covariates with age including individual from products, product is computed dynamically */ + itv=TvarAVVA[ncovva]; /* TvarVV={3, 1, 3} gives the name of each varying covariate, exploding product Vn*Vm into Vn and then Vm */ + ipos=TvarAVVAind[ncovva]; /* TvarVVind={2, 5, 5] gives the position in the model of the ncovv th varying covariate*/ + if(FixedV[itv]!=0){ /* Not a fixed covariate? Could be a fixed covariate of a product with a higher than ncovcol+nqv, itv */ + cotvarv=cotvar[mw[mi][i]][TvarAVVA[ncovva]][i]; /* because cotvar starts now at first ncovcol+nqv+ntv+nqtv (1 to nqtv) */ + }else{ /* fixed covariate */ + cotvarv=covar[itv][i]; /* Error: TvarFind gives the name, that is the true column of fixed covariates, but Tvar of the model */ + } + if(ipos!=iposold){ /* Not a product or first of a product */ + cotvarvold=cotvarv; + }else{ /* A second product */ + cotvarv=cotvarv*cotvarvold; + } + iposold=ipos; + cov[ioffset+ipos]=cotvarv*agexact; + /* For products */ } + out=matprod2(newm,oldm,1,nlstate+ndeath,1,nlstate+ndeath, 1,nlstate+ndeath,pmij(pmmij,cov,ncovmodel,x,nlstate)); savm=oldm; @@ -4303,7 +4350,7 @@ double func( double *x) 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 i, ii, j, k, mi, d, kk, kv=0, kf=0; int ioffset=0; int ipos=0,iposold=0,ncovv=0; @@ -4339,7 +4386,7 @@ double funcone( double *x) /* Fixed */ /* 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 */ + for (kf=1; kf<=ncovf;kf++){ /* V2 + V3 + V4 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]); */ @@ -4396,35 +4443,112 @@ double funcone( double *x) * TvarFind[k] 1 0 0 0 0 0 0 0 0 */ /* Other model ncovcol=5 nqv=0 ntv=3 nqtv=0 nlstate=3 - * V2 V3 V4 are fixed V6 V7 are timevarying so V8 and V5 are not in the model and product column will start at 9 Tvar[4]=6 + * V2 V3 V4 are fixed V6 V7 are timevarying so V8 and V5 are not in the model and product column will start at 9 Tvar[(v6*V2)6]=9 * FixedV[ncovcol+qv+ntv+nqtv] V5 - * V1 V2 V3 V4 V5 V6 V7 V8 - * 0 0 0 0 0 1 1 1 - * model= V2 + V3 + V4 + V6 + V7 + V6*V2 + V7*V2 + V6*V3 + V7*V3 + V6*V4 + V7*V4 - * kmodel 1 2 3 4 5 6 7 8 9 10 11 + * 3 V1 V2 V3 V4 V5 V6 V7 V8 V3*V2 V7*V2 V6*V3 V7*V3 V6*V4 V7*V4 + * 0 0 0 0 0 1 1 1 0, 0, 1,1, 1, 0, 1, 0, 1, 0, 1, 0} + * 3 0 0 0 0 0 1 1 1 0, 1 1 1 1 1} + * model= V2 + V3 + V4 + V6 + V7 + V6*V2 + V7*V2 + V6*V3 + V7*V3 + V6*V4 + V7*V4 + * +age*V2 +age*V3 +age*V4 +age*V6 + age*V7 + * +age*V6*V2 + age*V6*V3 +age*V7*V3 + age*V6*V4 +age*V7*V4 + * model2= V2 + V3 + V4 + V6 + V7 + V3*V2 + V7*V2 + V6*V3 + V7*V3 + V6*V4 + V7*V4 + * +age*V2 +age*V3 +age*V4 +age*V6 + age*V7 + * +age*V3*V2 + age*V6*V3 +age*V7*V3 + age*V6*V4 +age*V7*V4 + * model3= V2 + V3 + V4 + V6 + V7 + age*V3*V2 + V7*V2 + V6*V3 + V7*V3 + V6*V4 + V7*V4 + * +age*V2 +age*V3 +age*V4 +age*V6 + age*V7 + * +V3*V2 + age*V6*V3 +age*V7*V3 + age*V6*V4 +age*V7*V4 + * kmodel 1 2 3 4 5 6 7 8 9 10 11 + * 12 13 14 15 16 + * 17 18 19 20 21 + * Tvar[kmodel] 2 3 4 6 7 9 10 11 12 13 14 + * 2 3 4 6 7 + * 9 11 12 13 14 + * cptcovage=5+5 total of covariates with age + * Tage[cptcovage] age*V2=12 13 14 15 16 + *1 17 18 19 20 21 gives the position in model of covariates associated with age + *3 Tage[cptcovage] age*V3*V2=6 + *3 age*V2=12 13 14 15 16 + *3 age*V6*V3=18 19 20 21 + * Tvar[Tage[cptcovage]] Tvar[12]=2 3 4 6 Tvar[16]=7(age*V7) + * Tvar[17]age*V6*V2=9 Tvar[18]age*V6*V3=11 age*V7*V3=12 age*V6*V4=13 Tvar[21]age*V7*V4=14 + * 2 Tvar[17]age*V3*V2=9 Tvar[18]age*V6*V3=11 age*V7*V3=12 age*V6*V4=13 Tvar[21]age*V7*V4=14 + * 3 Tvar[Tage[cptcovage]] Tvar[6]=9 Tvar[12]=2 3 4 6 Tvar[16]=7(age*V7) + * 3 Tvar[18]age*V6*V3=11 age*V7*V3=12 age*V6*V4=13 Tvar[21]age*V7*V4=14 + * 3 Tage[cptcovage] age*V3*V2=6 age*V2=12 age*V3 13 14 15 16 + * age*V6*V3=18 19 20 21 gives the position in model of covariates associated with age + * 3 Tvar[17]age*V3*V2=9 Tvar[18]age*V6*V3=11 age*V7*V3=12 age*V6*V4=13 Tvar[21]age*V7*V4=14 + * Tvar= {2, 3, 4, 6, 7, + * 9, 10, 11, 12, 13, 14, + * Tvar[12]=2, 3, 4, 6, 7, + * Tvar[17]=9, 11, 12, 13, 14} + * Typevar[1]@21 = {0, 0, 0, 0, 0, + * 2, 2, 2, 2, 2, 2, + * 3 3, 2, 2, 2, 2, 2, + * 1, 1, 1, 1, 1, + * 3, 3, 3, 3, 3} + * 3 2, 3, 3, 3, 3} + * p Tposprod[1]@21 {0, 0, 0, 0, 0, 1, 2, 3, 4, 5, 6, 0, 0, 0, 0, 0, 1, 3, 4, 5, 6} Id of the prod at position k in the model + * p Tprod[1]@21 {6, 7, 8, 9, 10, 11, 0 } + * 3 Tposprod[1]@21 {0, 0, 0, 0, 0, 1, 2, 3, 4, 5, 6, 0, 0, 0, 0, 0, 1, 3, 4, 5, 6} + * 3 Tprod[1]@21 {17, 7, 8, 9, 10, 11, 0 } + * cptcovprod=11 (6+5) + * FixedV[Tvar[Tage[cptcovage]]]] FixedV[2]=0 FixedV[3]=0 0 1 (age*V7)Tvar[16]=1 FixedV[absolute] not [kmodel] + * FixedV[Tvar[17]=FixedV[age*V6*V2]=FixedV[9]=1 1 1 1 1 + * 3 FixedV[Tvar[17]=FixedV[age*V3*V2]=FixedV[9]=0 [11]=1 1 1 1 + * FixedV[] V1=0 V2=0 V3=0 v4=0 V5=0 V6=1 V7=1 v8=1 OK then model dependent + * 9=1 [V7*V2]=[10]=1 11=1 12=1 13=1 14=1 + * 3 9=0 [V7*V2]=[10]=1 11=1 12=1 13=1 14=1 + * cptcovdageprod=5 for gnuplot printing + * cptcovprodvage=6 + * ncova=15 1 2 3 4 5 + * 6 7 8 9 10 11 12 13 14 15 + * TvarA 2 3 4 6 7 + * 6 2 6 7 7 3 6 4 7 4 + * TvaAind 12 12 13 13 14 14 15 15 16 16 * ncovf 1 2 3 - * ncovvt=14 1 2 3 4 5 6 7 8 9 10 11 12 13 14 - * TvarVV[1]@14 = itv {6, 7, 6, 2, 7, 2, 6, 3, 7, 3, 6, 4, 7, 4} - * TvarVVind[1]@14= {4, 5, 6, 6, 7, 7, 8, 8, 9, 9, 10, 10, 11, 11} + * V6 V7 V6*V2 V7*V2 V6*V3 V7*V3 V6*V4 V7*V4 + * ncovvt=14 1 2 3 4 5 6 7 8 9 10 11 12 13 14 + * TvarVV[1]@14 = itv {V6=6, 7, V6*V2=6, 2, 7, 2, 6, 3, 7, 3, 6, 4, 7, 4} + * TvarVVind[1]@14= {4, 5, 6, 6, 7, 7, 8, 8, 9, 9, 10, 10, 11, 11} + * 3 ncovvt=12 V6 V7 V7*V2 V6*V3 V7*V3 V6*V4 V7*V4 + * 3 TvarVV[1]@12 = itv {6, 7, V7*V2=7, 2, 6, 3, 7, 3, 6, 4, 7, 4} + * 3 1 2 3 4 5 6 7 8 9 10 11 12 + * TvarVVind[1]@12= {V6 is in k=4, 5, 7,(4isV2)=7, 8, 8, 9, 9, 10,10, 11,11}TvarVVind[12]=k=11 + * TvarV 6, 7, 9, 10, 11, 12, 13, 14 + * 3 cptcovprodvage=6 + * 3 ncovta=15 +age*V3*V2+age*V2+agev3+ageV4 +age*V6 + age*V7 + age*V6*V3 +age*V7*V3 + age*V6*V4 +age*V7*V4 + * 3 TvarAVVA[1]@15= itva 3 2 2 3 4 6 7 6 3 7 3 6 4 7 4 + * 3 ncovta 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 + * TvarAVVAind[1]@15= V3 is in k=2 1 1 2 3 4 5 4,2 5,2, 4,3 5 3}TvarVVAind[] + * TvarAVVAind[1]@15= V3 is in k=6 6 12 13 14 15 16 18 18 19,19, 20,20 21,21}TvarVVAind[] + * 3 ncovvta=10 +age*V6 + age*V7 + age*V6*V3 +age*V7*V3 + age*V6*V4 +age*V7*V4 + * 3 we want to compute =cotvar[mw[mi][i]][TvarVVA[ncovva]][i] at position TvarVVAind[ncovva] + * 3 TvarVVA[1]@10= itva 6 7 6 3 7 3 6 4 7 4 + * 3 ncovva 1 2 3 4 5 6 7 8 9 10 + * TvarVVAind[1]@10= V6 is in k=4 5 8,8 9, 9, 10,10 11 11}TvarVVAind[] + * TvarVVAind[1]@10= 15 16 18,18 19,19, 20,20 21 21}TvarVVAind[] + * TvarVA V3*V2=6 6 , 1, 2, 11, 12, 13, 14 * TvarFind[1]@14= {1, 2, 3, 0 } - * Tvar[1]@20= {2, 3, 4, 6, 7, 9, 10, 11, 12, 13, 14} + * Tvar[1]@21= {2, 3, 4, 6, 7, 9, 10, 11, 12, 13, 14, + * 2, 3, 4, 6, 7, + * 6, 8, 9, 10, 11} * TvarFind[itv] 0 0 0 * FixedV[itv] 1 1 1 0 1 0 1 0 1 0 0 * Tvar[TvarFind[ncovf]]=[1]=2 [2]=3 [4]=4 * Tvar[TvarFind[itv]] [0]=? ?ncovv 1 à ncovvt] * Not a fixed cotvar[mw][itv][i] 6 7 6 2 7, 2, 6, 3, 7, 3, 6, 4, 7, 4} - * fixed covar[itv] [6] [7] [6][2] + * fixed covar[itv] [6] [7] [6][2] */ - for(ncovv=1, iposold=0; ncovv <= ncovvt ; ncovv++){ /* Varying covariates (single and product but no age) including individual from products */ - itv=TvarVV[ncovv]; /* TvarVV={3, 1, 3} gives the name of each varying covariate, exploding product */ + for(ncovv=1, iposold=0; ncovv <= ncovvt ; ncovv++){ /* V6 V7 V7*V2 V6*V3 V7*V3 V6*V4 V7*V4 Time varying covariates (single and extended product but no age) including individual from products, product is computed dynamically */ + itv=TvarVV[ncovv]; /* TvarVV={3, 1, 3} gives the name of each varying covariate, or fixed covariate of a varying product after exploding product Vn*Vm into Vn and then Vm */ ipos=TvarVVind[ncovv]; /* TvarVVind={2, 5, 5] gives the position in the model of the ncovv th varying covariate*/ /* if(TvarFind[itv]==0){ /\* Not a fixed covariate? Could be a fixed covariate of a product with a higher than ncovcol+nqv, itv *\/ */ if(FixedV[itv]!=0){ /* Not a fixed covariate? Could be a fixed covariate of a product with a higher than ncovcol+nqv, itv */ cotvarv=cotvar[mw[mi][i]][TvarVV[ncovv]][i]; /* because cotvar starts now at first ncovcol+nqv+ntv+nqtv (1 to nqtv) */ }else{ /* fixed covariate */ /* cotvarv=covar[Tvar[TvarFind[itv]]][i]; /\* Error: TvarFind gives the name, that is the true column of fixed covariates, but Tvar of the model *\/ */ - cotvarv=covar[itv][i]; /* Error: TvarFind gives the name, that is the true column of fixed covariates, but Tvar of the model */ + cotvarv=covar[itv][i]; /* Good: In V6*V3, 3 is fixed at position of the data */ } if(ipos!=iposold){ /* Not a product or first of a product */ cotvarvold=cotvarv; @@ -4471,12 +4595,30 @@ double funcone( double *x) cov[2]=agexact; if(nagesqr==1) cov[3]= agexact*agexact; - for (kk=1; kk<=cptcovage;kk++) { - 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]]][i]*agexact; /* because cotvar starts now at first ncovcol+nqv+ (1 to nqtv) */ + for(ncovva=1, iposold=0; ncovva <= ncovta ; ncovva++){ /* Time varying covariates with age including individual from products, product is computed dynamically */ + itv=TvarAVVA[ncovva]; /* TvarVV={3, 1, 3} gives the name of each varying covariate, exploding product Vn*Vm into Vn and then Vm */ + ipos=TvarAVVAind[ncovva]; /* TvarVVind={2, 5, 5] gives the position in the model of the ncovv th varying covariate*/ + /* if(TvarFind[itv]==0){ /\* Not a fixed covariate? Could be a fixed covariate of a product with a higher than ncovcol+nqv, itv *\/ */ + if(FixedV[itv]!=0){ /* Not a fixed covariate? Could be a fixed covariate of a product with a higher than ncovcol+nqv, itv */ + /* printf("DEBUG ncovva=%d, Varying TvarAVVA[ncovva]=%d\n", ncovva, TvarAVVA[ncovva]); */ + cotvarv=cotvar[mw[mi][i]][TvarAVVA[ncovva]][i]; /* because cotvar starts now at first ncovcol+nqv+ntv+nqtv (1 to nqtv) */ + }else{ /* fixed covariate */ + /* cotvarv=covar[Tvar[TvarFind[itv]]][i]; /\* Error: TvarFind gives the name, that is the true column of fixed covariates, but Tvar of the model *\/ */ + /* printf("DEBUG ncovva=%d, Fixed TvarAVVA[ncovva]=%d\n", ncovva, TvarAVVA[ncovva]); */ + cotvarv=covar[itv][i]; /* Error: TvarFind gives the name, that is the true column of fixed covariates, but Tvar of the model */ + } + if(ipos!=iposold){ /* Not a product or first of a product */ + cotvarvold=cotvarv; + }else{ /* A second product */ + /* printf("DEBUG * \n"); */ + cotvarv=cotvarv*cotvarvold; + } + iposold=ipos; + /* printf("DEBUG Product cov[ioffset+ipos=%d] \n",ioffset+ipos); */ + cov[ioffset+ipos]=cotvarv*agexact; + /* For products */ } + /* 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); */ out=matprod2(newm,oldm,1,nlstate+ndeath,1,nlstate+ndeath, @@ -4564,14 +4706,39 @@ double funcone( double *x) } iposold=ipos; } - for (kk=1; kk<=cptcovage;kk++) { - if(!FixedV[Tvar[Tage[kk]]]){ - fprintf(ficresilk," %g*age",covar[Tvar[Tage[kk]]][i]); - /* printf(" %g*age",covar[Tvar[Tage[kk]]][i]); */ - }else{ - fprintf(ficresilk," %g*age",cotvar[mw[mi][i]][Tvar[Tage[kk]]][i]);/* because cotvar starts now at first ncovcol+nqv+ (1 to nqtv) */ - /* printf(" %g*age",cotvar[mw[mi][i]][Tvar[Tage[kk]]][i]);/\* because cotvar starts now at first ncovcol+nqv+ (1 to nqtv) *\/ */ + /* for (kk=1; kk<=cptcovage;kk++) { */ + /* if(!FixedV[Tvar[Tage[kk]]]){ */ + /* fprintf(ficresilk," %g*age",covar[Tvar[Tage[kk]]][i]); */ + /* /\* printf(" %g*age",covar[Tvar[Tage[kk]]][i]); *\/ */ + /* }else{ */ + /* fprintf(ficresilk," %g*age",cotvar[mw[mi][i]][Tvar[Tage[kk]]][i]);/\* because cotvar starts now at first ncovcol+nqv+ (1 to nqtv) *\/ */ + /* /\* printf(" %g*age",cotvar[mw[mi][i]][Tvar[Tage[kk]]][i]);/\\* because cotvar starts now at first ncovcol+nqv+ (1 to nqtv) *\\/ *\/ */ + /* } */ + /* } */ + for(ncovva=1, iposold=0; ncovva <= ncovta ; ncovva++){ /* Time varying covariates with age including individual from products, product is computed dynamically */ + itv=TvarAVVA[ncovva]; /* TvarVV={3, 1, 3} gives the name of each varying covariate, exploding product Vn*Vm into Vn and then Vm */ + ipos=TvarAVVAind[ncovva]; /* TvarVVind={2, 5, 5] gives the position in the model of the ncovv th varying covariate*/ + /* if(TvarFind[itv]==0){ /\* Not a fixed covariate? Could be a fixed covariate of a product with a higher than ncovcol+nqv, itv *\/ */ + if(FixedV[itv]!=0){ /* Not a fixed covariate? Could be a fixed covariate of a product with a higher than ncovcol+nqv, itv */ + /* printf("DEBUG ncovva=%d, Varying TvarAVVA[ncovva]=%d\n", ncovva, TvarAVVA[ncovva]); */ + cotvarv=cotvar[mw[mi][i]][TvarAVVA[ncovva]][i]; /* because cotvar starts now at first ncovcol+nqv+ntv+nqtv (1 to nqtv) */ + }else{ /* fixed covariate */ + /* cotvarv=covar[Tvar[TvarFind[itv]]][i]; /\* Error: TvarFind gives the name, that is the true column of fixed covariates, but Tvar of the model *\/ */ + /* printf("DEBUG ncovva=%d, Fixed TvarAVVA[ncovva]=%d\n", ncovva, TvarAVVA[ncovva]); */ + cotvarv=covar[itv][i]; /* Error: TvarFind gives the name, that is the true column of fixed covariates, but Tvar of the model */ + } + if(ipos!=iposold){ /* Not a product or first of a product */ + cotvarvold=cotvarv; + }else{ /* A second product */ + /* printf("DEBUG * \n"); */ + cotvarv=cotvarv*cotvarvold; } + cotvarv=cotvarv*agexact; + fprintf(ficresilk," %g*age",cotvarv); + iposold=ipos; + /* printf("DEBUG Product cov[ioffset+ipos=%d] \n",ioffset+ipos); */ + cov[ioffset+ipos]=cotvarv; + /* For products */ } /* printf("\n"); */ /* } /\* End debugILK *\/ */ @@ -6287,7 +6454,7 @@ void concatwav(int wav[], int **dh, int **bh, int **mw, int **s, double *agedc 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; /* 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 */ + if(Dummy[k]==0 && Typevar[k] !=1 && Typevar[k] != 3 && 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; @@ -6384,7 +6551,7 @@ void concatwav(int wav[], int **dh, int **bh, int **mw, int **s, double *agedc break; } /* end switch */ } /* end dummy test */ - if(Dummy[k]==1 && Typevar[k] !=1 && Fixed ==0){ /* Fixed Quantitative covariate and not age product */ + if(Dummy[k]==1 && Typevar[k] !=1 && Typevar[k] !=3 && Fixed ==0){ /* Fixed Quantitative 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(Tvar[k]<=0 || Tvar[k]>=NCOVMAX){ printf("Error k=%d \n",k); @@ -7567,7 +7734,7 @@ To be simple, these graphs help to understand the significativity of each parame cov[3]= age*age; /* New code end of combination but for each resultline */ for(k1=1;k1<=cptcovt;k1++){ /* loop on model equation (including products) */ - if(Typevar[k1]==1){ /* A product with age */ + if(Typevar[k1]==1 || Typevar[k1] ==3){ /* A product with age */ cov[2+nagesqr+k1]=precov[nres][k1]*cov[2]; }else{ cov[2+nagesqr+k1]=precov[nres][k1]; @@ -9247,6 +9414,31 @@ set ter svg size 640, 480\nunset log y\nplot [%.f:%.f] ", ageminpar, agemaxpar) } /* end Tprod */ } break; + case 3: + if(cptcovdageprod >0){ + /* if(j==Tprod[ijp]) { */ /* not necessary */ + /* printf("Tprod[%d]=%d, j=%d\n", ij, Tprod[ijp], j); */ + if(ijp <=cptcovprod) { /* Product */ + if(DummyV[Tvard[ijp][1]]==0){/* Vn is dummy */ + if(DummyV[Tvard[ijp][2]]==0){/* Vn and Vm are dummy */ + /* fprintf(ficgp,"+p%d*%d*%d",i+j+2+nagesqr-1,nbcode[Tvard[ijp][1]][codtabm(k1,j)],nbcode[Tvard[ijp][2]][codtabm(k1,j)]); */ + fprintf(ficgp,"+p%d*%d*%d*x",i+j+2+nagesqr-1,Tinvresult[nres][Tvard[ijp][1]],Tinvresult[nres][Tvard[ijp][2]]); + }else{ /* Vn is dummy and Vm is quanti */ + /* fprintf(ficgp,"+p%d*%d*%f",i+j+2+nagesqr-1,nbcode[Tvard[ijp][1]][codtabm(k1,j)],Tqinvresult[nres][Tvard[ijp][2]]); */ + fprintf(ficgp,"+p%d*%d*%f*x",i+j+2+nagesqr-1,Tinvresult[nres][Tvard[ijp][1]],Tqinvresult[nres][Tvard[ijp][2]]); + } + }else{ /* Vn*Vm Vn is quanti */ + if(DummyV[Tvard[ijp][2]]==0){ + fprintf(ficgp,"+p%d*%d*%f*x",i+j+2+nagesqr-1,Tinvresult[nres][Tvard[ijp][2]],Tqinvresult[nres][Tvard[ijp][1]]); + }else{ /* Both quanti */ + fprintf(ficgp,"+p%d*%f*%f*x",i+j+2+nagesqr-1,Tqinvresult[nres][Tvard[ijp][1]],Tqinvresult[nres][Tvard[ijp][2]]); + } + } + ijp++; + } + /* } */ /* end Tprod */ + } + break; case 0: /* simple covariate */ /* fprintf(ficgp,"+p%d*%d",i+j+2+nagesqr-1,nbcode[Tvar[j]][codtabm(k1,j)]); /\* Valgrind bug nbcode *\/ */ @@ -9333,6 +9525,35 @@ set ter svg size 640, 480\nunset log y\nplot [%.f:%.f] ", ageminpar, agemaxpar) } /* end Tprod */ } /* end if */ break; + case 3: + if(cptcovdageprod >0){ + /* if(j==Tprod[ijp]) { /\* *\/ */ + /* printf("Tprod[%d]=%d, j=%d\n", ij, Tprod[ijp], j); */ + if(ijp <=cptcovprod) { /* Product */ + if(DummyV[Tvard[ijp][1]]==0){/* Vn is dummy */ + if(DummyV[Tvard[ijp][2]]==0){/* Vn and Vm are dummy */ + /* fprintf(ficgp,"+p%d*%d*%d",i+j+2+nagesqr-1,nbcode[Tvard[ijp][1]][codtabm(k1,j)],nbcode[Tvard[ijp][2]][codtabm(k1,j)]); */ + fprintf(ficgp,"+p%d*%d*%d*x",k3+(cpt-1)*ncovmodel+1+j+nagesqr,Tinvresult[nres][Tvard[ijp][1]],Tinvresult[nres][Tvard[ijp][2]]); + /* fprintf(ficgp,"+p%d*%d*%d",i+j+2+nagesqr-1,Tinvresult[nres][Tvard[ijp][1]],Tinvresult[nres][Tvard[ijp][2]]); */ + }else{ /* Vn is dummy and Vm is quanti */ + /* fprintf(ficgp,"+p%d*%d*%f",i+j+2+nagesqr-1,nbcode[Tvard[ijp][1]][codtabm(k1,j)],Tqinvresult[nres][Tvard[ijp][2]]); */ + fprintf(ficgp,"+p%d*%d*%f*x",k3+(cpt-1)*ncovmodel+1+j+nagesqr,Tinvresult[nres][Tvard[ijp][1]],Tqinvresult[nres][Tvard[ijp][2]]); + /* fprintf(ficgp,"+p%d*%d*%f*x",i+j+2+nagesqr-1,Tinvresult[nres][Tvard[ijp][1]],Tqinvresult[nres][Tvard[ijp][2]]); */ + } + }else{ /* Vn*Vm Vn is quanti */ + if(DummyV[Tvard[ijp][2]]==0){ + fprintf(ficgp,"+p%d*%d*%f",k3+(cpt-1)*ncovmodel+1+j+nagesqr,Tinvresult[nres][Tvard[ijp][2]],Tqinvresult[nres][Tvard[ijp][1]]); + /* fprintf(ficgp,"+p%d*%d*%f*x",i+j+2+nagesqr-1,Tinvresult[nres][Tvard[ijp][2]],Tqinvresult[nres][Tvard[ijp][1]]); */ + }else{ /* Both quanti */ + fprintf(ficgp,"+p%d*%f*%f",k3+(cpt-1)*ncovmodel+1+j+nagesqr,Tqinvresult[nres][Tvard[ijp][1]],Tqinvresult[nres][Tvard[ijp][2]]); + /* fprintf(ficgp,"+p%d*%f*%f*x",i+j+2+nagesqr-1,Tqinvresult[nres][Tvard[ijp][1]],Tqinvresult[nres][Tvard[ijp][2]]); */ + } + } + ijp++; + } + /* } /\* end Tprod *\/ */ + } /* end if */ + break; case 0: /* simple covariate */ /* fprintf(ficgp,"+p%d*%d",i+j+2+nagesqr-1,nbcode[Tvar[j]][codtabm(k1,j)]); /\* Valgrind bug nbcode *\/ */ @@ -10483,33 +10704,8 @@ int readdata(char datafile[], int firstobs, int lastobs, int *imax) char stra[MAXLINE], strb[MAXLINE]; char *stratrunc; - DummyV=ivector(1,NCOVMAX); /* 1 to 3 */ - FixedV=ivector(1,NCOVMAX); /* 1 to 3 */ - for(v=1;v1){ /* If there is at least 1 covariate */ - j=0, j1=0, k1=0, k2=-1, ks=0, cptcovn=0; + j=0, j1=0, k1=0, k12=0, k2=-1, ks=0, cptcovn=0; if (strstr(model,"AGE") !=0){ printf("Error. AGE must be in lower case 'age' model=1+age+%s. ",model); fprintf(ficlog,"Error. AGE must be in lower case model=1+age+%s. ",model);fflush(ficlog); @@ -11147,19 +11350,21 @@ int decodemodel( char model[], int lastobs) substrchaine(modelsav, model, "age*age"); }else nagesqr=0; - if (strlen(modelsav) >1){ + if (strlen(modelsav) >1){ /* V2 +V3 +V4 +V6 +V7 +V6*V2 +V7*V2 +V6*V3 +V7*V3 +V6*V4 +V7*V4 +age*V2 +age*V3 +age*V4 +age*V6 +age*V7 +age*V6*V2 +V7*V2 +age*V6*V3 +age*V7*V3 +age*V6*V4 +age*V7*V4 */ j=nbocc(modelsav,'+'); /**< j=Number of '+' */ j1=nbocc(modelsav,'*'); /**< j1=Number of '*' */ - cptcovs=j+1-j1; /**< Number of simple covariates V1+V1*age+V3 +V3*V4+age*age=> V1 + V3 =5-3=2 */ + cptcovs=j+1-j1; /**< Number of simple covariates V1 +V1*age +V3 +V3*V4 +age*age => V1 + V3 =4+1-3=2 */ cptcovt= j+1; /* Number of total covariates in the model, not including * cst, age and age*age * V1+V1*age+ V3 + V3*V4+age*age=> 3+1=4*/ /* including age products which are counted in cptcovage. * but the covariates which are products must be treated * separately: ncovn=4- 2=2 (V1+V3). */ - cptcovprod=j1; /**< Number of products V1*V2 +v3*age = 2 */ + cptcovprod=0; /**< Number of products V1*V2 +v3*age = 2 */ + cptcovdageprod=0; /* Number of doouble products with age age*Vn*VM or Vn*age*Vm or Vn*Vm*age */ cptcovprodnoage=0; /**< Number of covariate products without age: V3*V4 =1 */ - + cptcovprodage=0; + /* cptcovprodage=nboccstr(modelsav,"age");*/ /* Design * V1 V2 V3 V4 V5 V6 V7 V8 V9 Weight @@ -11220,66 +11425,196 @@ int decodemodel( char model[], int lastobs) strcpy(strb,modelsav); /* and analyzes it */ /* printf("i=%d a=%s b=%s sav=%s\n",i, stra,strb,modelsav);*/ /*scanf("%d",i);*/ - if (strchr(strb,'*')) { /**< Model includes a product V2+V1+V5*age+ V4+V3*age strb=V3*age */ - cutl(strc,strd,strb,'*'); /**< k=1 strd*strc Vm*Vn: strb=V3*age(input) strc=age strd=V3 ; V3*V2 strc=V2, strd=V3 */ - if (strcmp(strc,"age")==0) { /**< Model includes age: Vn*age */ - /* covar is not filled and then is empty */ - cptcovprod--; - cutl(stre,strb,strd,'V'); /* strd=V3(input): stre="3" */ - Tvar[k]=atoi(stre); /* V2+V1+V5*age+V4+V3*age Tvar[5]=3 ; V1+V2*age Tvar[2]=2; V1+V1*age Tvar[2]=1 */ - Typevar[k]=1; /* 1 for age product */ - cptcovage++; /* Counts the number of covariates which include age as a product */ - Tage[cptcovage]=k; /* V2+V1+V4+V3*age Tvar[4]=3, Tage[1] = 4 or V1+V1*age Tvar[2]=1, Tage[1]=2 */ - /*printf("stre=%s ", stre);*/ - } else if (strcmp(strd,"age")==0) { /* or age*Vn */ - cptcovprod--; - cutl(stre,strb,strc,'V'); - Tvar[k]=atoi(stre); - Typevar[k]=1; /* 1 for age product */ - cptcovage++; - Tage[cptcovage]=k; - } else { /* Age is not in the model product V2+V1+V1*V4+V3*age+V3*V2 strb=V3*V2*/ - /* loops on k1=1 (V3*V2) and k1=2 V4*V3 */ - cptcovn++; - cptcovprodnoage++;k1++; + if (strchr(strb,'*')) { /**< Model includes a product V2+V1+V5*age+ V4+V3*age strb=V3*age OR double product with age strb=age*V6*V2 or V6*V2*age or V6*age*V2 */ + cutl(strc,strd,strb,'*'); /**< k=1 strd*strc Vm*Vn: strb=V3*age(input) strc=age strd=V3 ; V3*V2 strc=V2, strd=V3 OR strb=age*V6*V2 strc=V6*V2 strd=age OR c=V2*age OR c=age*V2 */ + if(strchr(strc,'*')) { /**< Model with age and DOUBLE product: allowed since 0.99r44, strc=V6*V2 or V2*age or age*V2, strd=age or V6 or V6 */ + Typevar[k]=3; /* 3 for age and double product age*Vn*Vm varying of fixed */ + if(strstr(strc,"age")!=0) { /* It means that strc=V2*age or age*V2 and thus that strd=Vn */ + cutl(stre,strf,strc,'*') ; /* strf=age or Vm, stre=Vm or age. If strc=V6*V2 then strf=V6 and stre=V2 */ + strcpy(strc,strb); /* save strb(=age*Vn*Vm) into strc */ + /* We want strb=Vn*Vm */ + if(strcmp(strf,"age")==0){ /* strf is "age" so that stre=Vm =V2 . */ + strcpy(strb,strd); + strcat(strb,"*"); + strcat(strb,stre); + }else{ /* strf=Vm If strf=V6 then stre=V2 */ + strcpy(strb,strf); + strcat(strb,"*"); + strcat(strb,stre); + strcpy(strd,strb); /* in order for strd to not be "age" for next test (will be Vn*Vm */ + } + printf("DEBUG FIXED k=%d, Tage[k]=%d, Tvar[Tage[k]=%d,FixedV[Tvar[Tage[k]]]=%d\n",k,Tage[k],Tvar[Tage[k]],FixedV[Tvar[Tage[k]]]); + FixedV[Tvar[Tage[k]]]=0; /* HERY not sure */ + }else{ /* strc=Vn*Vm (and strd=age) and should be strb=Vn*Vm but want to keep original strb double product */ + strcpy(stre,strb); /* save full b in stre */ + strcpy(strb,strc); /* save short c in new short b for next block strb=Vn*Vm*/ + strcpy(strf,strc); /* save short c in new short f */ + cutl(strc,strd,strf,'*'); /* We get strd=Vn and strc=Vm for next block (strb=Vn*Vm)*/ + /* strcpy(strc,stre);*/ /* save full e in c for future */ + } + cptcovdageprod++; /* double product with age Which product is it? */ + /* strcpy(strb,strc); /\* strb was age*V6*V2 or V6*V2*age or V6*age*V2 IS now V6*V2 or V2*age or age*V2 *\/ */ + /* cutl(strc,strd,strb,'*'); /\* strd= V6 or V2 or age and strc= V2 or age or V2 *\/ */ cutl(stre,strb,strc,'V'); /* strc= Vn, stre is n; strb=V3*V2 stre=3 strc=*/ - 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]=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 - * k= 1 2 3 4 5 6 7 8 - * Tvar[k]=1 1 2 3 2 3 (5 6) (and not 4 5 because of V4 missing) - * 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 product */ + n=atoi(stre); 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 */ - Tvard[k1][1] =atoi(strc); /* m 1 for V1*/ - Tvardk[k][1] =atoi(strc); /* m 1 for V1*/ - Tvard[k1][2] =atoi(stre); /* n 4 for V4*/ - Tvardk[k][2] =atoi(stre); /* n 4 for V4*/ - k2=k2+2; /* k2 is initialize to -1, We want to store the n and m in Vn*Vm at the end of Tvar */ - /* Tvar[cptcovt+k2]=Tvard[k1][1]; /\* Tvar[(cptcovt=4+k2=1)=5]= 1 (V1) *\/ */ - /* 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 */ - 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[ncovcolt+k1][i]=covar[atoi(stre)][i]*covar[atoi(strc)][i]; + m=atoi(strc); + cptcovage++; /* Counts the number of covariates which include age as a product */ + Tage[cptcovage]=k; /* For age*V3*V2 gives the position in model of covariates associated with age Tage[1]=6 HERY too*/ + if(existcomb[n][m] == 0){ + /* r /home/brouard/Documents/Recherches/REVES/Zachary/Zach-2022/Feinuo_Sun/Feinuo-threeway/femV12V15_3wayintNBe.imach */ + printf("Warning in model combination V%d*V%d should exist in the model before adding V%d*V%d*age !\n",n,m,n,m); + fprintf(ficlog,"Warning in model combination V%d*V%d should exist in the model before adding V%d*V%d*age !\n",n,m,n,m); + fflush(ficlog); + k1++; /* The combination Vn*Vm will be in the model so we create it at k1 */ + k12++; + existcomb[n][m]=k1; + existcomb[m][n]=k1; + Tvar[k]=ncovcol+nqv+ntv+nqtv+k1; + Tprod[k1]=k; /* Tprod[1]=3(=V1*V4) for V2+V1+V1*V4+age*V3+V3*V2+ age*V6*V3 Gives the k position of the k1 double product Vn*Vm or age*Vn*Vm*/ + Tposprod[k]=k1; /* Tposprod[3]=1, Tposprod[2]=5 Gives the k1 double product Vn*Vm or age*Vn*Vm at the k position */ + Tvard[k1][1] =m; /* m 1 for V1*/ + Tvardk[k][1] =m; /* m 1 for V1*/ + Tvard[k1][2] =n; /* n 4 for V4*/ + Tvardk[k][2] =n; /* n 4 for V4*/ +/* Tvar[Tage[cptcovage]]=k1;*/ /* Tvar[6=age*V3*V2]=9 (new fixed covariate) */ + 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[ncovcolt+k1][i]=covar[atoi(stre)][i]*covar[atoi(strc)][i]; + } + cptcovprodage++; /* Counting the number of fixed covariate with age */ + FixedV[ncovcolt+k12]=0; /* We expand Vn*Vm */ + k12++; + FixedV[ncovcolt+k12]=0; + }else{ /*End of FixedV */ + cptcovprodvage++; /* Counting the number of varying covariate with age */ + FixedV[ncovcolt+k12]=1; /* We expand Vn*Vm */ + k12++; + FixedV[ncovcolt+k12]=1; + } + }else{ /* k1 Vn*Vm already exists */ + k11=existcomb[n][m]; + Tposprod[k]=k11; /* OK */ + Tvar[k]=Tvar[Tprod[k11]]; /* HERY */ + Tvardk[k][1]=m; + Tvardk[k][2]=n; + 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 */ + /*cptcovage++;*/ /* Counts the number of covariates which include age as a product */ + cptcovprodage++; /* Counting the number of fixed covariate with age */ + /*Tage[cptcovage]=k;*/ /* For age*V3*V2 Tage[1]=V3*V3=9 HERY too*/ + Tvar[Tage[cptcovage]]=k1; + FixedV[ncovcolt+k12]=0; /* We expand Vn*Vm */ + k12++; + FixedV[ncovcolt+k12]=0; + }else{ /* Already exists but time varying (and age) */ + /*cptcovage++;*/ /* Counts the number of covariates which include age as a product */ + /*Tage[cptcovage]=k;*/ /* For age*V3*V2 Tage[1]=V3*V3=9 HERY too*/ + /* Tvar[Tage[cptcovage]]=k1; */ + cptcovprodvage++; + FixedV[ncovcolt+k12]=1; /* We expand Vn*Vm */ + k12++; + FixedV[ncovcolt+k12]=1; + } + } + /* Tage[cptcovage]=k; /\* V2+V1+V4+V3*age Tvar[4]=3, Tage[1] = 4 or V1+V1*age Tvar[2]=1, Tage[1]=2 *\/ */ + /* Tvar[k]=k11; /\* HERY *\/ */ + } else {/* simple product strb=age*Vn so that c=Vn and d=age, or strb=Vn*age so that c=age and d=Vn, or b=Vn*Vm so that c=Vm and d=Vn */ + cptcovprod++; + if (strcmp(strc,"age")==0) { /**< Model includes age: strb= Vn*age c=age d=Vn*/ + /* covar is not filled and then is empty */ + cutl(stre,strb,strd,'V'); /* strd=V3(input): stre="3" */ + Tvar[k]=atoi(stre); /* V2+V1+V5*age+V4+V3*age Tvar[5]=3 ; V1+V2*age Tvar[2]=2; V1+V1*age Tvar[2]=1 */ + Typevar[k]=1; /* 1 for age product */ + cptcovage++; /* Counts the number of covariates which include age as a product */ + Tage[cptcovage]=k; /* V2+V1+V4+V3*age Tvar[4]=3, Tage[1] = 4 or V1+V1*age Tvar[2]=1, Tage[1]=2 */ + if( FixedV[Tvar[k]] == 0){ + cptcovprodage++; /* Counting the number of fixed covariate with age */ + }else{ + cptcovprodvage++; /* Counting the number of fixedvarying covariate with age */ } - } /*End of FixedV */ - } /* End age is not in the model */ - } /* End if model includes a product */ - else { /* not a product */ + /*printf("stre=%s ", stre);*/ + } else if (strcmp(strd,"age")==0) { /* strb= age*Vn c=Vn */ + cutl(stre,strb,strc,'V'); + Tvar[k]=atoi(stre); + Typevar[k]=1; /* 1 for age product */ + cptcovage++; + Tage[cptcovage]=k; + if( FixedV[Tvar[k]] == 0){ + cptcovprodage++; /* Counting the number of fixed covariate with age */ + }else{ + cptcovprodvage++; /* Counting the number of fixedvarying covariate with age */ + } + }else{ /* for product Vn*Vm */ + Typevar[k]=2; /* 2 for product Vn*Vm */ + cutl(stre,strb,strc,'V'); /* strc= Vn, stre is n; strb=V3*V2 stre=3 strc=*/ + n=atoi(stre); + cutl(strc,strb,strd,'V'); /* strd was Vm, strc is m */ + m=atoi(strc); + k1++; + cptcovprodnoage++; + if(existcomb[n][m] != 0 || existcomb[m][n] != 0){ + printf("Warning in model combination V%d*V%d already exists in the model in position k1=%d!\n",n,m,existcomb[n][m]); + fprintf(ficlog,"Warning in model combination V%d*V%d already exists in the model in position k1=%d!\n",n,m,existcomb[n][m]); + fflush(ficlog); + k11=existcomb[n][m]; + Tvar[k]=ncovcol+nqv+ntv+nqtv+k11; + Tposprod[k]=k11; + Tprod[k11]=k; + Tvardk[k][1] =m; /* m 1 for V1*/ + /* Tvard[k11][1] =m; /\* n 4 for V4*\/ */ + Tvardk[k][2] =n; /* n 4 for V4*/ + /* Tvard[k11][2] =n; /\* n 4 for V4*\/ */ + }else{ /* combination Vn*Vm doesn't exist we create it (no age)*/ + existcomb[n][m]=k1; + existcomb[m][n]=k1; + 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]=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 + * k= 1 2 3 4 5 6 7 8 + * Tvar[k]=1 1 2 3 2 3 (5 6) (and not 4 5 because of V4 missing) + * Tage[kk] [1]= 2 [2]=5 [3]=6 kk=1 to cptcovage=3 + * Tvar[Tage[kk]][1]=2 [2]=2 [3]=3 + */ + /* We need to feed some variables like TvarVV, but later on next loop because of ncovv (k2) is not correct */ + Tprod[k1]=k; /* Tprod[1]=3(=V1*V4) for V2+V1+V1*V4+age*V3+V3*V2 +V6*V2*age */ + Tposprod[k]=k1; /* Tposprod[3]=1, Tposprod[2]=5 */ + Tvard[k1][1] =m; /* m 1 for V1*/ + Tvardk[k][1] =m; /* m 1 for V1*/ + Tvard[k1][2] =n; /* n 4 for V4*/ + Tvardk[k][2] =n; /* n 4 for V4*/ + k2=k2+2; /* k2 is initialize to -1, We want to store the n and m in Vn*Vm at the end of Tvar */ + /* Tvar[cptcovt+k2]=Tvard[k1][1]; /\* Tvar[(cptcovt=4+k2=1)=5]= 1 (V1) *\/ */ + /* 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 */ + 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[ncovcolt+k1][i]=covar[atoi(stre)][i]*covar[atoi(strc)][i]; + } + /* TvarVV[k2]=n; */ + /* FixedV[ncovcolt+k2]=0; /\* or FixedV[Tvar[k]]=0; FixedV[TvarVV[ncovv]]=0 HERE *\/ */ + /* TvarVV[k2+1]=m; */ + /* FixedV[ncovcolt+k2]=0; /\* or FixedV[Tvar[k]]=0; FixedV[TvarVV[ncovv]]=0 HERE *\/ */ + }else{ /* not FixedV */ + /* TvarVV[k2]=n; */ + /* FixedV[ncovcolt+k2]=0; /\* or FixedV[Tvar[k]]=0; FixedV[TvarVV[ncovv]]=0 HERE *\/ */ + /* TvarVV[k2+1]=m; */ + /* FixedV[ncovcolt+k2]=0; /\* or FixedV[Tvar[k]]=0; FixedV[TvarVV[ncovv]]=0 HERE *\/ */ + } + } /* End of creation of Vn*Vm if not created by age*Vn*Vm earlier */ + } /* End of product Vn*Vm */ + } /* End of age*double product or simple product */ + }else { /* not a product */ /*printf("d=%s c=%s b=%s\n", strd,strc,strb);*/ /* scanf("%d",i);*/ cutl(strd,strc,strb,'V'); @@ -11294,7 +11629,8 @@ int decodemodel( char model[], int lastobs) } /* end of loop + on total covariates */ } /* end if strlen(modelsave == 0) age*age might exist */ } /* end if strlen(model == 0) */ - + cptcovs=cptcovt - cptcovdageprod - cptcovprod;/**< Number of simple covariates V1 +V1*age +V3 +V3*V4 +age*age + age*v4*V3=> V1 + V3 =4+1-3=2 */ + /*The number n of Vn is stored in Tvar. cptcovage =number of age covariate. Tage gives the position of age. cptcovprod= number of products. If model=V1+V1*age then Tvar[1]=1 Tvar[2]=1 cptcovage=1 Tage[1]=2 cptcovprod=0*/ @@ -11320,16 +11656,16 @@ int decodemodel( char model[], int lastobs) /* 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 */ 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, 3 for double product with age \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); 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, 3 for double product with age \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); for(k=-1;k<=NCOVMAX; k++){ Fixed[k]=0; Dummy[k]=0;} for(k=1;k<=NCOVMAX; k++){TvarFind[k]=0; TvarVind[k]=0;} - 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 loop on k from model */ + for(k=1, ncovf=0, nsd=0, nsq=0, ncovv=0,ncovva=0,ncovvta=0, ncova=0, ncoveff=0, nqfveff=0, ntveff=0, nqtveff=0, ncovvt=0;k<=cptcovt; k++){ /* or cptocvt loop on k from model */ if (Tvar[k] <=ncovcol && Typevar[k]==0 ){ /* Simple fixed dummy (<=ncovcol) covariates */ Fixed[k]= 0; Dummy[k]= 0; @@ -11345,17 +11681,6 @@ Dummy[k] 0=dummy (0 1), 1 quantitative (single or product without age), 2 dummy 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 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++; - ncovf++; - modell[k].maintype= FTYPE; - TvarF[ncovf]=Tvar[k]; - /* TnsdVar[Tvar[k]]=nsd; */ /* To be done */ - 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+nqv && Typevar[k]==0){/* Remind that product Vn*Vm are added in k Only simple fixed quantitative variable */ Fixed[k]= 0; Dummy[k]= 1; @@ -11417,186 +11742,396 @@ Dummy[k] 0=dummy (0 1), 1 quantitative (single or product without age), 2 dummy TvarVQind[nqtveff]=k; /* TvarVQind[1]=1 in V5+V4+V3+V4*V3+V5*age+V2+V1*V2+V1*age+V1 */ /* Only simple time varying quantitative variable */ TmodelInvQind[nqtveff]=Tvar[k]- ncovcol-nqv-ntv;/* Only simple time varying quantitative variable */ /* Tmodeliqind[k]=nqtveff;/\* Only simple time varying quantitative variable *\/ */ - /* printf("Quasi TmodelQind[%d]=%d,Tvar[TmodelQind[%d]]=V%d, ncovcol=%d, nqv=%d, ntv=%d,Tvar[k]- ncovcol-nqv-ntv=%d\n",nqtveff,k,nqtveff,Tvar[k], ncovcol, nqv, ntv, Tvar[k]- ncovcol-nqv-ntv); */ + /* printf("Quasi TmodelQind[%d]=%d,Tvar[TmodelQind[%d]]=V%d, ncovcol=%d, nqv=%d, ntv=%Ad,Tvar[k]- ncovcol-nqv-ntv=%d\n",nqtveff,k,nqtveff,Tvar[k], ncovcol, nqv, ntv, Tvar[k]- ncovcol-nqv-ntv); */ /* printf("Quasi TmodelInvQind[%d]=%d\n",k,Tvar[k]- ncovcol-nqv-ntv); */ }else if (Typevar[k] == 1) { /* product with age */ ncova++; TvarA[ncova]=Tvar[k]; TvarAind[ncova]=k; + /** Fixed[k] 0=fixed, 1 varying, 2 fixed with age product, 3 varying with age product */ + /** Dummy[k] 0=dummy (0 1), 1 quantitative (single or product without age), 2 dummy with age product, 3 quant with age product */ if (Tvar[k] <=ncovcol ){ /* Product age with fixed dummy covariatee */ Fixed[k]= 2; Dummy[k]= 2; modell[k].maintype= ATYPE; modell[k].subtype= APFD; + ncovta++; + TvarAVVA[ncovta]=Tvar[k]; /* (2)age*V3 */ + TvarAVVAind[ncovta]=k; /* ncoveff++; */ }else if( Tvar[k] <=ncovcol+nqv) { /* Remind that product Vn*Vm are added in k*/ Fixed[k]= 2; Dummy[k]= 3; modell[k].maintype= ATYPE; modell[k].subtype= APFQ; /* Product age * fixed quantitative */ + ncovta++; + TvarAVVA[ncovta]=Tvar[k]; /* */ + TvarAVVAind[ncovta]=k; /* nqfveff++; /\* Only simple fixed quantitative variable *\/ */ }else if( Tvar[k] <=ncovcol+nqv+ntv ){ Fixed[k]= 3; Dummy[k]= 2; modell[k].maintype= ATYPE; modell[k].subtype= APVD; /* Product age * varying dummy */ + ncovva++; + TvarVVA[ncovva]=Tvar[k]; /* (1)+age*V6 + (2)age*V7 */ + TvarVVAind[ncovva]=k; + ncovta++; + TvarAVVA[ncovta]=Tvar[k]; /* */ + TvarAVVAind[ncovta]=k; /* ntveff++; /\* Only simple time varying dummy variable *\/ */ }else if( Tvar[k] <=ncovcol+nqv+ntv+nqtv){ Fixed[k]= 3; Dummy[k]= 3; modell[k].maintype= ATYPE; modell[k].subtype= APVQ; /* Product age * varying quantitative */ + ncovva++; + TvarVVA[ncovva]=Tvar[k]; /* */ + TvarVVAind[ncovva]=k; + ncovta++; + TvarAVVA[ncovta]=Tvar[k]; /* (1)+age*V6 + (2)age*V7 */ + TvarAVVAind[ncovta]=k; /* nqtveff++;/\* Only simple time varying quantitative variable *\/ */ } - }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 */ + }else if( Tposprod[k]>0 && Typevar[k]==2){ /* Detects if fixed product no age Vm*Vn */ + printf("MEMORY ERRORR k=%d Tposprod[k]=%d, Typevar[k]=%d\n ",k, Tposprod[k], Typevar[k]); + if(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 V3*V2 */ + printf("MEMORY ERRORR k=%d Tvardk[k][1]=%d, Tvardk[k][2]=%d, FixedV[Tvardk[k][1]]=%d,FixedV[Tvardk[k][2]]=%d\n ",k,Tvardk[k][1],Tvardk[k][2],FixedV[Tvardk[k][1]],FixedV[Tvardk[k][2]]); + Fixed[k]= 0; + Dummy[k]= 0; + ncoveff++; + ncovf++; + /* ncovv++; */ + /* TvarVV[ncovv]=Tvardk[k][1]; */ + /* FixedV[ncovcolt+ncovv]=0; /\* or FixedV[TvarVV[ncovv]]=0 HERE *\/ */ + /* ncovv++; */ + /* TvarVV[ncovv]=Tvardk[k][2]; */ + /* FixedV[ncovcolt+ncovv]=0; /\* or FixedV[TvarVV[ncovv]]=0 HERE *\/ */ + modell[k].maintype= FTYPE; + TvarF[ncovf]=Tvar[k]; + /* TnsdVar[Tvar[k]]=nsd; */ /* To be done */ + 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{/* product varying 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 + V1*V3*age*/ + /* Tvar={1, 3, 1, 3, 6, 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, 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 */ + + /** Fixed[k] 0=fixed, 1 varying, 2 fixed with age product, 3 varying with age product */ + /** Dummy[k] 0=dummy (0 1), 1 quantitative (single or product without age), 2 dummy with age product, 3 quant with age product */ + + 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; + modell[k].subtype= FPDD; /* Product fixed dummy * fixed dummy */ + ncovf++; /* Fixed variables without age */ + TvarF[ncovf]=Tvar[k]; + TvarFind[ncovf]=k; + }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){ /* 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]; /* 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; + modell[k].subtype= VPDQ; /* Product fixed dummy * varying quantitative */ + ncovv++; /* Varying variables without age */ + TvarV[ncovv]=Tvar[k]; + TvarVind[ncovv]=k; + } + }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){ /* Vm is time varying */ + Fixed[k]= 1; + Dummy[k]= 1; + modell[k].maintype= VTYPE; + modell[k].subtype= VPDQ; /* Product fixed quantitative * varying dummy */ + ncovv++; /* Varying variables without age */ + TvarV[ncovv]=Tvar[k]; + TvarVind[ncovv]=k; + }else if(Tvard[k1][2] <=ncovcol+nqv+ntv+nqtv){ /* Vm is time varying quanti */ + Fixed[k]= 1; + Dummy[k]= 1; + modell[k].maintype= VTYPE; + modell[k].subtype= VPQQ; /* Product fixed quantitative * varying quantitative */ + ncovv++; /* Varying variables without age */ + TvarV[ncovv]=Tvar[k]; + TvarVind[ncovv]=k; + ncovv++; /* Varying variables without age */ + TvarV[ncovv]=Tvar[k]; + TvarVind[ncovv]=k; + } + }else if(Tvard[k1][1] <=ncovcol+nqv+ntv){ /* Vn is time varying dummy */ + if(Tvard[k1][2] <=ncovcol){ + Fixed[k]= 1; + Dummy[k]= 1; + modell[k].maintype= VTYPE; + modell[k].subtype= VPDD; /* Product time varying dummy * fixed dummy */ + ncovv++; /* Varying variables without age */ + TvarV[ncovv]=Tvar[k]; + TvarVind[ncovv]=k; + }else if(Tvard[k1][2] <=ncovcol+nqv){ + Fixed[k]= 1; + Dummy[k]= 1; + modell[k].maintype= VTYPE; + modell[k].subtype= VPDQ; /* Product time varying dummy * fixed quantitative */ + ncovv++; /* Varying variables without age */ + TvarV[ncovv]=Tvar[k]; + TvarVind[ncovv]=k; + }else if(Tvard[k1][2] <=ncovcol+nqv+ntv){ + Fixed[k]= 1; + Dummy[k]= 0; + modell[k].maintype= VTYPE; + modell[k].subtype= VPDD; /* Product time varying dummy * time varying dummy */ + ncovv++; /* Varying variables without age */ + TvarV[ncovv]=Tvar[k]; + TvarVind[ncovv]=k; + }else if(Tvard[k1][2] <=ncovcol+nqv+ntv+nqtv){ + Fixed[k]= 1; + Dummy[k]= 1; + modell[k].maintype= VTYPE; + modell[k].subtype= VPDQ; /* Product time varying dummy * time varying quantitative */ + ncovv++; /* Varying variables without age */ + TvarV[ncovv]=Tvar[k]; + TvarVind[ncovv]=k; + } + }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; + modell[k].maintype= VTYPE; + modell[k].subtype= VPDQ; /* Product time varying quantitative * fixed dummy */ + ncovv++; /* Varying variables without age */ + TvarV[ncovv]=Tvar[k]; + TvarVind[ncovv]=k; + }else if(Tvard[k1][2] <=ncovcol+nqv){ + Fixed[k]= 1; + Dummy[k]= 1; + modell[k].maintype= VTYPE; + modell[k].subtype= VPQQ; /* Product time varying quantitative * fixed quantitative */ + ncovv++; /* Varying variables without age */ + TvarV[ncovv]=Tvar[k]; + TvarVind[ncovv]=k; + }else if(Tvard[k1][2] <=ncovcol+nqv+ntv){ + Fixed[k]= 1; + Dummy[k]= 1; + modell[k].maintype= VTYPE; + modell[k].subtype= VPDQ; /* Product time varying quantitative * time varying dummy */ + ncovv++; /* Varying variables without age */ + TvarV[ncovv]=Tvar[k]; + TvarVind[ncovv]=k; + }else if(Tvard[k1][2] <=ncovcol+nqv+ntv+nqtv){ + Fixed[k]= 1; + Dummy[k]= 1; + modell[k].maintype= VTYPE; + modell[k].subtype= VPQQ; /* Product time varying quantitative * time varying quantitative */ + ncovv++; /* Varying variables without age */ + TvarV[ncovv]=Tvar[k]; + TvarVind[ncovv]=k; + } + }else{ + printf("Error unknown type of covariate: Tvard[%d][1]=%d,Tvard[%d][2]=%d\n",k1,Tvard[k1][1],k1,Tvard[k1][2]); + fprintf(ficlog,"Error unknown type of covariate: Tvard[%d][1]=%d,Tvard[%d][2]=%d\n",k1,Tvard[k1][1],k1,Tvard[k1][2]); + } /*end k1*/ + } + }else if(Typevar[k] == 3){ /* product Vn * Vm with 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 */ - - + /* model V1+V3+age*V1+age*V3+V1*V3 + V1*V3*age*/ + /* Tvar={1, 3, 1, 3, 6, 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, 1} k1=1 first product but second time varying because of V3 */ + ncova++; + TvarA[ncova]=Tvard[k1][1]; /* TvarVV[2]=V1 (because TvarVV[1] was V3, first time varying covariates */ + TvarAind[ncova]=k; /* TvarVVind[2]=5 (because TvarVVind[2] was V1*V3 at position 5 */ + ncova++; + TvarA[ncova]=Tvard[k1][2]; /* TvarVV[3]=V3 */ + TvarAind[ncova]=k; /* TvarVVind[2]=5 (because TvarVVind[2] was V1*V3 at position 5 */ + + /** Fixed[k] 0=fixed, 1 varying, 2 fixed with age product, 3 varying with age product */ + /** Dummy[k] 0=dummy (0 1), 1 quantitative (single or product without age), 2 dummy with age product, 3 quant with age product */ + if( FixedV[Tvardk[k][1]] == 0 && FixedV[Tvardk[k][2]] == 0){ + ncovta++; + TvarAVVA[ncovta]=Tvard[k1][1]; /* age*V6*V3 +age*V7*V3 + age*V6*V4 +age*V7*V4 */ + TvarAVVAind[ncovta]=k; + ncovta++; + TvarAVVA[ncovta]=Tvard[k1][2]; /* age*V6*V3 +age*V7*V3 + age*V6*V4 +age*V7*V4 */ + TvarAVVAind[ncovta]=k; + }else{ + ncovva++; /* HERY reached */ + TvarVVA[ncovva]=Tvard[k1][1]; /* age*V6*V3 +age*V7*V3 + age*V6*V4 +age*V7*V4 */ + TvarVVAind[ncovva]=k; + ncovva++; + TvarVVA[ncovva]=Tvard[k1][2]; /* */ + TvarVVAind[ncovva]=k; + ncovta++; + TvarAVVA[ncovta]=Tvard[k1][1]; /* age*V6*V3 +age*V7*V3 + age*V6*V4 +age*V7*V4 */ + TvarAVVAind[ncovta]=k; + ncovta++; + TvarAVVA[ncovta]=Tvard[k1][2]; /* age*V6*V3 +age*V7*V3 + age*V6*V4 +age*V7*V4 */ + TvarAVVAind[ncovta]=k; + } 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; + Fixed[k]= 2; + Dummy[k]= 2; modell[k].maintype= FTYPE; modell[k].subtype= FPDD; /* Product fixed dummy * fixed dummy */ - ncovf++; /* Fixed variables without age */ - TvarF[ncovf]=Tvar[k]; - TvarFind[ncovf]=k; + /* TvarF[ncova]=Tvar[k]; /\* Problem to solve *\/ */ + /* TvarFind[ncova]=k; */ }else if(Tvard[k1][2] <=ncovcol+nqv){ /* Vm is quanti fixed */ - Fixed[k]= 0; /* Fixed product */ - Dummy[k]= 1; + Fixed[k]= 2; /* Fixed product */ + Dummy[k]= 3; 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; + /* TvarF[ncova]=Tvar[k]; */ + /* TvarFind[ncova]=k; */ }else if(Tvard[k1][2] <=ncovcol+nqv+ntv){ /* Vm is a time varying dummy covariate */ - Fixed[k]= 1; - Dummy[k]= 0; + Fixed[k]= 3; + Dummy[k]= 2; modell[k].maintype= VTYPE; modell[k].subtype= VPDD; /* Product fixed dummy * varying dummy */ - ncovv++; /* Varying variables without age */ - TvarV[ncovv]=Tvar[k]; /* TvarV[1]=Tvar[5]=5 because there is a V4 */ - TvarVind[ncovv]=k;/* TvarVind[1]=5 */ + TvarV[ncova]=Tvar[k]; /* TvarV[1]=Tvar[5]=5 because there is a V4 */ + TvarVind[ncova]=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; + Fixed[k]= 3; + Dummy[k]= 3; modell[k].maintype= VTYPE; modell[k].subtype= VPDQ; /* Product fixed dummy * varying quantitative */ - ncovv++; /* Varying variables without age */ - TvarV[ncovv]=Tvar[k]; - TvarVind[ncovv]=k; + /* ncovv++; /\* Varying variables without age *\/ */ + /* TvarV[ncovv]=Tvar[k]; */ + /* TvarVind[ncovv]=k; */ } }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; + Fixed[k]= 2; /* Fixed product */ + Dummy[k]= 2; 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; + /* ncova++; /\* Fixed variables with age *\/ */ + /* TvarF[ncovf]=Tvar[k]; */ + /* TvarFind[ncovf]=k; */ }else if(Tvard[k1][2] <=ncovcol+nqv+ntv){ /* Vm is time varying */ - Fixed[k]= 1; - Dummy[k]= 1; + Fixed[k]= 2; + Dummy[k]= 3; modell[k].maintype= VTYPE; modell[k].subtype= VPDQ; /* Product fixed quantitative * varying dummy */ - ncovv++; /* Varying variables without age */ - TvarV[ncovv]=Tvar[k]; - TvarVind[ncovv]=k; + /* ncova++; /\* Varying variables with age *\/ */ + /* TvarV[ncova]=Tvar[k]; */ + /* TvarVind[ncova]=k; */ }else if(Tvard[k1][2] <=ncovcol+nqv+ntv+nqtv){ /* Vm is time varying quanti */ - Fixed[k]= 1; - Dummy[k]= 1; + Fixed[k]= 3; + Dummy[k]= 2; modell[k].maintype= VTYPE; modell[k].subtype= VPQQ; /* Product fixed quantitative * varying quantitative */ - ncovv++; /* Varying variables without age */ - TvarV[ncovv]=Tvar[k]; - TvarVind[ncovv]=k; - ncovv++; /* Varying variables without age */ - TvarV[ncovv]=Tvar[k]; - TvarVind[ncovv]=k; + ncova++; /* Varying variables without age */ + TvarV[ncova]=Tvar[k]; + TvarVind[ncova]=k; + /* ncova++; /\* Varying variables without age *\/ */ + /* TvarV[ncova]=Tvar[k]; */ + /* TvarVind[ncova]=k; */ } }else if(Tvard[k1][1] <=ncovcol+nqv+ntv){ /* Vn is time varying dummy */ if(Tvard[k1][2] <=ncovcol){ - Fixed[k]= 1; - Dummy[k]= 1; + Fixed[k]= 2; + Dummy[k]= 2; modell[k].maintype= VTYPE; modell[k].subtype= VPDD; /* Product time varying dummy * fixed dummy */ - ncovv++; /* Varying variables without age */ - TvarV[ncovv]=Tvar[k]; - TvarVind[ncovv]=k; + /* ncova++; /\* Varying variables with age *\/ */ + /* TvarV[ncova]=Tvar[k]; */ + /* TvarVind[ncova]=k; */ }else if(Tvard[k1][2] <=ncovcol+nqv){ - Fixed[k]= 1; - Dummy[k]= 1; + Fixed[k]= 2; + Dummy[k]= 3; modell[k].maintype= VTYPE; modell[k].subtype= VPDQ; /* Product time varying dummy * fixed quantitative */ - ncovv++; /* Varying variables without age */ - TvarV[ncovv]=Tvar[k]; - TvarVind[ncovv]=k; + /* ncova++; /\* Varying variables with age *\/ */ + /* TvarV[ncova]=Tvar[k]; */ + /* TvarVind[ncova]=k; */ }else if(Tvard[k1][2] <=ncovcol+nqv+ntv){ - Fixed[k]= 1; - Dummy[k]= 0; + Fixed[k]= 3; + Dummy[k]= 2; modell[k].maintype= VTYPE; modell[k].subtype= VPDD; /* Product time varying dummy * time varying dummy */ - ncovv++; /* Varying variables without age */ - TvarV[ncovv]=Tvar[k]; - TvarVind[ncovv]=k; + /* ncova++; /\* Varying variables with age *\/ */ + /* TvarV[ncova]=Tvar[k]; */ + /* TvarVind[ncova]=k; */ }else if(Tvard[k1][2] <=ncovcol+nqv+ntv+nqtv){ - Fixed[k]= 1; - Dummy[k]= 1; + Fixed[k]= 3; + Dummy[k]= 3; modell[k].maintype= VTYPE; modell[k].subtype= VPDQ; /* Product time varying dummy * time varying quantitative */ - ncovv++; /* Varying variables without age */ - TvarV[ncovv]=Tvar[k]; - TvarVind[ncovv]=k; + /* ncova++; /\* Varying variables with age *\/ */ + /* TvarV[ncova]=Tvar[k]; */ + /* TvarVind[ncova]=k; */ } }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; + Fixed[k]= 2; + Dummy[k]= 2; modell[k].maintype= VTYPE; modell[k].subtype= VPDQ; /* Product time varying quantitative * fixed dummy */ - ncovv++; /* Varying variables without age */ - TvarV[ncovv]=Tvar[k]; - TvarVind[ncovv]=k; + /* ncova++; /\* Varying variables with age *\/ */ + /* TvarV[ncova]=Tvar[k]; */ + /* TvarVind[ncova]=k; */ }else if(Tvard[k1][2] <=ncovcol+nqv){ - Fixed[k]= 1; - Dummy[k]= 1; + Fixed[k]= 2; + Dummy[k]= 3; modell[k].maintype= VTYPE; modell[k].subtype= VPQQ; /* Product time varying quantitative * fixed quantitative */ - ncovv++; /* Varying variables without age */ - TvarV[ncovv]=Tvar[k]; - TvarVind[ncovv]=k; + /* ncova++; /\* Varying variables with age *\/ */ + /* TvarV[ncova]=Tvar[k]; */ + /* TvarVind[ncova]=k; */ }else if(Tvard[k1][2] <=ncovcol+nqv+ntv){ - Fixed[k]= 1; - Dummy[k]= 1; + Fixed[k]= 3; + Dummy[k]= 2; modell[k].maintype= VTYPE; modell[k].subtype= VPDQ; /* Product time varying quantitative * time varying dummy */ - ncovv++; /* Varying variables without age */ - TvarV[ncovv]=Tvar[k]; - TvarVind[ncovv]=k; + /* ncova++; /\* Varying variables with age *\/ */ + /* TvarV[ncova]=Tvar[k]; */ + /* TvarVind[ncova]=k; */ }else if(Tvard[k1][2] <=ncovcol+nqv+ntv+nqtv){ - Fixed[k]= 1; - Dummy[k]= 1; + Fixed[k]= 3; + Dummy[k]= 3; modell[k].maintype= VTYPE; modell[k].subtype= VPQQ; /* Product time varying quantitative * time varying quantitative */ - ncovv++; /* Varying variables without age */ - TvarV[ncovv]=Tvar[k]; - TvarVind[ncovv]=k; + /* ncova++; /\* Varying variables with age *\/ */ + /* TvarV[ncova]=Tvar[k]; */ + /* TvarVind[ncova]=k; */ } }else{ printf("Error unknown type of covariate: Tvard[%d][1]=%d,Tvard[%d][2]=%d\n",k1,Tvard[k1][1],k1,Tvard[k1][2]); fprintf(ficlog,"Error unknown type of covariate: Tvard[%d][1]=%d,Tvard[%d][2]=%d\n",k1,Tvard[k1][1],k1,Tvard[k1][2]); } /*end k1*/ - }else{ + } else{ printf("Error, current version can't treat for performance reasons, Tvar[%d]=%d, Typevar[%d]=%d\n", k, Tvar[k], k, Typevar[k]); fprintf(ficlog,"Error, current version can't treat for performance reasons, Tvar[%d]=%d, Typevar[%d]=%d\n", k, Tvar[k], k, Typevar[k]); } @@ -11604,6 +12139,7 @@ Dummy[k] 0=dummy (0 1), 1 quantitative (single or product without age), 2 dummy /* printf(" modell[%d].maintype=%d, modell[%d].subtype=%d\n",k,modell[k].maintype,k,modell[k].subtype); */ fprintf(ficlog,"Decodemodel, k=%d, Tvar[%d]=V%d,Typevar=%d, Fixed=%d, Dummy=%d\n",k, k,Tvar[k],Typevar[k],Fixed[k],Dummy[k]); } + ncovvta=ncovva; /* Searching for doublons in the model */ for(k1=1; k1<= cptcovt;k1++){ for(k2=1; k2 + V%d*V%d",Tvard[Tposprod[j]][1],Tvard[Tposprod[j]][2]); + }else if(Typevar[j]==3) { /* TO VERIFY */ + printf(" + V%d*V%d*age ",Tvard[Tposprod[j]][1],Tvard[Tposprod[j]][2]); + fprintf(ficres," + V%d*V%d*age ",Tvard[Tposprod[j]][1],Tvard[Tposprod[j]][2]); + fprintf(ficlog," + V%d*V%d*age ",Tvard[Tposprod[j]][1],Tvard[Tposprod[j]][2]); + fprintf(fichtm, "+ V%d*V%d*age",Tvard[Tposprod[j]][1],Tvard[Tposprod[j]][2]); } } printf("\n"); @@ -13734,6 +14314,8 @@ Please run with mle=-1 to get a correct covariance matrix.\n",ageminpar,agemaxpa fprintf(fichtm, "+ V%d*age",Tvar[j]); }else if(Typevar[j]==2) { fprintf(fichtm, "+ V%d*V%d",Tvard[Tposprod[j]][1],Tvard[Tposprod[j]][2]); + }else if(Typevar[j]==3) { /* TO VERIFY */ + fprintf(fichtm, "+ V%d*V%d*age",Tvard[Tposprod[j]][1],Tvard[Tposprod[j]][2]); } } fprintf(fichtm, "\n"); @@ -13791,7 +14373,7 @@ Please run with mle=-1 to get a correct covariance matrix.\n",ageminpar,agemaxpa } fprintf(ficres,"# Covariance matrix \n# 121 Var(a12)\n# 122 Cov(b12,a12) Var(b12)\n# ...\n# 232 Cov(b23,a12) Cov(b23,b12) ... Var (b23)\n"); - if(mle >= 1) /* To big for the screen */ + if(mle >= 1) /* Too big for the screen */ printf("# Covariance matrix \n# 121 Var(a12)\n# 122 Cov(b12,a12) Var(b12)\n# ...\n# 232 Cov(b23,a12) Cov(b23,b12) ... Var (b23)\n"); fprintf(ficlog,"# Covariance matrix \n# 121 Var(a12)\n# 122 Cov(b12,a12) Var(b12)\n# ...\n# 232 Cov(b23,a12) Cov(b23,b12) ... Var (b23)\n"); /* # 121 Var(a12)\n\ */ @@ -14552,7 +15134,7 @@ Please run with mle=-1 to get a correct covariance matrix.\n",ageminpar,agemaxpa free_vector(weight,firstobs,lastobs); - free_imatrix(Tvardk,1,NCOVMAX,1,2); + free_imatrix(Tvardk,-1,NCOVMAX,1,2); free_imatrix(Tvard,1,NCOVMAX,1,2); free_imatrix(s,1,maxwav+1,firstobs,lastobs); free_matrix(anint,1,maxwav,firstobs,lastobs); @@ -14594,8 +15176,8 @@ Please run with mle=-1 to get a correct covariance matrix.\n",ageminpar,agemaxpa free_ivector(ncodemaxwundef,1,NCOVMAX); free_ivector(Dummy,-1,NCOVMAX); free_ivector(Fixed,-1,NCOVMAX); - free_ivector(DummyV,1,NCOVMAX); - free_ivector(FixedV,1,NCOVMAX); + free_ivector(DummyV,-1,NCOVMAX); + free_ivector(FixedV,-1,NCOVMAX); free_ivector(Typevar,-1,NCOVMAX); free_ivector(Tvar,1,NCOVMAX); free_ivector(TvarsQ,1,NCOVMAX); @@ -14617,6 +15199,10 @@ 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(TvarAVVA,1,NCOVMAX); + free_ivector(TvarAVVAind,1,NCOVMAX); + free_ivector(TvarVVA,1,NCOVMAX); + free_ivector(TvarVVAind,1,NCOVMAX); free_ivector(TvarVV,1,NCOVMAX); free_ivector(TvarVVind,1,NCOVMAX); -- 2.43.0