R version 2.13.1 (2011-07-08) Copyright (C) 2011 The R Foundation for Statistical Computing ISBN 3-900051-07-0 Platform: x86_64-pc-linux-gnu (64-bit) R is free software and comes with ABSOLUTELY NO WARRANTY. You are welcome to redistribute it under certain conditions. Type 'license()' or 'licence()' for distribution details. R is a collaborative project with many contributors. Type 'contributors()' for more information and 'citation()' on how to cite R or R packages in publications. Type 'demo()' for some demos, 'help()' for on-line help, or 'help.start()' for an HTML browser interface to help. Type 'q()' to quit R. > > # test outfun (function) > > epsilon <- 1e-15 > > library(mcmc) > > RNGkind("Marsaglia-Multicarry") > set.seed(42) > > n <- 100 > rho <- 0.5 > beta0 <- 0.25 > beta1 <- 1 > beta2 <- 0.5 > > x1 <- rnorm(n) > x2 <- rho * x1 + sqrt(1 - rho^2) * rnorm(n) > eta <- beta0 + beta1 * x1 + beta2 * x2 > p <- 1 / (1 + exp(- eta)) > y <- as.numeric(runif(n) < p) > > out <- glm(y ~ x1 + x2, family = binomial()) > > logl <- function(beta) { + if (length(beta) != 3) stop("length(beta) != 3") + beta0 <- beta[1] + beta1 <- beta[2] + beta2 <- beta[3] + eta <- beta0 + beta1 * x1 + beta2 * x2 + p <- exp(eta) / (1 + exp(eta)) + return(sum(log(p[y == 1])) + sum(log(1 - p[y == 0]))) + } > > out.metro <- metrop(logl, coefficients(out), 1e3, scale = 0.01) > out.metro$accept [1] 0.982 > > out.metro <- metrop(out.metro, scale = 0.1) > out.metro$accept [1] 0.795 > > out.metro <- metrop(out.metro, scale = 0.5) > out.metro$accept [1] 0.264 > > apply(out.metro$batch, 2, mean) [1] 0.06080257 1.42304941 0.52634149 > > out.metro <- metrop(logl, as.numeric(coefficients(out)), 1e2, + scale = 0.5, debug = TRUE, outfun = function(x) c(x, x^2)) > > niter <- out.metro$nbatch * out.metro$blen * out.metro$nspac > niter == nrow(out.metro$current) [1] TRUE > niter == nrow(out.metro$proposal) [1] TRUE > all(out.metro$current[1, ] == out.metro$initial) [1] TRUE > all(out.metro$current[niter, ] == out.metro$final) | + all(out.metro$proposal[niter, ] == out.metro$final) [1] TRUE > > .Random.seed <- out.metro$initial.seed > d <- ncol(out.metro$proposal) > n <- nrow(out.metro$proposal) > my.proposal <- matrix(NA, n, d) > my.u <- double(n) > ska <- out.metro$scale > for (i in 1:n) { + my.proposal[i, ] <- out.metro$current[i, ] + ska * rnorm(d) + if (is.na(out.metro$u[i])) { + my.u[i] <- NA + } else { + my.u[i] <- runif(1) + } + } > max(abs(out.metro$proposal - my.proposal)) < epsilon [1] TRUE > all(is.na(out.metro$u) == is.na(my.u)) [1] TRUE > all(out.metro$u[!is.na(out.metro$u)] == my.u[!is.na(my.u)]) [1] TRUE > > my.curr.log.green <- apply(out.metro$current, 1, logl) > my.prop.log.green <- apply(out.metro$proposal, 1, logl) > all(is.na(out.metro$u) == (my.prop.log.green > my.curr.log.green)) [1] TRUE > foo <- my.prop.log.green - my.curr.log.green > max(abs(foo - out.metro$log.green)) < epsilon [1] TRUE > > my.accept <- is.na(my.u) | my.u < exp(foo) > sum(my.accept) == round(n * out.metro$accept) [1] TRUE > if (my.accept[niter]) { + all(out.metro$proposal[niter, ] == out.metro$final) + } else { + all(out.metro$current[niter, ] == out.metro$final) + } [1] TRUE > > my.current <- out.metro$current > my.current[my.accept, ] <- my.proposal[my.accept, ] > my.current <- rbind(out.metro$initial, my.current[- niter, ]) > max(abs(out.metro$current - my.current)) < epsilon [1] TRUE > > my.path <- matrix(NA, n, d) > my.path[my.accept, ] <- out.metro$proposal[my.accept, ] > my.path[! my.accept, ] <- out.metro$current[! my.accept, ] > nspac <- out.metro$nspac > > my.path <- my.path[seq(nspac, niter, by = nspac), ] > > fred <- t(apply(my.path, 1, out.metro$outfun)) > k <- ncol(fred) > > foom <- array(as.vector(t(fred)), c(k, out.metro$blen, out.metro$nbatch)) > boom <- t(apply(foom, c(1, 3), mean)) > > all(dim(boom) == dim(out.metro$batch)) [1] TRUE > max(abs(boom - out.metro$batch)) < epsilon [1] TRUE > > goom <- cbind(my.path, my.path^2) > all(dim(goom) == dim(out.metro$batch)) [1] TRUE > max(abs(goom - out.metro$batch)) < epsilon [1] TRUE >