### Linear Regression using Gibbs
  Sampling
  ###
  ### The model: Y(i) = alpha + beta*(x(i)-x.bar)
  + epsilon(i)
  ### i = 1,...,n
  ### n = 5
  ### Y = [1,3,3,3,5]
  ### x = [1,2,3,4,5]
  ###
  ###################################################################################################
  # Assign the data and fit the standard
  regression model
  n <- 5
  n
  Y <- c(1,3,3,3,5)
  Y
  x <- c(1,2,3,4,5)
  x
  Y.bar <- mean(Y)
  Y.bar
  YmYbar <- Y-Y.bar
  YmYbar
  SSY <- sum(YmYbar^2)
  x.bar <- mean(x)
  x.bar
  xmxbar <- x-x.bar
  xmxbar
  SSx <- sum(xmxbar^2)
  SSx
  SSYx <- sum(YmYbar*xmxbar)
  SSYx
  par(mfrow=c(2,2))
  plot(x,Y)
  plot(xmxbar,Y)
  Y.reg <- lm(Y ~ xmxbar)
  Y.reg
  Y.fit <- Y.reg$fit
  plot(xmxbar,Y)
  lines(xmxbar,Y.fit)
  ###################################################################################################
  ### Bayesian Regression
  # plot priors on alpha, beta, and tau
  par(mfrow=c(2,2))
  mu.alpha <- 0
  sigma.alpha <- 10
  alpha <-
  seq(mu.alpha-3*sigma.alpha,mu.alpha+4*sigma.alpha,0.1)
  sigmasq.alpha <- sigma.alpha^2
  tau.alpha <- 1/sigmasq.alpha
  palpha <-
  dnorm(alpha,mu.alpha,sigma.alpha)
  plot(alpha,palpha,type="l",main="alpha")
  mu.beta <- 0
  sigma.beta <- 10
  beta <-
  seq(mu.beta-3*sigma.beta,mu.beta+4*sigma.beta,0.1)
  sigmasq.beta <- sigma.beta^2
  tau.beta <- 1/sigmasq.beta
  pbeta <- dnorm(beta,mu.beta,sigma.beta)
  plot(beta,pbeta,type="l",main="beta")
  a.tau <- 0.1
  b.tau <- 0.1
  mean.tau <- a.tau/b.tau
  sd.tau <- sqrt(a.tau/(b.tau^2))
  tau <-
  seq(0.01,mean.tau+3*sd.tau,0.01)
  ptau <- dgamma(tau,a.tau,b.tau)
  plot(tau,ptau,type="l",main="tau")
  ###################################################################################################
  ### Run Gibbs Sampler
  Burn <- 1000
  Reps <- 2000
  # storage vectors
  alpha.Gibbs <- numeric(Reps)
  beta.Gibbs <- numeric(Reps)
  tau.Gibbs <- numeric(Reps)
  # starting values for chains
  alpha.in <- 0
  beta.in <- 0
  tau.in <- 1
  alpha.Gibbs[1] <- alpha.in
  beta.Gibbs[1] <- beta.in
  tau.Gibbs[1] <- tau.in
  # the loop
  for(h in 2:Reps){
  
   
  
  # generate an alpha Gibbssample
  pm.alpha <- ((tau.Gibbs[(h-1)]*n)/(tau.Gibbs[(h-1)]*n+a.tau))*Y.bar
  +(a.tau/(tau.Gibbs[(h-1)]*SSx + a.tau))*mu.alpha
  # marginal posterior mean
  pp.alpha <- tau.Gibbs[(h-1)]*n + a.tau
  # marginal posterior precision
  alpha.Gibbs[h] <-
  rnorm(1,pm.alpha,sqrt(1/pp.alpha))
  
   
  
  # generate a beta Gibbs sample
  pm.beta <- ((tau.Gibbs[(h-1)]*SSx)/(tau.Gibbs[(h-1)]*SSx
  + b.tau))*(SSYx/SSx)
  +(b.tau/(tau.Gibbs[(h-1)]*SSx+b.tau))*mu.beta
  pp.beta <- tau.Gibbs[(h-1)]*SSx +
  b.tau
  beta.Gibbs[h] <-
  rnorm(1,pm.beta,sqrt(1/pp.beta))
  
   
  
  # generate a tau Gibbs sample
  pa.tau <- (n/2) + a.tau
  SSE <- sum((Y - (alpha.Gibbs[h] +
  beta.Gibbs[h]*xmxbar))^2)
  pb.tau <- (SSE/2) + b.tau
  tau.Gibbs[h] <-
  rgamma(1,pa.tau,pb.tau)
  }
  alpha.Gibbs[1:10]
  beta.Gibbs[1:10]
  tau.Gibbs[1:10]
  
   
  
  ###################################################################################################
  ### Posterior Analysis
  # Plot chains
  par(mfrow=c(4,1))
  tsplot(alpha.Gibbs,main="alpha")
  tsplot(beta.Gibbs,main="beta")
  tsplot(tau.Gibbs,main="tau")
  sigma.Gibbs <- 1/sqrt(tau.Gibbs)
  tsplot(sigma.Gibbs,main="sigma")
  
   
  
  # Posterior Estimates
  mean(alpha.Gibbs[(Burn+1):Reps])
  median(alpha.Gibbs[(Burn+1):Reps])
  sqrt(var(alpha.Gibbs[(Burn+1):Reps]))
  mean(beta.Gibbs[(Burn+1):Reps])
  median(beta.Gibbs[(Burn+1):Reps])
  sqrt(var(beta.Gibbs[(Burn+1):Reps]))
  mean(tau.Gibbs[(Burn+1):Reps])
  median(tau.Gibbs[(Burn+1):Reps])
  sqrt(var(tau.Gibbs[(Burn+1):Reps]))
  mean(sigma.Gibbs[(Burn+1):Reps])
  median(sigma.Gibbs[(Burn+1):Reps])
  sqrt(var(sigma.Gibbs[(Burn+1):Reps]))
  # Prior/Posterior Plots
  par(mfrow=c(2,2))
  # alpha
  y.density <- density(alpha.Gibbs[(Burn+1):Reps],
  width = 1)
  y.max <- max(y.density$y)
  plot(alpha,palpha,type="l",main="alpha",ylim=c(0,y.max))
  lines(y.density,type="h")
  # beta
  y.density <- density(beta.Gibbs[(Burn+1):Reps],
  width = 1)
  y.max <- max(y.density$y)
  plot(beta,pbeta,type="l",main="beta",ylim=c(0,y.max))
  lines(y.density,type="h")
  # tau
  y.density <- density(tau.Gibbs[(Burn+1):Reps],
  width = 1)
  y.max <- max(y.density$y)
  plot(tau,ptau,type="l",main="tau",ylim=c(0,y.max))
  lines(y.density,type="b")
  # sigma
  y.density <- density(sigma.Gibbs[(Burn+1):Reps],
  width = 1)
  y.max <- max(y.density$y)
  plot(y.density,type="b",
  main="sigma",ylim=c(0,y.max))
  # Fit the model, using posterior means
  alpha.est <- mean(alpha.Gibbs[(Burn+1):Reps])
  beta.est <- mean(beta.Gibbs[(Burn+1):Reps])
  Y.est <- alpha.est + beta.est*(x-x.bar)
  par(mfrow=c(1,1))
  plot(xmxbar,Y)
  lines(xmxbar,Y.est)