# Shrinkage Slice (Slice)¶

Implementation of the shrinkage slice sampler of Neal  for simulating autocorrelated draws from a distribution that can be specified up to a constant of proportionality.

## Model-Based Constructor¶

`Slice`(params::ElementOrVector{Symbol}, width::ElementOrVector{T<:Real}, ::Type{F<:SliceForm}=Multivariate; transform::Bool=false)

Construct a `Sampler` object for Slice sampling. Parameters are assumed to be continuous, but may be constrained or unconstrained.

Arguments

• `params` : stochastic node(s) to be updated with the sampler.
• `width` : scaling value or vector of the same length as the combined elements of nodes `params`, defining initial widths of a hyperrectangle from which to simulate values.
• `F` : sampler type. Options are
• `Univariate` : sequential univariate sampling of parameters .
• `Multivariate` : joint multivariate sampling.
• `transform` : whether to sample parameters on the link-transformed scale (unconstrained parameter space). If `true`, then constrained parameters are mapped to unconstrained space according to transformations defined by the Stochastic `unlist()` function, and `width` is interpreted as being relative to the unconstrained parameter space. Otherwise, sampling is relative to the untransformed space.

Value

Returns a `Sampler{SliceTune{Univariate}}` or `Sampler{SliceTune{Multivariate}}` type object if sampling univariately or multivariately, respectively.

Example

See the Birats, Rats, and other Examples.

## Stand-Alone Functions¶

`sample!`(v::SliceUnivariate)
`sample!`(v::SliceMultivariate)

Draw one sample from a target distribution using the Slice univariate or multivariate sampler. Parameters are assumed to be continuous, but may be constrained or unconstrained.

Arguments

• `v` : current state of parameters to be simulated.

Value

Returns `v` updated with simulated values and associated tuning parameters.

Example

The following example samples parameters in a simple linear regression model. Details of the model specification and posterior distribution can be found in the Supplement. Also, see the Line: Block-Specific Sampling with AMWG and Slice example.

```################################################################################
## Linear Regression
##   y ~ N(b0 + b1 * x, s2)
##   b0, b1 ~ N(0, 1000)
##   s2 ~ invgamma(0.001, 0.001)
################################################################################

using Mamba

## Data
data = Dict(
:x => [1, 2, 3, 4, 5],
:y => [1, 3, 3, 3, 5]
)

## Log-transformed Posterior(b0, b1, log(s2)) + Constant
logf = function(x::DenseVector)
b0 = x
b1 = x
logs2 = x
r = data[:y] .- b0 .- b1 .* data[:x]
(-0.5 * length(data[:y]) - 0.001) * logs2 -
(0.5 * dot(r, r) + 0.001) / exp(logs2) -
0.5 * b0^2 / 1000 - 0.5 * b1^2 / 1000
end

## MCMC Simulation with Slice Sampling
## With multivariate (1) and univariate (2) updating
n = 5000
sim1 = Chains(n, 3, names = ["b0", "b1", "s2"])
sim2 = Chains(n, 3, names = ["b0", "b1", "s2"])
width = [1.0, 1.0, 2.0]
theta1 = SliceUnivariate([0.0, 0.0, 0.0], width, logf)
theta2 = SliceMultivariate([0.0, 0.0, 0.0], width, logf)
for i in 1:n
sample!(theta1)
sample!(theta2)
sim1[i, :, 1] = [theta1[1:2]; exp(theta1)]
sim2[i, :, 1] = [theta2[1:2]; exp(theta2)]
end
describe(sim1)
describe(sim2)
```

## Slice Variate Types¶

### Declaration¶

```const SliceUnivariate = SamplerVariate{SliceTune{Univariate}}
const SliceMultivariate = SamplerVariate{SliceTune{Multivariate}}
```

### Fields¶

• `value::Vector{Float64}` : simulated values.
• `tune::SliceTune{F<:SliceForm}` : tuning parameters for the sampling algorithm.

### Constructors¶

`SliceUnivariate`(x::AbstractVector{T<:Real}, width::ElementOrVector{U<:Real}, logf::Function)
`SliceMultivariate`(x::AbstractVector{T<:Real}, width::ElementOrVector{U<:Real}, logf::Function)

Construct an object that stores simulated values and tuning parameters for Slice sampling.

Arguments

• `x` : initial values.
• `width` : scaling value or vector of the same length as the combined elements of nodes `params`, defining initial widths of a hyperrectangle from which to simulate values.
• `logf` : function that takes a single `DenseVector` argument of parameter values at which to compute the log-transformed density (up to a normalizing constant).

Value

Returns an object of the same type as the constructor name for univariate or multivariate sampling, respectively, with fields set to the supplied `x` and tuning parameter values.

## SliceTune Type¶

### Declaration¶

```const SliceForm = Union{Univariate, Multivariate}
type SliceTune{F<:SliceForm} <: SamplerTune
```

### Fields¶

• `logf::Nullable{Function}` : function supplied to the constructor to compute the log-transformed density, or null if not supplied.
• `width::Union{Float64, Vector{Float64}}` : initial widths of hyperrectangles from which to simulate values.