Example #1
0
// [[register]]
RcppExport SEXP updatealphas_Exp(SEXP alphast,
                                 SEXP n_s,
                                 SEXP K,
                                 SEXP I,
                                 SEXP lambda_s,
                                 SEXP gammat,
                                 SEXP var_1,
                                 SEXP var_2,
                                 SEXP p_var,
                                 SEXP ttt) {
  BEGIN_RCPP
  Rcpp::NumericVector xalphast(alphast);

  Rcpp::IntegerMatrix xn_s(n_s);
  Rcpp::IntegerMatrix xgammat(gammat);
  int xI = Rcpp::as<int>(I);
  int xK = Rcpp::as<int>(K);
  Rcpp::NumericVector sqrt_var1(var_1);
  Rcpp::NumericVector sqrt_var2(var_2);
  int xtt = Rcpp::as<int>(ttt);
  Rcpp::NumericVector xlambda_s(lambda_s);
  Rcpp::IntegerVector xAalphas(xK);

  Rcpp::RNGScope scope;
  Rcpp::NumericVector xp_var(p_var);  // proposal mixture

  double delF = 0.0;
  double psik = 0.;
  double log1 = 0.0;
  double log2 = 0.0;
  double sums = 0.;
  double sum_alp_ns = 0.0;
  double sum_alp = 0.0;
  double sum_gl_alp = 0.0;
  double sum_gl_alp_ns = 0.0;
  int flag1 = 0;
  int flagkk = 0;
  int lp1 = 0;
  for (int kk = 0; kk < xK; kk++) {
    delF = 0.0;
    psik = digamma(xalphast[kk]);
    log1 = 0.0;
    log2 = 0.0;
    for (int i = 0; i < xI; i++) {
      lp1 = 0;
      for (int k = 0; k < xK; k++) {
        if (xgammat(i, k) == 1) {
          lp1 += 1;
        }
      }

      std::vector<int> p1(lp1);
      flag1 = 0;
      flagkk = 0;
      for (int k = 0; k < xK; k++) {
        if (xgammat(i, k) == 1) {
          p1[flag1] = k;
          flag1 += 1;
          if (k == kk) {
            flagkk = 1;
          }
        }
      }
      sum_alp_ns = 0.0;
      sum_alp = 0.0;
      sum_gl_alp = 0.0;
      sum_gl_alp_ns = 0.0;
      for (int k = 0; k < lp1; k++) {
        sums = xalphast[p1[k]] + xn_s(i, p1[k]);
        sum_alp_ns += sums;
        sum_alp += xalphast[p1[k]];
        sum_gl_alp += lgamma(xalphast[p1[k]]);
        sum_gl_alp_ns += lgamma(sums);
      }
      if (flagkk > 0) {
        delF += digamma(xn_s(i, kk) + xalphast[kk]) - psik -
                digamma(sum_alp_ns) + digamma(sum_alp);
      }
      if (lp1 > 0) {
        log2 += -(sum_gl_alp - lgamma(sum_alp)) +
                (sum_gl_alp_ns - lgamma(sum_alp_ns));
      }
    }
    double mean_p = std::max(0.01, xalphast[kk] + delF / xtt);
    Rcpp::NumericVector alpha_s_p = Rcpp::rnorm(1, mean_p, sqrt_var1[kk]);

    if (Rcpp::as<double>(Rcpp::rbinom(1, 1, xp_var[kk])) == 1) {
      alpha_s_p = Rcpp::rnorm(1, mean_p, sqrt_var1[kk]);
    } else {
      alpha_s_p = Rcpp::rnorm(1, mean_p, sqrt_var2[kk]);
    }

    if (alpha_s_p[0] > 0.0) {
      std::vector<double> alp(xK);

      for (int i = 0; i < xK; i++) {
        alp[i] = xalphast[i];
      }
      alp[kk] = alpha_s_p[0];
      // log2 += log(xp_var[kk]*gsl_ran_gaussian_pdf(alp[kk]-mean_p,
      // sqrt_var1[kk])+(1-xp_var[kk])*gsl_ran_gaussian_pdf(alp[kk]-mean_p,
      // sqrt_var2[kk]));
      log2 +=
          log(xp_var[kk] * Rf_dnorm4(alp[kk], mean_p, sqrt_var1[kk], 0) +
              (1 - xp_var[kk]) * Rf_dnorm4(alp[kk], mean_p, sqrt_var2[kk], 0));
      delF = 0.0;
      psik = digamma(alp[kk]);
      for (int i = 0; i < xI; i++) {
        lp1 = 0;
        for (int k = 0; k < xK; k++) {
          if (xgammat(i, k) == 1) {
            lp1 += 1;
          }
        }

        std::vector<int> p1(lp1);
        flag1 = 0;
        flagkk = 0;
        for (int k = 0; k < xK; k++) {
          if (xgammat(i, k) == 1) {
            p1[flag1] = k;
            flag1 += 1;
            if (k == kk) {
              flagkk = 1;
            }
          }
        }

        sum_alp_ns = 0.0;
        sum_alp = 0.0;
        sum_gl_alp = 0.0;
        sum_gl_alp_ns = 0.0;
        for (int k = 0; k < lp1; k++) {
          sums = alp[p1[k]] + xn_s(i, p1[k]);
          sum_alp_ns += sums;
          sum_alp += alp[p1[k]];
          sum_gl_alp += lgamma(alp[p1[k]]);
          sum_gl_alp_ns += lgamma(sums);
        }
        if (flagkk > 0) {
          delF += digamma(xn_s(i, kk) + xalphast[kk]) - psik -
                  digamma(sum_alp_ns) + digamma(sum_alp);
        }
        if (lp1 > 0) {
          log1 += -(sum_gl_alp - lgamma(sum_alp)) +
                  (sum_gl_alp_ns - lgamma(sum_alp_ns));
        }
      }
      mean_p = std::max(0.01, alp[kk] + delF / xtt);
      // log1 +=log(xp_var[kk]*gsl_ran_gaussian_pdf(xalphast[kk]-mean_p,
      // sqrt_var1[kk])+(1-xp_var[kk])*gsl_ran_gaussian_pdf(xalphast[kk]-mean_p,
      // sqrt_var2[kk]));
      log1 += log(
          xp_var[kk] * Rf_dnorm4(xalphast[kk], mean_p, sqrt_var1[kk], 0) +
          (1 - xp_var[kk]) * Rf_dnorm4(xalphast[kk], mean_p, sqrt_var2[kk], 0));

      // log1 += log(gsl_ran_exponential_pdf(alp[kk],xlambda_s[kk]));
      // //exponential prior
      log1 += Rf_dexp(alp[kk], xlambda_s[kk], 1);

      // log2 +=
      // log(gsl_ran_exponential_pdf(xalphast[kk],xlambda_s[kk]));//exponential
      // prior
      log2 += Rf_dexp(xalphast[kk], xlambda_s[kk], 1);

      // if (alp[kk]<0 || alp[kk]>xlambda_s[kk]) {log1+=log(0);} //Uniform prior
      // if (xalphast[kk]<0 || xalphast[kk]>xlambda_s[kk]) {log2+=log(0);}
      // //Uniform prior

      if (log(Rcpp::as<double>(Rcpp::runif(1))) <= (log1 - log2)) {
        xalphast[kk] = alp[kk];
        xAalphas[kk] = 1;
      } else {
        xAalphas[kk] = 0;
      }
    }
  }

  return Rcpp::List::create(Rcpp::Named("alphas_tt") = xalphast,
                            Rcpp::Named("Aalphas") = xAalphas);

  END_RCPP
}
RcppExport SEXP updatealphau_noPu_Exp(SEXP alphaut, SEXP n_s, SEXP n_u, SEXP I, SEXP K, SEXP lambda_u, SEXP var_p, SEXP ttt, SEXP gammat)
{
    BEGIN_RCPP
    Rcpp::IntegerMatrix xgammat(gammat);
    Rcpp::NumericVector xalphaut(alphaut);
    Rcpp::IntegerMatrix xn_s(n_s);
    Rcpp::IntegerMatrix xn_u(n_u);
    int xI = Rcpp::as<int>(I);
    int xK = Rcpp::as<int>(K);  
    Rcpp::NumericVector sqrt_var(var_p);
    int xtt = Rcpp::as<int>(ttt);
    Rcpp::NumericVector xlambda_u(lambda_u);
    Rcpp::IntegerVector xAalphau(xK);

    Rcpp::RNGScope scope;

    double delF = 0.0;
    double log1 = 0.0;
    double log2 = 0.0;
    double sum_alphau = 0.0;
    int flag1 = 0; int flag0 = 0; int flagkk = 0;
    int lp0 = 0; int lp1 = 0; 
    double sum_nusalphau = 0.0;
    double sum_nualphau = 0.0;
    double sums = 0.;
    for (int kk = 0; kk < xK; kk++) {
        delF = 0.0;
        log1 = 0.0;
        log2 = 0.0;
        sum_alphau = 0.0;
        for (int s = 0; s < xK; s++) {
            sum_alphau += xalphaut[s];  
        }
        log2 -= xI*lgamma(xalphaut[kk]);
        delF += xI*(boost::math::digamma(sum_alphau)- boost::math::digamma(xalphaut[kk]));
        log2 += xI*lgamma(sum_alphau);
        for (int i = 0; i < xI; i++) {
            lp1 = 0; 
            for (int k = 0; k < xK; k++) {
              if (xgammat(i,k) == 1) { lp1 +=1;}       
            }
            lp0 = xK-lp1;
            int p1[lp1]; flag1 = 0;
            int p0[lp0]; flag0 = 0;
            flagkk = 0; // whether gamma_k = 1
           
            for (int k= 0; k < xK; k++) {
               if (xgammat(i,k) == 1) {
                  p1[flag1] = k;
                  flag1 += 1;
                  if (k == kk) {flagkk = 1;}
               } else {
                  p0[flag0] = k;
                  flag0 +=1;
               }
            }
            if (flagkk==1) {
               log2 += lgamma(xn_u(i,kk)+xalphaut[kk]);
               delF +=boost::math::digamma(xn_u(i,kk)+xalphaut[kk]);
               sum_nualphau = 0.0;
               sum_nusalphau = 0.0;
               for (int k = 0; k<lp1; k++) {
                   sums = xn_u(i,p1[k])+xalphaut[p1[k]];
                   sum_nualphau += sums;
                   sum_nusalphau += (sums+xn_s(i,p1[k]));
               }
               log2 -=lgamma(sum_nualphau);
               log2 += lgamma(sum_nusalphau+1);
               delF -=boost::math::digamma(sum_nualphau);
               delF += boost::math::digamma(sum_nusalphau+1);
              
               for (int k= 0; k<lp0; k++) {
                    sum_nusalphau +=(xn_u(i,p0[k])+xalphaut[p0[k]]+xn_s(i,p0[k]));
               }
               delF -= boost::math::digamma(sum_nusalphau+1);
               log2 -= lgamma(sum_nusalphau+1);
            } else {
               log2 += lgamma(xn_u(i,kk)+xalphaut[kk]+xn_s(i,kk));
               delF += boost::math::digamma(xn_u(i,kk)+xalphaut[kk]+xn_s(i,kk));
               sum_nusalphau = 0.0;
               for ( int k = 0; k<xK; k++) {
                   sum_nusalphau +=xn_u(i,k)+xalphaut[k]+xn_s(i,k);
               }
               log2 -= lgamma(sum_nusalphau+1);
               delF -= boost::math::digamma(sum_nusalphau+1);
           }
 
        }
        double mean_p = std::max(0.01, xalphaut[kk]+delF/xtt);
        Rcpp::NumericVector alpha_u_p = Rcpp::rnorm(1, mean_p, sqrt_var[kk]);
        if (alpha_u_p[0]>0.0) {
            double alp[xK];
            for (int i = 0; i<xK; i++) {
               alp[i] = xalphaut[i];
            }
            alp[kk] = alpha_u_p[0];
            log2 += log(gsl_ran_gaussian_pdf(alp[kk]-mean_p, sqrt_var[kk]));
            delF = 0.0; sum_alphau = 0.0;
            for (int s = 0; s < xK; s++) {
                sum_alphau += alp[s];
            }
            log1 -= xI*lgamma(alp[kk]);
            delF += xI*(boost::math::digamma(sum_alphau)- boost::math::digamma(alp[kk]));
            log1 += xI*lgamma(sum_alphau);
            for (int i = 0; i < xI; i++ ){
                lp1 = 0; 
                for (int k = 0; k < xK; k++) {
                    if (xgammat(i,k) == 1) { lp1 +=1;}       
                 }
                 lp0 = xK-lp1;
                 int p1[lp1];  flag1 = 0;
                 int p0[lp0];  flag0 = 0;
                 flagkk = 0; // whether gamma_k = 1
           
                 for (int k= 0; k < xK; k++) {
                     if (xgammat(i,k) == 1) {
                      p1[flag1] = k;
                      flag1 += 1;
                     if (k == kk) {flagkk = 1;}
                     } else {
                       p0[flag0] = k;
                       flag0 +=1;
                     }
                 }
                 if (flagkk==1) {
                   log1 += lgamma(xn_u(i,kk)+alp[kk]);
                   delF +=boost::math::digamma(xn_u(i,kk)+alp[kk]);
                   sum_nualphau = 0.0;
                   sum_nusalphau = 0.0;
                   for (int k = 0; k<lp1; k++) {
                       sums = xn_u(i,p1[k])+alp[p1[k]];
                       sum_nualphau += sums;
                       sum_nusalphau += (sums+xn_s(i,p1[k]));
                   }
                   log1 -=lgamma(sum_nualphau);
                   log1 += lgamma(sum_nusalphau+1);
                   delF -=boost::math::digamma(sum_nualphau);
                   delF += boost::math::digamma(sum_nusalphau+1);
              
                   for (int k= 0; k<lp0; k++) {
                       sum_nusalphau +=(xn_u(i,p0[k])+alp[p0[k]]+xn_s(i,p0[k]));
                   }
                   delF -= boost::math::digamma(sum_nusalphau+1);
                   log1 -= lgamma(sum_nusalphau+1);
                 } else {
                   log1 += lgamma(xn_u(i,kk)+alp[kk]+xn_s(i,kk));
                   delF += boost::math::digamma(xn_u(i,kk)+alp[kk]+xn_s(i,kk));
                   sum_nusalphau = 0.0;
                   for ( int k = 0; k<xK; k++) {
                      sum_nusalphau +=xn_u(i,k)+alp[k]+xn_s(i,k);
                   }
                   log1 -= lgamma(sum_nusalphau+1);
                   delF -=boost::math::digamma(sum_nusalphau+1);
                }
                
            }
            mean_p = std::max(0.01, alp[kk] + delF/xtt);
            log1 +=log(gsl_ran_gaussian_pdf(xalphaut[kk]-mean_p, sqrt_var[kk]));
            log1 += log(gsl_ran_exponential_pdf(alp[kk],xlambda_u[kk])); //exponential prior
            log2 += log(gsl_ran_exponential_pdf(xalphaut[kk],xlambda_u[kk])); //exponential prior
            //if (alp[kk]<0 || alp[kk]>xlambda_u[kk]) {log1+=log(0);} //Uniform prior
            //if (xalphaut[kk]<0 || xalphaut[kk]>xlambda_u[kk]) {log2+=log(0);} //Uniform prior
            
            if (log(Rcpp::as<double>(Rcpp::runif(1)) ) <= (log1 - log2)) {
                xalphaut[kk] = alp[kk];
                xAalphau[kk] = 1;
            } else{
                xAalphau[kk] = 0;
            }
        }
    }



    return Rcpp::List::create(Rcpp::Named("alphau_tt") = xalphaut, Rcpp::Named("Aalphau") = xAalphau);

    END_RCPP
}