Rev 5656 | Blame | Compare with Previous | Last modification | View Log | Download | RSS feed
"[.mcmc" <- function (x, i, j, drop = missing(i)){## In S-PLUS the code is altered so that the user can## pick out particular parameters by calling mcmc.obj[,c("param1", "param2")]xstart <- start(x)xthin <- thin(x)if (is.R()) {y <- NextMethod("[")}else {y <- as.matrix(x)[i,j]}if (length(y) == 0 || is.null(y))return(y)if (missing(i))return(mcmc(y, start = xstart, thin = xthin))elsereturn(y)}"as.mcmc" <- function (x, ...)UseMethod("as.mcmc")"as.mcmc.default" <- function (x, ...)if (is.mcmc(x)) x else mcmc(x)"as.ts.mcmc" <- function (x, ...){x <- as.mcmc(x)y <- ts(x, start = start(x), end = end(x), deltat = thin(x))attr(y, "mcpar") <- NULLreturn(y)}"start.mcmc" <- function (x, ...){mcpar(as.mcmc(x))[1]}"end.mcmc" <- function (x, ...){mcpar(as.mcmc(x))[2]}"frequency.mcmc" <- function (x, ...){1/thin.mcmc(x)}"thin.mcmc" <- function (x, ...){mcpar(as.mcmc(x))[3]}"is.mcmc" <- function (x){if (inherits(x, "mcmc"))if (length(dim(x)) == 3)stop("Obsolete mcmc object\nUpdate with a command like\nx <- mcmcUpgrade(x)")else TRUEelse FALSE}"mcmc" <- function (data = NA, start = 1, end = numeric(0), thin = 1){if (is.matrix(data)) {niter <- nrow(data)nvar <- ncol(data)}else if (is.data.frame(data)) {if (!all(sapply(data, is.numeric))) {stop ("Data frame contains non-numeric values")}data <- as.matrix(data)niter <- nrow(data)nvar <- ncol(data)}else {niter <- length(data)nvar <- 1}thin <- round(thin)if (length(start) > 1)stop("Invalid start")if (length(end) > 1)stop("Invalid end")if (length(thin) != 1)stop("Invalid thin")if (missing(end))end <- start + (niter - 1) * thinelse if (missing(start))start <- end - (niter - 1) * thinnobs <- floor((end - start)/thin + 1.0) ### patchif (niter < nobs)stop("Start, end and thin incompatible with data")else {end <- start + thin * (nobs - 1)if (nobs < niter)data <- data[1:nobs, , drop = FALSE]}attr(data, "mcpar") <- c(start, end, thin)attr(data, "class") <- "mcmc"data}"print.mcmc" <- function (x, ...){x.orig <- xcat("Markov Chain Monte Carlo (MCMC) output:\nStart =", start(x),"\nEnd =", end(x), "\nThinning interval =", thin(x), "\n")attr(x, "mcpar") <- NULLattr(x, "class") <- NULLNextMethod("print", ...)invisible(x.orig)}"as.matrix.mcmc" <- function (x, iters = FALSE, ...){y <- matrix(nrow = niter(x), ncol = nvar(x) + iters)var.cols <- iters + 1:nvar(x)if (iters)y[, 1] <- as.vector(time(x))y[, var.cols] <- xrownames <- character(ncol(y))if (iters)rownames[1] <- "ITER"rownames[var.cols] <- varnames(x, allow.null = FALSE)dimnames(y) <- list(NULL, rownames)return(y)}"time.mcmc" <- function (x, ...){x <- as.mcmc(x)ts(seq(from = start(x), to = end(x), by = thin(x)), start = start(x),end = end(x), deltat = thin(x))}"window.mcmc" <- function (x, start, end, thin, ...){ts.eps <- getOption("ts.eps")xmcpar <- mcpar(x)xstart <- xmcpar[1]xend <- xmcpar[2]xthin <- xmcpar[3]if (missing(thin))thin <- xthinelse if (thin%%xthin != 0) {thin <- xthinwarning("Thin value not changed")}xtime <- as.vector(time(x))if (missing(start))start <- xstartelse if (length(start) != 1)stop("bad value for start")else if (start < xstart) {start <- xstartwarning("start value not changed")}if (missing(end))end <- xendelse if (length(end) != 1)stop("bad value for end")else if (end > xend) {end <- xendwarning("end value not changed")}if (start > end)stop("start cannot be after end")if (all(abs(xtime - start) > abs(start) * ts.eps)) {start <- xtime[(xtime > start) & ((start + xthin) > xtime)]}if (all(abs(end - xtime) > abs(end) * ts.eps)) {end <- xtime[(xtime < end) & ((end - xthin) < xtime)]}use <- 1:niter(x)use <- use[use >= trunc((start - xstart)/xthin + 1.5) &use <= trunc((end - xstart)/xthin + 1.5) &(use - trunc((start- xstart)/xthin + 1.5))%%(thin%/%xthin) == 0]y <- if (is.matrix(x))x[use, , drop = FALSE]else x[use]return(mcmc(y, start=start, end=end, thin=thin))}"mcpar" <- function (x){attr(x, "mcpar")}"mcmcUpgrade" <- function (x){if (inherits(x, "mcmc")) {if (length(dim(x)) == 3) {nchain <- dim(x)[3]xtspar <- attr(x, "tspar")xstart <- xtspar[1]xend <- xtspar[2]xthin <- xtspar[3]out <- vector("list", nchain)for (i in 1:nchain) {y <- unclass(x)[, , 1, drop = TRUE]attr(y, "title") <- NULLattr(y, "tspar") <- NULLout[[i]] <- mcmc(y, start = xstart, end = xend,thin = xthin)}if (nchain == 1)return(out[[1]])else return(mcmc.list(out))}else return(x)}else stop("Can't upgrade")}"thin" <-function (x, ...)UseMethod("thin")"set.mfrow" <-function (Nchains = 1, Nparms = 1, nplots = 1, sepplot = FALSE){## Set up dimensions of graphics window:## If only density plots OR trace plots are requested, dimensions are:## 1 x 1 if Nparms = 1## 1 X 2 if Nparms = 2## 2 X 2 if Nparms = 3 or 4## 3 X 2 if Nparms = 5 or 6 or 10 - 12## 3 X 3 if Nparms = 7 - 9 or >= 13## If both density plots AND trace plots are requested, dimensions are:## 1 x 2 if Nparms = 1## 2 X 2 if Nparms = 2## 3 X 2 if Nparms = 3, 5, 6, 10, 11, or 12## 4 x 2 if Nparms otherwise## If separate plots are requested for each chain, dimensions are:## 1 x 2 if Nparms = 1 & Nchains = 2## 2 X 2 if Nparms = 2 & Nchains = 2 OR Nparms = 1 & Nchains = 3 or 4## 3 x 2 if Nparms = 3 or >= 5 & Nchains = 2## OR Nchains = 5 or 6 or 10 - 12 (and any Nparms)## 2 x 3 if Nparms = 2 or 4 & Nchains = 3## 4 x 2 if Nparms = 4 & Nchains = 2## OR Nchains = 4 & Nparms > 1## 3 x 3 if Nparms = 3 or >= 5 & Nchains = 3## OR Nchains = 7 - 9 or >= 13 (and any Nparms)mfrow <- if (sepplot && Nchains > 1 && nplots == 1) {## Separate plots per chain## Only one plot per variableif (Nchains == 2) {switch(min(Nparms, 5),c(1,2),c(2,2),c(3,2),c(4,2),c(3,2))}else if (Nchains == 3) {switch(min(Nparms, 5),c(2,2),c(2,3),c(3,3),c(2,3),c(3,3))}else if (Nchains == 4) {if (Nparms == 1)c(2,2)elsec(4,2)}else if (any(Nchains == c(5,6,10,11,12)))c(3,2)else if (any(Nchains == c(7,8,9)) || Nchains >=13)c(3,3)}else {if (nplots==1) {## One plot per variablemfrow <- switch(min(Nparms,13),c(1,1),c(1,2),c(2,2),c(2,2),c(3,2),c(3,2),c(3,3),c(3,3),c(3,3),c(3,2),c(3,2),c(3,2),c(3,3))}else {## Two plot per variable##mfrow <- switch(min(Nparms, 13),c(1,2),c(2,2),c(3,2),c(4,2),c(3,2),c(3,2),c(4,2),c(4,2),c(4,2),c(3,2),c(3,2),c(3,2),c(4,2))}}return(mfrow)}head.mcmc <- function(x, n = 6L, ...) {window.mcmc(x, end=min(start.mcmc(x) + n * thin.mcmc(x), end.mcmc(x)))}tail.mcmc <- function(x, n = 6L, ...) {window.mcmc(x, start=max(end.mcmc(x) - n * thin.mcmc(x), start.mcmc(x)))}