Make a STAN model. Specify priors.

require(rstan)
data(cars)

modelcode <- "
data {
int<lower=0> N;
vector[N] dist;
vector[N] speed;
}
parameters {
real intercept;
real slope;
real<lower=0> sigma;
}
model {
intercept ~ normal(0,30);
slope ~ normal(1,2);
sigma ~ exponential(0.3);
dist ~ normal(intercept+slope*speed, sigma);
}
"

aModel<-stan_model(model_code = modelcode)

Priors predictive check of the model. Make some predictions based on prior distributions only.

set.seed(2021)
nsim <- 200
simprior <- data.frame(
  intercept = rnorm(nsim,0,30),
  slope = rnorm(nsim,1,2),
  sigma = rexp(nsim,0.3),
  speed = rep(20, nsim)
)
simprior <- within(simprior, 
  dist<-rnorm(nsim, intercept+slope*speed, sigma)
)
head(simprior)
par(mfrow=c(1,3))
with(simprior, {
  hist(intercept, freq=F)
  curve(dnorm(x,0,30), col="gray", add=T)
  hist(slope, freq=F)
  curve(dnorm(x,1,2), col="gray", add=T)
  hist(sigma, freq=F)
  curve(dexp(x,0.3), col="gray", add=T)
}
)

options(mc.cores=4)
fit<-sampling(aModel,data=list(N=dim(cars)[1],speed=cars$speed,dist=cars$dist),iter=1000,chains=4)
print(fit)
Inference for Stan model: 24e22daa4d287a2e1cc029098e963c65.
4 chains, each with iter=1000; warmup=500; thin=1; 
post-warmup draws per chain=500, total post-warmup draws=2000.

             mean se_mean   sd    2.5%     25%     50%     75%   97.5% n_eff Rhat
intercept  -15.20    0.22 6.26  -27.20  -19.33  -15.51  -11.23   -2.58   840    1
slope        3.78    0.01 0.39    3.00    3.54    3.79    4.04    4.49   842    1
sigma       15.04    0.05 1.44   12.56   14.00   14.98   15.96   18.12  1016    1
lp__      -165.00    0.05 1.25 -167.95 -165.50 -164.72 -164.14 -163.66   764    1

Samples were drawn using NUTS(diag_e) at Fri Feb 14 14:19:19 2020.
For each parameter, n_eff is a crude measure of effective sample size,
and Rhat is the potential scale reduction factor on split chains (at 
convergence, Rhat=1).

Make posterior predictive check by drawing samples of model parameter values from fitted model. The actual steps of the STAN sampler (No U-Turn Sampler, NUTS) are used for sampling.

fit_ss <- extract(fit, pars=c('intercept','slope','sigma'), permuted=F)
isamp <- sample(1:dim(fit_ss)[1],nsim)
simpost <- data.frame(fit_ss[,1,][isamp,])
simpost$speed <- rep(20, nsim)
simpost <- within(simpost, 
  dist <- rnorm(nsim,intercept+slope*speed, sigma)
)
head(simpost)

Histograms of posterior distributions of model parameters versus priors (in gray).

#stan_plot(fit, ci_level=0.8, outer_level=0.95, show_density=T)
#stan_hist(fit, bins=30)
par(mfrow=c(1,3))
with(simpost, {
  hist(intercept, xlim=c(-100,100), freq=F)
  curve(dnorm(x,0,30), col="gray", add=T)
  hist(slope, xlim=c(-4,6), freq=F)
  curve(dnorm(x,1,2), col="gray", add=T)
  hist(sigma, xlim=c(0,20), freq=F)
  curve(dexp(x,0.3), col="gray", add=T)
  }
)

Are the estimated Intercept and Slope correlated?

cor(fit_ss[,1,1], fit_ss[,1,2])
[1] -0.9550463

Plot Intercept vs. Slope. Overlay the 95% ellipse from linear regression.

par(mfrow=c(1,2))
require(ellipse)
with(simpost, plot(x=intercept, y=slope))
lines(ellipse(lm(dist ~ speed, cars), n=50, level=0.95), col="gray")
fullsample<-extract(fit, pars=c('intercept','slope'))
inter_c<-cut(fullsample$intercept,50)
slope_c<-cut(fullsample$slope,50)
z<-table(inter_c,slope_c)
persp(x=z,col="lightgray",xlab="Intercept",ylab="Slope",zlab="Density")

LS0tDQp0aXRsZTogIkxpbmVhciByZWdyZXNzaW9uIHdpdGggU1RBTiINCm91dHB1dDogaHRtbF9ub3RlYm9vaw0KLS0tDQoNCk1ha2UgYSBTVEFOIG1vZGVsLiBTcGVjaWZ5IHByaW9ycy4NCg0KYGBge3IgbWVzc2FnZT1GQUxTRSwgd2FybmluZz1GQUxTRX0NCnJlcXVpcmUocnN0YW4pDQpkYXRhKGNhcnMpDQoNCm1vZGVsY29kZSA8LSAiDQpkYXRhIHsNCmludDxsb3dlcj0wPiBOOw0KdmVjdG9yW05dIGRpc3Q7DQp2ZWN0b3JbTl0gc3BlZWQ7DQp9DQpwYXJhbWV0ZXJzIHsNCnJlYWwgaW50ZXJjZXB0Ow0KcmVhbCBzbG9wZTsNCnJlYWw8bG93ZXI9MD4gc2lnbWE7DQp9DQptb2RlbCB7DQppbnRlcmNlcHQgfiBub3JtYWwoMCwzMCk7DQpzbG9wZSB+IG5vcm1hbCgxLDIpOw0Kc2lnbWEgfiBleHBvbmVudGlhbCgwLjMpOw0KZGlzdCB+IG5vcm1hbChpbnRlcmNlcHQrc2xvcGUqc3BlZWQsIHNpZ21hKTsNCn0NCiINCg0KYU1vZGVsPC1zdGFuX21vZGVsKG1vZGVsX2NvZGUgPSBtb2RlbGNvZGUpDQpgYGANCg0KUHJpb3JzIHByZWRpY3RpdmUgY2hlY2sgb2YgdGhlIG1vZGVsLiAgTWFrZSBzb21lIHByZWRpY3Rpb25zIGJhc2VkIG9uIHByaW9yIGRpc3RyaWJ1dGlvbnMgb25seS4NCg0KYGBge3J9DQpzZXQuc2VlZCgyMDIxKQ0KbnNpbSA8LSAyMDANCnNpbXByaW9yIDwtIGRhdGEuZnJhbWUoDQogIGludGVyY2VwdCA9IHJub3JtKG5zaW0sMCwzMCksDQogIHNsb3BlID0gcm5vcm0obnNpbSwxLDIpLA0KICBzaWdtYSA9IHJleHAobnNpbSwwLjMpLA0KICBzcGVlZCA9IHJlcCgyMCwgbnNpbSkNCikNCnNpbXByaW9yIDwtIHdpdGhpbihzaW1wcmlvciwgDQogIGRpc3Q8LXJub3JtKG5zaW0sIGludGVyY2VwdCtzbG9wZSpzcGVlZCwgc2lnbWEpDQopDQpoZWFkKHNpbXByaW9yKQ0KYGBgDQpgYGB7ciBmaWcuaGVpZ2h0PTQsIGZpZy53aWR0aD0xMH0NCnBhcihtZnJvdz1jKDEsMykpDQp3aXRoKHNpbXByaW9yLCB7DQogIGhpc3QoaW50ZXJjZXB0LCBmcmVxPUYpDQogIGN1cnZlKGRub3JtKHgsMCwzMCksIGNvbD0iZ3JheSIsIGFkZD1UKQ0KICBoaXN0KHNsb3BlLCBmcmVxPUYpDQogIGN1cnZlKGRub3JtKHgsMSwyKSwgY29sPSJncmF5IiwgYWRkPVQpDQogIGhpc3Qoc2lnbWEsIGZyZXE9RikNCiAgY3VydmUoZGV4cCh4LDAuMyksIGNvbD0iZ3JheSIsIGFkZD1UKQ0KfQ0KKQ0KYGBgDQoNCg0KYGBge3J9DQpvcHRpb25zKG1jLmNvcmVzPTQpDQpmaXQ8LXNhbXBsaW5nKGFNb2RlbCxkYXRhPWxpc3QoTj1kaW0oY2FycylbMV0sc3BlZWQ9Y2FycyRzcGVlZCxkaXN0PWNhcnMkZGlzdCksaXRlcj0xMDAwLGNoYWlucz00KQ0KcHJpbnQoZml0KQ0KDQpgYGANCg0KDQpNYWtlIHBvc3RlcmlvciBwcmVkaWN0aXZlIGNoZWNrIGJ5IGRyYXdpbmcgc2FtcGxlcyBvZiBtb2RlbCBwYXJhbWV0ZXIgdmFsdWVzIGZyb20gZml0dGVkIG1vZGVsLiBUaGUgYWN0dWFsIHN0ZXBzIG9mIHRoZSBTVEFOIHNhbXBsZXIgKE5vIFUtVHVybiBTYW1wbGVyLCBOVVRTKSBhcmUgdXNlZCBmb3Igc2FtcGxpbmcuDQoNCmBgYHtyfQ0KZml0X3NzIDwtIGV4dHJhY3QoZml0LCBwYXJzPWMoJ2ludGVyY2VwdCcsJ3Nsb3BlJywnc2lnbWEnKSwgcGVybXV0ZWQ9RikNCmlzYW1wIDwtIHNhbXBsZSgxOmRpbShmaXRfc3MpWzFdLG5zaW0pDQpzaW1wb3N0IDwtIGRhdGEuZnJhbWUoZml0X3NzWywxLF1baXNhbXAsXSkNCnNpbXBvc3Qkc3BlZWQgPC0gcmVwKDIwLCBuc2ltKQ0Kc2ltcG9zdCA8LSB3aXRoaW4oc2ltcG9zdCwgDQogIGRpc3QgPC0gcm5vcm0obnNpbSxpbnRlcmNlcHQrc2xvcGUqc3BlZWQsIHNpZ21hKQ0KKQ0KaGVhZChzaW1wb3N0KQ0KYGBgDQpIaXN0b2dyYW1zIG9mIHBvc3RlcmlvciBkaXN0cmlidXRpb25zIG9mIG1vZGVsIHBhcmFtZXRlcnMgdmVyc3VzIHByaW9ycyAoaW4gZ3JheSkuDQoNCmBgYHtyIGZpZy5oZWlnaHQ9NCwgZmlnLndpZHRoPTEwfQ0KI3N0YW5fcGxvdChmaXQsIGNpX2xldmVsPTAuOCwgb3V0ZXJfbGV2ZWw9MC45NSwgc2hvd19kZW5zaXR5PVQpDQojc3Rhbl9oaXN0KGZpdCwgYmlucz0zMCkNCnBhcihtZnJvdz1jKDEsMykpDQp3aXRoKHNpbXBvc3QsIHsNCiAgaGlzdChpbnRlcmNlcHQsIHhsaW09YygtMTAwLDEwMCksIGZyZXE9RikNCiAgY3VydmUoZG5vcm0oeCwwLDMwKSwgY29sPSJncmF5IiwgYWRkPVQpDQogIGhpc3Qoc2xvcGUsIHhsaW09YygtNCw2KSwgZnJlcT1GKQ0KICBjdXJ2ZShkbm9ybSh4LDEsMiksIGNvbD0iZ3JheSIsIGFkZD1UKQ0KICBoaXN0KHNpZ21hLCB4bGltPWMoMCwyMCksIGZyZXE9RikNCiAgY3VydmUoZGV4cCh4LDAuMyksIGNvbD0iZ3JheSIsIGFkZD1UKQ0KICB9DQopDQpgYGANCkFyZSB0aGUgZXN0aW1hdGVkIEludGVyY2VwdCBhbmQgU2xvcGUgY29ycmVsYXRlZD8NCmBgYHtyfQ0KY29yKGZpdF9zc1ssMSwxXSwgZml0X3NzWywxLDJdKQ0KYGBgDQoNCg0KUGxvdCBJbnRlcmNlcHQgdnMuIFNsb3BlLiBPdmVybGF5IHRoZSA5NSUgZWxsaXBzZSBmcm9tIGxpbmVhciByZWdyZXNzaW9uLg0KDQpgYGB7ciBmaWcuaGVpZ2h0PTQsIGZpZy53aWR0aD0xMCwgbWVzc2FnZT1GQUxTRSwgd2FybmluZz1GQUxTRX0NCnBhcihtZnJvdz1jKDEsMikpDQpyZXF1aXJlKGVsbGlwc2UpDQp3aXRoKHNpbXBvc3QsIHBsb3QoeD1pbnRlcmNlcHQsIHk9c2xvcGUpKQ0KbGluZXMoZWxsaXBzZShsbShkaXN0IH4gc3BlZWQsIGNhcnMpLCBuPTUwLCBsZXZlbD0wLjk1KSwgY29sPSJncmF5IikNCmZ1bGxzYW1wbGU8LWV4dHJhY3QoZml0LCBwYXJzPWMoJ2ludGVyY2VwdCcsJ3Nsb3BlJykpDQppbnRlcl9jPC1jdXQoZnVsbHNhbXBsZSRpbnRlcmNlcHQsNTApDQpzbG9wZV9jPC1jdXQoZnVsbHNhbXBsZSRzbG9wZSw1MCkNCno8LXRhYmxlKGludGVyX2Msc2xvcGVfYykNCnBlcnNwKHg9eixjb2w9ImxpZ2h0Z3JheSIseGxhYj0iSW50ZXJjZXB0Iix5bGFiPSJTbG9wZSIsemxhYj0iRGVuc2l0eSIpDQpgYGANCg0K