# Experiments similar to those of Castilo, Van der Vaart, 2012
# Generate data
n <- 500 # sample size
n_signal <- 25 # number of non-zero theta
A <- 5 # signal strength
theta <- c(rep(A,n_signal), rep(0,n-n_signal))
x <- theta + rnorm(n, sd=1)
# Choose slab
slab <- "Laplace"
Laplace_lambda <- 0.5
# Prior 1
kappa1 <- 0.4 # hyperparameter
logprior1 <- c(0,-kappa1*(1:n)*log(n*3/(1:n)))
res1 <- general_sequence_model(x, sigma=1,
slab=slab,
log_prior=logprior1,
Laplace_lambda=Laplace_lambda)
print("Prior 1: Elements with marginal posterior probability >= 0.5:")
print(which(res1$postprobs >= 0.5))
# Prior 2
kappa2 <- 0.8 # hyperparameter
logprior2 <- kappa2*lchoose(2*n-0:n,n)
res2 <- general_sequence_model(x, sigma=1,
slab=slab,
log_prior=logprior2,
Laplace_lambda=Laplace_lambda)
print("Prior 2: Elements with marginal posterior probability >= 0.5:")
print(which(res2$postprobs >= 0.5))
# Prior 3
beta_kappa <- 1 # hyperparameter
beta_lambda <- n+1 # hyperparameter
res3 <- general_sequence_model(x, sigma=1,
slab=slab,
log_prior="beta-binomial",
Laplace_lambda=Laplace_lambda)
print("Prior 3: Elements with marginal posterior probability >= 0.5:")
print(which(res3$postprobs >= 0.5))
# Plot means for all priors
M=max(abs(x))+1
plot(1:n, x, pch=20, ylim=c(-M,M), col='green', xlab="", ylab="", main="Posterior Means")
points(1:n, theta, pch=20, col='blue')
points(1:n, res1$postmean, pch=20, col='black', cex=0.6)
points(1:n, res2$postmean, pch=20, col='magenta', cex=0.6)
points(1:n, res3$postmean, pch=20, col='red', cex=0.6)
legend("topright", legend=c("posterior mean 1", "posterior mean 2", "posterior mean 3",
"data", "truth"),
col=c("black", "magenta", "red", "green", "blue"), pch=20, cex=0.7)
Run the code above in your browser using DataLab