################################################################################################## # # Simple linear regression with Student-t errors # # y(i) = alpha + beta*x(i) + sig*e(i) # # where e(1),...,e(n) are iid t(v) # # Prior distribution: # # alpha ~ N(0,Va) # beta ~ N(0,Vb) # # (sig,v) are fixed # ################################################################################################## # # Hedibert Freitas Lopes # Booth School of Business # University of Chicago # ################################################################################################## logpost = function(alpha,beta,sig2){ -0.5*(alpha-mua)^2/Va-0.5*(beta-mub)^2/Vb-(a+1)*log(sig2)-b/sig2- 0.5*(v+1)*sum(log(1+(y-alpha-beta*x)^2/(v*sig2)))-0.5*n*log(sig2) } logpostv = function(v){ n*lgamma((v+1)/2)-n*lgamma(v/2)-0.5*n*log(v)-0.5*(v+1)*sum(log(1+(y-alpha-beta*x)^2/(v*sig2))) } logpostv1 = function(v){ 0.5*log(v/(v+3))+0.5*log(trigamma(v/2)-trigamma((v+1)/2)-2*(v+3)/(v*(v+1)^2))+ n*lgamma((v+1)/2)-n*lgamma(v/2)-0.5*n*log(v)-0.5*(v+1)*sum(log(1+(y-alpha-beta*x)^2/(v*sig2))) } pdf(file="hw2-2013-solution.pdf",width=12,height=10) # Reading the data # ---------------- data = read.table("school-spending.txt",header=TRUE) y = data[,2] x = data[,3]/10000 n = length(y) # OLS estimation # -------------- par(mfrow=c(1,1)) plot(x,y,main="OLS fit") abline(lm(y~x),col=2,lwd=2) # Fixed parameters and prior hyperparameters # ------------------------------------------ v = 4.46 sig2 = 46.7^2 mua = -70 mub = 600 Va = 10000 Vb = 10000 a = 5 b = 15000 par(mfrow=c(1,3)) aaa = seq(mua-4*sqrt(Va),mua+4*sqrt(Va),length=1000) plot(aaa,dnorm(aaa,mua,sqrt(Va)),type="l",xlab="",ylab="Density",main="Prior for alpha") bbb = seq(mub-4*sqrt(Vb),mub+4*sqrt(Vb),length=1000) plot(bbb,dnorm(bbb,mub,sqrt(Vb)),type="l",xlab="",ylab="Density",main="Prior for beta") sss = seq(0,20000,length=1000) plot(sss,dgamma(1/sss,a,b)/sss^2,type="l",xlab="",ylab="Density",main="Prior for sig2") # a) MH random walk # Roughly 190 seconds to run on my Mac OS X version 10.5.8 # 2x3.2 GHz Quad-Core Intel Xeon 8 GB 800 MHz DDR2 FB-DIMM computer # ----------------------------------------------------------------- # Initial values alpha = mua beta = mub sig2 = b/(a-1) # MCMC setup sda = 5 sdb = 20 dof = 10 burnin = 1000 thin = 1000 M = 2000 niter = burnin+thin*M draws = matrix(0,niter,3) set.seed(164548) rw.time = system.time({ for (iter in 1:niter){ alpha1 = rnorm(1,alpha,sda) beta1 = rnorm(1,beta,sdb) sig21 = 1/rgamma(1,dof,(dof-1)*sig2) logratio = min(0,logpost(alpha1,beta1,sig21)-logpost(alpha,beta,sig2)+ dgamma(1/sig2,dof,(dof-1)*sig21,log=TRUE)-2*log(sig2)-dgamma(1/sig21,dof,(dof-1)*sig2,log=TRUE)+2*log(sig21)) if (log(runif(1))