【问题标题】:TypeError when sampling AR(2) process using Turing.jl使用 Turing.jl 对 AR(2) 进程进行采样时出现 TypeError
【发布时间】:2021-05-27 21:38:05
【问题描述】:

我正在尝试创建一个简单的 AR(2) 流程 Y 其中:

Y[t] = ϵ[t] + b1 * y[t - 1] + b2 * y[t - 2]
ϵ[t] ~ Normal(0, σ)

和b1 和b2 是从一些先验分布中提取的参数。

代码如下:

using Statistics
using Turing, Distributions

# This is supposed to be AR(2) model
# Y[t] = ε[t] + b1 * Y[t-1] + b2 * Y[t-2]
@model function AR2(y, b1_mean, b2_mean, ::Type{T}=Float64; σ=.3, σ_b=.01) where T <: Real
    N = length(y)
    
    b1 ~ Normal(b1_mean, σ_b)
    b2 ~ Normal(b2_mean, σ_b)
    ϵ = Vector{T}(undef, N)
    
    y[1] ~ Normal(0, σ)
    y[2] ~ Normal(0, σ)
    
    for k ∈ 3:N
        ϵ[k] ~ Normal(0, σ)
        # Maybe I shouldn't be assigning here?
        y[k] = ϵ[k] + b1 * y[k - 1] + b2 * y[k - 2] # this is LINE 19
    end
    
    y
end

# These are the parameters
b1, b2 = .3, .6

println("Constructing random process with KNOWN parameters: b1=$b1, b2=$b2")
AR2_process = AR2(fill(missing, 500), b1, b2)()
AR2_process_orig = copy(AR2_process)

@show typeof(AR2_process)

println("Estimating parameters...")
model_ar = AR2(AR2_process, b1, b2)
chain_ar = sample(model_ar, HMC(0.001, 10), 200)

@show mean(chain_ar[:b1]), mean(chain_ar[:b2])
@show all(AR2_process .≈ AR2_process_orig)

println("Now try to estimate Float64")
model_ar = AR2(Float64.(AR2_process), b1, b2)
chain_ar = sample(model_ar, HMC(0.001, 10), 200)

@show mean(chain_ar[:b1]), mean(chain_ar[:b2])

输出是这样的:

Constructing random process with KNOWN parameters: b1=0.3, b2=0.6
typeof(AR2_process) = Vector{Union{Missing, Float64}}
Estimating parameters...
Sampling 100%|█████████████████| Time: 0:00:47
(mean(chain_ar[:b1]), mean(chain_ar[:b2])) = (0.29404359023752596, 0.5912394358365198)
all(AR2_process .≈ AR2_process_orig) = true
Now try to estimate Float64
Sampling 100%|█████████████████| Time: 0:00:02
ERROR: LoadError: TypeError: in typeassert, expected Float64, got a value of type ForwardDiff.Dual{Nothing, Float64, 10}
Stacktrace:
  [1] setindex!(A::Vector{Float64}, x::ForwardDiff.Dual{ForwardDiff.Tag{Turing.Core.var"#f#1"{DynamicPPL.TypedVarInfo{NamedTuple{(:b1, :b2, :ϵ), Tuple{DynamicPPL.Metadata{Dict{AbstractPPL.VarName{:b1, Tuple{}}, Int64}, Vector{Normal{Float64}}, Vector{AbstractPPL.VarName{:b1, Tuple{}}}, Vector{Float64}, Vector{Set{DynamicPPL.Selector}}}, DynamicPPL.Metadata{Dict{AbstractPPL.VarName{:b2, Tuple{}}, Int64}, Vector{Normal{Float64}}, Vector{AbstractPPL.VarName{:b2, Tuple{}}}, Vector{Float64}, Vector{Set{DynamicPPL.Selector}}}, DynamicPPL.Metadata{Dict{AbstractPPL.VarName{:ϵ, Tuple{Tuple{Int64}}}, Int64}, Vector{Normal{Float64}}, Vector{AbstractPPL.VarName{:ϵ, Tuple{Tuple{Int64}}}}, Vector{Float64}, Vector{Set{DynamicPPL.Selector}}}}}, Float64}, DynamicPPL.Model{var"#2#3", (:y, :b1_mean, :b2_mean, :T, :σ, :σ_b), (:T, :σ, :σ_b), (), Tuple{Vector{Float64}, Float64, Float64, Type{Float64}, Float64, Float64}, Tuple{Type{Float64}, Float64, Float64}}, DynamicPPL.Sampler{HMC{Turing.Core.ForwardDiffAD{40}, (), AdvancedHMC.UnitEuclideanMetric}}, DynamicPPL.DefaultContext}, Float64}, Float64, 10}, i1::Int64)
    @ Base ./array.jl:839
  [2] #2
    @ ~/test/turing_question.jl:19 [inlined]
  [3] (::var"#2#3")(__rng__::Random._GLOBAL_RNG, __model__::DynamicPPL.Model{var"#2#3", (:y, :b1_mean, :b2_mean, :T, :σ, :σ_b), (:T, :σ, :σ_b), (), Tuple{Vector{Float64}, Float64, Float64, Type{Float64}, Float64, Float64}, Tuple{Type{Float64}, Float64, Float64}}, __varinfo__::DynamicPPL.TypedVarInfo{NamedTuple{(:b1, :b2, :ϵ), Tuple{DynamicPPL.Metadata{Dict{AbstractPPL.VarName{:b1, Tuple{}}, Int64}, Vector{Normal{Float64}}, Vector{AbstractPPL.VarName{:b1, Tuple{}}}, Vector{ForwardDiff.Dual{ForwardDiff.Tag{Turing.Core.var"#f#1"{DynamicPPL.TypedVarInfo{NamedTuple{(:b1, :b2, :ϵ), Tuple{DynamicPPL.Metadata{Dict{AbstractPPL.VarName{:b1, Tuple{}}, Int64}, Vector{Normal{Float64}}, Vector{AbstractPPL.VarName{:b1, Tuple{}}}, Vector{Float64}, Vector{Set{DynamicPPL.Selector}}}, DynamicPPL.Metadata{Dict{AbstractPPL.VarName{:b2, Tuple{}}, Int64}, Vector{Normal{Float64}}, Vector{AbstractPPL.VarName{:b2, Tuple{}}}, Vector{Float64}, Vector{Set{DynamicPPL.Selector}}}, DynamicPPL.Metadata{Dict{AbstractPPL.VarName{:ϵ, Tuple{Tuple{Int64}}}, Int64}, Vector{Normal{Float64}}, Vector{AbstractPPL.VarName{:ϵ, Tuple{Tuple{Int64}}}}, Vector{Float64}, Vector{Set{DynamicPPL.Selector}}}}}, Float64}, DynamicPPL.Model{var"#2#3", (:y, :b1_mean, :b2_mean, :T, :σ, :σ_b), (:T, :σ, :σ_b), (), Tuple{Vector{Float64}, Float64, Float64, Type{Float64}, Float64, Float64}, Tuple{Type{Float64}, Float64, Float64}}, DynamicPPL.Sampler{HMC{Turing.Core.ForwardDiffAD{40}, (), AdvancedHMC.UnitEuclideanMetric}}, DynamicPPL.DefaultContext}, Float64}, Float64, 10}}, Vector{Set{DynamicPPL.Selector}}}, DynamicPPL.Metadata{Dict{AbstractPPL.VarName{:b2, Tuple{}}, Int64}, Vector{Normal{Float64}}, Vector{AbstractPPL.VarName{:b2, Tuple{}}}, Vector{ForwardDiff.Dual{ForwardDiff.Tag{Turing.Core.var"#f#1"{DynamicPPL.TypedVarInfo{NamedTuple{(:b1, :b2, :ϵ), Tuple{DynamicPPL.Metadata{Dict{AbstractPPL.VarName{:b1, Tuple{}}, Int64}, Vector{Normal{Float64}}, Vector{AbstractPPL.VarName{:b1, Tuple{}}}, Vector{Float64}, Vector{Set{DynamicPPL.Selector}}}, DynamicPPL.Metadata{Dict{AbstractPPL.VarName{:b2, Tuple{}}, Int64}, Vector{Normal{Float64}}, Vector{AbstractPPL.VarName{:b2, Tuple{}}}, Vector{Float64}, Vector{Set{DynamicPPL.Selector}}}, DynamicPPL.Metadata{Dict{AbstractPPL.VarName{:ϵ, Tuple{Tuple{Int64}}}, Int64}, Vector{Normal{Float64}}, Vector{AbstractPPL.VarName{:ϵ, Tuple{Tuple{Int64}}}}, Vector{Float64}, Vector{Set{DynamicPPL.Selector}}}}}, Float64}, DynamicPPL.Model{var"#2#3", (:y, :b1_mean, :b2_mean, :T, :σ, :σ_b), (:T, :σ, :σ_b), (), Tuple{Vector{Float64}, Float64, Float64, Type{Float64}, Float64, Float64}, Tuple{Type{Float64}, Float64, Float64}}, DynamicPPL.Sampler{HMC{Turing.Core.ForwardDiffAD{40}, (), AdvancedHMC.UnitEuclideanMetric}}, DynamicPPL.DefaultContext}, Float64}, Float64, 10}}, Vector{Set{DynamicPPL.Selector}}}, DynamicPPL.Metadata{Dict{AbstractPPL.VarName{:ϵ, Tuple{Tuple{Int64}}}, Int64}, Vector{Normal{Float64}}, Vector{AbstractPPL.VarName{:ϵ, Tuple{Tuple{Int64}}}}, Vector{ForwardDiff.Dual{ForwardDiff.Tag{Turing.Core.var"#f#1"{DynamicPPL.TypedVarInfo{NamedTuple{(:b1, :b2, :ϵ), Tuple{DynamicPPL.Metadata{Dict{AbstractPPL.VarName{:b1, Tuple{}}, Int64}, Vector{Normal{Float64}}, Vector{AbstractPPL.VarName{:b1, Tuple{}}}, Vector{Float64}, Vector{Set{DynamicPPL.Selector}}}, DynamicPPL.Metadata{Dict{AbstractPPL.VarName{:b2, Tuple{}}, Int64}, Vector{Normal{Float64}}, Vector{AbstractPPL.VarName{:b2, Tuple{}}}, Vector{Float64}, Vector{Set{DynamicPPL.Selector}}}, DynamicPPL.Metadata{Dict{AbstractPPL.VarName{:ϵ, Tuple{Tuple{Int64}}}, Int64}, Vector{Normal{Float64}}, Vector{AbstractPPL.VarName{:ϵ, Tuple{Tuple{Int64}}}}, Vector{Float64}, Vector{Set{DynamicPPL.Selector}}}}}, Float64}, DynamicPPL.Model{var"#2#3", (:y, :b1_mean, :b2_mean, :T, :σ, :σ_b), (:T, :σ, :σ_b), (), Tuple{Vector{Float64}, Float64, Float64, Type{Float64}, Float64, Float64}, Tuple{Type{Float64}, Float64, Float64}}, DynamicPPL.Sampler{HMC{Turing.Core.ForwardDiffAD{40}, (), AdvancedHMC.UnitEuclideanMetric}}, DynamicPPL.DefaultContext}, Float64}, Float64, 10}}, Vector{Set{DynamicPPL.Selector}}}}}, ForwardDiff.Dual{ForwardDiff.Tag{Turing.Core.var"#f#1"{DynamicPPL.TypedVarInfo{NamedTuple{(:b1, :b2, :ϵ), Tuple{DynamicPPL.Metadata{Dict{AbstractPPL.VarName{:b1, Tuple{}}, Int64}, Vector{Normal{Float64}}, Vector{AbstractPPL.VarName{:b1, Tuple{}}}, Vector{Float64}, Vector{Set{DynamicPPL.Selector}}}, DynamicPPL.Metadata{Dict{AbstractPPL.VarName{:b2, Tuple{}}, Int64}, Vector{Normal{Float64}}, Vector{AbstractPPL.VarName{:b2, Tuple{}}}, Vector{Float64}, Vector{Set{DynamicPPL.Selector}}}, DynamicPPL.Metadata{Dict{AbstractPPL.VarName{:ϵ, Tuple{Tuple{Int64}}}, Int64}, Vector{Normal{Float64}}, Vector{AbstractPPL.VarName{:ϵ, Tuple{Tuple{Int64}}}}, Vector{Float64}, Vector{Set{DynamicPPL.Selector}}}}}, Float64}, DynamicPPL.Model{var"#2#3", (:y, :b1_mean, :b2_mean, :T, :σ, :σ_b), (:T, :σ, :σ_b), (), Tuple{Vector{Float64}, Float64, Float64, Type{Float64}, Float64, Float64}, Tuple{Type{Float64}, Float64, Float64}}, DynamicPPL.Sampler{HMC{Turing.Core.ForwardDiffAD{40}, (), AdvancedHMC.UnitEuclideanMetric}}, DynamicPPL.DefaultContext}, Float64}, Float64, 10}}, __sampler__::DynamicPPL.Sampler{HMC{Turing.Core.ForwardDiffAD{40}, (), AdvancedHMC.UnitEuclideanMetric}}, __context__::DynamicPPL.DefaultContext, y::Vector{Float64}, b1_mean::Float64, b2_mean::Float64, #unused#::Type{ForwardDiff.Dual{ForwardDiff.Tag{Turing.Core.var"#f#1"{DynamicPPL.TypedVarInfo{NamedTuple{(:b1, :b2, :ϵ), Tuple{DynamicPPL.Metadata{Dict{AbstractPPL.VarName{:b1, Tuple{}}, Int64}, Vector{Normal{Float64}}, Vector{AbstractPPL.VarName{:b1, Tuple{}}}, Vector{Float64}, Vector{Set{DynamicPPL.Selector}}}, DynamicPPL.Metadata{Dict{AbstractPPL.VarName{:b2, Tuple{}}, Int64}, Vector{Normal{Float64}}, Vector{AbstractPPL.VarName{:b2, Tuple{}}}, Vector{Float64}, Vector{Set{DynamicPPL.Selector}}}, DynamicPPL.Metadata{Dict{AbstractPPL.VarName{:ϵ, Tuple{Tuple{Int64}}}, Int64}, Vector{Normal{Float64}}, Vector{AbstractPPL.VarName{:ϵ, Tuple{Tuple{Int64}}}}, Vector{Float64}, Vector{Set{DynamicPPL.Selector}}}}}, Float64}, DynamicPPL.Model{var"#2#3", (:y, :b1_mean, :b2_mean, :T, :σ, :σ_b), (:T, :σ, :σ_b), (), Tuple{Vector{Float64}, Float64, Float64, Type{Float64}, Float64, Float64}, Tuple{Type{Float64}, Float64, Float64}}, DynamicPPL.Sampler{HMC{Turing.Core.ForwardDiffAD{40}, (), AdvancedHMC.UnitEuclideanMetric}}, DynamicPPL.DefaultContext}, Float64}, Float64, 10}}, σ::Float64, σ_b::Float64)
    @ Main ./none:0
  [4] macro expansion
    @ ~/.julia/packages/DynamicPPL/SgzCy/src/model.jl:0 [inlined]
  [5] _evaluate
    @ ~/.julia/packages/DynamicPPL/SgzCy/src/model.jl:154 [inlined]
  [6] evaluate_threadunsafe
    @ ~/.julia/packages/DynamicPPL/SgzCy/src/model.jl:127 [inlined]
  [7] (::DynamicPPL.Model{var"#2#3", (:y, :b1_mean, :b2_mean, :T, :σ, :σ_b), (:T, :σ, :σ_b), (), Tuple{Vector{Float64}, Float64, Float64, Type{Float64}, Float64, Float64}, Tuple{Type{Float64}, Float64, Float64}})(rng::Random._GLOBAL_RNG, varinfo::DynamicPPL.TypedVarInfo{NamedTuple{(:b1, :b2, :ϵ), Tuple{DynamicPPL.Metadata{Dict{AbstractPPL.VarName{:b1, Tuple{}}, Int64}, Vector{Normal{Float64}}, Vector{AbstractPPL.VarName{:b1, Tuple{}}}, Vector{ForwardDiff.Dual{ForwardDiff.Tag{Turing.Core.var"#f#1"{DynamicPPL.TypedVarInfo{NamedTuple{(:b1, :b2, :ϵ), Tuple{DynamicPPL.Metadata{Dict{AbstractPPL.VarName{:b1, Tuple{}}, Int64}, Vector{Normal{Float64}}, Vector{AbstractPPL.VarName{:b1, Tuple{}}}, Vector{Float64}, Vector{Set{DynamicPPL.Selector}}}, DynamicPPL.Metadata{Dict{AbstractPPL.VarName{:b2, Tuple{}}, Int64}, Vector{Normal{Float64}}, Vector{AbstractPPL.VarName{:b2, Tuple{}}}, Vector{Float64}, Vector{Set{DynamicPPL.Selector}}}, DynamicPPL.Metadata{Dict{AbstractPPL.VarName{:ϵ, Tuple{Tuple{Int64}}}, Int64}, Vector{Normal{Float64}}, Vector{AbstractPPL.VarName{:ϵ, Tuple{Tuple{Int64}}}}, Vector{Float64}, Vector{Set{DynamicPPL.Selector}}}}}, Float64}, DynamicPPL.Model{var"#2#3", (:y, :b1_mean, :b2_mean, :T, :σ, :σ_b), (:T, :σ, :σ_b), (), Tuple{Vector{Float64}, Float64, Float64, Type{Float64}, Float64, Float64}, Tuple{Type{Float64}, Float64, Float64}}, DynamicPPL.Sampler{HMC{Turing.Core.ForwardDiffAD{40}, (), AdvancedHMC.UnitEuclideanMetric}}, DynamicPPL.DefaultContext}, Float64}, Float64, 10}}, Vector{Set{DynamicPPL.Selector}}}, DynamicPPL.Metadata{Dict{AbstractPPL.VarName{:b2, Tuple{}}, Int64}, Vector{Normal{Float64}}, Vector{AbstractPPL.VarName{:b2, Tuple{}}}, Vector{ForwardDiff.Dual{ForwardDiff.Tag{Turing.Core.var"#f#1"{DynamicPPL.TypedVarInfo{NamedTuple{(:b1, :b2, :ϵ), Tuple{DynamicPPL.Metadata{Dict{AbstractPPL.VarName{:b1, Tuple{}}, Int64}, Vector{Normal{Float64}}, Vector{AbstractPPL.VarName{:b1, Tuple{}}}, Vector{Float64}, Vector{Set{DynamicPPL.Selector}}}, DynamicPPL.Metadata{Dict{AbstractPPL.VarName{:b2, Tuple{}}, Int64}, Vector{Normal{Float64}}, Vector{AbstractPPL.VarName{:b2, Tuple{}}}, Vector{Float64}, Vector{Set{DynamicPPL.Selector}}}, DynamicPPL.Metadata{Dict{AbstractPPL.VarName{:ϵ, Tuple{Tuple{Int64}}}, Int64}, Vector{Normal{Float64}}, Vector{AbstractPPL.VarName{:ϵ, Tuple{Tuple{Int64}}}}, Vector{Float64}, Vector{Set{DynamicPPL.Selector}}}}}, Float64}, DynamicPPL.Model{var"#2#3", (:y, :b1_mean, :b2_mean, :T, :σ, :σ_b), (:T, :σ, :σ_b), (), Tuple{Vector{Float64}, Float64, Float64, Type{Float64}, Float64, Float64}, Tuple{Type{Float64}, Float64, Float64}}, DynamicPPL.Sampler{HMC{Turing.Core.ForwardDiffAD{40}, (), AdvancedHMC.UnitEuclideanMetric}}, DynamicPPL.DefaultContext}, Float64}, Float64, 10}}, Vector{Set{DynamicPPL.Selector}}}, DynamicPPL.Metadata{Dict{AbstractPPL.VarName{:ϵ, Tuple{Tuple{Int64}}}, Int64}, Vector{Normal{Float64}}, Vector{AbstractPPL.VarName{:ϵ, Tuple{Tuple{Int64}}}}, Vector{ForwardDiff.Dual{ForwardDiff.Tag{Turing.Core.var"#f#1"{DynamicPPL.TypedVarInfo{NamedTuple{(:b1, :b2, :ϵ), Tuple{DynamicPPL.Metadata{Dict{AbstractPPL.VarName{:b1, Tuple{}}, Int64}, Vector{Normal{Float64}}, Vector{AbstractPPL.VarName{:b1, Tuple{}}}, Vector{Float64}, Vector{Set{DynamicPPL.Selector}}}, DynamicPPL.Metadata{Dict{AbstractPPL.VarName{:b2, Tuple{}}, Int64}, Vector{Normal{Float64}}, Vector{AbstractPPL.VarName{:b2, Tuple{}}}, Vector{Float64}, Vector{Set{DynamicPPL.Selector}}}, DynamicPPL.Metadata{Dict{AbstractPPL.VarName{:ϵ, Tuple{Tuple{Int64}}}, Int64}, Vector{Normal{Float64}}, Vector{AbstractPPL.VarName{:ϵ, Tuple{Tuple{Int64}}}}, Vector{Float64}, Vector{Set{DynamicPPL.Selector}}}}}, Float64}, DynamicPPL.Model{var"#2#3", (:y, :b1_mean, :b2_mean, :T, :σ, :σ_b), (:T, :σ, :σ_b), (), Tuple{Vector{Float64}, Float64, Float64, Type{Float64}, Float64, Float64}, Tuple{Type{Float64}, Float64, Float64}}, DynamicPPL.Sampler{HMC{Turing.Core.ForwardDiffAD{40}, (), AdvancedHMC.UnitEuclideanMetric}}, DynamicPPL.DefaultContext}, Float64}, Float64, 10}}, Vector{Set{DynamicPPL.Selector}}}}}, ForwardDiff.Dual{ForwardDiff.Tag{Turing.Core.var"#f#1"{DynamicPPL.TypedVarInfo{NamedTuple{(:b1, :b2, :ϵ), Tuple{DynamicPPL.Metadata{Dict{AbstractPPL.VarName{:b1, Tuple{}}, Int64}, Vector{Normal{Float64}}, Vector{AbstractPPL.VarName{:b1, Tuple{}}}, Vector{Float64}, Vector{Set{DynamicPPL.Selector}}}, DynamicPPL.Metadata{Dict{AbstractPPL.VarName{:b2, Tuple{}}, Int64}, Vector{Normal{Float64}}, Vector{AbstractPPL.VarName{:b2, Tuple{}}}, Vector{Float64}, Vector{Set{DynamicPPL.Selector}}}, DynamicPPL.Metadata{Dict{AbstractPPL.VarName{:ϵ, Tuple{Tuple{Int64}}}, Int64}, Vector{Normal{Float64}}, Vector{AbstractPPL.VarName{:ϵ, Tuple{Tuple{Int64}}}}, Vector{Float64}, Vector{Set{DynamicPPL.Selector}}}}}, Float64}, DynamicPPL.Model{var"#2#3", (:y, :b1_mean, :b2_mean, :T, :σ, :σ_b), (:T, :σ, :σ_b), (), Tuple{Vector{Float64}, Float64, Float64, Type{Float64}, Float64, Float64}, Tuple{Type{Float64}, Float64, Float64}}, DynamicPPL.Sampler{HMC{Turing.Core.ForwardDiffAD{40}, (), AdvancedHMC.UnitEuclideanMetric}}, DynamicPPL.DefaultContext}, Float64}, Float64, 10}}, sampler::DynamicPPL.Sampler{HMC{Turing.Core.ForwardDiffAD{40}, (), AdvancedHMC.UnitEuclideanMetric}}, context::DynamicPPL.DefaultContext)
    @ DynamicPPL ~/.julia/packages/DynamicPPL/SgzCy/src/model.jl:92
  [8] Model
    @ ~/.julia/packages/DynamicPPL/SgzCy/src/model.jl:98 [inlined]
  [9] f
    @ ~/.julia/packages/Turing/28kgo/src/core/ad.jl:111 [inlined]
 [10] chunk_mode_gradient!(result::Vector{Float64}, f::Turing.Core.var"#f#1"{DynamicPPL.TypedVarInfo{NamedTuple{(:b1, :b2, :ϵ), Tuple{DynamicPPL.Metadata{Dict{AbstractPPL.VarName{:b1, Tuple{}}, Int64}, Vector{Normal{Float64}}, Vector{AbstractPPL.VarName{:b1, Tuple{}}}, Vector{Float64}, Vector{Set{DynamicPPL.Selector}}}, DynamicPPL.Metadata{Dict{AbstractPPL.VarName{:b2, Tuple{}}, Int64}, Vector{Normal{Float64}}, Vector{AbstractPPL.VarName{:b2, Tuple{}}}, Vector{Float64}, Vector{Set{DynamicPPL.Selector}}}, DynamicPPL.Metadata{Dict{AbstractPPL.VarName{:ϵ, Tuple{Tuple{Int64}}}, Int64}, Vector{Normal{Float64}}, Vector{AbstractPPL.VarName{:ϵ, Tuple{Tuple{Int64}}}}, Vector{Float64}, Vector{Set{DynamicPPL.Selector}}}}}, Float64}, DynamicPPL.Model{var"#2#3", (:y, :b1_mean, :b2_mean, :T, :σ, :σ_b), (:T, :σ, :σ_b), (), Tuple{Vector{Float64}, Float64, Float64, Type{Float64}, Float64, Float64}, Tuple{Type{Float64}, Float64, Float64}}, DynamicPPL.Sampler{HMC{Turing.Core.ForwardDiffAD{40}, (), AdvancedHMC.UnitEuclideanMetric}}, DynamicPPL.DefaultContext}, x::Vector{Float64}, cfg::ForwardDiff.GradientConfig{ForwardDiff.Tag{Turing.Core.var"#f#1"{DynamicPPL.TypedVarInfo{NamedTuple{(:b1, :b2, :ϵ), Tuple{DynamicPPL.Metadata{Dict{AbstractPPL.VarName{:b1, Tuple{}}, Int64}, Vector{Normal{Float64}}, Vector{AbstractPPL.VarName{:b1, Tuple{}}}, Vector{Float64}, Vector{Set{DynamicPPL.Selector}}}, DynamicPPL.Metadata{Dict{AbstractPPL.VarName{:b2, Tuple{}}, Int64}, Vector{Normal{Float64}}, Vector{AbstractPPL.VarName{:b2, Tuple{}}}, Vector{Float64}, Vector{Set{DynamicPPL.Selector}}}, DynamicPPL.Metadata{Dict{AbstractPPL.VarName{:ϵ, Tuple{Tuple{Int64}}}, Int64}, Vector{Normal{Float64}}, Vector{AbstractPPL.VarName{:ϵ, Tuple{Tuple{Int64}}}}, Vector{Float64}, Vector{Set{DynamicPPL.Selector}}}}}, Float64}, DynamicPPL.Model{var"#2#3", (:y, :b1_mean, :b2_mean, :T, :σ, :σ_b), (:T, :σ, :σ_b), (), Tuple{Vector{Float64}, Float64, Float64, Type{Float64}, Float64, Float64}, Tuple{Type{Float64}, Float64, Float64}}, DynamicPPL.Sampler{HMC{Turing.Core.ForwardDiffAD{40}, (), AdvancedHMC.UnitEuclideanMetric}}, DynamicPPL.DefaultContext}, Float64}, Float64, 10, Vector{ForwardDiff.Dual{ForwardDiff.Tag{Turing.Core.var"#f#1"{DynamicPPL.TypedVarInfo{NamedTuple{(:b1, :b2, :ϵ), Tuple{DynamicPPL.Metadata{Dict{AbstractPPL.VarName{:b1, Tuple{}}, Int64}, Vector{Normal{Float64}}, Vector{AbstractPPL.VarName{:b1, Tuple{}}}, Vector{Float64}, Vector{Set{DynamicPPL.Selector}}}, DynamicPPL.Metadata{Dict{AbstractPPL.VarName{:b2, Tuple{}}, Int64}, Vector{Normal{Float64}}, Vector{AbstractPPL.VarName{:b2, Tuple{}}}, Vector{Float64}, Vector{Set{DynamicPPL.Selector}}}, DynamicPPL.Metadata{Dict{AbstractPPL.VarName{:ϵ, Tuple{Tuple{Int64}}}, Int64}, Vector{Normal{Float64}}, Vector{AbstractPPL.VarName{:ϵ, Tuple{Tuple{Int64}}}}, Vector{Float64}, Vector{Set{DynamicPPL.Selector}}}}}, Float64}, DynamicPPL.Model{var"#2#3", (:y, :b1_mean, :b2_mean, :T, :σ, :σ_b), (:T, :σ, :σ_b), (), Tuple{Vector{Float64}, Float64, Float64, Type{Float64}, Float64, Float64}, Tuple{Type{Float64}, Float64, Float64}}, DynamicPPL.Sampler{HMC{Turing.Core.ForwardDiffAD{40}, (), AdvancedHMC.UnitEuclideanMetric}}, DynamicPPL.DefaultContext}, Float64}, Float64, 10}}})
    @ ForwardDiff ~/.julia/packages/ForwardDiff/QOqCN/src/gradient.jl:150
 [11] gradient!
    @ ~/.julia/packages/ForwardDiff/QOqCN/src/gradient.jl:39 [inlined]
 [12] gradient!(result::Vector{Float64}, f::Turing.Core.var"#f#1"{DynamicPPL.TypedVarInfo{NamedTuple{(:b1, :b2, :ϵ), Tuple{DynamicPPL.Metadata{Dict{AbstractPPL.VarName{:b1, Tuple{}}, Int64}, Vector{Normal{Float64}}, Vector{AbstractPPL.VarName{:b1, Tuple{}}}, Vector{Float64}, Vector{Set{DynamicPPL.Selector}}}, DynamicPPL.Metadata{Dict{AbstractPPL.VarName{:b2, Tuple{}}, Int64}, Vector{Normal{Float64}}, Vector{AbstractPPL.VarName{:b2, Tuple{}}}, Vector{Float64}, Vector{Set{DynamicPPL.Selector}}}, DynamicPPL.Metadata{Dict{AbstractPPL.VarName{:ϵ, Tuple{Tuple{Int64}}}, Int64}, Vector{Normal{Float64}}, Vector{AbstractPPL.VarName{:ϵ, Tuple{Tuple{Int64}}}}, Vector{Float64}, Vector{Set{DynamicPPL.Selector}}}}}, Float64}, DynamicPPL.Model{var"#2#3", (:y, :b1_mean, :b2_mean, :T, :σ, :σ_b), (:T, :σ, :σ_b), (), Tuple{Vector{Float64}, Float64, Float64, Type{Float64}, Float64, Float64}, Tuple{Type{Float64}, Float64, Float64}}, DynamicPPL.Sampler{HMC{Turing.Core.ForwardDiffAD{40}, (), AdvancedHMC.UnitEuclideanMetric}}, DynamicPPL.DefaultContext}, x::Vector{Float64}, cfg::ForwardDiff.GradientConfig{ForwardDiff.Tag{Turing.Core.var"#f#1"{DynamicPPL.TypedVarInfo{NamedTuple{(:b1, :b2, :ϵ), Tuple{DynamicPPL.Metadata{Dict{AbstractPPL.VarName{:b1, Tuple{}}, Int64}, Vector{Normal{Float64}}, Vector{AbstractPPL.VarName{:b1, Tuple{}}}, Vector{Float64}, Vector{Set{DynamicPPL.Selector}}}, DynamicPPL.Metadata{Dict{AbstractPPL.VarName{:b2, Tuple{}}, Int64}, Vector{Normal{Float64}}, Vector{AbstractPPL.VarName{:b2, Tuple{}}}, Vector{Float64}, Vector{Set{DynamicPPL.Selector}}}, DynamicPPL.Metadata{Dict{AbstractPPL.VarName{:ϵ, Tuple{Tuple{Int64}}}, Int64}, Vector{Normal{Float64}}, Vector{AbstractPPL.VarName{:ϵ, Tuple{Tuple{Int64}}}}, Vector{Float64}, Vector{Set{DynamicPPL.Selector}}}}}, Float64}, DynamicPPL.Model{var"#2#3", (:y, :b1_mean, :b2_mean, :T, :σ, :σ_b), (:T, :σ, :σ_b), (), Tuple{Vector{Float64}, Float64, Float64, Type{Float64}, Float64, Float64}, Tuple{Type{Float64}, Float64, Float64}}, DynamicPPL.Sampler{HMC{Turing.Core.ForwardDiffAD{40}, (), AdvancedHMC.UnitEuclideanMetric}}, DynamicPPL.DefaultContext}, Float64}, Float64, 10, Vector{ForwardDiff.Dual{ForwardDiff.Tag{Turing.Core.var"#f#1"{DynamicPPL.TypedVarInfo{NamedTuple{(:b1, :b2, :ϵ), Tuple{DynamicPPL.Metadata{Dict{AbstractPPL.VarName{:b1, Tuple{}}, Int64}, Vector{Normal{Float64}}, Vector{AbstractPPL.VarName{:b1, Tuple{}}}, Vector{Float64}, Vector{Set{DynamicPPL.Selector}}}, DynamicPPL.Metadata{Dict{AbstractPPL.VarName{:b2, Tuple{}}, Int64}, Vector{Normal{Float64}}, Vector{AbstractPPL.VarName{:b2, Tuple{}}}, Vector{Float64}, Vector{Set{DynamicPPL.Selector}}}, DynamicPPL.Metadata{Dict{AbstractPPL.VarName{:ϵ, Tuple{Tuple{Int64}}}, Int64}, Vector{Normal{Float64}}, Vector{AbstractPPL.VarName{:ϵ, Tuple{Tuple{Int64}}}}, Vector{Float64}, Vector{Set{DynamicPPL.Selector}}}}}, Float64}, DynamicPPL.Model{var"#2#3", (:y, :b1_mean, :b2_mean, :T, :σ, :σ_b), (:T, :σ, :σ_b), (), Tuple{Vector{Float64}, Float64, Float64, Type{Float64}, Float64, Float64}, Tuple{Type{Float64}, Float64, Float64}}, DynamicPPL.Sampler{HMC{Turing.Core.ForwardDiffAD{40}, (), AdvancedHMC.UnitEuclideanMetric}}, DynamicPPL.DefaultContext}, Float64}, Float64, 10}}})
    @ ForwardDiff ~/.julia/packages/ForwardDiff/QOqCN/src/gradient.jl:35
 [13] gradient_logp(::Turing.Core.ForwardDiffAD{40}, θ::Vector{Float64}, vi::DynamicPPL.TypedVarInfo{NamedTuple{(:b1, :b2, :ϵ), Tuple{DynamicPPL.Metadata{Dict{AbstractPPL.VarName{:b1, Tuple{}}, Int64}, Vector{Normal{Float64}}, Vector{AbstractPPL.VarName{:b1, Tuple{}}}, Vector{Float64}, Vector{Set{DynamicPPL.Selector}}}, DynamicPPL.Metadata{Dict{AbstractPPL.VarName{:b2, Tuple{}}, Int64}, Vector{Normal{Float64}}, Vector{AbstractPPL.VarName{:b2, Tuple{}}}, Vector{Float64}, Vector{Set{DynamicPPL.Selector}}}, DynamicPPL.Metadata{Dict{AbstractPPL.VarName{:ϵ, Tuple{Tuple{Int64}}}, Int64}, Vector{Normal{Float64}}, Vector{AbstractPPL.VarName{:ϵ, Tuple{Tuple{Int64}}}}, Vector{Float64}, Vector{Set{DynamicPPL.Selector}}}}}, Float64}, model::DynamicPPL.Model{var"#2#3", (:y, :b1_mean, :b2_mean, :T, :σ, :σ_b), (:T, :σ, :σ_b), (), Tuple{Vector{Float64}, Float64, Float64, Type{Float64}, Float64, Float64}, Tuple{Type{Float64}, Float64, Float64}}, sampler::DynamicPPL.Sampler{HMC{Turing.Core.ForwardDiffAD{40}, (), AdvancedHMC.UnitEuclideanMetric}}, ctx::DynamicPPL.DefaultContext)
    @ Turing.Core ~/.julia/packages/Turing/28kgo/src/core/ad.jl:121
 [14] gradient_logp (repeats 2 times)
    @ ~/.julia/packages/Turing/28kgo/src/core/ad.jl:83 [inlined]
 [15] ∂logπ∂θ
    @ ~/.julia/packages/Turing/28kgo/src/inference/hmc.jl:433 [inlined]
 [16] ∂H∂θ
    @ ~/.julia/packages/AdvancedHMC/MIxdK/src/hamiltonian.jl:31 [inlined]
 [17] phasepoint(h::AdvancedHMC.Hamiltonian{AdvancedHMC.UnitEuclideanMetric{Float64, Tuple{Int64}}, Turing.Inference.var"#logπ#52"{DynamicPPL.TypedVarInfo{NamedTuple{(:b1, :b2, :ϵ), Tuple{DynamicPPL.Metadata{Dict{AbstractPPL.VarName{:b1, Tuple{}}, Int64}, Vector{Normal{Float64}}, Vector{AbstractPPL.VarName{:b1, Tuple{}}}, Vector{Float64}, Vector{Set{DynamicPPL.Selector}}}, DynamicPPL.Metadata{Dict{AbstractPPL.VarName{:b2, Tuple{}}, Int64}, Vector{Normal{Float64}}, Vector{AbstractPPL.VarName{:b2, Tuple{}}}, Vector{Float64}, Vector{Set{DynamicPPL.Selector}}}, DynamicPPL.Metadata{Dict{AbstractPPL.VarName{:ϵ, Tuple{Tuple{Int64}}}, Int64}, Vector{Normal{Float64}}, Vector{AbstractPPL.VarName{:ϵ, Tuple{Tuple{Int64}}}}, Vector{Float64}, Vector{Set{DynamicPPL.Selector}}}}}, Float64}, DynamicPPL.Sampler{HMC{Turing.Core.ForwardDiffAD{40}, (), AdvancedHMC.UnitEuclideanMetric}}, DynamicPPL.Model{var"#2#3", (:y, :b1_mean, :b2_mean, :T, :σ, :σ_b), (:T, :σ, :σ_b), (), Tuple{Vector{Float64}, Float64, Float64, Type{Float64}, Float64, Float64}, Tuple{Type{Float64}, Float64, Float64}}}, Turing.Inference.var"#∂logπ∂θ#51"{DynamicPPL.TypedVarInfo{NamedTuple{(:b1, :b2, :ϵ), Tuple{DynamicPPL.Metadata{Dict{AbstractPPL.VarName{:b1, Tuple{}}, Int64}, Vector{Normal{Float64}}, Vector{AbstractPPL.VarName{:b1, Tuple{}}}, Vector{Float64}, Vector{Set{DynamicPPL.Selector}}}, DynamicPPL.Metadata{Dict{AbstractPPL.VarName{:b2, Tuple{}}, Int64}, Vector{Normal{Float64}}, Vector{AbstractPPL.VarName{:b2, Tuple{}}}, Vector{Float64}, Vector{Set{DynamicPPL.Selector}}}, DynamicPPL.Metadata{Dict{AbstractPPL.VarName{:ϵ, Tuple{Tuple{Int64}}}, Int64}, Vector{Normal{Float64}}, Vector{AbstractPPL.VarName{:ϵ, Tuple{Tuple{Int64}}}}, Vector{Float64}, Vector{Set{DynamicPPL.Selector}}}}}, Float64}, DynamicPPL.Sampler{HMC{Turing.Core.ForwardDiffAD{40}, (), AdvancedHMC.UnitEuclideanMetric}}, DynamicPPL.Model{var"#2#3", (:y, :b1_mean, :b2_mean, :T, :σ, :σ_b), (:T, :σ, :σ_b), (), Tuple{Vector{Float64}, Float64, Float64, Type{Float64}, Float64, Float64}, Tuple{Type{Float64}, Float64, Float64}}}}, θ::Vector{Float64}, r::Vector{Float64})
    @ AdvancedHMC ~/.julia/packages/AdvancedHMC/MIxdK/src/hamiltonian.jl:69
 [18] phasepoint
    @ ~/.julia/packages/AdvancedHMC/MIxdK/src/hamiltonian.jl:139 [inlined]
 [19] initialstep(rng::Random._GLOBAL_RNG, model::DynamicPPL.Model{var"#2#3", (:y, :b1_mean, :b2_mean, :T, :σ, :σ_b), (:T, :σ, :σ_b), (), Tuple{Vector{Float64}, Float64, Float64, Type{Float64}, Float64, Float64}, Tuple{Type{Float64}, Float64, Float64}}, spl::DynamicPPL.Sampler{HMC{Turing.Core.ForwardDiffAD{40}, (), AdvancedHMC.UnitEuclideanMetric}}, vi::DynamicPPL.TypedVarInfo{NamedTuple{(:b1, :b2, :ϵ), Tuple{DynamicPPL.Metadata{Dict{AbstractPPL.VarName{:b1, Tuple{}}, Int64}, Vector{Normal{Float64}}, Vector{AbstractPPL.VarName{:b1, Tuple{}}}, Vector{Float64}, Vector{Set{DynamicPPL.Selector}}}, DynamicPPL.Metadata{Dict{AbstractPPL.VarName{:b2, Tuple{}}, Int64}, Vector{Normal{Float64}}, Vector{AbstractPPL.VarName{:b2, Tuple{}}}, Vector{Float64}, Vector{Set{DynamicPPL.Selector}}}, DynamicPPL.Metadata{Dict{AbstractPPL.VarName{:ϵ, Tuple{Tuple{Int64}}}, Int64}, Vector{Normal{Float64}}, Vector{AbstractPPL.VarName{:ϵ, Tuple{Tuple{Int64}}}}, Vector{Float64}, Vector{Set{DynamicPPL.Selector}}}}}, Float64}; init_params::Nothing, nadapts::Int64, kwargs::Base.Iterators.Pairs{Union{}, Union{}, Tuple{}, NamedTuple{(), Tuple{}}})
    @ Turing.Inference ~/.julia/packages/Turing/28kgo/src/inference/hmc.jl:167
 [20] initialstep(rng::Random._GLOBAL_RNG, model::DynamicPPL.Model{var"#2#3", (:y, :b1_mean, :b2_mean, :T, :σ, :σ_b), (:T, :σ, :σ_b), (), Tuple{Vector{Float64}, Float64, Float64, Type{Float64}, Float64, Float64}, Tuple{Type{Float64}, Float64, Float64}}, spl::DynamicPPL.Sampler{HMC{Turing.Core.ForwardDiffAD{40}, (), AdvancedHMC.UnitEuclideanMetric}}, vi::DynamicPPL.TypedVarInfo{NamedTuple{(:b1, :b2, :ϵ), Tuple{DynamicPPL.Metadata{Dict{AbstractPPL.VarName{:b1, Tuple{}}, Int64}, Vector{Normal{Float64}}, Vector{AbstractPPL.VarName{:b1, Tuple{}}}, Vector{Float64}, Vector{Set{DynamicPPL.Selector}}}, DynamicPPL.Metadata{Dict{AbstractPPL.VarName{:b2, Tuple{}}, Int64}, Vector{Normal{Float64}}, Vector{AbstractPPL.VarName{:b2, Tuple{}}}, Vector{Float64}, Vector{Set{DynamicPPL.Selector}}}, DynamicPPL.Metadata{Dict{AbstractPPL.VarName{:ϵ, Tuple{Tuple{Int64}}}, Int64}, Vector{Normal{Float64}}, Vector{AbstractPPL.VarName{:ϵ, Tuple{Tuple{Int64}}}}, Vector{Float64}, Vector{Set{DynamicPPL.Selector}}}}}, Float64})
    @ Turing.Inference ~/.julia/packages/Turing/28kgo/src/inference/hmc.jl:153
 [21] step(rng::Random._GLOBAL_RNG, model::DynamicPPL.Model{var"#2#3", (:y, :b1_mean, :b2_mean, :T, :σ, :σ_b), (:T, :σ, :σ_b), (), Tuple{Vector{Float64}, Float64, Float64, Type{Float64}, Float64, Float64}, Tuple{Type{Float64}, Float64, Float64}}, spl::DynamicPPL.Sampler{HMC{Turing.Core.ForwardDiffAD{40}, (), AdvancedHMC.UnitEuclideanMetric}}; resume_from::Nothing, kwargs::Base.Iterators.Pairs{Union{}, Union{}, Tuple{}, NamedTuple{(), Tuple{}}})
    @ DynamicPPL ~/.julia/packages/DynamicPPL/SgzCy/src/sampler.jl:91
 [22] step
    @ ~/.julia/packages/DynamicPPL/SgzCy/src/sampler.jl:66 [inlined]
 [23] macro expansion
    @ ~/.julia/packages/AbstractMCMC/ByHEr/src/sample.jl:123 [inlined]
...

(由于帖子超过了 30000 个字符的限制,我不得不删除错误消息)

也就是说第 19 行:

y[k] = ϵ[k] + b1 * y[k - 1] + b2 * y[k - 2]

...尝试将“ForwardDiff.Dual{Nothing, Float64, 10} 类型的值”插入y,但y 的类型为Vector{Float64},因为我使用Float64.(AR2_process) 将其显式转换为Float64,所以类型不匹配导致错误。这有点道理。

问题

为什么 previous 运行成功了呢?为什么从AR2(AR2_process, b1, b2)(其中AR2_process 是Vector{Union{Missing, Float64}})采样没有引发任何错误?它不会也尝试将ForwardDiff.Dual 分配给y[k] 吗?

可能的解决方案

也许我不应该分配东西给y[k],因为观察应该是从某个分布绘制的,所以它可能应该是y[k] ~ Normal(...),因为我'正在添加从正态分布中提取的值,但我不是特别确定该正态分布的参数应该是什么......

【问题讨论】:

    标签: julia stochastic-process


    【解决方案1】:

    我不知道你的代码为什么会这样失败,但我可以解释并解决你真正的问题。

    是的,您必须始终使用波浪号进行观察;但关键是你的观察陈述的右手边不是分布,而是确定性的。如果您实际上不需要对 epsilon 进行采样/估计,则可以改用以下模型:

    @model function AR2(y, b1_mean, b2_mean; σ=.3, σ_b=.01) where T <: Real
        N = length(y)
               
        b1 ~ Normal(b1_mean, σ_b)
        b2 ~ Normal(b2_mean, σ_b)
               
        y[1] ~ Normal(0, σ)
        y[2] ~ Normal(0, σ)
               
        for k ∈ 3:N
            y[k] ~ Normal(b1 * y[k - 1] + b2 * y[k - 2], σ) # this is LINE 19
        end
               
        y
    end
    

    这只是因为我们知道Normal 的属性,不过。跟踪随机变量的确定性函数的问题还是an open issue。

    或者,您尝试新的热门内容并编写基于 submodel 的实现。

    【讨论】:

    • 是的,我最终也是这样做的。但是,我不太喜欢依赖正态分布的属性。如果ϵ 的分布总和像b1 * y[k - 1] + ... + ϵ 有一个非常复杂的非标准分布怎么办?我想我会等待@submodel 登陆(它看起来不像进入当前的 v0.15.24,是吗?)
    猜你喜欢
    • 1970-01-01
    • 2012-07-31
    • 1970-01-01
    • 2014-06-19
    • 2011-05-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-03-08
    相关资源
    最近更新 更多