// PK ----------------------------------------------------------------------- int MCMCPkPg::sampleSigma( PkPgModel& model, PkPgResult& Result ){ for( size_t i = 0; i < model.N; i++ ){ mat Y = model.Y.slice( i ); // log( Y ) mat Fit = Result.Fit.slice( i ); // need to check if it's logged for( size_t k = 0; k < model.K; k++ ){ double pr1 = 0.5 * ( model.prior.r1 + model.prior.T ); vec resid = log( Y.col( k ) ) - log( Fit.col( k ) ); double ssr = dot(resid, resid ); double pr2 = 0.5 * ( model.prior.r2 + ssr ); Result.Sigma( i, k ) = rinvgamma( pr1, pr2 ); } } return 0; }
void CParam::S3_sig2_i(CData &Data) { for (int i=0; i<n_pheno; i++){ arma::vec mu_i_onevec(n_SNP) ; mu_i_onevec.fill(mu_vec(i)) ; arma::vec e_i = E_mat.row(i).t() ; double n_i = sum(e_i) ; arma::vec logy_i = Data.logY.row(i).t() ; arma::vec logy_minus_mu = logy_i - mu_i_onevec ; arma::vec e1_logy_minus_mu = logy_minus_mu % e_i ; arma::vec sum_e1_squares = e1_logy_minus_mu.t() * e1_logy_minus_mu ; double a_star = Data.a_sigma + 0.5 * n_i ; double b_star = Data.b_sigma + 0.5 * sum_e1_squares(0) ; sig2_vec(i) = rinvgamma(a_star, b_star) ; } is_accept_vec(2) = 1 ; }