In this vignette, we show how to
use bayeslm
to sample coefficients for a Gaussian linear
regression with a number of different prior distributions.
set.seed(200)
p = 20
n = 100
kappa = 1.25
beta_true = c(c(1,2,3),rnorm(p-3,0,0.01))
sig_true = kappa*sqrt(sum(beta_true^2))
x = matrix(rnorm(p*n),n,p)
y = x %*% beta_true + sig_true * rnorm(n)
x = as.matrix(x)
y = as.matrix(y)
data = data.frame(x = x, y = y)
First, we run OLS and inspect the estimated coefficients
fitOLS = lm(y~x-1)
coef(fitOLS)
#> x1 x2 x3 x4 x5 x6
#> 1.14415549 1.99442217 2.38953931 -0.73055959 -0.71840494 0.25239729
#> x7 x8 x9 x10 x11 x12
#> 0.39044226 0.41366834 -0.39830816 0.04170669 -0.20976664 -0.24878570
#> x13 x14 x15 x16 x17 x18
#> 0.63260575 0.07410838 0.40714461 -0.18807163 0.79535530 0.32748131
#> x19 x20
#> 0.59214904 0.51461938
bayeslm
The bayeslm sampler can group coefficients into blocks and sample several coefficients at once. Below, we simply place every coefficient into its own block.
Now, we run bayeslm
on six different priors and store
their estimated coefficients
# Horseshoe prior
fit1 = bayeslm(y, x, prior = 'horseshoe', icept = FALSE,
block_vec = block_vec, N = 10000, burnin=2000)
beta_est1 = colMeans(fit1$beta)
# Laplace prior
fit2 = bayeslm(y, x, prior = 'laplace', icept = FALSE,
block_vec = block_vec, N = 10000, burnin=2000)
beta_est2 = colMeans(fit2$beta)
# Ridge prior
fit3 = bayeslm(y, x, prior = 'ridge', icept = FALSE,
block_vec = block_vec, N = 10000, burnin=2000)
beta_est3 = colMeans(fit3$beta)
# "Sharkfin" prior
fit4 = bayeslm(y, x, prior = 'sharkfin', icept = FALSE,
block_vec = block_vec, N = 10000, burnin=2000)
beta_est4 = colMeans(fit4$beta)
# "Non-local" prior
fit5 = bayeslm(y, x, prior = 'nonlocal', icept = FALSE,
block_vec = block_vec, N = 10000, burnin=2000)
beta_est5 = colMeans(fit5$beta)
# Inverse laplace prior
fit6 = bayeslm(y, x, prior = 'inverselaplace', lambda = 0.01, icept = FALSE,
block_vec = block_vec, N = 10000, burnin=2000)
beta_est6 = colMeans(fit6$beta)
And we plot the posterior distribution of the regression coefficients, along with the OLS estimates, against the true simulated coefficients.
plot(NULL,xlim=range(beta_true),ylim=range(beta_true),
xlab = "beta true", ylab = "estimation", )
points(beta_true,beta_est1,pch=20)
points(beta_true,fitOLS$coef,col='red')
points(beta_true,beta_est2,pch=20,col='cyan')
points(beta_true,beta_est3,pch=20,col='orange')
points(beta_true,beta_est4,pch=20,col='pink')
points(beta_true,beta_est5,pch=20,col='lightgreen')
points(beta_true,beta_est6,pch=20,col='grey')
legend("topleft", c("OLS", "horseshoe", "laplace", "ridge", "sharkfin",
"nonlocal", "inverselaplace"), col = c("red", "black", "cyan", "orange",
"pink", "lightgreen", "grey"), pch = rep(1, 7))
abline(0,1,col='red')
We can also compare the root mean squared error (RMSE) for each prior
rmseOLS = sqrt(sum((fitOLS$coef-beta_true)^2))
rmse1 = sqrt(sum((beta_est1-beta_true)^2))
rmse2 = sqrt(sum((beta_est2-beta_true)^2))
rmse3 = sqrt(sum((beta_est3-beta_true)^2))
rmse4 = sqrt(sum((beta_est4-beta_true)^2))
rmse5 = sqrt(sum((beta_est5-beta_true)^2))
rmse6 = sqrt(sum((beta_est6-beta_true)^2))
print(cbind(ols = rmseOLS, hs = rmse1,laplace = rmse2, ridge = rmse3,
sharkfin = rmse4,nonlocal = rmse5, inverselaplace = rmse6))
#> ols hs laplace ridge sharkfin nonlocal inverselaplace
#> [1,] 2.013695 1.060938 1.487104 1.943922 1.993882 2.288878 1.077349
Here, we demonstrate:
y ~ x
) in the
bayeslm
library# Put the first two coefficients in one elliptical sampling block
block_vec2 = c(2, rep(1, p-2))
fitb = bayeslm(y ~ x - 1, data = data, prior = 'horseshoe',
block_vec = block_vec2, N = 10000, burnin = 2000)
#> horseshoe prior
#> fixed running time 0.000455411
#> sampling time 0.257205
summary(fitb)
#> Average number of rejections before one acceptance :
#> 30.7482
#> Summary of beta draws
#> based on 8000 valid draws (number of burn in is 2000)
#> Summary of Posterior draws
#> Moments
#> mean std dev eff sample size
#> x1 0.594 0.54 888
#> x2 2.138 0.68 637 ***
#> x3 2.668 0.46 2262 ***
#> x4 -0.256 0.39 1635
#> x5 -0.264 0.37 1534
#> x6 0.032 0.25 6276
#> x7 0.163 0.33 2346
#> x8 0.145 0.34 3077
#> x9 -0.218 0.35 1663
#> x10 0.055 0.25 5132
#> x11 -0.073 0.25 4451
#> x12 -0.056 0.24 4441
#> x13 0.297 0.38 1291
#> x14 0.009 0.28 6648
#> x15 0.110 0.28 3048
#> x16 -0.033 0.26 6693
#> x17 0.383 0.46 1246
#> x18 0.085 0.26 3461
#> x19 0.260 0.38 1821
#> x20 0.157 0.31 2572
#> Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
#>
#> Summary of sigma draws
#> Mean of standard deviation is 4.561096
#> S.d. of standard deviation samples is 0.3567635
#> Effective sample size of s.d. is 3073.083