void ZMMCS::draw(){ Ptr<MvnSuf> s = m_->suf(); double df = s->n() + siginv_prior_->nu(); Spd S = s->center_sumsq(m_->mu()) + siginv_prior_->sumsq(); S = rWish(df, S.inv()); m_->prm()->set_ivar(S); }
/* r interface for rWish */ void RWISH( double * sample, double * s, int * dfPtr, int * sizePtr ) { size_t i,j; double ** Sample = calloc( *sizePtr, sizeof(double *) ); double ** S = calloc( *sizePtr, sizeof(double *) ); for(i = 0; i < *sizePtr; i++) Sample[i] = &sample[ *sizePtr * i ]; for(i = 0; i < *sizePtr; i++) S[i] = &s[ *sizePtr * i ]; GetRNGstate(); /************** debug *******************/ #ifdef MNPDEBUG Rprintf("S: \n"); for(i=0;i<*sizePtr;i++) { Rprintf("%d:\t",i); for(j=0;j<*sizePtr;j++){ Rprintf("%f\t", S[i][j]); } Rprintf("\n"); Rprintf("df = %d\n", *dfPtr); } #endif /************** debug *******************/ rWish(Sample, S, *dfPtr , *sizePtr); /************** debug *******************/ #ifdef MNPDEBUG Rprintf("Sample: \n"); for(i=0;i<*sizePtr;i++) { Rprintf("%d:\t",i); for(j=0;j<*sizePtr;j++){ Rprintf("%f\t", Sample[i][j]); } Rprintf("\n"); } #endif /************** debug *******************/ PutRNGstate(); free(Sample); free(S); return; }
void DrawSigma(dinfo& di, double *V, std::vector<std::vector<double> >& allfit, double *w, std::vector<std::vector<double> >& WishSample, int nu) { std::vector<std::vector<double> > WishMat1; std::vector<std::vector<double> > epsilon; std::vector<std::vector<double> > WishMat1Inv; epsilon.resize(di.n_dim); WishMat1.resize(di.n_dim); for(size_t j=0;j<di.n_dim;j++){ WishMat1[j].resize(di.n_dim); epsilon[j].resize(di.n_samp); } for(size_t i=0; i<di.n_samp; i++){ for(size_t k=0; k<di.n_dim; k++){ epsilon[k][i] = w[i*di.n_dim + k] - allfit[k][i]; } } for(size_t j=0;j<di.n_dim;j++){ for(size_t k=0;k<di.n_dim;k++){ WishMat1[j][k] = V[j*di.n_dim + k]; } } for(size_t i=0; i<di.n_samp; i++){ for(size_t j=0;j<di.n_dim;j++){ for(size_t k=0;k<di.n_dim;k++){ WishMat1[j][k] +=epsilon[j][i]*epsilon[k][i]; } } } dinv(WishMat1 ,di.n_dim,WishMat1Inv); rWish(WishSample, WishMat1Inv, (int)(nu+di.n_samp),(int)di.n_dim); }
SpdMatrix WishartModel::simdat(){ return rWish(nu(), sumsq()); }