void WP::mle() { double old_loglike = loglike( concatenate_params(average_daily_rate(), day_of_week_pattern(), weekday_hourly_pattern(), weekend_hourly_pattern())); double dloglike = 1.0; while (dloglike > 1e-5) { maximize_average_daily_rate(); maximize_daily_pattern(); maximize_hourly_pattern(); double new_loglike = loglike(concatenate_params( average_daily_rate(), day_of_week_pattern(), weekday_hourly_pattern(), weekend_hourly_pattern())); dloglike = new_loglike - old_loglike; old_loglike = new_loglike; } }
void LogitEMC::find_posterior_mode(){ if(!pri_){ ostringstream err; err << "Logit_EMC cannot find posterior mode. " << "No prior is set." << endl; throw_exception<std::runtime_error>(err.str()); } d2LoglikeTF loglike(this); d2LogPostTF logpost(loglike, pri_); Vec b = this->beta(); uint dim = b.size(); Vec g(dim); Mat h(dim,dim); b = max_nd2(b, g, h, Target(logpost), dTarget(logpost), d2Target(logpost), 1e-5); this->set_beta(b); }
void LogitEMC::find_posterior_mode(){ if(!pri_){ ostringstream err; err << "Logit_EMC cannot find posterior mode. " << "No prior is set." << endl; report_error(err.str()); } d2LoglikeTF loglike(this); d2LogPostTF logpost(loglike, pri_); Vector b = this->Beta(); uint dim = b.size(); Vector g(dim); Matrix h(dim,dim); b = max_nd2(b, g, h, Target(logpost), dTarget(logpost), d2Target(logpost), 1e-5); this->set_Beta(b); }
static double regroup(struct ClassSig *Sig, int nbands) { int s; int i; double tmp; double maxlike = 0.0; double likelihood; double subsum; struct ClassData *Data; /* set data pointer */ Data = &(Sig->ClassData); /* compute likelihoods */ likelihood = 0; for (s = 0; s < Data->npixels; s++) { for (i = 0; i < Sig->nsubclasses; i++) { tmp = loglike(Data->x[s], &(Sig->SubSig[i]), nbands); Data->p[s][i] = tmp; if (i == 0) maxlike = tmp; if (tmp > maxlike) maxlike = tmp; } subsum = 0; for (i = 0; i < Sig->nsubclasses; i++) { tmp = exp(Data->p[s][i] - maxlike) * Sig->SubSig[i].pi; subsum += tmp; Data->p[s][i] = tmp; } likelihood += log(subsum) + maxlike; for (i = 0; i < Sig->nsubclasses; i++) Data->p[s][i] /= subsum; } return (likelihood); }
//[[Rcpp::export]] List rhierMnlRwMixture_rcpp_loop(List const& lgtdata, mat const& Z, vec const& deltabar, mat const& Ad, mat const& mubar, mat const& Amu, double nu, mat const& V, double s, int R, int keep, int nprint, bool drawdelta, mat olddelta, vec const& a, vec oldprob, mat oldbetas, vec ind, vec const& SignRes){ // Wayne Taylor 10/01/2014 int nlgt = lgtdata.size(); int nvar = V.n_cols; int nz = Z.n_cols; mat rootpi, betabar, ucholinv, incroot; int mkeep; mnlMetropOnceOut metropout_struct; List lgtdatai, nmix; // convert List to std::vector of struct std::vector<moments> lgtdata_vector; moments lgtdatai_struct; for (int lgt = 0; lgt<nlgt; lgt++){ lgtdatai = lgtdata[lgt]; lgtdatai_struct.y = as<vec>(lgtdatai["y"]); lgtdatai_struct.X = as<mat>(lgtdatai["X"]); lgtdatai_struct.hess = as<mat>(lgtdatai["hess"]); lgtdata_vector.push_back(lgtdatai_struct); } // allocate space for draws vec oldll = zeros<vec>(nlgt); cube betadraw(nlgt, nvar, R/keep); mat probdraw(R/keep, oldprob.size()); vec loglike(R/keep); mat Deltadraw(1,1); if(drawdelta) Deltadraw.zeros(R/keep, nz*nvar);//enlarge Deltadraw only if the space is required List compdraw(R/keep); if (nprint>0) startMcmcTimer(); for (int rep = 0; rep<R; rep++){ //first draw comps,ind,p | {beta_i}, delta // ind,p need initialization comps is drawn first in sub-Gibbs List mgout; if(drawdelta) { olddelta.reshape(nvar,nz); mgout = rmixGibbs (oldbetas-Z*trans(olddelta),mubar,Amu,nu,V,a,oldprob,ind); } else { mgout = rmixGibbs(oldbetas,mubar,Amu,nu,V,a,oldprob,ind); } List oldcomp = mgout["comps"]; oldprob = as<vec>(mgout["p"]); //conversion from Rcpp to Armadillo requires explict declaration of variable type using as<> ind = as<vec>(mgout["z"]); //now draw delta | {beta_i}, ind, comps if(drawdelta) olddelta = drawDelta(Z,oldbetas,ind,oldcomp,deltabar,Ad); //loop over all LGT equations drawing beta_i | ind[i],z[i,],mu[ind[i]],rooti[ind[i]] for(int lgt = 0; lgt<nlgt; lgt++){ List oldcomplgt = oldcomp[ind[lgt]-1]; rootpi = as<mat>(oldcomplgt[1]); //note: beta_i = Delta*z_i + u_i Delta is nvar x nz if(drawdelta){ olddelta.reshape(nvar,nz); betabar = as<vec>(oldcomplgt[0])+olddelta*vectorise(Z(lgt,span::all)); } else { betabar = as<vec>(oldcomplgt[0]); } if (rep == 0) oldll[lgt] = llmnl_con(vectorise(oldbetas(lgt,span::all)),lgtdata_vector[lgt].y,lgtdata_vector[lgt].X,SignRes); //compute inc.root ucholinv = solve(trimatu(chol(lgtdata_vector[lgt].hess+rootpi*trans(rootpi))), eye(nvar,nvar)); //trimatu interprets the matrix as upper triangular and makes solve more efficient incroot = chol(ucholinv*trans(ucholinv)); metropout_struct = mnlMetropOnce_con(lgtdata_vector[lgt].y,lgtdata_vector[lgt].X,vectorise(oldbetas(lgt,span::all)), oldll[lgt],s,incroot,betabar,rootpi,SignRes); oldbetas(lgt,span::all) = trans(metropout_struct.betadraw); oldll[lgt] = metropout_struct.oldll; } //print time to completion and draw # every nprint'th draw if (nprint>0) if ((rep+1)%nprint==0) infoMcmcTimer(rep, R); if((rep+1)%keep==0){ mkeep = (rep+1)/keep; betadraw.slice(mkeep-1) = oldbetas; probdraw(mkeep-1, span::all) = trans(oldprob); loglike[mkeep-1] = sum(oldll); if(drawdelta) Deltadraw(mkeep-1, span::all) = trans(vectorise(olddelta)); compdraw[mkeep-1] = oldcomp; } } if (nprint>0) endMcmcTimer(); nmix = List::create(Named("probdraw") = probdraw, Named("zdraw") = R_NilValue, //sets the value to NULL in R Named("compdraw") = compdraw); //ADDED FOR CONSTRAINTS //If there are sign constraints, return f(betadraws) as "betadraws" //conStatus will be set to true if SignRes has any non-zero elements bool conStatus = any(SignRes); if(conStatus){ int SignResSize = SignRes.size(); //loop through each sign constraint for(int i = 0;i < SignResSize; i++){ //if there is a constraint loop through each slice of betadraw if(SignRes[i] != 0){ for(int s = 0;s < R/keep; s++){ betadraw(span(),span(i),span(s)) = SignRes[i] * exp(betadraw(span(),span(i),span(s))); } } }//end loop through SignRes } if(drawdelta){ return(List::create( Named("Deltadraw") = Deltadraw, Named("betadraw") = betadraw, Named("nmix") = nmix, Named("loglike") = loglike, Named("SignRes") = SignRes)); } else { return(List::create( Named("betadraw") = betadraw, Named("nmix") = nmix, Named("loglike") = loglike, Named("SignRes") = SignRes)); } }