Neo-Normal Distributions Family for MCMC Models in JAGS

if (requireNamespace("neojags", quietly = TRUE)){
      neojags::load.neojagsmodule()
} 
#> module neojags loaded
if (requireNamespace("neojags", quietly = TRUE)){
      library(rjags)
} 
#> Loading required package: coda
#> Linked to JAGS 4.3.2
#> Loaded modules: basemod,bugs,neojags

Generate data

Create model for JAGS

mod <- "
model {
  # Likelihood
  for (i in 1:100) {
    x[i] ~ djskew.ep(2,1,0.8,1)
  }
}
"

Compile the model

modelv <- jags.model(textConnection(mod), n.chains=1, inits = list(".RNG.name" = "base::Wichmann-Hill",".RNG.seed" = 314159))
#> Compiling model graph
#>    Resolving undeclared variables
#>    Allocating nodes
#> Graph information:
#>    Observed stochastic nodes: 0
#>    Unobserved stochastic nodes: 100
#>    Total graph size: 103
#> 
#> Initializing model

Generate samples

samplesv <- coda.samples(modelv, variable.names = c("x"), n.iter = 1)
gen_datav <- (as.data.frame(as.matrix(samplesv)))
x <- as.numeric(gen_datav[1,])

Parameter Estimation

Create model for JAGS

model_string <- "
model {
  # Likelihood
  for (i in 1:100) {
    x[i] ~ djskew.ep(mu, tau,nu1, nu2)
  }
  
  # Prior distributions
  mu ~ dnorm(2,10000)
  tau ~ dgamma(10,10)
  nu1 ~ dgamma(10,10)
  nu2 ~ dgamma(10,10)
}
"

Compile the model

model <- jags.model(textConnection(model_string), data = list(x=c(x)),n.chains=2)
#> Compiling model graph
#>    Resolving undeclared variables
#>    Allocating nodes
#> Graph information:
#>    Observed stochastic nodes: 100
#>    Unobserved stochastic nodes: 4
#>    Total graph size: 107
#> 
#> Initializing model

Generate samples from the posterior distribution

samples<- coda.samples(model, variable.names = c("mu", "tau", "nu1", "nu2"), n.iter = 2000)

Summary Samples

summary(samples)
#> 
#> Iterations = 1001:3000
#> Thinning interval = 1 
#> Number of chains = 2 
#> Sample size per chain = 2000 
#> 
#> 1. Empirical mean and standard deviation for each variable,
#>    plus standard error of the mean:
#> 
#>       Mean       SD  Naive SE Time-series SE
#> mu  1.9984 0.009907 0.0001567      0.0002014
#> nu1 0.7473 0.064702 0.0010230      0.0023223
#> nu2 1.1734 0.160123 0.0025318      0.0051945
#> tau 0.9367 0.247345 0.0039109      0.0091491
#> 
#> 2. Quantiles for each variable:
#> 
#>       2.5%    25%    50%    75%  97.5%
#> mu  1.9790 1.9917 1.9983 2.0048 2.0182
#> nu1 0.6366 0.7010 0.7430 0.7875 0.8887
#> nu2 0.8997 1.0603 1.1567 1.2755 1.5201
#> tau 0.5284 0.7621 0.9063 1.0853 1.4941

Traceplot

traceplot(samples)

Probability Density Function (PDF), Cumulative Density Function (CDF), and Invers CDF (Quantile)

model_string1 <- "
model {
    d <- djskew.ep(0.5,2,2,2,2)
        p <- pjskew.ep(0.5,2,2,2,2)
        q <- qjskew.ep(0.5,2,2,2,2)
}
"

Compile the model

model1 <- jags.model(textConnection(model_string1),  n.chains=2)
#> Compiling model graph
#>    Resolving undeclared variables
#>    Allocating nodes
#> Graph information:
#>    Observed stochastic nodes: 0
#>    Unobserved stochastic nodes: 0
#>    Total graph size: 5
#> 
#> Initializing model

Generate samples from the posterior distribution

samples1<- coda.samples(model1, variable.names = c("d","p","q"), n.iter = 2)

Summary samples

summary(samples1)
#> 
#> Iterations = 1:2
#> Thinning interval = 1 
#> Number of chains = 2 
#> Sample size per chain = 2 
#> 
#> 1. Empirical mean and standard deviation for each variable,
#>    plus standard error of the mean:
#> 
#>       Mean SD Naive SE Time-series SE
#> d 0.008864  0        0              0
#> p 0.001350  0        0              0
#> q 2.000000  0        0              0
#> 
#> 2. Quantiles for each variable:
#> 
#>       2.5%      25%      50%      75%    97.5%
#> d 0.008864 0.008864 0.008864 0.008864 0.008864
#> p 0.001350 0.001350 0.001350 0.001350 0.001350
#> q 2.000000 2.000000 2.000000 2.000000 2.000000