## File Name: mcmc.list.descriptives.R
## File Version: 0.19

########################################################
# mcmclist descriptives
mcmc.list.descriptives <- function( mcmcobj, quantiles=c(.025,.05,.1,.50,.9,.95,.975) ){
     summary.mcmcobj <- summary(mcmcobj, quantile=quantiles)
    dat.bugs <- mcmcobj[[1]]
    vars <- colnames(dat.bugs)
    n.iter <- nrow(dat.bugs)
        discret <- round( seq( 1, n.iter, length=4 ) )
        MAP <- Rhat <- rep(0,length(vars) )
        for (ii in seq( 1, length(vars ))){
            vv <- vars[ii]
            dat.vv <- as.vector( dat.bugs[, vv ] )
            # extract 3 subchains
            l1 <- dat.vv[ discret[1]:discret[2] ]
            l2 <- dat.vv[ (discret[2]+1):discret[3] ]
            l3 <- dat.vv[ (discret[3]+1):discret[4] ]
            W <- ( var(l1) + var(l2) + var(l3) ) / 3
            S1 <- n.iter / 3
            est.chains <- c(mean(l1), mean(l2), mean(l3) )
            B <-  S1 / 2 * sum( ( est.chains - mean( est.chains ) )^2 )
            Rhat[ii] <- ( ( S1-1 ) / S1 * W + B / S1 ) / W
            # mode estimation
            m1 <- stats::density( dat.vv, from=min(dat.vv), to=max(dat.vv) )
            MAP[ii] <- m1$x[ which( m1$y==max( m1$y) ) ]
                            }
    res <- data.frame( "MAP"=MAP, "Rhat"=Rhat )
    rownames(res) <- vars
    smc3  <- res
    smc2 <- summary.mcmcobj$statistics
    colnames(summary.mcmcobj$quantiles) <- paste0( "Q", 100*quantiles )
    # calculate effective sample size
    effSize <- sirt_import_coda_effectiveSize( mcmcobj )
    statis <- summary.mcmcobj$statistics
    statis <- cbind( statis[, c(1,2) ], apply( as.matrix(mcmcobj), 2, stats::mad ),
                apply( as.matrix(mcmcobj), 2, skewness.sirt ),
                statis[,c(3,4) ]    )
    colnames(statis)[3:4] <- c("MAD", "skewness" )
    dfr <- data.frame( "parameter"=rownames(smc3),
        statis, smc3, "PercSERatio"=100*smc2[,4] / smc2[,2],
        "sampSize"=nrow(as.matrix(mcmcobj)), "effSize"=effSize,
        summary.mcmcobj$quantiles )
    return(dfr)
        }


#**********************************************
# function for calculation skewness
skewness.sirt <- function(x){
    n <- length(x)
    x <- x - mean(x)
    y <- sqrt(n) * sum(x^3)/(sum(x^2)^(3/2))
    y <- y * ((1 - 1/n))^(3/2)
    return(y)
    }

