コード例 #1
0
ファイル: common.c プロジェクト: cran/spTimer
// betasp => n x q
// Xsp => N x q
// XB => N x 1
void comb_XB_sp(int *n, int *r, int *T, int *q, double *Xsp, double *betasp, 
     int *constant, double *XB)
{
     int i, j, l, t, n1, r1, T1, q1;
     n1=*n;
     r1=*r;
     T1=*T;
     q1=*q;
     
     double *XB1, *dump, *I;
     XB1 = (double *) malloc((size_t)((n1*n1)*sizeof(double)));
     dump = (double *) malloc((size_t)((n1)*sizeof(double)));
     I = (double *) malloc((size_t)((n1)*sizeof(double)));
               
     for(l=0; l<r1; l++){
        for(t=0; t<T1; t++){
           for(i=0; i<n1; i++){
             I[i] = 0.0;
           }
           for(j=0; j<q1; j++){      
             extract_X_sp2(t, l, j, n, r, T, Xsp, XB1); // n x n
             for(i=0; i<n1; i++){
               dump[i] = betasp[i+j*n1]; // n x 1
             }
             MProd(dump, constant, n, XB1, n, dump); // n x 1 
             MAdd(I, n, constant, dump, I); // n x 1
           }
           put_together1(l, t, n, r, T, XB, I);
        }
     }
     free(XB1); free(dump); free(I);
     return;
}
コード例 #2
0
// 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;
}