rm(list=ls())

seed <- 382992
set.seed(seed)

library(stats)
library(MCMCpack)
## Loading required package: coda
## Loading required package: MASS
## ##
## ## Markov Chain Monte Carlo Package (MCMCpack)
## ## Copyright (C) 2003-2017 Andrew D. Martin, Kevin M. Quinn, and Jong Hee Park
## ##
## ## Support provided by the U.S. National Science Foundation
## ## (Grants SES-0350646 and SES-0350613)
## ##
library(coda)

# MCMC Settings -----------------------------------------------------------
burn.in <- 5000
n.samples <- 10000
verbose <- 5000 # How often to report progress

# True parameters ---------------------------------------------------------
kappa.tr <- 0.5 # Shape
lambda.tr <- 1000 # Scale
b.tr <- 1/lambda.tr^kappa.tr # Alternative parametrization
eta.tr <- log(b.tr) # Model b on the log scale

# Priors ------------------------------------------------------------------
Q.val <- 1-0.999
cutoff.tr <- qweibull(1-Q.val, shape=kappa.tr, scale=lambda.tr) # Bigger than 99.9% of the survival times in the simulation truth
best.guess <- 10^ceiling(log10(cutoff.tr)) # Some estimate for the true cutoff value for the observations
bounds <- c(0.1*best.guess, 10*best.guess) # Say we can narrow it down to two orders of magnitude
T.1 <- bounds[1]
T.2 <- bounds[2]

hyper <- list() # Hyperparameters
hyper$alpha.kappa <- 0.1
hyper$beta.kappa <- 0.1

# Data --------------------------------------------------------------------
y.uncensored <- rweibull(30, shape=kappa.tr, scale=lambda.tr)
censor.threshold <- quantile(y.uncensored, prob=0.1)
v.vec <- y.uncensored <= censor.threshold # 1 if uncensored, 0 if censored
y.censored <- y.uncensored
y.censored[v.vec == 0] <- censor.threshold

# Likelihood --------------------------------------------------------------
fn.log.lik <- function(params, y.censored, v.vec) {
    eta <- params[1]
    kappa <- params[2]
    if(kappa < 0) return(-Inf)

    sum(v.vec*(eta + log(kappa) + (kappa-1)*log(y.censored)) - exp(eta)*y.censored^kappa)
}

# Posterior ---------------------------------------------------------------
fn.log.post <- function(params, y.censored, v.vec) { # Posterior dist'n, up to proportionality constant
    eta <- params[1]
    kappa <- params[2]
    if(kappa < 0) return(-Inf)

    # Setup values for eta's prior
    b.l <- -log(Q.val)/T.2^kappa
    b.u <- -log(Q.val)/T.1^kappa
    sigma.eta <- (log(b.u) - log(b.l))/6 # The 6 is from 3 SD's from the mean, so most likely values of b are covered
    mu.eta <- (log(b.u) + log(b.l))/2 # Just use the midpoint as the mean

    kappa.prior <- dgamma(kappa, hyper$alpha.kappa, hyper$beta.kappa, log=TRUE)
    eta.prior <- dnorm(eta, mu.eta, sigma.eta, log=TRUE)

    kappa.prior + eta.prior + fn.log.lik(params, y.censored, v.vec)
}

# MLEs --------------------------------------------------------------------
optim.result <- optim(par=c(.1, .1),
                      fn.log.lik,
                      gr=NULL,
                      y.censored=y.censored,
                      v.vec=v.vec,
                      control=list(fnscale=-1))
MLEs <- optim.result$par # Vector of eta.mle and kappa.mle
names(MLEs) <- c("eta", "kappa")

mle.b <- exp(MLEs["eta"])
mle.kappa <- MLEs["kappa"]
mle.lambda <- (1/mle.b)^(1/mle.kappa)
names(mle.b) <- c("b")
names(mle.kappa) <- c("kappa")
names(mle.lambda) <- c("lambda")

# MCMC --------------------------------------------------------------------
# Just use MCMC pack sampler because very lazy
mcmc.obj <- MCMCmetrop1R(fn.log.post,
                         theta.init=MLEs,
                         y.censored=y.censored,
                         v.vec=v.vec,
                         burnin=burn.in,
                         mcmc=n.samples,
                         verbose=verbose,
                         seed=seed)
## MCMCmetrop1R iteration 1 of 15000 
## function value =  -69.83547
## theta = 
##   -4.52054
##    1.73576
## Metropolis acceptance rate = 1.00000
## 
## MCMCmetrop1R iteration 5001 of 15000 
## function value =  -17.83255
## theta = 
##   -2.56815
##    0.37095
## Metropolis acceptance rate = 0.56869
## 
## MCMCmetrop1R iteration 10001 of 15000 
## function value =  -18.13473
## theta = 
##   -2.79442
##    0.37967
## Metropolis acceptance rate = 0.56564
## 
## 
## 
## @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
## The Metropolis acceptance rate was 0.56873
## @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
colnames(mcmc.obj) <- c("eta", "kappa")


# Analysis ----------------------------------------------------------------
b.samps <- exp(mcmc.obj[,"eta"])
kappa.samps <- mcmc.obj[,"kappa"]
lambda.samps <- (1/b.samps)^(1/kappa.samps)
n.cdfs <- 1000
post.preds <- matrix(rweibull(n.samples*n.cdfs, shape=kappa.samps, scale=lambda.samps),
                     nrow=n.samples, ncol=n.cdfs)
ecdfs <- apply(post.preds, 1, ecdf)

### Posterior predictive distribution
y.grid <- seq(qweibull(0.001, shape=kappa.tr, scale=lambda.tr),
              qweibull(0.999, shape=kappa.tr, scale=lambda.tr),
              length.out=500)
cdf.samps <- sapply(ecdfs, FUN=function(f) f(y.grid))
cdf.pointwise <- apply(cdf.samps, 1, quantile, prob=c(0.025, 0.5, 0.975))
cdf.lb <- cdf.pointwise[1,]
cdf.median <- cdf.pointwise[2,]
cdf.ub <- cdf.pointwise[3,]
plot(y.grid,
     pweibull(y.grid, shape=kappa.tr, scale=lambda.tr),
     col="green",
     type='l',
     xlab="y",
     ylab="F(y)",
     main="CDF")
lines(y.grid,
     pweibull(y.grid, shape=mle.kappa, scale=mle.lambda),
     col="red",
     type='l',
     xlab="y",
     ylab="F(y)")
lines(y.grid, cdf.median, col="blue")
lines(y.grid, cdf.lb, col="blue", lty=2)
lines(y.grid, cdf.ub, col="blue", lty=2)
legend("bottomright",
       legend=c("Truth", "Bayes", "MLE"),
       lty=1,
       col=c("green", "blue", "red"),
       cex=0.6)

### Threshold
y.grid2 <- seq(qweibull(0.001, shape=kappa.tr, scale=lambda.tr),
              T.2,
              length.out=1000)
plot(y.grid2,
     pweibull(y.grid2, shape=kappa.tr, scale=lambda.tr),
     col="green",
     type='l',
     xlab="y",
     ylab="F(y)",
     main="CDF")
abline(v=cutoff.tr)
abline(v=T.1, col="blue", lty=2)
abline(v=T.2, col="blue", lty=2)
legend("bottomright",
       legend=c("True cutoff", "Lower/Upper cutoff estimates"),
       col=c("black", "blue"),
       lty=c(1, 2),
       cex=0.6)

### Priors
## eta prior
b.l.prior <- -log(Q.val)/T.2^kappa.tr
b.u.prior <- -log(Q.val)/T.1^kappa.tr
sigma.eta.prior <- (log(b.u.prior) - log(b.l.prior))/6 # The 6 is from 3 SD's from the mean, so most likely values of b are covered
mu.eta.prior <- (log(b.u.prior) + log(b.l.prior))/2 # Just use the midpoint as the mean
curve(dnorm(x, mu.eta.prior, sigma.eta.prior),
      xlim=c(-6, -2),
      xlab=expression(eta),
      ylab=bquote("f(" ~ eta ~ ")"),
      sub="(True val in green)")
abline(v=eta.tr, col="green")

## kappa prior
curve(dgamma(x, hyper$alpha.kappa, hyper$beta.kappa),
      xlab=expression(kappa),
      ylab=bquote("f(" ~ kappa ~ ")"),
      main=bquote(kappa ~ " prior"),
      sub="(True val in green)")
abline(v=kappa.tr, col="green")

### kappa
hist(kappa.samps,
     xlab=expression(kappa),
     freq=FALSE,
     main=bquote("Posterior distribution of " ~ kappa),
     xlim=range(c(kappa.samps, MLEs["kappa"])))
abline(v=kappa.tr, col="green")
abline(v=mean(kappa.samps), col="blue")
abline(v=MLEs["kappa"], col="red")
legend("topright", legend=c("Truth", "Post mean", "MLE"), lty=1, col=c("green", "blue", "red"), cex=0.6)

### b
hist(b.samps, xlab="b", freq=FALSE, main="Posterior distribution of b")
abline(v=b.tr, col="green")
abline(v=mean(b.samps), col="blue")
abline(v=exp(MLEs["eta"]), col="red")
legend("topright", legend=c("Truth", "Posterior mean", "MLE"), lty=1, col=c("green", "blue", "red"), cex=0.6)

### Data
hist(y.uncensored)

hist(y.censored)

### MCMC Diagnostics
plot(mcmc.obj)