Diff of /inst/stan/hs.stan [000000] .. [ede2d4]

Switch to side-by-side view

--- a
+++ b/inst/stan/hs.stan
@@ -0,0 +1,104 @@
+//
+// Hierarchical shrinkage prior on regression coeffs (linear regression)
+//
+// This implements the regularized horseshoe prior according to the simple
+// parametrization presented in:
+//
+// Piironen, Vehtari (2017), Sparsity information and regularization in the
+// horseshoe and other shrinkage priors, Electronic Journal of Statistics
+
+functions {
+#include /chunks/hs.fun
+}
+
+data {
+
+  // number of columns in model matrix
+  int P;
+
+  // number of unpenalized columns in model matrix
+  int U;
+
+  // number of observations
+  int N;
+
+  // design matrix
+  matrix[N, P] X;
+
+  // continuous response variable
+  vector[N] y;
+
+  // prior standard deviation for the unpenalised variables
+  real<lower=0> scale_u;
+
+  // whether the regularized horseshoe should be used
+  int<lower=0, upper=1> regularized;
+
+  // degrees of freedom for the half-t priors on lambda
+  real<lower=1> nu;
+
+  // scale for the half-t prior on tau
+  real<lower=0> global_scale;
+
+  // degrees of freedom for the half-t prior on tau
+  real<lower=1> global_df;
+
+  // slab scale for the regularized horseshoe
+  real<lower=0> slab_scale;
+
+  // slab degrees of freedom for the regularized horseshoe
+  real<lower=0> slab_df;
+}
+
+parameters {
+
+  // unpenalized regression parameters
+  vector[U] beta_u;
+
+  // residual standard deviation
+  real <lower=0> sigma;
+
+  // global shrinkage parameter
+  real<lower=0> tau;
+
+  // local shrinkage parameter
+  vector<lower=0>[P-U] lambda;
+
+  // auxiliary variables
+  vector[P-U] z;
+  real<lower=0> c2;
+}
+
+transformed parameters {
+
+  // penalized regression parameters
+  vector[P-U] beta_p;
+
+  if (regularized)
+    beta_p = reg_hs(z, lambda, tau, slab_scale^2 * c2);
+  else
+    beta_p = hs(z, lambda, tau);
+}
+
+model {
+
+  // regression coefficients
+  vector[P] beta = append_row(beta_u, beta_p);
+
+  // half t-priors for lambdas and tau
+  z ~ std_normal();
+  lambda ~ student_t(nu, 0, 1);
+  tau ~ student_t(global_df, 0, global_scale * sigma);
+
+  // inverse-gamma prior for c^2
+  c2 ~ inv_gamma(0.5 * slab_df, 0.5 * slab_df);
+
+  // unpenalized coefficients including intercept
+  beta_u ~ normal(0, scale_u);
+
+  // noninformative gamma priors on scale parameter are not advised
+  sigma ~ inv_gamma(1, 1);
+
+  // likelihood
+  y ~ normal_id_glm(X, 0, beta, sigma);
+}