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