Sometimes a model’s likelihood is not expressed directly as a distribution over observed data, but is instead computed by an external algorithm. A common example is state-space models , where a filtering algorithm (e.g. a Kalman filter or a particle filter) marginalises out the latent states and returns the marginal log-likelihood of the observations given the model parameters.
In this setting Turing only needs to sample the model parameters; the likelihood contribution is injected into the model with the @addlogprob! macro.
Minimal example
The function below stands in for an external filtering algorithm — for instance one provided by SSMProblems.jl or GeneralisedFilters.jl . Here we simply compute the log-likelihood of a Gaussian with unit variance, which is sufficient to demonstrate the integration pattern.
using Turing
# Mock filter — computes the Gaussian log-likelihood (constant terms
# omitted as they do not affect MCMC).
function run_external_filter (data, θ)
return - 0.5 * sum ((data .- θ) .^ 2 )
end
@model function external_likelihood_demo (data)
θ ~ Normal (0 , 1 )
@addlogprob ! run_external_filter (data, θ)
end
external_likelihood_demo (generic function with 2 methods)
We can now sample from this model in the usual way:
data = randn (100 )
model = external_likelihood_demo (data)
chain = sample (model, NUTS (), 100 )
Sampling 0%| | ETA: N/A
┌ Info: Found initial step size
└ ϵ = 0.2
Sampling 1%|▎ | ETA: 0:09:57
Sampling 1%|▌ | ETA: 0:05:53
Sampling 2%|▉ | ETA: 0:03:54
Sampling 3%|█▏ | ETA: 0:02:54
Sampling 3%|█▍ | ETA: 0:02:18
Sampling 4%|█▋ | ETA: 0:01:54
Sampling 5%|██ | ETA: 0:01:37
Sampling 5%|██▎ | ETA: 0:01:25
Sampling 6%|██▌ | ETA: 0:01:15
Sampling 7%|██▊ | ETA: 0:01:07
Sampling 7%|███▏ | ETA: 0:01:00
Sampling 8%|███▍ | ETA: 0:00:55
Sampling 9%|███▋ | ETA: 0:00:50
Sampling 9%|███▉ | ETA: 0:00:46
Sampling 10%|████▎ | ETA: 0:00:43
Sampling 11%|████▌ | ETA: 0:00:40
Sampling 11%|████▊ | ETA: 0:00:37
Sampling 12%|█████ | ETA: 0:00:35
Sampling 13%|█████▍ | ETA: 0:00:33
Sampling 13%|█████▋ | ETA: 0:00:31
Sampling 14%|█████▉ | ETA: 0:00:29
Sampling 15%|██████▏ | ETA: 0:00:28
Sampling 15%|██████▌ | ETA: 0:00:26
Sampling 16%|██████▊ | ETA: 0:00:25
Sampling 17%|███████ | ETA: 0:00:24
Sampling 17%|███████▎ | ETA: 0:00:23
Sampling 18%|███████▌ | ETA: 0:00:22
Sampling 19%|███████▉ | ETA: 0:00:21
Sampling 19%|████████▏ | ETA: 0:00:20
Sampling 20%|████████▍ | ETA: 0:00:19
Sampling 21%|████████▋ | ETA: 0:00:18
Sampling 21%|█████████ | ETA: 0:00:18
Sampling 22%|█████████▎ | ETA: 0:00:17
Sampling 23%|█████████▌ | ETA: 0:00:16
Sampling 23%|█████████▊ | ETA: 0:00:16
Sampling 24%|██████████▏ | ETA: 0:00:15
Sampling 25%|██████████▍ | ETA: 0:00:15
Sampling 25%|██████████▋ | ETA: 0:00:14
Sampling 26%|██████████▉ | ETA: 0:00:14
Sampling 27%|███████████▎ | ETA: 0:00:13
Sampling 27%|███████████▌ | ETA: 0:00:13
Sampling 28%|███████████▊ | ETA: 0:00:12
Sampling 29%|████████████ | ETA: 0:00:12
Sampling 29%|████████████▍ | ETA: 0:00:11
Sampling 30%|████████████▋ | ETA: 0:00:11
Sampling 31%|████████████▉ | ETA: 0:00:11
Sampling 31%|█████████████▏ | ETA: 0:00:10
Sampling 32%|█████████████▌ | ETA: 0:00:10
Sampling 33%|█████████████▊ | ETA: 0:00:10
Sampling 33%|██████████████ | ETA: 0:00:10
Sampling 34%|██████████████▎ | ETA: 0:00:09
Sampling 35%|██████████████▌ | ETA: 0:00:09
Sampling 35%|██████████████▉ | ETA: 0:00:09
Sampling 36%|███████████████▏ | ETA: 0:00:09
Sampling 37%|███████████████▍ | ETA: 0:00:08
Sampling 37%|███████████████▋ | ETA: 0:00:08
Sampling 38%|████████████████ | ETA: 0:00:08
Sampling 39%|████████████████▎ | ETA: 0:00:08
Sampling 39%|████████████████▌ | ETA: 0:00:08
Sampling 40%|████████████████▊ | ETA: 0:00:07
Sampling 41%|█████████████████▏ | ETA: 0:00:07
Sampling 41%|█████████████████▍ | ETA: 0:00:07
Sampling 42%|█████████████████▋ | ETA: 0:00:07
Sampling 43%|█████████████████▉ | ETA: 0:00:07
Sampling 43%|██████████████████▎ | ETA: 0:00:06
Sampling 44%|██████████████████▌ | ETA: 0:00:06
Sampling 45%|██████████████████▊ | ETA: 0:00:06
Sampling 45%|███████████████████ | ETA: 0:00:06
Sampling 46%|███████████████████▍ | ETA: 0:00:06
Sampling 47%|███████████████████▋ | ETA: 0:00:06
Sampling 47%|███████████████████▉ | ETA: 0:00:05
Sampling 48%|████████████████████▏ | ETA: 0:00:05
Sampling 49%|████████████████████▌ | ETA: 0:00:05
Sampling 49%|████████████████████▊ | ETA: 0:00:05
Sampling 50%|█████████████████████ | ETA: 0:00:05
Sampling 51%|█████████████████████▎ | ETA: 0:00:05
Sampling 51%|█████████████████████▌ | ETA: 0:00:05
Sampling 52%|█████████████████████▉ | ETA: 0:00:04
Sampling 53%|██████████████████████▏ | ETA: 0:00:04
Sampling 53%|██████████████████████▍ | ETA: 0:00:04
Sampling 54%|██████████████████████▋ | ETA: 0:00:04
Sampling 55%|███████████████████████ | ETA: 0:00:04
Sampling 55%|███████████████████████▎ | ETA: 0:00:04
Sampling 56%|███████████████████████▌ | ETA: 0:00:04
Sampling 57%|███████████████████████▊ | ETA: 0:00:04
Sampling 57%|████████████████████████▏ | ETA: 0:00:04
Sampling 58%|████████████████████████▍ | ETA: 0:00:04
Sampling 59%|████████████████████████▋ | ETA: 0:00:03
Sampling 59%|████████████████████████▉ | ETA: 0:00:03
Sampling 60%|█████████████████████████▎ | ETA: 0:00:03
Sampling 61%|█████████████████████████▌ | ETA: 0:00:03
Sampling 61%|█████████████████████████▊ | ETA: 0:00:03
Sampling 62%|██████████████████████████ | ETA: 0:00:03
Sampling 63%|██████████████████████████▍ | ETA: 0:00:03
Sampling 63%|██████████████████████████▋ | ETA: 0:00:03
Sampling 64%|██████████████████████████▉ | ETA: 0:00:03
Sampling 65%|███████████████████████████▏ | ETA: 0:00:03
Sampling 65%|███████████████████████████▌ | ETA: 0:00:03
Sampling 66%|███████████████████████████▊ | ETA: 0:00:03
Sampling 67%|████████████████████████████ | ETA: 0:00:02
Sampling 67%|████████████████████████████▎ | ETA: 0:00:02
Sampling 68%|████████████████████████████▌ | ETA: 0:00:02
Sampling 69%|████████████████████████████▉ | ETA: 0:00:02
Sampling 69%|█████████████████████████████▏ | ETA: 0:00:02
Sampling 70%|█████████████████████████████▍ | ETA: 0:00:02
Sampling 71%|█████████████████████████████▋ | ETA: 0:00:02
Sampling 71%|██████████████████████████████ | ETA: 0:00:02
Sampling 72%|██████████████████████████████▎ | ETA: 0:00:02
Sampling 73%|██████████████████████████████▌ | ETA: 0:00:02
Sampling 73%|██████████████████████████████▊ | ETA: 0:00:02
Sampling 74%|███████████████████████████████▏ | ETA: 0:00:02
Sampling 75%|███████████████████████████████▍ | ETA: 0:00:02
Sampling 75%|███████████████████████████████▋ | ETA: 0:00:02
Sampling 76%|███████████████████████████████▉ | ETA: 0:00:02
Sampling 77%|████████████████████████████████▎ | ETA: 0:00:01
Sampling 77%|████████████████████████████████▌ | ETA: 0:00:01
Sampling 78%|████████████████████████████████▊ | ETA: 0:00:01
Sampling 79%|█████████████████████████████████ | ETA: 0:00:01
Sampling 79%|█████████████████████████████████▍ | ETA: 0:00:01
Sampling 80%|█████████████████████████████████▋ | ETA: 0:00:01
Sampling 81%|█████████████████████████████████▉ | ETA: 0:00:01
Sampling 81%|██████████████████████████████████▏ | ETA: 0:00:01
Sampling 82%|██████████████████████████████████▌ | ETA: 0:00:01
Sampling 83%|██████████████████████████████████▊ | ETA: 0:00:01
Sampling 83%|███████████████████████████████████ | ETA: 0:00:01
Sampling 84%|███████████████████████████████████▎ | ETA: 0:00:01
Sampling 85%|███████████████████████████████████▌ | ETA: 0:00:01
Sampling 85%|███████████████████████████████████▉ | ETA: 0:00:01
Sampling 86%|████████████████████████████████████▏ | ETA: 0:00:01
Sampling 87%|████████████████████████████████████▍ | ETA: 0:00:01
Sampling 87%|████████████████████████████████████▋ | ETA: 0:00:01
Sampling 88%|█████████████████████████████████████ | ETA: 0:00:01
Sampling 89%|█████████████████████████████████████▎ | ETA: 0:00:01
Sampling 89%|█████████████████████████████████████▌ | ETA: 0:00:01
Sampling 90%|█████████████████████████████████████▊ | ETA: 0:00:01
Sampling 91%|██████████████████████████████████████▏ | ETA: 0:00:01
Sampling 91%|██████████████████████████████████████▍ | ETA: 0:00:00
Sampling 92%|██████████████████████████████████████▋ | ETA: 0:00:00
Sampling 93%|██████████████████████████████████████▉ | ETA: 0:00:00
Sampling 93%|███████████████████████████████████████▎ | ETA: 0:00:00
Sampling 94%|███████████████████████████████████████▌ | ETA: 0:00:00
Sampling 95%|███████████████████████████████████████▊ | ETA: 0:00:00
Sampling 95%|████████████████████████████████████████ | ETA: 0:00:00
Sampling 96%|████████████████████████████████████████▍ | ETA: 0:00:00
Sampling 97%|████████████████████████████████████████▋ | ETA: 0:00:00
Sampling 97%|████████████████████████████████████████▉ | ETA: 0:00:00
Sampling 98%|█████████████████████████████████████████▏| ETA: 0:00:00
Sampling 99%|█████████████████████████████████████████▌| ETA: 0:00:00
Sampling 99%|█████████████████████████████████████████▊| ETA: 0:00:00
Sampling 100%|██████████████████████████████████████████| Time: 0:00:04
Sampling 100%|██████████████████████████████████████████| Time: 0:00:08
Chains MCMC chain (100×15×1 Array{Float64, 3}):
Iterations = 51:1:150
Number of chains = 1
Samples per chain = 100
Wall duration = 6.07 seconds
Compute duration = 6.07 seconds
parameters = θ
internals = n_steps, is_accept, acceptance_rate, log_density, hamiltonian_energy, hamiltonian_energy_error, max_hamiltonian_energy_error, tree_depth, numerical_error, step_size, nom_step_size, logprior, loglikelihood, logjoint
Use `describe(chains)` for summary statistics and quantiles.
Because the mock filter computes a Gaussian log-likelihood with unit variance, the posterior for θ should concentrate around the sample mean of data.
When to use this pattern
Use @addlogprob! whenever the likelihood of your observations is computed by code that lives outside Turing’s ~ syntax. Typical cases include:
State-space filtering — packages such as SSMProblems.jl and GeneralisedFilters.jl evaluate the marginal likelihood via Kalman or particle filters.
Hidden Markov Models — the HMM tutorial shows the same pattern using HiddenMarkovModels.jl and logdensityof.
Any domain-specific likelihood — whenever you have a function that returns a log-probability, you can plug it in with @addlogprob!.
For more details on the macro itself, see Modifying the Log Probability .
Back to top