Julia 使用Turing.jl对AR(2)进程进行采样时出现类型错误

Julia 使用Turing.jl对AR(2)进程进行采样时出现类型错误,julia,stochastic-process,Julia,Stochastic Process,我试图创建一个简单的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 fun

我试图创建一个简单的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])
(由于帖子超过了30000个字符的限制,我不得不删除错误消息)

所以说第19行:

y[k] = ϵ[k] + b1 * y[k - 1] + b2 * y[k - 2]
…试图将“类型为
ForwardDiff.Dual{Nothing,Float64,10}
”的值插入
y
,但
y
的类型为
Vector{Float64}
,因为我使用
Float64.(AR2_进程)
显式将其强制转换为
Float64
,因此导致错误的类型不匹配。这有点道理

问题: 但是,为什么上一次运行有效?为什么从
AR2(AR2_进程,b1,b2)
进行采样,其中
AR2_进程
是一个
向量{Union{Missing,Float64}}
,没有引起任何错误?它不会在这里尝试将
ForwardDiff.Dual
分配给
y[k]

势解
也许我不应该把东西分配给
y[k]
,因为观察值应该是从某个分布中提取的,所以应该是
y[k]~正态(…)
,因为我在添加从正态分布中提取的值,但是我不太确定正态分布的参数应该是什么…

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

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

@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

@模型函数AR2(y,b1,b2,σ=.3,σb=.01),其中T是的,我也是这样做的。然而,我并不喜欢依赖正态分布的性质。如果
ϵ
的分布像
b1*y[k-1]+.+ϵ
有一个非常复杂的非标准分布?我想我会等待
@submodel
着陆(看起来它没有进入当前的v0.15.24版本,是吗?)
@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