############################# # # # Probit Regression Example # # # ############################# # Original data found at: http://lib.stat.cmu.edu/aoas/107/data.txt # reading in cleaner version of data: educ.data <- read.table("http://www.stat.sc.edu/~hitchcock/educdata.txt", header=T) y <- educ.data$DEG x1 <- educ.data$CHILD x2 <- educ.data$PDEG x3 <- x1*x2 X<-cbind(x1,x2,x3) # Note we are not including an intercept term here ranks<-match(y,sort(unique(y))) ; uranks<-sort(unique(ranks)) n<-dim(X)[1] ; p<-dim(X)[2] library(mvtnorm) # load package to sample from multivariate normal distribution ###starting values beta<-rep(0,p) z<-qnorm(rank(y,ties.method="random")/(n+1)) g<-rep(NA,length(uranks)-1) K<-length(uranks) mu<-rep(0,K-1) ; sigma<-rep(100,K-1) S<-10000 BETA<-matrix(NA,S,p) ; Z<-matrix(NA,S,n) ; ac<-0; G <- matrix(NA,S,length(g)) for(s in 1:S) { #update g using its full conditional for(k in 1:(K-1)) { a<-max(z[y==k]) b<-min(z[y==k+1]) u<-runif(1, pnorm( (a-mu[k])/sigma[k] ), pnorm( (b-mu[k])/sigma[k] ) ) g[k]<- mu[k] + sigma[k]*qnorm(u) } #update beta using its full conditional mean.vec.beta <- (n/(n+1))*(solve(t(X)%*%X)) %*% ( t(X)%*%z ) cov.mat.beta <- (n/(n+1))*(solve(t(X)%*%X)) beta <- rmvnorm(1, mean=mean.vec.beta, sigma=cov.mat.beta) #update z using its full conditional ez<-X %*% t(beta) a<-c(-Inf,g)[ match( y-1, 0:K) ] b<-c(g,Inf)[y] u<-runif(n, pnorm(a-ez),pnorm(b-ez) ) z<- ez + qnorm(u) #help mixing the Markov Chain...including a Metropolis-Hastings step # c<-rnorm(1,0,n^(-1/3)) # zp<-z+c ; gp<-g+c # lhr<- sum(dnorm(zp,ez,1,log=T) - dnorm(z,ez,1,log=T) ) + # sum(dnorm(gp,mu,sigma,log=T) - dnorm(g,mu,sigma,log=T) ) # if(log(runif(1)) g.pm)