Foundational knowledge for writing BUGS/JAGS models including precision parameterization, declarative syntax, distributions, and R integration. Use when creating or reviewing BUGS/JAGS models.
Scanned 9/7/2026
Install to Claude Code
npx -y skills add choxos/BiostatAgent --skill bugs-fundamentals --agent claude-codeInstalls into .claude/skills of the current project.
Are you the author of Bugs Fundamentals?
Add the live security badge to your README — it updates automatically with every re-scan.
[](https://www.skillsdirectory.com/skills/choxos-bugs-fundamentals)More formats (shields.io, HTML) on the badges page.
---
name: bugs-fundamentals
description: Foundational knowledge for writing BUGS/JAGS models including precision parameterization, declarative syntax, distributions, and R integration. Use when creating or reviewing BUGS/JAGS models.
---
# BUGS/JAGS Fundamentals
## When to Use This Skill
- Writing new WinBUGS or JAGS models
- Understanding BUGS declarative syntax
- Converting between BUGS and Stan
- Integrating with R via R2jags or R2WinBUGS
## Model Structure
BUGS uses a **single declarative block** where order doesn't matter:
```
model {
# Likelihood (order doesn't matter)
for (i in 1:N) {
y[i] ~ dnorm(mu[i], tau)
mu[i] <- alpha + beta * x[i]
}
# Priors
alpha ~ dnorm(0, 0.001)
beta ~ dnorm(0, 0.001)
tau ~ dgamma(0.001, 0.001)
# Derived quantities
sigma <- 1 / sqrt(tau)
}
```
## CRITICAL: Precision Parameterization
**BUGS uses PRECISION (tau = 1/variance), NOT standard deviation:**
| Distribution | BUGS Syntax | Meaning |
|-------------|-------------|---------|
| Normal | `dnorm(mu, tau)` | tau = 1/sigma² |
| MVN | `dmnorm(mu[], Omega[,])` | Omega = inverse(Sigma) |
### Converting SD ↔ Precision
```
# Precision from SD
tau <- pow(sigma, -2)
# SD from precision
sigma <- 1 / sqrt(tau)
```
## Distribution Reference
### Continuous (All use precision!)
```
y ~ dnorm(mu, tau) # Normal: tau = 1/sigma²
y ~ dlnorm(mu, tau) # Log-normal (log-scale)
y ~ dt(mu, tau, df) # Student-t
y ~ dunif(lower, upper) # Uniform
y ~ dgamma(shape, rate) # Gamma
y ~ dbeta(a, b) # Beta
y ~ dexp(lambda) # Exponential (rate)
y ~ dweib(shape, lambda) # Weibull
y ~ ddexp(mu, tau) # Double exponential
```
### Discrete
```
y ~ dbern(p) # Bernoulli
y ~ dbin(p, n) # Binomial (p first!)
y ~ dpois(lambda) # Poisson
y ~ dnegbin(p, r) # Negative binomial
y ~ dcat(p[]) # Categorical
y ~ dmulti(p[], n) # Multinomial
```
### Multivariate
```
y[1:K] ~ dmnorm(mu[], Omega[,]) # MVN (precision matrix!)
Omega[1:K,1:K] ~ dwish(R[,], df) # Wishart (for precision)
p[1:K] ~ ddirch(alpha[]) # Dirichlet
```
## Syntax Essentials
### Stochastic vs Deterministic
```
# Stochastic (random variable)
y ~ dnorm(mu, tau)
# Deterministic (function)
mu <- alpha + beta * x
```
### Loops
```
for (i in 1:N) {
y[i] ~ dnorm(mu[i], tau)
}
```
### Truncation (JAGS)
```
y ~ dnorm(mu, tau) T(lower, upper)
y ~ dnorm(mu, tau) T(0, ) # Lower only
```
### Logical Functions (JAGS)
```
ind <- step(y - threshold) # 1 if y >= threshold
eq <- equals(y, 0) # 1 if y == 0
```
## Common Priors
```
# Vague normal (variance = 1000)
alpha ~ dnorm(0, 0.001)
# Half-Cauchy on SD (via uniform)
sigma ~ dunif(0, 100)
tau <- pow(sigma, -2)
# Vague gamma on precision
tau ~ dgamma(0.001, 0.001)
# Correlation matrix
Omega ~ dwish(I[,], K + 1)
```
## R Integration
### R2jags (Recommended)
```r
library(R2jags)
jags.data <- list(N = 100, y = y, x = x)
jags.params <- c("alpha", "beta", "sigma")
jags.inits <- function() {
list(alpha = 0, beta = 0, tau = 1)
}
fit <- jags(
data = jags.data,
inits = jags.inits,
parameters.to.save = jags.params,
model.file = "model.txt",
n.chains = 4,
n.iter = 10000,
n.burnin = 5000
)
print(fit)
fit$BUGSoutput$summary
```
### R2WinBUGS (Windows)
```r
library(R2WinBUGS)
fit <- bugs(
data = bugs.data,
inits = bugs.inits,
parameters.to.save = bugs.params,
model.file = "model.txt",
n.chains = 3,
n.iter = 10000,
bugs.directory = "C:/WinBUGS14/"
)
```
## Key Differences from Stan
| Feature | BUGS/JAGS | Stan |
|---------|-----------|------|
| Normal | `dnorm(mu, tau)` precision | `normal(mu, sigma)` SD |
| MVN | `dmnorm(mu, Omega)` precision | `multi_normal(mu, Sigma)` cov |
| Syntax | Declarative (DAG) | Imperative (sequential) |
| Blocks | Single model{} | 7 optional blocks |
| Sampling | Gibbs + Metropolis | HMC/NUTS |
| Discrete | Direct sampling | Marginalization required |
## Common Errors
1. **Using SD instead of precision**: `dnorm(0, 1)` means variance=1, NOT SD=1
2. **Wrong binomial order**: `dbin(p, n)` not `dbin(n, p)`
3. **Missing initial values**: Provide inits for complex models
4. **Invalid parent values**: Check for NA/NaN in data
Is this your skill, or is something wrong with this listing? Request removal or report an issue. Author removals are honored within 72 hours.
No comments yet. Be the first to comment!