We will draw from the posterior of a normal mean using a log normal prior.
Sampling model:
\[ r \sim N(\mu,\sigma^2) \]
Prior:
\[ \log(\mu) \sim N(\lambda,w^2) \]
Set values for prior and \(\sigma\):
mbar = .01
lam = log(mbar)
w = 1.3
sigma = .04
rd = read.csv("http://www.rob-mcculloch.org/data/monthly_returns.csv")
n = length(rd[[1]])
rbar = mean(rd[[1]])
## discretize prior
# grid for mu values
mg = seq(from=.001,to=.05,length.out=100)
## prior
priv = dlnorm(mg,lam,w)
priv = priv/sum(priv)
Posterior on grid.
## likelihood and posterior
loglv = (-(mg-rbar)^2) * (n/(2*sigma^2))
logpost = log(priv) + loglv
logpost = logpost -max(logpost)
postDv = exp(logpost)
postDv = postDv/sum(postDv)
Plot prior and posterior:
## plot posterior and prior
rgy = range(c(priv,postDv))
plot(range(mg),rgy,type="n",xlab="mu",ylab="post and pri")
lines(mg,priv,col="red")
lines(mg,postDv,col="blue")
Make transition matrix.
ns = length(mg)
P = matrix(0.0,ns,ns) # will be markov transition matrix
Pi = postDv #posterior
for(j in 1:ns) {
temp = Pi/Pi[j]
junk = ifelse(temp<1,temp,1)
P[j,] = junk*(1/ns)
P[j,j] = 1-sum(P[j,][-j])
}
Draw by iterating \(P\).
#iid
ND = 10000
#MCMC by iterating with P
DrMCMC = rep(0,ND)
ii = 1
DrMCMC[1]=mg[ii]
for(i in 2:ND) {
ii = sample(1:ns,size=1,prob=P[ii,])
DrMCMC[i] = mg[ii]
}
IID draws:
DrIId = sample(mg,size=ND,replace=TRUE,prob=Pi)
Compare draws.
## compare iid with MCMC
qqplot(DrMCMC[100:ND],DrIId[100:ND])
abline(0,1,col="red",lwd=3)
## acf
par(mfrow=c(2,1))
acf(DrMCMC[100:ND])
acf(DrIId[100:ND])
## check eigen
temp = eigen(t(P))
plot(temp$values)
PPi = temp$vectors[,1]
PPi = PPi/sum(PPi)
plot(Pi,PPi)
abline(0,1,col="red")
Compute prior on grid.
getpri = function(mu,mg,priv) {
ii = which.min(abs(mu-mg))
return(priv[ii])
}
Iterate chain.
Drv = rep(0,ND)
Drv[1] = mg[1]
for(i in 2:ND) {
## proposal
mup = sample(mg,size=1) #uniform proposal
## accept prob
# log post at proposal
logpip = (-(mup-rbar)^2) * (n/(2*sigma^2)) + log(getpri(mup,mg,priv))
# log post at current (i-1)
logpic = (-(Drv[i-1]-rbar)^2) * (n/(2*sigma^2)) + log(getpri(Drv[i-1],mg,priv))
pacc = min(1,exp(logpip-logpic))
## draw accept
acc = rbinom(1,1,pacc)
if(acc) { # if accept
Drv[i] = mup
} else { # repeat
Drv[i] = Drv[i-1]
}
}
Compare draws.
## compare iid with MCMC
qqplot(Drv,DrIId)
abline(0,1,col="red",lwd=3)