1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56
|
rm(list = ls()) library(MASS)
binaryprobitGibbs <- function(, y, A, betabar, mcmc.step, burnin){ nvar <- ncol(X) beta.chain <- matrix(nrow = mcmc.step, ncol = nvar) beta.chain[1,] <- rep(0, nvar) sigma <- rep(1, nrow(X)) covar <- chol2inv(chol(crossprod(X, X) + A)) Abetabar <- crossprod(A, betabar) max.number <- 100 a <- ifelse(y == 0,-max.number, 0) b <- ifelse(y == 0, 0, max.number) draw.z <- function(mu, sigma, a, b){ phi.a <- pnorm(a, mean = mu, sd = sigma) phi.b <- pnorm(b, mean = mu, sd = sigma) z <- mu + sigma*qnorm(runif(length(mu)) * (phi.b - phi.a) + phi.a) return(z) } draw.beta <- function(covar, , z, Abetabar){ beta.tilde <- covar %*% (crossprod(X, z) + Abetabar) return(mvrnorm(n = 1, beta.tilde, covar)) } for (i in 2:mcmc.step){ mu <- X %*% beta.chain[i - 1,] z <- draw.z(mu, sigma, a, b) beta.chain[i,] <- draw.beta(covar, X, z, Abetabar) } return(beta.chain[(burnin + 1):mcmc.step,]) }
library(magrittr) set.seed(123) n.sample <- 1000 X <- c(rep(1, n.sample), runif(n = 2 * n.sample, min = 0, max = 20)) %>% matrix(ncol = 3) beta.true <- c(4, 6, -5) z.true <- X %*% beta.true + rnorm(n.sample) y <- ifelse(z.true < 0, 0, 1) A <- .01 * diag(ncol(X)) betabar <- rep(0, ncol(X)) mcmc.step <- 2e5 burnin <- .25 * mcmc.step
beta.chain <- binaryprobitGibbs(X, y, A, betabar, mcmc.step, burnin) apply(beta.chain, 2, mean)
|
近期评论