top of page

From: Bayesian Models for Astrophysical Data, Cambridge Univ. Press

(c) 2017,  Joseph M. Hilbe, Rafael S. de Souza and Emille E. O. Ishida  

​

you are kindly asked to include the complete citation if you used this material in a publication

​

​

Code 4.6 Multivariate normal linear model in R using JAGS

=================================================

require(R2jags)

​

set.seed(1056)                                                            # set seed to replicate example
nobs = 5000                                                               # number of obs in model

x1 <- runif(nobs)                                                       # random uniform variable
x2 <- runif(nobs)                                                       # random uniform variable
beta1 = 2.0                                                                 # intercept
beta2 = 3.0                                                                 # 1st coefficient
beta3 = -2.5                                                                # 2nd coefficient

xb <- beta1 + beta2*x1 + beta3*x2                           # linear predictor
y <- rnorm(nobs, xb, sd=1)                                        # create y as adjusted random normal variate

 

# Model setup
X <- model.matrix(~ 1 + x1+x2)
K <- ncol(X)

model.data <- list(Y = y,                                             # response variable
                              X = X,                                           # predictors
                              K = K,                                           # number of predictors including the intercept
                              N = nobs                                       # sample size
                              )

​

NORM <- "
model{
    # Diffuse normal priors for predictors
    for (i in 1:K) { beta[i] ~ dnorm(0, 0.0001) }

​

    # Uniform prior for standard deviation
    tau <- pow(sigma, -2)                                               # precision
    sigma ~ dunif(0, 100)                                              #  standard deviation

​

    # Likelihood function
    for (i in 1:N){
        Y[i] ~ dnorm(mu[i],tau)
        mu[i] <- eta[i]
        eta[i] <- inprod(beta[], X[i,])
    }
}"

​

inits <- function () {
  list (
    beta = rnorm(K, 0, 0.01))
}

​

params <- c ("beta", "sigma")

 

normOfit <- jags(data = model.data,
                             inits = inits,
                             parameters = params,
                             model = textConnection(NORM),
                             n.chains = 3,
                             n.iter = 15000,
                             n.thin = 1,
                             n.burnin = 10000)

 

print (normOfit, intervals=c(0.025, 0.975), digits=2)

=================================================

Output on screen:

​

Inference for Bugs model at "3", fit using jags, 3 chains,

    each with 15000 iterations (first 10000 discarded)

    n.sims = 15000 iterations saved

​

                 mu.vect       sd.vect        2.5%         97.5%         Rhat              n.eff 

beta[1]           2.01           0.04         1.94           2.09                 1            15000

beta[2]           3.03           0.05         2.93           3.13                 1            15000

beta[3]          -2.55           0.05       -2.65          -2.45                 1            15000

sigma             1.01          0.01          0.99           1.03                 1            11000

deviance 14317.14         2.84  14313.60   14324.26                 1             12000

 

For each parameter, n.eff is a crude measure of effective sample size,

and Rhat is the potential scale reduction factor (at convergence, Rhat=1).

 

DIC info (using the rule, pD = var(deviance)/2)

pD = 4.0 and DIC = 14321.2

DIC is an estimate of expected predictive error (lower deviance is better).

bottom of page