Basic usage

Other than the logpdf_with_trans methods, the package also provides a more composable interface through the Bijector types. Consider for example the one from above with Beta(2, 2).

julia> using Random;

julia> using Bijectors;
       using Bijectors: Logit;

julia> dist = Beta(2, 2)
Beta{Float64}(α=2.0, β=2.0)

julia> x = rand(dist)

julia> b = bijector(dist) # bijection (0, 1) → ℝ
Logit{Float64}(0.0, 1.0)

julia> y = b(x)

In this case we see that bijector(d::Distribution) returns the corresponding constrained-to-unconstrained bijection for Beta, which indeed is a Logit with a = 0.0 and b = 1.0. The resulting Logit <: Bijector has a method (b::Logit)(x) defined, allowing us to call it just like any other function. Comparing with the above example, b(x) ≈ link(dist, x). Just to convince ourselves:

julia> b(x) ≈ link(dist, x)

Transforming distributions

We can create a transformed Distribution, i.e. a Distribution defined by sampling from a given Distribution and then transforming using a given transformation:

julia> dist = Beta(2, 2)      # support on (0, 1)Beta{Float64}(α=2.0, β=2.0)
julia> tdist = transformed(dist) # support on ℝUnivariateTransformed{Beta{Float64}, Bijectors.Logit{Float64, Float64}}( dist: Beta{Float64}(α=2.0, β=2.0) transform: Bijectors.Logit{Float64, Float64}(0.0, 1.0) )
julia> tdist isa UnivariateDistributiontrue

We can the then compute the logpdf for the resulting distribution:

julia> # Some example values
       x = rand(dist)0.19317572376512318
julia> y = tdist.transform(x)-1.4295056346662074
julia> logpdf(tdist, y)-1.9258493353931283