Modelo nomral multivairado bayesiano

# Datos: puntajes de comprensión de lectura antes y después de la instrucción
Y <- matrix(
  c(
    59, 43, 34, 32, 42, 38, 55, 67, 64, 45, 49, 72, 34, 70, 34, 50, 41, 52, 60, 34, 28, 35,
    77, 39, 46, 26, 38, 43, 68, 86, 77, 60, 50, 59, 38, 48, 55, 58, 54, 60, 75, 47, 48, 33
  ),
  nrow = 22, ncol = 2,
  dimnames = list(NULL, c("pre_test", "post_test"))
)

# Dimensiones
(n <- nrow(Y))
## [1] 22
(p <- ncol(Y))
## [1] 2
# Inspeccionar datos
summary(Y)
##     pre_test       post_test    
##  Min.   :28.00   Min.   :26.00  
##  1st Qu.:34.25   1st Qu.:43.75  
##  Median :44.00   Median :52.00  
##  Mean   :47.18   Mean   :53.86  
##  3rd Qu.:58.00   3rd Qu.:60.00  
##  Max.   :72.00   Max.   :86.00
df<-data.frame(y1=Y[,1],y2=Y[,2])
plot(Y[,1],Y[,2])

# Estadísticos suficientes
yb <- c(colMeans(Y))
round(yb, 1)
##  pre_test post_test 
##      47.2      53.9
SS <- cov(Y)
round(SS, 1) 
##           pre_test post_test
## pre_test     182.2     148.4
## post_test    148.4     243.6
# Previa
mu0 <- c(50,50)
L0  <- matrix(data = c(278,139,139,278), nrow = 2, ncol = 2)
nu0 <- 4
S0  <- matrix(data = c(278,139,139,278), nrow = 2, ncol = 2)
# Inicialización
# Solve ya que la previa conjugada es Wishart inversa
Sigma <- solve(rWishart::rWishart(n = 1, df = nu0, Sigma = S0)[,,1])

# Número de muestras
B <- 10000

# Almacenamiento
THETA <- NULL
SIGMA <- NULL
YS    <- NULL
LL    <- numeric(B)

# Cálculo de cantidades constantes previas l procedimiento iterativo
iL0 <- solve(L0)
Lm0 <- iL0 %*% mu0
nun <- nu0 + n
SSn <- S0 + (n - 1) * SS

# Muestreador de Gibbs
set.seed(1234)
for (b in 1:B) {
  # Actualización de theta
  iSigma <- solve(Sigma)
  Ln     <- solve(iL0 + n * iSigma)
  theta  <- c(mvtnorm::rmvnorm(n = 1, mean = Ln %*% (Lm0 + n * (iSigma %*% yb)), sigma = Ln))
  
  # Actualización de Sigma
  Sigma <- MCMCpack::riwish(v = nun, S = SSn + n * ((yb - theta) %*% t(yb - theta)))
  
  # Muestra de la predictiva posterior
  YS <- rbind(YS, mvtnorm::rmvnorm(n = 1, mean = theta, sigma = Sigma))
  
  # Cálculo de log-verosimilitud
  LL[b] <- sum(apply(X = Y, MARGIN = 1, FUN = function(y) mvtnorm::dmvnorm(y, mean = theta, sigma = Sigma, log = T)))
  
  # Almacenamiento de resultados
  THETA <- rbind(THETA, theta)
  SIGMA <- rbind(SIGMA, c(Sigma))
  
  # Mostrar progreso cada 10%
  if (b %% floor(B / 10) == 0) 
    cat(100 * round(b / B, 1), "% completado...\n", sep = "")
}
## 10% completado...
## 20% completado...
## 30% completado...
## 40% completado...
## 50% completado...
## 60% completado...
## 70% completado...
## 80% completado...
## 90% completado...
## 100% completado...
# Etiquetado de columnas para claridad
colnames(THETA) <- c("theta1", "theta2")
colnames(SIGMA) <- c("sigma1^2", "sigma21", "sigma12", "sigma2^2")

# Tamaño efectivo de la muestra
neff <- coda::effectiveSize(cbind(THETA, SIGMA))
round(neff)
##   theta1   theta2 sigma1^2  sigma21  sigma12 sigma2^2 
##    10000    10000     9059     9013     9013     8951
# Error estándar de Monte Carlo
EMC <- apply(X = cbind(THETA, SIGMA), MARGIN = 2, FUN = sd)/sqrt(neff)
round(EMC, 4)
##   theta1   theta2 sigma1^2  sigma21  sigma12 sigma2^2 
##   0.0284   0.0322   0.6120   0.6007   0.6007   0.8182
# Coeficiente de variación de Monte Carlo (%)
CVMC <- 100*EMC/abs(colMeans(cbind(THETA, SIGMA)))
round(CVMC, 4)
##   theta1   theta2 sigma1^2  sigma21  sigma12 sigma2^2 
##   0.0603   0.0601   0.3295   0.4076   0.4076   0.3340
plot(THETA[,1],main="theta 1",type="l")

plot(density(THETA[,1]),main="theta 1")

qqnorm(THETA[,1])

acf(THETA[,1])

plot(THETA[,2],main="theta 2",type="l")

plot(density(THETA[,2]),main="theta 2")

qqnorm(THETA[,2])

acf(THETA[,2])

plot(SIGMA[,1],main="sigma1^2",type="l")

plot(density(SIGMA[,1]),main="SIGMA$sigma1^2")

qqnorm(sqrt(SIGMA[,1])*sample(c(-1,1),10000,replace = TRUE))

acf(sqrt(SIGMA[,1])*sample(c(-1,1),10000,replace = TRUE))

colnames(SIGMA)
## [1] "sigma1^2" "sigma21"  "sigma12"  "sigma2^2"