Mixture prior with Turing.jl

Viewed 140

I am trying to write a model with a mixture prior on one of the parameters. However I run into TypeError: in typeassert, expected Float64, got a value of type ForwardDiff.Dual{Nothing, Float64, 2}

In Stan it's possible to write this type of prior by incrementing the target with the logsumexp of each of the mixture densities. Is that the way to handle this in Turing.jl also?

A simplified version of my model and inference code:

using Random
using Turing

Random.seed!(42);

x = randn(2000);

@model function model(x)
    s ~ InverseGamma(2, 3)
    mean = [0, 0]
    sd = [0.0309, 0.3479]
    mix = [0.9736, 0.0264]
    k = 2
    m ~ MixtureModel(
        Normal,
        [(mean[j], sd[j]) for j = 1:k],
        mix
    )

    for i = 1:length(x)
        x[i] ~ Normal(m, sqrt(s))
    end
end;

m = model(x);
samples_nuts = sample(m, NUTS(200, 0.65), 10_000);

The start of the stack trace is

ERROR: TypeError: in typeassert, expected Float64, got a value of type ForwardDiff.Dual{Nothing, Float64, 2}
Stacktrace:
  [1] setindex!(A::Vector{Float64}, x::ForwardDiff.Dual{ForwardDiff.Tag{Turing.Core.var"#f#7"{DynamicPPL.TypedVarInfo{NamedTuple{(:s, :m), Tuple{DynamicPPL.Metadata{Dict{AbstractPPL.VarName{:s, Tuple{}}, Int64}, Vector{InverseGamma{Float64}}, Vector{AbstractPPL.VarName{:s, Tuple{}}}, Vector{Float64}, Vector{Set{DynamicPPL.Selector}}}, DynamicPPL.Metadata{Dict{AbstractPPL.VarName{:m, Tuple{}}, Int64}, Vector{MixtureModel{Univariate, Continuous, Normal, Float64}}, Vector{AbstractPPL.VarName{:m, Tuple{}}}, Vector{Float64}, Vector{Set{DynamicPPL.Selector}}}}}, Float64}, DynamicPPL.Model{var"#7#10", (:x,), (), (), Tuple{Vector{Float64}}, Tuple{}}, DynamicPPL.Sampler{NUTS{Turing.Core.ForwardDiffAD{40}, (), AdvancedHMC.DiagEuclideanMetric}}, DynamicPPL.DefaultContext}, Float64}, Float64, 2}, i1::Int64)
    @ Base ./array.jl:903
  [2] _mixlogpdf1(d::MixtureModel{Univariate, Continuous, Normal, Float64}, x::ForwardDiff.Dual{ForwardDiff.Tag{Turing.Core.var"#f#7"{DynamicPPL.TypedVarInfo{NamedTuple{(:s, :m), Tuple{DynamicPPL.Metadata{Dict{AbstractPPL.VarName{:s, Tuple{}}, Int64}, Vector{InverseGamma{Float64}}, Vector{AbstractPPL.VarName{:s, Tuple{}}}, Vector{Float64}, Vector{Set{DynamicPPL.Selector}}}, DynamicPPL.Metadata{Dict{AbstractPPL.VarName{:m, Tuple{}}, Int64}, Vector{MixtureModel{Univariate, Continuous, Normal, Float64}}, Vector{AbstractPPL.VarName{:m, Tuple{}}}, Vector{Float64}, Vector{Set{DynamicPPL.Selector}}}}}, Float64}, DynamicPPL.Model{var"#7#10", (:x,), (), (), Tuple{Vector{Float64}}, Tuple{}}, DynamicPPL.Sampler{NUTS{Turing.Core.ForwardDiffAD{40}, (), AdvancedHMC.DiagEuclideanMetric}}, DynamicPPL.DefaultContext}, Float64}, Float64, 2})
    @ Distributions ~/.julia/packages/Distributions/HjzA0/src/mixtures/mixturemodel.jl:358
  [3] logpdf_with_trans(d::MixtureModel{Univariate, Continuous, Normal, Float64}, x::ForwardDiff.Dual{ForwardDiff.Tag{Turing.Core.var"#f#7"{DynamicPPL.TypedVarInfo{NamedTuple{(:s, :m), Tuple{DynamicPPL.Metadata{Dict{AbstractPPL.VarName{:s, Tuple{}}, Int64}, Vector{InverseGamma{Float64}}, Vector{AbstractPPL.VarName{:s, Tuple{}}}, Vector{Float64}, Vector{Set{DynamicPPL.Selector}}}, DynamicPPL.Metadata{Dict{AbstractPPL.VarName{:m, Tuple{}}, Int64}, Vector{MixtureModel{Univariate, Continuous, Normal, Float64}}, Vector{AbstractPPL.VarName{:m, Tuple{}}}, Vector{Float64}, Vector{Set{DynamicPPL.Selector}}}}}, Float64}, DynamicPPL.Model{var"#7#10", (:x,), (), (), Tuple{Vector{Float64}}, Tuple{}}, DynamicPPL.Sampler{NUTS{Turing.Core.ForwardDiffAD{40}, (), AdvancedHMC.DiagEuclideanMetric}}, DynamicPPL.DefaultContext}, Float64}, Float64, 2}, transform::Bool)
    @ Bijectors ~/.julia/packages/Bijectors/3suua/src/Bijectors.jl:0
  [4] assume
    @ ~/.julia/packages/Turing/uAz5c/src/inference/hmc.jl:529 [inlined]
  [5] _tilde
    @ ~/.julia/packages/DynamicPPL/SgzCy/src/context_implementations.jl:62 [inlined]

pkg status

  [523fee87] CodecBzip2 v0.7.2
  [1624bea9] ConjugatePriors v0.4.0
  [b964fa9f] LaTeXStrings v1.3.0
  [91a5bcdd] Plots v1.25.5
  [df47a6cb] RData v0.8.3
  [f3b207a7] StatsPlots v0.14.30
  [fce5fe82] Turing v0.15.1
0 Answers
Related