View source: R/simulationpipeline.R
| rIndepNormalGammaReg_std | R Documentation |
rIndepNormalGammaReg_std generates iid samples from a Bayesian Gaussian
regression model with an independent Normal-Gamma prior, in standard form. The
function should only be called after standardization and envelope construction
(e.g., via EnvelopeOrchestrator).
rIndepNormalGammaReg_std(
n,
y,
x,
mu,
P,
alpha,
wt,
f2,
Envelope,
gamma_list,
UB_list,
family,
link,
progbar = TRUE,
verbose = FALSE
)
n |
Number of draws to generate. If |
y |
A vector of observations of length |
x |
A design matrix of dimension |
mu |
A matrix of prior means (typically standardized to zero) of dimension
|
P |
A positive-definite matrix of dimension |
alpha |
A numeric vector of length |
wt |
An optional vector of prior weights. Should be |
f2 |
Function used to calculate the negative of the log-posterior
(kept for signature parity with |
Envelope |
An envelope object containing |
gamma_list |
A list with |
UB_list |
A list with |
family |
Character vector specifying the family (e.g., |
link |
Character vector specifying the link (e.g., |
progbar |
Logical. Whether to display a progress bar during simulation. |
verbose |
Logical. Whether to print diagnostic messages. |
This function uses the envelope and dispersion bounds from
EnvelopeOrchestrator to sample from the joint posterior of
coefficients and dispersion via rejection sampling. It is typically called
internally by rindepNormalGamma_reg(), but may be used directly for
custom split workflows (e.g., after constructing the envelope separately).
A list with components:
beta_out |
A matrix of simulated regression coefficients in standardized space. Each row is one draw. |
disp_out |
A vector of dispersion draws for each sample. |
iters_out |
A vector of iteration counts (candidates per acceptance) for each draw. |
weight_out |
A vector of weights (typically all ones). |
EnvelopeOrchestrator for envelope construction,
rNormalGLM_std for the non-Gaussian standardized sampler,
rindepNormalGamma_reg for the full simulation routine.
############################### Start of rIndepNormalGammaReg_std example ####################
# This example demonstrates calling rIndepNormalGammaReg_std directly for Gaussian
# regression with an independent Normal-Gamma prior. It uses Ex_EnvelopeDispersionBuild
# as a starting point (Steps A through F: EnvelopeCentering, mode optimization,
# standardization, EnvelopeBuild, EnvelopeDispersionBuild, EnvelopeSort), then
# adds sampling and back-transformation to unstandardized form (like the C++ code
# and rNormalGLM_std).
ctl <- c(4.17, 5.58, 5.18, 6.11, 4.50, 4.61, 5.17, 4.53, 5.33, 5.14)
trt <- c(4.81, 4.17, 4.41, 3.59, 5.87, 3.83, 6.03, 4.89, 4.32, 4.69)
group <- gl(2, 10, 20, labels = c("Ctl", "Trt"))
weight <- c(ctl, trt)
ps <- Prior_Setup(weight ~ group, gaussian())
x <- as.matrix(ps$x)
y <- as.vector(ps$y)
mu <- ps$mu
Sigma <- ps$Sigma
shape <- ps$shape
rate <- ps$rate
n_obs <- length(y)
wt <- rep(1, n_obs)
offset2 <- rep(0, n_obs)
# Reconstruct coefficient precision P (matches rindepNormalGamma_reg)
Rchol <- chol(Sigma)
Pinv <- chol2inv(Rchol)
P <- 0.5 * (Pinv + t(Pinv))
famfunc <- glmbfamfunc(gaussian())
f2 <- famfunc$f2
f3 <- famfunc$f3
Gridtype_core <- as.integer(2)
###############################################################################
# Step A: EnvelopeCentering (initial dispersion + dispersion anchoring loop)
###############################################################################
centering <- EnvelopeCentering(
y = y,
x = x,
mu = as.vector(mu),
P = P,
offset = offset2,
wt = wt,
shape = shape,
rate = rate,
Gridtype = Gridtype_core,
verbose = FALSE
)
dispersion2 <- centering$dispersion
RSS_Post2 <- centering$RSS_post
n_w <- sum(wt)
###############################################################################
# Step B: Coefficient posterior mode optimization (optim + f2/f3)
###############################################################################
dispstar <- dispersion2
wt2_opt <- wt / dispstar
alpha <- as.vector(x %*% as.vector(mu) + offset2)
mu2 <- rep(0, length(as.vector(mu))) # mu2 = 0 * mu (as in C++)
parin <- rep(0, length(as.vector(mu))) # parin = 0 vector (mu - mu)
opt_out <- optim(
par = parin,
fn = f2,
gr = f3,
y = as.vector(y),
x = as.matrix(x),
mu = as.vector(mu2),
P = as.matrix(P),
alpha = as.vector(alpha),
wt = as.vector(wt2_opt),
method = "BFGS",
hessian = TRUE
)
bstar <- opt_out$par
A1 <- opt_out$hessian
###############################################################################
# Step C: Standardize model (glmb_Standardize_Model)
###############################################################################
Standard_Mod <- glmb_Standardize_Model(
y = as.vector(y),
x = as.matrix(x),
P = as.matrix(P),
bstar = as.matrix(bstar, ncol = 1),
A1 = as.matrix(A1)
)
bstar2 <- Standard_Mod$bstar2
A <- Standard_Mod$A
x2_std <- Standard_Mod$x2
mu2_std <- Standard_Mod$mu2
P2_std <- Standard_Mod$P2
L2Inv <- Standard_Mod$L2Inv
L3Inv <- Standard_Mod$L3Inv
###############################################################################
# Step D: EnvelopeBuild (coefficient envelope at Gridtype = 3)
###############################################################################
max_disp_perc <- 0.99
n_env <- as.integer(200) # used by EnvelopeBuild for diagnostics/overhead
Gridtype_env <- as.integer(3) # EnvelopeOrchestrator overrides to 3
shape2_env <- shape + n_w / 2.0
rate3_env <- rate + RSS_Post2 / 2.0
d1_star <- rate3_env / (shape2_env - 1.0)
wt2_env <- wt / d1_star
Env2 <- EnvelopeBuild(
bStar = as.vector(bstar2),
A = as.matrix(A),
y = as.vector(y),
x = as.matrix(x2_std),
mu = as.matrix(mu2_std, ncol = 1),
P = as.matrix(P2_std),
alpha = as.vector(alpha),
wt = as.vector(wt2_env),
family = "gaussian",
link = "identity",
Gridtype = Gridtype_env,
n = n_env,
n_envopt = as.integer(1),
sortgrid = FALSE,
use_opencl = FALSE,
verbose = FALSE
)
###############################################################################
# Step E: EnvelopeDispersionBuild (dispersion-aware envelope)
###############################################################################
disp_env_out <- EnvelopeDispersionBuild(
Env = Env2,
Shape = shape,
Rate = rate,
P = as.matrix(P2_std),
y = as.vector(y),
x = as.matrix(x2_std),
alpha = as.vector(alpha),
n_obs = as.integer(n_obs),
RSS_post = RSS_Post2,
RSS_ML = NA_real_,
mu = as.matrix(mu2_std, ncol = 1),
wt = as.vector(wt),
max_disp_perc = max_disp_perc,
disp_lower = NULL,
disp_upper = NULL,
verbose = FALSE,
use_parallel = TRUE
)
###############################################################################
# Step F: EnvelopeSort (mirror EnvelopeOrchestrator: disp_grid_type = 2)
###############################################################################
Env3_raw <- disp_env_out$Env_out
UB_list_new <- disp_env_out$UB_list
gamma_list_new <- disp_env_out$gamma_list
cbars <- Env3_raw$cbars
l1 <- ncol(cbars)
l2 <- nrow(cbars)
logP_vec <- Env3_raw$logP
logP_mat <- matrix(logP_vec, nrow = length(logP_vec), ncol = 1)
Env3 <- EnvelopeSort(
l1 = l1,
l2 = l2,
GIndex = Env3_raw$GridIndex,
G3 = Env3_raw$thetabars,
cbars = cbars,
logU = Env3_raw$logU,
logrt = Env3_raw$logrt,
loglt = Env3_raw$loglt,
logP = logP_mat,
LLconst = Env3_raw$LLconst,
PLSD = Env3_raw$PLSD,
a1 = Env3_raw$a1,
E_draws = Env3_raw$E_draws,
lg_prob_factor = UB_list_new$lg_prob_factor,
UB2min = UB_list_new$UB2min
)
UB_list_final <- UB_list_new
UB_list_final$lg_prob_factor <- Env3$lg_prob_factor
UB_list_final$UB2min <- Env3$UB2min
env_final <- list(
Env = Env3,
gamma_list = gamma_list_new,
UB_list = UB_list_final,
diagnostics = disp_env_out$diagnostics,
low = gamma_list_new$disp_lower,
upp = gamma_list_new$disp_upper
)
###############################################################################
# Step G: Sample via rIndepNormalGammaReg_std (standardized space)
###############################################################################
n <- as.integer(100)
sim <- rIndepNormalGammaReg_std(
n = n,
y = as.vector(y),
x = as.matrix(x2_std),
mu = as.matrix(mu2_std, ncol = 1),
P = as.matrix(P2_std),
alpha = as.vector(alpha),
wt = as.vector(wt),
f2 = f2,
Envelope = env_final$Env,
gamma_list = env_final$gamma_list,
UB_list = env_final$UB_list,
family = "gaussian",
link = "identity",
progbar = FALSE,
verbose = FALSE
)
###############################################################################
# Step H: Back-transform to unstandardized form (mirror C++ and rNormalGLM_std)
###############################################################################
# beta_out is n x p (one draw per row); t(beta_out) is p x n
coef_unstd <- L2Inv %*% L3Inv %*% t(sim$beta_out)
for (i in seq_len(n)) {
coef_unstd[, i] <- coef_unstd[, i] + as.vector(mu)
}
coefficients <- t(coef_unstd) # n x p, one draw per row
colnames(coefficients) <- colnames(x)
###############################################################################
# Summary output
###############################################################################
summary(coefficients)
mean(sim$iters_out)
sim$disp_out[1:5]
###############################################################################
# End of rIndepNormalGammaReg_std example
###############################################################################
Add the following code to your website.
For more information on customizing the embed code, read Embedding Snippets.