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