### R code from vignette source 'MfUSampler.Rnw' ################################################### ### code chunk number 1: MfUSampler.Rnw:94-95 ################################################### options(prompt = "R> ", continue = "+ ", width = 70, useFancyQuotes = FALSE) ################################################### ### code chunk number 2: MfUSampler.Rnw:161-164 ################################################### library("MfUSampler") my.seed <- 0 nsmp <- 10 ################################################### ### code chunk number 3: MfUSampler.Rnw:172-177 ################################################### z <- c(1, 4, 7, 10, 13, 16, 19, 24) m1.prior <- c(17, 26, 39, 27, 35, 37, 26, 23) m2.prior <- c(215, 218, 137, 62, 36, 16, 13, 15) m1.current <- c(46, 52, 44, 54, 38, 39, 23, 52) m2.current <- c(290, 211, 134, 91, 53, 42, 23, 32) ################################################### ### code chunk number 4: MfUSampler.Rnw:180-181 ################################################### X <- cbind(1, z, z^2) ################################################### ### code chunk number 5: MfUSampler.Rnw:187-199 ################################################### loglike <- function(beta, X, m1, m2) { beta <- as.numeric(beta) Xbeta <- X %*% beta return (-sum((m1 + m2) * log(1 + exp(-Xbeta)) + m2 * Xbeta)) } logprior <- function(beta, beta0 , W) { return (-0.5 * t(beta - beta0) %*% solve(W) %*% (beta - beta0)) } logpost <- function(beta, X, m1, m2 , beta0 = rep(0,0, 3), W = diag(1e+6, nrow = 3)) { return (logprior(beta, beta0, W) + loglike(beta, X, m1, m2)) } ################################################### ### code chunk number 6: MfUSampler.Rnw:202-204 ################################################### m1.total <- m1.prior + m1.current m2.total <- m2.prior + m2.current ################################################### ### code chunk number 7: MfUSampler.Rnw:207-212 (eval = FALSE) ################################################### ## set.seed(my.seed) ## beta.ini <- c(0.0, 0.0, 0.0) ## beta.smp <- MfU.Sample.Run(beta.ini, logpost, nsmp = nsmp ## , X = X, m1 = m1.total, m2 = m2.total) ## summ.slice <- summary(beta.smp) ################################################### ### code chunk number 8: MfUSampler.Rnw:214-215 ################################################### load("summ.slice") ################################################### ### code chunk number 9: MfUSampler.Rnw:217-218 ################################################### print(summ.slice) ################################################### ### code chunk number 10: MfUSampler.Rnw:221-222 ################################################### print(summ.slice$covar) ################################################### ### code chunk number 11: MfUSampler.Rnw:227-244 ################################################### logpost.fg <- function(beta, X, m1, m2 , beta0 = rep(0.0, 3), W = diag(1e+3, nrow = 3) , grad = FALSE) { Xbeta <- X %*% beta if (grad) { log.prior.d <- -solve(W) %*% (beta - beta0) log.like.d <- t(X) %*% ((m1 + m2) / (1 + exp(Xbeta)) - m2) return (log.prior.d + log.like.d) } log.prior <- -0.5 * t(beta - beta0) %*% solve(W) %*% (beta - beta0) log.like <- -sum((m1 + m2) * log(1 + exp(-Xbeta)) + m2 * Xbeta) log.post <- log.prior + log.like return (log.post) } ################################################### ### code chunk number 12: MfUSampler.Rnw:247-255 ################################################### set.seed(my.seed) beta.ini <- c(0.0, 0.0, 0.0) beta.smp <- MfU.Sample.Run(beta.ini, logpost.fg, nsmp = nsmp , uni.sampler = "ars" , control = MfU.Control(3, ars.x = list(c(-10, 0, 10) , c(-1, 0, 1), c(-0.1, 0.0, 0.1))) , X = X, m1 = m1.total, m2 = m2.total) summ.ars <- summary(beta.smp) ################################################### ### code chunk number 13: MfUSampler.Rnw:257-258 ################################################### load("summ.ars") ################################################### ### code chunk number 14: MfUSampler.Rnw:260-261 ################################################### print(summ.ars) ################################################### ### code chunk number 15: MfUSampler.Rnw:267-270 ################################################### predfunc.mean <- function(beta, X) { return (1/(1 + exp(-X %*% beta))) } ################################################### ### code chunk number 16: MfUSampler.Rnw:273-276 ################################################### pred.mean <- predict(beta.smp, predfunc.mean, X) predmean.summ <- summary(pred.mean) print(predmean.summ, n = 8) ################################################### ### code chunk number 17: MfUSampler.Rnw:279-285 ################################################### predfunc.binary <- function(beta, X) { return (1*(runif(nrow(X)) < 1/(1 + exp(-X %*% beta)))) } pred.binary <- predict(beta.smp, predfunc.binary, X) predbinary.summ <- summary(pred.binary) print(predbinary.summ, n = 8) ################################################### ### code chunk number 18: MfUSampler.Rnw:294-310 ################################################### library("mvtnorm") set.seed(my.seed) nrep <- 50 m.current <- m1.current + m2.current nz.exp <- nrep * sum(m.current) jitter <- 1.0 z.exp <- sample(z, size = nz.exp, replace = T, prob = m.current) + (2*runif(nz.exp) - 1) * jitter X.exp <- cbind(1, z.exp, z.exp^2) beta0.prior <- c(-3.17, 0.33, -0.007) W.prior <- 1e-4 * matrix(c(638, -111, 3.9 , -111, 24.1, -0.9, 3.9, -0.9, 0.04), ncol = 3) ngrp <- 50 beta.mat <- t(rmvnorm(ngrp, mean = beta0.prior, sigma = W.prior)) y.mat.exp <- 1* matrix(runif(ngrp * nz.exp) < 1 / (1 + exp(-X.exp %*% beta.mat)), ncol = ngrp) ################################################### ### code chunk number 19: MfUSampler.Rnw:316-332 ################################################### hb.logprior <- function(beta.flat, beta0, W) { beta.mat <- matrix(beta.flat, nrow = 3) return (sum(apply(beta.mat, 2, logprior, beta0, W))) } hb.loglike <- function(beta.flat, X, y) { beta.mat <- matrix(beta.flat, nrow = 3) ngrp <- ncol(beta.mat) return (sum(sapply(1:ngrp, function(n) { xbeta <- X %*% beta.mat[, n] return (-sum((1-y[, n]) * xbeta + log(1 + exp(-xbeta)))) }))) } hb.logpost <- function(beta.flat, X, y, beta0, W) { return (hb.logprior(beta.flat, beta0, W) + hb.loglike(beta.flat, X, y)) } ################################################### ### code chunk number 20: MfUSampler.Rnw:335-342 (eval = FALSE) ################################################### ## nsmp <- 10 ## set.seed(my.seed) ## beta.flat.ini <- rep(0.0, 3 * ngrp) ## beta.flat.smp <- MfU.Sample.Run(beta.flat.ini, hb.logpost ## , X = X.exp, y = y.mat.exp ## , beta0 = beta0.prior, W = W.prior, nsmp = nsmp) ## t.naive <- attr(beta.flat.smp, "t") ################################################### ### code chunk number 21: MfUSampler.Rnw:344-345 ################################################### load("t.naive") ################################################### ### code chunk number 22: MfUSampler.Rnw:347-348 ################################################### cat("hb sampling time - naive method:", t.naive, "sec\n") ################################################### ### code chunk number 23: MfUSampler.Rnw:353-364 ################################################### hb.loglike.grp <- function(beta, X, y) { beta <- as.numeric(beta) xbeta <- X %*% beta return (-sum((1-y) * xbeta + log(1 + exp(-xbeta)))) } hb.logprior.grp <- logprior hb.logpost.grp <- function(beta, X, y , beta0 = rep(0,0, 3), W = diag(1e+6, nrow = 3)) { return (hb.logprior.grp(beta, beta0, W) + hb.loglike.grp(beta, X, y)) } ################################################### ### code chunk number 24: MfUSampler.Rnw:367-368 ################################################### t.revised <- 10.7 ################################################### ### code chunk number 25: MfUSampler.Rnw:370-383 (eval = FALSE) ################################################### ## set.seed(my.seed) ## beta.mat.buff <- matrix(rep(0.0, 3 * ngrp), nrow = 3) ## beta.mat.smp <- array(NA, dim = c(nsmp, 3, ngrp)) ## t.revised <- proc.time()[3] ## for (i in 1:nsmp) { ## for (n in 1:ngrp) { ## beta.mat.buff[, n] <- MfU.Sample(beta.mat.buff[, n], hb.logpost.grp ## , uni.sampler = "slice", X = X.exp ## , y = y.mat.exp[, n], beta0 = beta0.prior, W = W.prior) ## } ## beta.mat.smp[i, , ] <- beta.mat.buff ## } ## t.revised <- proc.time()[3] - t.revised ################################################### ### code chunk number 26: MfUSampler.Rnw:385-386 ################################################### load("t.revised") ################################################### ### code chunk number 27: MfUSampler.Rnw:388-389 ################################################### cat("hb sampling time - revised method:", t.revised, "sec\n") ################################################### ### code chunk number 28: MfUSampler.Rnw:392-410 (eval = FALSE) ################################################### ## library("doParallel") ## ncores <- 2 ## registerDoParallel(ncores) ## ## set.seed(my.seed) ## beta.mat.buff <- matrix(rep(0.0, 3 * ngrp), nrow = 3) ## beta.mat.smp <- array(NA, dim = c(nsmp, 3, ngrp)) ## t.parallel <- proc.time()[3] ## for (i in 1:nsmp) { ## beta.mat.buff <- foreach(n=1:ngrp, .combine = cbind ## , .options.multicore=list(preschedule=TRUE)) %dopar% { ## MfU.Sample(beta.mat.buff[, n], hb.logpost.grp, uni.sampler = "slice" ## , X = X.exp, y = y.mat.exp[, n] ## , beta0 = beta0.prior, W = W.prior) ## } ## beta.mat.smp[i, , ] <- beta.mat.buff ## } ## t.parallel <- proc.time()[3] - t.parallel ################################################### ### code chunk number 29: MfUSampler.Rnw:412-413 ################################################### load("t.parallel") ################################################### ### code chunk number 30: MfUSampler.Rnw:415-416 ################################################### cat("hb sampling time - revised & parallel method:", t.parallel, "sec\n") ################################################### ### code chunk number 31: MfUSampler.Rnw:422-445 ################################################### library("RcppArmadillo") library("inline") code <- " arma::vec beta_cpp = Rcpp::as(beta); arma::mat X_cpp = Rcpp::as(X); arma::vec y_cpp = Rcpp::as(y); arma::vec xbeta = X_cpp * beta_cpp; int n = X_cpp.n_rows; double logp = 0.0; for (int i=0; i