##################################################################################################
## Use posterior predictive model checking to assess modelling assumptions.

## Simulate data sets based on posterior parameter samples.
R <- dim(eta_sc.thin)[3]
pred.logvol.sc <- matrix(NA, R, q)
pred.sc <- array(0, c(n, q, R))
pred.logvol.er <- rep(0, R)
pred.er <- array(0, c(n, p, R))
pred.x <- array(0, c(n, p, M, R))

MADs.SV <- vector("list", M)
ADs.SV <- matrix(NA, R, p*(p+1)/2)

m <- 1
true.cov.SV <- lowerTriangle(cov(Y[,,m]), diag=TRUE)
for(r in 1:R)
{
  pred.logvol.sc[r,] <- mvrnorm(1, nu_sc.thin[,r], diag(v2_sc.thin[,r]/(1 - phi_sc.thin[,r]*phi_sc.thin[,r])))
  pred.sc[,,r] <- mvrnorm(n, rep(0, q), diag(exp(pred.logvol.sc[r,])))
  pred.logvol.er[r] <- rnorm(1, nu.thin[r], sqrt(v2.thin[r]/(1 - phi.thin[r]*phi.thin[r])))
  pred.er[,,r] <- mvrnorm(n, rep(0, p), exp(pred.logvol.er[r])*diag(p)) 
  for(i in 1:n)
  {
    pred.x[i,,m,r] <- mvrnorm(1, matrix(rot.loadings.thin[,m,r], p, q)%*%pred.sc[i,,r], exp(pred.logvol.er[r])*diag(p)) 
  }
  ADs.SV[r,] <- abs(true.cov.SV - lowerTriangle(cov(pred.x[,,m,r]), diag=TRUE))
} #R
MADs.SV[[m]] <- apply(ADs.SV, 2, mean)


for(m in 2:M)
{
  true.cov.SV <- lowerTriangle(cov(Y[,,m]), diag=TRUE)
  for(r in 1:R)
  {
    pred.logvol.sc[r,] <- mvrnorm(1, nu_sc.thin[,r] + diag(phi_sc.thin[,r])%*%(eta_sc.thin[,m-1,r] - nu_sc.thin[,r]), diag(v2_sc.thin[,r]))
    pred.sc[,,r] <- mvrnorm(n, rep(0, q), diag(exp(pred.logvol.sc[r,])))
    pred.logvol.er[r] <- rnorm(1, nu.thin[r] + phi.thin[r]*(eta.thin[m-1,r] - nu.thin[r]), sqrt(v2.thin[r]))
    pred.er[,,r] <- mvrnorm(n, rep(0, p), exp(pred.logvol.er[r])*diag(p)) 
    for(i in 1:n)
    {
      pred.x[i,,m,r] <- mvrnorm(1, matrix(rot.loadings.thin[,m,r], p, q)%*%pred.sc[i,,r], exp(pred.logvol.er[r])*diag(p)) 
    }
    ADs.SV[r,] <- abs(true.cov.SV - lowerTriangle(cov(pred.x[,,m,r]), diag=TRUE))
  } #R
  MADs.SV[[m]] <- apply(ADs.SV, 2, mean)
} #m

mads <- c(MADs.SV[[1]], MADs.SV[[2]], MADs.SV[[3]],MADs.SV[[4]],MADs.SV[[5]],MADs.SV[[6]],MADs.SV[[7]],MADs.SV[[8]])
hist(mads, breaks=100, xlab="MADs", main="Histogram of MADs", col="blue")
