// Posterior distribution for "sig_e" void sig_e_gp(int *n, int *r, int *T, int *rT, int *N, double *shape, double *prior_b, double *XB, double *o, double *z, double *sig_e, int *constant, double *sig2e) { int i, t, l, n1, r1, T1, col; n1 =*n; r1 =*r; T1 =*T; col =*constant; double *z1, *o1, *zo, *zzoo, *XB1, *tmp; z1 = (double *) malloc((size_t)((n1*col)*sizeof(double))); o1 = (double *) malloc((size_t)((n1*col)*sizeof(double))); zo = (double *) malloc((size_t)((n1*col)*sizeof(double))); zzoo = (double *) malloc((size_t)((col)*sizeof(double))); XB1 = (double *) malloc((size_t)((n1*col)*sizeof(double))); tmp = (double *) malloc((size_t)((col)*sizeof(double))); double u, v, b, sige[1]; u = 0.0; v = 0.0; b = 0.0; for(l=0; l<r1; l++){ for(t=0; t<T1; t++){ extract_alt2(l, t, n, rT, T, o, o1); extract_alt2(l, t, n, rT, T, z, z1); extract_alt2(l, t, n, rT, T, XB, XB1); for(i=0; i<n1; i++){ // zzoo[0] = o1[i]-XB1[i]; zzoo[0] = z1[i]-o1[i]; tmp[0] = 0.005; mvrnormal(constant, zzoo, tmp, constant, zzoo); // zo[i] = z1[i]-(o1[i]+zzoo[0]); zo[i] = zzoo[0]; } MProd(zo, constant, n, zo, constant, zzoo); u += zzoo[0]; } } b = *prior_b; u = b + 0.5 * u; v = *shape; sige[0] = rigammaa(v, u); *sig2e = sige[0]; free(z1); free(o1); free(zo); free(zzoo); free(XB1);free(tmp); return; }
void phidens_gp(double *phi, double *Qeta, double *det, int *n, int *r, int *T, int *rT, int *N, double *prior_a, double *prior_b, double *XB, double *o, int *constant, double *out) { int row, col, l, i, j, r1, T1, N1, rT1; row = *n; col = *constant; r1 = *r; T1 = *T; N1 = *N; rT1 = *rT; double *ov, *o1, *XB1; o1 = (double *) malloc((size_t)((row*col)*sizeof(double))); ov = (double *) malloc((size_t)((row*col)*sizeof(double))); XB1 = (double *) malloc((size_t)((row*col)*sizeof(double))); double u, a, b; u = 0.0; for(l=0; l < r1; l++) { for(i=0; i < T1; i++) { extract_alt2(l, i, n, rT, T, o, o1); extract_alt2(l, i, n, rT, T, XB, XB1); for(j=0; j < row; j++) { ov[j]=o1[j]-XB1[j]; } u += xTay2(ov, Qeta, ov, row); } } free(o1); free(ov); free(XB1); a = *prior_a; b = *prior_b; u = 0.5 * u; if(det[0] <= 0){ det[0] = pow(1,-320); } if(phi[0] <= 0){ phi[0] = pow(1,-320); } double tr; tr = 0.0; tr = (a-1.0)*log(phi[0])-b*phi[0]-0.5*rT1*log(det[0])-u; out[0] = tr; return; }
// Posterior distribution for "sig_eta" void sig_eta_gp(int *n, int *r, int *T, int *rT, double *shape, double *prior_b, double *Sinv, double *XB, double *o, int *constant, double *sig2eta) { double *ov, *o1, *out, u, b, sh, sig[1]; int row, col, l, i, j, r1, T1; row = *n; col = *constant; r1 = *r; T1 = *T; o1 = (double *) malloc((size_t)((row*col)*sizeof(double))); ov = (double *) malloc((size_t)((row*col)*sizeof(double))); out = (double *) malloc((size_t)((row*col)*sizeof(double))); double *XB1; XB1 = (double *) malloc((size_t)((row*col)*sizeof(double))); u = 0.0; for(l=0; l < r1; l++) { for(i=0; i < T1; i++) { extract_alt2(l, i, n, rT, T, o, o1); extract_alt2(l, i, n, rT, T, XB, XB1); for(j=0; j < row; j++) { ov[j]=o1[j]-XB1[j]; } MProd(ov, constant, n, Sinv, n, out); MProd(out, constant, n, ov, constant, out); u += out[0]; // u += xTay2(ov, Sinv, ov, row); } } b = *prior_b; u = b + 0.5 * u; sh = *shape; sig[0] = rigammaa(sh, u); *sig2eta = sig[0]; free(ov); free(o1); free(XB1); free(out); return; }
// K-step Forecasts without its void zlt_fore_gpp(int *cov, int *K, int *n, int *m, int *r, int *p, int *rT, int *T, int *rK, int *nrK, double *dnm, double *dm, double *phi, double *nu, double *sig_e, double *sig_eta, double *beta, double *rho, double *wp, double *foreX, int *constant, double *foreZ) { int l, k, t, i, T1, K1, r1, n1, m1, col; T1 =*T; K1 =*K; r1 =*r; n1 =*n; m1 =*m; col =*constant; double *C, *det, *I, *A, *mu, *XB, *XB1; double *wp1, *Aw, *eta, *eps, *zfore; C = (double *) malloc((size_t)((n1*m1)*sizeof(double))); // Sigeta = (double *) malloc((size_t)((m1*m1)*sizeof(double))); // Sinv = (double *) malloc((size_t)((m1*m1)*sizeof(double))); det = (double *) malloc((size_t)((col)*sizeof(double))); I = (double *) malloc((size_t)((m1*col)*sizeof(double))); A = (double *) malloc((size_t)((m1*n1)*sizeof(double))); mu = (double *) malloc((size_t)((col)*sizeof(double))); XB = (double *) malloc((size_t)((n1*r1*K1*col)*sizeof(double))); XB1 = (double *) malloc((size_t)((n1*col)*sizeof(double))); wp1 = (double *) malloc((size_t)((m1*col)*sizeof(double))); Aw = (double *) malloc((size_t)((n1*col)*sizeof(double))); eta = (double *) malloc((size_t)((m1*col)*sizeof(double))); eps = (double *) malloc((size_t)((col)*sizeof(double))); zfore = (double *) malloc((size_t)((n1*col)*sizeof(double))); double *S, *C12c, *s21, *sig; S = (double *) malloc((size_t)((m1*m1)*sizeof(double))); C12c = (double *) malloc((size_t)((m1*col)*sizeof(double))); s21 = (double *) malloc((size_t)((col)*sizeof(double))); sig = (double *) malloc((size_t)((col)*sizeof(double))); /* // exponential covariance if(cov[0] == 1){ for(i = 0; i < (m1*m1); i++){ S[i] = exp(-1.0*phi[0]*dm[i]); // Sigeta[i] = sig_eta[0]*S[i]; } // MInv(Sigeta, Sinv_eta, m, det); for(i=0; i < m1*n1; i++){ C[i] = exp(-1.0*phi[0]*dnm[i]); } } // gaussian covariance if(cov[0] == 2){ for(i = 0; i < (m1*m1); i++){ S[i] = exp(-1.0*phi[0]*phi[0]*dm[i]*dm[i]); // Sigeta[i] = sig_eta[0]*S[i]; } // MInv(Sigeta, Sinv_eta, m, det); for(i=0; i < m1*n1; i++){ C[i] = exp(-1.0*phi[0]*phi[0]*dnm[i]*dnm[i]); } } // spherical covariance if(cov[0] == 3){ for(i = 0; i < (m1*m1); i++){ if(dm[i] > 0 && dm[i] <= 1.0/phi[0]){ S[i] = (1.0-1.5*phi[0]*dm[i]+0.5*(phi[0]*dm[i])*(phi[0]*dm[i])*(phi[0]*dm[i])); // Sigeta[i] = sig_eta[0]*S[i]; } else if(dm[i] >= 1.0/phi[0]){ S[i] = 0.0; // Sigeta[i] = 0.0; } else{ S[i] = 1.0; // Sigeta[i] = 1.0*sig_eta[0]; } } // MInv(Sigeta, Sinv_eta, m, det); for(i=0; i < m1*n1; i++){ if(dnm[i] > 0 && dnm[i] <= 1.0/phi[0]){ C[i] = 1.0-1.5*phi[0]*dnm[i]+0.5*(phi[0]*dnm[i])*(phi[0]*dnm[i])*(phi[0]*dnm[i]); } else if(dnm[i] >= 1.0/phi[0]){ C[i] = 0.0; } else{ C[i] = 1.0; } } } // matern covariance, nu = 3/2 if(cov[0] == 4){ for(i = 0; i < (m1*m1); i++){ S[i] = ((1.0+phi[0]*dm[i])*exp(-1.0*phi[0]*dm[i])); // Sigeta[i] = sig_eta[0]*S[i]; } // MInv(Sigeta, Sinv_eta, m, det); for(i=0; i < m1*n1; i++){ C[i] = (1.0+phi[0]*dnm[i])*exp(-1.0*phi[0]*dnm[i]); } } */ covF(cov, m, m, phi, nu, dm, S); covF(cov, n, m, phi, nu, dnm, C); MInv(S, S, m, det); // m x m MProd(S, m, m, C, n, A); // n x m for(i=0; i<m1; i++){ I[i] = 0.0; } mu[0] = 0.0; MProd(beta, constant, p, foreX, nrK, XB); // nrK x 1 for(l=0; l<r1; l++){ for(k=0; k<1; k++){ t = (T1-1); extract_alt2(l, k, n, rK, K, XB, XB1); // n x 1 for(i=0; i<m1; i++){ wp1[i] = wp[i+t*m1+l*m1*T1]; } MProd(wp1, constant, m, A, n, Aw); // n x 1 for(i=0; i<n1; i++){ extn_12(i, m, C, C12c); // m x 1 xTay(C12c, S, C12c, m, s21); // 1 x 1 if(s21[0] > 1.0){ s21[0] = 1.0-pow(1,-320); } if(s21[0] == 1.0){ s21[0] = 1.0-pow(1,-320); } sig[0] = sig_eta[0] * (1.0 - s21[0]); mu[0] = 0.0; mvrnormal(constant, mu, sig_e, constant, eps); mu[0] = Aw[i]; mvrnormal(constant, mu, sig, constant, eta); zfore[i] = XB1[i] + eta[0] + eps[0]; } put_together1(l, k, n, r, K, foreZ, zfore); } for(k=1; k<K1; k++){ for(i=0; i<m1; i++){ wp1[i] = wp1[i]; // m x 1 } MProd(wp1, constant, m, A, n, Aw); // n x 1 extract_alt2(l, k, n, rK, K, XB, XB1); // n x 1 mvrnormal(constant, mu, sig_e, constant, eps); for(i=0; i<n1; i++){ extn_12(i, m, C, C12c); // m x 1 xTay(C12c, S, C12c, m, s21); // 1 x 1 if(s21[0] > 1.0){ s21[0] = 1.0-pow(1,-320); } if(s21[0] == 1.0){ s21[0] = 1.0-pow(1,-320); } sig[0] = sig_eta[0] * (1.0 - s21[0]); mu[0] = 0.0; mvrnormal(constant, mu, sig_e, constant, eps); mu[0] = Aw[i]; mvrnormal(constant, mu, sig, constant, eta); zfore[i] = XB1[i] + eta[0] + eps[0]; } put_together1(l, k, n, r, K, foreZ, zfore); } } free(S); free(det); free(C); free(I); free(A); free(mu); free(XB); free(XB1); free(wp1); free(Aw); free(eta); free(eps); free(zfore); free(C12c); free(s21); free(sig); return; }
// Rnadom-walk metropolis for phi void phi_gp_MH(double *Qeta1, double *Qeta2, double *det1, double *det2, double *phi1, double *phi2, int *n, int *r, int *T, int *rT, int *N, double *prior_a, double *prior_b, double *XB, double *o, int *constant, double *accept, double *phip) { int row, col, l, i, j, r1, T1, N1, rT1; row = *n; col = *constant; r1 = *r; T1 = *T; N1 = row*r1*T1; rT1 = *rT; double *ov, *o1, *XB1, *ratio, *U; o1 = (double *) malloc((size_t)((row*col)*sizeof(double))); ov = (double *) malloc((size_t)((row*col)*sizeof(double))); XB1 = (double *) malloc((size_t)((row*col)*sizeof(double))); ratio = (double *) malloc((size_t)((col)*sizeof(double))); U = (double *) malloc((size_t)((col)*sizeof(double))); double u, v, a, b; u = 0.0; v = 0.0; for(l=0; l < r1; l++) { for(i=0; i < T1; i++) { extract_alt2(l, i, n, rT, T, o, o1); extract_alt2(l, i, n, rT, T, XB, XB1); for(j=0; j < row; j++) { ov[j]=o1[j]-XB1[j]; } u += xTay2(ov, Qeta1, ov, row); v += xTay2(ov, Qeta2, ov, row); } } a = *prior_a; b = *prior_b; u = 0.5 * u; v = 0.5 * v; double tr1, tr2; tr1 = 0.0; tr2 = 0.0; if(det1[0] <= 0){ det1[0] = pow(1,-320); } if(det2[0] <= 0){ det2[0] = pow(1,-320); } if(phi1[0] <= 0){ phi1[0] = pow(1,-320); } if(phi2[0] <= 0){ phi2[0] = pow(1,-320); } if(phi2[0] < 0.0010){ phip[0] = phi1[0]; accept[0] = 0.0; } else if(phi2[0] > 0.9999){ phip[0] = phi1[0]; accept[0] = 0.0; } else{ tr1 = (a-1.0)*log(phi1[0])-b*phi1[0]-0.5*rT1*log(det1[0])- u; tr2 = (a-1.0)*log(phi2[0])-b*phi2[0]-0.5*rT1*log(det2[0])- v; ratio[0] = exp(tr2 + exp(tr2) - tr1 - exp(tr1)); ratio_fnc(ratio, constant, U); if(U[0] < ratio[0]){ phip[0] = phi2[0]; accept[0] = 1.0; } else { phip[0] = phi1[0]; accept[0] = 0.0; } } free(o1); free(ov); free(XB1); free(ratio); free(U); return; }
// conditional posterior for o_lt void o_gp(int *n, int *r, int *T, int *rT, int *p, double *prior_omu, double *prior_osig, double *sig_e, double *sig_eta, double *S, double *Qeta, double *XB, double *z, int *constant, double *opost) { int i, l, t, r1, nn, row, T1, col, p1; r1 = *r; row = *n; T1 = *T; nn = row * row; col = *constant; p1 = *p; double *o_1, *de_tT, *det1, *chi_tT, *mean1, *XB1, *QXB1, *zT; o_1 = (double *) malloc((size_t)((row)*sizeof(double))); de_tT = (double *) malloc((size_t)((nn)*sizeof(double))); det1 = (double *) malloc((size_t)((col)*sizeof(double))); chi_tT = (double *) malloc((size_t)((row)*sizeof(double))); mean1 = (double *) malloc((size_t)((row)*sizeof(double))); XB1 = (double *) malloc((size_t)((row)*sizeof(double))); QXB1 = (double *) malloc((size_t)((row)*sizeof(double))); zT = (double *) malloc((size_t)((row)*sizeof(double))); // for 1 <= t <= T, the delta part for(i=0; i < nn; i++) { de_tT[i] = (1.0/sig_e[0]) + Qeta[i] + 1.0/prior_osig[0]; } MInv(de_tT, de_tT, n, det1); // n x n double *term1, *I, *term2, *zt; term1 = (double *) malloc((size_t)((nn)*sizeof(double))); I = (double *) malloc((size_t)((row)*sizeof(double))); term2 = (double *) malloc((size_t)((row)*sizeof(double))); zt = (double *) malloc((size_t)((row)*sizeof(double))); // term1 and term2 for(i=0; i < nn; i++) { term1[i] = (sig_eta[0]/sig_e[0])* S[i]; } for(i=0; i < row; i++) { I[i]= 1.0; } MProd(I, constant, n, term1, n, term2); for(l=0; l < r1; l++) { for(t=0; t < T1; t++) { extract_alt2(l, t, n, rT, T, XB, XB1); extract_alt2(l, t, n, rT, T, z, zT); MProd(zT, constant, n, term1, n, zt); for(i=0; i < row; i++) { mean1[i] = (XB1[i]+zt[i])/(1+term2[i]) + prior_omu[0]; } mvrnormal(constant, mean1, de_tT, n, o_1); // random generator put_together1(l, t, n, r, T, opost, o_1); } } // End of loop year free(o_1); free(de_tT); free(det1); free(chi_tT); free(mean1); free(XB1); free(QXB1); free(zT); free(term1); free(I); free(term2); free(zt); return; }
// Posterior distribution for "theta" void beta_gp(int *n, int *r, int *T, int *rT, int *p, double *prior_mu, double *prior_sig, double *Qeta, double *X, double *o, int *constant, double *betap) { int t, l, i, n1, p1, r1, T1, col; n1 =*n; p1 =*p; r1 =*r; T1 =*T; col =*constant; double *del, *chi, *ot1, *X1, *tX1, *out, *tX1QX1, *tX1Qo, *det, *mu, *I; del = (double *) malloc((size_t)((p1*p1)*sizeof(double))); chi = (double *) malloc((size_t)((p1*col)*sizeof(double))); ot1 = (double *) malloc((size_t)((n1*col)*sizeof(double))); X1 = (double *) malloc((size_t)((n1*p1)*sizeof(double))); tX1 = (double *) malloc((size_t)((n1*p1)*sizeof(double))); out = (double *) malloc((size_t)((n1*p1)*sizeof(double))); tX1QX1 = (double *) malloc((size_t)((p1*p1)*sizeof(double))); tX1Qo = (double *) malloc((size_t)((p1*col)*sizeof(double))); det = (double *) malloc((size_t)((col)*sizeof(double))); mu = (double *) malloc((size_t)((p1*col)*sizeof(double))); I = (double *) malloc((size_t)((p1*p1)*sizeof(double))); for(i=0; i<p1*p1; i++){ del[i] = 0.0; } for(i=0; i<p1; i++){ chi[i] = 0.0; } for(l=0; l<r1; l++){ for(t=0; t<T1; t++){ extract_X(t, l, n, r, T, p, X, X1); // n x p MTranspose(X1, p, n, tX1); // p x n MProd(X1, p, n, Qeta, n, out); // n x p MProd(out, p, n, tX1, p, tX1QX1); // pxp MAdd(del, p, p, tX1QX1, del); // pxp extract_alt2(l, t, n, rT, T, o, ot1); // n x 1 MProd(ot1, constant, n, Qeta, n, out); // n x 1 MProd(out, constant, n, tX1, p, tX1Qo); // p x 1 MAdd(chi, p, constant, tX1Qo, chi); // p x 1 } } IdentityM(p, I); for(i=0; i<p1*p1; i++){ del[i] = del[i] + I[i]*(1.0/prior_sig[0]); } free(I); for(i=0; i<p1; i++){ chi[i] = chi[i] + prior_mu[0]/prior_sig[0]; } MInv(del, del, p, det); MProd(chi, constant, p, del, p, mu); // p x 1 mvrnormal(constant, mu, del, p, betap); free(del); free(chi); free(ot1); free(X1); free(tX1); free(out); free(tX1QX1); free(tX1Qo); free(det); free(mu); return; }