// ratio function for the phi sample void ratio_fnc(double *ratio, int *constant, double *U) { if( *ratio < 1.0){ ratio[0] = ratio[0]; } else { ratio[0] = 1.0; } runif_val(constant, constant, U); return; }
// Discrete sampling for nu void nu_gp_DIS(int *cov, double *Qeta1, double *det1, double *phi, double *nu1, int *n, int *r, int *T, int *rT, int *N, double *d, double *sig2eta, double *XB, double *o, int *constant, double *nup) { int row, col, i, r1, T1, N1, rT1; row = *n; col = *constant; r1 = *r; T1 = *T; N1 = row*r1*T1; rT1 = *rT; int nuk; nuk=30; double *nus; nus = (double *) malloc((size_t)((nuk)*sizeof(double))); nus[0]=0.05; nus[1]=0.10; nus[2]=0.15; nus[3]=0.20; nus[4]=0.25; nus[5]=0.30; nus[6]=0.35; nus[7]=0.40; nus[8]=0.45; nus[9]=0.50; nus[10]=0.55; nus[11]=0.60; nus[12]=0.65; nus[13]=0.70; nus[14]=0.75; nus[15]=0.80; nus[16]=0.85; nus[17]=0.90; nus[18]=0.95; nus[19]=1.0; nus[20]=1.05; nus[21]=1.10; nus[22]=1.15; nus[23]=1.20; nus[24]=1.25; nus[25]=1.30; nus[26]=1.35; nus[27]=1.40; nus[28]=1.45; nus[29]=1.50; // nus[20]=1.25; nus[21]=1.50; nus[22]=1.75; nus[23]=2.00; nus[24]=2.5; // nus[25]=3.00; nus[26]=4.00; nus[27]=5.00; nus[28]=10.00; nus[29]=20.00; /* nuk=20; double *nus; nus = (double *) malloc((size_t)((nuk)*sizeof(double))); nus[0]=0.05; nus[1]=0.10; nus[2]=0.15; nus[3]=0.20; nus[4]=0.25; nus[5]=0.30; nus[6]=0.35; nus[7]=0.40; nus[8]=0.45; nus[9]=0.50; nus[10]=0.55; nus[11]=0.60; nus[12]=0.65; nus[13]=0.70; nus[14]=0.75; nus[15]=0.80; nus[16]=0.85; nus[17]=0.90; nus[18]=0.95; nus[19]=1.0; */ /* nuk=10; double *nus; nus = (double *) malloc((size_t)((nuk)*sizeof(double))); nus[0]=0.10; nus[1]=0.20; nus[2]=0.30; nus[3]=0.40; nus[4]=0.50; nus[5]=0.60; nus[6]=0.70; nus[7]=0.80; nus[8]=0.90; nus[9]=1.0; */ double *nutmp, *pden, *Qeta, *det, *out; nutmp = (double *) malloc((size_t)((col)*sizeof(double))); pden = (double *) malloc((size_t)((nuk)*sizeof(double))); Qeta = (double *) malloc((size_t)((row*row)*sizeof(double))); det = (double *) malloc((size_t)((col)*sizeof(double))); out = (double *) malloc((size_t)((col)*sizeof(double))); double u; u =0.0; for(i=0; i< nuk; i++){ nutmp[0] = nus[i]; covFormat2(cov, n, phi, nutmp, d, sig2eta, det, Qeta); nudens_gp(Qeta, det, n, r, T, rT, N, XB, o, constant, out); pden[i] = out[0]; u += out[0]; } free(nutmp); free(Qeta); free(det); free(out); double *pprob, *U, *tr2; pprob = (double *) malloc((size_t)((nuk)*sizeof(double))); U = (double *) malloc((size_t)((col)*sizeof(double))); tr2 = (double *) malloc((size_t)((col)*sizeof(double))); // cumulative prob pprob[0] = pden[0]/u; for(i=0; i< (nuk-1); i++){ pprob[i+1] = pprob[i] + pden[i+1]/u; } runif_val(constant, constant, U); if ( U[0] > pprob[0]){ i = 0 ; do{ i = i + 1; } while ( ( U[0] > pprob[i] ) & ( i< nuk - 1 ) ) ; } else i=0; // nup[0] = nus[i]; tr2[0] = pden[i]; free(pprob); double *ratio, *tr1; ratio = (double *) malloc((size_t)((col)*sizeof(double))); tr1 = (double *) malloc((size_t)((col)*sizeof(double))); nudens_gp(Qeta1, det1, n, r, T, rT, N, XB, o, constant, tr1); ratio[0] = exp(tr2[0] + exp(tr2[0]) - tr1[0] - exp(tr1[0])); ratio_fnc(ratio, constant, U); if(U[0] < ratio[0]){ nup[0] = nus[i]; } else { nup[0] = nu1[0]; } // Rprintf(" i: %i, ratio: %4.4f, U: %4.4f, nup: %4.4f \n", i, ratio[i],U[0],nup[0]); free(ratio); free(tr2); free(tr1); free(pden); free(U); free(nus); return; }
// Discrete sampling for phi void phi_gp_DIS(int *cov, double *Qeta1, double *det1, double *phi1, double *phis, int *phik, double *nu, int *n, int *r, int *T, int *rT, int *N, double *prior_a, double *prior_b, double *d, double *sig2eta, double *XB, double *o, int *constant, double *accept, double *phip) { int row, col, i, r1, T1, N1, rT1, pk; row = *n; col = *constant; r1 = *r; T1 = *T; N1 = row*r1*T1; rT1 = *rT; pk = *phik; double *phitmp, *pden, *Qeta, *det, *out; phitmp = (double *) malloc((size_t)((col)*sizeof(double))); pden = (double *) malloc((size_t)((pk)*sizeof(double))); Qeta = (double *) malloc((size_t)((row*row)*sizeof(double))); det = (double *) malloc((size_t)((col)*sizeof(double))); out = (double *) malloc((size_t)((col)*sizeof(double))); double u; u =0.0; for(i=0; i< *phik; i++){ phitmp[0] = phis[i]; covFormat2(cov, n, phitmp, nu, d, sig2eta, det, Qeta); phidens_gp(phitmp, Qeta, det, n, r, T, rT, N, prior_a, prior_b, XB, o, constant, out); pden[i] = out[0]; u += out[0]; } free(phitmp); free(Qeta); free(det); free(out); double *pprob, *U, *tr2; pprob = (double *) malloc((size_t)((pk)*sizeof(double))); U = (double *) malloc((size_t)((col)*sizeof(double))); tr2 = (double *) malloc((size_t)((col)*sizeof(double))); pprob[0] = pden[0]/u; for(i=0; i< (pk-1); i++){ pprob[i+1] = pprob[i] + pden[i+1]/u; } runif_val(constant, constant, U); if ( U[0] > pprob[0]){ i = 0 ; do{ i = i + 1; } while ( ( U[0] > pprob[i] ) & ( i< pk - 1 ) ) ; } else i=0; tr2[0] = pden[i]; free(pprob); double *ratio, *tr1; ratio = (double *) malloc((size_t)((col)*sizeof(double))); tr1 = (double *) malloc((size_t)((col)*sizeof(double))); phidens_gp(phi1, Qeta1, det1, n, r, T, rT, N, prior_a, prior_b, XB, o, constant, tr1); ratio[0] = exp(tr2[0] + exp(tr2[0]) - tr1[0] - exp(tr1[0])); ratio_fnc(ratio, constant, U); if(U[0] < ratio[0]){ phip[0] = phis[i]; } else { phip[0] = phi1[0]; } accept[0] = 0.0; free(ratio); free(tr2); free(tr1); free(pden); free(U); return; }