2

Is it possible to set a seed in WinBUGS to reproduce parameter estimates like one can do with set.seed in R?

Mark Miller
  • 12,483
  • 23
  • 78
  • 132

1 Answers1

3

The code below suggests that you can reproduce estimates in WinBUGS through R by setting a seed immediately before each run of the WinBUGS model.

The first four model runs are immediately preceded by the same set.seed statement. The last two model runs are not. According to the all.equal statement the first four model runs return the identical estimates. The last two model runs do not.

####################################################################################
####################################################################################


library(R2WinBUGS)

n <- 15
x <- 1:15
y <- c(32.46, 38.38, 40.92, 22.27, 34.64, 33.53, 26.62, 25.26, 23.67, 20.54, 21.11, 17.00, 16.61, 19.32, 22.29)


print(summary(lm(y ~ x)))


####################################################################################
####################################################################################


set.seed(1234)


sink("linreg.txt")
cat("
model {

# Priors
 alpha ~ dnorm(0,0.001)
 beta  ~ dnorm(0,0.001)
 sigma ~ dunif(0,  100)
 tau <- 1/ (sigma * sigma)

# Likelihood
 for (i in 1:n) {
    y[i] ~ dnorm(mu[i], tau) 
    mu[i] <- alpha + beta*x[i]
 }

}
",fill=TRUE)
sink()


win.data <- list("x","y", "n")

inits <- function(){list(alpha=rnorm(1), beta=rnorm(1), sigma = rlnorm(1))}

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

nc =    2  
ni = 1000  
nb =  500
nt =    5

out1 <- bugs(data = win.data, inits = inits, parameters = params, 
            model = "linreg.txt", bugs.directory="c:/WinBUGS14/",
            n.thin = nt, n.chains = nc, n.burnin = nb, n.iter = ni)

print(out1, dig = 4)


####################################################################################
####################################################################################


set.seed(1234)


sink("linreg.txt")
cat("
model {

# Priors
 alpha ~ dnorm(0,0.001)
 beta  ~ dnorm(0,0.001)
 sigma ~ dunif(0,  100)
 tau <- 1/ (sigma * sigma)

# Likelihood
 for (i in 1:n) {
    y[i] ~ dnorm(mu[i], tau) 
    mu[i] <- alpha + beta*x[i]
 }

}
",fill=TRUE)
sink()


win.data <- list("x","y", "n")

inits <- function(){list(alpha=rnorm(1), beta=rnorm(1), sigma = rlnorm(1))}

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

nc =    2  
ni = 1000  
nb =  500
nt =    5

out2 <- bugs(data = win.data, inits = inits, parameters = params, 
            model = "linreg.txt", bugs.directory="c:/WinBUGS14/",
            n.thin = nt, n.chains = nc, n.burnin = nb, n.iter = ni)

print(out2, dig = 4)


####################################################################################
####################################################################################


set.seed(1234)


sink("linreg.txt")
cat("
model {

# Priors
 alpha ~ dnorm(0,0.001)
 beta  ~ dnorm(0,0.001)
 sigma ~ dunif(0,  100)
 tau <- 1/ (sigma * sigma)

# Likelihood
 for (i in 1:n) {
    y[i] ~ dnorm(mu[i], tau) 
    mu[i] <- alpha + beta*x[i]
 }

}
",fill=TRUE)
sink()


win.data <- list("x","y", "n")

inits <- function(){list(alpha=rnorm(1), beta=rnorm(1), sigma = rlnorm(1))}

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

nc =    2  
ni = 1000  
nb =  500
nt =    5

out3 <- bugs(data = win.data, inits = inits, parameters = params, 
            model = "linreg.txt", bugs.directory="c:/WinBUGS14/",
            n.thin = nt, n.chains = nc, n.burnin = nb, n.iter = ni)

print(out3, dig = 4)


####################################################################################
####################################################################################


set.seed(1234)


sink("linreg.txt")
cat("
model {

# Priors
 alpha ~ dnorm(0,0.001)
 beta  ~ dnorm(0,0.001)
 sigma ~ dunif(0,  100)
 tau <- 1/ (sigma * sigma)

# Likelihood
 for (i in 1:n) {
    y[i] ~ dnorm(mu[i], tau) 
    mu[i] <- alpha + beta*x[i]
 }

}
",fill=TRUE)
sink()


win.data <- list("x","y", "n")

inits <- function(){list(alpha=rnorm(1), beta=rnorm(1), sigma = rlnorm(1))}

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

nc =    2  
ni = 1000  
nb =  500
nt =    5

out4 <- bugs(data = win.data, inits = inits, parameters = params, 
            model = "linreg.txt", bugs.directory="c:/WinBUGS14/",
            n.thin = nt, n.chains = nc, n.burnin = nb, n.iter = ni)

print(out4, dig = 4)


####################################################################################
####################################################################################


sink("linreg.txt")
cat("
model {

# Priors
 alpha ~ dnorm(0,0.001)
 beta  ~ dnorm(0,0.001)
 sigma ~ dunif(0,  100)
 tau <- 1/ (sigma * sigma)

# Likelihood
 for (i in 1:n) {
    y[i] ~ dnorm(mu[i], tau) 
    mu[i] <- alpha + beta*x[i]
 }

}
",fill=TRUE)
sink()


win.data <- list("x","y", "n")

inits <- function(){list(alpha=rnorm(1), beta=rnorm(1), sigma = rlnorm(1))}

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

nc =    2  
ni = 1000  
nb =  500
nt =    5

out5 <- bugs(data = win.data, inits = inits, parameters = params, 
            model = "linreg.txt", bugs.directory="c:/WinBUGS14/",
            n.thin = nt, n.chains = nc, n.burnin = nb, n.iter = ni)

print(out5, dig = 4)


####################################################################################
####################################################################################


sink("linreg.txt")
cat("
model {

# Priors
 alpha ~ dnorm(0,0.001)
 beta  ~ dnorm(0,0.001)
 sigma ~ dunif(0,  100)
 tau <- 1/ (sigma * sigma)

# Likelihood
 for (i in 1:n) {
    y[i] ~ dnorm(mu[i], tau) 
    mu[i] <- alpha + beta*x[i]
 }

}
",fill=TRUE)
sink()


win.data <- list("x","y", "n")

inits <- function(){list(alpha=rnorm(1), beta=rnorm(1), sigma = rlnorm(1))}

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

nc =    2  
ni = 1000  
nb =  500
nt =    5

out6 <- bugs(data = win.data, inits = inits, parameters = params, 
            model = "linreg.txt", bugs.directory="c:/WinBUGS14/",
            n.thin = nt, n.chains = nc, n.burnin = nb, n.iter = ni)

print(out6, dig = 4)

####################################################################################
####################################################################################

all.equal(out1, out2)
all.equal(out1, out3)
all.equal(out1, out4)
all.equal(out1, out5)
all.equal(out1, out6)
Mark Miller
  • 12,483
  • 23
  • 78
  • 132